[ { "inputs": [ { "internalType": "contract IFNS", "name": "_fns", "type": "address" }, { "internalType": "contract IBaseRegistrar", "name": "_registrar", "type": "address" }, { "internalType": "contract IMetadataService", "name": "_metadataService", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "CannotUpgrade", "type": "error" }, { "inputs": [], "name": "IncompatibleParent", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "IncorrectTargetOwner", "type": "error" }, { "inputs": [], "name": "IncorrectTokenType", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "labelHash", "type": "bytes32" }, { "internalType": "bytes32", "name": "expectedLabelhash", "type": "bytes32" } ], "name": "LabelMismatch", "type": "error" }, { "inputs": [ { "internalType": "string", "name": "label", "type": "string" } ], "name": "LabelTooLong", "type": "error" }, { "inputs": [], "name": "LabelTooShort", "type": "error" }, { "inputs": [], "name": "NameIsNotWrapped", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "OperationProhibited", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "address", "name": "addr", "type": "address" } ], "name": "UnauthorisedAddr", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "approved", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "controller", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "active", "type": "bool" } ], "name": "ControllerChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "uint64", "name": "expiry", "type": "uint64" } ], "name": "ExpiryExtended", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "uint32", "name": "fuses", "type": "uint32" } ], "name": "FusesSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "address", "name": "owner", "type": "address" } ], "name": "NameUnwrapped", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "bytes", "name": "name", "type": "bytes" }, { "indexed": false, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": false, "internalType": "uint32", "name": "fuses", "type": "uint32" }, { "indexed": false, "internalType": "uint64", "name": "expiry", "type": "uint64" } ], "name": "NameWrapped", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "metadataService", "type": "address" } ], "name": "NewMetadataService", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "mintedDomainNames", "type": "address" } ], "name": "NewMintedDomainNames", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "nameWrapperUpgrade", "type": "address" } ], "name": "NewNameWrapperUpgrade", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "subdomainTracker", "type": "address" } ], "name": "NewSubdomainTracker", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "values", "type": "uint256[]" } ], "name": "TransferBatch", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "TransferSingle", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "value", "type": "string" }, { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "URI", "type": "event" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "_tokens", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "uint32", "name": "fuseMask", "type": "uint32" } ], "name": "allFusesBurned", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "accounts", "type": "address[]" }, { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" } ], "name": "balanceOfBatch", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "address", "name": "addr", "type": "address" } ], "name": "canExtendSubnames", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "address", "name": "addr", "type": "address" } ], "name": "canModifyName", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "controllers", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "parentNode", "type": "bytes32" }, { "internalType": "bytes32", "name": "labelhash", "type": "bytes32" }, { "internalType": "uint64", "name": "expiry", "type": "uint64" } ], "name": "extendExpiry", "outputs": [ { "internalType": "uint64", "name": "", "type": "uint64" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "fns", "outputs": [ { "internalType": "contract IFNS", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "operator", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "getData", "outputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint32", "name": "fuses", "type": "uint32" }, { "internalType": "uint64", "name": "expiry", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "parentNode", "type": "bytes32" }, { "internalType": "bytes32", "name": "labelhash", "type": "bytes32" } ], "name": "isWrapped", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "isWrapped", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "metadataService", "outputs": [ { "internalType": "contract IMetadataService", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "mintedDomainNamesContract", "outputs": [ { "internalType": "contract IMintedDomainNames", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "names", "outputs": [ { "internalType": "bytes", "name": "", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "address", "name": "", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "onERC721Received", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "ownerOf", "outputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_token", "type": "address" }, { "internalType": "address", "name": "_to", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "recoverFunds", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "label", "type": "string" }, { "internalType": "address", "name": "wrappedOwner", "type": "address" }, { "internalType": "uint256", "name": "duration", "type": "uint256" }, { "internalType": "address", "name": "resolver", "type": "address" }, { "internalType": "uint16", "name": "ownerControlledFuses", "type": "uint16" } ], "name": "registerAndWrapETH2LD", "outputs": [ { "internalType": "uint256", "name": "registrarExpiry", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "registrar", "outputs": [ { "internalType": "contract IBaseRegistrar", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "duration", "type": "uint256" } ], "name": "renew", "outputs": [ { "internalType": "uint256", "name": "expires", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeBatchTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "parentNode", "type": "bytes32" }, { "internalType": "bytes32", "name": "labelhash", "type": "bytes32" }, { "internalType": "uint32", "name": "fuses", "type": "uint32" }, { "internalType": "uint64", "name": "expiry", "type": "uint64" } ], "name": "setChildFuses", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "controller", "type": "address" }, { "internalType": "bool", "name": "active", "type": "bool" } ], "name": "setController", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "uint16", "name": "ownerControlledFuses", "type": "uint16" } ], "name": "setFuses", "outputs": [ { "internalType": "uint32", "name": "", "type": "uint32" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IMetadataService", "name": "_metadataService", "type": "address" } ], "name": "setMetadataService", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "resolver", "type": "address" }, { "internalType": "uint64", "name": "ttl", "type": "uint64" } ], "name": "setRecord", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "address", "name": "resolver", "type": "address" } ], "name": "setResolver", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "parentNode", "type": "bytes32" }, { "internalType": "string", "name": "label", "type": "string" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint32", "name": "fuses", "type": "uint32" }, { "internalType": "uint64", "name": "expiry", "type": "uint64" } ], "name": "setSubnodeOwner", "outputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "parentNode", "type": "bytes32" }, { "internalType": "string", "name": "label", "type": "string" }, { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "resolver", "type": "address" }, { "internalType": "uint64", "name": "ttl", "type": "uint64" }, { "internalType": "uint32", "name": "fuses", "type": "uint32" }, { "internalType": "uint64", "name": "expiry", "type": "uint64" } ], "name": "setSubnodeRecord", "outputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "uint64", "name": "ttl", "type": "uint64" } ], "name": "setTTL", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract INameWrapperUpgrade", "name": "_upgradeAddress", "type": "address" } ], "name": "setUpgradeContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "subdomainTrackerContract", "outputs": [ { "internalType": "contract ISubdomainTracker", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "parentNode", "type": "bytes32" }, { "internalType": "bytes32", "name": "labelhash", "type": "bytes32" }, { "internalType": "address", "name": "controller", "type": "address" } ], "name": "unwrap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "labelhash", "type": "bytes32" }, { "internalType": "address", "name": "registrant", "type": "address" }, { "internalType": "address", "name": "controller", "type": "address" } ], "name": "unwrapETH2LD", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IMintedDomainNames", "name": "newContract", "type": "address" } ], "name": "updateMintedDomainNamesContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract ISubdomainTracker", "name": "newContract", "type": "address" } ], "name": "updateSubdomainTrackerContract", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "name", "type": "bytes" }, { "internalType": "bytes", "name": "extraData", "type": "bytes" } ], "name": "upgrade", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "upgradeContract", "outputs": [ { "internalType": "contract INameWrapperUpgrade", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "uri", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "name", "type": "bytes" }, { "internalType": "address", "name": "wrappedOwner", "type": "address" }, { "internalType": "address", "name": "resolver", "type": "address" } ], "name": "wrap", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "label", "type": "string" }, { "internalType": "address", "name": "wrappedOwner", "type": "address" }, { "internalType": "uint16", "name": "ownerControlledFuses", "type": "uint16" }, { "internalType": "address", "name": "resolver", "type": "address" } ], "name": "wrapETH2LD", "outputs": [ { "internalType": "uint64", "name": "expiry", "type": "uint64" } ], "stateMutability": "nonpayable", "type": "function" } ]
60c06040523480156200001157600080fd5b5060405162006089380380620060898339810160408190526200003491620001f2565b6200003f3362000189565b6001600160a01b0383811660805282811660a052600580546001600160a01b031916918316919091179055600163fffeffff60a01b03197f562b058424708d1cc63365df5e0ce7c26f300a66f97c525e61f7ef1a79a526678190557fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb4955604080518082019091526001815260006020808301829052908052600690527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f890620001099082620002eb565b5060408051808201909152600581526301b3363960e11b6020808301919091527ffd9ed02f44147ba87d942b154c98562d831e3a24daea862ee12868ac20f7bcc3600052600690527f8d6837ac7902d386c21252693d1a1311017adc13920df1ce765aca52349d8280906200017f9082620002eb565b50505050620003b7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114620001ef57600080fd5b50565b6000806000606084860312156200020857600080fd5b83516200021581620001d9565b60208501519093506200022881620001d9565b60408501519092506200023b81620001d9565b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200027157607f821691505b6020821081036200029257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002e657600081815260208120601f850160051c81016020861015620002c15750805b601f850160051c820191505b81811015620002e257828155600101620002cd565b5050505b505050565b81516001600160401b0381111562000307576200030762000246565b6200031f816200031884546200025c565b8462000298565b602080601f8311600181146200035757600084156200033e5750858301515b600019600386901b1c1916600185901b178555620002e2565b600085815260208120601f198616915b82811015620003885788860151825594840194600190910190840162000367565b5085821015620003a75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051615bc5620004c4600039600081816104df01528181610ba601528181610c4901528181610cd801528181611a9e01528181611b3401528181611be201528181611cb401528181611d2501528181611daa01528181611f98015281816120d201528181612204015281816123950152818161241b0152612bab01526000818161068901528181610b2c01528181610e4a01528181610fd901528181611175015281816114940152818161215701528181612289015281816124c6015281816126780152818161294901528181612e3601528181612ee401528181612f990152818161301a01528181613598015281816136eb015281816139530152613f840152615bc56000f3fe608060405234801561001057600080fd5b506004361061030b5760003560e01c8063715018a61161019d578063cf408823116100e9578063e0dba60f116100a2578063ed70554d1161007c578063ed70554d146107b2578063f242432a146107d2578063f2fde38b146107e5578063fd0cd0d9146107f857600080fd5b8063e0dba60f14610779578063e985e9c51461078c578063eb8ae5301461079f57600080fd5b8063cf408823146106f7578063d09607e51461070a578063d8c9921a1461071d578063d9a50c1214610730578063da8c229e14610743578063dba98de51461076657600080fd5b8063ac6dc93011610156578063b6bcad2611610130578063b6bcad26146106ab578063c475abff146106be578063c658e086146106d1578063c93ab3fd146106e457600080fd5b8063ac6dc9301461065e578063adf4960a14610671578063b382e4c51461068457600080fd5b8063715018a6146105f95780638b4dfa75146106015780638cf8b41e146106145780638da5cb5b14610627578063a22cb46514610638578063a40149821461064b57600080fd5b806320c38e2b1161025c57806341415eab1161021557806353095467116101ef57806353095467146105955780635d3590d5146105a85780636352211e146105bb5780636e5d6ad2146105ce57600080fd5b806341415eab1461054f5780634b0c708f146105625780634e1273f41461057557600080fd5b806320c38e2b146104b457806324c1af44146104c75780632b20e397146104da5780632eb2c2d61461050157806333c69ea914610514578063402906fc1461052757600080fd5b80630e4cd725116102c9578063150b7a02116102a3578063150b7a021461044f5780631534e1771461047b5780631896f70a1461048e5780631f4e1504146104a157600080fd5b80630e4cd725146104165780630e89341c1461042957806314ab90381461043c57600080fd5b8062fdd58e146103105780630178fe3f1461033657806301ffc9a71461037c57806306fdde031461039f578063081812fc146103d6578063095ea7b314610401575b600080fd5b61032361031e3660046147de565b61080b565b6040519081526020015b60405180910390f35b61034961034436600461480a565b6108b8565b604080516001600160a01b03909416845263ffffffff90921660208401526001600160401b03169082015260600161032d565b61038f61038a366004614839565b6108e8565b604051901515815260200161032d565b6103c96040518060400160405280600b81526020016a2730b6b2abb930b83832b960a91b81525081565b60405161032d91906148a6565b6103e96103e436600461480a565b610928565b6040516001600160a01b03909116815260200161032d565b61041461040f3660046147de565b61096d565b005b61038f6104243660046148b9565b6109b3565b6103c961043736600461480a565b610a2d565b61041461044a366004614905565b610a9f565b61046261045d366004614979565b610b99565b6040516001600160e01b0319909116815260200161032d565b6104146104893660046149eb565b610d79565b61041461049c3660046148b9565b610dcb565b6007546103e9906001600160a01b031681565b6103c96104c236600461480a565b610e81565b6103236104d5366004614ae1565b610f1b565b6103e97f000000000000000000000000000000000000000000000000000000000000000081565b61041461050f366004614c12565b6111ec565b610414610522366004614cbf565b611437565b61053a610535366004614d17565b611608565b60405163ffffffff909116815260200161032d565b61038f61055d3660046148b9565b6116a5565b6008546103e9906001600160a01b031681565b610588610583366004614d3a565b6116de565b60405161032d9190614e37565b6005546103e9906001600160a01b031681565b6104146105b6366004614e4a565b611807565b6103e96105c936600461480a565b611888565b6105e16105dc366004614e8b565b611893565b6040516001600160401b03909116815260200161032d565b6104146119c6565b61041461060f366004614ec0565b6119da565b6105e1610622366004614f02565b611b00565b6000546001600160a01b03166103e9565b610414610646366004614f8a565b611e7c565b610323610659366004614fb8565b611f52565b6009546103e9906001600160a01b031681565b61038f61067f366004615038565b61206b565b6103e97f000000000000000000000000000000000000000000000000000000000000000081565b6104146106b93660046149eb565b612090565b6103236106cc36600461505b565b612321565b6103236106df36600461507d565b61258b565b6104146106f23660046150ef565b612753565b61041461070536600461515a565b6128a6565b6104146107183660046149eb565b612a40565b61041461072b366004615192565b612a92565b61038f61073e36600461505b565b612b5b565b61038f6107513660046149eb565b60046020526000908152604090205460ff1681565b6104146107743660046149eb565b612c3a565b610414610787366004614f8a565b612c8c565b61038f61079a3660046151c0565b612cf4565b6104146107ad3660046151ee565b612d22565b6103236107c036600461480a565b60016020526000908152604090205481565b6104146107e0366004615255565b6130c6565b6104146107f33660046149eb565b613173565b61038f61080636600461480a565b6131ec565b60006001600160a01b03831661087c5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b600061088783611888565b9050836001600160a01b0316816001600160a01b0316036108ac5760019150506108b2565b60009150505b92915050565b60008181526001602052604090205460a081901c60c082901c6108dc8383836132c4565b90959094509092509050565b60006001600160e01b03198216632fc234b160e11b148061091957506001600160e01b03198216630a85bd0160e11b145b806108b257506108b2826132fa565b60008061093483611888565b90506001600160a01b03811661094d5750600092915050565b6000838152600360205260409020546001600160a01b03165b9392505050565b6000610978826108b8565b50915050603f1960408216016109a45760405163a2a7201360e01b815260048101839052602401610873565b6109ae838361334a565b505050565b60008080806109c1866108b8565b925092509250846001600160a01b0316836001600160a01b031614806109ec57506109ec8386612cf4565b80610a1057506001600160a01b038516610a0587610928565b6001600160a01b0316145b8015610a235750610a21828261345a565b155b9695505050505050565b6005546040516303a24d0760e21b8152600481018390526060916001600160a01b031690630e89341c90602401600060405180830381865afa158015610a77573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108b291908101906152bd565b81610aaa81336116a5565b610acb57803360405163cdc20ba360e01b8152600401610873929190615334565b8260106000610ad9836108b8565b5091505063ffffffff8282161615610b075760405163a2a7201360e01b815260048101849052602401610873565b604051630295720760e31b8152600481018790526001600160401b03861660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906314ab9038906044015b600060405180830381600087803b158015610b7957600080fd5b505af1158015610b8d573d6000803e3d6000fd5b50505050505050505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610be45760405163032634a760e31b815260040160405180910390fd5b6000808080610bf58688018861534b565b83516020850120939750919550935091508890808214610c32576040516331970f3360e21b81526004810182905260248101839052604401610873565b604051630a3b53db60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906328ed4f6c90610c809085903090600401615334565b600060405180830381600087803b158015610c9a57600080fd5b505af1158015610cae573d6000803e3d6000fd5b5050604051636b727d4360e11b8152600481018d9052600092506276a70091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d6e4fa8690602401602060405180830381865afa158015610d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4391906153b2565b610d4d91906153e1565b9050610d6087878761ffff16848861348a565b50630a85bd0160e11b9c9b505050505050505050505050565b610d8161360b565b600580546001600160a01b0319166001600160a01b0383169081179091556040517f66bd57ffa1d77907ace7b6244e8d35bd18daee620924ce2dbf41e6582069a74d90600090a250565b81610dd681336116a5565b610df757803360405163cdc20ba360e01b8152600401610873929190615334565b8260086000610e05836108b8565b5091505063ffffffff8282161615610e335760405163a2a7201360e01b815260048101849052602401610873565b604051630c4b7b8560e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631896f70a90610b5f9089908990600401615334565b60066020526000908152604090208054610e9a90615408565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec690615408565b8015610f135780601f10610ee857610100808354040283529160200191610f13565b820191906000526020600020905b815481529060010190602001808311610ef657829003601f168201915b505050505081565b600087610f2881336116a5565b610f4957803360405163cdc20ba360e01b8152600401610873929190615334565b87516020890120610f5a8a82613665565b9250610f668a84613691565b610f7083866137cf565b610f7b8a848b613802565b50610f888a8487876138cf565b9350610f9383613915565b611133576040516305ef2c7f60e41b8152600481018b9052602481018290523060448201526001600160a01b0388811660648301526001600160401b03881660848301527f00000000000000000000000000000000000000000000000000000000000000001690635ef2c7f09060a401600060405180830381600087803b15801561101d57600080fd5b505af1158015611031573d6000803e3d6000fd5b505050506110438a848b8b89896139ce565b600860009054906101000a90046001600160a01b03166001600160a01b031663ed9536ab898560001c88888f60001c8f6040518763ffffffff1660e01b815260040161109496959493929190615442565b600060405180830381600087803b1580156110ae57600080fd5b505af11580156110c2573d6000803e3d6000fd5b505060095460405163386ae49760e21b81526001600160a01b03909116925063e1ab925c91506110fc908d9087908d908f9060040161548a565b600060405180830381600087803b15801561111657600080fd5b505af115801561112a573d6000803e3d6000fd5b505050506111df565b6040516305ef2c7f60e41b8152600481018b9052602481018290523060448201526001600160a01b0388811660648301526001600160401b03881660848301527f00000000000000000000000000000000000000000000000000000000000000001690635ef2c7f09060a401600060405180830381600087803b1580156111b957600080fd5b505af11580156111cd573d6000803e3d6000fd5b505050506111df8a848b8b8989613a05565b5050979650505050505050565b815183511461124e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610873565b6001600160a01b0384166112745760405162461bcd60e51b8152600401610873906154b7565b6001600160a01b03851633148061129057506112908533612cf4565b6112f75760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610873565b60005b83518110156113ca576000848281518110611317576113176154fc565b602002602001015190506000848381518110611335576113356154fc565b60200260200101519050600080600061134d856108b8565b92509250925061135e858383613ac9565b83600114801561137f57508a6001600160a01b0316836001600160a01b0316145b61139b5760405162461bcd60e51b815260040161087390615512565b6113a7858b8484613b72565b6113b48b8b878585613bb4565b5050505050806113c39061555c565b90506112fa565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161141a929190615575565b60405180910390a4611430338686868686613c39565b5050505050565b60006114438585613665565b905061144f81846137cf565b6000808061145c846108b8565b919450925090506001600160a01b038316158061150b57506040516302571be360e01b81526004810185905230906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa1580156114db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ff91906155a3565b6001600160a01b031614155b1561152957604051635374b59960e01b815260040160405180910390fd5b6000806115358a6108b8565b90935091508a90506115715761154b86336116a5565b61156c57853360405163cdc20ba360e01b8152600401610873929190615334565b61159c565b61157b8a336116a5565b61159c57893360405163cdc20ba360e01b8152600401610873929190615334565b6115a7868984613d94565b6115b2878483613dcf565b9650620100008416158015906115d657508363ffffffff1688851763ffffffff1614155b156115f75760405163a2a7201360e01b815260048101879052602401610873565b96831796610b8d86868a868b613e15565b60008261161581336116a5565b61163657803360405163cdc20ba360e01b8152600401610873929190615334565b8360026000611644836108b8565b5091505063ffffffff82821616156116725760405163a2a7201360e01b815260048101849052602401610873565b6000808061167f8a6108b8565b9250925092506116988a84848c61ffff16178485613e15565b5098975050505050505050565b60008080806116b3866108b8565b925092509250846001600160a01b0316836001600160a01b03161480610a105750610a108386612cf4565b606081518351146117435760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610873565b600083516001600160401b0381111561175e5761175e614a08565b604051908082528060200260200182016040528015611787578160200160208202803683370190505b50905060005b84518110156117ff576117d28582815181106117ab576117ab6154fc565b60200260200101518583815181106117c5576117c56154fc565b602002602001015161080b565b8282815181106117e4576117e46154fc565b60209081029190910101526117f88161555c565b905061178d565b509392505050565b61180f61360b565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af115801561185e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188291906155c0565b50505050565b60006108b282613ebc565b6000806118a08585613665565b90506118ab81613915565b6118c857604051635374b59960e01b815260040160405180910390fd5b60006118d486336109b3565b9050801580156118eb57506118e982336116a5565b155b1561190d57813360405163cdc20ba360e01b8152600401610873929190615334565b6000808061191a856108b8565b925092509250831580156119315750620400008216155b156119525760405163a2a7201360e01b815260048101869052602401610873565b600061195d8a6108b8565b9250505061196c888383613dcf565b975061197a8685858b613ed2565b6040516001600160401b038916815286907ff675815a0817338f93a7da433f6bd5f5542f1029b11b455191ac96c7f6a9b1329060200160405180910390a2509598975050505050505050565b6119ce61360b565b6119d86000613ee8565b565b6119f2600080516020615b7083398151915284613665565b6119fc81336116a5565b611a1d57803360405163cdc20ba360e01b8152600401610873929190615334565b306001600160a01b03841603611a5157604051632ca49b0d60e11b81526001600160a01b0384166004820152602401610873565b611a72611a6c600080516020615b7083398151915286613665565b83613f38565b604051632142170760e11b81523060048201526001600160a01b038481166024830152604482018690527f000000000000000000000000000000000000000000000000000000000000000016906342842e0e90606401600060405180830381600087803b158015611ae257600080fd5b505af1158015611af6573d6000803e3d6000fd5b5050505050505050565b6000808686604051611b139291906155dd565b6040519081900381206331a9108f60e11b82526004820181905291506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba791906155a3565b90506001600160a01b0381163314801590611c4f575060405163e985e9c560e01b81526001600160a01b0382811660048301523360248301527f0000000000000000000000000000000000000000000000000000000000000000169063e985e9c590604401602060405180830381865afa158015611c29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4d91906155c0565b155b15611c8857611c6c600080516020615b7083398151915283613665565b3360405163cdc20ba360e01b8152600401610873929190615334565b6040516323b872dd60e01b81526001600160a01b038281166004830152306024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b158015611cf857600080fd5b505af1158015611d0c573d6000803e3d6000fd5b5050604051630a3b53db60e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692506328ed4f6c9150611d5e9085903090600401615334565b600060405180830381600087803b158015611d7857600080fd5b505af1158015611d8c573d6000803e3d6000fd5b5050604051636b727d4360e11b8152600481018590526276a70092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316915063d6e4fa8690602401602060405180830381865afa158015611dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1e91906153b2565b611e2891906153e1565b9250611e7188888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250505061ffff8816868861348a565b505095945050505050565b6001600160a01b0382163303611ee65760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610873565b3360008181526002602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b3360009081526004602052604081205460ff16611f815760405162461bcd60e51b8152600401610873906155ed565b60405163d393c87160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d393c87190611fd3908a908a9030908a9060040161565e565b6020604051808303816000875af1158015611ff2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201691906153b2565b9050610a2387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250899250505061ffff85166120656276a700866153e1565b8761348a565b600080612077846108b8565b50841663ffffffff908116908516149250505092915050565b61209861360b565b6007546001600160a01b0316156121b85760075460405163a22cb46560e01b81526001600160a01b039182166004820152600060248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a22cb46590604401600060405180830381600087803b15801561211857600080fd5b505af115801561212c573d6000803e3d6000fd5b505060075460405163a22cb46560e01b81526001600160a01b039182166004820152600060248201527f0000000000000000000000000000000000000000000000000000000000000000909116925063a22cb4659150604401600060405180830381600087803b15801561219f57600080fd5b505af11580156121b3573d6000803e3d6000fd5b505050505b600780546001600160a01b0319166001600160a01b038316908117909155156122ea5760075460405163a22cb46560e01b81526001600160a01b039182166004820152600160248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a22cb46590604401600060405180830381600087803b15801561224a57600080fd5b505af115801561225e573d6000803e3d6000fd5b505060075460405163a22cb46560e01b81526001600160a01b039182166004820152600160248201527f0000000000000000000000000000000000000000000000000000000000000000909116925063a22cb4659150604401600060405180830381600087803b1580156122d157600080fd5b505af11580156122e5573d6000803e3d6000fd5b505050505b6040516001600160a01b038216907f75a9c474807c8df7d8a86b56e78418f0d29e7454dde63a1a2809f4b2569f1fae90600090a250565b3360009081526004602052604081205460ff166123505760405162461bcd60e51b8152600401610873906155ed565b600061236a600080516020615b7083398151915285613665565b60405163c475abff60e01b815260048101869052602481018590529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c475abff906044016020604051808303816000875af11580156123de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240291906153b2565b6040516331a9108f60e11b8152600481018790529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa925050508015612486575060408051601f3d908101601f19168201909252612483918101906155a3565b60015b6124935791506108b29050565b6001600160a01b0381163014158061253d57506040516302571be360e01b81526004810184905230906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa15801561250d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253191906155a3565b6001600160a01b031614155b1561254c575091506108b29050565b50600061255c6276a700836153e1565b60008481526001602052604090205490915060a081901c61257f85838386613ed2565b50919695505050505050565b60008661259881336116a5565b6125b957803360405163cdc20ba360e01b8152600401610873929190615334565b600087876040516125cb9291906155dd565b604051809103902090506125df8982613665565b92506125eb8984613691565b6125f583866137cf565b60006126388a858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061380292505050565b90506126468a8588886138cf565b945061265184613915565b612700576040516306ab592360e01b8152600481018b9052602481018390523060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906306ab5923906064016020604051808303816000875af11580156126c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ed91906153b2565b506126fb8482898989614028565b612746565b6127468a858b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c91508b9050613a05565b5050509695505050505050565b6000612799600086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061406a9050565b6007549091506001600160a01b03166127c55760405163093075b560e21b815260040160405180910390fd5b6127cf81336116a5565b6127f057803360405163cdc20ba360e01b8152600401610873929190615334565b600080806127fd846108b8565b91945092509050600061280f85610928565b905061281a85614129565b600760009054906101000a90046001600160a01b03166001600160a01b0316639198c2768a8a878787878e8e6040518963ffffffff1660e01b815260040161286998979695949392919061568e565b600060405180830381600087803b15801561288357600080fd5b505af1158015612897573d6000803e3d6000fd5b50505050505050505050505050565b836128b181336116a5565b6128d257803360405163cdc20ba360e01b8152600401610873929190615334565b84601c60006128e0836108b8565b5091505063ffffffff828216161561290e5760405163a2a7201360e01b815260048101849052602401610873565b60405163cf40882360e01b8152600481018990523060248201526001600160a01b0387811660448301526001600160401b03871660648301527f0000000000000000000000000000000000000000000000000000000000000000169063cf40882390608401600060405180830381600087803b15801561298d57600080fd5b505af11580156129a1573d6000803e3d6000fd5b5050506001600160a01b0388169050612a085760006129bf896108b8565b509150506201ffff19620200008216016129f757604051632ca49b0d60e11b81526001600160a01b0389166004820152602401610873565b612a02896000613f38565b50611af6565b6000612a1389611888565b9050612a3581898b60001c6001604051806020016040528060008152506141c9565b505050505050505050565b612a4861360b565b600980546001600160a01b0319166001600160a01b0383169081179091556040517f4791076be129edc0f20e100e88854938793cbcf14c07b01a110804b8647b0be690600090a250565b612a9c8383613665565b612aa681336116a5565b612ac757803360405163cdc20ba360e01b8152600401610873929190615334565b7f02612fd0bbeb8457826bd4eab367a9d27ce1c5db251579d11ed79753df08433d8401612b075760405163615a470360e01b815260040160405180910390fd5b6001600160a01b0382161580612b2557506001600160a01b03821630145b15612b4e57604051632ca49b0d60e11b81526001600160a01b0383166004820152602401610873565b611882611a6c8585613665565b600080612b688484613665565b90506000612b7582613915565b9050600080516020615b708339815191528514612b955791506108b29050565b6040516331a9108f60e11b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa925050508015612c16575060408051601f3d908101601f19168201909252612c13918101906155a3565b60015b612c25576000925050506108b2565b6001600160a01b0316301492506108b2915050565b612c4261360b565b600880546001600160a01b0319166001600160a01b0383169081179091556040517ff33907fcc44c2b55e7e0afb1ba510b76179c40edf6f59d6d84408dd7c4b8bd8b90600090a250565b612c9461360b565b6001600160a01b038216600081815260046020908152604091829020805460ff191685151590811790915591519182527f4c97694570a07277810af7e5669ffd5f6a2d6b74b6e9a274b8b870fd5114cf8791015b60405180910390a25050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b600080612d69600087878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506142b89050565b915091506000612db28288888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061406a9050565b90506000612dc08285613665565b6000818152600660205260409020909150612ddc888a8361573c565b507f02612fd0bbeb8457826bd4eab367a9d27ce1c5db251579d11ed79753df08433d8201612e1d5760405163615a470360e01b815260040160405180910390fd5b6040516302571be360e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906302571be390602401602060405180830381865afa158015612e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ea991906155a3565b90506001600160a01b0381163314801590612f51575060405163e985e9c560e01b81526001600160a01b0382811660048301523360248301527f0000000000000000000000000000000000000000000000000000000000000000169063e985e9c590604401602060405180830381865afa158015612f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4f91906155c0565b155b15612f7357813360405163cdc20ba360e01b8152600401610873929190615334565b6001600160a01b0386161561300357604051630c4b7b8560e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631896f70a90612fd09085908a90600401615334565b600060405180830381600087803b158015612fea57600080fd5b505af1158015612ffe573d6000803e3d6000fd5b505050505b604051635b0fc9c360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635b0fc9c3906130519085903090600401615334565b600060405180830381600087803b15801561306b57600080fd5b505af115801561307f573d6000803e3d6000fd5b50505050612a35828a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508d93509150819050614028565b6001600160a01b0384166130ec5760405162461bcd60e51b8152600401610873906154b7565b6001600160a01b03851633148061310857506131088533612cf4565b6131665760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610873565b61143085858585856141c9565b61317b61360b565b6001600160a01b0381166131e05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610873565b6131e981613ee8565b50565b6000818152600660205260408120805482919061320890615408565b80601f016020809104026020016040519081016040528092919081815260200182805461323490615408565b80156132815780601f1061325657610100808354040283529160200191613281565b820191906000526020600020905b81548152906001019060200180831161326457829003601f168201915b50505050509050805160000361329a5750600092915050565b6000806132a783826142b8565b909250905060006132b8848361406a565b9050610a238184612b5b565b60008042836001600160401b031610156132f15761ffff19620100008516016132ec57600094505b600093505b50929391925050565b60006001600160e01b03198216636cdb3d1360e11b148061332b57506001600160e01b031982166303a24d0760e21b145b806108b257506301ffc9a760e01b6001600160e01b03198316146108b2565b600061335582611888565b9050806001600160a01b0316836001600160a01b0316036133c25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610873565b336001600160a01b03821614806133de57506133de8133612cf4565b6134505760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610873565b6109ae838361436f565b6000620200008381161480156109665750426134796276a700846157fb565b6001600160401b0316109392505050565b8451602086012060006134ab600080516020615b7083398151915283613665565b905060006134d5886040518060400160405280600581526020016301b3363960e11b8152506143dd565b60008381526006602052604090209091506134f0828261581b565b506008546040516344226bfd60e01b81526001600160a01b03909116906344226bfd90613529908a9086908b908b908f906004016158da565b600060405180830381600087803b15801561354357600080fd5b505af1158015613557573d6000803e3d6000fd5b5050505061357282828962020000620100008b171789614028565b6001600160a01b03841615611af657604051630c4b7b8560e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631896f70a906135cf9085908890600401615334565b600060405180830381600087803b1580156135e957600080fd5b505af11580156135fd573d6000803e3d6000fd5b505050505050505050505050565b6000546001600160a01b031633146119d85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610873565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6000808061369e846108b8565b91945092509050426001600160401b0382161080801561376157506001600160a01b038416158061376157506040516302571be360e01b8152600481018690526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa158015613732573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375691906155a3565b6001600160a01b0316145b156137a0576000613771876108b8565b50915050602081161561379a5760405163a2a7201360e01b815260048101879052602401610873565b506137c7565b620100008316156137c75760405163a2a7201360e01b815260048101869052602401610873565b505050505050565b63fffdffff81811763ffffffff16146137fe5760405163a2a7201360e01b815260048101839052602401610873565b5050565b606060006138ab8360066000888152602001908152602001600020805461382890615408565b80601f016020809104026020016040519081016040528092919081815260200182805461385490615408565b80156138a15780601f10613876576101008083540402835291602001916138a1565b820191906000526020600020905b81548152906001019060200180831161388457829003601f168201915b50505050506143dd565b60008581526006602052604090209091506138c6828261581b565b50949350505050565b6000806138db856108b8565b925050506000806138ee8860001c6108b8565b92509250506138fe878784613d94565b613909858483613dcf565b98975050505050505050565b60008061392183611888565b6001600160a01b0316141580156108b257506040516302571be360e01b81526004810183905230906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa15801561399a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139be91906155a3565b6001600160a01b03161492915050565b600086815260066020526040812080546139ed91879161382890615408565b90506139fc8682868686614028565b50505050505050565b60008080613a12886108b8565b9250925092506000613a3c88600660008d8152602001908152602001600020805461382890615408565b60008a8152600660205260409020805491925090613a5990615408565b9050600003613a7c576000898152600660205260409020613a7a828261581b565b505b613a8b89858886178589613e15565b6001600160a01b038716613aa957613aa4896000613f38565b610b8d565b610b8d84888b60001c6001604051806020016040528060008152506141c9565b6201ffff1962020000831601613ae957613ae66276a700826157fb565b90505b42816001600160401b03161015613b225762010000821615613b1d5760405162461bcd60e51b815260040161087390615512565b613b47565b6004821615613b475760405163a2a7201360e01b815260048101849052602401610873565b604082166000036109ae575050600090815260036020526040902080546001600160a01b0319169055565b60c0816001600160401b0316901b60a08363ffffffff16901b846001600160a01b03161717600160008681526020019081526020016000208190555050505050565b600854604051632a79679360e21b81526001600160a01b03878116600483015286811660248301526044820186905263ffffffff851660648301526001600160401b03841660848301529091169063a9e59e4c9060a401600060405180830381600087803b158015613c2557600080fd5b505af1158015612a35573d6000803e3d6000fd5b6001600160a01b0384163b156137c75760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190613c7d9089908990889088908890600401615927565b6020604051808303816000875af1925050508015613cb8575060408051601f3d908101601f19168201909252613cb591810190615979565b60015b613d6457613cc4615996565b806308c379a003613cfd5750613cd86159b2565b80613ce35750613cff565b8060405162461bcd60e51b815260040161087391906148a6565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610873565b6001600160e01b0319811663bc197c8160e01b146139fc5760405162461bcd60e51b815260040161087390615a3b565b63ffff00008216158015906001831615908290613dae5750805b156114305760405163a2a7201360e01b815260048101869052602401610873565b6000816001600160401b0316846001600160401b03161115613def578193505b826001600160401b0316846001600160401b03161015613e0d578293505b509192915050565b613e2185858584613ed2565b60405163ffffffff8416815285907f39873f00c80f4f94b7bd1594aebcf650f003545b74824d57ddf4939e3ff3a34b9060200160405180910390a2816001600160401b0316816001600160401b03161115611430576040516001600160401b038216815285907ff675815a0817338f93a7da433f6bd5f5542f1029b11b455191ac96c7f6a9b132906020015b60405180910390a25050505050565b600080613ec8836108b8565b5090949350505050565b613edc8483614454565b61188284848484613b72565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613f4382600161206b565b15613f645760405163a2a7201360e01b815260048101839052602401610873565b613f6d82614129565b604051635b0fc9c360e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690635b0fc9c390613fbb9085908590600401615334565b600060405180830381600087803b158015613fd557600080fd5b505af1158015613fe9573d6000803e3d6000fd5b50506040516001600160a01b03841681528492507fee2ba1195c65bcf218a83d874335c6bf9d9067b4c672f3c3bf16cf40de7586c49150602001612ce8565b6140348584848461448d565b847f8ce7013e8abebc55c3890a68f5a27c67c3f7efa64e584de5fb22363c606fd34085858585604051613ead9493929190615a83565b600080600061407985856142b8565b9092509050816140eb57600185516140919190615aca565b84146140df5760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d650000006044820152606401610873565b50600091506108b29050565b6140f5858261406a565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b60008181526001602052604090205460a081901c60c082901c61414d8383836132c4565b600086815260036020526040812080546001600160a01b031916905590935061417a915085908484613b72565b60408051858152600160208201526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050565b60008060006141d7866108b8565b9250925092506141e8868383613ac9565b8460011480156142095750876001600160a01b0316836001600160a01b0316145b6142255760405162461bcd60e51b815260040161087390615512565b866001600160a01b0316836001600160a01b03160361424657505050611430565b61425286888484613b72565b60408051878152602081018790526001600160a01b03808a1692908b169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46142aa8888888585613bb4565b611af6338989898989614501565b6000808351831061430b5760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e647300006044820152606401610873565b600084848151811061431f5761431f6154fc565b016020015160f81c9050801561434b576143448561433e866001615add565b836145bc565b9250614350565b600092505b61435a8185615add565b614365906001615add565b9150509250929050565b600081815260036020526040902080546001600160a01b0319166001600160a01b03841690811790915581906143a482611888565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606060018351101561440257604051631406d65b60e11b815260040160405180910390fd5b60ff83511115614427578260405163e3ba295f60e01b815260040161087391906148a6565b8251838360405160200161443d93929190615af0565b604051602081830303815290604052905092915050565b61ffff81161580159061446c57506201000181811614155b156137fe5760405163a2a7201360e01b815260048101839052602401610873565b6144978483614454565b6000848152600160205260409020546001600160a01b038116156144f5576144be85614129565b6040516000815285907fee2ba1195c65bcf218a83d874335c6bf9d9067b4c672f3c3bf16cf40de7586c49060200160405180910390a25b611430858585856145e0565b6001600160a01b0384163b156137c75760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906145459089908990889088908890600401615b35565b6020604051808303816000875af1925050508015614580575060408051601f3d908101601f1916820190925261457d91810190615979565b60015b61458c57613cc4615996565b6001600160e01b0319811663f23a6e6160e01b146139fc5760405162461bcd60e51b815260040161087390615a3b565b82516000906145cb8385615add565b11156145d657600080fd5b5091016020012090565b83600080806145ee846108b8565b9194509250905063ffff000082166001600160401b038087169083161115614614578195505b42826001600160401b03161061462957958617955b6001600160a01b038416156146805760405162461bcd60e51b815260206004820152601f60248201527f455243313135353a206d696e74206f66206578697374696e6720746f6b656e006044820152606401610873565b6001600160a01b0388166146e05760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610873565b306001600160a01b038916036147555760405162461bcd60e51b815260206004820152603460248201527f455243313135353a206e65774f776e65722063616e6e6f74206265207468652060448201527313985b5955dc985c1c195c8818dbdb9d1c9858dd60621b6064820152608401610873565b61476185898989613b72565b60408051868152600160208201526001600160a01b038a169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612a353360008a88600160405180602001604052806000815250614501565b6001600160a01b03811681146131e957600080fd5b600080604083850312156147f157600080fd5b82356147fc816147c9565b946020939093013593505050565b60006020828403121561481c57600080fd5b5035919050565b6001600160e01b0319811681146131e957600080fd5b60006020828403121561484b57600080fd5b813561096681614823565b60005b83811015614871578181015183820152602001614859565b50506000910152565b60008151808452614892816020860160208601614856565b601f01601f19169290920160200192915050565b602081526000610966602083018461487a565b600080604083850312156148cc57600080fd5b8235915060208301356148de816147c9565b809150509250929050565b80356001600160401b038116811461490057600080fd5b919050565b6000806040838503121561491857600080fd5b82359150614928602084016148e9565b90509250929050565b60008083601f84011261494357600080fd5b5081356001600160401b0381111561495a57600080fd5b60208301915083602082850101111561497257600080fd5b9250929050565b60008060008060006080868803121561499157600080fd5b853561499c816147c9565b945060208601356149ac816147c9565b93506040860135925060608601356001600160401b038111156149ce57600080fd5b6149da88828901614931565b969995985093965092949392505050565b6000602082840312156149fd57600080fd5b8135610966816147c9565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715614a4357614a43614a08565b6040525050565b60006001600160401b03821115614a6357614a63614a08565b50601f01601f191660200190565b600082601f830112614a8257600080fd5b8135614a8d81614a4a565b604051614a9a8282614a1e565b828152856020848701011115614aaf57600080fd5b82602086016020830137600092810160200192909252509392505050565b803563ffffffff8116811461490057600080fd5b600080600080600080600060e0888a031215614afc57600080fd5b8735965060208801356001600160401b03811115614b1957600080fd5b614b258a828b01614a71565b9650506040880135614b36816147c9565b94506060880135614b46816147c9565b9350614b54608089016148e9565b9250614b6260a08901614acd565b9150614b7060c089016148e9565b905092959891949750929550565b60006001600160401b03821115614b9757614b97614a08565b5060051b60200190565b600082601f830112614bb257600080fd5b81356020614bbf82614b7e565b604051614bcc8282614a1e565b83815260059390931b8501820192828101915086841115614bec57600080fd5b8286015b84811015614c075780358352918301918301614bf0565b509695505050505050565b600080600080600060a08688031215614c2a57600080fd5b8535614c35816147c9565b94506020860135614c45816147c9565b935060408601356001600160401b0380821115614c6157600080fd5b614c6d89838a01614ba1565b94506060880135915080821115614c8357600080fd5b614c8f89838a01614ba1565b93506080880135915080821115614ca557600080fd5b50614cb288828901614a71565b9150509295509295909350565b60008060008060808587031215614cd557600080fd5b8435935060208501359250614cec60408601614acd565b9150614cfa606086016148e9565b905092959194509250565b803561ffff8116811461490057600080fd5b60008060408385031215614d2a57600080fd5b8235915061492860208401614d05565b60008060408385031215614d4d57600080fd5b82356001600160401b0380821115614d6457600080fd5b818501915085601f830112614d7857600080fd5b81356020614d8582614b7e565b604051614d928282614a1e565b83815260059390931b8501820192828101915089841115614db257600080fd5b948201945b83861015614dd9578535614dca816147c9565b82529482019490820190614db7565b96505086013592505080821115614def57600080fd5b5061436585828601614ba1565b600081518084526020808501945080840160005b83811015614e2c57815187529582019590820190600101614e10565b509495945050505050565b6020815260006109666020830184614dfc565b600080600060608486031215614e5f57600080fd5b8335614e6a816147c9565b92506020840135614e7a816147c9565b929592945050506040919091013590565b600080600060608486031215614ea057600080fd5b8335925060208401359150614eb7604085016148e9565b90509250925092565b600080600060608486031215614ed557600080fd5b833592506020840135614ee7816147c9565b91506040840135614ef7816147c9565b809150509250925092565b600080600080600060808688031215614f1a57600080fd5b85356001600160401b03811115614f3057600080fd5b614f3c88828901614931565b9096509450506020860135614f50816147c9565b9250614f5e60408701614d05565b91506060860135614f6e816147c9565b809150509295509295909350565b80151581146131e957600080fd5b60008060408385031215614f9d57600080fd5b8235614fa8816147c9565b915060208301356148de81614f7c565b60008060008060008060a08789031215614fd157600080fd5b86356001600160401b03811115614fe757600080fd5b614ff389828a01614931565b9097509550506020870135615007816147c9565b935060408701359250606087013561501e816147c9565b915061502c60808801614d05565b90509295509295509295565b6000806040838503121561504b57600080fd5b8235915061492860208401614acd565b6000806040838503121561506e57600080fd5b50508035926020909101359150565b60008060008060008060a0878903121561509657600080fd5b8635955060208701356001600160401b038111156150b357600080fd5b6150bf89828a01614931565b90965094505060408701356150d3816147c9565b92506150e160608801614acd565b915061502c608088016148e9565b6000806000806040858703121561510557600080fd5b84356001600160401b038082111561511c57600080fd5b61512888838901614931565b9096509450602087013591508082111561514157600080fd5b5061514e87828801614931565b95989497509550505050565b6000806000806080858703121561517057600080fd5b843593506020850135615182816147c9565b92506040850135614cec816147c9565b6000806000606084860312156151a757600080fd5b83359250602084013591506040840135614ef7816147c9565b600080604083850312156151d357600080fd5b82356151de816147c9565b915060208301356148de816147c9565b6000806000806060858703121561520457600080fd5b84356001600160401b0381111561521a57600080fd5b61522687828801614931565b909550935050602085013561523a816147c9565b9150604085013561524a816147c9565b939692955090935050565b600080600080600060a0868803121561526d57600080fd5b8535615278816147c9565b94506020860135615288816147c9565b9350604086013592506060860135915060808601356001600160401b038111156152b157600080fd5b614cb288828901614a71565b6000602082840312156152cf57600080fd5b81516001600160401b038111156152e557600080fd5b8201601f810184136152f657600080fd5b805161530181614a4a565b60405161530e8282614a1e565b82815286602084860101111561532357600080fd5b610a23836020830160208701614856565b9182526001600160a01b0316602082015260400190565b6000806000806080858703121561536157600080fd5b84356001600160401b0381111561537757600080fd5b61538387828801614a71565b9450506020850135615394816147c9565b92506153a260408601614d05565b9150606085013561524a816147c9565b6000602082840312156153c457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6001600160401b03818116838216019080821115615401576154016153cb565b5092915050565b600181811c9082168061541c57607f821691505b60208210810361543c57634e487b7160e01b600052602260045260246000fd5b50919050565b60018060a01b038716815285602082015263ffffffff851660408201526001600160401b038416606082015282608082015260c060a0820152600061390960c083018461487a565b84815283602082015260018060a01b0383166040820152608060608201526000610a23608083018461487a565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60006001820161556e5761556e6153cb565b5060010190565b6040815260006155886040830185614dfc565b828103602084015261559a8185614dfc565b95945050505050565b6000602082840312156155b557600080fd5b8151610966816147c9565b6000602082840312156155d257600080fd5b815161096681614f7c565b8183823760009101908152919050565b60208082526028908201527f436f6e74726f6c6c61626c653a2043616c6c6572206973206e6f74206120636f604082015267373a3937b63632b960c11b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b606081526000615672606083018688615635565b6001600160a01b03949094166020830152506040015292915050565b60c0815260006156a260c083018a8c615635565b6001600160a01b03898116602085015263ffffffff891660408501526001600160401b03881660608501528616608084015282810360a08401526156e7818587615635565b9b9a5050505050505050505050565b601f8211156109ae57600081815260208120601f850160051c8101602086101561571d5750805b601f850160051c820191505b818110156137c757828155600101615729565b6001600160401b0383111561575357615753614a08565b615767836157618354615408565b836156f6565b6000601f84116001811461579b57600085156157835750838201355b600019600387901b1c1916600186901b178355611430565b600083815260209020601f19861690835b828110156157cc57868501358255602094850194600190920191016157ac565b50868210156157e95760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6001600160401b03828116828216039080821115615401576154016153cb565b81516001600160401b0381111561583457615834614a08565b615848816158428454615408565b846156f6565b602080601f83116001811461587d57600084156158655750858301515b600019600386901b1c1916600185901b1785556137c7565b600085815260208120601f198616915b828110156158ac5788860151825594840194600190910190840161588d565b50858210156158ca5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60018060a01b038616815284602082015263ffffffff841660408201526001600160401b038316606082015260a06080820152600061591c60a083018461487a565b979650505050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061595390830186614dfc565b82810360608401526159658186614dfc565b90508281036080840152613909818561487a565b60006020828403121561598b57600080fd5b815161096681614823565b600060033d11156159af5760046000803e5060005160e01c5b90565b600060443d10156159c05790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156159ef57505050505090565b8285019150815181811115615a075750505050505090565b843d8701016020828501011115615a215750505050505090565b615a3060208286010187614a1e565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b608081526000615a96608083018761487a565b6001600160a01b039590951660208301525063ffffffff9290921660408301526001600160401b0316606090910152919050565b818103818111156108b2576108b26153cb565b808201808211156108b2576108b26153cb565b60ff60f81b8460f81b16815260008351615b11816001850160208801614856565b835190830190615b28816001840160208801614856565b0160010195945050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061591c9083018461487a56fefd9ed02f44147ba87d942b154c98562d831e3a24daea862ee12868ac20f7bcc3a2646970667358221220db461ff299a54de5af6435eea285e04b95cfff684c3aa2a4d530d5d0e0cb498364736f6c63430008120033000000000000000000000000f0bde857e2b2df2318f5ad32ee5c2fc7aa38f378000000000000000000000000349e9b66b5546fc9449e38dd6b0eb47f8fcffffe000000000000000000000000559a5252bf2ab9574484deb659113f05d585416f