a manifold extension to port fully onchain an existing collection minted with offchain content
clgsms/fixtures/ERC721Creator.json
JSON · 1450 lines · 73 KBRAWDOWNLOAD
{
"_comment": "Manifold ERC721Creator, compiled once and frozen — a TEST FIXTURE, not part of\nanything deployed to mainnet. Used to stand up a creator contract on a local\nchain and on Sepolia, where COLORGASM does not exist.\n\nKept as bytecode rather than as a source dependency on purpose: compiling\nManifold creator-core from npm drags in OpenZeppelin and the combination is\nversion-fragile (creator-core 2.x needs the OZ 4.x _beforeTokenTransfer hook,\nwhich OZ 5.x removed; nested copies of OZ collide with each other). Freezing\nthe bytecode also makes the test more faithful, not less — it is one fixed\nartifact rather than whatever solc and OZ happen to resolve to today.\n\nTo regenerate: npm i -D @manifoldxyz/creator-core-solidity@3.0.0, add it to\nsolidity.npmFilesToBuild in hardhat.config.js, compile, and copy abi +\nbytecode out of the artifact.",
"source": {
"package": "@manifoldxyz/creator-core-solidity",
"version": "3.0.0",
"contract": "contracts/ERC721Creator.sol:ERC721Creator",
"openzeppelin": "4.9.6",
"solc": "0.8.26",
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "cancun"
},
"deployedBytecodeSize": 20805
},
"abi": [
{
"inputs": [
{
"internalType": "string",
"name": "_name",
"type": "string"
},
{
"internalType": "string",
"name": "_symbol",
"type": "string"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "AdminApproved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "AdminRevoked",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "approved",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "ApprovalForAll",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "extension",
"type": "address"
}
],
"name": "ApproveTransferUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address payable[]",
"name": "receivers",
"type": "address[]"
},
{
"indexed": false,
"internalType": "uint256[]",
"name": "basisPoints",
"type": "uint256[]"
}
],
"name": "DefaultRoyaltiesUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "enabled",
"type": "bool"
}
],
"name": "ExtensionApproveTransferUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "ExtensionBlacklisted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "ExtensionRegistered",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"indexed": false,
"internalType": "address payable[]",
"name": "receivers",
"type": "address[]"
},
{
"indexed": false,
"internalType": "uint256[]",
"name": "basisPoints",
"type": "uint256[]"
}
],
"name": "ExtensionRoyaltiesUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "ExtensionUnregistered",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "permissions",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "MintPermissionsUpdated",
"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": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address payable[]",
"name": "receivers",
"type": "address[]"
},
{
"indexed": false,
"internalType": "uint256[]",
"name": "basisPoints",
"type": "uint256[]"
}
],
"name": "RoyaltiesUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [],
"name": "VERSION",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"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": "admin",
"type": "address"
}
],
"name": "approveAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "extension",
"type": "address"
}
],
"name": "blacklistExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "burn",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getAdmins",
"outputs": [
{
"internalType": "address[]",
"name": "admins",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getApproveTransfer",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getExtensions",
"outputs": [
{
"internalType": "address[]",
"name": "extensions",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getFeeBps",
"outputs": [
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getFeeRecipients",
"outputs": [
{
"internalType": "address payable[]",
"name": "",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getFees",
"outputs": [
{
"internalType": "address payable[]",
"name": "",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getRoyalties",
"outputs": [
{
"internalType": "address payable[]",
"name": "",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "admin",
"type": "address"
}
],
"name": "isAdmin",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "isApprovedForAll",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "mintBase",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "string",
"name": "uri",
"type": "string"
}
],
"name": "mintBase",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "string[]",
"name": "uris",
"type": "string[]"
}
],
"name": "mintBaseBatch",
"outputs": [
{
"internalType": "uint256[]",
"name": "tokenIds",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint16",
"name": "count",
"type": "uint16"
}
],
"name": "mintBaseBatch",
"outputs": [
{
"internalType": "uint256[]",
"name": "tokenIds",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "mintExtension",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint80",
"name": "data",
"type": "uint80"
}
],
"name": "mintExtension",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "string",
"name": "uri",
"type": "string"
}
],
"name": "mintExtension",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "string[]",
"name": "uris",
"type": "string[]"
}
],
"name": "mintExtensionBatch",
"outputs": [
{
"internalType": "uint256[]",
"name": "tokenIds",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint80[]",
"name": "data",
"type": "uint80[]"
}
],
"name": "mintExtensionBatch",
"outputs": [
{
"internalType": "uint256[]",
"name": "tokenIds",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint16",
"name": "count",
"type": "uint16"
}
],
"name": "mintExtensionBatch",
"outputs": [
{
"internalType": "uint256[]",
"name": "tokenIds",
"type": "uint256[]"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ownerOf",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"internalType": "string",
"name": "baseURI",
"type": "string"
}
],
"name": "registerExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"internalType": "string",
"name": "baseURI",
"type": "string"
},
{
"internalType": "bool",
"name": "baseURIIdentical",
"type": "bool"
}
],
"name": "registerExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "admin",
"type": "address"
}
],
"name": "revokeAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "royaltyInfo",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "setApprovalForAll",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "extension",
"type": "address"
}
],
"name": "setApproveTransfer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "enabled",
"type": "bool"
}
],
"name": "setApproveTransferExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "uri",
"type": "string"
}
],
"name": "setBaseTokenURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "uri",
"type": "string"
}
],
"name": "setBaseTokenURIExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "uri",
"type": "string"
},
{
"internalType": "bool",
"name": "identical",
"type": "bool"
}
],
"name": "setBaseTokenURIExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"internalType": "address",
"name": "permissions",
"type": "address"
}
],
"name": "setMintPermissions",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "address payable[]",
"name": "receivers",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "basisPoints",
"type": "uint256[]"
}
],
"name": "setRoyalties",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address payable[]",
"name": "receivers",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "basisPoints",
"type": "uint256[]"
}
],
"name": "setRoyalties",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "extension",
"type": "address"
},
{
"internalType": "address payable[]",
"name": "receivers",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "basisPoints",
"type": "uint256[]"
}
],
"name": "setRoyaltiesExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "string",
"name": "uri",
"type": "string"
}
],
"name": "setTokenURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "tokenIds",
"type": "uint256[]"
},
{
"internalType": "string[]",
"name": "uris",
"type": "string[]"
}
],
"name": "setTokenURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "tokenIds",
"type": "uint256[]"
},
{
"internalType": "string[]",
"name": "uris",
"type": "string[]"
}
],
"name": "setTokenURIExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "string",
"name": "uri",
"type": "string"
}
],
"name": "setTokenURIExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "prefix",
"type": "string"
}
],
"name": "setTokenURIPrefix",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "prefix",
"type": "string"
}
],
"name": "setTokenURIPrefixExtension",
"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": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenData",
"outputs": [
{
"internalType": "uint80",
"name": "",
"type": "uint80"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenExtension",
"outputs": [
{
"internalType": "address",
"name": "extension",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "extension",
"type": "address"
}
],
"name": "unregisterExtension",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x60806040525f600a55348015610013575f80fd5b5060405161544538038061544583398101604081905261003291610150565b818161003d33610064565b60018055600461004d8382610239565b50600561005a8282610239565b50505050506102f3565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126100d6575f80fd5b81516001600160401b038111156100ef576100ef6100b3565b604051601f8201601f19908116603f011681016001600160401b038111828210171561011d5761011d6100b3565b604052818152838201602001851015610134575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f8060408385031215610161575f80fd5b82516001600160401b03811115610176575f80fd5b610182858286016100c7565b602085015190935090506001600160401b0381111561019f575f80fd5b6101ab858286016100c7565b9150509250929050565b600181811c908216806101c957607f821691505b6020821081036101e757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561023457805f5260205f20601f840160051c810160208510156102125750805b601f840160051c820191505b81811015610231575f815560010161021e565b50505b505050565b81516001600160401b03811115610252576102526100b3565b6102668161026084546101b5565b846101ed565b6020601f821160018114610298575f83156102815750848201515b5f19600385901b1c1916600184901b178455610231565b5f84815260208120601f198516915b828110156102c757878501518255602094850194600190920191016102a7565b50848210156102e457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b615145806103005f395ff3fe608060405234801561000f575f80fd5b5060043610610393575f3560e01c806370a08231116101df578063b4b5b48f11610109578063d5a06d4c116100a9578063f0cdc49911610079578063f0cdc4991461084b578063f2fde38b1461085e578063fe2e1f5814610871578063ffa1ad7414610884575f80fd5b8063d5a06d4c146107b8578063e00aab4b14610812578063e92a89f614610825578063e985e9c514610838575f80fd5b8063bb3bafd6116100e4578063bb3bafd6146107b8578063c87b56dd146107d9578063ce8aee9d146107ec578063d3973719146107ff575f80fd5b8063b4b5b48f14610735578063b88d4fde14610785578063b9c4d9fb14610798575f80fd5b80638da5cb5b1161017f578063aafb2d441161014f578063aafb2d44146106e9578063ac0c8cfa146106fc578063ad2d0ddd1461070f578063b0fe87c914610722575f80fd5b80638da5cb5b146106ab57806395d89b41146106bb57806399e0dd7c146106c3578063a22cb465146106d6575f80fd5b80637884af44116101ba5780637884af441461066a5780637aa15f161461067d57806382dcc0c81461069057806383b7db63146106a3575f80fd5b806370a082311461063c578063715018a61461064f57806372ff03d314610657575f80fd5b806330176e13116102c05780634278330e1161026057806361e5bc6b1161023057806361e5bc6b146105f05780636352211e1461060357806366d1e9d0146106165780636d73e66914610629575f80fd5b80634278330e146105a457806342842e0e146105b757806342966c68146105ca578063596798ad146105dd575f80fd5b8063332dd1ae1161029b578063332dd1ae1461055857806338e52e781461056b5780633e6134b81461057e5780633f0f37f614610591575f80fd5b806330176e131461051d5780633071a0f91461053057806331ae450b14610543575f80fd5b806320e4afe21161033657806324d7806c1161030657806324d7806c146104a45780632928ca58146104b75780632a55205a146104d85780632d3456701461050a575f80fd5b806320e4afe21461045a57806322f374d01461046d578063239be3171461047e57806323b872dd14610491575f80fd5b8063081812fc11610371578063081812fc146103e9578063095ea7b3146104145780630ebd4c7f14610427578063162094c414610447575f80fd5b806301ffc9a71461039757806302e7afb7146103bf57806306fdde03146103d4575b5f80fd5b6103aa6103a53660046141a8565b61088c565b60405190151581526020015b60405180910390f35b6103d26103cd3660046141d7565b6108ba565b005b6103dc610918565b6040516103b69190614220565b6103fc6103f7366004614232565b6109a8565b6040516001600160a01b0390911681526020016103b6565b6103d2610422366004614249565b6109cd565b61043a610435366004614232565b610ae1565b6040516103b691906142ad565b6103d26104553660046142fc565b610b11565b6103d2610468366004614383565b610b65565b600b546001600160a01b03166103fc565b6103fc61048c366004614232565b610be7565b6103d261049f3660046143fa565b610c94565b6103aa6104b23660046141d7565b610cc5565b6104ca6104c53660046141d7565b610cfc565b6040519081526020016103b6565b6104eb6104e6366004614438565b610d32565b604080516001600160a01b0390931683526020830191909152016103b6565b6103d26105183660046141d7565b610d6f565b6103d261052b366004614458565b610dcb565b6103d261053e366004614496565b610e1e565b61054b610e7c565b6040516103b691906144cd565b6103d2610566366004614518565b610f1f565b61043a610579366004614582565b610f7b565b6103d261058c366004614458565b6110aa565b6103d261059f3660046145d2565b6110bd565b61043a6105b2366004614582565b61111b565b6103d26105c53660046143fa565b611210565b6103d26105d8366004614232565b61122a565b6103d26105eb3660046141d7565b6112bf565b6103d26105fe366004614518565b611311565b6103fc610611366004614232565b61138f565b6103d2610624366004614458565b6113ee565b6103d26106373660046141d7565b611400565b6104ca61064a3660046141d7565b611457565b6103d26114db565b6104ca6106653660046141d7565b6114ee565b6104ca610678366004614496565b611559565b61043a61068b366004614582565b6115f5565b6103d261069e366004614635565b611754565b61054b611767565b5f546001600160a01b03166103fc565b6103dc611806565b6103d26106d1366004614458565b611815565b6103d26106e4366004614687565b611868565b6103d26106f7366004614518565b611873565b6103d261070a3660046146be565b611932565b61043a61071d3660046146d9565b611944565b6103d261073036600461470b565b611a69565b61076a610743366004614232565b5f90815260066020526040902054600160a01b900460101c69ffffffffffffffffffff1690565b60405169ffffffffffffffffffff90911681526020016103b6565b6103d26107933660046147ae565b611abf565b6107ab6107a6366004614232565b611af1565b6040516103b6919061488e565b6107cb6107c6366004614232565b611b21565b6040516103b69291906148a0565b6103dc6107e7366004614232565b611b5b565b6103d26107fa3660046141d7565b611b8b565b6104ca61080d3660046148e6565b611bdd565b61043a6108203660046146d9565b611c13565b6103d26108333660046142fc565b611ced565b6103aa610846366004614919565b611d00565b6103d2610859366004614919565b611d2d565b6103d261086c3660046141d7565b611d80565b6104ca61087f366004614496565b611df6565b6104ca600381565b5f61089682611e48565b806108a557506108a582611e87565b806108b457506108b482611ec1565b92915050565b336108cc5f546001600160a01b031690565b6001600160a01b031614806108e757506108e7600233611ef5565b61090c5760405162461bcd60e51b815260040161090390614945565b60405180910390fd5b61091581611f16565b50565b60606004805461092790614989565b80601f016020809104026020016040519081016040528092919081815260200182805461095390614989565b801561099e5780601f106109755761010080835404028352916020019161099e565b820191905f5260205f20905b81548152906001019060200180831161098157829003601f168201915b5050505050905090565b5f6109b282612024565b505f908152600860205260409020546001600160a01b031690565b5f6109d78261138f565b9050806001600160a01b0316836001600160a01b031603610a445760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610903565b336001600160a01b0382161480610a605750610a608133611d00565b610ad25760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610903565b610adc8383612074565b505050565b6060610aec826120e1565b610b085760405162461bcd60e51b8152600401610903906149bb565b6108b4826120fd565b33610b235f546001600160a01b031690565b6001600160a01b03161480610b3e5750610b3e600233611ef5565b610b5a5760405162461bcd60e51b815260040161090390614945565b610adc838383612108565b33610b775f546001600160a01b031690565b6001600160a01b03161480610b925750610b92600233611ef5565b610bae5760405162461bcd60e51b815260040161090390614945565b610bb7856120e1565b610bd35760405162461bcd60e51b8152600401610903906149bb565b610be08585858585612189565b5050505050565b5f610bf1826120e1565b610c0d5760405162461bcd60e51b8152600401610903906149bb565b610c168261220d565b90506001600160a01b038116610c675760405162461bcd60e51b815260206004820152601660248201527527379032bc3a32b739b4b7b7103337b9103a37b5b2b760511b6044820152606401610903565b610c72600e82611ef5565b15610c8f5760405162461bcd60e51b8152600401610903906149e6565b919050565b610c9e3382612260565b610cba5760405162461bcd60e51b815260040161090390614a15565b610adc8383836122be565b5f816001600160a01b0316610ce15f546001600160a01b031690565b6001600160a01b031614806108b457506108b4600283611ef5565b5f610d05612459565b610d0d6124b2565b610d278260405180602001604052805f8152505f80612509565b9050610c8f60018055565b5f80610d3d846120e1565b610d595760405162461bcd60e51b8152600401610903906149bb565b610d63848461258d565b915091505b9250929050565b610d7761265e565b610d82600282611ef5565b156109155760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d5905f90a3610dc76002826126b7565b5050565b33610ddd5f546001600160a01b031690565b6001600160a01b03161480610df85750610df8600233611ef5565b610e145760405162461bcd60e51b815260040161090390614945565b610dc782826126cb565b33610e305f546001600160a01b031690565b6001600160a01b03161480610e4b5750610e4b600233611ef5565b610e675760405162461bcd60e51b815260040161090390614945565b610e70836126ff565b610adc8383835f612727565b6060610e886002612821565b6001600160401b03811115610e9f57610e9f614744565b604051908082528060200260200182016040528015610ec8578160200160208202803683370190505b5090505f5b610ed76002612821565b811015610f1b57610ee960028261282a565b828281518110610efb57610efb614a62565b6001600160a01b0390921660209283029190910190910152600101610ecd565b5090565b33610f315f546001600160a01b031690565b6001600160a01b03161480610f4c5750610f4c600233611ef5565b610f685760405162461bcd60e51b815260040161090390614945565b610f755f85858585612835565b50505050565b6060610f85612459565b610f8d6124b2565b816001600160401b03811115610fa557610fa5614744565b604051908082528060200260200182016040528015610fce578160200160208202803683370190505b5090505f600a546001610fe19190614a8a565b905083839050600a5f828254610ff79190614a8a565b909155505f90505b83811015611098576110738686868481811061101d5761101d614a62565b905060200281019061102f9190614a9d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250925061106e915086905087614a8a565b612509565b83828151811061108557611085614a62565b6020908102919091010152600101610fff565b50506110a360018055565b9392505050565b6110b26124b2565b610dc782825f61291f565b336110cf5f546001600160a01b031690565b6001600160a01b031614806110ea57506110ea600233611ef5565b6111065760405162461bcd60e51b815260040161090390614945565b61110f846126ff565b610f7584848484612727565b6060611125612459565b61112d6124b2565b816001600160401b0381111561114557611145614744565b60405190808252806020026020018201604052801561116e578160200160208202803683370190505b5090505f600a5460016111819190614a8a565b905083839050600a5f8282546111979190614a8a565b909155505f90505b83811015611098576111eb8660405180602001604052805f8152508787858181106111cc576111cc614a62565b90506020020160208101906111e19190614adf565b61106e8587614a8a565b8382815181106111fd576111fd614a62565b602090810291909101015260010161119f565b610adc83838360405180602001604052805f815250611abf565b611232612459565b61123c3382612260565b6112885760405162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206973206e6f74206f776e6572206f7220617070726f766564006044820152606401610903565b5f6112928261138f565b90505f61129e8361220d565b90506112a98361295a565b6112b4828483612a10565b505061091560018055565b336112d15f546001600160a01b031690565b6001600160a01b031614806112ec57506112ec600233611ef5565b6113085760405162461bcd60e51b815260040161090390614945565b61091581612ac8565b6113196124b2565b8281146113385760405162461bcd60e51b815260040161090390614af8565b5f5b83811015610be05761138785858381811061135757611357614a62565b9050602002013584848481811061137057611370614a62565b90506020028101906113829190614a9d565b612b1c565b60010161133a565b5f818152600660205260408120546001600160a01b0316806108b45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610903565b6113f66124b2565b610dc78282612b26565b61140861265e565b611413600282611ef5565b6109155760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb1905f90a3610dc7600282612b3f565b5f6001600160a01b0382166114c05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610903565b506001600160a01b03165f9081526007602052604090205490565b6114e361265e565b6114ec5f612b53565b565b5f6114f7612459565b336115095f546001600160a01b031690565b6001600160a01b031614806115245750611524600233611ef5565b6115405760405162461bcd60e51b815260040161090390614945565b610d278260405180602001604052805f8152505f612ba2565b5f611562612459565b336115745f546001600160a01b031690565b6001600160a01b0316148061158f575061158f600233611ef5565b6115ab5760405162461bcd60e51b815260040161090390614945565b6115ea8484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509250612ba2915050565b90506110a360018055565b60606115ff612459565b336116115f546001600160a01b031690565b6001600160a01b0316148061162c575061162c600233611ef5565b6116485760405162461bcd60e51b815260040161090390614945565b816001600160401b0381111561166057611660614744565b604051908082528060200260200182016040528015611689578160200160208202803683370190505b5090505f600a54600161169c9190614a8a565b905083839050600a5f8282546116b29190614a8a565b909155505f90505b838110156110985761172f868686848181106116d8576116d8614a62565b90506020028101906116ea9190614a9d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061172a9250869150879050614a8a565b612ba2565b83828151811061174157611741614a62565b60209081029190910101526001016116ba565b61175c6124b2565b610adc83838361291f565b6060611773600c612821565b6001600160401b0381111561178a5761178a614744565b6040519080825280602002602001820160405280156117b3578160200160208202803683370190505b5090505f5b6117c2600c612821565b811015610f1b576117d4600c8261282a565b8282815181106117e6576117e6614a62565b6001600160a01b03909216602092830291909101909101526001016117b8565b60606005805461092790614989565b336118275f546001600160a01b031690565b6001600160a01b031614806118425750611842600233611ef5565b61185e5760405162461bcd60e51b815260040161090390614945565b610dc78282612bf4565b610dc7338383612c28565b336118855f546001600160a01b031690565b6001600160a01b031614806118a057506118a0600233611ef5565b6118bc5760405162461bcd60e51b815260040161090390614945565b8281146118db5760405162461bcd60e51b815260040161090390614af8565b5f5b83811015610be05761192a8585838181106118fa576118fa614a62565b9050602002013584848481811061191357611913614a62565b90506020028101906119259190614a9d565b612108565b6001016118dd565b61193a6124b2565b6109153382612cf5565b606061194e612459565b336119605f546001600160a01b031690565b6001600160a01b0316148061197b575061197b600233611ef5565b6119975760405162461bcd60e51b815260040161090390614945565b8161ffff166001600160401b038111156119b3576119b3614744565b6040519080825280602002602001820160405280156119dc578160200160208202803683370190505b5090505f600a5460016119ef9190614a8a565b90508261ffff16600a5f828254611a069190614a8a565b909155505f90505b8361ffff16811015611a5e57611a398560405180602001604052805f815250838561172a9190614a8a565b838281518110611a4b57611a4b614a62565b6020908102919091010152600101611a0e565b50506108b460018055565b33611a7b5f546001600160a01b031690565b6001600160a01b03161480611a965750611a96600233611ef5565b611ab25760405162461bcd60e51b815260040161090390614945565b610be08585858585612835565b611ac93383612260565b611ae55760405162461bcd60e51b815260040161090390614a15565b610f7584848484612d69565b6060611afc826120e1565b611b185760405162461bcd60e51b8152600401610903906149bb565b6108b482612d9c565b606080611b2d836120e1565b611b495760405162461bcd60e51b8152600401610903906149bb565b611b5283612da3565b91509150915091565b6060611b66826120e1565b611b825760405162461bcd60e51b8152600401610903906149bb565b6108b48261313f565b33611b9d5f546001600160a01b031690565b6001600160a01b03161480611bb85750611bb8600233611ef5565b611bd45760405162461bcd60e51b815260040161090390614945565b610915816133ec565b5f611be6612459565b611bee6124b2565b611c088360405180602001604052805f815250845f612509565b90506108b460018055565b6060611c1d612459565b611c256124b2565b8161ffff166001600160401b03811115611c4157611c41614744565b604051908082528060200260200182016040528015611c6a578160200160208202803683370190505b5090505f600a546001611c7d9190614a8a565b90508261ffff16600a5f828254611c949190614a8a565b909155505f90505b8361ffff16811015611a5e57611cc88560405180602001604052805f8152505f848661106e9190614a8a565b838281518110611cda57611cda614a62565b6020908102919091010152600101611c9c565b611cf56124b2565b610adc838383612b1c565b6001600160a01b039182165f90815260096020908152604080832093909416825291909152205460ff1690565b33611d3f5f546001600160a01b031690565b6001600160a01b03161480611d5a5750611d5a600233611ef5565b611d765760405162461bcd60e51b815260040161090390614945565b610dc7828261342c565b611d8861265e565b6001600160a01b038116611ded5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610903565b61091581612b53565b5f611dff612459565b611e076124b2565b6115ea8484848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525092508291506125099050565b5f6001600160e01b0319821663b5d2729f60e01b1480611e7857506001600160e01b03198216639088c20760e01b145b806108b457506108b48261355f565b5f6001600160e01b031982166380ac58cd60e01b14806108a557506001600160e01b03198216635b5e139f60e01b14806108b457506108b4825b5f6001600160e01b03198216632a9f3abf60e11b14806108b457506301ffc9a760e01b6001600160e01b03198316146108b4565b6001600160a01b0381165f90815260018301602052604081205415156110a3565b6001600160a01b03811615801590611f3757506001600160a01b0381163014155b611f835760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420626c61636b6c69737420796f757273656c66000000000000006044820152606401610903565b611f8e600c82611ef5565b15611fd55760405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a78901479905f90a3611fd3600c826126b7565b505b611fe0600e82611ef5565b6109155760405133906001600160a01b038316907f05ac7bc5a606cd92a63365f9fda244499b9add0526b22d99937b6bd88181059c905f90a3610dc7600e82612b3f565b61202d816120e1565b6109155760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610903565b5f81815260086020526040902080546001600160a01b0319166001600160a01b03841690811790915581906120a88261138f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f908152600660205260409020546001600160a01b0316151590565b60606110a382612da3565b5f831180156121195750600a548311155b801561213557505f61212a8461220d565b6001600160a01b0316145b6121715760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610903565b5f838152601360205260409020610f75828483614b63565b6121958484848461360f565b5f8581526015602052604081206121ab9161410e565b6121c88484848460155f8b81526020019081526020015f206136b9565b847fabb46fe0761d77584bde75697647804ffd8113abd4d8d06bc664150395eccdee858585856040516121fe9493929190614c1c565b60405180910390a25050505050565b5f81815260066020526040812054600160a01b90046001600160601b0381169061ffff16820361223f57505f92915050565b61ffff165f908152601a60205260409020546001600160a01b031692915050565b5f8061226b8361138f565b9050806001600160a01b0316846001600160a01b0316148061229257506122928185611d00565b806122b65750836001600160a01b03166122ab846109a8565b6001600160a01b0316145b949350505050565b5f818152600660209081526040918290208251808401909352546001600160a01b03808216808552600160a01b9092046001600160601b031692840192909252908516811461235d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610903565b6001600160a01b0384166123bf5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610903565b60208201516123d086868684613772565b6123da5f85612074565b6001600160a01b038087165f81815260076020908152604080832080545f1901905593891680835284832080546001019055888352600690915283822080546001600160a01b031916821790559251879392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45b505050505050565b6002600154036124ab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610903565b6002600155565b6124bd600c33611ef5565b6114ec5760405162461bcd60e51b815260206004820152601c60248201527f4d757374206265207265676973746572656420657874656e73696f6e000000006044820152606401610903565b5f815f0361252957600a5f815461251f90614c98565b90915550600a5491505b612533858361377e565b335f90815260196020526040902054612565908690849061ffff16601087901b69ffffffffffffffff0000161761380b565b835115612585575f8281526013602052604090206125838582614cb0565b505b509392505050565b5f805f8061259a86612da3565b915091506001825111156125f05760405162461bcd60e51b815260206004820152601c60248201527f4d6f7265207468616e203120726f79616c7479207265636569766572000000006044820152606401610903565b81515f0361260557305f935093505050610d68565b815f8151811061261757612617614a62565b602002602001015161271086835f8151811061263557612635614a62565b60200260200101516126479190614d6a565b6126519190614d81565b9350935050509250929050565b5f546001600160a01b031633146114ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610903565b5f6110a3836001600160a01b038416613825565b5f805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01610adc828483614b63565b61270a600e82611ef5565b156109155760405162461bcd60e51b8152600401610903906149e6565b60185461ffff908116106127735760405162461bcd60e51b8152602060048201526013602482015272546f6f206d616e7920657874656e73696f6e7360681b6044820152606401610903565b6001600160a01b0384165f9081526019602052604081205461ffff16900361281557601880545f906127a89061ffff16614da0565b82546101009290920a61ffff818102199093169183160217909155601880546001600160a01b0387165f818152601960209081526040808320805495881661ffff199096169590951790945593549094168452601a90925290912080546001600160a01b03191690911790555b610f7584848484613908565b5f6108b4825490565b5f6110a383836139f2565b6128418484848461360f565b6001600160a01b0385165f9081526014602052604081206128619161410e565b6128908484848460145f8b6001600160a01b03166001600160a01b031681526020019081526020015f206136b9565b6001600160a01b0385166128e0577f2b6849d5976d799a5b0ca4dfd6b40a3d7afe9ea72c091fa01a958594f9a2659b848484846040516128d39493929190614c1c565b60405180910390a1610be0565b846001600160a01b03167f535a93d2cb000582c0ebeaa9be4890ec6a287f98eb2df00c54c300612fd78d8f858585856040516121fe9493929190614c1c565b335f908152601060205260409020612938838583614b63565b50335f908152601160205260409020805460ff19169115159190911790555050565b5f8181526006602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b031692820183905290929091906129a99083908684613772565b6129b35f85612074565b6001600160a01b0382165f81815260076020908152604080832080545f190190558783526006909152808220829055518692907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4610f75565b6001600160a01b03811615612a9357612a30816311686e4b60e21b613a18565b15612a93576040516311686e4b60e21b81526001600160a01b038481166004830152602482018490528216906345a1b92c906044015f604051808303815f87803b158015612a7c575f80fd5b505af1158015612a8e573d5f803e3d5ffd5b505050505b5f8281526013602052604090208054612aab90614989565b159050610adc575f828152601360205260408120610adc91614129565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f959c0e47a2fe3cf01e237ba4892e2cc3194d77cbfb33e434e40873225d6b595f9060200160405180910390a150565b3361212a8461220d565b335f908152601260205260409020610adc828483614b63565b5f6110a3836001600160a01b038416613a33565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f815f03612bc257600a5f8154612bb890614c98565b90915550600a5491505b612bcd84835f61380b565b825115612bed575f828152601360205260409020612beb8482614cb0565b505b5092915050565b5f805260126020527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b610adc828483614b63565b816001600160a01b0316836001600160a01b031603612c895760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610903565b6001600160a01b038381165f81815260096020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612d06826345ffcdad60e01b613a18565b15610dc7576001600160a01b0382165f81815260166020908152604091829020805460ff191685151590811790915591519182527f072a7592283e2c2d1d56d21517ff6013325e0f55483f4828373ff4d98b0a1a36910160405180910390a25050565b612d748484846122be565b612d8084848484613a7f565b610f755760405162461bcd60e51b815260040161090390614dc0565b6060612bed825b6060805f60155f8581526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015612e20575f84815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101612dd7565b50505050905080515f03612f65575f612e388561220d565b90506001600160a01b03811615612f6357612e5a81634e53ee3d60e11b613a18565b15612ee157604051634e53ee3d60e11b8152306004820152602481018690526001600160a01b03821690639ca7dc7a906044015f60405180830381865afa158015612ea7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ece9190810190614e99565b8151919550935015612ee1575050915091565b6001600160a01b0381165f90815260146020908152604080832080548251818502810185019093528083529193909284015b82821015612f5c575f84815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101612f13565b5050505091505b505b80515f03613005575f808052601460209081527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c8054604080518285028101850190915281815293919290919084015b82821015612ffe575f84815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101612fb5565b5050505090505b8051156131395780516001600160401b0381111561302557613025614744565b60405190808252806020026020018201604052801561304e578160200160208202803683370190505b50925080516001600160401b0381111561306a5761306a614744565b604051908082528060200260200182016040528015613093578160200160208202803683370190505b5091505f5b8151811015613137578181815181106130b3576130b3614a62565b60200260200101515f01518482815181106130d0576130d0614a62565b60200260200101906001600160a01b031690816001600160a01b03168152505081818151811061310257613102614a62565b60200260200101516020015161ffff1683828151811061312457613124614a62565b6020908102919091010152600101613098565b505b50915091565b60605f821180156131525750600a548211155b61318e5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610903565b5f6131988361220d565b90506131a5600e82611ef5565b156131c25760405162461bcd60e51b8152600401610903906149e6565b5f83815260136020526040902080546131da90614989565b1590506132ef576001600160a01b0381165f908152601260205260409020805461320390614989565b159050613253576001600160a01b0381165f9081526012602090815260408083208684526013835292819020905161323c939201614fcc565b604051602081830303815290604052915050919050565b5f838152601360205260409020805461326b90614989565b80601f016020809104026020016040519081016040528092919081815260200182805461329790614989565b80156132e25780601f106132b9576101008083540402835291602001916132e2565b820191905f5260205f20905b8154815290600101906020018083116132c557829003601f168201915b5050505050915050919050565b6133008163e9dc637560e01b613a18565b156133745760405163e9dc637560e01b8152306004820152602481018490526001600160a01b0382169063e9dc6375906044015f60405180830381865afa15801561334d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a39190810190614fe0565b6001600160a01b0381165f9081526011602052604090205460ff166133c4576001600160a01b0381165f9081526010602052604090206133b384613b79565b60405160200161323c929190615054565b6001600160a01b0381165f908152601060205260409020805461326b90614989565b50919050565b60405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a78901479905f90a3610dc7600c826126b7565b613437600c83611ef5565b6134835760405162461bcd60e51b815260206004820152601e60248201527f43726561746f72436f72653a20496e76616c696420657874656e73696f6e00006044820152606401610903565b6001600160a01b03811615806134a557506134a581631e05385b60e31b613a18565b6134e35760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610903565b6001600160a01b038281165f90815260176020526040902054811690821614610dc7576001600160a01b038281165f8181526017602052604080822080546001600160a01b031916948616948517905551339392917f6a835c4fcf7e0d398db3762332fdaa1471814ad39f1e2d6d0b3fdabf8efee3e091a45050565b5f6001600160e01b031982166314d9799760e21b148061358f57506001600160e01b031982166328f10a2160e01b145b8061359e575061359e82611e87565b806135b957506001600160e01b03198216635d9dd7eb60e11b145b806135d457506001600160e01b03198216632dde656160e21b145b806135ef57506001600160e01b031982166335681b5360e21b145b806108b457506001600160e01b0319821663152a902d60e11b1492915050565b82811461362e5760405162461bcd60e51b815260040161090390614af8565b5f805b828110156136675783838281811061364b5761364b614a62565b905060200201358261365d9190614a8a565b9150600101613631565b506127108110610be05760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420746f74616c20726f79616c746965730000000000000000006044820152606401610903565b5f5b82811015612451578160405180604001604052808888858181106136e1576136e1614a62565b90506020020160208101906136f691906141d7565b6001600160a01b0316815260200186868581811061371657613716614a62565b61ffff602091820293909301358316909352508354600181810186555f958652948390208451910180549490930151909116600160a01b026001600160b01b03199093166001600160a01b0390911617919091179055016136bb565b610f7584848484613c08565b335f908152601760205260409020546001600160a01b031615610dc757335f8181526017602052604090819020549051631e05385b60e31b815260048101929092526001600160a01b03848116602484015260448301849052169063f029c2d8906064015f604051808303815f87803b1580156137f9575f80fd5b505af1158015612451573d5f803e3d5ffd5b610adc83838360405180602001604052805f815250613c42565b5f81815260018301602052604081205480156138ff575f613847600183615076565b85549091505f9061385a90600190615076565b90508181146138b9575f865f01828154811061387857613878614a62565b905f5260205f200154905080875f01848154811061389857613898614a62565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806138ca576138ca615089565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506108b4565b5f9150506108b4565b6001600160a01b038416301480159061392a57506001600160a01b0384163b15155b6139605760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610903565b60405133906001600160a01b038616907fd8cb8ba4086944eabf43c5535b7712015e4d4c714b24bf812c040ea5b7a3e42a905f90a36001600160a01b0384165f9081526010602052604090206139b7838583614b63565b506001600160a01b0384165f908152601160205260409020805460ff19168215151790556139e6600c85612b3f565b50610f75846001612cf5565b5f825f018281548110613a0757613a07614a62565b905f5260205f200154905092915050565b5f613a2283613d8e565b80156110a357506110a38383613dc0565b5f818152600183016020526040812054613a7857508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108b4565b505f6108b4565b5f6001600160a01b0384163b15613b7157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613ac290339089908890889060040161509d565b6020604051808303815f875af1925050508015613afc575060408051601f3d908101601f19168201909252613af9918101906150d9565b60015b613b57573d808015613b29576040519150601f19603f3d011682016040523d82523d5f602084013e613b2e565b606091505b5080515f03613b4f5760405162461bcd60e51b815260040161090390614dc0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122b6565b5060016122b6565b60605f613b8583613e46565b60010190505f816001600160401b03811115613ba357613ba3614744565b6040519080825280601f01601f191660200182016040528015613bcd576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613bd757509392505050565b6001600160a01b03841615610f755761ffff81165f908152601a6020526040902054610f75908590859085906001600160a01b0316613f1d565b6001600160a01b038416613c985760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610903565b613ca1836120e1565b15613cee5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610903565b613cfa5f858585613772565b6001600160a01b038085165f81815260076020908152604080832080546001019055805180820182528481526001600160601b038089168285019081528a865260069094528285209151935116600160a01b02929095169190911790935591518592907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d805f858584613a7f565b5f613da0826301ffc9a760e01b613dc0565b80156108b45750613db9826001600160e01b0319613dc0565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b17815282515f9392849283928392918391908a617530fa92503d91505f519050828015613e30575060208210155b8015613e3b57505f81115b979650505050505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310613e845772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613eb0576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310613ece57662386f26fc10000830492506010015b6305f5e1008310613ee6576305f5e100830492506008015b6127108310613efa57612710830492506004015b60648310613f0c576064830492506002015b600a83106108b45760010192915050565b6001600160a01b03841615610f75576001600160a01b03811615801590613f5b57506001600160a01b0381165f9081526016602052604090205460ff165b1561402f57604051632f3537c560e11b81523360048201526001600160a01b038581166024830152848116604483015260648201849052821690635e6a6f8a906084016020604051808303815f875af1158015613fba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fde91906150f4565b61402a5760405162461bcd60e51b815260206004820152601a60248201527f457874656e73696f6e20617070726f76616c206661696c7572650000000000006044820152606401610903565b610f75565b600b546001600160a01b031615610f7557600b54604051632f3537c560e11b81523360048201526001600160a01b03868116602483015285811660448301526064820185905290911690635e6a6f8a906084016020604051808303815f875af115801561409e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140c291906150f4565b610f755760405162461bcd60e51b815260206004820152601a60248201527f457874656e73696f6e20617070726f76616c206661696c7572650000000000006044820152606401610903565b5080545f8255905f5260205f20908101906109159190614160565b50805461413590614989565b5f825580601f10614144575050565b601f0160209004905f5260205f2090810190610915919061417f565b5b80821115610f1b5780546001600160b01b0319168155600101614161565b5b80821115610f1b575f8155600101614180565b6001600160e01b031981168114610915575f80fd5b5f602082840312156141b8575f80fd5b81356110a381614193565b6001600160a01b0381168114610915575f80fd5b5f602082840312156141e7575f80fd5b81356110a3816141c3565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6110a360208301846141f2565b5f60208284031215614242575f80fd5b5035919050565b5f806040838503121561425a575f80fd5b8235614265816141c3565b946020939093013593505050565b5f8151808452602084019350602083015f5b828110156142a3578151865260209586019590910190600101614285565b5093949350505050565b602081525f6110a36020830184614273565b5f8083601f8401126142cf575f80fd5b5081356001600160401b038111156142e5575f80fd5b602083019150836020828501011115610d68575f80fd5b5f805f6040848603121561430e575f80fd5b8335925060208401356001600160401b0381111561432a575f80fd5b614336868287016142bf565b9497909650939450505050565b5f8083601f840112614353575f80fd5b5081356001600160401b03811115614369575f80fd5b6020830191508360208260051b8501011115610d68575f80fd5b5f805f805f60608688031215614397575f80fd5b8535945060208601356001600160401b038111156143b3575f80fd5b6143bf88828901614343565b90955093505060408601356001600160401b038111156143dd575f80fd5b6143e988828901614343565b969995985093965092949392505050565b5f805f6060848603121561440c575f80fd5b8335614417816141c3565b92506020840135614427816141c3565b929592945050506040919091013590565b5f8060408385031215614449575f80fd5b50508035926020909101359150565b5f8060208385031215614469575f80fd5b82356001600160401b0381111561447e575f80fd5b61448a858286016142bf565b90969095509350505050565b5f805f604084860312156144a8575f80fd5b83356144b3816141c3565b925060208401356001600160401b0381111561432a575f80fd5b602080825282518282018190525f918401906040840190835b8181101561450d5783516001600160a01b03168352602093840193909201916001016144e6565b509095945050505050565b5f805f806040858703121561452b575f80fd5b84356001600160401b03811115614540575f80fd5b61454c87828801614343565b90955093505060208501356001600160401b0381111561456a575f80fd5b61457687828801614343565b95989497509550505050565b5f805f60408486031215614594575f80fd5b833561459f816141c3565b925060208401356001600160401b038111156145b9575f80fd5b61433686828701614343565b8015158114610915575f80fd5b5f805f80606085870312156145e5575f80fd5b84356145f0816141c3565b935060208501356001600160401b0381111561460a575f80fd5b614616878288016142bf565b909450925050604085013561462a816145c5565b939692955090935050565b5f805f60408486031215614647575f80fd5b83356001600160401b0381111561465c575f80fd5b614668868287016142bf565b909450925050602084013561467c816145c5565b809150509250925092565b5f8060408385031215614698575f80fd5b82356146a3816141c3565b915060208301356146b3816145c5565b809150509250929050565b5f602082840312156146ce575f80fd5b81356110a3816145c5565b5f80604083850312156146ea575f80fd5b82356146f5816141c3565b9150602083013561ffff811681146146b3575f80fd5b5f805f805f6060868803121561471f575f80fd5b853561472a816141c3565b945060208601356001600160401b038111156143b3575f80fd5b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171561478057614780614744565b604052919050565b5f6001600160401b038211156147a0576147a0614744565b50601f01601f191660200190565b5f805f80608085870312156147c1575f80fd5b84356147cc816141c3565b935060208501356147dc816141c3565b92506040850135915060608501356001600160401b038111156147fd575f80fd5b8501601f8101871361480d575f80fd5b803561482061481b82614788565b614758565b818152886020838501011115614834575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8151808452602084019350602083015f5b828110156142a35781516001600160a01b0316865260209586019590910190600101614867565b602081525f6110a36020830184614855565b604081525f6148b26040830185614855565b82810360208401526148c48185614273565b95945050505050565b803569ffffffffffffffffffff81168114610c8f575f80fd5b5f80604083850312156148f7575f80fd5b8235614902816141c3565b9150614910602084016148cd565b90509250929050565b5f806040838503121561492a575f80fd5b8235614935816141c3565b915060208301356146b3816141c3565b60208082526024908201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616040820152633236b4b760e11b606082015260800190565b600181811c9082168061499d57607f821691505b6020821081036133e657634e487b7160e01b5f52602260045260245ffd5b6020808252601190820152702737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b602080825260159082015274115e1d195b9cda5bdb88189b1858dadb1a5cdd1959605a1b604082015260600190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156108b4576108b4614a76565b5f808335601e19843603018112614ab2575f80fd5b8301803591506001600160401b03821115614acb575f80fd5b602001915036819003821315610d68575f80fd5b5f60208284031215614aef575f80fd5b6110a3826148cd565b6020808252600d908201526c125b9d985b1a59081a5b9c1d5d609a1b604082015260600190565b601f821115610adc57805f5260205f20601f840160051c81016020851015614b445750805b601f840160051c820191505b81811015610be0575f8155600101614b50565b6001600160401b03831115614b7a57614b7a614744565b614b8e83614b888354614989565b83614b1f565b5f601f841160018114614bbf575f8515614ba85750838201355b5f19600387901b1c1916600186901b178355610be0565b5f83815260208120601f198716915b82811015614bee5786850135825560209485019460019092019101614bce565b5086821015614c0a575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b604080825281018490525f8560608301825b87811015614c5e578235614c41816141c3565b6001600160a01b0316825260209283019290910190600101614c2e565b5083810360208501528481526001600160fb1b03851115614c7d575f80fd5b8460051b915081866020830137016020019695505050505050565b5f60018201614ca957614ca9614a76565b5060010190565b81516001600160401b03811115614cc957614cc9614744565b614cdd81614cd78454614989565b84614b1f565b6020601f821160018114614d0f575f8315614cf85750848201515b5f19600385901b1c1916600184901b178455610be0565b5f84815260208120601f198516915b82811015614d3e5787850151825560209485019460019092019101614d1e565b5084821015614d5b57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b80820281158282048414176108b4576108b4614a76565b5f82614d9b57634e487b7160e01b5f52601260045260245ffd5b500490565b5f61ffff821661ffff8103614db757614db7614a76565b60010192915050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b5f6001600160401b03821115614e2a57614e2a614744565b5060051b60200190565b5f82601f830112614e43575f80fd5b8151614e5161481b82614e12565b8082825260208201915060208360051b860101925085831115614e72575f80fd5b602085015b83811015614e8f578051835260209283019201614e77565b5095945050505050565b5f8060408385031215614eaa575f80fd5b82516001600160401b03811115614ebf575f80fd5b8301601f81018513614ecf575f80fd5b8051614edd61481b82614e12565b8082825260208201915060208360051b850101925087831115614efe575f80fd5b6020840193505b82841015614f29578351614f18816141c3565b825260209384019390910190614f05565b8095505050505060208301516001600160401b03811115614f48575f80fd5b614f5485828601614e34565b9150509250929050565b5f8154614f6a81614989565b600182168015614f815760018114614f9657614fc3565b60ff1983168652811515820286019350614fc3565b845f5260205f205f5b83811015614fbb57815488820152600190910190602001614f9f565b505081860193505b50505092915050565b5f6122b6614fda8386614f5e565b84614f5e565b5f60208284031215614ff0575f80fd5b81516001600160401b03811115615005575f80fd5b8201601f81018413615015575f80fd5b805161502361481b82614788565b818152856020838501011115615037575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f61505f8285614f5e565b83518060208601835e5f9101908152949350505050565b818103818111156108b4576108b4614a76565b634e487b7160e01b5f52603160045260245ffd5b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906150cf908301846141f2565b9695505050505050565b5f602082840312156150e9575f80fd5b81516110a381614193565b5f60208284031215615104575f80fd5b81516110a3816145c556fea2646970667358221220ac6f7d77604a6d76a73cbdae4f466e9144119303f60774fb0fb58582b85a3d0764736f6c634300081a0033"
}