UNPKG

@lukso/lsp8-contracts

Version:

Package for the LSP8 Identifiable Digital Asset standard

1,352 lines 101 kB
{ "_format": "hh3-artifact-1", "contractName": "LSP8Mintable", "sourceName": "contracts/presets/LSP8Mintable.sol", "abi": [ { "inputs": [ { "internalType": "string", "name": "name_", "type": "string" }, { "internalType": "string", "name": "symbol_", "type": "string" }, { "internalType": "address", "name": "newOwner_", "type": "address" }, { "internalType": "uint256", "name": "lsp4TokenType_", "type": "uint256" }, { "internalType": "uint256", "name": "lsp8TokenIdFormat_", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AccessControlBadConfirmation", "type": "error" }, { "inputs": [], "name": "AccessControlCannotSetAdminForDefaultAdminRole", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "neededRole", "type": "bytes32" } ], "name": "AccessControlUnauthorizedAccount", "type": "error" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesEmptyArray", "type": "error" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesLengthMismatch", "type": "error" }, { "inputs": [], "name": "ERC725Y_MsgValueDisallowed", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "storedData", "type": "bytes" } ], "name": "InvalidExtensionAddress", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "InvalidFunctionSelector", "type": "error" }, { "inputs": [], "name": "LSP4TokenNameNotEditable", "type": "error" }, { "inputs": [], "name": "LSP4TokenSymbolNotEditable", "type": "error" }, { "inputs": [], "name": "LSP4TokenTypeNotEditable", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "callIndex", "type": "uint256" } ], "name": "LSP8BatchCallFailed", "type": "error" }, { "inputs": [], "name": "LSP8CannotSendToAddressZero", "type": "error" }, { "inputs": [], "name": "LSP8CannotUseAddressZeroAsOperator", "type": "error" }, { "inputs": [], "name": "LSP8InvalidTransferBatch", "type": "error" }, { "inputs": [], "name": "LSP8MintDisabled", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" } ], "name": "LSP8NonExistentTokenId", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" } ], "name": "LSP8NonExistingOperator", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "internalType": "address", "name": "caller", "type": "address" } ], "name": "LSP8NotTokenOperator", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "internalType": "address", "name": "caller", "type": "address" } ], "name": "LSP8NotTokenOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenReceiver", "type": "address" } ], "name": "LSP8NotifyTokenReceiverContractMissingLSP1Interface", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenReceiver", "type": "address" } ], "name": "LSP8NotifyTokenReceiverIsEOA", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" } ], "name": "LSP8OperatorAlreadyAuthorized", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" } ], "name": "LSP8RevokeOperatorNotAuthorized", "type": "error" }, { "inputs": [], "name": "LSP8TokenContractCannotHoldValue", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" } ], "name": "LSP8TokenIdAlreadyMinted", "type": "error" }, { "inputs": [], "name": "LSP8TokenIdFormatNotEditable", "type": "error" }, { "inputs": [], "name": "LSP8TokenIdsDataEmptyArray", "type": "error" }, { "inputs": [], "name": "LSP8TokenIdsDataLengthMismatch", "type": "error" }, { "inputs": [], "name": "LSP8TokenOwnerCannotBeOperator", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "internalType": "address", "name": "oldOwner", "type": "address" }, { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "LSP8TokenOwnerChanged", "type": "error" }, { "inputs": [ { "internalType": "bytes4", "name": "functionSelector", "type": "bytes4" } ], "name": "NoExtensionFoundForFunctionSelector", "type": "error" }, { "inputs": [], "name": "OwnableCannotSetZeroAddressAsOwner", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "indexed": false, "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "DataChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bool", "name": "enabled", "type": "bool" } ], "name": "MintingStatusChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOwner", "type": "address" }, { "indexed": true, "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "indexed": false, "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "OperatorAuthorizationChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOwner", "type": "address" }, { "indexed": true, "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "indexed": false, "internalType": "bool", "name": "notified", "type": "bool" }, { "indexed": false, "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "OperatorRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } ], "name": "RoleAdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleGranted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "indexed": false, "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "TokenIdDataChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "indexed": false, "internalType": "bool", "name": "force", "type": "bool" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "Transfer", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MINTER_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "authorizeOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "batchCalls", "outputs": [ { "internalType": "bytes[]", "name": "results", "type": "bytes[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "disableMinting", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" } ], "name": "getData", "outputs": [ { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" } ], "name": "getDataBatch", "outputs": [ { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "tokenIds", "type": "bytes32[]" }, { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" } ], "name": "getDataBatchForTokenIds", "outputs": [ { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" } ], "name": "getDataForTokenId", "outputs": [ { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" } ], "name": "getOperatorsOf", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleAdmin", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "getRoleMember", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleMemberCount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" } ], "name": "getRoleMembers", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "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": [], "name": "isMintable", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" } ], "name": "isOperatorFor", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "internalType": "bool", "name": "force", "type": "bool" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "callerConfirmation", "type": "address" } ], "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "internalType": "bool", "name": "notify", "type": "bool" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "revokeOperator", "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": "address", "name": "account", "type": "address" } ], "name": "rolesOf", "outputs": [ { "internalType": "bytes32[]", "name": "", "type": "bytes32[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "setData", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" }, { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "name": "setDataBatch", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "tokenIds", "type": "bytes32[]" }, { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" }, { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "name": "setDataBatchForTokenIds", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "setDataForTokenId", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "bytes32", "name": "adminRole", "type": "bytes32" } ], "name": "setRoleAdmin", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "tokenIdsOf", "outputs": [ { "internalType": "bytes32[]", "name": "", "type": "bytes32[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" } ], "name": "tokenOwnerOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "bytes32", "name": "tokenId", "type": "bytes32" }, { "internalType": "bool", "name": "force", "type": "bool" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "transfer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "from", "type": "address[]" }, { "internalType": "address[]", "name": "to", "type": "address[]" }, { "internalType": "bytes32[]", "name": "tokenId", "type": "bytes32[]" }, { "internalType": "bool[]", "name": "force", "type": "bool[]" }, { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "transferBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x608060405234801561000f575f5ffd5b50604051614c42380380614c4283398101604081905261002e91610825565b6001858585858584848484816100433361022e565b6001600160a01b03811661006a576040516306b620db60e21b815260040160405180910390fd5b61007381610251565b506040805180820190915260048152632936598960e21b60208201526100ba907feafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c906102a0565b6100e47fdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af1856102a0565b61010e7f2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db932756846102a0565b6040805160208101839052610155917fe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3910160408051601f198184030181529190526102a0565b505060408051602081018590526101a093507ff675e9361af1c1664c1868cfa3eb97672d6b1a513aa5b81dec34c9ee330e818d92500160408051601f198184030181529190526102f4565b506101c293505f92506101bd9150505f546001600160a01b031690565b6103b4565b6009805460ff19168215159081179091556040517f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4905f90a28015610223576102235f516020614c225f395f51905f526101bd5f546001600160a01b031690565b505050505050610a73565b6102455f516020614c225f395f51905f525f610432565b61024e81610497565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8281526001602052604090206102b7828261093d565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516102e891906109f7565b60405180910390a25050565b7f2145e1d6d074577dc71ef54c3807742b41b053a9352ae6b491331509acb9750f8201610334576040516385c169bd60e01b815260040160405180910390fd5b7fd0f59754f88971fe6bc5a6618cc9d5f1e859c58d16b22d1c7b2d3e2b246cd8aa820161037457604051630eceab6760e31b815260040160405180910390fd5b7f1fd9e056a24d14c4abc642fcc325992a946906d0dbc57dd70278aaf12842024d82016102a057604051634ef6d7fb60e01b815260040160405180910390fd5b5f8281526007602052604081206103cb908361052d565b9050801561042d576001600160a01b0382165f9081526008602052604090206103f4908461054a565b5060405133906001600160a01b0384169085907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45b505050565b816104505760405163d0dc904b60e01b815260040160405180910390fd5b5f82815260066020526040808220805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b5f546001600160a01b03166104ab82610251565b6001600160a01b0381165f9081526008602052604081206104cb90610555565b90505f5b8151811015610527575f8282815181106104eb576104eb610a2c565b60200260200101519050610505818561056860201b60201c565b6001600160a01b0385161561051e5761051e81866103b4565b506001016104cf565b50505050565b5f610541836001600160a01b0384166105e5565b90505b92915050565b5f61054183836105e5565b60605f61056183610631565b9392505050565b5f82815260076020526040812061057f908361068a565b9050801561042d576001600160a01b0382165f9081526008602052604090206105a8908461069e565b5060405133906001600160a01b0384169085907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a4505050565b5f81815260018301602052604081205461062a57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610544565b505f610544565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561067e57602002820191905f5260205f20905b81548152602001906001019080831161066a575b50505050509050919050565b5f610541836001600160a01b0384166106a5565b5f61054183835b5f818152600183016020526040812054801561077f575f6106c7600183610a40565b85549091505f906106da90600190610a40565b9050818114610739575f865f0182815481106106f8576106f8610a2c565b905f5260205f200154905080875f01848154811061071857610718610a2c565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061074a5761074a610a5f565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610544565b5f915050610544565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126107ab575f5ffd5b81516001600160401b038111156107c4576107c4610788565b604051601f8201601f19908116603f011681016001600160401b03811182821017156107f2576107f2610788565b604052818152838201602001851015610809575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f60a08688031215610839575f5ffd5b85516001600160401b0381111561084e575f5ffd5b61085a8882890161079c565b602088015190965090506001600160401b03811115610877575f5ffd5b6108838882890161079c565b604088015190955090506001600160a01b03811681146108a1575f5ffd5b6060870151608090970151959894975095949392505050565b600181811c908216806108ce57607f821691505b6020821081036108ec57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561042d57805f5260205f20601f840160051c810160208510156109175750805b601f840160051c820191505b81811015610936575f8155600101610923565b5050505050565b81516001600160401b0381111561095657610956610788565b61096a8161096484546108ba565b846108f2565b6020601f82116001811461099c575f83156109855750848201515b5f19600385901b1c1916600184901b178455610936565b5f84815260208120601f198516915b828110156109cb57878501518255602094850194600190920191016109ab565b50848210156109e857868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561054457634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b6141a280610a805f395ff3fe608060405260043610610288575f3560e01c80637e87632c11610152578063a3b261f2116100ca578063d547741f1161007e578063db8c966311610063578063db8c966314610804578063dedff9c614610823578063f2fde38b1461084257610313565b8063d547741f146107c6578063d6c1407c146107e557610313565b8063be9f0e6f116100af578063be9f0e6f14610755578063ca15c87314610774578063d53913931461079357610313565b8063a3b261f214610717578063af255b611461073657610313565b80639010d07c11610121578063979024211161010657806397902421146106d2578063a217fddf146106e5578063a3246ad3146106f857610313565b80639010d07c1461069457806391d14854146106b357610313565b80637e87632c1461061a5780637f23690c1461063957806386a10ddd1461064c5780638da5cb5b1461066b57610313565b80632f2ff15d1161020057806354f6127f116101b457806370a082311161019957806370a08231146105d3578063715018a6146105f25780637e5cd5c11461060657610313565b806354f6127f146105955780636963d438146105b457610313565b806346b45af7116101e557806346b45af71461053157806349a6078d1461054a578063511b69521461057657610313565b80632f2ff15d146104f357806336568abe1461051257610313565b80631e4e009111610257578063248a9ca31161023c578063248a9ca31461047d5780632a3654a4146104a85780632de94807146104c757610313565b80631e4e009114610418578063217b22701461043957610313565b806301ffc9a71461036e57806316e023b3146103a257806318160ddd146103ce5780631d26fce6146103ec57610313565b3661031357345f036102e1576040517fe5099ee30000000000000000000000000000000000000000000000000000000081526004016102d89060208082526004908201525f604082015260600190565b60405180910390fd5b6040517f61f4944200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f36606082826004811015610356576040517fe5099ee30000000000000000000000000000000000000000000000000000000081526004016102d89291906131d7565b50506103628383610861565b80519350602001915050f35b348015610379575f5ffd5b5061038d610388366004613223565b6109f6565b60405190151581526020015b60405180910390f35b3480156103ad575f5ffd5b506103c16103bc366004613262565b610a0f565b60405161039991906132ce565b3480156103d9575f5ffd5b506002545b604051908152602001610399565b3480156103f7575f5ffd5b5061040b6104063660046133e9565b610a22565b604051610399919061344e565b348015610423575f5ffd5b50610437610432366004613262565b610b22565b005b348015610444575f5ffd5b506104586104533660046134cf565b610b3b565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610399565b348015610488575f5ffd5b506103de6104973660046134cf565b5f9081526006602052604090205490565b3480156104b3575f5ffd5b5061038d6104c236600461350e565b610b9a565b3480156104d2575f5ffd5b506104e66104e1366004613536565b610ba5565b604051610399919061354f565b3480156104fe575f5ffd5b5061043761050d366004613591565b610bd5565b34801561051d575f5ffd5b5061043761052c366004613591565b610bf6565b34801561053c575f5ffd5b5060095461038d9060ff1681565b348015610555575f5ffd5b506105696105643660046134cf565b610cd2565b60405161039991906135bb565b348015610581575f5ffd5b506104376105903660046136a9565b610cf3565b3480156105a0575f5ffd5b506103c16105af3660046134cf565b610d6c565b3480156105bf575f5ffd5b5061040b6105ce36600461371d565b610d77565b3480156105de575f5ffd5b506103de6105ed366004613536565b610ebb565b3480156105fd575f5ffd5b50610437610ee8565b348015610611575f5ffd5b50610437610efb565b348015610625575f5ffd5b506104376106343660046138d1565b610f93565b6104376106473660046139a7565b611098565b348015610657575f5ffd5b506104376106663660046139e1565b6110e2565b348015610676575f5ffd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610458565b34801561069f575f5ffd5b506104586106ae366004613262565b611332565b3480156106be575f5ffd5b5061038d6106cd366004613591565b611349565b6104376106e0366004613a34565b611354565b3480156106f0575f5ffd5b506103de5f81565b348015610703575f5ffd5b506105696107123660046134cf565b61139e565b348015610722575f5ffd5b506104e6610731366004613536565b6113b7565b348015610741575f5ffd5b50610437610750366004613a8f565b6113e7565b348015610760575f5ffd5b5061043761076f366004613af3565b61141d565b34801561077f575f5ffd5b506103de61078e3660046134cf565b611516565b34801561079e575f5ffd5b506103de7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b3480156107d1575f5ffd5b506104376107e0366004613591565b61152c565b3480156107f0575f5ffd5b506104376107ff366004613b77565b6115cf565b34801561080f575f5ffd5b5061043761081e366004613a8f565b6115e2565b34801561082e575f5ffd5b5061040b61083d366004613bad565b611765565b34801561084d575f5ffd5b5061043761085c366004613536565b61180f565b60605f6108905f357fffffffff00000000000000000000000000000000000000000000000000000000166118c6565b5090507fffffffff000000000000000000000000000000000000000000000000000000005f351673ffffffffffffffffffffffffffffffffffffffff8216610929576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081527fffffffff0000000000000000000000000000000000000000000000000000000090911660048201526024016102d8565b505f5f8273ffffffffffffffffffffffffffffffffffffffff16348787333460405160200161095b9493929190613bdf565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261099391613c22565b5f6040518083038185875af1925050503d805f81146109cd576040519150601f19603f3d011682016040523d82523d5f602084013e6109d2565b606091505b509150915081156109e75792506109f0915050565b80518060208301fd5b92915050565b5f610a0082611984565b806109f057506109f082611a67565b6060610a1b8383611acb565b9392505050565b60608151835114610a5f576040517f2fa71dfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825167ffffffffffffffff811115610a7957610a796132e0565b604051908082528060200260200182016040528015610aac57816020015b6060815260200190600190039081610a975790505b5090505f5b8351811015610b1b57610af6848281518110610acf57610acf613c38565b6020026020010151848381518110610ae957610ae9613c38565b6020026020010151611acb565b828281518110610b0857610b08613c38565b6020908102919091010152600101610ab1565b5092915050565b5f610b2c81611b9e565b610b368383611ba8565b505050565b5f8181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff168281610b1b576040517fae8f9a360000000000000000000000000000000000000000000000000000000081526004016102d891815260200190565b5f610a1b8383611c26565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526008602052604090206060906109f090611c7b565b5f82815260066020526040902054610bec81611b9e565b610b368383611c87565b73ffffffffffffffffffffffffffffffffffffffff81163314610c45576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81158015610c6957505f5473ffffffffffffffffffffffffffffffffffffffff1633145b1533839091610cc2576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016102d8565b5050610cce8233611d1e565b5050565b6060610cdd82611db5565b5f8281526005602052604090206109f090611c7b565b610cfd3384611c26565b83339091610d56576040517f1294d2a9000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff1660248201526044016102d8565b5050610d658585858585611e16565b5050505050565b60606109f0826120bf565b60608167ffffffffffffffff811115610d9257610d926132e0565b604051908082528060200260200182016040528015610dc557816020015b6060815260200190600190039081610db05790505b5090505f5b82811015610b1b575f8030868685818110610de757610de7613c38565b9050602002810190610df99190613c65565b604051610e07929190613ccd565b5f60405180830381855af49150503d805f8114610e3f576040519150601f19603f3d011682016040523d82523d5f602084013e610e44565b606091505b509150915081610e9357805115610e5e5780518082602001fd5b6040517f234eb819000000000000000000000000000000000000000000000000000000008152600481018490526024016102d8565b80848481518110610ea657610ea6613c38565b60209081029190910101525050600101610dca565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526004602052604081206109f09061215e565b610ef0612167565b610ef95f6121e7565b565b610f03612167565b60095460ff16610f3f576040517f4d8af03d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040515f907f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4908290a2565b8451845181148015610fa55750835181145b8015610fb15750825181145b8015610fbd5750815181145b610ff3576040517f93a8311900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8181101561108f5761108787828151811061101257611012613c38565b602002602001015187838151811061102c5761102c613c38565b602002602001015187848151811061104657611046613c38565b602002602001015187858151811061106057611060613c38565b602002602001015187868151811061107a5761107a613c38565b6020026020010151610cf3565b600101610ff5565b50505050505050565b6110a0612167565b34156110d8576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cce828261221a565b5f6110ec83610b3b565b905080833373ffffffffffffffffffffffffffffffffffffffff83168114611169576040517f5b271ea200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9384166004820152602481019290925290911660448201526064016102d8565b50505073ffffffffffffffffffffffffffffffffffffffff84166111b9576040517f9577b8b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361121e576040517f89fdad6200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152600560205260408120611235908661227d565b905084848261128e576040517fa7626b6800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016102d8565b5050838273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f1b1b58aa2ec0cec2228b2d37124556d41f5a1f7b12f089171f896cc236671215866040516112ee91906132ce565b60405180910390a45f338560018660405160200161130f9493929190613cdc565b604051602081830303815290604052905061132a868261229e565b505050505050565b5f828152600760205260408120610a1b90836122c9565b5f610a1b83836122d4565b61135c612167565b3415611394576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cce82826122eb565b5f8181526007602052604090206060906109f090611c7b565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526004602052604090206060906109f090611c7b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661141181611b9e565b610d65858585856123af565b611425612167565b81518351148015611437575080518251145b61146d576040517f2fa71dfe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82515f036114a7576040517f80c9830500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8351811015611510576115088482815181106114c7576114c7613c38565b60200260200101518483815181106114e1576114e1613c38565b60200260200101518484815181106114fb576114fb613c38565b60200260200101516123f7565b6001016114a9565b50505050565b5f8181526007602052604081206109f09061215e565b5f8281526006602052604090205461154381611b9e565b8215801561156a57505f5473ffffffffffffffffffffffffffffffffffffffff8381169116145b15828490916115c3576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016102d8565b5050610b368383611d1e565b6115d7612167565b610b368383836123f7565b5f6115ec84610b3b565b90503373ffffffffffffffffffffffffffffffffffffffff8216146116885733818573ffffffffffffffffffffffffffffffffffffffff88168314611684576040517f760b5acd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff938416600482015292909116602483015260448201526064016102d8565b5050505b73ffffffffffffffffffffffffffffffffffffffff85166116d5576040517f9577b8b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361173a576040517f89fdad6200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117478582868686612485565b8215610d65575f81855f8560405160200161130f9493929190613cdc565b6060815167ffffffffffffffff811115611781576117816132e0565b6040519080825280602002602001820160405280156117b457816020015b606081526020019060019003908161179f5790505b5090505f5b8251811015611809576117e48382815181106117d7576117d7613c38565b60200260200101516120bf565b8282815181106117f6576117f6613c38565b60209081029190910101526001016117b9565b50919050565b611817612167565b73ffffffffffffffffffffffffffffffffffffffff81166118ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016102d8565b6118c3816121e7565b50565b5f80806119157fcee78b4094da86011096000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008616612567565b90505f611921826120bf565b905080516014148061193257508051155b819061196b576040517f42bfe79f0000000000000000000000000000000000000000000000000000000081526004016102d891906132ce565b5061197581613d22565b60601c95600195509350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480611a1657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5a05180f00000000000000000000000000000000000000000000000000000000145b806109f057507fffffffff0000000000000000000000000000000000000000000000000000000082167f90832245000000000000000000000000000000000000000000000000000000001492915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f3a271706000000000000000000000000000000000000000000000000000000001480611abc5750611abc826125ea565b806109f057506109f08261263f565b606060015f8484604051602001611aec929190918252602082015260400190565b6040516020818303038152906040528051906020012081526020019081526020015f208054611b1a90613d8e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4690613d8e565b8015611b915780601f10611b6857610100808354040283529160200191611b91565b820191905f5260205f20905b815481529060010190602001808311611b7457829003601f168201915b5050505050905092915050565b6118c3813361269a565b81611bdf576040517fd0dc904b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260066020526040808220805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b5f611c3082610b3b565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610a1b57505f828152600560205260409020610a1b90846126fc565b60605f610a1b8361272a565b5f828152600760205260408120611c9e908361227d565b90508015610b365773ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260409020611cd49084612782565b50604051339073ffffffffffffffffffffffffffffffffffffffff84169085907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a4505050565b5f828152600760205260408120611d35908361278d565b90508015610b365773ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260409020611d6b90846127ae565b50604051339073ffffffffffffffffffffffffffffffffffffffff84169085907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a4505050565b5f8181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615158190610cce576040517fae8f9a360000000000000000000000000000000000000000000000000000000081526004016102d891815260200190565b5f611e2084610b3b565b905080848773ffffffffffffffffffffffffffffffffffffffff81811690841614611ea0576040517f5b271ea200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9384166004820152602481019290925290911660448201526064016102d8565b50505073ffffffffffffffffffffffffffffffffffffffff8516611ef0576040517f24ecef4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611efa85610b3b565b905084828273ffffffffffffffffffffffffffffffffffffffff80821690831614611f78576040517f5a9c31d3000000000000000000000000000000000000000000000000000000008152600481019390935273ffffffffffffffffffffffffffffffffffffffff91821660248401521660448201526064016102d8565b505050611f8587866127b9565b73ffffffffffffffffffffffffffffffffffffff