diff --git a/abis/TalentLayerEscrow.json b/abis/TalentLayerEscrow.json index 3d58f5a4..5bb842b6 100644 --- a/abis/TalentLayerEscrow.json +++ b/abis/TalentLayerEscrow.json @@ -434,6 +434,62 @@ "name": "ProtocolEscrowFeeRateUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "_referrerId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "ReferralAmountClaimed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "_referrerId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_serviceId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "ReferralAmountReleased", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -672,6 +728,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_referrerId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + } + ], + "name": "claimReferralBalance", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -744,6 +818,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + } + ], + "name": "getClaimableReferralBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -850,6 +943,21 @@ "internalType": "uint256", "name": "arbitrationFeeTimeout", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "referrerId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "referralAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "totalAmount", + "type": "uint256" } ], "internalType": "struct TalentLayerEscrow.Transaction", diff --git a/abis/TalentLayerService.json b/abis/TalentLayerService.json index f5046a00..fd88a87a 100644 --- a/abis/TalentLayerService.json +++ b/abis/TalentLayerService.json @@ -8,6 +8,154 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "platformId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "dataUri", + "type": "string" + } + ], + "name": "ServiceCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "dataUri", + "type": "string" + } + ], + "name": "ServiceDetailedUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "indexed": false, + "internalType": "enum TalentLayerService.ProposalStatus", + "name": "status", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rateAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "platformId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expirationDate", + "type": "uint256" + } + ], + "name": "ProposalCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rateAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expirationDate", + "type": "uint256" + } + ], + "name": "ProposalUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -137,12 +285,6 @@ "name": "status", "type": "uint8" }, - { - "indexed": false, - "internalType": "address", - "name": "rateToken", - "type": "address" - }, { "indexed": false, "internalType": "uint256", @@ -160,6 +302,12 @@ "internalType": "uint256", "name": "expirationDate", "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "referrerId", + "type": "uint256" } ], "name": "ProposalCreated", @@ -188,20 +336,20 @@ }, { "indexed": false, - "internalType": "address", - "name": "rateToken", - "type": "address" + "internalType": "uint256", + "name": "rateAmount", + "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "rateAmount", + "name": "expirationDate", "type": "uint256" }, { "indexed": false, "internalType": "uint256", - "name": "expirationDate", + "name": "referrerId", "type": "uint256" } ], @@ -322,6 +470,18 @@ "internalType": "string", "name": "dataUri", "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "referralAmount", + "type": "uint256" } ], "name": "ServiceCreated", @@ -331,7 +491,7 @@ "anonymous": false, "inputs": [ { - "indexed": true, + "indexed": false, "internalType": "uint256", "name": "id", "type": "uint256" @@ -341,9 +501,15 @@ "internalType": "string", "name": "dataUri", "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "referralAmount", + "type": "uint256" } ], - "name": "ServiceDetailedUpdated", + "name": "ServiceUpdated", "type": "event" }, { @@ -519,11 +685,6 @@ "name": "_serviceId", "type": "uint256" }, - { - "internalType": "address", - "name": "_rateToken", - "type": "address" - }, { "internalType": "uint256", "name": "_rateAmount", @@ -548,6 +709,11 @@ "internalType": "bytes", "name": "_signature", "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_referrerId", + "type": "uint256" } ], "name": "createProposal", @@ -576,6 +742,16 @@ "internalType": "bytes", "name": "_signature", "type": "bytes" + }, + { + "internalType": "address", + "name": "_rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_referralAmount", + "type": "uint256" } ], "name": "createService", @@ -640,6 +816,11 @@ "internalType": "uint256", "name": "expirationDate", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "referrerId", + "type": "uint256" } ], "internalType": "struct TalentLayerService.Proposal", @@ -710,6 +891,16 @@ "internalType": "uint256", "name": "platformId", "type": "uint256" + }, + { + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "referralAmount", + "type": "uint256" } ], "internalType": "struct TalentLayerService.Service", @@ -766,6 +957,16 @@ "internalType": "uint256", "name": "platformId", "type": "uint256" + }, + { + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "referralAmount", + "type": "uint256" } ], "internalType": "struct TalentLayerService.Service", @@ -808,6 +1009,11 @@ "internalType": "uint256", "name": "expirationDate", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "referrerId", + "type": "uint256" } ], "internalType": "struct TalentLayerService.Proposal", @@ -1023,6 +1229,11 @@ "internalType": "uint256", "name": "expirationDate", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "referrerId", + "type": "uint256" } ], "stateMutability": "view", @@ -1155,6 +1366,16 @@ "internalType": "uint256", "name": "platformId", "type": "uint256" + }, + { + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "referralAmount", + "type": "uint256" } ], "stateMutability": "view", @@ -1253,11 +1474,6 @@ "name": "_serviceId", "type": "uint256" }, - { - "internalType": "address", - "name": "_rateToken", - "type": "address" - }, { "internalType": "uint256", "name": "_rateAmount", @@ -1272,6 +1488,11 @@ "internalType": "uint256", "name": "_expirationDate", "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_referrerId", + "type": "uint256" } ], "name": "updateProposal", @@ -1291,13 +1512,23 @@ "name": "_serviceId", "type": "uint256" }, + { + "internalType": "address", + "name": "_rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_referralAmount", + "type": "uint256" + }, { "internalType": "string", "name": "_dataUri", "type": "string" } ], - "name": "updateServiceData", + "name": "updateService", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -1334,8 +1565,8 @@ "type": "function" } ], - "bytecode": "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516142306200012060003960008181610f7c01528181610fbc01528181611273015281816112b3015261134201526142306000f3fe6080604052600436106102305760003560e01c8063715018a61161012e578063c2cfee27116100ab578063d547741f1161006f578063d547741f1461072b578063ef0e239b1461074b578063f2fde38b14610778578063f6c53d9b14610798578063f9eaee0d146107af57600080fd5b8063c2cfee2714610669578063c75858d51461069c578063ccaa7d2a146106bc578063d338ec9a146106ea578063d4eee1fc146106fd57600080fd5b8063a217fddf116100f2578063a217fddf146105b5578063a7d5eaea146105ca578063aba21009146105ea578063b5735c1e14610617578063c22c4f431461063757600080fd5b8063715018a6146104f057806371da85f9146105055780637c5a72cd146105575780638da5cb5b1461057757806391d148541461059557600080fd5b80632f2ff15d116101bc578063485cc95511610180578063485cc9551461043b5780634f1ef2861461045b57806352d1902d1461046e578063572b6c05146104835780636ce76f30146104bc57600080fd5b80632f2ff15d1461039b57806336568abe146103bb5780633659cfe6146103db5780633751d89c146103fb5780633ca2ad6f1461041b57600080fd5b80631499f9e6116102035780631499f9e6146102bf578063156b39aa146102f85780631db087ff1461031d578063248a9ca31461034b57806326d006681461037b57600080fd5b806301ffc9a714610235578063089b7c731461026a5780630e0660251461028c57806313ca98db146102ac575b600080fd5b34801561024157600080fd5b50610255610250366004613478565b6107e9565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a6102853660046134a2565b610820565b005b34801561029857600080fd5b5061028a6102a7366004613506565b6109c3565b61028a6102ba36600461356e565b610b8b565b3480156102cb57600080fd5b50610130546102e0906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b34801561030457600080fd5b5061030f6101365481565b604051908152602001610261565b34801561032957600080fd5b5061030f610338366004613624565b6101336020526000908152604090205481565b34801561035757600080fd5b5061030f610366366004613624565b600090815260fc602052604090206001015490565b34801561038757600080fd5b5061028a61039636600461363d565b610e57565b3480156103a757600080fd5b5061028a6103b636600461365a565b610eba565b3480156103c757600080fd5b5061028a6103d636600461365a565b610ee4565b3480156103e757600080fd5b5061028a6103f636600461363d565b610f72565b34801561040757600080fd5b5061028a61041636600461363d565b611051565b34801561042757600080fd5b5061028a610436366004613624565b6110aa565b34801561044757600080fd5b5061028a61045636600461368a565b6110f2565b61028a6104693660046136ce565b611269565b34801561047a57600080fd5b5061030f611335565b34801561048f57600080fd5b5061025561049e36600461363d565b6001600160a01b031660009081526065602052604090205460ff1690565b3480156104c857600080fd5b5061030f7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f81565b3480156104fc57600080fd5b5061028a6113e8565b34801561051157600080fd5b5061054061052036600461363d565b610135602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610261565b34801561056357600080fd5b5061028a6105723660046137a0565b6113fc565b34801561058357600080fd5b506033546001600160a01b03166102e0565b3480156105a157600080fd5b506102556105b036600461365a565b6114d1565b3480156105c157600080fd5b5061030f600081565b3480156105d657600080fd5b5061028a6105e53660046137e1565b6114fc565b3480156105f657600080fd5b5061060a6106053660046134a2565b61157e565b60405161026191906138f1565b34801561062357600080fd5b5061028a6106323660046134a2565b6116b0565b34801561064357600080fd5b50610657610652366004613624565b611755565b60405161026196959493929190613914565b34801561067557600080fd5b506106896106843660046134a2565b611819565b6040516102619796959493929190613955565b3480156106a857600080fd5b5061028a6106b73660046139a9565b6118fa565b3480156106c857600080fd5b5061030f6106d7366004613624565b6101346020526000908152604090205481565b61030f6106f8366004613a25565b611c1e565b34801561070957600080fd5b5061071d6107183660046134a2565b611e1e565b604051610261929190613b02565b34801561073757600080fd5b5061028a61074636600461365a565b61209a565b34801561075757600080fd5b5061076b610766366004613624565b6120bf565b6040516102619190613b27565b34801561078457600080fd5b5061028a61079336600461363d565b612253565b3480156107a457600080fd5b5061030f61012e5481565b3480156107bb57600080fd5b506102556107ca36600461363d565b6001600160a01b03166000908152610135602052604090205460ff1690565b60006001600160e01b03198216637965db0b60e01b148061081a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61012f5482906001600160a01b0316632fa117e58261083d6122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190613b3a565b6108d05760405162461bcd60e51b81526004016108c790613b57565b60405180910390fd5b600082815261013160205260409020600181015484146109225760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b60448201526064016108c7565b6000815460ff16600481111561093a5761093a61380d565b1461097f5760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108c7565b805460ff191660031781556040518381527f853aa4be1ac86f37acfc91d42b57f1fe895205aa6f8f9b7caa77ca257049ab1a9060200160405180910390a150505050565b61012f5484906001600160a01b0316632fa117e5826109e06122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e9190613b3a565b610a6a5760405162461bcd60e51b81526004016108c790613b57565b60008481526101316020526040902060018101548614610abc5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108c7565b6000815460ff166004811115610ad457610ad461380d565b14610b195760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108c7565b602e8314610b395760405162461bcd60e51b81526004016108c790613b86565b60038101610b48848683613c2b565b50847f1cae99404f615a4039d85b1009cb70622aae6d64f671e8b1b191d9269847d43e8585604051610b7b929190613d15565b60405180910390a2505050505050565b61012f548a906001600160a01b0316632fa117e582610ba86122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610bf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c169190613b3a565b610c325760405162461bcd60e51b81526004016108c790613b57565b610c438b8b8b8b8b8b8b8a8a6122d8565b6040805160e0810190915280600081526020018c81526020018a6001600160a01b0316815260200189815260200188815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060209182018790528c8152610132825260408082208f83529092522081518154829060ff191660018381811115610ce857610ce861380d565b02179055506020820151600182015560408201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a08201516005820190610d459082613d31565b5060c0919091015160069091015560008b81526101336020526040902054158015610d7d575060008b81526101346020526040902054155b15610de25761012f546040516383ce205b60e01b8152600481018d90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050505b60008b815261013460205260408120805491610dfd83613e07565b91905055507f11a8bc6241aa94a07af6c545ce8ed2dca2aaede88d02fd2b7e2d7ed28ccf1d4a8a8c888860008e8e8e8c604051610e4299989796959493929190613e20565b60405180910390a15050505050505050505050565b610e5f6126a7565b6001600160a01b038116600081815260656020908152604091829020805460ff1916600117905590519182527f3ef8564460ada92419608d823c014975d98f8104d7d1e68c222967ac6814cd9791015b60405180910390a150565b600082815260fc6020526040902060010154610ed581612720565b610edf8383612731565b505050565b610eec6122c9565b6001600160a01b0316816001600160a01b031614610f645760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108c7565b610f6e82826127b8565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610fba5760405162461bcd60e51b81526004016108c790613e81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110036000805160206141b4833981519152546001600160a01b031690565b6001600160a01b0316146110295760405162461bcd60e51b81526004016108c790613ecd565b6110328161283d565b6040805160008082526020820190925261104e91839190612845565b50565b6110596126a7565b6001600160a01b038116600081815260656020908152604091829020805460ff1916905590519182527fd2d636efcad0cea42e170256f4c5d8b1cd81e47b855557edaf44014e6cc4cee69101610eaf565b60006110b581612720565b6101368290556040518281527f577d7afcf67637a2f602cba220bbb292c1d715380dd011bfec748c3f641b2fd29060200160405180910390a15050565b600054610100900460ff16158080156111125750600054600160ff909116105b8061112c5750303b15801561112c575060005460ff166001145b61118f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108c7565b6000805460ff1916600117905580156111b2576000805461ff0019166101001790555b6111ba6129b0565b6111c26129df565b6111ca6129df565b6111dc60006111d76122c9565b612a06565b61012f80546001600160a01b038086166001600160a01b031992831617909255610130805492851692909116919091179055600161012e5561121e601e6110aa565b8015610edf576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a1505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036112b15760405162461bcd60e51b81526004016108c790613e81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112fa6000805160206141b4833981519152546001600160a01b031690565b6001600160a01b0316146113205760405162461bcd60e51b81526004016108c790613ecd565b6113298261283d565b610f6e82826001612845565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113d55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108c7565b506000805160206141b483398151915290565b6113f06126a7565b6113fa6000612a10565b565b6114046126a7565b6001600160a01b038316158015611419575081155b156114665760405162461bcd60e51b815260206004820152601d60248201527f4f776e65722063616e27742072656d6f7665204f78206164647265737300000060448201526064016108c7565b6001600160a01b03831660008181526101356020908152604091829020805460ff19168615159081178255600190910185905582519384529083015281018290527f42b585a1da1cff4b571e7a78aea1b4601b1d128de41a0feebd8a77aaf48b9d889060600161125c565b600091825260fc602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f61152681612720565b60008481526101316020908152604080832061013283528184208785529092529091208154600160ff1991821681178455808301546002850155600484018690558254909183911682805b0217905550505050505050565b611586613431565b60008381526101326020908152604080832085845290915290819020815160e081019092528054829060ff1660018111156115c3576115c361380d565b60018111156115d4576115d461380d565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a09092019161161c90613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461164890613bab565b80156116955780601f1061166a57610100808354040283529160200191611695565b820191906000526020600020905b81548152906001019060200180831161167857829003601f168201915b50505050508152602001600682015481525050905092915050565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f6116da81612720565b6000838152610131602090815260408083206101328352818420600282015485529092528220600381015491929091611714866064613f19565b61171e9190613f30565b905061013654811061173a57825460ff1916600217835561174d565b8254600490849060ff1916600183611571565b505050505050565b61013160205260009081526040902080546001820154600283015460038401805460ff90941694929391929161178a90613bab565b80601f01602080910402602001604051908101604052809291908181526020018280546117b690613bab565b80156118035780601f106117d857610100808354040283529160200191611803565b820191906000526020600020905b8154815290600101906020018083116117e657829003601f168201915b5050505050908060040154908060050154905086565b61013260209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601805460ff9096169694956001600160a01b0390941694929391929161187190613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461189d90613bab565b80156118ea5780601f106118bf576101008083540402835291602001916118ea565b820191906000526020600020905b8154815290600101906020018083116118cd57829003601f168201915b5050505050908060060154905087565b61012f5487906001600160a01b0316632fa117e5826119176122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119859190613b3a565b6119a15760405162461bcd60e51b81526004016108c790613b57565b6001600160a01b0386166000908152610135602052604090205460ff166119fe5760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108c7565b60008781526101316020908152604080832061013283528184208c855290925282209091825460ff166004811115611a3857611a3861380d565b14611a7a5760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108c7565b89816001015414611abd5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108c7565b602e8514611add5760405162461bcd60e51b81526004016108c790613b86565b6001815460ff166001811115611af557611af561380d565b03611b365760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481d985b1a59185d1959607a1b60448201526064016108c7565b6001600160a01b03881660009081526101356020526040902060010154871015611b935760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108c7565b6002810180546001600160a01b0319166001600160a01b038a161790556003810187905560058101611bc6868883613c2b565b50600681018490556040517f0f68ab04ab4935c8598d30f2c12ec34265575059bb4cae481b4d632cc43db81e90611c0a908b908d908a908a908e908e908c90613f52565b60405180910390a150505050505050505050565b61012f5460009087906001600160a01b0316632fa117e582611c3e6122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac9190613b3a565b611cc85760405162461bcd60e51b81526004016108c790613b57565b611cd6888888888888612a62565b61012e80549081906000611ce983613e07565b9091555050600081815261013160205260409020805460ff19168155600181018a905560038101611d1b888a83613c2b565b506005810189905560008a81526101336020526040902054158015611d4d575060008a81526101346020526040902054155b15611db25761012f546040516383ce205b60e01b8152600481018c90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015611d9957600080fd5b505af1158015611dad573d6000803e3d6000fd5b505050505b60008a815261013360205260408120805491611dcd83613e07565b91905055507f8f3fc1086abc1020f602edd700a9ae5801b250c9d110af9e54022d7cc5df7bee828b8b8b8b604051611e09959493929190613f9a565b60405180910390a15098975050505050505050565b611e586040805160c08101909152806000815260200160008152602001600081526020016060815260200160008152602001600081525090565b611e60613431565b60008481526101316020526040808220815160c081019092528054829060ff166004811115611e9157611e9161380d565b6004811115611ea257611ea261380d565b81526020016001820154815260200160028201548152602001600382018054611eca90613bab565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef690613bab565b8015611f435780601f10611f1857610100808354040283529160200191611f43565b820191906000526020600020905b815481529060010190602001808311611f2657829003601f168201915b5050509183525050600482015460208083019190915260059092015460409182015260008881526101328352818120888252909252808220815160e0810190925280549394509192909190829060ff166001811115611fa457611fa461380d565b6001811115611fb557611fb561380d565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a090920191611ffd90613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461202990613bab565b80156120765780601f1061204b57610100808354040283529160200191612076565b820191906000526020600020905b81548152906001019060200180831161205957829003601f168201915b505050918352505060069190910154602090910152919350909150505b9250929050565b600082815260fc60205260409020600101546120b581612720565b610edf83836127b8565b6120f96040805160c08101909152806000815260200160008152602001600081526020016060815260200160008152602001600081525090565b61012e54821061214b5760405162461bcd60e51b815260206004820152601a60248201527f54686973207365727669636520646f65736e277420657869737400000000000060448201526064016108c7565b6000828152610131602052604090819020815160c081019092528054829060ff16600481111561217d5761217d61380d565b600481111561218e5761218e61380d565b815260200160018201548152602001600282015481526020016003820180546121b690613bab565b80601f01602080910402602001604051908101604052809291908181526020018280546121e290613bab565b801561222f5780601f106122045761010080835404028352916020019161222f565b820191906000526020600020905b81548152906001019060200180831161221257829003601f168201915b50505050508152602001600482015481526020016005820154815250509050919050565b61225b6126a7565b6001600160a01b0381166122c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c7565b61104e81612a10565b60006122d3612c0d565b905090565b6001600160a01b0387166000908152610135602052604090205460ff166123355760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108c7565b61013054604051634a7ab1d560e01b8152600481018790526000916001600160a01b031690634a7ab1d590602401602060405180830381865afa158015612380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a49190613fcb565b90508034146123ea5760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108c7565b6001600160a01b038816600090815261013560205260409020600101548710156124475760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108c7565b60008981526101316020526040812090815460ff16600481111561246d5761246d61380d565b146124af5760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108c7565b80600101546000036124f75760405162461bcd60e51b815260206004820152601160248201527014d95c9d9a58d9481b9bdd08195e1a5cdd607a1b60448201526064016108c7565b60008a8152610132602090815260408083208e84529091529020600101548b900361255d5760405162461bcd60e51b81526020600482015260166024820152751c1c9bdc1bdcd85b08185b1c9958591e48195e1a5cdd60521b60448201526064016108c7565b8a8160010154036125ba5760405162461bcd60e51b815260206004820152602160248201527f63616e27742063726561746520666f7220796f7572206f776e207365727669636044820152606560f81b60648201526084016108c7565b602e85146125da5760405162461bcd60e51b81526004016108c790613b86565b61013054604051631fff7f2760e11b8152600481018990526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126499190613fe4565b90506001600160a01b038116156126995760008c8c89896040516020016126739493929190614001565b60405160208183030381529060405280519060200120905061269786868385612c46565b505b505050505050505050505050565b6126af6122c9565b6001600160a01b03166126ca6033546001600160a01b031690565b6001600160a01b0316146113fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c7565b61104e8161272c6122c9565b612d3a565b61273b82826114d1565b610f6e57600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff191660011790556127746122c9565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6127c282826114d1565b15610f6e57600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff191690556127f96122c9565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b61104e6126a7565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561287857610edf83612d93565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613fcb565b60015b6129355760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016108c7565b6000805160206141b483398151915281146129a45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016108c7565b50610edf838383612e2f565b600054610100900460ff166129d75760405162461bcd60e51b81526004016108c790614043565b6113fa612e5a565b600054610100900460ff166113fa5760405162461bcd60e51b81526004016108c790614043565b610f6e8282612731565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61013054604051638a98636360e01b8152600481018790526000916001600160a01b031690638a98636390602401602060405180830381865afa158015612aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad19190613fcb565b9050803414612b175760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108c7565b602e8414612b375760405162461bcd60e51b81526004016108c790613b86565b61013054604051631fff7f2760e11b8152600481018890526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba69190613fe4565b90506001600160a01b03811615612c0357600088815261013360209081526040808320549051612bdd928c92918b918b910161408e565b604051602081830303815290604052805190602001209050612c0185858385612c46565b505b5050505050505050565b600060143610801590612c2f57503360009081526065602052604090205460ff165b15612c41575060131936013560601c90565b503390565b6000612c9f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000612ce38287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9192505050565b9050806001600160a01b0316836001600160a01b03161461174d5760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b60448201526064016108c7565b612d4482826114d1565b610f6e57612d5181612eb5565b612d5c836020612ec7565b604051602001612d6d9291906140cf565b60408051601f198184030181529082905262461bcd60e51b82526108c791600401614144565b6001600160a01b0381163b612e005760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016108c7565b6000805160206141b483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612e388361306a565b600082511180612e455750805b15610edf57612e5483836130aa565b50505050565b600054610100900460ff16612e815760405162461bcd60e51b81526004016108c790614043565b6113fa612e8c6122c9565b612a10565b6000806000612ea0858561319e565b91509150612ead816131e0565b509392505050565b606061081a6001600160a01b03831660145b60606000612ed6836002613f19565b612ee1906002614157565b67ffffffffffffffff811115612ef957612ef96136b8565b6040519080825280601f01601f191660200182016040528015612f23576020820181803683370190505b509050600360fc1b81600081518110612f3e57612f3e61416a565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612f6d57612f6d61416a565b60200101906001600160f81b031916908160001a9053506000612f91846002613f19565b612f9c906001614157565b90505b6001811115613014576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612fd057612fd061416a565b1a60f81b828281518110612fe657612fe661416a565b60200101906001600160f81b031916908160001a90535060049490941c9361300d81614180565b9050612f9f565b5083156130635760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108c7565b9392505050565b61307381612d93565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6131125760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016108c7565b600080846001600160a01b03168460405161312d9190614197565b600060405180830381855af49150503d8060008114613168576040519150601f19603f3d011682016040523d82523d6000602084013e61316d565b606091505b509150915061319582826040518060600160405280602781526020016141d46027913961332a565b95945050505050565b60008082516041036131d45760208301516040840151606085015160001a6131c887828585613343565b94509450505050612093565b50600090506002612093565b60008160048111156131f4576131f461380d565b036131fc5750565b60018160048111156132105761321061380d565b0361325d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108c7565b60028160048111156132715761327161380d565b036132be5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108c7565b60038160048111156132d2576132d261380d565b0361104e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108c7565b60608315613339575081613063565b6130638383613407565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561337a57506000905060036133fe565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156133ce573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133f7576000600192509250506133fe565b9150600090505b94509492505050565b8151156134175781518083602001fd5b8060405162461bcd60e51b81526004016108c79190614144565b6040805160e0810190915280600081526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160608152602001600081525090565b60006020828403121561348a57600080fd5b81356001600160e01b03198116811461306357600080fd5b600080604083850312156134b557600080fd5b50508035926020909101359150565b60008083601f8401126134d657600080fd5b50813567ffffffffffffffff8111156134ee57600080fd5b60208301915083602082850101111561209357600080fd5b6000806000806060858703121561351c57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561354157600080fd5b61354d878288016134c4565b95989497509550505050565b6001600160a01b038116811461104e57600080fd5b6000806000806000806000806000806101008b8d03121561358e57600080fd5b8a35995060208b0135985060408b01356135a781613559565b975060608b0135965060808b0135955060a08b013567ffffffffffffffff808211156135d257600080fd5b6135de8e838f016134c4565b909750955060c08d0135945060e08d01359150808211156135fe57600080fd5b5061360b8d828e016134c4565b915080935050809150509295989b9194979a5092959850565b60006020828403121561363657600080fd5b5035919050565b60006020828403121561364f57600080fd5b813561306381613559565b6000806040838503121561366d57600080fd5b82359150602083013561367f81613559565b809150509250929050565b6000806040838503121561369d57600080fd5b82356136a881613559565b9150602083013561367f81613559565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156136e157600080fd5b82356136ec81613559565b9150602083013567ffffffffffffffff8082111561370957600080fd5b818501915085601f83011261371d57600080fd5b81358181111561372f5761372f6136b8565b604051601f8201601f19908116603f01168101908382118183101715613757576137576136b8565b8160405282815288602084870101111561377057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b801515811461104e57600080fd5b6000806000606084860312156137b557600080fd5b83356137c081613559565b925060208401356137d081613792565b929592945050506040919091013590565b6000806000606084860312156137f657600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052602160045260246000fd5b600281106138335761383361380d565b9052565b60005b8381101561385257818101518382015260200161383a565b50506000910152565b60008151808452613873816020860160208601613837565b601f01601f19169290920160200192915050565b613892828251613823565b6020810151602083015260018060a01b0360408201511660408301526060810151606083015260808101516080830152600060a082015160e060a08501526138dd60e085018261385b565b60c093840151949093019390935250919050565b6020815260006130636020830184613887565b600581106138335761383361380d565b61391e8188613904565b85602082015284604082015260c06060820152600061394060c083018661385b565b60808301949094525060a00152949350505050565b61395f8189613823565b86602082015260018060a01b038616604082015284606082015283608082015260e060a0820152600061399560e083018561385b565b90508260c083015298975050505050505050565b600080600080600080600060c0888a0312156139c457600080fd5b873596506020880135955060408801356139dd81613559565b945060608801359350608088013567ffffffffffffffff811115613a0057600080fd5b613a0c8a828b016134c4565b989b979a5095989497959660a090950135949350505050565b60008060008060008060808789031215613a3e57600080fd5b8635955060208701359450604087013567ffffffffffffffff80821115613a6457600080fd5b613a708a838b016134c4565b90965094506060890135915080821115613a8957600080fd5b50613a9689828a016134c4565b979a9699509497509295939492505050565b613ab3828251613904565b60208101516020830152604081015160408301526000606082015160c06060850152613ae260c085018261385b565b90506080830151608085015260a083015160a08501528091505092915050565b604081526000613b156040830185613aa8565b82810360208401526131958185613887565b6020815260006130636020830184613aa8565b600060208284031215613b4c57600080fd5b815161306381613792565b6020808252601590820152744e6f74206f776e6572206f722064656c656761746560581b604082015260600190565b6020808252600b908201526a125b9d985b1a590818da5960aa1b604082015260600190565b600181811c90821680613bbf57607f821691505b602082108103613bdf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610edf57600081815260208120601f850160051c81016020861015613c0c5750805b601f850160051c820191505b8181101561174d57828155600101613c18565b67ffffffffffffffff831115613c4357613c436136b8565b613c5783613c518354613bab565b83613be5565b6000601f841160018114613c8b5760008515613c735750838201355b600019600387901b1c1916600186901b178355613ce5565b600083815260209020601f19861690835b82811015613cbc5786850135825560209485019460019092019101613c9c565b5086821015613cd95760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000613d29602083018486613cec565b949350505050565b815167ffffffffffffffff811115613d4b57613d4b6136b8565b613d5f81613d598454613bab565b84613be5565b602080601f831160018114613d945760008415613d7c5750858301515b600019600386901b1c1916600185901b17855561174d565b600085815260208120601f198616915b82811015613dc357888601518255948401946001909101908401613da4565b5085821015613de15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600060018201613e1957613e19613df1565b5060010190565b60006101008b83528a6020840152806040840152613e418184018a8c613cec565b915050613e516060830188613823565b6001600160a01b0395909516608082015260a081019390935260c083019190915260e09091015295945050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b808202811582820484141761081a5761081a613df1565b600082613f4d57634e487b7160e01b600052601260045260246000fd5b500490565b87815286602082015260c060408201526000613f7260c083018789613cec565b6001600160a01b0395909516606083015250608081019290925260a090910152949350505050565b858152846020820152836040820152608060608201526000613fc0608083018486613cec565b979650505050505050565b600060208284031215613fdd57600080fd5b5051919050565b600060208284031215613ff657600080fd5b815161306381613559565b6d18dc99585d19541c9bdc1bdcd85b60921b815284600e820152603b60f81b602e82015283602f8201528183604f83013760009101604f019081529392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6c6372656174655365727669636560981b815284600d820152603b60f81b602d82015283602e8201528183604e83013760009101604e019081529392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614107816017850160208801613837565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614138816028840160208801613837565b01602801949350505050565b602081526000613063602083018461385b565b8082018082111561081a5761081a613df1565b634e487b7160e01b600052603260045260246000fd5b60008161418f5761418f613df1565b506000190190565b600082516141a9818460208701613837565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220810e0f3326770d5cbf2063fa706b979e196534c448759006348f0d89ef76705a64736f6c63430008110033", - "deployedBytecode": "0x6080604052600436106102305760003560e01c8063715018a61161012e578063c2cfee27116100ab578063d547741f1161006f578063d547741f1461072b578063ef0e239b1461074b578063f2fde38b14610778578063f6c53d9b14610798578063f9eaee0d146107af57600080fd5b8063c2cfee2714610669578063c75858d51461069c578063ccaa7d2a146106bc578063d338ec9a146106ea578063d4eee1fc146106fd57600080fd5b8063a217fddf116100f2578063a217fddf146105b5578063a7d5eaea146105ca578063aba21009146105ea578063b5735c1e14610617578063c22c4f431461063757600080fd5b8063715018a6146104f057806371da85f9146105055780637c5a72cd146105575780638da5cb5b1461057757806391d148541461059557600080fd5b80632f2ff15d116101bc578063485cc95511610180578063485cc9551461043b5780634f1ef2861461045b57806352d1902d1461046e578063572b6c05146104835780636ce76f30146104bc57600080fd5b80632f2ff15d1461039b57806336568abe146103bb5780633659cfe6146103db5780633751d89c146103fb5780633ca2ad6f1461041b57600080fd5b80631499f9e6116102035780631499f9e6146102bf578063156b39aa146102f85780631db087ff1461031d578063248a9ca31461034b57806326d006681461037b57600080fd5b806301ffc9a714610235578063089b7c731461026a5780630e0660251461028c57806313ca98db146102ac575b600080fd5b34801561024157600080fd5b50610255610250366004613478565b6107e9565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a6102853660046134a2565b610820565b005b34801561029857600080fd5b5061028a6102a7366004613506565b6109c3565b61028a6102ba36600461356e565b610b8b565b3480156102cb57600080fd5b50610130546102e0906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b34801561030457600080fd5b5061030f6101365481565b604051908152602001610261565b34801561032957600080fd5b5061030f610338366004613624565b6101336020526000908152604090205481565b34801561035757600080fd5b5061030f610366366004613624565b600090815260fc602052604090206001015490565b34801561038757600080fd5b5061028a61039636600461363d565b610e57565b3480156103a757600080fd5b5061028a6103b636600461365a565b610eba565b3480156103c757600080fd5b5061028a6103d636600461365a565b610ee4565b3480156103e757600080fd5b5061028a6103f636600461363d565b610f72565b34801561040757600080fd5b5061028a61041636600461363d565b611051565b34801561042757600080fd5b5061028a610436366004613624565b6110aa565b34801561044757600080fd5b5061028a61045636600461368a565b6110f2565b61028a6104693660046136ce565b611269565b34801561047a57600080fd5b5061030f611335565b34801561048f57600080fd5b5061025561049e36600461363d565b6001600160a01b031660009081526065602052604090205460ff1690565b3480156104c857600080fd5b5061030f7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f81565b3480156104fc57600080fd5b5061028a6113e8565b34801561051157600080fd5b5061054061052036600461363d565b610135602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610261565b34801561056357600080fd5b5061028a6105723660046137a0565b6113fc565b34801561058357600080fd5b506033546001600160a01b03166102e0565b3480156105a157600080fd5b506102556105b036600461365a565b6114d1565b3480156105c157600080fd5b5061030f600081565b3480156105d657600080fd5b5061028a6105e53660046137e1565b6114fc565b3480156105f657600080fd5b5061060a6106053660046134a2565b61157e565b60405161026191906138f1565b34801561062357600080fd5b5061028a6106323660046134a2565b6116b0565b34801561064357600080fd5b50610657610652366004613624565b611755565b60405161026196959493929190613914565b34801561067557600080fd5b506106896106843660046134a2565b611819565b6040516102619796959493929190613955565b3480156106a857600080fd5b5061028a6106b73660046139a9565b6118fa565b3480156106c857600080fd5b5061030f6106d7366004613624565b6101346020526000908152604090205481565b61030f6106f8366004613a25565b611c1e565b34801561070957600080fd5b5061071d6107183660046134a2565b611e1e565b604051610261929190613b02565b34801561073757600080fd5b5061028a61074636600461365a565b61209a565b34801561075757600080fd5b5061076b610766366004613624565b6120bf565b6040516102619190613b27565b34801561078457600080fd5b5061028a61079336600461363d565b612253565b3480156107a457600080fd5b5061030f61012e5481565b3480156107bb57600080fd5b506102556107ca36600461363d565b6001600160a01b03166000908152610135602052604090205460ff1690565b60006001600160e01b03198216637965db0b60e01b148061081a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61012f5482906001600160a01b0316632fa117e58261083d6122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190613b3a565b6108d05760405162461bcd60e51b81526004016108c790613b57565b60405180910390fd5b600082815261013160205260409020600181015484146109225760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b60448201526064016108c7565b6000815460ff16600481111561093a5761093a61380d565b1461097f5760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108c7565b805460ff191660031781556040518381527f853aa4be1ac86f37acfc91d42b57f1fe895205aa6f8f9b7caa77ca257049ab1a9060200160405180910390a150505050565b61012f5484906001600160a01b0316632fa117e5826109e06122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e9190613b3a565b610a6a5760405162461bcd60e51b81526004016108c790613b57565b60008481526101316020526040902060018101548614610abc5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108c7565b6000815460ff166004811115610ad457610ad461380d565b14610b195760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108c7565b602e8314610b395760405162461bcd60e51b81526004016108c790613b86565b60038101610b48848683613c2b565b50847f1cae99404f615a4039d85b1009cb70622aae6d64f671e8b1b191d9269847d43e8585604051610b7b929190613d15565b60405180910390a2505050505050565b61012f548a906001600160a01b0316632fa117e582610ba86122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610bf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c169190613b3a565b610c325760405162461bcd60e51b81526004016108c790613b57565b610c438b8b8b8b8b8b8b8a8a6122d8565b6040805160e0810190915280600081526020018c81526020018a6001600160a01b0316815260200189815260200188815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060209182018790528c8152610132825260408082208f83529092522081518154829060ff191660018381811115610ce857610ce861380d565b02179055506020820151600182015560408201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a08201516005820190610d459082613d31565b5060c0919091015160069091015560008b81526101336020526040902054158015610d7d575060008b81526101346020526040902054155b15610de25761012f546040516383ce205b60e01b8152600481018d90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050505b60008b815261013460205260408120805491610dfd83613e07565b91905055507f11a8bc6241aa94a07af6c545ce8ed2dca2aaede88d02fd2b7e2d7ed28ccf1d4a8a8c888860008e8e8e8c604051610e4299989796959493929190613e20565b60405180910390a15050505050505050505050565b610e5f6126a7565b6001600160a01b038116600081815260656020908152604091829020805460ff1916600117905590519182527f3ef8564460ada92419608d823c014975d98f8104d7d1e68c222967ac6814cd9791015b60405180910390a150565b600082815260fc6020526040902060010154610ed581612720565b610edf8383612731565b505050565b610eec6122c9565b6001600160a01b0316816001600160a01b031614610f645760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108c7565b610f6e82826127b8565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610fba5760405162461bcd60e51b81526004016108c790613e81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110036000805160206141b4833981519152546001600160a01b031690565b6001600160a01b0316146110295760405162461bcd60e51b81526004016108c790613ecd565b6110328161283d565b6040805160008082526020820190925261104e91839190612845565b50565b6110596126a7565b6001600160a01b038116600081815260656020908152604091829020805460ff1916905590519182527fd2d636efcad0cea42e170256f4c5d8b1cd81e47b855557edaf44014e6cc4cee69101610eaf565b60006110b581612720565b6101368290556040518281527f577d7afcf67637a2f602cba220bbb292c1d715380dd011bfec748c3f641b2fd29060200160405180910390a15050565b600054610100900460ff16158080156111125750600054600160ff909116105b8061112c5750303b15801561112c575060005460ff166001145b61118f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108c7565b6000805460ff1916600117905580156111b2576000805461ff0019166101001790555b6111ba6129b0565b6111c26129df565b6111ca6129df565b6111dc60006111d76122c9565b612a06565b61012f80546001600160a01b038086166001600160a01b031992831617909255610130805492851692909116919091179055600161012e5561121e601e6110aa565b8015610edf576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a1505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036112b15760405162461bcd60e51b81526004016108c790613e81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112fa6000805160206141b4833981519152546001600160a01b031690565b6001600160a01b0316146113205760405162461bcd60e51b81526004016108c790613ecd565b6113298261283d565b610f6e82826001612845565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113d55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108c7565b506000805160206141b483398151915290565b6113f06126a7565b6113fa6000612a10565b565b6114046126a7565b6001600160a01b038316158015611419575081155b156114665760405162461bcd60e51b815260206004820152601d60248201527f4f776e65722063616e27742072656d6f7665204f78206164647265737300000060448201526064016108c7565b6001600160a01b03831660008181526101356020908152604091829020805460ff19168615159081178255600190910185905582519384529083015281018290527f42b585a1da1cff4b571e7a78aea1b4601b1d128de41a0feebd8a77aaf48b9d889060600161125c565b600091825260fc602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f61152681612720565b60008481526101316020908152604080832061013283528184208785529092529091208154600160ff1991821681178455808301546002850155600484018690558254909183911682805b0217905550505050505050565b611586613431565b60008381526101326020908152604080832085845290915290819020815160e081019092528054829060ff1660018111156115c3576115c361380d565b60018111156115d4576115d461380d565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a09092019161161c90613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461164890613bab565b80156116955780601f1061166a57610100808354040283529160200191611695565b820191906000526020600020905b81548152906001019060200180831161167857829003601f168201915b50505050508152602001600682015481525050905092915050565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f6116da81612720565b6000838152610131602090815260408083206101328352818420600282015485529092528220600381015491929091611714866064613f19565b61171e9190613f30565b905061013654811061173a57825460ff1916600217835561174d565b8254600490849060ff1916600183611571565b505050505050565b61013160205260009081526040902080546001820154600283015460038401805460ff90941694929391929161178a90613bab565b80601f01602080910402602001604051908101604052809291908181526020018280546117b690613bab565b80156118035780601f106117d857610100808354040283529160200191611803565b820191906000526020600020905b8154815290600101906020018083116117e657829003601f168201915b5050505050908060040154908060050154905086565b61013260209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601805460ff9096169694956001600160a01b0390941694929391929161187190613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461189d90613bab565b80156118ea5780601f106118bf576101008083540402835291602001916118ea565b820191906000526020600020905b8154815290600101906020018083116118cd57829003601f168201915b5050505050908060060154905087565b61012f5487906001600160a01b0316632fa117e5826119176122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119859190613b3a565b6119a15760405162461bcd60e51b81526004016108c790613b57565b6001600160a01b0386166000908152610135602052604090205460ff166119fe5760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108c7565b60008781526101316020908152604080832061013283528184208c855290925282209091825460ff166004811115611a3857611a3861380d565b14611a7a5760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108c7565b89816001015414611abd5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108c7565b602e8514611add5760405162461bcd60e51b81526004016108c790613b86565b6001815460ff166001811115611af557611af561380d565b03611b365760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481d985b1a59185d1959607a1b60448201526064016108c7565b6001600160a01b03881660009081526101356020526040902060010154871015611b935760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108c7565b6002810180546001600160a01b0319166001600160a01b038a161790556003810187905560058101611bc6868883613c2b565b50600681018490556040517f0f68ab04ab4935c8598d30f2c12ec34265575059bb4cae481b4d632cc43db81e90611c0a908b908d908a908a908e908e908c90613f52565b60405180910390a150505050505050505050565b61012f5460009087906001600160a01b0316632fa117e582611c3e6122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac9190613b3a565b611cc85760405162461bcd60e51b81526004016108c790613b57565b611cd6888888888888612a62565b61012e80549081906000611ce983613e07565b9091555050600081815261013160205260409020805460ff19168155600181018a905560038101611d1b888a83613c2b565b506005810189905560008a81526101336020526040902054158015611d4d575060008a81526101346020526040902054155b15611db25761012f546040516383ce205b60e01b8152600481018c90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015611d9957600080fd5b505af1158015611dad573d6000803e3d6000fd5b505050505b60008a815261013360205260408120805491611dcd83613e07565b91905055507f8f3fc1086abc1020f602edd700a9ae5801b250c9d110af9e54022d7cc5df7bee828b8b8b8b604051611e09959493929190613f9a565b60405180910390a15098975050505050505050565b611e586040805160c08101909152806000815260200160008152602001600081526020016060815260200160008152602001600081525090565b611e60613431565b60008481526101316020526040808220815160c081019092528054829060ff166004811115611e9157611e9161380d565b6004811115611ea257611ea261380d565b81526020016001820154815260200160028201548152602001600382018054611eca90613bab565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef690613bab565b8015611f435780601f10611f1857610100808354040283529160200191611f43565b820191906000526020600020905b815481529060010190602001808311611f2657829003601f168201915b5050509183525050600482015460208083019190915260059092015460409182015260008881526101328352818120888252909252808220815160e0810190925280549394509192909190829060ff166001811115611fa457611fa461380d565b6001811115611fb557611fb561380d565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a090920191611ffd90613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461202990613bab565b80156120765780601f1061204b57610100808354040283529160200191612076565b820191906000526020600020905b81548152906001019060200180831161205957829003601f168201915b505050918352505060069190910154602090910152919350909150505b9250929050565b600082815260fc60205260409020600101546120b581612720565b610edf83836127b8565b6120f96040805160c08101909152806000815260200160008152602001600081526020016060815260200160008152602001600081525090565b61012e54821061214b5760405162461bcd60e51b815260206004820152601a60248201527f54686973207365727669636520646f65736e277420657869737400000000000060448201526064016108c7565b6000828152610131602052604090819020815160c081019092528054829060ff16600481111561217d5761217d61380d565b600481111561218e5761218e61380d565b815260200160018201548152602001600282015481526020016003820180546121b690613bab565b80601f01602080910402602001604051908101604052809291908181526020018280546121e290613bab565b801561222f5780601f106122045761010080835404028352916020019161222f565b820191906000526020600020905b81548152906001019060200180831161221257829003601f168201915b50505050508152602001600482015481526020016005820154815250509050919050565b61225b6126a7565b6001600160a01b0381166122c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c7565b61104e81612a10565b60006122d3612c0d565b905090565b6001600160a01b0387166000908152610135602052604090205460ff166123355760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108c7565b61013054604051634a7ab1d560e01b8152600481018790526000916001600160a01b031690634a7ab1d590602401602060405180830381865afa158015612380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a49190613fcb565b90508034146123ea5760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108c7565b6001600160a01b038816600090815261013560205260409020600101548710156124475760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108c7565b60008981526101316020526040812090815460ff16600481111561246d5761246d61380d565b146124af5760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108c7565b80600101546000036124f75760405162461bcd60e51b815260206004820152601160248201527014d95c9d9a58d9481b9bdd08195e1a5cdd607a1b60448201526064016108c7565b60008a8152610132602090815260408083208e84529091529020600101548b900361255d5760405162461bcd60e51b81526020600482015260166024820152751c1c9bdc1bdcd85b08185b1c9958591e48195e1a5cdd60521b60448201526064016108c7565b8a8160010154036125ba5760405162461bcd60e51b815260206004820152602160248201527f63616e27742063726561746520666f7220796f7572206f776e207365727669636044820152606560f81b60648201526084016108c7565b602e85146125da5760405162461bcd60e51b81526004016108c790613b86565b61013054604051631fff7f2760e11b8152600481018990526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126499190613fe4565b90506001600160a01b038116156126995760008c8c89896040516020016126739493929190614001565b60405160208183030381529060405280519060200120905061269786868385612c46565b505b505050505050505050505050565b6126af6122c9565b6001600160a01b03166126ca6033546001600160a01b031690565b6001600160a01b0316146113fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c7565b61104e8161272c6122c9565b612d3a565b61273b82826114d1565b610f6e57600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff191660011790556127746122c9565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6127c282826114d1565b15610f6e57600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff191690556127f96122c9565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b61104e6126a7565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561287857610edf83612d93565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613fcb565b60015b6129355760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016108c7565b6000805160206141b483398151915281146129a45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016108c7565b50610edf838383612e2f565b600054610100900460ff166129d75760405162461bcd60e51b81526004016108c790614043565b6113fa612e5a565b600054610100900460ff166113fa5760405162461bcd60e51b81526004016108c790614043565b610f6e8282612731565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61013054604051638a98636360e01b8152600481018790526000916001600160a01b031690638a98636390602401602060405180830381865afa158015612aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad19190613fcb565b9050803414612b175760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108c7565b602e8414612b375760405162461bcd60e51b81526004016108c790613b86565b61013054604051631fff7f2760e11b8152600481018890526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba69190613fe4565b90506001600160a01b03811615612c0357600088815261013360209081526040808320549051612bdd928c92918b918b910161408e565b604051602081830303815290604052805190602001209050612c0185858385612c46565b505b5050505050505050565b600060143610801590612c2f57503360009081526065602052604090205460ff165b15612c41575060131936013560601c90565b503390565b6000612c9f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000612ce38287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9192505050565b9050806001600160a01b0316836001600160a01b03161461174d5760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b60448201526064016108c7565b612d4482826114d1565b610f6e57612d5181612eb5565b612d5c836020612ec7565b604051602001612d6d9291906140cf565b60408051601f198184030181529082905262461bcd60e51b82526108c791600401614144565b6001600160a01b0381163b612e005760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016108c7565b6000805160206141b483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612e388361306a565b600082511180612e455750805b15610edf57612e5483836130aa565b50505050565b600054610100900460ff16612e815760405162461bcd60e51b81526004016108c790614043565b6113fa612e8c6122c9565b612a10565b6000806000612ea0858561319e565b91509150612ead816131e0565b509392505050565b606061081a6001600160a01b03831660145b60606000612ed6836002613f19565b612ee1906002614157565b67ffffffffffffffff811115612ef957612ef96136b8565b6040519080825280601f01601f191660200182016040528015612f23576020820181803683370190505b509050600360fc1b81600081518110612f3e57612f3e61416a565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612f6d57612f6d61416a565b60200101906001600160f81b031916908160001a9053506000612f91846002613f19565b612f9c906001614157565b90505b6001811115613014576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612fd057612fd061416a565b1a60f81b828281518110612fe657612fe661416a565b60200101906001600160f81b031916908160001a90535060049490941c9361300d81614180565b9050612f9f565b5083156130635760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108c7565b9392505050565b61307381612d93565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6131125760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016108c7565b600080846001600160a01b03168460405161312d9190614197565b600060405180830381855af49150503d8060008114613168576040519150601f19603f3d011682016040523d82523d6000602084013e61316d565b606091505b509150915061319582826040518060600160405280602781526020016141d46027913961332a565b95945050505050565b60008082516041036131d45760208301516040840151606085015160001a6131c887828585613343565b94509450505050612093565b50600090506002612093565b60008160048111156131f4576131f461380d565b036131fc5750565b60018160048111156132105761321061380d565b0361325d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108c7565b60028160048111156132715761327161380d565b036132be5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108c7565b60038160048111156132d2576132d261380d565b0361104e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108c7565b60608315613339575081613063565b6130638383613407565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561337a57506000905060036133fe565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156133ce573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133f7576000600192509250506133fe565b9150600090505b94509492505050565b8151156134175781518083602001fd5b8060405162461bcd60e51b81526004016108c79190614144565b6040805160e0810190915280600081526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160608152602001600081525090565b60006020828403121561348a57600080fd5b81356001600160e01b03198116811461306357600080fd5b600080604083850312156134b557600080fd5b50508035926020909101359150565b60008083601f8401126134d657600080fd5b50813567ffffffffffffffff8111156134ee57600080fd5b60208301915083602082850101111561209357600080fd5b6000806000806060858703121561351c57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561354157600080fd5b61354d878288016134c4565b95989497509550505050565b6001600160a01b038116811461104e57600080fd5b6000806000806000806000806000806101008b8d03121561358e57600080fd5b8a35995060208b0135985060408b01356135a781613559565b975060608b0135965060808b0135955060a08b013567ffffffffffffffff808211156135d257600080fd5b6135de8e838f016134c4565b909750955060c08d0135945060e08d01359150808211156135fe57600080fd5b5061360b8d828e016134c4565b915080935050809150509295989b9194979a5092959850565b60006020828403121561363657600080fd5b5035919050565b60006020828403121561364f57600080fd5b813561306381613559565b6000806040838503121561366d57600080fd5b82359150602083013561367f81613559565b809150509250929050565b6000806040838503121561369d57600080fd5b82356136a881613559565b9150602083013561367f81613559565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156136e157600080fd5b82356136ec81613559565b9150602083013567ffffffffffffffff8082111561370957600080fd5b818501915085601f83011261371d57600080fd5b81358181111561372f5761372f6136b8565b604051601f8201601f19908116603f01168101908382118183101715613757576137576136b8565b8160405282815288602084870101111561377057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b801515811461104e57600080fd5b6000806000606084860312156137b557600080fd5b83356137c081613559565b925060208401356137d081613792565b929592945050506040919091013590565b6000806000606084860312156137f657600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052602160045260246000fd5b600281106138335761383361380d565b9052565b60005b8381101561385257818101518382015260200161383a565b50506000910152565b60008151808452613873816020860160208601613837565b601f01601f19169290920160200192915050565b613892828251613823565b6020810151602083015260018060a01b0360408201511660408301526060810151606083015260808101516080830152600060a082015160e060a08501526138dd60e085018261385b565b60c093840151949093019390935250919050565b6020815260006130636020830184613887565b600581106138335761383361380d565b61391e8188613904565b85602082015284604082015260c06060820152600061394060c083018661385b565b60808301949094525060a00152949350505050565b61395f8189613823565b86602082015260018060a01b038616604082015284606082015283608082015260e060a0820152600061399560e083018561385b565b90508260c083015298975050505050505050565b600080600080600080600060c0888a0312156139c457600080fd5b873596506020880135955060408801356139dd81613559565b945060608801359350608088013567ffffffffffffffff811115613a0057600080fd5b613a0c8a828b016134c4565b989b979a5095989497959660a090950135949350505050565b60008060008060008060808789031215613a3e57600080fd5b8635955060208701359450604087013567ffffffffffffffff80821115613a6457600080fd5b613a708a838b016134c4565b90965094506060890135915080821115613a8957600080fd5b50613a9689828a016134c4565b979a9699509497509295939492505050565b613ab3828251613904565b60208101516020830152604081015160408301526000606082015160c06060850152613ae260c085018261385b565b90506080830151608085015260a083015160a08501528091505092915050565b604081526000613b156040830185613aa8565b82810360208401526131958185613887565b6020815260006130636020830184613aa8565b600060208284031215613b4c57600080fd5b815161306381613792565b6020808252601590820152744e6f74206f776e6572206f722064656c656761746560581b604082015260600190565b6020808252600b908201526a125b9d985b1a590818da5960aa1b604082015260600190565b600181811c90821680613bbf57607f821691505b602082108103613bdf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610edf57600081815260208120601f850160051c81016020861015613c0c5750805b601f850160051c820191505b8181101561174d57828155600101613c18565b67ffffffffffffffff831115613c4357613c436136b8565b613c5783613c518354613bab565b83613be5565b6000601f841160018114613c8b5760008515613c735750838201355b600019600387901b1c1916600186901b178355613ce5565b600083815260209020601f19861690835b82811015613cbc5786850135825560209485019460019092019101613c9c565b5086821015613cd95760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000613d29602083018486613cec565b949350505050565b815167ffffffffffffffff811115613d4b57613d4b6136b8565b613d5f81613d598454613bab565b84613be5565b602080601f831160018114613d945760008415613d7c5750858301515b600019600386901b1c1916600185901b17855561174d565b600085815260208120601f198616915b82811015613dc357888601518255948401946001909101908401613da4565b5085821015613de15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600060018201613e1957613e19613df1565b5060010190565b60006101008b83528a6020840152806040840152613e418184018a8c613cec565b915050613e516060830188613823565b6001600160a01b0395909516608082015260a081019390935260c083019190915260e09091015295945050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b808202811582820484141761081a5761081a613df1565b600082613f4d57634e487b7160e01b600052601260045260246000fd5b500490565b87815286602082015260c060408201526000613f7260c083018789613cec565b6001600160a01b0395909516606083015250608081019290925260a090910152949350505050565b858152846020820152836040820152608060608201526000613fc0608083018486613cec565b979650505050505050565b600060208284031215613fdd57600080fd5b5051919050565b600060208284031215613ff657600080fd5b815161306381613559565b6d18dc99585d19541c9bdc1bdcd85b60921b815284600e820152603b60f81b602e82015283602f8201528183604f83013760009101604f019081529392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6c6372656174655365727669636560981b815284600d820152603b60f81b602d82015283602e8201528183604e83013760009101604e019081529392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614107816017850160208801613837565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614138816028840160208801613837565b01602801949350505050565b602081526000613063602083018461385b565b8082018082111561081a5761081a613df1565b634e487b7160e01b600052603260045260246000fd5b60008161418f5761418f613df1565b506000190190565b600082516141a9818460208701613837565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220810e0f3326770d5cbf2063fa706b979e196534c448759006348f0d89ef76705a64736f6c63430008110033", + "bytecode": "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516144ec62000120600039600081816112d301528181611313015281816115ca0152818161160a015261169901526144ec6000f3fe6080604052600436106102305760003560e01c80636ce76f301161012e578063b5735c1e116100ab578063d547741f1161006f578063d547741f1461072e578063ef0e239b1461074e578063f2fde38b1461077b578063f6c53d9b1461079b578063f9eaee0d146107b257600080fd5b8063b5735c1e1461064a578063c22c4f431461066a578063c2cfee271461069e578063ccaa7d2a146106d2578063d4eee1fc1461070057600080fd5b806391d14854116100f257806391d14854146105b5578063a217fddf146105d5578063a24bd889146105ea578063a7d5eaea146105fd578063aba210091461061d57600080fd5b80636ce76f30146104dc578063715018a61461051057806371da85f9146105255780637c5a72cd146105775780638da5cb5b1461059757600080fd5b80632afaf220116101bc5780633ca2ad6f116101805780633ca2ad6f1461043b578063485cc9551461045b5780634f1ef2861461047b57806352d1902d1461048e578063572b6c05146104a357600080fd5b80632afaf220146103a85780632f2ff15d146103bb57806336568abe146103db5780633659cfe6146103fb5780633751d89c1461041b57600080fd5b8063156b39aa11610203578063156b39aa146102e557806319de9d6c1461030a5780631db087ff1461032a578063248a9ca31461035857806326d006681461038857600080fd5b806301ffc9a714610235578063089b7c731461026a5780631499f9e61461028c578063154664ed146102c5575b600080fd5b34801561024157600080fd5b506102556102503660046136a2565b6107ec565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a6102853660046136cc565b610823565b005b34801561029857600080fd5b50610130546102ad906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b3480156102d157600080fd5b5061028a6102e0366004613730565b6109c6565b3480156102f157600080fd5b506102fc6101365481565b604051908152602001610261565b34801561031657600080fd5b5061028a6103253660046137b5565b610cde565b34801561033657600080fd5b506102fc610345366004613828565b6101336020526000908152604090205481565b34801561036457600080fd5b506102fc610373366004613828565b600090815260fc602052604090206001015490565b34801561039457600080fd5b5061028a6103a3366004613841565b610f83565b6102fc6103b636600461385e565b610fe6565b3480156103c757600080fd5b5061028a6103d63660046138fe565b611211565b3480156103e757600080fd5b5061028a6103f63660046138fe565b61123b565b34801561040757600080fd5b5061028a610416366004613841565b6112c9565b34801561042757600080fd5b5061028a610436366004613841565b6113a8565b34801561044757600080fd5b5061028a610456366004613828565b611401565b34801561046757600080fd5b5061028a61047636600461392e565b611449565b61028a610489366004613972565b6115c0565b34801561049a57600080fd5b506102fc61168c565b3480156104af57600080fd5b506102556104be366004613841565b6001600160a01b031660009081526065602052604090205460ff1690565b3480156104e857600080fd5b506102fc7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f81565b34801561051c57600080fd5b5061028a61173f565b34801561053157600080fd5b50610560610540366004613841565b610135602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610261565b34801561058357600080fd5b5061028a610592366004613a44565b611753565b3480156105a357600080fd5b506033546001600160a01b03166102ad565b3480156105c157600080fd5b506102556105d03660046138fe565b611828565b3480156105e157600080fd5b506102fc600081565b61028a6105f8366004613a85565b611853565b34801561060957600080fd5b5061028a610618366004613b32565b611b6d565b34801561062957600080fd5b5061063d6106383660046136cc565b611bef565b6040516102619190613c50565b34801561065657600080fd5b5061028a6106653660046136cc565b611d2c565b34801561067657600080fd5b5061068a610685366004613828565b611dd1565b604051610261989796959493929190613c73565b3480156106aa57600080fd5b506106be6106b93660046136cc565b611eae565b604051610261989796959493929190613cd1565b3480156106de57600080fd5b506102fc6106ed366004613828565b6101346020526000908152604090205481565b34801561070c57600080fd5b5061072061071b3660046136cc565b611f95565b604051610261929190613da2565b34801561073a57600080fd5b5061028a6107493660046138fe565b61220b565b34801561075a57600080fd5b5061076e610769366004613828565b612230565b6040516102619190613dc7565b34801561078757600080fd5b5061028a610796366004613841565b6123b0565b3480156107a757600080fd5b506102fc61012e5481565b3480156107be57600080fd5b506102556107cd366004613841565b6001600160a01b03166000908152610135602052604090205460ff1690565b60006001600160e01b03198216637965db0b60e01b148061081d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61012f5482906001600160a01b0316632fa117e582610840612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa15801561088a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ae9190613dda565b6108d35760405162461bcd60e51b81526004016108ca90613df7565b60405180910390fd5b600082815261013160205260409020600181015484146109255760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b60448201526064016108ca565b6000815460ff16600481111561093d5761093d613b5e565b146109825760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108ca565b805460ff191660031781556040518381527f853aa4be1ac86f37acfc91d42b57f1fe895205aa6f8f9b7caa77ca257049ab1a9060200160405180910390a150505050565b61012f5487906001600160a01b0316632fa117e5826109e3612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a519190613dda565b610a6d5760405162461bcd60e51b81526004016108ca90613df7565b60008781526101316020908152604080832061013283528184208c855290925282209091825460ff166004811115610aa757610aa7613b5e565b14610ae95760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108ca565b89816001015414610b2c5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108ca565b602e8614610b4c5760405162461bcd60e51b81526004016108ca90613e26565b6001815460ff166001811115610b6457610b64613b5e565b03610ba55760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481d985b1a59185d1959607a1b60448201526064016108ca565b60068201546001600160a01b031660009081526101356020526040902060010154881015610c065760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108ca565b8315610c695761012f5460405162f577a560e81b8152600481018690526001600160a01b039091169063f577a5009060240160006040518083038186803b158015610c5057600080fd5b505afa158015610c64573d6000803e3d6000fd5b505050505b6003810188905560058101610c7f878983613ecb565b5060068101859055600781018490556040517ffbfaa6f4e508bec40137ac265a7424e16a2d209355b2f4a35de5a80ba8fec1db90610cca908b908d908b908b908e908c908c90613fb5565b60405180910390a150505050505050505050565b61012f5486906001600160a01b0316632fa117e582610cfb612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d699190613dda565b610d855760405162461bcd60e51b81526004016108ca90613df7565b60008681526101316020526040902060018101548814610dd75760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108ca565b6000815460ff166004811115610def57610def613b5e565b14610e345760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108ca565b602e8314610e545760405162461bcd60e51b81526004016108ca90613e26565b6001600160a01b0386166000908152610135602052604090205460ff16610eb15760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108ca565b8060070154851015610f055760405162461bcd60e51b815260206004820152601c60248201527f43616e27742072656475636520726566657272616c20616d6f756e740000000060448201526064016108ca565b60038101610f14848683613ecb565b50600781018590556006810180546001600160a01b0319166001600160a01b0388161790556040517f79dba2b7507f91f38c9a67e52f174c234541b20eccc91ad6afe9d3753f6371f590610f71908990879087908b908b90613ff4565b60405180910390a15050505050505050565b610f8b612435565b6001600160a01b038116600081815260656020908152604091829020805460ff1916600117905590519182527f3ef8564460ada92419608d823c014975d98f8104d7d1e68c222967ac6814cd9791015b60405180910390a150565b61012f5460009089906001600160a01b0316632fa117e582611006612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611050573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110749190613dda565b6110905760405162461bcd60e51b81526004016108ca90613df7565b61109f8a8a8a8a8a8a8a6124ae565b61012e805490819060006110b283614041565b9091555050600081815261013160205260409020805460ff19168155600181018c9055600381016110e48a8c83613ecb565b50600581018b90556006810180546001600160a01b0319166001600160a01b0388161790556007810185905560008c8152610133602052604090205415801561113a575060008c81526101346020526040902054155b1561119f5761012f546040516383ce205b60e01b8152600481018e90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b15801561118657600080fd5b505af115801561119a573d6000803e3d6000fd5b505050505b60008c8152610133602052604081208054916111ba83614041565b91905055507fe7f6435fc92b0ccd6f56395ae67b06f2cdb9680c0179f87f5821431304ad3f3e828d8d8d8d8b8b6040516111fa979695949392919061405a565b60405180910390a1509a9950505050505050505050565b600082815260fc602052604090206001015461122c816126b7565b61123683836126c8565b505050565b611243612426565b6001600160a01b0316816001600160a01b0316146112bb5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108ca565b6112c5828261274f565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036113115760405162461bcd60e51b81526004016108ca9061409f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661135a600080516020614470833981519152546001600160a01b031690565b6001600160a01b0316146113805760405162461bcd60e51b81526004016108ca906140eb565b611389816127d4565b604080516000808252602082019092526113a5918391906127dc565b50565b6113b0612435565b6001600160a01b038116600081815260656020908152604091829020805460ff1916905590519182527fd2d636efcad0cea42e170256f4c5d8b1cd81e47b855557edaf44014e6cc4cee69101610fdb565b600061140c816126b7565b6101368290556040518281527f577d7afcf67637a2f602cba220bbb292c1d715380dd011bfec748c3f641b2fd29060200160405180910390a15050565b600054610100900460ff16158080156114695750600054600160ff909116105b806114835750303b158015611483575060005460ff166001145b6114e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108ca565b6000805460ff191660011790558015611509576000805461ff0019166101001790555b611511612947565b611519612976565b611521612976565b611533600061152e612426565b61299d565b61012f80546001600160a01b038086166001600160a01b031992831617909255610130805492851692909116919091179055600161012e55611575601e611401565b8015611236576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a1505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036116085760405162461bcd60e51b81526004016108ca9061409f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611651600080516020614470833981519152546001600160a01b031690565b6001600160a01b0316146116775760405162461bcd60e51b81526004016108ca906140eb565b611680826127d4565b6112c5828260016127dc565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461172c5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108ca565b5060008051602061447083398151915290565b611747612435565b61175160006129a7565b565b61175b612435565b6001600160a01b038316158015611770575081155b156117bd5760405162461bcd60e51b815260206004820152601d60248201527f4f776e65722063616e27742072656d6f7665204f78206164647265737300000060448201526064016108ca565b6001600160a01b03831660008181526101356020908152604091829020805460ff19168615159081178255600190910185905582519384529083015281018290527f42b585a1da1cff4b571e7a78aea1b4601b1d128de41a0feebd8a77aaf48b9d88906060016115b3565b600091825260fc602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61012f548a906001600160a01b0316632fa117e582611870612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa1580156118ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118de9190613dda565b6118fa5760405162461bcd60e51b81526004016108ca90613df7565b60008a81526101316020526040902061191a8c8c8c8c8c8c8b8b8b6129f9565b60408051610100810182526000815260208082018f905260068401546001600160a01b031682840152606082018d9052608082018c90528251601f8b01829004820281018201909352898352909160a08301918b908b9081908401838280828437600081840152601f19601f8201169050808301925050505050505081526020018781526020018481525061013260008d815260200190815260200160002060008e815260200190815260200160002060008201518160000160006101000a81548160ff021916908360018111156119f4576119f4613b5e565b02179055506020820151600182015560408201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a08201516005820190611a519082614137565b5060c0820151600682015560e09091015160079091015560008c81526101336020526040902054158015611a92575060008c81526101346020526040902054155b15611af75761012f546040516383ce205b60e01b8152600481018e90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015611ade57600080fd5b505af1158015611af2573d6000803e3d6000fd5b505050505b60008c815261013460205260408120805491611b1283614041565b91905055507fabd26455c3256ad90125661f4c1a4c16fecf585ccade21e749c56d8fd44bb1dd8b8d8a8a60008f8f8d8b604051611b57999897969594939291906141f7565b60405180910390a1505050505050505050505050565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f611b97816126b7565b60008481526101316020908152604080832061013283528184208785529092529091208154600160ff1991821681178455808301546002850155600484018690558254909183911682805b0217905550505050505050565b611bf7613604565b60008381526101326020908152604080832085845290915290819020815161010081019092528054829060ff166001811115611c3557611c35613b5e565b6001811115611c4657611c46613b5e565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a090920191611c8e90613e4b565b80601f0160208091040260200160405190810160405280929190818152602001828054611cba90613e4b565b8015611d075780601f10611cdc57610100808354040283529160200191611d07565b820191906000526020600020905b815481529060010190602001808311611cea57829003601f168201915b5050505050815260200160068201548152602001600782015481525050905092915050565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f611d56816126b7565b6000838152610131602090815260408083206101328352818420600282015485529092528220600381015491929091611d9086606461424e565b611d9a9190614265565b9050610136548110611db657825460ff19166002178355611dc9565b8254600490849060ff1916600183611be2565b505050505050565b61013160205260009081526040902080546001820154600283015460038401805460ff909416949293919291611e0690613e4b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3290613e4b565b8015611e7f5780601f10611e5457610100808354040283529160200191611e7f565b820191906000526020600020905b815481529060010190602001808311611e6257829003601f168201915b505050600484015460058501546006860154600790960154949591949093506001600160a01b03909116915088565b61013260209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601805460ff9096169694956001600160a01b03909416949293919291611f0690613e4b565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3290613e4b565b8015611f7f5780601f10611f5457610100808354040283529160200191611f7f565b820191906000526020600020905b815481529060010190602001808311611f6257829003601f168201915b5050505050908060060154908060070154905088565b611f9d613653565b611fa5613604565b60008481526101316020526040808220815161010081019092528054829060ff166004811115611fd757611fd7613b5e565b6004811115611fe857611fe8613b5e565b8152602001600182015481526020016002820154815260200160038201805461201090613e4b565b80601f016020809104026020016040519081016040528092919081815260200182805461203c90613e4b565b80156120895780601f1061205e57610100808354040283529160200191612089565b820191906000526020600020905b81548152906001019060200180831161206c57829003601f168201915b50505091835250506004820154602080830191909152600583015460408084019190915260068401546001600160a01b03166060840152600790930154608090920191909152600088815261013282528281208882529091528181208251610100810190935280549394509092829060ff16600181111561210c5761210c613b5e565b600181111561211d5761211d613b5e565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a09092019161216590613e4b565b80601f016020809104026020016040519081016040528092919081815260200182805461219190613e4b565b80156121de5780601f106121b3576101008083540402835291602001916121de565b820191906000526020600020905b8154815290600101906020018083116121c157829003601f168201915b505050918352505060068201546020820152600790910154604090910152919350909150505b9250929050565b600082815260fc6020526040902060010154612226816126b7565b611236838361274f565b612238613653565b61012e54821061228a5760405162461bcd60e51b815260206004820152601a60248201527f54686973207365727669636520646f65736e277420657869737400000000000060448201526064016108ca565b6000828152610131602052604090819020815161010081019092528054829060ff1660048111156122bd576122bd613b5e565b60048111156122ce576122ce613b5e565b815260200160018201548152602001600282015481526020016003820180546122f690613e4b565b80601f016020809104026020016040519081016040528092919081815260200182805461232290613e4b565b801561236f5780601f106123445761010080835404028352916020019161236f565b820191906000526020600020905b81548152906001019060200180831161235257829003601f168201915b5050509183525050600482015460208201526005820154604082015260068201546001600160a01b0316606082015260079091015460809091015292915050565b6123b8612435565b6001600160a01b03811661241d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ca565b6113a5816129a7565b6000612430612de0565b905090565b61243d612426565b6001600160a01b03166124586033546001600160a01b031690565b6001600160a01b0316146117515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ca565b61013054604051638a98636360e01b8152600481018890526000916001600160a01b031690638a98636390602401602060405180830381865afa1580156124f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251d9190614287565b90508034146125635760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108ca565b602e85146125835760405162461bcd60e51b81526004016108ca90613e26565b6001600160a01b0382166000908152610135602052604090205460ff166125e05760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108ca565b61013054604051631fff7f2760e11b8152600481018990526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f91906142a0565b90506001600160a01b038116156126ac57600089815261013360209081526040808320549051612686928d92918c918c91016142bd565b6040516020818303038152906040528051906020012090506126aa86868385612e19565b505b505050505050505050565b6113a5816126c3612426565b612f0d565b6126d28282611828565b6112c557600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561270b612426565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6127598282611828565b156112c557600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff19169055612790612426565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6113a5612435565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561280f5761123683612f66565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612869575060408051601f3d908101601f1916820190925261286691810190614287565b60015b6128cc5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016108ca565b600080516020614470833981519152811461293b5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016108ca565b50611236838383613002565b600054610100900460ff1661296e5760405162461bcd60e51b81526004016108ca906142fe565b61175161302d565b600054610100900460ff166117515760405162461bcd60e51b81526004016108ca906142fe565b6112c582826126c8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61013054604051634a7ab1d560e01b8152600481018890526000916001600160a01b031690634a7ab1d590602401602060405180830381865afa158015612a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a689190614287565b9050803414612aae5760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108ca565b60008981526101316020908152604080832060068101546001600160a01b03168452610135909252909120600101546007820154612aec908b614349565b1015612b2b5760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108ca565b6000815460ff166004811115612b4357612b43613b5e565b14612b855760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108ca565b8060010154600003612bcd5760405162461bcd60e51b815260206004820152601160248201527014d95c9d9a58d9481b9bdd08195e1a5cdd607a1b60448201526064016108ca565b60008a8152610132602090815260408083208e84529091529020600101548b9003612c335760405162461bcd60e51b81526020600482015260166024820152751c1c9bdc1bdcd85b08185b1c9958591e48195e1a5cdd60521b60448201526064016108ca565b8a816001015403612c905760405162461bcd60e51b815260206004820152602160248201527f63616e27742063726561746520666f7220796f7572206f776e207365727669636044820152606560f81b60648201526084016108ca565b602e8614612cb05760405162461bcd60e51b81526004016108ca90613e26565b61013054604051631fff7f2760e11b8152600481018a90526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f91906142a0565b90506001600160a01b03811615612d6f5760008c8c8a8a604051602001612d49949392919061435c565b604051602081830303815290604052805190602001209050612d6d87878385612e19565b505b8315612dd25761012f5460405162f577a560e81b8152600481018690526001600160a01b039091169063f577a5009060240160006040518083038186803b158015612db957600080fd5b505afa158015612dcd573d6000803e3d6000fd5b505050505b505050505050505050505050565b600060143610801590612e0257503360009081526065602052604090205460ff165b15612e14575060131936013560601c90565b503390565b6000612e72836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000612eb68287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061306492505050565b9050806001600160a01b0316836001600160a01b031614611dc95760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b60448201526064016108ca565b612f178282611828565b6112c557612f2481613088565b612f2f83602061309a565b604051602001612f4092919061439e565b60408051601f198184030181529082905262461bcd60e51b82526108ca91600401614413565b6001600160a01b0381163b612fd35760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016108ca565b60008051602061447083398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61300b8361323d565b6000825111806130185750805b1561123657613027838361327d565b50505050565b600054610100900460ff166130545760405162461bcd60e51b81526004016108ca906142fe565b61175161305f612426565b6129a7565b60008060006130738585613371565b91509150613080816133b3565b509392505050565b606061081d6001600160a01b03831660145b606060006130a983600261424e565b6130b4906002614349565b67ffffffffffffffff8111156130cc576130cc61395c565b6040519080825280601f01601f1916602001820160405280156130f6576020820181803683370190505b509050600360fc1b8160008151811061311157613111614426565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061314057613140614426565b60200101906001600160f81b031916908160001a905350600061316484600261424e565b61316f906001614349565b90505b60018111156131e7576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106131a3576131a3614426565b1a60f81b8282815181106131b9576131b9614426565b60200101906001600160f81b031916908160001a90535060049490941c936131e08161443c565b9050613172565b5083156132365760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108ca565b9392505050565b61324681612f66565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6132e55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016108ca565b600080846001600160a01b0316846040516133009190614453565b600060405180830381855af49150503d806000811461333b576040519150601f19603f3d011682016040523d82523d6000602084013e613340565b606091505b50915091506133688282604051806060016040528060278152602001614490602791396134fd565b95945050505050565b60008082516041036133a75760208301516040840151606085015160001a61339b87828585613516565b94509450505050612204565b50600090506002612204565b60008160048111156133c7576133c7613b5e565b036133cf5750565b60018160048111156133e3576133e3613b5e565b036134305760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108ca565b600281600481111561344457613444613b5e565b036134915760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108ca565b60038160048111156134a5576134a5613b5e565b036113a55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108ca565b6060831561350c575081613236565b61323683836135da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561354d57506000905060036135d1565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156135a1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166135ca576000600192509250506135d1565b9150600090505b94509492505050565b8151156135ea5781518083602001fd5b8060405162461bcd60e51b81526004016108ca9190614413565b60408051610100810190915280600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016060815260200160008152602001600081525090565b6040805161010081019091528060008152602001600081526020016000815260200160608152602001600081526020016000815260200160006001600160a01b03168152602001600081525090565b6000602082840312156136b457600080fd5b81356001600160e01b03198116811461323657600080fd5b600080604083850312156136df57600080fd5b50508035926020909101359150565b60008083601f84011261370057600080fd5b50813567ffffffffffffffff81111561371857600080fd5b60208301915083602082850101111561220457600080fd5b600080600080600080600060c0888a03121561374b57600080fd5b873596506020880135955060408801359450606088013567ffffffffffffffff81111561377757600080fd5b6137838a828b016136ee565b989b979a50959895979660808701359660a0013595509350505050565b6001600160a01b03811681146113a557600080fd5b60008060008060008060a087890312156137ce57600080fd5b863595506020870135945060408701356137e7816137a0565b935060608701359250608087013567ffffffffffffffff81111561380a57600080fd5b61381689828a016136ee565b979a9699509497509295939492505050565b60006020828403121561383a57600080fd5b5035919050565b60006020828403121561385357600080fd5b8135613236816137a0565b60008060008060008060008060c0898b03121561387a57600080fd5b8835975060208901359650604089013567ffffffffffffffff808211156138a057600080fd5b6138ac8c838d016136ee565b909850965060608b01359150808211156138c557600080fd5b506138d28b828c016136ee565b90955093505060808901356138e6816137a0565b8092505060a089013590509295985092959890939650565b6000806040838503121561391157600080fd5b823591506020830135613923816137a0565b809150509250929050565b6000806040838503121561394157600080fd5b823561394c816137a0565b91506020830135613923816137a0565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561398557600080fd5b8235613990816137a0565b9150602083013567ffffffffffffffff808211156139ad57600080fd5b818501915085601f8301126139c157600080fd5b8135818111156139d3576139d361395c565b604051601f8201601f19908116603f011681019083821181831017156139fb576139fb61395c565b81604052828152886020848701011115613a1457600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b80151581146113a557600080fd5b600080600060608486031215613a5957600080fd5b8335613a64816137a0565b92506020840135613a7481613a36565b929592945050506040919091013590565b6000806000806000806000806000806101008b8d031215613aa557600080fd5b8a35995060208b0135985060408b0135975060608b0135965060808b013567ffffffffffffffff80821115613ad957600080fd5b613ae58e838f016136ee565b909850965060a08d0135955060c08d0135915080821115613b0557600080fd5b50613b128d828e016136ee565b9150809450508092505060e08b013590509295989b9194979a5092959850565b600080600060608486031215613b4757600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052602160045260246000fd5b60028110613b8457613b84613b5e565b9052565b60005b83811015613ba3578181015183820152602001613b8b565b50506000910152565b60008151808452613bc4816020860160208601613b88565b601f01601f19169290920160200192915050565b6000610100613be8848451613b74565b6020830151602085015260018060a01b036040840151166040850152606083015160608501526080830151608085015260a08301518160a0860152613c2f82860182613bac565b91505060c083015160c085015260e083015160e08501528091505092915050565b6020815260006132366020830184613bd8565b60058110613b8457613b84613b5e565b6000610100613c82838c613c63565b896020840152886040840152806060840152613ca081840189613bac565b6080840197909752505060a08101939093526001600160a01b039190911660c083015260e090910152949350505050565b6000610100613ce0838c613b74565b89602084015260018060a01b03891660408401528760608401528660808401528060a0840152613d1281840187613bac565b60c0840195909552505060e001529695505050505050565b6000610100613d3a848451613c63565b60208301516020850152604083015160408501526060830151816060860152613d6582860182613bac565b6080858101519087015260a0808601519087015260c0808601516001600160a01b03169087015260e0948501519490950193909352509192915050565b604081526000613db56040830185613d2a565b82810360208401526133688185613bd8565b6020815260006132366020830184613d2a565b600060208284031215613dec57600080fd5b815161323681613a36565b6020808252601590820152744e6f74206f776e6572206f722064656c656761746560581b604082015260600190565b6020808252600b908201526a125b9d985b1a590818da5960aa1b604082015260600190565b600181811c90821680613e5f57607f821691505b602082108103613e7f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561123657600081815260208120601f850160051c81016020861015613eac5750805b601f850160051c820191505b81811015611dc957828155600101613eb8565b67ffffffffffffffff831115613ee357613ee361395c565b613ef783613ef18354613e4b565b83613e85565b6000601f841160018114613f2b5760008515613f135750838201355b600019600387901b1c1916600186901b178355613f85565b600083815260209020601f19861690835b82811015613f5c5786850135825560209485019460019092019101613f3c565b5086821015613f795760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b87815286602082015260c060408201526000613fd560c083018789613f8c565b606083019590955250608081019290925260a090910152949350505050565b85815260806020820152600061400e608083018688613f8c565b6001600160a01b0394909416604083015250606001529392505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016140535761405361402b565b5060010190565b87815286602082015285604082015260c06060820152600061408060c083018688613f8c565b6001600160a01b039490941660808301525060a0015295945050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b815167ffffffffffffffff8111156141515761415161395c565b6141658161415f8454613e4b565b84613e85565b602080601f83116001811461419a57600084156141825750858301515b600019600386901b1c1916600185901b178555611dc9565b600085815260208120601f198616915b828110156141c9578886015182559484019460019091019084016141aa565b50858210156141e75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006101008b83528a60208401528060408401526142188184018a8c613f8c565b9150506142286060830188613b74565b8560808301528460a08301528360c08301528260e08301529a9950505050505050505050565b808202811582820484141761081d5761081d61402b565b60008261428257634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561429957600080fd5b5051919050565b6000602082840312156142b257600080fd5b8151613236816137a0565b6c6372656174655365727669636560981b815284600d820152603b60f81b602d82015283602e8201528183604e83013760009101604e019081529392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8082018082111561081d5761081d61402b565b6d18dc99585d19541c9bdc1bdcd85b60921b815284600e820152603b60f81b602e82015283602f8201528183604f83013760009101604f019081529392505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516143d6816017850160208801613b88565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614407816028840160208801613b88565b01602801949350505050565b6020815260006132366020830184613bac565b634e487b7160e01b600052603260045260246000fd5b60008161444b5761444b61402b565b506000190190565b60008251614465818460208701613b88565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a1ba7d9ed8bda0e85592c39f8b8a90f379bcd674d0b9fd980896e2501b6dde2264736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106102305760003560e01c80636ce76f301161012e578063b5735c1e116100ab578063d547741f1161006f578063d547741f1461072e578063ef0e239b1461074e578063f2fde38b1461077b578063f6c53d9b1461079b578063f9eaee0d146107b257600080fd5b8063b5735c1e1461064a578063c22c4f431461066a578063c2cfee271461069e578063ccaa7d2a146106d2578063d4eee1fc1461070057600080fd5b806391d14854116100f257806391d14854146105b5578063a217fddf146105d5578063a24bd889146105ea578063a7d5eaea146105fd578063aba210091461061d57600080fd5b80636ce76f30146104dc578063715018a61461051057806371da85f9146105255780637c5a72cd146105775780638da5cb5b1461059757600080fd5b80632afaf220116101bc5780633ca2ad6f116101805780633ca2ad6f1461043b578063485cc9551461045b5780634f1ef2861461047b57806352d1902d1461048e578063572b6c05146104a357600080fd5b80632afaf220146103a85780632f2ff15d146103bb57806336568abe146103db5780633659cfe6146103fb5780633751d89c1461041b57600080fd5b8063156b39aa11610203578063156b39aa146102e557806319de9d6c1461030a5780631db087ff1461032a578063248a9ca31461035857806326d006681461038857600080fd5b806301ffc9a714610235578063089b7c731461026a5780631499f9e61461028c578063154664ed146102c5575b600080fd5b34801561024157600080fd5b506102556102503660046136a2565b6107ec565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a6102853660046136cc565b610823565b005b34801561029857600080fd5b50610130546102ad906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b3480156102d157600080fd5b5061028a6102e0366004613730565b6109c6565b3480156102f157600080fd5b506102fc6101365481565b604051908152602001610261565b34801561031657600080fd5b5061028a6103253660046137b5565b610cde565b34801561033657600080fd5b506102fc610345366004613828565b6101336020526000908152604090205481565b34801561036457600080fd5b506102fc610373366004613828565b600090815260fc602052604090206001015490565b34801561039457600080fd5b5061028a6103a3366004613841565b610f83565b6102fc6103b636600461385e565b610fe6565b3480156103c757600080fd5b5061028a6103d63660046138fe565b611211565b3480156103e757600080fd5b5061028a6103f63660046138fe565b61123b565b34801561040757600080fd5b5061028a610416366004613841565b6112c9565b34801561042757600080fd5b5061028a610436366004613841565b6113a8565b34801561044757600080fd5b5061028a610456366004613828565b611401565b34801561046757600080fd5b5061028a61047636600461392e565b611449565b61028a610489366004613972565b6115c0565b34801561049a57600080fd5b506102fc61168c565b3480156104af57600080fd5b506102556104be366004613841565b6001600160a01b031660009081526065602052604090205460ff1690565b3480156104e857600080fd5b506102fc7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f81565b34801561051c57600080fd5b5061028a61173f565b34801561053157600080fd5b50610560610540366004613841565b610135602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610261565b34801561058357600080fd5b5061028a610592366004613a44565b611753565b3480156105a357600080fd5b506033546001600160a01b03166102ad565b3480156105c157600080fd5b506102556105d03660046138fe565b611828565b3480156105e157600080fd5b506102fc600081565b61028a6105f8366004613a85565b611853565b34801561060957600080fd5b5061028a610618366004613b32565b611b6d565b34801561062957600080fd5b5061063d6106383660046136cc565b611bef565b6040516102619190613c50565b34801561065657600080fd5b5061028a6106653660046136cc565b611d2c565b34801561067657600080fd5b5061068a610685366004613828565b611dd1565b604051610261989796959493929190613c73565b3480156106aa57600080fd5b506106be6106b93660046136cc565b611eae565b604051610261989796959493929190613cd1565b3480156106de57600080fd5b506102fc6106ed366004613828565b6101346020526000908152604090205481565b34801561070c57600080fd5b5061072061071b3660046136cc565b611f95565b604051610261929190613da2565b34801561073a57600080fd5b5061028a6107493660046138fe565b61220b565b34801561075a57600080fd5b5061076e610769366004613828565b612230565b6040516102619190613dc7565b34801561078757600080fd5b5061028a610796366004613841565b6123b0565b3480156107a757600080fd5b506102fc61012e5481565b3480156107be57600080fd5b506102556107cd366004613841565b6001600160a01b03166000908152610135602052604090205460ff1690565b60006001600160e01b03198216637965db0b60e01b148061081d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61012f5482906001600160a01b0316632fa117e582610840612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa15801561088a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ae9190613dda565b6108d35760405162461bcd60e51b81526004016108ca90613df7565b60405180910390fd5b600082815261013160205260409020600181015484146109255760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b60448201526064016108ca565b6000815460ff16600481111561093d5761093d613b5e565b146109825760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108ca565b805460ff191660031781556040518381527f853aa4be1ac86f37acfc91d42b57f1fe895205aa6f8f9b7caa77ca257049ab1a9060200160405180910390a150505050565b61012f5487906001600160a01b0316632fa117e5826109e3612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a519190613dda565b610a6d5760405162461bcd60e51b81526004016108ca90613df7565b60008781526101316020908152604080832061013283528184208c855290925282209091825460ff166004811115610aa757610aa7613b5e565b14610ae95760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108ca565b89816001015414610b2c5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108ca565b602e8614610b4c5760405162461bcd60e51b81526004016108ca90613e26565b6001815460ff166001811115610b6457610b64613b5e565b03610ba55760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481d985b1a59185d1959607a1b60448201526064016108ca565b60068201546001600160a01b031660009081526101356020526040902060010154881015610c065760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108ca565b8315610c695761012f5460405162f577a560e81b8152600481018690526001600160a01b039091169063f577a5009060240160006040518083038186803b158015610c5057600080fd5b505afa158015610c64573d6000803e3d6000fd5b505050505b6003810188905560058101610c7f878983613ecb565b5060068101859055600781018490556040517ffbfaa6f4e508bec40137ac265a7424e16a2d209355b2f4a35de5a80ba8fec1db90610cca908b908d908b908b908e908c908c90613fb5565b60405180910390a150505050505050505050565b61012f5486906001600160a01b0316632fa117e582610cfb612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610d45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d699190613dda565b610d855760405162461bcd60e51b81526004016108ca90613df7565b60008681526101316020526040902060018101548814610dd75760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108ca565b6000815460ff166004811115610def57610def613b5e565b14610e345760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108ca565b602e8314610e545760405162461bcd60e51b81526004016108ca90613e26565b6001600160a01b0386166000908152610135602052604090205460ff16610eb15760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108ca565b8060070154851015610f055760405162461bcd60e51b815260206004820152601c60248201527f43616e27742072656475636520726566657272616c20616d6f756e740000000060448201526064016108ca565b60038101610f14848683613ecb565b50600781018590556006810180546001600160a01b0319166001600160a01b0388161790556040517f79dba2b7507f91f38c9a67e52f174c234541b20eccc91ad6afe9d3753f6371f590610f71908990879087908b908b90613ff4565b60405180910390a15050505050505050565b610f8b612435565b6001600160a01b038116600081815260656020908152604091829020805460ff1916600117905590519182527f3ef8564460ada92419608d823c014975d98f8104d7d1e68c222967ac6814cd9791015b60405180910390a150565b61012f5460009089906001600160a01b0316632fa117e582611006612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611050573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110749190613dda565b6110905760405162461bcd60e51b81526004016108ca90613df7565b61109f8a8a8a8a8a8a8a6124ae565b61012e805490819060006110b283614041565b9091555050600081815261013160205260409020805460ff19168155600181018c9055600381016110e48a8c83613ecb565b50600581018b90556006810180546001600160a01b0319166001600160a01b0388161790556007810185905560008c8152610133602052604090205415801561113a575060008c81526101346020526040902054155b1561119f5761012f546040516383ce205b60e01b8152600481018e90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b15801561118657600080fd5b505af115801561119a573d6000803e3d6000fd5b505050505b60008c8152610133602052604081208054916111ba83614041565b91905055507fe7f6435fc92b0ccd6f56395ae67b06f2cdb9680c0179f87f5821431304ad3f3e828d8d8d8d8b8b6040516111fa979695949392919061405a565b60405180910390a1509a9950505050505050505050565b600082815260fc602052604090206001015461122c816126b7565b61123683836126c8565b505050565b611243612426565b6001600160a01b0316816001600160a01b0316146112bb5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108ca565b6112c5828261274f565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036113115760405162461bcd60e51b81526004016108ca9061409f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661135a600080516020614470833981519152546001600160a01b031690565b6001600160a01b0316146113805760405162461bcd60e51b81526004016108ca906140eb565b611389816127d4565b604080516000808252602082019092526113a5918391906127dc565b50565b6113b0612435565b6001600160a01b038116600081815260656020908152604091829020805460ff1916905590519182527fd2d636efcad0cea42e170256f4c5d8b1cd81e47b855557edaf44014e6cc4cee69101610fdb565b600061140c816126b7565b6101368290556040518281527f577d7afcf67637a2f602cba220bbb292c1d715380dd011bfec748c3f641b2fd29060200160405180910390a15050565b600054610100900460ff16158080156114695750600054600160ff909116105b806114835750303b158015611483575060005460ff166001145b6114e65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108ca565b6000805460ff191660011790558015611509576000805461ff0019166101001790555b611511612947565b611519612976565b611521612976565b611533600061152e612426565b61299d565b61012f80546001600160a01b038086166001600160a01b031992831617909255610130805492851692909116919091179055600161012e55611575601e611401565b8015611236576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a1505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036116085760405162461bcd60e51b81526004016108ca9061409f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611651600080516020614470833981519152546001600160a01b031690565b6001600160a01b0316146116775760405162461bcd60e51b81526004016108ca906140eb565b611680826127d4565b6112c5828260016127dc565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461172c5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108ca565b5060008051602061447083398151915290565b611747612435565b61175160006129a7565b565b61175b612435565b6001600160a01b038316158015611770575081155b156117bd5760405162461bcd60e51b815260206004820152601d60248201527f4f776e65722063616e27742072656d6f7665204f78206164647265737300000060448201526064016108ca565b6001600160a01b03831660008181526101356020908152604091829020805460ff19168615159081178255600190910185905582519384529083015281018290527f42b585a1da1cff4b571e7a78aea1b4601b1d128de41a0feebd8a77aaf48b9d88906060016115b3565b600091825260fc602090815260408084206001600160a01b0393909316845291905290205460ff1690565b61012f548a906001600160a01b0316632fa117e582611870612426565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa1580156118ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118de9190613dda565b6118fa5760405162461bcd60e51b81526004016108ca90613df7565b60008a81526101316020526040902061191a8c8c8c8c8c8c8b8b8b6129f9565b60408051610100810182526000815260208082018f905260068401546001600160a01b031682840152606082018d9052608082018c90528251601f8b01829004820281018201909352898352909160a08301918b908b9081908401838280828437600081840152601f19601f8201169050808301925050505050505081526020018781526020018481525061013260008d815260200190815260200160002060008e815260200190815260200160002060008201518160000160006101000a81548160ff021916908360018111156119f4576119f4613b5e565b02179055506020820151600182015560408201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a08201516005820190611a519082614137565b5060c0820151600682015560e09091015160079091015560008c81526101336020526040902054158015611a92575060008c81526101346020526040902054155b15611af75761012f546040516383ce205b60e01b8152600481018e90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015611ade57600080fd5b505af1158015611af2573d6000803e3d6000fd5b505050505b60008c815261013460205260408120805491611b1283614041565b91905055507fabd26455c3256ad90125661f4c1a4c16fecf585ccade21e749c56d8fd44bb1dd8b8d8a8a60008f8f8d8b604051611b57999897969594939291906141f7565b60405180910390a1505050505050505050505050565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f611b97816126b7565b60008481526101316020908152604080832061013283528184208785529092529091208154600160ff1991821681178455808301546002850155600484018690558254909183911682805b0217905550505050505050565b611bf7613604565b60008381526101326020908152604080832085845290915290819020815161010081019092528054829060ff166001811115611c3557611c35613b5e565b6001811115611c4657611c46613b5e565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a090920191611c8e90613e4b565b80601f0160208091040260200160405190810160405280929190818152602001828054611cba90613e4b565b8015611d075780601f10611cdc57610100808354040283529160200191611d07565b820191906000526020600020905b815481529060010190602001808311611cea57829003601f168201915b5050505050815260200160068201548152602001600782015481525050905092915050565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f611d56816126b7565b6000838152610131602090815260408083206101328352818420600282015485529092528220600381015491929091611d9086606461424e565b611d9a9190614265565b9050610136548110611db657825460ff19166002178355611dc9565b8254600490849060ff1916600183611be2565b505050505050565b61013160205260009081526040902080546001820154600283015460038401805460ff909416949293919291611e0690613e4b565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3290613e4b565b8015611e7f5780601f10611e5457610100808354040283529160200191611e7f565b820191906000526020600020905b815481529060010190602001808311611e6257829003601f168201915b505050600484015460058501546006860154600790960154949591949093506001600160a01b03909116915088565b61013260209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601805460ff9096169694956001600160a01b03909416949293919291611f0690613e4b565b80601f0160208091040260200160405190810160405280929190818152602001828054611f3290613e4b565b8015611f7f5780601f10611f5457610100808354040283529160200191611f7f565b820191906000526020600020905b815481529060010190602001808311611f6257829003601f168201915b5050505050908060060154908060070154905088565b611f9d613653565b611fa5613604565b60008481526101316020526040808220815161010081019092528054829060ff166004811115611fd757611fd7613b5e565b6004811115611fe857611fe8613b5e565b8152602001600182015481526020016002820154815260200160038201805461201090613e4b565b80601f016020809104026020016040519081016040528092919081815260200182805461203c90613e4b565b80156120895780601f1061205e57610100808354040283529160200191612089565b820191906000526020600020905b81548152906001019060200180831161206c57829003601f168201915b50505091835250506004820154602080830191909152600583015460408084019190915260068401546001600160a01b03166060840152600790930154608090920191909152600088815261013282528281208882529091528181208251610100810190935280549394509092829060ff16600181111561210c5761210c613b5e565b600181111561211d5761211d613b5e565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a09092019161216590613e4b565b80601f016020809104026020016040519081016040528092919081815260200182805461219190613e4b565b80156121de5780601f106121b3576101008083540402835291602001916121de565b820191906000526020600020905b8154815290600101906020018083116121c157829003601f168201915b505050918352505060068201546020820152600790910154604090910152919350909150505b9250929050565b600082815260fc6020526040902060010154612226816126b7565b611236838361274f565b612238613653565b61012e54821061228a5760405162461bcd60e51b815260206004820152601a60248201527f54686973207365727669636520646f65736e277420657869737400000000000060448201526064016108ca565b6000828152610131602052604090819020815161010081019092528054829060ff1660048111156122bd576122bd613b5e565b60048111156122ce576122ce613b5e565b815260200160018201548152602001600282015481526020016003820180546122f690613e4b565b80601f016020809104026020016040519081016040528092919081815260200182805461232290613e4b565b801561236f5780601f106123445761010080835404028352916020019161236f565b820191906000526020600020905b81548152906001019060200180831161235257829003601f168201915b5050509183525050600482015460208201526005820154604082015260068201546001600160a01b0316606082015260079091015460809091015292915050565b6123b8612435565b6001600160a01b03811661241d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ca565b6113a5816129a7565b6000612430612de0565b905090565b61243d612426565b6001600160a01b03166124586033546001600160a01b031690565b6001600160a01b0316146117515760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ca565b61013054604051638a98636360e01b8152600481018890526000916001600160a01b031690638a98636390602401602060405180830381865afa1580156124f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251d9190614287565b90508034146125635760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108ca565b602e85146125835760405162461bcd60e51b81526004016108ca90613e26565b6001600160a01b0382166000908152610135602052604090205460ff166125e05760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108ca565b61013054604051631fff7f2760e11b8152600481018990526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa15801561262b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264f91906142a0565b90506001600160a01b038116156126ac57600089815261013360209081526040808320549051612686928d92918c918c91016142bd565b6040516020818303038152906040528051906020012090506126aa86868385612e19565b505b505050505050505050565b6113a5816126c3612426565b612f0d565b6126d28282611828565b6112c557600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561270b612426565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6127598282611828565b156112c557600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff19169055612790612426565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6113a5612435565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561280f5761123683612f66565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612869575060408051601f3d908101601f1916820190925261286691810190614287565b60015b6128cc5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016108ca565b600080516020614470833981519152811461293b5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016108ca565b50611236838383613002565b600054610100900460ff1661296e5760405162461bcd60e51b81526004016108ca906142fe565b61175161302d565b600054610100900460ff166117515760405162461bcd60e51b81526004016108ca906142fe565b6112c582826126c8565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61013054604051634a7ab1d560e01b8152600481018890526000916001600160a01b031690634a7ab1d590602401602060405180830381865afa158015612a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a689190614287565b9050803414612aae5760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108ca565b60008981526101316020908152604080832060068101546001600160a01b03168452610135909252909120600101546007820154612aec908b614349565b1015612b2b5760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108ca565b6000815460ff166004811115612b4357612b43613b5e565b14612b855760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108ca565b8060010154600003612bcd5760405162461bcd60e51b815260206004820152601160248201527014d95c9d9a58d9481b9bdd08195e1a5cdd607a1b60448201526064016108ca565b60008a8152610132602090815260408083208e84529091529020600101548b9003612c335760405162461bcd60e51b81526020600482015260166024820152751c1c9bdc1bdcd85b08185b1c9958591e48195e1a5cdd60521b60448201526064016108ca565b8a816001015403612c905760405162461bcd60e51b815260206004820152602160248201527f63616e27742063726561746520666f7220796f7572206f776e207365727669636044820152606560f81b60648201526084016108ca565b602e8614612cb05760405162461bcd60e51b81526004016108ca90613e26565b61013054604051631fff7f2760e11b8152600481018a90526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612cfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1f91906142a0565b90506001600160a01b03811615612d6f5760008c8c8a8a604051602001612d49949392919061435c565b604051602081830303815290604052805190602001209050612d6d87878385612e19565b505b8315612dd25761012f5460405162f577a560e81b8152600481018690526001600160a01b039091169063f577a5009060240160006040518083038186803b158015612db957600080fd5b505afa158015612dcd573d6000803e3d6000fd5b505050505b505050505050505050505050565b600060143610801590612e0257503360009081526065602052604090205460ff165b15612e14575060131936013560601c90565b503390565b6000612e72836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000612eb68287878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061306492505050565b9050806001600160a01b0316836001600160a01b031614611dc95760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b60448201526064016108ca565b612f178282611828565b6112c557612f2481613088565b612f2f83602061309a565b604051602001612f4092919061439e565b60408051601f198184030181529082905262461bcd60e51b82526108ca91600401614413565b6001600160a01b0381163b612fd35760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016108ca565b60008051602061447083398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61300b8361323d565b6000825111806130185750805b1561123657613027838361327d565b50505050565b600054610100900460ff166130545760405162461bcd60e51b81526004016108ca906142fe565b61175161305f612426565b6129a7565b60008060006130738585613371565b91509150613080816133b3565b509392505050565b606061081d6001600160a01b03831660145b606060006130a983600261424e565b6130b4906002614349565b67ffffffffffffffff8111156130cc576130cc61395c565b6040519080825280601f01601f1916602001820160405280156130f6576020820181803683370190505b509050600360fc1b8160008151811061311157613111614426565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061314057613140614426565b60200101906001600160f81b031916908160001a905350600061316484600261424e565b61316f906001614349565b90505b60018111156131e7576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106131a3576131a3614426565b1a60f81b8282815181106131b9576131b9614426565b60200101906001600160f81b031916908160001a90535060049490941c936131e08161443c565b9050613172565b5083156132365760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108ca565b9392505050565b61324681612f66565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6132e55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016108ca565b600080846001600160a01b0316846040516133009190614453565b600060405180830381855af49150503d806000811461333b576040519150601f19603f3d011682016040523d82523d6000602084013e613340565b606091505b50915091506133688282604051806060016040528060278152602001614490602791396134fd565b95945050505050565b60008082516041036133a75760208301516040840151606085015160001a61339b87828585613516565b94509450505050612204565b50600090506002612204565b60008160048111156133c7576133c7613b5e565b036133cf5750565b60018160048111156133e3576133e3613b5e565b036134305760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108ca565b600281600481111561344457613444613b5e565b036134915760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108ca565b60038160048111156134a5576134a5613b5e565b036113a55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108ca565b6060831561350c575081613236565b61323683836135da565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561354d57506000905060036135d1565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156135a1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166135ca576000600192509250506135d1565b9150600090505b94509492505050565b8151156135ea5781518083602001fd5b8060405162461bcd60e51b81526004016108ca9190614413565b60408051610100810190915280600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016060815260200160008152602001600081525090565b6040805161010081019091528060008152602001600081526020016000815260200160608152602001600081526020016000815260200160006001600160a01b03168152602001600081525090565b6000602082840312156136b457600080fd5b81356001600160e01b03198116811461323657600080fd5b600080604083850312156136df57600080fd5b50508035926020909101359150565b60008083601f84011261370057600080fd5b50813567ffffffffffffffff81111561371857600080fd5b60208301915083602082850101111561220457600080fd5b600080600080600080600060c0888a03121561374b57600080fd5b873596506020880135955060408801359450606088013567ffffffffffffffff81111561377757600080fd5b6137838a828b016136ee565b989b979a50959895979660808701359660a0013595509350505050565b6001600160a01b03811681146113a557600080fd5b60008060008060008060a087890312156137ce57600080fd5b863595506020870135945060408701356137e7816137a0565b935060608701359250608087013567ffffffffffffffff81111561380a57600080fd5b61381689828a016136ee565b979a9699509497509295939492505050565b60006020828403121561383a57600080fd5b5035919050565b60006020828403121561385357600080fd5b8135613236816137a0565b60008060008060008060008060c0898b03121561387a57600080fd5b8835975060208901359650604089013567ffffffffffffffff808211156138a057600080fd5b6138ac8c838d016136ee565b909850965060608b01359150808211156138c557600080fd5b506138d28b828c016136ee565b90955093505060808901356138e6816137a0565b8092505060a089013590509295985092959890939650565b6000806040838503121561391157600080fd5b823591506020830135613923816137a0565b809150509250929050565b6000806040838503121561394157600080fd5b823561394c816137a0565b91506020830135613923816137a0565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561398557600080fd5b8235613990816137a0565b9150602083013567ffffffffffffffff808211156139ad57600080fd5b818501915085601f8301126139c157600080fd5b8135818111156139d3576139d361395c565b604051601f8201601f19908116603f011681019083821181831017156139fb576139fb61395c565b81604052828152886020848701011115613a1457600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b80151581146113a557600080fd5b600080600060608486031215613a5957600080fd5b8335613a64816137a0565b92506020840135613a7481613a36565b929592945050506040919091013590565b6000806000806000806000806000806101008b8d031215613aa557600080fd5b8a35995060208b0135985060408b0135975060608b0135965060808b013567ffffffffffffffff80821115613ad957600080fd5b613ae58e838f016136ee565b909850965060a08d0135955060c08d0135915080821115613b0557600080fd5b50613b128d828e016136ee565b9150809450508092505060e08b013590509295989b9194979a5092959850565b600080600060608486031215613b4757600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052602160045260246000fd5b60028110613b8457613b84613b5e565b9052565b60005b83811015613ba3578181015183820152602001613b8b565b50506000910152565b60008151808452613bc4816020860160208601613b88565b601f01601f19169290920160200192915050565b6000610100613be8848451613b74565b6020830151602085015260018060a01b036040840151166040850152606083015160608501526080830151608085015260a08301518160a0860152613c2f82860182613bac565b91505060c083015160c085015260e083015160e08501528091505092915050565b6020815260006132366020830184613bd8565b60058110613b8457613b84613b5e565b6000610100613c82838c613c63565b896020840152886040840152806060840152613ca081840189613bac565b6080840197909752505060a08101939093526001600160a01b039190911660c083015260e090910152949350505050565b6000610100613ce0838c613b74565b89602084015260018060a01b03891660408401528760608401528660808401528060a0840152613d1281840187613bac565b60c0840195909552505060e001529695505050505050565b6000610100613d3a848451613c63565b60208301516020850152604083015160408501526060830151816060860152613d6582860182613bac565b6080858101519087015260a0808601519087015260c0808601516001600160a01b03169087015260e0948501519490950193909352509192915050565b604081526000613db56040830185613d2a565b82810360208401526133688185613bd8565b6020815260006132366020830184613d2a565b600060208284031215613dec57600080fd5b815161323681613a36565b6020808252601590820152744e6f74206f776e6572206f722064656c656761746560581b604082015260600190565b6020808252600b908201526a125b9d985b1a590818da5960aa1b604082015260600190565b600181811c90821680613e5f57607f821691505b602082108103613e7f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561123657600081815260208120601f850160051c81016020861015613eac5750805b601f850160051c820191505b81811015611dc957828155600101613eb8565b67ffffffffffffffff831115613ee357613ee361395c565b613ef783613ef18354613e4b565b83613e85565b6000601f841160018114613f2b5760008515613f135750838201355b600019600387901b1c1916600186901b178355613f85565b600083815260209020601f19861690835b82811015613f5c5786850135825560209485019460019092019101613f3c565b5086821015613f795760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b87815286602082015260c060408201526000613fd560c083018789613f8c565b606083019590955250608081019290925260a090910152949350505050565b85815260806020820152600061400e608083018688613f8c565b6001600160a01b0394909416604083015250606001529392505050565b634e487b7160e01b600052601160045260246000fd5b6000600182016140535761405361402b565b5060010190565b87815286602082015285604082015260c06060820152600061408060c083018688613f8c565b6001600160a01b039490941660808301525060a0015295945050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b815167ffffffffffffffff8111156141515761415161395c565b6141658161415f8454613e4b565b84613e85565b602080601f83116001811461419a57600084156141825750858301515b600019600386901b1c1916600185901b178555611dc9565b600085815260208120601f198616915b828110156141c9578886015182559484019460019091019084016141aa565b50858210156141e75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006101008b83528a60208401528060408401526142188184018a8c613f8c565b9150506142286060830188613b74565b8560808301528460a08301528360c08301528260e08301529a9950505050505050505050565b808202811582820484141761081d5761081d61402b565b60008261428257634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561429957600080fd5b5051919050565b6000602082840312156142b257600080fd5b8151613236816137a0565b6c6372656174655365727669636560981b815284600d820152603b60f81b602d82015283602e8201528183604e83013760009101604e019081529392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8082018082111561081d5761081d61402b565b6d18dc99585d19541c9bdc1bdcd85b60921b815284600e820152603b60f81b602e82015283602f8201528183604f83013760009101604f019081529392505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516143d6816017850160208801613b88565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614407816028840160208801613b88565b01602801949350505050565b6020815260006132366020830184613bac565b634e487b7160e01b600052603260045260246000fd5b60008161444b5761444b61402b565b506000190190565b60008251614465818460208701613b88565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220a1ba7d9ed8bda0e85592c39f8b8a90f379bcd674d0b9fd980896e2501b6dde2264736f6c63430008110033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/abis/archives/TalentLayerServiceV1.json b/abis/archives/TalentLayerServiceV1.json new file mode 100644 index 00000000..6f6829fe --- /dev/null +++ b/abis/archives/TalentLayerServiceV1.json @@ -0,0 +1,1341 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TalentLayerServiceV1", + "sourceName": "contracts/archive/TalentLayerServiceV1.sol", + "abi": [ + { + "inputs": [], + "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": false, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "isWhitelisted", + "type": "bool" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minimumTransactionAmount", + "type": "uint256" + } + ], + "name": "AllowedTokenListUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "minCompletionPercentage", + "type": "uint256" + } + ], + "name": "MinCompletionPercentageUpdated", + "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": false, + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "indexed": false, + "internalType": "enum TalentLayerServiceV1.ProposalStatus", + "name": "status", + "type": "uint8" + }, + { + "indexed": false, + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rateAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "platformId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expirationDate", + "type": "uint256" + } + ], + "name": "ProposalCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "serviceId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "indexed": false, + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "rateAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expirationDate", + "type": "uint256" + } + ], + "name": "ProposalUpdated", + "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": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "ServiceCancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "platformId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "dataUri", + "type": "string" + } + ], + "name": "ServiceCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "string", + "name": "dataUri", + "type": "string" + } + ], + "name": "ServiceDetailedUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "TrustedForwarderAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "forwarder", + "type": "address" + } + ], + "name": "TrustedForwarderRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ESCROW_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_forwarder", + "type": "address" + } + ], + "name": "addTrustedForwarder", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_serviceId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_proposalId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_transactionId", + "type": "uint256" + } + ], + "name": "afterDeposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_serviceId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_releasedAmount", + "type": "uint256" + } + ], + "name": "afterFullPayment", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "allowedTokenList", + "outputs": [ + { + "internalType": "bool", + "name": "isWhitelisted", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "minimumTransactionAmount", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_profileId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_serviceId", + "type": "uint256" + } + ], + "name": "cancelService", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_profileId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_serviceId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_rateAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_platformId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_dataUri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_expirationDate", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "createProposal", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_profileId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_platformId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_dataUri", + "type": "string" + }, + { + "internalType": "bytes", + "name": "_signature", + "type": "bytes" + } + ], + "name": "createService", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_serviceId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_proposalId", + "type": "uint256" + } + ], + "name": "getProposal", + "outputs": [ + { + "components": [ + { + "internalType": "enum TalentLayerServiceV1.ProposalStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rateAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "platformId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expirationDate", + "type": "uint256" + } + ], + "internalType": "struct TalentLayerServiceV1.Proposal", + "name": "", + "type": "tuple" + } + ], + "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": "uint256", + "name": "_serviceId", + "type": "uint256" + } + ], + "name": "getService", + "outputs": [ + { + "components": [ + { + "internalType": "enum TalentLayerServiceV1.Status", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "acceptedProposalId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "platformId", + "type": "uint256" + } + ], + "internalType": "struct TalentLayerServiceV1.Service", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_serviceId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_proposalId", + "type": "uint256" + } + ], + "name": "getServiceAndProposal", + "outputs": [ + { + "components": [ + { + "internalType": "enum TalentLayerServiceV1.Status", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "acceptedProposalId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "platformId", + "type": "uint256" + } + ], + "internalType": "struct TalentLayerServiceV1.Service", + "name": "", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "enum TalentLayerServiceV1.ProposalStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rateAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "platformId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expirationDate", + "type": "uint256" + } + ], + "internalType": "struct TalentLayerServiceV1.Proposal", + "name": "", + "type": "tuple" + } + ], + "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": "address", + "name": "_talentLayerIdAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_talentLayerPlatformIdAddress", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + } + ], + "name": "isTokenAllowed", + "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": "minCompletionPercentage", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nextServiceId", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposalNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proposals", + "outputs": [ + { + "internalType": "enum TalentLayerServiceV1.ProposalStatus", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rateAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "platformId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expirationDate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxiableUUID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_forwarder", + "type": "address" + } + ], + "name": "removeTrustedForwarder", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "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": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "serviceNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "services", + "outputs": [ + { + "internalType": "enum TalentLayerServiceV1.Status", + "name": "status", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "ownerId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "acceptedProposalId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "dataUri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "transactionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "platformId", + "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": "talentLayerPlatformIdContract", + "outputs": [ + { + "internalType": "contract ITalentLayerPlatformID", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "bool", + "name": "_isWhitelisted", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "_minimumTransactionAmount", + "type": "uint256" + } + ], + "name": "updateAllowedTokenList", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_minCompletionPercentage", + "type": "uint256" + } + ], + "name": "updateMinCompletionPercentage", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_profileId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_serviceId", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_rateToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_rateAmount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_dataUri", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_expirationDate", + "type": "uint256" + } + ], + "name": "updateProposal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_profileId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_serviceId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_dataUri", + "type": "string" + } + ], + "name": "updateServiceData", + "outputs": [], + "stateMutability": "nonpayable", + "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" + } + ], + "bytecode": "0x60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6080516142306200012060003960008181610f7c01528181610fbc01528181611273015281816112b3015261134201526142306000f3fe6080604052600436106102305760003560e01c8063715018a61161012e578063c2cfee27116100ab578063d547741f1161006f578063d547741f1461072b578063ef0e239b1461074b578063f2fde38b14610778578063f6c53d9b14610798578063f9eaee0d146107af57600080fd5b8063c2cfee2714610669578063c75858d51461069c578063ccaa7d2a146106bc578063d338ec9a146106ea578063d4eee1fc146106fd57600080fd5b8063a217fddf116100f2578063a217fddf146105b5578063a7d5eaea146105ca578063aba21009146105ea578063b5735c1e14610617578063c22c4f431461063757600080fd5b8063715018a6146104f057806371da85f9146105055780637c5a72cd146105575780638da5cb5b1461057757806391d148541461059557600080fd5b80632f2ff15d116101bc578063485cc95511610180578063485cc9551461043b5780634f1ef2861461045b57806352d1902d1461046e578063572b6c05146104835780636ce76f30146104bc57600080fd5b80632f2ff15d1461039b57806336568abe146103bb5780633659cfe6146103db5780633751d89c146103fb5780633ca2ad6f1461041b57600080fd5b80631499f9e6116102035780631499f9e6146102bf578063156b39aa146102f85780631db087ff1461031d578063248a9ca31461034b57806326d006681461037b57600080fd5b806301ffc9a714610235578063089b7c731461026a5780630e0660251461028c57806313ca98db146102ac575b600080fd5b34801561024157600080fd5b50610255610250366004613478565b6107e9565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a6102853660046134a2565b610820565b005b34801561029857600080fd5b5061028a6102a7366004613506565b6109c3565b61028a6102ba36600461356e565b610b8b565b3480156102cb57600080fd5b50610130546102e0906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b34801561030457600080fd5b5061030f6101365481565b604051908152602001610261565b34801561032957600080fd5b5061030f610338366004613624565b6101336020526000908152604090205481565b34801561035757600080fd5b5061030f610366366004613624565b600090815260fc602052604090206001015490565b34801561038757600080fd5b5061028a61039636600461363d565b610e57565b3480156103a757600080fd5b5061028a6103b636600461365a565b610eba565b3480156103c757600080fd5b5061028a6103d636600461365a565b610ee4565b3480156103e757600080fd5b5061028a6103f636600461363d565b610f72565b34801561040757600080fd5b5061028a61041636600461363d565b611051565b34801561042757600080fd5b5061028a610436366004613624565b6110aa565b34801561044757600080fd5b5061028a61045636600461368a565b6110f2565b61028a6104693660046136ce565b611269565b34801561047a57600080fd5b5061030f611335565b34801561048f57600080fd5b5061025561049e36600461363d565b6001600160a01b031660009081526065602052604090205460ff1690565b3480156104c857600080fd5b5061030f7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f81565b3480156104fc57600080fd5b5061028a6113e8565b34801561051157600080fd5b5061054061052036600461363d565b610135602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610261565b34801561056357600080fd5b5061028a6105723660046137a0565b6113fc565b34801561058357600080fd5b506033546001600160a01b03166102e0565b3480156105a157600080fd5b506102556105b036600461365a565b6114d1565b3480156105c157600080fd5b5061030f600081565b3480156105d657600080fd5b5061028a6105e53660046137e1565b6114fc565b3480156105f657600080fd5b5061060a6106053660046134a2565b61157e565b60405161026191906138f1565b34801561062357600080fd5b5061028a6106323660046134a2565b6116b0565b34801561064357600080fd5b50610657610652366004613624565b611755565b60405161026196959493929190613914565b34801561067557600080fd5b506106896106843660046134a2565b611819565b6040516102619796959493929190613955565b3480156106a857600080fd5b5061028a6106b73660046139a9565b6118fa565b3480156106c857600080fd5b5061030f6106d7366004613624565b6101346020526000908152604090205481565b61030f6106f8366004613a25565b611c1e565b34801561070957600080fd5b5061071d6107183660046134a2565b611e1e565b604051610261929190613b02565b34801561073757600080fd5b5061028a61074636600461365a565b61209a565b34801561075757600080fd5b5061076b610766366004613624565b6120bf565b6040516102619190613b27565b34801561078457600080fd5b5061028a61079336600461363d565b612253565b3480156107a457600080fd5b5061030f61012e5481565b3480156107bb57600080fd5b506102556107ca36600461363d565b6001600160a01b03166000908152610135602052604090205460ff1690565b60006001600160e01b03198216637965db0b60e01b148061081a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61012f5482906001600160a01b0316632fa117e58261083d6122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190613b3a565b6108d05760405162461bcd60e51b81526004016108c790613b57565b60405180910390fd5b600082815261013160205260409020600181015484146109225760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b60448201526064016108c7565b6000815460ff16600481111561093a5761093a61380d565b1461097f5760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108c7565b805460ff191660031781556040518381527f853aa4be1ac86f37acfc91d42b57f1fe895205aa6f8f9b7caa77ca257049ab1a9060200160405180910390a150505050565b61012f5484906001600160a01b0316632fa117e5826109e06122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e9190613b3a565b610a6a5760405162461bcd60e51b81526004016108c790613b57565b60008481526101316020526040902060018101548614610abc5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108c7565b6000815460ff166004811115610ad457610ad461380d565b14610b195760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108c7565b602e8314610b395760405162461bcd60e51b81526004016108c790613b86565b60038101610b48848683613c2b565b50847f1cae99404f615a4039d85b1009cb70622aae6d64f671e8b1b191d9269847d43e8585604051610b7b929190613d15565b60405180910390a2505050505050565b61012f548a906001600160a01b0316632fa117e582610ba86122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610bf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c169190613b3a565b610c325760405162461bcd60e51b81526004016108c790613b57565b610c438b8b8b8b8b8b8b8a8a6122d8565b6040805160e0810190915280600081526020018c81526020018a6001600160a01b0316815260200189815260200188815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060209182018790528c8152610132825260408082208f83529092522081518154829060ff191660018381811115610ce857610ce861380d565b02179055506020820151600182015560408201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a08201516005820190610d459082613d31565b5060c0919091015160069091015560008b81526101336020526040902054158015610d7d575060008b81526101346020526040902054155b15610de25761012f546040516383ce205b60e01b8152600481018d90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050505b60008b815261013460205260408120805491610dfd83613e07565b91905055507f11a8bc6241aa94a07af6c545ce8ed2dca2aaede88d02fd2b7e2d7ed28ccf1d4a8a8c888860008e8e8e8c604051610e4299989796959493929190613e20565b60405180910390a15050505050505050505050565b610e5f6126a7565b6001600160a01b038116600081815260656020908152604091829020805460ff1916600117905590519182527f3ef8564460ada92419608d823c014975d98f8104d7d1e68c222967ac6814cd9791015b60405180910390a150565b600082815260fc6020526040902060010154610ed581612720565b610edf8383612731565b505050565b610eec6122c9565b6001600160a01b0316816001600160a01b031614610f645760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108c7565b610f6e82826127b8565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610fba5760405162461bcd60e51b81526004016108c790613e81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110036000805160206141b4833981519152546001600160a01b031690565b6001600160a01b0316146110295760405162461bcd60e51b81526004016108c790613ecd565b6110328161283d565b6040805160008082526020820190925261104e91839190612845565b50565b6110596126a7565b6001600160a01b038116600081815260656020908152604091829020805460ff1916905590519182527fd2d636efcad0cea42e170256f4c5d8b1cd81e47b855557edaf44014e6cc4cee69101610eaf565b60006110b581612720565b6101368290556040518281527f577d7afcf67637a2f602cba220bbb292c1d715380dd011bfec748c3f641b2fd29060200160405180910390a15050565b600054610100900460ff16158080156111125750600054600160ff909116105b8061112c5750303b15801561112c575060005460ff166001145b61118f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108c7565b6000805460ff1916600117905580156111b2576000805461ff0019166101001790555b6111ba6129b0565b6111c26129df565b6111ca6129df565b6111dc60006111d76122c9565b612a06565b61012f80546001600160a01b038086166001600160a01b031992831617909255610130805492851692909116919091179055600161012e5561121e601e6110aa565b8015610edf576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a1505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036112b15760405162461bcd60e51b81526004016108c790613e81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112fa6000805160206141b4833981519152546001600160a01b031690565b6001600160a01b0316146113205760405162461bcd60e51b81526004016108c790613ecd565b6113298261283d565b610f6e82826001612845565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113d55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108c7565b506000805160206141b483398151915290565b6113f06126a7565b6113fa6000612a10565b565b6114046126a7565b6001600160a01b038316158015611419575081155b156114665760405162461bcd60e51b815260206004820152601d60248201527f4f776e65722063616e27742072656d6f7665204f78206164647265737300000060448201526064016108c7565b6001600160a01b03831660008181526101356020908152604091829020805460ff19168615159081178255600190910185905582519384529083015281018290527f42b585a1da1cff4b571e7a78aea1b4601b1d128de41a0feebd8a77aaf48b9d889060600161125c565b600091825260fc602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f61152681612720565b60008481526101316020908152604080832061013283528184208785529092529091208154600160ff1991821681178455808301546002850155600484018690558254909183911682805b0217905550505050505050565b611586613431565b60008381526101326020908152604080832085845290915290819020815160e081019092528054829060ff1660018111156115c3576115c361380d565b60018111156115d4576115d461380d565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a09092019161161c90613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461164890613bab565b80156116955780601f1061166a57610100808354040283529160200191611695565b820191906000526020600020905b81548152906001019060200180831161167857829003601f168201915b50505050508152602001600682015481525050905092915050565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f6116da81612720565b6000838152610131602090815260408083206101328352818420600282015485529092528220600381015491929091611714866064613f19565b61171e9190613f30565b905061013654811061173a57825460ff1916600217835561174d565b8254600490849060ff1916600183611571565b505050505050565b61013160205260009081526040902080546001820154600283015460038401805460ff90941694929391929161178a90613bab565b80601f01602080910402602001604051908101604052809291908181526020018280546117b690613bab565b80156118035780601f106117d857610100808354040283529160200191611803565b820191906000526020600020905b8154815290600101906020018083116117e657829003601f168201915b5050505050908060040154908060050154905086565b61013260209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601805460ff9096169694956001600160a01b0390941694929391929161187190613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461189d90613bab565b80156118ea5780601f106118bf576101008083540402835291602001916118ea565b820191906000526020600020905b8154815290600101906020018083116118cd57829003601f168201915b5050505050908060060154905087565b61012f5487906001600160a01b0316632fa117e5826119176122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119859190613b3a565b6119a15760405162461bcd60e51b81526004016108c790613b57565b6001600160a01b0386166000908152610135602052604090205460ff166119fe5760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108c7565b60008781526101316020908152604080832061013283528184208c855290925282209091825460ff166004811115611a3857611a3861380d565b14611a7a5760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108c7565b89816001015414611abd5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108c7565b602e8514611add5760405162461bcd60e51b81526004016108c790613b86565b6001815460ff166001811115611af557611af561380d565b03611b365760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481d985b1a59185d1959607a1b60448201526064016108c7565b6001600160a01b03881660009081526101356020526040902060010154871015611b935760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108c7565b6002810180546001600160a01b0319166001600160a01b038a161790556003810187905560058101611bc6868883613c2b565b50600681018490556040517f0f68ab04ab4935c8598d30f2c12ec34265575059bb4cae481b4d632cc43db81e90611c0a908b908d908a908a908e908e908c90613f52565b60405180910390a150505050505050505050565b61012f5460009087906001600160a01b0316632fa117e582611c3e6122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac9190613b3a565b611cc85760405162461bcd60e51b81526004016108c790613b57565b611cd6888888888888612a62565b61012e80549081906000611ce983613e07565b9091555050600081815261013160205260409020805460ff19168155600181018a905560038101611d1b888a83613c2b565b506005810189905560008a81526101336020526040902054158015611d4d575060008a81526101346020526040902054155b15611db25761012f546040516383ce205b60e01b8152600481018c90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015611d9957600080fd5b505af1158015611dad573d6000803e3d6000fd5b505050505b60008a815261013360205260408120805491611dcd83613e07565b91905055507f8f3fc1086abc1020f602edd700a9ae5801b250c9d110af9e54022d7cc5df7bee828b8b8b8b604051611e09959493929190613f9a565b60405180910390a15098975050505050505050565b611e586040805160c08101909152806000815260200160008152602001600081526020016060815260200160008152602001600081525090565b611e60613431565b60008481526101316020526040808220815160c081019092528054829060ff166004811115611e9157611e9161380d565b6004811115611ea257611ea261380d565b81526020016001820154815260200160028201548152602001600382018054611eca90613bab565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef690613bab565b8015611f435780601f10611f1857610100808354040283529160200191611f43565b820191906000526020600020905b815481529060010190602001808311611f2657829003601f168201915b5050509183525050600482015460208083019190915260059092015460409182015260008881526101328352818120888252909252808220815160e0810190925280549394509192909190829060ff166001811115611fa457611fa461380d565b6001811115611fb557611fb561380d565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a090920191611ffd90613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461202990613bab565b80156120765780601f1061204b57610100808354040283529160200191612076565b820191906000526020600020905b81548152906001019060200180831161205957829003601f168201915b505050918352505060069190910154602090910152919350909150505b9250929050565b600082815260fc60205260409020600101546120b581612720565b610edf83836127b8565b6120f96040805160c08101909152806000815260200160008152602001600081526020016060815260200160008152602001600081525090565b61012e54821061214b5760405162461bcd60e51b815260206004820152601a60248201527f54686973207365727669636520646f65736e277420657869737400000000000060448201526064016108c7565b6000828152610131602052604090819020815160c081019092528054829060ff16600481111561217d5761217d61380d565b600481111561218e5761218e61380d565b815260200160018201548152602001600282015481526020016003820180546121b690613bab565b80601f01602080910402602001604051908101604052809291908181526020018280546121e290613bab565b801561222f5780601f106122045761010080835404028352916020019161222f565b820191906000526020600020905b81548152906001019060200180831161221257829003601f168201915b50505050508152602001600482015481526020016005820154815250509050919050565b61225b6126a7565b6001600160a01b0381166122c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c7565b61104e81612a10565b60006122d3612c0d565b905090565b6001600160a01b0387166000908152610135602052604090205460ff166123355760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108c7565b61013054604051634a7ab1d560e01b8152600481018790526000916001600160a01b031690634a7ab1d590602401602060405180830381865afa158015612380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a49190613fcb565b90508034146123ea5760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108c7565b6001600160a01b038816600090815261013560205260409020600101548710156124475760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108c7565b60008981526101316020526040812090815460ff16600481111561246d5761246d61380d565b146124af5760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108c7565b80600101546000036124f75760405162461bcd60e51b815260206004820152601160248201527014d95c9d9a58d9481b9bdd08195e1a5cdd607a1b60448201526064016108c7565b60008a8152610132602090815260408083208e84529091529020600101548b900361255d5760405162461bcd60e51b81526020600482015260166024820152751c1c9bdc1bdcd85b08185b1c9958591e48195e1a5cdd60521b60448201526064016108c7565b8a8160010154036125ba5760405162461bcd60e51b815260206004820152602160248201527f63616e27742063726561746520666f7220796f7572206f776e207365727669636044820152606560f81b60648201526084016108c7565b602e85146125da5760405162461bcd60e51b81526004016108c790613b86565b61013054604051631fff7f2760e11b8152600481018990526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126499190613fe4565b90506001600160a01b038116156126995760008c8c89896040516020016126739493929190614001565b60405160208183030381529060405280519060200120905061269786868385612c46565b505b505050505050505050505050565b6126af6122c9565b6001600160a01b03166126ca6033546001600160a01b031690565b6001600160a01b0316146113fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c7565b61104e8161272c6122c9565b612d3a565b61273b82826114d1565b610f6e57600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff191660011790556127746122c9565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6127c282826114d1565b15610f6e57600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff191690556127f96122c9565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b61104e6126a7565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561287857610edf83612d93565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613fcb565b60015b6129355760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016108c7565b6000805160206141b483398151915281146129a45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016108c7565b50610edf838383612e2f565b600054610100900460ff166129d75760405162461bcd60e51b81526004016108c790614043565b6113fa612e5a565b600054610100900460ff166113fa5760405162461bcd60e51b81526004016108c790614043565b610f6e8282612731565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61013054604051638a98636360e01b8152600481018790526000916001600160a01b031690638a98636390602401602060405180830381865afa158015612aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad19190613fcb565b9050803414612b175760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108c7565b602e8414612b375760405162461bcd60e51b81526004016108c790613b86565b61013054604051631fff7f2760e11b8152600481018890526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba69190613fe4565b90506001600160a01b03811615612c0357600088815261013360209081526040808320549051612bdd928c92918b918b910161408e565b604051602081830303815290604052805190602001209050612c0185858385612c46565b505b5050505050505050565b600060143610801590612c2f57503360009081526065602052604090205460ff165b15612c41575060131936013560601c90565b503390565b6000612c9f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000612ce38287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9192505050565b9050806001600160a01b0316836001600160a01b03161461174d5760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b60448201526064016108c7565b612d4482826114d1565b610f6e57612d5181612eb5565b612d5c836020612ec7565b604051602001612d6d9291906140cf565b60408051601f198184030181529082905262461bcd60e51b82526108c791600401614144565b6001600160a01b0381163b612e005760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016108c7565b6000805160206141b483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612e388361306a565b600082511180612e455750805b15610edf57612e5483836130aa565b50505050565b600054610100900460ff16612e815760405162461bcd60e51b81526004016108c790614043565b6113fa612e8c6122c9565b612a10565b6000806000612ea0858561319e565b91509150612ead816131e0565b509392505050565b606061081a6001600160a01b03831660145b60606000612ed6836002613f19565b612ee1906002614157565b67ffffffffffffffff811115612ef957612ef96136b8565b6040519080825280601f01601f191660200182016040528015612f23576020820181803683370190505b509050600360fc1b81600081518110612f3e57612f3e61416a565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612f6d57612f6d61416a565b60200101906001600160f81b031916908160001a9053506000612f91846002613f19565b612f9c906001614157565b90505b6001811115613014576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612fd057612fd061416a565b1a60f81b828281518110612fe657612fe661416a565b60200101906001600160f81b031916908160001a90535060049490941c9361300d81614180565b9050612f9f565b5083156130635760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108c7565b9392505050565b61307381612d93565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6131125760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016108c7565b600080846001600160a01b03168460405161312d9190614197565b600060405180830381855af49150503d8060008114613168576040519150601f19603f3d011682016040523d82523d6000602084013e61316d565b606091505b509150915061319582826040518060600160405280602781526020016141d46027913961332a565b95945050505050565b60008082516041036131d45760208301516040840151606085015160001a6131c887828585613343565b94509450505050612093565b50600090506002612093565b60008160048111156131f4576131f461380d565b036131fc5750565b60018160048111156132105761321061380d565b0361325d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108c7565b60028160048111156132715761327161380d565b036132be5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108c7565b60038160048111156132d2576132d261380d565b0361104e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108c7565b60608315613339575081613063565b6130638383613407565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561337a57506000905060036133fe565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156133ce573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133f7576000600192509250506133fe565b9150600090505b94509492505050565b8151156134175781518083602001fd5b8060405162461bcd60e51b81526004016108c79190614144565b6040805160e0810190915280600081526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160608152602001600081525090565b60006020828403121561348a57600080fd5b81356001600160e01b03198116811461306357600080fd5b600080604083850312156134b557600080fd5b50508035926020909101359150565b60008083601f8401126134d657600080fd5b50813567ffffffffffffffff8111156134ee57600080fd5b60208301915083602082850101111561209357600080fd5b6000806000806060858703121561351c57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561354157600080fd5b61354d878288016134c4565b95989497509550505050565b6001600160a01b038116811461104e57600080fd5b6000806000806000806000806000806101008b8d03121561358e57600080fd5b8a35995060208b0135985060408b01356135a781613559565b975060608b0135965060808b0135955060a08b013567ffffffffffffffff808211156135d257600080fd5b6135de8e838f016134c4565b909750955060c08d0135945060e08d01359150808211156135fe57600080fd5b5061360b8d828e016134c4565b915080935050809150509295989b9194979a5092959850565b60006020828403121561363657600080fd5b5035919050565b60006020828403121561364f57600080fd5b813561306381613559565b6000806040838503121561366d57600080fd5b82359150602083013561367f81613559565b809150509250929050565b6000806040838503121561369d57600080fd5b82356136a881613559565b9150602083013561367f81613559565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156136e157600080fd5b82356136ec81613559565b9150602083013567ffffffffffffffff8082111561370957600080fd5b818501915085601f83011261371d57600080fd5b81358181111561372f5761372f6136b8565b604051601f8201601f19908116603f01168101908382118183101715613757576137576136b8565b8160405282815288602084870101111561377057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b801515811461104e57600080fd5b6000806000606084860312156137b557600080fd5b83356137c081613559565b925060208401356137d081613792565b929592945050506040919091013590565b6000806000606084860312156137f657600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052602160045260246000fd5b600281106138335761383361380d565b9052565b60005b8381101561385257818101518382015260200161383a565b50506000910152565b60008151808452613873816020860160208601613837565b601f01601f19169290920160200192915050565b613892828251613823565b6020810151602083015260018060a01b0360408201511660408301526060810151606083015260808101516080830152600060a082015160e060a08501526138dd60e085018261385b565b60c093840151949093019390935250919050565b6020815260006130636020830184613887565b600581106138335761383361380d565b61391e8188613904565b85602082015284604082015260c06060820152600061394060c083018661385b565b60808301949094525060a00152949350505050565b61395f8189613823565b86602082015260018060a01b038616604082015284606082015283608082015260e060a0820152600061399560e083018561385b565b90508260c083015298975050505050505050565b600080600080600080600060c0888a0312156139c457600080fd5b873596506020880135955060408801356139dd81613559565b945060608801359350608088013567ffffffffffffffff811115613a0057600080fd5b613a0c8a828b016134c4565b989b979a5095989497959660a090950135949350505050565b60008060008060008060808789031215613a3e57600080fd5b8635955060208701359450604087013567ffffffffffffffff80821115613a6457600080fd5b613a708a838b016134c4565b90965094506060890135915080821115613a8957600080fd5b50613a9689828a016134c4565b979a9699509497509295939492505050565b613ab3828251613904565b60208101516020830152604081015160408301526000606082015160c06060850152613ae260c085018261385b565b90506080830151608085015260a083015160a08501528091505092915050565b604081526000613b156040830185613aa8565b82810360208401526131958185613887565b6020815260006130636020830184613aa8565b600060208284031215613b4c57600080fd5b815161306381613792565b6020808252601590820152744e6f74206f776e6572206f722064656c656761746560581b604082015260600190565b6020808252600b908201526a125b9d985b1a590818da5960aa1b604082015260600190565b600181811c90821680613bbf57607f821691505b602082108103613bdf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610edf57600081815260208120601f850160051c81016020861015613c0c5750805b601f850160051c820191505b8181101561174d57828155600101613c18565b67ffffffffffffffff831115613c4357613c436136b8565b613c5783613c518354613bab565b83613be5565b6000601f841160018114613c8b5760008515613c735750838201355b600019600387901b1c1916600186901b178355613ce5565b600083815260209020601f19861690835b82811015613cbc5786850135825560209485019460019092019101613c9c565b5086821015613cd95760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000613d29602083018486613cec565b949350505050565b815167ffffffffffffffff811115613d4b57613d4b6136b8565b613d5f81613d598454613bab565b84613be5565b602080601f831160018114613d945760008415613d7c5750858301515b600019600386901b1c1916600185901b17855561174d565b600085815260208120601f198616915b82811015613dc357888601518255948401946001909101908401613da4565b5085821015613de15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600060018201613e1957613e19613df1565b5060010190565b60006101008b83528a6020840152806040840152613e418184018a8c613cec565b915050613e516060830188613823565b6001600160a01b0395909516608082015260a081019390935260c083019190915260e09091015295945050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b808202811582820484141761081a5761081a613df1565b600082613f4d57634e487b7160e01b600052601260045260246000fd5b500490565b87815286602082015260c060408201526000613f7260c083018789613cec565b6001600160a01b0395909516606083015250608081019290925260a090910152949350505050565b858152846020820152836040820152608060608201526000613fc0608083018486613cec565b979650505050505050565b600060208284031215613fdd57600080fd5b5051919050565b600060208284031215613ff657600080fd5b815161306381613559565b6d18dc99585d19541c9bdc1bdcd85b60921b815284600e820152603b60f81b602e82015283602f8201528183604f83013760009101604f019081529392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6c6372656174655365727669636560981b815284600d820152603b60f81b602d82015283602e8201528183604e83013760009101604e019081529392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614107816017850160208801613837565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614138816028840160208801613837565b01602801949350505050565b602081526000613063602083018461385b565b8082018082111561081a5761081a613df1565b634e487b7160e01b600052603260045260246000fd5b60008161418f5761418f613df1565b506000190190565b600082516141a9818460208701613837565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220424cbcb9a1e7045f90dcccd8e90829b3648f23380938f070c1b4c9fca81966c564736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106102305760003560e01c8063715018a61161012e578063c2cfee27116100ab578063d547741f1161006f578063d547741f1461072b578063ef0e239b1461074b578063f2fde38b14610778578063f6c53d9b14610798578063f9eaee0d146107af57600080fd5b8063c2cfee2714610669578063c75858d51461069c578063ccaa7d2a146106bc578063d338ec9a146106ea578063d4eee1fc146106fd57600080fd5b8063a217fddf116100f2578063a217fddf146105b5578063a7d5eaea146105ca578063aba21009146105ea578063b5735c1e14610617578063c22c4f431461063757600080fd5b8063715018a6146104f057806371da85f9146105055780637c5a72cd146105575780638da5cb5b1461057757806391d148541461059557600080fd5b80632f2ff15d116101bc578063485cc95511610180578063485cc9551461043b5780634f1ef2861461045b57806352d1902d1461046e578063572b6c05146104835780636ce76f30146104bc57600080fd5b80632f2ff15d1461039b57806336568abe146103bb5780633659cfe6146103db5780633751d89c146103fb5780633ca2ad6f1461041b57600080fd5b80631499f9e6116102035780631499f9e6146102bf578063156b39aa146102f85780631db087ff1461031d578063248a9ca31461034b57806326d006681461037b57600080fd5b806301ffc9a714610235578063089b7c731461026a5780630e0660251461028c57806313ca98db146102ac575b600080fd5b34801561024157600080fd5b50610255610250366004613478565b6107e9565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a6102853660046134a2565b610820565b005b34801561029857600080fd5b5061028a6102a7366004613506565b6109c3565b61028a6102ba36600461356e565b610b8b565b3480156102cb57600080fd5b50610130546102e0906001600160a01b031681565b6040516001600160a01b039091168152602001610261565b34801561030457600080fd5b5061030f6101365481565b604051908152602001610261565b34801561032957600080fd5b5061030f610338366004613624565b6101336020526000908152604090205481565b34801561035757600080fd5b5061030f610366366004613624565b600090815260fc602052604090206001015490565b34801561038757600080fd5b5061028a61039636600461363d565b610e57565b3480156103a757600080fd5b5061028a6103b636600461365a565b610eba565b3480156103c757600080fd5b5061028a6103d636600461365a565b610ee4565b3480156103e757600080fd5b5061028a6103f636600461363d565b610f72565b34801561040757600080fd5b5061028a61041636600461363d565b611051565b34801561042757600080fd5b5061028a610436366004613624565b6110aa565b34801561044757600080fd5b5061028a61045636600461368a565b6110f2565b61028a6104693660046136ce565b611269565b34801561047a57600080fd5b5061030f611335565b34801561048f57600080fd5b5061025561049e36600461363d565b6001600160a01b031660009081526065602052604090205460ff1690565b3480156104c857600080fd5b5061030f7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f81565b3480156104fc57600080fd5b5061028a6113e8565b34801561051157600080fd5b5061054061052036600461363d565b610135602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610261565b34801561056357600080fd5b5061028a6105723660046137a0565b6113fc565b34801561058357600080fd5b506033546001600160a01b03166102e0565b3480156105a157600080fd5b506102556105b036600461365a565b6114d1565b3480156105c157600080fd5b5061030f600081565b3480156105d657600080fd5b5061028a6105e53660046137e1565b6114fc565b3480156105f657600080fd5b5061060a6106053660046134a2565b61157e565b60405161026191906138f1565b34801561062357600080fd5b5061028a6106323660046134a2565b6116b0565b34801561064357600080fd5b50610657610652366004613624565b611755565b60405161026196959493929190613914565b34801561067557600080fd5b506106896106843660046134a2565b611819565b6040516102619796959493929190613955565b3480156106a857600080fd5b5061028a6106b73660046139a9565b6118fa565b3480156106c857600080fd5b5061030f6106d7366004613624565b6101346020526000908152604090205481565b61030f6106f8366004613a25565b611c1e565b34801561070957600080fd5b5061071d6107183660046134a2565b611e1e565b604051610261929190613b02565b34801561073757600080fd5b5061028a61074636600461365a565b61209a565b34801561075757600080fd5b5061076b610766366004613624565b6120bf565b6040516102619190613b27565b34801561078457600080fd5b5061028a61079336600461363d565b612253565b3480156107a457600080fd5b5061030f61012e5481565b3480156107bb57600080fd5b506102556107ca36600461363d565b6001600160a01b03166000908152610135602052604090205460ff1690565b60006001600160e01b03198216637965db0b60e01b148061081a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61012f5482906001600160a01b0316632fa117e58261083d6122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ab9190613b3a565b6108d05760405162461bcd60e51b81526004016108c790613b57565b60405180910390fd5b600082815261013160205260409020600181015484146109225760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b60448201526064016108c7565b6000815460ff16600481111561093a5761093a61380d565b1461097f5760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108c7565b805460ff191660031781556040518381527f853aa4be1ac86f37acfc91d42b57f1fe895205aa6f8f9b7caa77ca257049ab1a9060200160405180910390a150505050565b61012f5484906001600160a01b0316632fa117e5826109e06122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4e9190613b3a565b610a6a5760405162461bcd60e51b81526004016108c790613b57565b60008481526101316020526040902060018101548614610abc5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108c7565b6000815460ff166004811115610ad457610ad461380d565b14610b195760405162461bcd60e51b81526020600482015260156024820152741cdd185d1d5cc81b5d5cdd081899481bdc195b9959605a1b60448201526064016108c7565b602e8314610b395760405162461bcd60e51b81526004016108c790613b86565b60038101610b48848683613c2b565b50847f1cae99404f615a4039d85b1009cb70622aae6d64f671e8b1b191d9269847d43e8585604051610b7b929190613d15565b60405180910390a2505050505050565b61012f548a906001600160a01b0316632fa117e582610ba86122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015610bf2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c169190613b3a565b610c325760405162461bcd60e51b81526004016108c790613b57565b610c438b8b8b8b8b8b8b8a8a6122d8565b6040805160e0810190915280600081526020018c81526020018a6001600160a01b0316815260200189815260200188815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525093855250505060209182018790528c8152610132825260408082208f83529092522081518154829060ff191660018381811115610ce857610ce861380d565b02179055506020820151600182015560408201516002820180546001600160a01b0319166001600160a01b03909216919091179055606082015160038201556080820151600482015560a08201516005820190610d459082613d31565b5060c0919091015160069091015560008b81526101336020526040902054158015610d7d575060008b81526101346020526040902054155b15610de25761012f546040516383ce205b60e01b8152600481018d90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b505050505b60008b815261013460205260408120805491610dfd83613e07565b91905055507f11a8bc6241aa94a07af6c545ce8ed2dca2aaede88d02fd2b7e2d7ed28ccf1d4a8a8c888860008e8e8e8c604051610e4299989796959493929190613e20565b60405180910390a15050505050505050505050565b610e5f6126a7565b6001600160a01b038116600081815260656020908152604091829020805460ff1916600117905590519182527f3ef8564460ada92419608d823c014975d98f8104d7d1e68c222967ac6814cd9791015b60405180910390a150565b600082815260fc6020526040902060010154610ed581612720565b610edf8383612731565b505050565b610eec6122c9565b6001600160a01b0316816001600160a01b031614610f645760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016108c7565b610f6e82826127b8565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610fba5760405162461bcd60e51b81526004016108c790613e81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110036000805160206141b4833981519152546001600160a01b031690565b6001600160a01b0316146110295760405162461bcd60e51b81526004016108c790613ecd565b6110328161283d565b6040805160008082526020820190925261104e91839190612845565b50565b6110596126a7565b6001600160a01b038116600081815260656020908152604091829020805460ff1916905590519182527fd2d636efcad0cea42e170256f4c5d8b1cd81e47b855557edaf44014e6cc4cee69101610eaf565b60006110b581612720565b6101368290556040518281527f577d7afcf67637a2f602cba220bbb292c1d715380dd011bfec748c3f641b2fd29060200160405180910390a15050565b600054610100900460ff16158080156111125750600054600160ff909116105b8061112c5750303b15801561112c575060005460ff166001145b61118f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016108c7565b6000805460ff1916600117905580156111b2576000805461ff0019166101001790555b6111ba6129b0565b6111c26129df565b6111ca6129df565b6111dc60006111d76122c9565b612a06565b61012f80546001600160a01b038086166001600160a01b031992831617909255610130805492851692909116919091179055600161012e5561121e601e6110aa565b8015610edf576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a1505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036112b15760405162461bcd60e51b81526004016108c790613e81565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166112fa6000805160206141b4833981519152546001600160a01b031690565b6001600160a01b0316146113205760405162461bcd60e51b81526004016108c790613ecd565b6113298261283d565b610f6e82826001612845565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113d55760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016108c7565b506000805160206141b483398151915290565b6113f06126a7565b6113fa6000612a10565b565b6114046126a7565b6001600160a01b038316158015611419575081155b156114665760405162461bcd60e51b815260206004820152601d60248201527f4f776e65722063616e27742072656d6f7665204f78206164647265737300000060448201526064016108c7565b6001600160a01b03831660008181526101356020908152604091829020805460ff19168615159081178255600190910185905582519384529083015281018290527f42b585a1da1cff4b571e7a78aea1b4601b1d128de41a0feebd8a77aaf48b9d889060600161125c565b600091825260fc602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f61152681612720565b60008481526101316020908152604080832061013283528184208785529092529091208154600160ff1991821681178455808301546002850155600484018690558254909183911682805b0217905550505050505050565b611586613431565b60008381526101326020908152604080832085845290915290819020815160e081019092528054829060ff1660018111156115c3576115c361380d565b60018111156115d4576115d461380d565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a09092019161161c90613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461164890613bab565b80156116955780601f1061166a57610100808354040283529160200191611695565b820191906000526020600020905b81548152906001019060200180831161167857829003601f168201915b50505050508152602001600682015481525050905092915050565b7f2fdac322ee704ce09f0773f7f3f92eb98d5e7c836ee9c056cccd5f61041e5e3f6116da81612720565b6000838152610131602090815260408083206101328352818420600282015485529092528220600381015491929091611714866064613f19565b61171e9190613f30565b905061013654811061173a57825460ff1916600217835561174d565b8254600490849060ff1916600183611571565b505050505050565b61013160205260009081526040902080546001820154600283015460038401805460ff90941694929391929161178a90613bab565b80601f01602080910402602001604051908101604052809291908181526020018280546117b690613bab565b80156118035780601f106117d857610100808354040283529160200191611803565b820191906000526020600020905b8154815290600101906020018083116117e657829003601f168201915b5050505050908060040154908060050154905086565b61013260209081526000928352604080842090915290825290208054600182015460028301546003840154600485015460058601805460ff9096169694956001600160a01b0390941694929391929161187190613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461189d90613bab565b80156118ea5780601f106118bf576101008083540402835291602001916118ea565b820191906000526020600020905b8154815290600101906020018083116118cd57829003601f168201915b5050505050908060060154905087565b61012f5487906001600160a01b0316632fa117e5826119176122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119859190613b3a565b6119a15760405162461bcd60e51b81526004016108c790613b57565b6001600160a01b0386166000908152610135602052604090205460ff166119fe5760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108c7565b60008781526101316020908152604080832061013283528184208c855290925282209091825460ff166004811115611a3857611a3861380d565b14611a7a5760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108c7565b89816001015414611abd5760405162461bcd60e51b815260206004820152600d60248201526c2737ba103a34329037bbb732b960991b60448201526064016108c7565b602e8514611add5760405162461bcd60e51b81526004016108c790613b86565b6001815460ff166001811115611af557611af561380d565b03611b365760405162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481d985b1a59185d1959607a1b60448201526064016108c7565b6001600160a01b03881660009081526101356020526040902060010154871015611b935760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108c7565b6002810180546001600160a01b0319166001600160a01b038a161790556003810187905560058101611bc6868883613c2b565b50600681018490556040517f0f68ab04ab4935c8598d30f2c12ec34265575059bb4cae481b4d632cc43db81e90611c0a908b908d908a908a908e908e908c90613f52565b60405180910390a150505050505050505050565b61012f5460009087906001600160a01b0316632fa117e582611c3e6122c9565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152604401602060405180830381865afa158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac9190613b3a565b611cc85760405162461bcd60e51b81526004016108c790613b57565b611cd6888888888888612a62565b61012e80549081906000611ce983613e07565b9091555050600081815261013160205260409020805460ff19168155600181018a905560038101611d1b888a83613c2b565b506005810189905560008a81526101336020526040902054158015611d4d575060008a81526101346020526040902054155b15611db25761012f546040516383ce205b60e01b8152600481018c90526001600160a01b03909116906383ce205b90602401600060405180830381600087803b158015611d9957600080fd5b505af1158015611dad573d6000803e3d6000fd5b505050505b60008a815261013360205260408120805491611dcd83613e07565b91905055507f8f3fc1086abc1020f602edd700a9ae5801b250c9d110af9e54022d7cc5df7bee828b8b8b8b604051611e09959493929190613f9a565b60405180910390a15098975050505050505050565b611e586040805160c08101909152806000815260200160008152602001600081526020016060815260200160008152602001600081525090565b611e60613431565b60008481526101316020526040808220815160c081019092528054829060ff166004811115611e9157611e9161380d565b6004811115611ea257611ea261380d565b81526020016001820154815260200160028201548152602001600382018054611eca90613bab565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef690613bab565b8015611f435780601f10611f1857610100808354040283529160200191611f43565b820191906000526020600020905b815481529060010190602001808311611f2657829003601f168201915b5050509183525050600482015460208083019190915260059092015460409182015260008881526101328352818120888252909252808220815160e0810190925280549394509192909190829060ff166001811115611fa457611fa461380d565b6001811115611fb557611fb561380d565b81526001820154602082015260028201546001600160a01b03166040820152600382015460608201526004820154608082015260058201805460a090920191611ffd90613bab565b80601f016020809104026020016040519081016040528092919081815260200182805461202990613bab565b80156120765780601f1061204b57610100808354040283529160200191612076565b820191906000526020600020905b81548152906001019060200180831161205957829003601f168201915b505050918352505060069190910154602090910152919350909150505b9250929050565b600082815260fc60205260409020600101546120b581612720565b610edf83836127b8565b6120f96040805160c08101909152806000815260200160008152602001600081526020016060815260200160008152602001600081525090565b61012e54821061214b5760405162461bcd60e51b815260206004820152601a60248201527f54686973207365727669636520646f65736e277420657869737400000000000060448201526064016108c7565b6000828152610131602052604090819020815160c081019092528054829060ff16600481111561217d5761217d61380d565b600481111561218e5761218e61380d565b815260200160018201548152602001600282015481526020016003820180546121b690613bab565b80601f01602080910402602001604051908101604052809291908181526020018280546121e290613bab565b801561222f5780601f106122045761010080835404028352916020019161222f565b820191906000526020600020905b81548152906001019060200180831161221257829003601f168201915b50505050508152602001600482015481526020016005820154815250509050919050565b61225b6126a7565b6001600160a01b0381166122c05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c7565b61104e81612a10565b60006122d3612c0d565b905090565b6001600160a01b0387166000908152610135602052604090205460ff166123355760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08185b1b1bddd959607a1b60448201526064016108c7565b61013054604051634a7ab1d560e01b8152600481018790526000916001600160a01b031690634a7ab1d590602401602060405180830381865afa158015612380573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a49190613fcb565b90508034146123ea5760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108c7565b6001600160a01b038816600090815261013560205260409020600101548710156124475760405162461bcd60e51b815260206004820152600e60248201526d416d6f756e7420746f6f206c6f7760901b60448201526064016108c7565b60008981526101316020526040812090815460ff16600481111561246d5761246d61380d565b146124af5760405162461bcd60e51b815260206004820152601260248201527114d95c9d9a58d9481b9bdd081bdc195b995960721b60448201526064016108c7565b80600101546000036124f75760405162461bcd60e51b815260206004820152601160248201527014d95c9d9a58d9481b9bdd08195e1a5cdd607a1b60448201526064016108c7565b60008a8152610132602090815260408083208e84529091529020600101548b900361255d5760405162461bcd60e51b81526020600482015260166024820152751c1c9bdc1bdcd85b08185b1c9958591e48195e1a5cdd60521b60448201526064016108c7565b8a8160010154036125ba5760405162461bcd60e51b815260206004820152602160248201527f63616e27742063726561746520666f7220796f7572206f776e207365727669636044820152606560f81b60648201526084016108c7565b602e85146125da5760405162461bcd60e51b81526004016108c790613b86565b61013054604051631fff7f2760e11b8152600481018990526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126499190613fe4565b90506001600160a01b038116156126995760008c8c89896040516020016126739493929190614001565b60405160208183030381529060405280519060200120905061269786868385612c46565b505b505050505050505050505050565b6126af6122c9565b6001600160a01b03166126ca6033546001600160a01b031690565b6001600160a01b0316146113fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c7565b61104e8161272c6122c9565b612d3a565b61273b82826114d1565b610f6e57600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff191660011790556127746122c9565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6127c282826114d1565b15610f6e57600082815260fc602090815260408083206001600160a01b03851684529091529020805460ff191690556127f96122c9565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b61104e6126a7565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561287857610edf83612d93565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613fcb565b60015b6129355760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016108c7565b6000805160206141b483398151915281146129a45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016108c7565b50610edf838383612e2f565b600054610100900460ff166129d75760405162461bcd60e51b81526004016108c790614043565b6113fa612e5a565b600054610100900460ff166113fa5760405162461bcd60e51b81526004016108c790614043565b610f6e8282612731565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61013054604051638a98636360e01b8152600481018790526000916001600160a01b031690638a98636390602401602060405180830381865afa158015612aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad19190613fcb565b9050803414612b175760405162461bcd60e51b81526020600482015260126024820152714e6f6e2d6d61746368696e672066756e647360701b60448201526064016108c7565b602e8414612b375760405162461bcd60e51b81526004016108c790613b86565b61013054604051631fff7f2760e11b8152600481018890526000916001600160a01b031690633ffefe4e90602401602060405180830381865afa158015612b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba69190613fe4565b90506001600160a01b03811615612c0357600088815261013360209081526040808320549051612bdd928c92918b918b910161408e565b604051602081830303815290604052805190602001209050612c0185858385612c46565b505b5050505050505050565b600060143610801590612c2f57503360009081526065602052604090205460ff165b15612c41575060131936013560601c90565b503390565b6000612c9f836040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90506000612ce38287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e9192505050565b9050806001600160a01b0316836001600160a01b03161461174d5760405162461bcd60e51b8152602060048201526011602482015270696e76616c6964207369676e617475726560781b60448201526064016108c7565b612d4482826114d1565b610f6e57612d5181612eb5565b612d5c836020612ec7565b604051602001612d6d9291906140cf565b60408051601f198184030181529082905262461bcd60e51b82526108c791600401614144565b6001600160a01b0381163b612e005760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016108c7565b6000805160206141b483398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612e388361306a565b600082511180612e455750805b15610edf57612e5483836130aa565b50505050565b600054610100900460ff16612e815760405162461bcd60e51b81526004016108c790614043565b6113fa612e8c6122c9565b612a10565b6000806000612ea0858561319e565b91509150612ead816131e0565b509392505050565b606061081a6001600160a01b03831660145b60606000612ed6836002613f19565b612ee1906002614157565b67ffffffffffffffff811115612ef957612ef96136b8565b6040519080825280601f01601f191660200182016040528015612f23576020820181803683370190505b509050600360fc1b81600081518110612f3e57612f3e61416a565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612f6d57612f6d61416a565b60200101906001600160f81b031916908160001a9053506000612f91846002613f19565b612f9c906001614157565b90505b6001811115613014576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612fd057612fd061416a565b1a60f81b828281518110612fe657612fe661416a565b60200101906001600160f81b031916908160001a90535060049490941c9361300d81614180565b9050612f9f565b5083156130635760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108c7565b9392505050565b61307381612d93565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6131125760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016108c7565b600080846001600160a01b03168460405161312d9190614197565b600060405180830381855af49150503d8060008114613168576040519150601f19603f3d011682016040523d82523d6000602084013e61316d565b606091505b509150915061319582826040518060600160405280602781526020016141d46027913961332a565b95945050505050565b60008082516041036131d45760208301516040840151606085015160001a6131c887828585613343565b94509450505050612093565b50600090506002612093565b60008160048111156131f4576131f461380d565b036131fc5750565b60018160048111156132105761321061380d565b0361325d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016108c7565b60028160048111156132715761327161380d565b036132be5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016108c7565b60038160048111156132d2576132d261380d565b0361104e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016108c7565b60608315613339575081613063565b6130638383613407565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561337a57506000905060036133fe565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156133ce573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133f7576000600192509250506133fe565b9150600090505b94509492505050565b8151156134175781518083602001fd5b8060405162461bcd60e51b81526004016108c79190614144565b6040805160e0810190915280600081526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160608152602001600081525090565b60006020828403121561348a57600080fd5b81356001600160e01b03198116811461306357600080fd5b600080604083850312156134b557600080fd5b50508035926020909101359150565b60008083601f8401126134d657600080fd5b50813567ffffffffffffffff8111156134ee57600080fd5b60208301915083602082850101111561209357600080fd5b6000806000806060858703121561351c57600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561354157600080fd5b61354d878288016134c4565b95989497509550505050565b6001600160a01b038116811461104e57600080fd5b6000806000806000806000806000806101008b8d03121561358e57600080fd5b8a35995060208b0135985060408b01356135a781613559565b975060608b0135965060808b0135955060a08b013567ffffffffffffffff808211156135d257600080fd5b6135de8e838f016134c4565b909750955060c08d0135945060e08d01359150808211156135fe57600080fd5b5061360b8d828e016134c4565b915080935050809150509295989b9194979a5092959850565b60006020828403121561363657600080fd5b5035919050565b60006020828403121561364f57600080fd5b813561306381613559565b6000806040838503121561366d57600080fd5b82359150602083013561367f81613559565b809150509250929050565b6000806040838503121561369d57600080fd5b82356136a881613559565b9150602083013561367f81613559565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156136e157600080fd5b82356136ec81613559565b9150602083013567ffffffffffffffff8082111561370957600080fd5b818501915085601f83011261371d57600080fd5b81358181111561372f5761372f6136b8565b604051601f8201601f19908116603f01168101908382118183101715613757576137576136b8565b8160405282815288602084870101111561377057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b801515811461104e57600080fd5b6000806000606084860312156137b557600080fd5b83356137c081613559565b925060208401356137d081613792565b929592945050506040919091013590565b6000806000606084860312156137f657600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052602160045260246000fd5b600281106138335761383361380d565b9052565b60005b8381101561385257818101518382015260200161383a565b50506000910152565b60008151808452613873816020860160208601613837565b601f01601f19169290920160200192915050565b613892828251613823565b6020810151602083015260018060a01b0360408201511660408301526060810151606083015260808101516080830152600060a082015160e060a08501526138dd60e085018261385b565b60c093840151949093019390935250919050565b6020815260006130636020830184613887565b600581106138335761383361380d565b61391e8188613904565b85602082015284604082015260c06060820152600061394060c083018661385b565b60808301949094525060a00152949350505050565b61395f8189613823565b86602082015260018060a01b038616604082015284606082015283608082015260e060a0820152600061399560e083018561385b565b90508260c083015298975050505050505050565b600080600080600080600060c0888a0312156139c457600080fd5b873596506020880135955060408801356139dd81613559565b945060608801359350608088013567ffffffffffffffff811115613a0057600080fd5b613a0c8a828b016134c4565b989b979a5095989497959660a090950135949350505050565b60008060008060008060808789031215613a3e57600080fd5b8635955060208701359450604087013567ffffffffffffffff80821115613a6457600080fd5b613a708a838b016134c4565b90965094506060890135915080821115613a8957600080fd5b50613a9689828a016134c4565b979a9699509497509295939492505050565b613ab3828251613904565b60208101516020830152604081015160408301526000606082015160c06060850152613ae260c085018261385b565b90506080830151608085015260a083015160a08501528091505092915050565b604081526000613b156040830185613aa8565b82810360208401526131958185613887565b6020815260006130636020830184613aa8565b600060208284031215613b4c57600080fd5b815161306381613792565b6020808252601590820152744e6f74206f776e6572206f722064656c656761746560581b604082015260600190565b6020808252600b908201526a125b9d985b1a590818da5960aa1b604082015260600190565b600181811c90821680613bbf57607f821691505b602082108103613bdf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610edf57600081815260208120601f850160051c81016020861015613c0c5750805b601f850160051c820191505b8181101561174d57828155600101613c18565b67ffffffffffffffff831115613c4357613c436136b8565b613c5783613c518354613bab565b83613be5565b6000601f841160018114613c8b5760008515613c735750838201355b600019600387901b1c1916600186901b178355613ce5565b600083815260209020601f19861690835b82811015613cbc5786850135825560209485019460019092019101613c9c565b5086821015613cd95760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b602081526000613d29602083018486613cec565b949350505050565b815167ffffffffffffffff811115613d4b57613d4b6136b8565b613d5f81613d598454613bab565b84613be5565b602080601f831160018114613d945760008415613d7c5750858301515b600019600386901b1c1916600185901b17855561174d565b600085815260208120601f198616915b82811015613dc357888601518255948401946001909101908401613da4565b5085821015613de15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600060018201613e1957613e19613df1565b5060010190565b60006101008b83528a6020840152806040840152613e418184018a8c613cec565b915050613e516060830188613823565b6001600160a01b0395909516608082015260a081019390935260c083019190915260e09091015295945050505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b808202811582820484141761081a5761081a613df1565b600082613f4d57634e487b7160e01b600052601260045260246000fd5b500490565b87815286602082015260c060408201526000613f7260c083018789613cec565b6001600160a01b0395909516606083015250608081019290925260a090910152949350505050565b858152846020820152836040820152608060608201526000613fc0608083018486613cec565b979650505050505050565b600060208284031215613fdd57600080fd5b5051919050565b600060208284031215613ff657600080fd5b815161306381613559565b6d18dc99585d19541c9bdc1bdcd85b60921b815284600e820152603b60f81b602e82015283602f8201528183604f83013760009101604f019081529392505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6c6372656174655365727669636560981b815284600d820152603b60f81b602d82015283602e8201528183604e83013760009101604e019081529392505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614107816017850160208801613837565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614138816028840160208801613837565b01602801949350505050565b602081526000613063602083018461385b565b8082018082111561081a5761081a613df1565b634e487b7160e01b600052603260045260246000fd5b60008161418f5761418f613df1565b506000190190565b600082516141a9818460208701613837565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220424cbcb9a1e7045f90dcccd8e90829b3648f23380938f070c1b4c9fca81966c564736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/schema.graphql b/schema.graphql index 335e4d9b..42240516 100644 --- a/schema.graphql +++ b/schema.graphql @@ -15,12 +15,15 @@ type Service @entity { id: ID! # service id createdAt: BigInt! # timestamp of block creation updatedAt: BigInt! # timestamp of the last change + rateToken: Token! # Token entity + referralAmount: BigInt! # Referral amount status: ServiceStatus! # service status buyer: User # service buyer seller: User # service seller + referrer: User # service referrer (optional) transaction: Transaction @derivedFrom(field: "service") # transaction associated with this service proposals: [Proposal!] @derivedFrom(field: "service") # proposals for this service - platform: Platform # Platform on which service was created + platform: Platform # Platform on which the service was created cid: String description: ServiceDescription } @@ -34,7 +37,6 @@ type ServiceDescription @entity(immutable: true) { expectedEndDate: BigInt keywords: [Keyword!] #keywords keywords_raw: String #lowercase keywords in raw format - rateToken: String rateAmount: String video_url: String } @@ -81,28 +83,32 @@ type User @entity { createdAt: BigInt! updatedAt: BigInt! platform: Platform # Platform on which user nft was minted - numReviews: BigInt # DEPRECATED - will be remove soon, use UserStats.numReceivedReviews instead + numReviews: BigInt # DEPRECATED - will be removed soon, use UserStats.numReceivedReviews instead address: String! # wallet address of user rating: BigDecimal! # average rating from reviews user has received reviews: [Review!] @derivedFrom(field: "to") # reviews of user buyerServices: [Service!] @derivedFrom(field: "buyer") # services user is an buyer for sellerServices: [Service!] @derivedFrom(field: "seller") # services user is an seller for totalGains: [UserGain!] @derivedFrom(field: "user") + referralGains: [ReferralGain!] @derivedFrom(field: "user") cid: String #cid of the description description: UserDescription # User description (off chain data) delegates: [String!]! # list of user delegators - userStats: UserStats # User proposal, service & reviews statistics + userStat: UserStat # User proposal, service & reviews statistics } -type UserStats @entity { +type UserStat @entity { id: ID! # ID of the user + user: User! # Corresponding user numReceivedReviews: BigInt! # number of reviews user has received numGivenReviews: BigInt! # number of reviews user has given numCreatedServices: BigInt! # number of services user has created numFinishedServicesAsBuyer: BigInt! # number of services user has finished as a buyer numCreatedProposals: BigInt! # number of proposals user has created numFinishedServicesAsSeller: BigInt! # number of services user has finished as a seller - user: User! # Corresponding user + numReferredUsers: BigInt! # number of users user has referred + numReferredUsersReviewsReceived: BigInt! # number of reviews referred users received (used for stat calculation) + averageReferredRating: BigDecimal! # average rating of referred referred services } type UserDescription @entity(immutable: true) { @@ -146,12 +152,13 @@ type Proposal @entity { updatedAt: BigInt! # timestamp of the last change status: ProposalStatus! # Proposal status seller: User # Proposal seller - rateToken: Token! # Rate token entity + rateToken: Token # Rate token entity rateAmount: BigInt # Rate amount cid: String # cid of the description platform: Platform # Platform on which proposal was created description: ProposalDescription #Proposals that the description describes. expirationDate: BigInt + referrer: User # Optional referrer for the proposal } type ProposalDescription @entity(immutable: true) { @@ -283,6 +290,15 @@ type FeeClaim @entity(immutable: true) { transactionHash: String # Transaction hash of the transfer } +type ReferralBalanceClaim @entity(immutable: true) { + id: ID! # autogenerated id + createdAt: BigInt # timestamp of block creation + user: User # user entity + token: Token # token entity + amount: BigInt! # claim amount + transactionHash: String # Transaction hash of the transfer +} + type PlatformGain @entity { id: ID! # concatenation of platformId + token entity platform: Platform # platform entity @@ -298,6 +314,15 @@ type UserGain @entity { totalGain: BigInt! # total User gain } +type ReferralGain @entity { + id: ID! # concatenation of userId + token entity + user: User # user receiving the referral gain + token: Token # token entity + service: Service # Service which issued referral gain + totalGain: BigInt! # total User gain + availableBalance: BigInt! # balance available to be claimed +} + type Protocol @entity { id: ID! # autogenerated id userMintFee: BigInt! # protocol fee for minting a TL id diff --git a/src/getters.ts b/src/getters.ts index 697de375..b3a284de 100644 --- a/src/getters.ts +++ b/src/getters.ts @@ -15,8 +15,10 @@ import { Transaction, Evidence, Keyword, - UserStats, Arbitrator, + UserStat, + ReferralGain, + ReferralBalanceClaim, } from '../generated/schema' import { PROTOCOL_ID, ZERO, ZERO_ADDRESS, ZERO_BIGDEC, ZERO_TOKEN_ADDRESS } from './constants' import { ERC20 } from '../generated/TalentLayerEscrow/ERC20' @@ -26,6 +28,8 @@ export function getOrCreateService(id: BigInt): Service { let service = Service.load(id.toString()) if (!service) { service = new Service(id.toString()) + service.rateToken = getOrCreateToken(ZERO_ADDRESS).id + service.referralAmount = ZERO service.status = 'Opened' service.createdAt = ZERO service.updatedAt = ZERO @@ -37,12 +41,14 @@ export function getOrCreateService(id: BigInt): Service { export function getOrCreateProposal(id: string, serviceId: BigInt): Proposal { let proposal = Proposal.load(id) if (!proposal) { + const service = getOrCreateService(serviceId) + proposal = new Proposal(id) proposal.status = 'Pending' proposal.createdAt = ZERO proposal.updatedAt = ZERO - proposal.service = getOrCreateService(serviceId).id - proposal.rateToken = getOrCreateToken(ZERO_ADDRESS).id + proposal.service = service.id + proposal.rateToken = service.rateToken proposal.expirationDate = ZERO proposal.save() } @@ -76,27 +82,30 @@ export function getOrCreateUser(id: BigInt): User { user.delegates = [] user.save() - user.userStats = getOrCreateUserStats(id).id + user.userStat = getOrCreateUserStat(id).id user.save() } return user } -export function getOrCreateUserStats(id: BigInt): UserStats { - let userStats = UserStats.load(id.toString()) - if (!userStats) { - userStats = new UserStats(id.toString()) - userStats.user = getOrCreateUser(id).id - userStats.numReceivedReviews = ZERO - userStats.numGivenReviews = ZERO - userStats.numCreatedServices = ZERO - userStats.numFinishedServicesAsBuyer = ZERO - userStats.numCreatedProposals = ZERO - userStats.numFinishedServicesAsSeller = ZERO - userStats.save() +export function getOrCreateUserStat(id: BigInt): UserStat { + let userStat = UserStat.load(id.toString()) + if (!userStat) { + userStat = new UserStat(id.toString()) + userStat.user = getOrCreateUser(id).id + userStat.numReceivedReviews = ZERO + userStat.numGivenReviews = ZERO + userStat.numCreatedServices = ZERO + userStat.numFinishedServicesAsBuyer = ZERO + userStat.numCreatedProposals = ZERO + userStat.numFinishedServicesAsSeller = ZERO + userStat.numReferredUsers = ZERO + userStat.numReferredUsersReviewsReceived = ZERO + userStat.averageReferredRating = ZERO_BIGDEC + userStat.save() } - return userStats + return userStat } export function getOrCreateTransaction(id: BigInt, blockTimestamp: BigInt = ZERO): Transaction { @@ -305,6 +314,31 @@ export function getOrCreateKeyword(id: string): Keyword { return keyword } +export function getOrCreateReferralGain(userId: BigInt, tokenAddress: Address): ReferralGain { + const referralGainId = generateIdFromTwoElements(userId.toString(), tokenAddress.toHex()) + let referralGain = ReferralGain.load(referralGainId) + if (!referralGain) { + referralGain = new ReferralGain(referralGainId) + referralGain.user = getOrCreateUser(userId).id + referralGain.token = getOrCreateToken(tokenAddress).id + referralGain.totalGain = ZERO + referralGain.availableBalance = ZERO + + referralGain.save() + } + return referralGain +} + +export function getOrCreateReferralClaim(referralClaimId: string): ReferralBalanceClaim { + let claim = ReferralBalanceClaim.load(referralClaimId) + if (!claim) { + claim = new ReferralBalanceClaim(referralClaimId) + claim.amount = ZERO + claim.save() + } + return claim +} + export function getOrCreateArbitrator(address: Address): Arbitrator { let arbitrator = Arbitrator.load(address.toString()) if (!arbitrator) { diff --git a/src/mappings/ipfs-data.ts b/src/mappings/ipfs-data.ts index b6144995..489eaaa0 100644 --- a/src/mappings/ipfs-data.ts +++ b/src/mappings/ipfs-data.ts @@ -36,7 +36,6 @@ export function handleServiceData(content: Bytes): void { if (keywords !== null) { description.keywords_raw = keywords.toLowerCase() } - description.rateToken = getValueAsString(jsonObject, 'rateToken') description.rateAmount = getValueAsString(jsonObject, 'rateAmount') description.video_url = getValueAsString(jsonObject, 'video_url') diff --git a/src/mappings/talent-layer-escrow.ts b/src/mappings/talent-layer-escrow.ts index 64a439d2..57e14c98 100644 --- a/src/mappings/talent-layer-escrow.ts +++ b/src/mappings/talent-layer-escrow.ts @@ -1,4 +1,4 @@ -import { BigInt, DataSourceContext, log } from '@graphprotocol/graph-ts' +import { BigInt, DataSourceContext } from '@graphprotocol/graph-ts' import { Service, Transaction, User } from '../../generated/schema' import { getOrCreateService, @@ -13,12 +13,15 @@ import { getOrCreateProtocol, getOrCreateTransaction, getOrCreateEvidence, - getOrCreateUserStats, + getOrCreateUserStat, + getOrCreateReferralGain, + getOrCreateReferralClaim, + getOrCreateUser, getOrCreatePaymentV1, } from '../getters' import { - Payment as PaymentCurrent, Payment1 as PaymentV1, + Payment, PaymentCompleted, FeesClaimed, ProtocolEscrowFeeRateUpdated, @@ -31,6 +34,8 @@ import { EvidenceSubmitted, OriginServiceFeeRateReleased, OriginValidatedProposalFeeRateReleased, + ReferralAmountReleased, + ReferralAmountClaimed, } from '../../generated/TalentLayerEscrow/TalentLayerEscrow' import { generateIdFromTwoElements, generateUniqueId } from './utils' import { ONE, ZERO } from '../constants' @@ -51,12 +56,14 @@ enum ArbitrationFeePaymentType { Reimburse, } +// =================== Current V2 Events =================== export function handleTransactionCreated(event: TransactionCreated): void { const transaction = getOrCreateTransaction(event.params._transactionId, event.block.timestamp) + const token = getOrCreateToken(event.params._token).id; transaction.sender = User.load(event.params._senderId.toString())!.id transaction.receiver = User.load(event.params._receiverId.toString())!.id - transaction.token = getOrCreateToken(event.params._token).id + transaction.token = token transaction.amount = event.params._amount transaction.service = Service.load(event.params._serviceId.toString())!.id transaction.protocolEscrowFeeRate = event.params._protocolEscrowFeeRate @@ -68,6 +75,7 @@ export function handleTransactionCreated(event: TransactionCreated): void { transaction.save() const service = getOrCreateService(event.params._serviceId) + service.rateToken = token const proposalId = generateIdFromTwoElements(event.params._serviceId.toString(), event.params._proposalId.toString()) const proposal = getOrCreateProposal(proposalId, event.params._serviceId) @@ -77,6 +85,9 @@ export function handleTransactionCreated(event: TransactionCreated): void { service.status = 'Confirmed' service.updatedAt = event.block.timestamp service.seller = User.load(event.params._proposalId.toString())!.id + if (proposal.referrer != null && proposal.referrer != '0') { + service.referrer = User.load(proposal.referrer!)!.id + } service.save() } @@ -84,18 +95,23 @@ export function handlePaymentCompleted(event: PaymentCompleted): void { const service = getOrCreateService(event.params._serviceId) service.status = 'Finished' service.updatedAt = event.block.timestamp + if (service.referrer != null && service.referrer != '0') { + const referrerUserStat = getOrCreateUserStat(BigInt.fromString(service.referrer!)) + referrerUserStat.numReferredUsers.plus(ONE) + referrerUserStat.save() + } service.save() - const buyerUserStats = getOrCreateUserStats(BigInt.fromString(service.buyer!)) - buyerUserStats.numFinishedServicesAsBuyer.plus(ONE) - buyerUserStats.save() + const buyerUserStat = getOrCreateUserStat(BigInt.fromString(service.buyer!)) + buyerUserStat.numFinishedServicesAsBuyer = buyerUserStat.numFinishedServicesAsBuyer.plus(ONE) + buyerUserStat.save() - const sellerUserStats = getOrCreateUserStats(BigInt.fromString(service.seller!)) - sellerUserStats.numFinishedServicesAsSeller.plus(ONE) - sellerUserStats.save() + const sellerUserStat = getOrCreateUserStat(BigInt.fromString(service.seller!)) + sellerUserStat.numFinishedServicesAsSeller = sellerUserStat.numFinishedServicesAsSeller.plus(ONE) + sellerUserStat.save() } -export function handlePayment(event: PaymentCurrent): void { +export function handlePayment(event: Payment): void { const paymentId = generateUniqueId(event.transaction.hash.toHex(), event.logIndex.toString()) const payment = getOrCreatePayment(paymentId, event.params._serviceId, event.params._proposalId) const token = event.params._token @@ -272,7 +288,35 @@ export function handleMetaEvidence(event: MetaEvidence): void { transaction.save() } -// Legacy Events +export function handleReferralAmountReleased(event: ReferralAmountReleased): void { + const referralGain = getOrCreateReferralGain(event.params._referrerId, event.params._token) + referralGain.service = getOrCreateService(event.params._serviceId).id + referralGain.totalGain = referralGain.totalGain.plus(event.params._amount) + referralGain.availableBalance = referralGain.availableBalance.plus(event.params._amount) + + referralGain.save() +} + +export function handleReferralAmountClaimed(event: ReferralAmountClaimed): void { + const claimId = generateUniqueId(event.transaction.hash.toHex(), event.logIndex.toString()) + const referralClaim = getOrCreateReferralClaim(claimId) + + referralClaim.user = getOrCreateUser(event.params._referrerId).id + referralClaim.token = getOrCreateToken(event.params._token).id + referralClaim.amount = event.params._amount + + referralClaim.transactionHash = event.transaction.hash.toHex() + referralClaim.createdAt = event.block.timestamp + + referralClaim.save() + + const referralGain = getOrCreateReferralGain(event.params._referrerId, event.params._token) + referralGain.availableBalance = referralGain.availableBalance.minus(event.params._amount) + + referralGain.save() +} + +// =================== Legacy V1 Events =================== export function handlePaymentV1(event: PaymentV1): void { const paymentId = generateUniqueId(event.transaction.hash.toHex(), event.logIndex.toString()) const payment = getOrCreatePaymentV1(paymentId, event.params._serviceId) diff --git a/src/mappings/talent-layer-id.ts b/src/mappings/talent-layer-id.ts index ccefbe06..9d547d1f 100644 --- a/src/mappings/talent-layer-id.ts +++ b/src/mappings/talent-layer-id.ts @@ -39,7 +39,7 @@ export function handleCidUpdated(event: CidUpdated): void { export function handleMint(event: Mint): void { const user = getOrCreateUser(event.params.profileId) - user.userStats = event.params.profileId.toString() + user.userStat = event.params.profileId.toString() user.address = event.params.user.toHex() user.handle = event.params.handle user.createdAt = event.block.timestamp diff --git a/src/mappings/talent-layer-review.ts b/src/mappings/talent-layer-review.ts index d7d2e237..03396367 100644 --- a/src/mappings/talent-layer-review.ts +++ b/src/mappings/talent-layer-review.ts @@ -1,21 +1,27 @@ import { BigInt, DataSourceContext } from '@graphprotocol/graph-ts' -import { User } from '../../generated/schema' import { Approval, ApprovalForAll, - Mint as MintCurrent, + Mint, Mint1 as MintV1, Transfer, } from '../../generated/TalentLayerReview/TalentLayerReview' -import { getOrCreateReview, getOrCreateReviewV1, getOrCreateService, getOrCreateUserStats } from '../getters' -import { ONE } from '../constants' +import { + getOrCreateReview, + getOrCreateReviewV1, + getOrCreateService, + getOrCreateUser, + getOrCreateUserStat, +} from '../getters' +import { ONE, ZERO } from '../constants' import { ReviewData } from '../../generated/templates' +// =================== Current V2 Events =================== export function handleApproval(event: Approval): void {} export function handleApprovalForAll(event: ApprovalForAll): void {} -export function handleMint(event: MintCurrent): void { +export function handleMint(event: Mint): void { const review = getOrCreateReview( event.params.tokenId, event.params.serviceId, @@ -26,31 +32,54 @@ export function handleMint(event: MintCurrent): void { review.createdAt = event.block.timestamp review.cid = event.params.reviewUri - const receiver = User.load(event.params.toId.toString()) - const receiverStats = getOrCreateUserStats(event.params.toId) + const receiver = getOrCreateUser(event.params.toId) + const receiverStats = getOrCreateUserStat(event.params.toId) if (!receiver) return - receiver.rating - .times(receiverStats.numReceivedReviews.toBigDecimal()) - .plus(event.params.rating.toBigDecimal()) - .div(receiverStats.numReceivedReviews.plus(ONE).toBigDecimal()) - receiverStats.numGivenReviews.plus(ONE) + // Update receiver rating stats + if (receiverStats.numReceivedReviews == ZERO) { + receiver.rating = receiver.rating.plus(event.params.rating.toBigDecimal()) + } else { + receiver.rating = receiver.rating + .times(receiverStats.numReceivedReviews.toBigDecimal()) + .plus(event.params.rating.toBigDecimal()) + .div(receiverStats.numReceivedReviews.plus(ONE).toBigDecimal()) + } + receiverStats.numReceivedReviews = receiverStats.numReceivedReviews.plus(ONE) + receiver.save() receiverStats.save() const service = getOrCreateService(event.params.serviceId) - const buyerStats = getOrCreateUserStats(BigInt.fromString(service.buyer!)) - const sellerStats = getOrCreateUserStats(BigInt.fromString(service.seller!)) + const buyerStats = getOrCreateUserStat(BigInt.fromString(service.buyer!)) + const sellerStats = getOrCreateUserStat(BigInt.fromString(service.seller!)) + // Increase given reviews by ONE for buyer or seller if (receiverStats.id == buyerStats.id) { - sellerStats.numGivenReviews.plus(ONE) + sellerStats.numGivenReviews = sellerStats.numGivenReviews.plus(ONE) sellerStats.save() } else { - buyerStats.numGivenReviews.plus(ONE) + buyerStats.numGivenReviews = buyerStats.numGivenReviews.plus(ONE) buyerStats.save() } + //If the service included a referral amount && a referrer; & if the user receiving the review was the person referred + if (service.referrer != null && service.referralAmount.gt(ZERO) && receiver.id == service.seller) { + const referrerStats = getOrCreateUserStat(BigInt.fromString(service.referrer!)) + referrerStats.numReferredUsers = referrerStats.numReferredUsers.plus(ONE) + if (referrerStats.numReferredUsersReviewsReceived == ZERO) { + referrerStats.averageReferredRating = referrerStats.averageReferredRating.plus(event.params.rating.toBigDecimal()) + } else { + referrerStats.averageReferredRating = referrerStats.averageReferredRating + .times(referrerStats.numReferredUsersReviewsReceived.toBigDecimal()) + .plus(event.params.rating.toBigDecimal()) + .div(referrerStats.numReferredUsersReviewsReceived.plus(ONE).toBigDecimal()) + } + referrerStats.numReferredUsersReviewsReceived = referrerStats.numReferredUsersReviewsReceived.plus(ONE) + referrerStats.save() + } + const cid = event.params.reviewUri const dataId = cid + '-' + event.block.timestamp.toString() const context = new DataSourceContext() @@ -63,38 +92,63 @@ export function handleMint(event: MintCurrent): void { review.save() } -// Legacy events +export function handleTransfer(event: Transfer): void {} + +// =================== Legacy V1 Events =================== export function handleMintV1(event: MintV1): void { const review = getOrCreateReviewV1(event.params.tokenId, event.params.serviceId, event.params.toId) review.rating = event.params.rating review.createdAt = event.block.timestamp review.cid = event.params.reviewUri - const receiver = User.load(event.params.toId.toString()) - const receiverStats = getOrCreateUserStats(event.params.toId) + const receiver = getOrCreateUser(event.params.toId) + const receiverStats = getOrCreateUserStat(event.params.toId) if (!receiver) return - receiver.rating - .times(receiverStats.numReceivedReviews.toBigDecimal()) - .plus(event.params.rating.toBigDecimal()) - .div(receiverStats.numReceivedReviews.plus(ONE).toBigDecimal()) - receiverStats.numGivenReviews.plus(ONE) + // Update receiver rating stats + if (receiverStats.numReceivedReviews == ZERO) { + receiver.rating = receiver.rating.plus(event.params.rating.toBigDecimal()) + } else { + receiver.rating = receiver.rating + .times(receiverStats.numReceivedReviews.toBigDecimal()) + .plus(event.params.rating.toBigDecimal()) + .div(receiverStats.numReceivedReviews.plus(ONE).toBigDecimal()) + } + receiverStats.numReceivedReviews = receiverStats.numReceivedReviews.plus(ONE) + receiver.save() receiverStats.save() const service = getOrCreateService(event.params.serviceId) - const buyerStats = getOrCreateUserStats(BigInt.fromString(service.buyer!)) - const sellerStats = getOrCreateUserStats(BigInt.fromString(service.seller!)) + const buyerStats = getOrCreateUserStat(BigInt.fromString(service.buyer!)) + const sellerStats = getOrCreateUserStat(BigInt.fromString(service.seller!)) + // Increase given reviews by ONE for buyer or seller if (receiverStats.id == buyerStats.id) { - sellerStats.numGivenReviews.plus(ONE) + sellerStats.numGivenReviews = sellerStats.numGivenReviews.plus(ONE) sellerStats.save() } else { - buyerStats.numGivenReviews.plus(ONE) + buyerStats.numGivenReviews = buyerStats.numGivenReviews.plus(ONE) buyerStats.save() } + //If the service included a referral amount && a referrer; & if the user receiving the review was the person referred + if (service.referrer != null && service.referralAmount.gt(ZERO) && receiver.id == service.seller) { + const referrerStats = getOrCreateUserStat(BigInt.fromString(service.referrer!)) + referrerStats.numReferredUsers = referrerStats.numReferredUsers.plus(ONE) + if (referrerStats.numReferredUsersReviewsReceived == ZERO) { + referrerStats.averageReferredRating = referrerStats.averageReferredRating.plus(event.params.rating.toBigDecimal()) + } else { + referrerStats.averageReferredRating = referrerStats.averageReferredRating + .times(referrerStats.numReferredUsersReviewsReceived.toBigDecimal()) + .plus(event.params.rating.toBigDecimal()) + .div(referrerStats.numReferredUsersReviewsReceived.plus(ONE).toBigDecimal()) + } + referrerStats.numReferredUsersReviewsReceived = referrerStats.numReferredUsersReviewsReceived.plus(ONE) + referrerStats.save() + } + const cid = event.params.reviewUri const dataId = cid + '-' + event.block.timestamp.toString() const context = new DataSourceContext() @@ -106,5 +160,3 @@ export function handleMintV1(event: MintV1): void { review.description = dataId review.save() } - -export function handleTransfer(event: Transfer): void {} diff --git a/src/mappings/talent-layer-service.ts b/src/mappings/talent-layer-service.ts index fce94544..75e86a5c 100644 --- a/src/mappings/talent-layer-service.ts +++ b/src/mappings/talent-layer-service.ts @@ -2,10 +2,14 @@ import { store, DataSourceContext } from '@graphprotocol/graph-ts' import { Platform } from '../../generated/schema' import { ServiceData, ProposalData } from '../../generated/templates' import { - ServiceCreated, - ServiceDetailedUpdated, - ProposalCreated, - ProposalUpdated, + ServiceCreated as ServiceCreatedV1, + ServiceCreated1 as ServiceCreated, + ServiceDetailedUpdated as ServiceUpdatedV1, + ServiceUpdated as ServiceUpdated, + ProposalCreated as ProposalCreatedV1, + ProposalCreated1 as ProposalCreated, + ProposalUpdated as ProposalUpdatedV1, + ProposalUpdated1 as ProposalUpdated, AllowedTokenListUpdated, MinCompletionPercentageUpdated, } from '../../generated/TalentLayerService/TalentLayerService' @@ -16,17 +20,21 @@ import { getOrCreatePlatform, getOrCreateUser, getOrCreateProtocol, - getOrCreateUserStats, + getOrCreateUserStat, } from '../getters' import { generateIdFromTwoElements } from './utils' -import { ONE } from "../constants"; +import { ONE, ZERO } from '../constants' + +// =================== V2 Events (current upgrade) =================== export function handleServiceCreated(event: ServiceCreated): void { - const buyerStats = getOrCreateUserStats(event.params.ownerId) - buyerStats.numCreatedServices.plus(ONE) + const buyerStats = getOrCreateUserStat(event.params.ownerId) + buyerStats.numCreatedServices = buyerStats.numCreatedServices.plus(ONE) buyerStats.save() const service = getOrCreateService(event.params.id) + service.rateToken = getOrCreateToken(event.params.rateToken).id + service.referralAmount = event.params.referralAmount service.createdAt = event.block.timestamp service.updatedAt = event.block.timestamp service.buyer = getOrCreateUser(event.params.ownerId).id @@ -45,7 +53,7 @@ export function handleServiceCreated(event: ServiceCreated): void { service.save() } -export function handleServiceDetailedUpdated(event: ServiceDetailedUpdated): void { +export function handleServiceUpdated(event: ServiceUpdated): void { const serviceId = event.params.id const service = getOrCreateService(serviceId) const oldCid = service.cid @@ -55,6 +63,7 @@ export function handleServiceDetailedUpdated(event: ServiceDetailedUpdated): voi //service.created set in handleServiceCreated. service.updatedAt = event.block.timestamp service.cid = newCid + service.referralAmount = event.params.referralAmount const context = new DataSourceContext() context.setBigInt('serviceId', serviceId) @@ -71,8 +80,8 @@ export function handleServiceDetailedUpdated(event: ServiceDetailedUpdated): voi } export function handleProposalCreated(event: ProposalCreated): void { - const sellerStats = getOrCreateUserStats(event.params.ownerId) - sellerStats.numCreatedProposals.plus(ONE) + const sellerStats = getOrCreateUserStat(event.params.ownerId) + sellerStats.numCreatedProposals = sellerStats.numCreatedProposals.plus(ONE) sellerStats.save() const proposalId = generateIdFromTwoElements(event.params.serviceId.toString(), event.params.ownerId.toString()) @@ -81,13 +90,12 @@ export function handleProposalCreated(event: ProposalCreated): void { proposal.service = getOrCreateService(event.params.serviceId).id proposal.seller = getOrCreateUser(event.params.ownerId).id - proposal.rateToken = event.params.rateToken.toHexString() proposal.rateAmount = event.params.rateAmount proposal.platform = Platform.load(event.params.platformId.toString())!.id proposal.expirationDate = event.params.expirationDate - - const tokenAddress = event.params.rateToken - let token = getOrCreateToken(tokenAddress) + if (event.params.referrerId != ZERO) { + proposal.referrer = getOrCreateUser(event.params.referrerId).id + } proposal.createdAt = event.block.timestamp proposal.updatedAt = event.block.timestamp @@ -106,6 +114,37 @@ export function handleProposalCreated(event: ProposalCreated): void { proposal.save() } +export function handleProposalUpdated(event: ProposalUpdated): void { + const proposalId = generateIdFromTwoElements(event.params.serviceId.toString(), event.params.ownerId.toString()) + const proposal = getOrCreateProposal(proposalId, event.params.serviceId) + const newCid = event.params.dataUri + const oldCid = proposal.cid + const dataId = newCid + '-' + event.block.timestamp.toString() + + proposal.rateAmount = event.params.rateAmount + if (event.params.referrerId != ZERO) { + proposal.referrer = getOrCreateUser(event.params.referrerId).id + } + + //proposal.created set in handleProposalCreated. + proposal.updatedAt = event.block.timestamp + + proposal.cid = newCid + proposal.expirationDate = event.params.expirationDate + const context = new DataSourceContext() + context.setString('proposalId', proposalId) + context.setString('id', dataId) + + if (oldCid) { + store.remove('ProposalDescription', oldCid) + } + + ProposalData.createWithContext(newCid, context) + + proposal.description = dataId + proposal.save() +} + export function handleAllowedTokenListUpdated(event: AllowedTokenListUpdated): void { const token = getOrCreateToken(event.params.tokenAddress) token.allowed = event.params.isWhitelisted @@ -114,7 +153,97 @@ export function handleAllowedTokenListUpdated(event: AllowedTokenListUpdated): v token.save() } -export function handleProposalUpdated(event: ProposalUpdated): void { +export function handleMinCompletionPercentageUpdated(event: MinCompletionPercentageUpdated): void { + const protocol = getOrCreateProtocol() + protocol.minServiceCompletionPercentage = event.params.minCompletionPercentage + protocol.save() +} + +// =================== Legacy V1 Events =================== +export function handleServiceCreatedV1(event: ServiceCreatedV1): void { + const buyerStats = getOrCreateUserStat(event.params.ownerId) + buyerStats.numCreatedServices = buyerStats.numCreatedServices.plus(ONE) + buyerStats.save() + + const service = getOrCreateService(event.params.id) + service.createdAt = event.block.timestamp + service.updatedAt = event.block.timestamp + service.buyer = getOrCreateUser(event.params.ownerId).id + service.status = 'Opened' + const platform = getOrCreatePlatform(event.params.platformId) + service.platform = platform.id + service.cid = event.params.dataUri + const dataId = event.params.dataUri + '-' + event.block.timestamp.toString() + + const context = new DataSourceContext() + context.setBigInt('serviceId', event.params.id) + context.setString('id', dataId) + ServiceData.createWithContext(event.params.dataUri, context) + + service.description = dataId + service.save() +} + +export function handleServiceDetailedUpdated(event: ServiceUpdatedV1): void { + const serviceId = event.params.id + const service = getOrCreateService(serviceId) + const oldCid = service.cid + const newCid = event.params.dataUri + const dataId = newCid + '-' + event.block.timestamp.toString() + + //service.created set in handleServiceCreated. + service.updatedAt = event.block.timestamp + service.cid = newCid + + const context = new DataSourceContext() + context.setBigInt('serviceId', serviceId) + context.setString('id', dataId) + + if (oldCid) { + store.remove('ServiceDescription', oldCid) + } + + ServiceData.createWithContext(newCid, context) + + service.description = dataId + service.save() +} + +export function handleProposalCreatedV1(event: ProposalCreatedV1): void { + const sellerStats = getOrCreateUserStat(event.params.ownerId) + sellerStats.numCreatedProposals = sellerStats.numCreatedProposals.plus(ONE) + sellerStats.save() + + const proposalId = generateIdFromTwoElements(event.params.serviceId.toString(), event.params.ownerId.toString()) + const proposal = getOrCreateProposal(proposalId, event.params.serviceId) + proposal.status = 'Pending' + + proposal.service = getOrCreateService(event.params.serviceId).id + proposal.seller = getOrCreateUser(event.params.ownerId).id + // Handled in getOrCreateProposal + proposal.rateToken = getOrCreateToken(event.params.rateToken).id + proposal.rateAmount = event.params.rateAmount + proposal.platform = Platform.load(event.params.platformId.toString())!.id + proposal.expirationDate = event.params.expirationDate + + proposal.createdAt = event.block.timestamp + proposal.updatedAt = event.block.timestamp + + const cid = event.params.dataUri + proposal.cid = cid + + const dataId = cid + '-' + event.block.timestamp.toString() + proposal.description = dataId + + const context = new DataSourceContext() + context.setString('proposalId', proposalId) + context.setString('id', dataId) + ProposalData.createWithContext(cid, context) + + proposal.save() +} + +export function handleProposalUpdatedV1(event: ProposalUpdatedV1): void { const token = event.params.rateToken const proposalId = generateIdFromTwoElements(event.params.serviceId.toString(), event.params.ownerId.toString()) const proposal = getOrCreateProposal(proposalId, event.params.serviceId) @@ -143,9 +272,3 @@ export function handleProposalUpdated(event: ProposalUpdated): void { proposal.description = dataId proposal.save() } - -export function handleMinCompletionPercentageUpdated(event: MinCompletionPercentageUpdated): void { - const protocol = getOrCreateProtocol() - protocol.minServiceCompletionPercentage = event.params.minCompletionPercentage - protocol.save() -} diff --git a/subgraph.yaml b/subgraph.yaml index 7b8cd804..3128ad66 100644 --- a/subgraph.yaml +++ b/subgraph.yaml @@ -17,6 +17,7 @@ dataSources: language: wasm/assemblyscript entities: - User + - UserStat abis: - name: TalentLayerID file: ./abis/TalentLayerID.json @@ -93,18 +94,27 @@ dataSources: - name: ERC20 file: ./abis/ERC20.json eventHandlers: - - event: ServiceCreated(uint256,uint256,uint256,string) + - event: ServiceCreated(uint256,uint256,uint256,string,address,uint256) handler: handleServiceCreated - - event: ServiceDetailedUpdated(indexed uint256,string) - handler: handleServiceDetailedUpdated - - event: ProposalCreated(uint256,uint256,string,uint8,address,uint256,uint256,uint256) + - event: ServiceUpdated(uint256,string,uint256) + handler: handleServiceUpdated + - event: ProposalCreated(uint256,uint256,string,uint8,uint256,uint256,uint256,uint256) handler: handleProposalCreated - - event: ProposalUpdated(uint256,uint256,string,address,uint256,uint256) + - event: ProposalUpdated(uint256,uint256,string,uint256,uint256,uint256) handler: handleProposalUpdated - event: AllowedTokenListUpdated(address,bool,uint256) handler: handleAllowedTokenListUpdated - event: MinCompletionPercentageUpdated(uint256) handler: handleMinCompletionPercentageUpdated + # Legacy events + - event: ServiceCreated(uint256,uint256,uint256,string) + handler: handleServiceCreatedV1 + - event: ServiceDetailedUpdated(indexed uint256,string) + handler: handleServiceDetailedUpdated + - event: ProposalCreated(uint256,uint256,string,uint8,address,uint256,uint256,uint256) + handler: handleProposalCreatedV1 + - event: ProposalUpdated(uint256,uint256,string,address,uint256,uint256) + handler: handleProposalUpdatedV1 file: ./src/mappings/talent-layer-service.ts - kind: ethereum/contract name: TalentLayerEscrow @@ -123,6 +133,10 @@ dataSources: - FeePayment - FeeClaim - PlatformGain + - Evidence + - ReferralBalanceClaim + - ReferralGain + - UserGain abis: - name: TalentLayerEscrow file: ./abis/TalentLayerEscrow.json @@ -156,6 +170,10 @@ dataSources: handler: handleEvidenceSubmitted - event: MetaEvidence(indexed uint256,string) handler: handleMetaEvidence + - event: ReferralAmountReleased(indexed uint256,uint256,indexed address,uint256) + handler: handleReferralAmountReleased + - event: ReferralAmountClaimed(uint256,indexed address,uint256) + handler: handleReferralAmountClaimed # Legacy events - event: Payment(uint256,uint8,address,uint256,uint256) handler: handlePaymentV1 @@ -264,6 +282,7 @@ templates: - UserDescription - UserWeb3mailPreferences - Keyword + - Protocol abis: - name: TalentLayerID file: ./abis/TalentLayerID.json