Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
500 MH
Holders
89
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 MHLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MetaHearts
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.11; import "./ERC721.sol"; import "./ERC721Enumerable.sol"; import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./Strings.sol"; import "./IERC20.sol"; /** @dev Contract definition */ contract MetaHearts is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard { /** @dev Contract constructor. Defines mapping between index and atributes.*/ constructor() ERC721("MetaHearts", "MH") { // TODO : To fill isWhitelisted[0x3058047bEDe41BA5e9B6f20B9eB30e538546dC56] = true; isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true; isWhitelisted[0x10f555351f49306828dF23194B9Bbf70f0323331] = true; isWhitelisted[0xa9166B04162F77813a02453e392766d0F860c8cF] = true; isWhitelisted[0x712ca5956D68A03F4F098791EDdD37E846422b32] = true; isWhitelisted[0xc0F6135e81A3bBB3e622d3899780374018EB2052] = true; isWhitelisted[0xD96B66ce05462f2EC8625311414D7da396d496a6] = true; isWhitelisted[0x470edAb50d941b2f88DaBB182b7C3cfF5d545810] = true; isWhitelisted[0x026a36cD623ADAcDc1676DcB3dC4A9D1f32208E2] = true; isWhitelisted[0xAf692770eb4600296B1e54a5C3da31e87759E989] = true; isWhitelisted[0x6888a5B9B0Fe41f0563895faE710d7EB1F36e64f] = true; isWhitelisted[0x930CC2D3B9EfACd0dE50d5353b2b466cebF33B35] = true; isWhitelisted[0xF2bf6e03A38199EFbFd8Ef2F169d601db90b244A] = true; isWhitelisted[0xe9ab2d53B08647A971B517c8d1B162B0a1E10669] = true; isWhitelisted[0x4840a335f717E9c5bD1B2BeFabED6587955546dc] = true; isWhitelisted[0x08E50b0aeAC4A4e54876E487A63CCf3f7b8a455F] = true; isWhitelisted[0xaEA6ba18620b9F93CEAb77DC5Fb56250444bCb98] = true; isWhitelisted[0x755f1A2130A5Fb4874A3dE207C6876f8dE1532Ee] = true; isWhitelisted[0xA10D517D591268017c24a4caAB300e9471A8FcaB] = true; isWhitelisted[0x379de6aB1E1c06F39F979888FD7dedf9dD1b717e] = true; isWhitelisted[0x541b79b200B40D37F91663e40Ca0B05512d0EB05] = true; isWhitelisted[0x869E98C25496fc27D235E9Fb547D634171F553E9] = true; isWhitelisted[0xfdD0b3f5aA26Cf75f0618689D0f27698Ea1F97F1] = true; isWhitelisted[0x9EC03728708423E6F75Eb1502447F7C554d88106] = true; isWhitelisted[0x1A67C63582EcD79C4e76177B356C8BEb83fb5685] = true; isWhitelisted[0xf997A2687cd52D6Db8885c280C70Fcf7986185f8] = true; isWhitelisted[0xD9a28293d20885135251e0eE54111728c28210e7] = true; isWhitelisted[0xC3df326A2d3aa5f45147bc61EDFd00cBd4Ab2Fd3] = true; isWhitelisted[0xa9166B04162F77813a02453e392766d0F860c8cF] = true; isWhitelisted[0x4D80A9C3D75Aa199e41d1781BCE4483be4F2AE31] = true; isWhitelisted[0xECb934E87Fb5797b6cD0B9B7dE3B4f9ceafdDe1a] = true; isWhitelisted[0x923fbc6B5ba1014cA771E857f8FAA941a51805D7] = true; isWhitelisted[0xeB8B45591C6F27299224D1620A85C3D696b7B944] = true; isWhitelisted[0x77C56524748bF3F31d7F77C650B10C0964eD99fB] = true; isWhitelisted[0x2Ec0161bB50e3c1eB30C1f1Cbf7d95F3083D54b2] = true; isWhitelisted[0xE4A46E1e5173a92BBf69c55a1A9B0517ae1a7115] = true; isWhitelisted[0x1C732Fb3DCD22d592738106c41f7A3A3Bd45d24C] = true; isWhitelisted[0xd5145D7b5186811F134E47830139236f7153Da5B] = true; isWhitelisted[0x0E373D1B219c8473B72287B23B36d8b6e43AD72a] = true; isWhitelisted[0xE47E168364aD555f74221f61682dA762c7F889dD] = true; isWhitelisted[0x098132A7fd334C1877a9563FFD2547eE8bFdBf26] = true; isWhitelisted[0x8eb9202CB8608D251e4Ac6683513FF1501AC749B] = true; isWhitelisted[0x7Ccd2c8f803Ddf8392aB66FfF7F4B42f9FeD035a] = true; isWhitelisted[0x9C19D1e78A4b5b00BC6eE1eD5225352A4a791469] = true; isWhitelisted[0xC2adcd1d98fAa880550381A509C741B98406039d] = true; isWhitelisted[0xD068f872CFC6B59321a86f5b4727d478FFb02a65] = true; isWhitelisted[0x078Be78d01aF868Fcf77eD611aF01b4a3710d428] = true; isWhitelisted[0x470edAb50d941b2f88DaBB182b7C3cfF5d545810] = true; isWhitelisted[0x6afD748A870B14Ba9000088090f8cb3Ce407D8e3] = true; isWhitelisted[0x7C9c6a04342c11C827e87Ce116f06D22d50Aad1b] = true; isWhitelisted[0x88200537364161e43e585CC31eeb056F711cef9B] = true; isWhitelisted[0x9E5A44F6984D9b90a04dEAB5D24630b9B502cC56] = true; isWhitelisted[0xA7BF319D12eefC614CeBaEcde98d41d0335D38E2] = true; isWhitelisted[0xdb8A644a6A82bfC818b2014dD8312b1C9aB7Bf19] = true; isWhitelisted[0xd2D6a441C2C3E45D1C5213bac7c7da958e931C0E] = true; isWhitelisted[0xe8b78E0562D18ab7FeB427E6AC24ed49B4b61EEE] = true; isWhitelisted[0x21Ce3ac9162Def133a09582138804eD3A30bE16d] = true; isWhitelisted[0xf1bF0130b895F6ef500410CE8C29A9D662290Ebe] = true; isWhitelisted[0x2a723aDa4Bd50f9e6B3626ccafF6559c6770c2B5] = true; isWhitelisted[0xfdD0b3f5aA26Cf75f0618689D0f27698Ea1F97F1] = true; isWhitelisted[0x026a36cD623ADAcDc1676DcB3dC4A9D1f32208E2] = true; isWhitelisted[0x70896F42433c446F5D1a36adeB974A029203DE08] = true; isWhitelisted[0x03677337AdF578F781cECA288c2A0A0C7CeB5569] = true; isWhitelisted[0xE47E168364aD555f74221f61682dA762c7F889dD] = true; isWhitelisted[0x27eA3fb4834bdD57b9c6Bd84Eb20d623fb6AfeD5] = true; isWhitelisted[0x4735746DB491FA338F6410b6dAE929D5A9E8D7b5] = true; isWhitelisted[0x59Ae0e0c64f21f09cb8a1712E53cb25D0e17401C] = true; isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true; isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true; isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true; isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true; isWhitelisted[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true; // TODO : To fill canMintForFree[0x3058047bEDe41BA5e9B6f20B9eB30e538546dC56] = true; canMintForFree[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true; canMintForFree[0xaF4A5dabb5d922B4CDAA5fDf2EdDABade6895f85] = true; canMintForFree[0x38E14301eB0cfc215b71Af4AE9DaF30ba16052bE] = true; canMintForFree[0xB53f5B02090e6474E6B36554aD2EcB279e5A6A2E] = true; canMintForFree[0x9976f235803bA233cCb5C3F54A47c5600f2a2353] = true; canMintForFree[0xb53c3ba1325128B347CEc5C8B4a57Db9A3f0e8D8] = true; canMintForFree[0x82d92424FE1a6E3fa3C706429BeAeB9Db9C5C5b0] = true; canMintForFree[0x24adF732C47DE85ca1E4584988307d92e7C0457c] = true; canMintForFree[0xD3214bcBf2178753f767E4A4aa29a9C2f37C0d94] = true; canMintForFree[0x0A2cEb457115fEbf127D6A1902361A2E30949aFd] = true; canMintForFree[0x04767EB4363cDb2fDF9C4c872459b8a4bb50689c] = true; } /** @dev Will be set to true when reveal is done.*/ bool isRevealed = false; /** @dev Will be set to true when reveal is done.*/ string beforeRevealMetadata = ""; /** @dev Defines if an address is whitelisted.*/ mapping(address => bool) isWhitelisted; /** @dev defines address that can mint for free.*/ mapping(address => bool) canMintForFree; /** @dev Devs' addresses. Where token will be sent when withdraw is called.*/ address payable[2] withdrawAddresses = [ payable(0x3058047bEDe41BA5e9B6f20B9eB30e538546dC56), payable(0x0A2cEb457115fEbf127D6A1902361A2E30949aFd) ]; /** @dev Devs' per thousand tokens sent when withdraw is called.*/ uint16[2] private perThousandPerAddress = [900, 100]; /** @dev Price for miniting one NFT, in wei.*/ uint256 public publicPrice = 7e16; /** @dev Maximum miniting possible for public.*/ uint256 public publicMaxMint = 10; uint256 public publicMaxOwned = 100; /** @dev Price for miniting one NFT, in wei.*/ uint256 public whitelistPrice = 5e16; /** @dev Maximum miniting possible for whitelisted.*/ uint256 public whitelistMaxMint = 5; uint256 public whitelistMaxOwned = 50; /** @dev Extension of base URI. Used to move metadata files if needed.*/ string private _baseURIextended; /** @dev Max number of NFTs to mint.*/ uint16 public NFTsLimit = 2500; /** @dev NFTs minted.*/ uint16 public NFTsMinted = 0; /** @dev _beforeTokenTransfer must be overriden to make compiler happy.*/ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } /** @dev Changing baseUri to move metadata files and images if needed.*/ function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIextended = baseURI_; } /** @dev Changing miniting price if needed.*/ function setPublicPrice(uint256 newPrice) external onlyOwner { publicPrice = newPrice; } /** @dev Changing miniting price if needed.*/ function setBeforeRevealMetadata(string memory metadata) external onlyOwner { beforeRevealMetadata = metadata; } /** @dev Changing miniting price if needed.*/ function setWhitelistPrice(uint256 newPrice) external onlyOwner { whitelistPrice = newPrice; } /** @dev Override of _baseUri().*/ function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } function tokenURI(uint256 tokenId) public view override returns (string memory) { if (isRevealed) { return super.tokenURI(tokenId); } return beforeRevealMetadata; } /** @dev Override of supportsInterface().*/ function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } /** @dev withdrawing tokens received from miniting price.*/ function withdraw() public { uint256 balance = address(this).balance; uint256 remainingBalance = balance; for (uint8 i = 0; i < withdrawAddresses.length - 1; i++) { uint256 valueToTransfer = (perThousandPerAddress[i] * balance) / 1000; withdrawAddresses[i].transfer(valueToTransfer); remainingBalance -= valueToTransfer; } withdrawAddresses[withdrawAddresses.length - 1].transfer( remainingBalance ); } /** @dev withdrawing tokens of an IERC contract.*/ function withdrawToken(address _tokenContract) public { IERC20 tokenContract = IERC20(_tokenContract); uint256 balance = tokenContract.balanceOf(address(this)); uint256 remainingBalance = balance; require(remainingBalance > 0, "There is no token to withdraw."); for (uint8 i = 0; i < withdrawAddresses.length - 1; i++) { uint256 valueToTransfer = (perThousandPerAddress[i] * balance) / 1000; tokenContract.transfer(withdrawAddresses[i], valueToTransfer); remainingBalance -= valueToTransfer; } tokenContract.transfer( withdrawAddresses[withdrawAddresses.length - 1], remainingBalance ); } /** @dev Mint an NFT.*/ function mint(uint16 numberToMint) public payable nonReentrant { require( numberToMint <= publicMaxMint, "You can't mint as much tokens at a time." ); require( NFTsMinted + numberToMint <= NFTsLimit, "All NFTs have already been minted" ); require( msg.value >= numberToMint * publicPrice, string( abi.encodePacked( "You must send ", Strings.toString(publicPrice), " wei to mint a token." ) ) ); require( balanceOf(msg.sender) + numberToMint <= publicMaxOwned, "You already have max tokens you can mint." ); for (uint256 index = 0; index < numberToMint; index++) { NFTsMinted += 1; _safeMint(msg.sender, NFTsMinted); } } /** @dev Mint an NFT.*/ function mintForFree(uint16 numberToMint) public nonReentrant { require( numberToMint <= whitelistMaxMint, "You can't mint as many tokens at a time." ); require( NFTsMinted + numberToMint <= NFTsLimit, "All NFTs have already been minted." ); require( balanceOf(msg.sender) + numberToMint <= whitelistMaxOwned, "You aready have more token than you can mint." ); require(canMintForFree[msg.sender]); for (uint256 index = 0; index < numberToMint; index++) { NFTsMinted += 1; _safeMint(msg.sender, NFTsMinted); } } /** @dev Mint an NFT for whitelisted.*/ function mintWhitelist(uint16 numberToMint) public payable nonReentrant { require( numberToMint <= whitelistMaxMint, "You can't mint as many tokens at a time." ); require( NFTsMinted + numberToMint <= NFTsLimit, "All NFTs have already been minted." ); require(isWhitelisted[msg.sender], "You're not whitelisted."); require( msg.value >= numberToMint * whitelistPrice, string( abi.encodePacked( "You must send ", Strings.toString(whitelistPrice), " wei to mint a token." ) ) ); require( balanceOf(msg.sender) + numberToMint <= whitelistMaxOwned, "You aready have more token than you can mint." ); for (uint256 index = 0; index < numberToMint; index++) { NFTsMinted += 1; _safeMint(msg.sender, NFTsMinted); } } /** @dev add in whitelist.*/ function addWhitelist(address toWhitelist) external onlyOwner { isWhitelisted[toWhitelist] = true; } /** @dev remove of whitelist.*/ function removeWhitelist(address toWhitelist) external onlyOwner { isWhitelisted[toWhitelist] = false; } /** @dev add in mint for free.*/ function addMintForFree(address toWhitelist) external onlyOwner { canMintForFree[toWhitelist] = true; } /** @dev remove of whitelist.*/ function removeMintForFree(address toWhitelist) external onlyOwner { canMintForFree[toWhitelist] = false; } /** @dev reveal tokens by setting the correct baseURI.*/ function revealNFTs() external onlyOwner { isRevealed = true; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"NFTsLimit","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTsMinted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toWhitelist","type":"address"}],"name":"addMintForFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toWhitelist","type":"address"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"uint16","name":"numberToMint","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberToMint","type":"uint16"}],"name":"mintForFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberToMint","type":"uint16"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","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":[],"name":"publicMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toWhitelist","type":"address"}],"name":"removeMintForFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toWhitelist","type":"address"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadata","type":"string"}],"name":"setBeforeRevealMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setWhitelistPrice","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMaxOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600c805460ff1916905560a06040819052600060808190526200002591600d9162000d99565b5060408051808201909152733058047bede41ba5e9b6f20b9eb30e538546dc568152730a2ceb457115febf127d6a1902361a2e30949afd60208201526200007190601090600262000e28565b50604080518082019091526103848152606460208201526200009890601290600262000e73565b5066f8b0a10e470000601355600a601455606460155566b1a2bc2ec5000060165560056017556032601855601a805463ffffffff19166109c4179055348015620000e157600080fd5b50604080518082018252600a8152694d65746148656172747360b01b60208083019182528351808501909452600284526109a960f31b9084015281519192916200012e9160009162000d99565b5080516200014490600190602084019062000d99565b505050620001616200015b62000d4360201b60201c565b62000d47565b6001600b8190557f6eb261e821edd8c0ec4f75a61442da71689765ff48bbf268056744ccf5702da8805460ff1990811683179091557f418d38441e3f2bf2a18e40aeb915ebb133e6b3134151874d23ab91c122f836f280548216831790557ffb2486e164b083e711d8e0ff0c56a934fd0d7dc18ab19fbf8a6e549c07680f3180548216831790557fc158e261cf4306b0b5b2ba450aeb57baa9694e6fed056a2f106a9980404f55f280548216831790557f24cf125b3dd1ff547e40c3fd5341edfce88283b973408e21b611ae8432653ef280548216831790557f4634d3602bb0e5b92c66123c1b80af257298cf5acbc451afa9a632a8cf6bfdb080548216831790557f4235d5d930b9c392e404edbdd005eefb7dfed254f821a2d156744f4abf7cf4ce80548216831790557fc710949fda19df853fdf9cf7918c6fb892b3b65718aafcda4bdb154cd82370c080548216831790557f3c0e28c3f6c4ade9c9d43b1ebc2ecff5c3d4c191296a9a2564cd0286513e512980548216831790557f6a78633b6b525f6dd7f2252def7ee4ce1b7da80a631da2563385eb2c5abac95f80548216831790557fa3da1aa4acc19de005d7ac2de2c3634964afef3967c3e64e7a6dbc83038b755280548216831790557f2fa69b422cbfeaab6f2e0c4a4abcb29b20c05140316637e21ba8125c892a10ed80548216831790557f9e2027fc2c6021da9757ae63b9eda866436188e35f71d8137cc160929954ad4c80548216831790557f6a065c110cb6a3e05cffbddfb54ac95fc2bed631211d6314dc48aeeba705038f80548216831790557fd5941e91df5b62094f9a19a337a9be0f6fd9471f9b4bc64ee5641d9d0582babb80548216831790557f81d42c9bd36ad6ecc00c658108cded132d0baa44328e5445ba90a84964e0c1f880548216831790557fcb1dc5ec608dbd5a3eeab6b7401421de735be76fc93b94f17fba83eac56362bd80548216831790557f4223a146399145af924cd8a891f433c462fc771f31d30a7d6b562f849d5e4f3580548216831790557f118b9bd7333790335fecb5b0e0035e93e58f015daa0d03869512e3592969ae8c80548216831790557f6c95d0049336f807377665668184fafb791ac827cc6c73827a2a918a43b23b9280548216831790557f11f53205db59adc77b63f97bfb1c77036cbe2bfb25d3bd4413d9b277821d735e80548216831790557fd6ae3506497401e9b0690e85c3066a10ee29f31a20c32cc0be812a8ef0c892e380548216831790557f10312de42a4197d26c5f51b42ba1dac84f961ead15ae878fa5a1b4a6c03826cf80548216831790557fb0c0560c732b3a76e348dbe37dd3a3e341e570c3bddf0836d80fc6a89d8c233580548216831790557fbf07ef4534a4dfa2bcef81c359482b16a1d73ed2d0de21ad4a2510bf79b8141280548216831790557fd8c5b5e5f712116c87e20ded40505b0f81ab58d70b92a91368e586b9778aab3280548216831790557fa4e5f142af77f86aa038fd6e86031f24c20394f8459dbc27e6955aae3c829a4780548216831790557f14efea2e4bd5cc593c9b1178ae63b3356b95f7febaa57b1e6104ac50a3ff124980548216831790557fb9df42c34a54e3dd0b4eb4d0b5de9a0d5b385ce8fd763bddf8030e1d9470e4e880548216831790557ff27531e29681acd44414e7c42c5c281e9f4c544b5d3314bb0459c77c4ae7346680548216831790557f6cd3a7027d686e33d0a66f07972fcb5ad74c6e1f4a2015474ef1ebaa9570cde980548216831790557f4d86e5844aa90a54566190813b1eb8d61d45fc24d9b0d84470b69f0f52234a1280548216831790557f57c70ec817a5e710047f9456a321894d0a41b8b98caf580d81796eb21dd07b7380548216831790557ffa5eb581d2ba6d2bd12dc3baf709d4b9b6618cc44b8b782ec428027e727f91ec80548216831790557f7acf0ba7c4e79540bb69456c4ec2ef62d89410a9276abba22d65e5ae9732861b80548216831790557fc5e6b3dbf84d23d799440aac602d942960fa6f5aa8c636ef657ce9a199ed016e80548216831790557f3bb24cd3718aee1fac658cee435bafa9c12e2c3f114af695410bc8900ebafbca80548216831790557fe1ac92a6903384d7b099487189c37fbcf006bd3f3a1bb0d700991572c54f405a80548216831790557f3bbdaedd3699fd7b07853bf7c1b069949f1819b27a81a2636b2b8d5910f9700780548216831790557f79d53707986dfa22c5e46f93e21a1447d6df137166b05d78d3e9b717b22b8c4d80548216831790557f33f962e7b168a90a83b02000e0ce1cbc18bcaa7ae8edf32cf3e4ba2f5462746980548216831790557ff6081374e6ee5a27b46063e402372c28aeecf3934e7a41cf1064f58d360946e880548216831790557ffd1eac8c19d6668c6cf8455c74ba43dc31d5e3d685294d00c07fe2412d6b38da80548216831790557fcc055543d4028192e3ee92a33c202394753d1d8bee267c3b872087aab462d2a780548216831790557f5eb292f8d771c15deee59feeaf2fdef3db67ab69bfffddbd85221a6853f8d06f80548216831790557ff3f57405ca51722864c25c9d34cbb9137379bde56b4e135a3cb189e7c35bd8fc80548216831790557f87b5b845c25828d254db3a26c32083f3034817e58e9f2f67e53631008d12538c80548216831790557fd15622fd0e74014d81d0fb35568b7cff925701ef857dd9af469e60622176883b80548216831790557fed30c8076b11d989b1fe2d8cf432edf4464e6566ab37a391e62f50ceaca23c8b80548216831790557faa8a406f20e8dba2a3af293be17ce351f9e8f79b110b2beda8b62ac52deedf9f80548216831790557fcd8a7b798ff4da88fa029f3a3c415c5896ea3a03b266b88f9ed2950a5693709680548216831790557ffe3b844230556ccd389503f026b3ecd8a73d6bfda6a9083e2c4995fcbfac778480548216831790557fcc6b09e790fd34642ed125a25d280e40b3050031684082f2ec0f9dcb6844525d80548216831790557fccbea3ef12fa3260f871b835ba8934302e789188380cd614cf24ab934438b12d80548216831790557f7099b212efe9bd22d2fbcfa021f9344c40970f87197363133c837d7134b785ef80548216831790557f66330d3b98f8a9f6e878a6fd1e9767e65b6eeec0341342fafff2110e9ea01be480548216831790557fac145a5fbb5d6d62ad1e70963948a84e7728c37b517a99ce02c58079e067175980548216831790557f71cd2b0e820bd5259b41b7bc0b5254a4cbec8fe7b37072a39940ff96d2f5d29580548216831790557f871e52f5e41daffb4e1e7575d05717e0b0c4faf55b41043474c2fac013be15b380548216831790557f9ac506166f5bd68aded863304f23e416eeaefac2e5ef767b5ab54f0d7e29e98780548216831790557f7f9150513e0bf941ff56cbf479815f8a9f71e0e94ec8f24f50eb6a5f23d1526e80548216831790557f3f07b7925d4f4ad286b622018fd4f327e4c5431e73a2bf583965bce79e8991cc8054821683179055600f6020527f3a1b3168c7cc0c8b069623a6dcb8c2ad8e78991a725b635e6a2a6e6a6c149f4680548216831790557f5f588d873ac7504c3c7bd527f7b0580803fdb3b71a434f57d25b2cc5db6b578780548216831790557f131835fbce63af3a18e7412b3360de7d91436395ee54187504637a0ac23a979580548216831790557f8fc325ed3060917b9ad2238013c481332446d7e38b32d2228eded435197ee00580548216831790557fc417042fbc4bb3b7171cadc2a84d1bcf132dc1307e4a0d910b90601850c175a180548216831790557fa7b2608466d3dc974f53d50e549863d38ef53ae605dddc99fd9fb63084bace4f80548216831790557fac9778ce0c7007d46081233566af2361a5166dc803ade32a262d7cddcfbdf15980548216831790557fb700946a39c40f78157ee8b7bc58e14f7a42553178fa17fdbb94b3983fa799af80548216831790557f13cb2400a191742e0cbefce09ee6c7d4dfd3afaebc590d92eb2f6d958c67374880548216831790557f997e2e44c5cbc0e4b34c70b5145f95ce07af58cdc5ac50a1130f209f5f2ca93180548216831790557304767eb4363cdb2fdf9c4c872459b8a4bb50689c6000527f20d65f4ddb56001f1cd66e7b01cf05307fc2b059ab4782a6f1cda88a494e52788054909116909117905562000f5a565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000da79062000f1d565b90600052602060002090601f01602090048101928262000dcb576000855562000e16565b82601f1062000de657805160ff191683800117855562000e16565b8280016001018555821562000e16579182015b8281111562000e1657825182559160200191906001019062000df9565b5062000e2492915062000f06565b5090565b826002810192821562000e16579160200282015b8281111562000e1657825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000e3c565b60018301918390821562000e165791602002820160005b8382111562000ecc57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262000e8a565b801562000efc5782816101000a81549061ffff021916905560020160208160010104928301926001030262000ecc565b505062000e249291505b5b8082111562000e24576000815560010162000f07565b600181811c9082168062000f3257607f821691505b6020821081141562000f5457634e487b7160e01b600052602260045260246000fd5b50919050565b612dab8062000f6a6000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461067a578063e985e9c51461069a578063ea9fbac7146106e3578063f2fde38b146106f9578063f80f5dd514610719578063fc1a1c361461073957600080fd5b8063a22cb465146105e4578063a39ed6c214610604578063a945bf8014610624578063b88d4fde1461063a578063c62752551461065a57600080fd5b806389476069116100fd57806389476069146105515780638da5cb5b146105715780638e96e3cb1461058f57806395d89b41146105af57806396e3fa70146105c457600080fd5b8063715018a6146104c6578063717d57d3146104db578063722e141d146104fb57806374cc30611461051157806378c8cda71461053157600080fd5b80633d3066d7116101c757806355f804b31161018b57806355f804b31461043b5780635bf177731461045b5780635dc70c71146104715780636352211e1461048657806370a08231146104a657600080fd5b80633d3066d71461039957806342842e0e146103cd578063464d31db146103ed57806349eb869c146104005780634f6ccce71461041b57600080fd5b806323b872dd1161020e57806323b872dd1461031b57806323cf0a221461033b5780632f745c591461034e578063305c7d4a1461036e5780633ccfd60b1461038457600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046125ef565b61074f565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610760565b6040516102779190612664565b3480156102ae57600080fd5b506102c26102bd366004612677565b6107f2565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046126ac565b61088c565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa6103363660046126d6565b6109a2565b6102fa610349366004612712565b6109d3565b34801561035a57600080fd5b5061030d6103693660046126ac565b610c34565b34801561037a57600080fd5b5061030d60145481565b34801561039057600080fd5b506102fa610cca565b3480156103a557600080fd5b50601a546103ba9062010000900461ffff1681565b60405161ffff9091168152602001610277565b3480156103d957600080fd5b506102fa6103e83660046126d6565b610dfd565b6102fa6103fb366004612712565b610e18565b34801561040c57600080fd5b50601a546103ba9061ffff1681565b34801561042757600080fd5b5061030d610436366004612677565b611012565b34801561044757600080fd5b506102fa6104563660046127c2565b6110a5565b34801561046757600080fd5b5061030d60185481565b34801561047d57600080fd5b506102fa6110e6565b34801561049257600080fd5b506102c26104a1366004612677565b61111f565b3480156104b257600080fd5b5061030d6104c136600461280b565b611196565b3480156104d257600080fd5b506102fa61121d565b3480156104e757600080fd5b506102fa6104f6366004612677565b611253565b34801561050757600080fd5b5061030d60175481565b34801561051d57600080fd5b506102fa61052c36600461280b565b611282565b34801561053d57600080fd5b506102fa61054c36600461280b565b6112d0565b34801561055d57600080fd5b506102fa61056c36600461280b565b61131b565b34801561057d57600080fd5b50600a546001600160a01b03166102c2565b34801561059b57600080fd5b506102fa6105aa36600461280b565b6115a2565b3480156105bb57600080fd5b506102956115ed565b3480156105d057600080fd5b506102fa6105df3660046127c2565b6115fc565b3480156105f057600080fd5b506102fa6105ff366004612834565b611639565b34801561061057600080fd5b506102fa61061f366004612712565b611644565b34801561063057600080fd5b5061030d60135481565b34801561064657600080fd5b506102fa61065536600461286b565b61179e565b34801561066657600080fd5b506102fa610675366004612677565b6117d6565b34801561068657600080fd5b50610295610695366004612677565b611805565b3480156106a657600080fd5b5061026b6106b53660046128e7565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ef57600080fd5b5061030d60155481565b34801561070557600080fd5b506102fa61071436600461280b565b6118ae565b34801561072557600080fd5b506102fa61073436600461280b565b611949565b34801561074557600080fd5b5061030d60165481565b600061075a82611997565b92915050565b60606000805461076f9061291a565b80601f016020809104026020016040519081016040528092919081815260200182805461079b9061291a565b80156107e85780601f106107bd576101008083540402835291602001916107e8565b820191906000526020600020905b8154815290600101906020018083116107cb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108705760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108978261111f565b9050806001600160a01b0316836001600160a01b031614156109055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610867565b336001600160a01b0382161480610921575061092181336106b5565b6109935760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610867565b61099d83836119bc565b505050565b6109ac3382611a2a565b6109c85760405162461bcd60e51b815260040161086790612955565b61099d838383611b21565b6002600b5414156109f65760405162461bcd60e51b8152600401610867906129a6565b6002600b5560145461ffff82161115610a625760405162461bcd60e51b815260206004820152602860248201527f596f752063616e2774206d696e74206173206d75636820746f6b656e732061746044820152671030903a34b6b29760c11b6064820152608401610867565b601a5461ffff80821691610a7e918491620100009004166129f3565b61ffff161115610ada5760405162461bcd60e51b815260206004820152602160248201527f416c6c204e465473206861766520616c7265616479206265656e206d696e74656044820152601960fa1b6064820152608401610867565b601354610aeb9061ffff8316612a19565b341015610af9601354611cc8565b604051602001610b099190612a38565b60405160208183030381529060405290610b365760405162461bcd60e51b81526004016108679190612664565b506015548161ffff16610b4833611196565b610b529190612a8d565b1115610bb25760405162461bcd60e51b815260206004820152602960248201527f596f7520616c72656164792068617665206d617820746f6b656e7320796f752060448201526831b0b71036b4b73a1760b91b6064820152608401610867565b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff16610be191906129f3565b92506101000a81548161ffff021916908361ffff160217905550610c1933601a60029054906101000a900461ffff1661ffff16611dc6565b80610c2381612aa5565b915050610bb5565b50506001600b55565b6000610c3f83611196565b8210610ca15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610867565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b478060005b610cdb60016002612ac0565b8160ff161015610da55760006103e88460128460ff1660028110610d0157610d01612ad7565b601091828204019190066002029054906101000a900461ffff1661ffff16610d299190612a19565b610d339190612b03565b905060108260ff1660028110610d4b57610d4b612ad7565b01546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610d84573d6000803e3d6000fd5b50610d8f8184612ac0565b9250508080610d9d90612b17565b915050610ccf565b506010610db460016002612ac0565b60028110610dc457610dc4612ad7565b01546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561099d573d6000803e3d6000fd5b61099d8383836040518060200160405280600081525061179e565b6002600b541415610e3b5760405162461bcd60e51b8152600401610867906129a6565b6002600b5560175461ffff82161115610e665760405162461bcd60e51b815260040161086790612b37565b601a5461ffff80821691610e82918491620100009004166129f3565b61ffff161115610ea45760405162461bcd60e51b815260040161086790612b7f565b336000908152600e602052604090205460ff16610f035760405162461bcd60e51b815260206004820152601760248201527f596f75277265206e6f742077686974656c69737465642e0000000000000000006044820152606401610867565b601654610f149061ffff8316612a19565b341015610f22601654611cc8565b604051602001610f329190612a38565b60405160208183030381529060405290610f5f5760405162461bcd60e51b81526004016108679190612664565b506018548161ffff16610f7133611196565b610f7b9190612a8d565b1115610f995760405162461bcd60e51b815260040161086790612bc1565b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff16610fc891906129f3565b92506101000a81548161ffff021916908361ffff16021790555061100033601a60029054906101000a900461ffff1661ffff16611dc6565b8061100a81612aa5565b915050610f9c565b600061101d60085490565b82106110805760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610867565b6008828154811061109357611093612ad7565b90600052602060002001549050919050565b600a546001600160a01b031633146110cf5760405162461bcd60e51b815260040161086790612c0e565b80516110e2906019906020840190612540565b5050565b600a546001600160a01b031633146111105760405162461bcd60e51b815260040161086790612c0e565b600c805460ff19166001179055565b6000818152600260205260408120546001600160a01b03168061075a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610867565b60006001600160a01b0382166112015760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610867565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112475760405162461bcd60e51b815260040161086790612c0e565b6112516000611de0565b565b600a546001600160a01b0316331461127d5760405162461bcd60e51b815260040161086790612c0e565b601655565b600a546001600160a01b031633146112ac5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b600a546001600160a01b031633146112fa5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611364573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113889190612c43565b905080806113d85760405162461bcd60e51b815260206004820152601e60248201527f5468657265206973206e6f20746f6b656e20746f2077697468647261772e00006044820152606401610867565b60005b6113e760016002612ac0565b8160ff1610156114fa5760006103e88460128460ff166002811061140d5761140d612ad7565b601091828204019190066002029054906101000a900461ffff1661ffff166114359190612a19565b61143f9190612b03565b9050846001600160a01b031663a9059cbb60108460ff166002811061146657611466612ad7565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156114b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d99190612c5c565b506114e48184612ac0565b92505080806114f290612b17565b9150506113db565b506001600160a01b03831663a9059cbb601061151860016002612ac0565b6002811061152857611528612ad7565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b9190612c5c565b5050505050565b600a546001600160a01b031633146115cc5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b60606001805461076f9061291a565b600a546001600160a01b031633146116265760405162461bcd60e51b815260040161086790612c0e565b80516110e290600d906020840190612540565b6110e2338383611e32565b6002600b5414156116675760405162461bcd60e51b8152600401610867906129a6565b6002600b5560175461ffff821611156116925760405162461bcd60e51b815260040161086790612b37565b601a5461ffff808216916116ae918491620100009004166129f3565b61ffff1611156116d05760405162461bcd60e51b815260040161086790612b7f565b6018548161ffff166116e133611196565b6116eb9190612a8d565b11156117095760405162461bcd60e51b815260040161086790612bc1565b336000908152600f602052604090205460ff1661172557600080fd5b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff1661175491906129f3565b92506101000a81548161ffff021916908361ffff16021790555061178c33601a60029054906101000a900461ffff1661ffff16611dc6565b8061179681612aa5565b915050611728565b6117a83383611a2a565b6117c45760405162461bcd60e51b815260040161086790612955565b6117d084848484611f01565b50505050565b600a546001600160a01b031633146118005760405162461bcd60e51b815260040161086790612c0e565b601355565b600c5460609060ff161561181c5761075a82611f34565b600d80546118299061291a565b80601f01602080910402602001604051908101604052809291908181526020018280546118559061291a565b80156118a25780601f10611877576101008083540402835291602001916118a2565b820191906000526020600020905b81548152906001019060200180831161188557829003601f168201915b50505050509050919050565b600a546001600160a01b031633146118d85760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03811661193d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610867565b61194681611de0565b50565b600a546001600160a01b031633146119735760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b148061075a575061075a8261200f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119f18261111f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611aa35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610867565b6000611aae8361111f565b9050806001600160a01b0316846001600160a01b03161480611ae95750836001600160a01b0316611ade846107f2565b6001600160a01b0316145b80611b1957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b348261111f565b6001600160a01b031614611b985760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610867565b6001600160a01b038216611bfa5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610867565b611c0583838361205f565b611c106000826119bc565b6001600160a01b0383166000908152600360205260408120805460019290611c39908490612ac0565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c67908490612a8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081611cec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d165780611d0081612aa5565b9150611d0f9050600a83612b03565b9150611cf0565b60008167ffffffffffffffff811115611d3157611d31612736565b6040519080825280601f01601f191660200182016040528015611d5b576020820181803683370190505b5090505b8415611b1957611d70600183612ac0565b9150611d7d600a86612c79565b611d88906030612a8d565b60f81b818381518110611d9d57611d9d612ad7565b60200101906001600160f81b031916908160001a905350611dbf600a86612b03565b9450611d5f565b6110e282826040518060200160405280600081525061206a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611e945760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610867565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f0c848484611b21565b611f188484848461209d565b6117d05760405162461bcd60e51b815260040161086790612c8d565b6000818152600260205260409020546060906001600160a01b0316611fb35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610867565b6000611fbd61219b565b90506000815111611fdd5760405180602001604052806000815250612008565b80611fe784611cc8565b604051602001611ff8929190612cdf565b6040516020818303038152906040525b9392505050565b60006001600160e01b031982166380ac58cd60e01b148061204057506001600160e01b03198216635b5e139f60e01b145b8061075a57506301ffc9a760e01b6001600160e01b031983161461075a565b61099d8383836121aa565b6120748383612262565b612081600084848461209d565b61099d5760405162461bcd60e51b815260040161086790612c8d565b60006001600160a01b0384163b1561219057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120e1903390899088908890600401612d05565b6020604051808303816000875af192505050801561211c575060408051601f3d908101601f1916820190925261211991810190612d42565b60015b612176573d80801561214a576040519150601f19603f3d011682016040523d82523d6000602084013e61214f565b606091505b50805161216e5760405162461bcd60e51b815260040161086790612c8d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b19565b506001949350505050565b60606019805461076f9061291a565b6001600160a01b0383166122055761220081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612228565b816001600160a01b0316836001600160a01b0316146122285761222883826123b0565b6001600160a01b03821661223f5761099d8161244d565b826001600160a01b0316826001600160a01b03161461099d5761099d82826124fc565b6001600160a01b0382166122b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610867565b6000818152600260205260409020546001600160a01b03161561231d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610867565b6123296000838361205f565b6001600160a01b0382166000908152600360205260408120805460019290612352908490612a8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016123bd84611196565b6123c79190612ac0565b60008381526007602052604090205490915080821461241a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061245f90600190612ac0565b6000838152600960205260408120546008805493945090928490811061248757612487612ad7565b9060005260206000200154905080600883815481106124a8576124a8612ad7565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124e0576124e0612d5f565b6001900381819060005260206000200160009055905550505050565b600061250783611196565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461254c9061291a565b90600052602060002090601f01602090048101928261256e57600085556125b4565b82601f1061258757805160ff19168380011785556125b4565b828001600101855582156125b4579182015b828111156125b4578251825591602001919060010190612599565b506125c09291506125c4565b5090565b5b808211156125c057600081556001016125c5565b6001600160e01b03198116811461194657600080fd5b60006020828403121561260157600080fd5b8135612008816125d9565b60005b8381101561262757818101518382015260200161260f565b838111156117d05750506000910152565b6000815180845261265081602086016020860161260c565b601f01601f19169290920160200192915050565b6020815260006120086020830184612638565b60006020828403121561268957600080fd5b5035919050565b80356001600160a01b03811681146126a757600080fd5b919050565b600080604083850312156126bf57600080fd5b6126c883612690565b946020939093013593505050565b6000806000606084860312156126eb57600080fd5b6126f484612690565b925061270260208501612690565b9150604084013590509250925092565b60006020828403121561272457600080fd5b813561ffff8116811461200857600080fd5b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561276757612767612736565b604051601f8501601f19908116603f0116810190828211818310171561278f5761278f612736565b816040528093508581528686860111156127a857600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127d457600080fd5b813567ffffffffffffffff8111156127eb57600080fd5b8201601f810184136127fc57600080fd5b611b198482356020840161274c565b60006020828403121561281d57600080fd5b61200882612690565b801515811461194657600080fd5b6000806040838503121561284757600080fd5b61285083612690565b9150602083013561286081612826565b809150509250929050565b6000806000806080858703121561288157600080fd5b61288a85612690565b935061289860208601612690565b925060408501359150606085013567ffffffffffffffff8111156128bb57600080fd5b8501601f810187136128cc57600080fd5b6128db8782356020840161274c565b91505092959194509250565b600080604083850312156128fa57600080fd5b61290383612690565b915061291160208401612690565b90509250929050565b600181811c9082168061292e57607f821691505b6020821081141561294f57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612a1057612a106129dd565b01949350505050565b6000816000190483118215151615612a3357612a336129dd565b500290565b6d02cb7ba9036bab9ba1039b2b732160951b815260008251612a6181600e85016020870161260c565b74103bb2b4903a379036b4b73a1030903a37b5b2b71760591b600e939091019283015250602301919050565b60008219821115612aa057612aa06129dd565b500190565b6000600019821415612ab957612ab96129dd565b5060010190565b600082821015612ad257612ad26129dd565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082612b1257612b12612aed565b500490565b600060ff821660ff811415612b2e57612b2e6129dd565b60010192915050565b60208082526028908201527f596f752063616e2774206d696e74206173206d616e7920746f6b656e732061746040820152671030903a34b6b29760c11b606082015260800190565b60208082526022908201527f416c6c204e465473206861766520616c7265616479206265656e206d696e7465604082015261321760f11b606082015260800190565b6020808252602d908201527f596f75206172656164792068617665206d6f726520746f6b656e207468616e2060408201526c3cb7ba9031b0b71036b4b73a1760991b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612c5557600080fd5b5051919050565b600060208284031215612c6e57600080fd5b815161200881612826565b600082612c8857612c88612aed565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351612cf181846020880161260c565b835190830190612a1081836020880161260c565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3890830184612638565b9695505050505050565b600060208284031215612d5457600080fd5b8151612008816125d9565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205346cff525f5a52c113378f6db97f84a2b8592831818ec7164c3b5e1ced2a3ad64736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106102465760003560e01c8063715018a611610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461067a578063e985e9c51461069a578063ea9fbac7146106e3578063f2fde38b146106f9578063f80f5dd514610719578063fc1a1c361461073957600080fd5b8063a22cb465146105e4578063a39ed6c214610604578063a945bf8014610624578063b88d4fde1461063a578063c62752551461065a57600080fd5b806389476069116100fd57806389476069146105515780638da5cb5b146105715780638e96e3cb1461058f57806395d89b41146105af57806396e3fa70146105c457600080fd5b8063715018a6146104c6578063717d57d3146104db578063722e141d146104fb57806374cc30611461051157806378c8cda71461053157600080fd5b80633d3066d7116101c757806355f804b31161018b57806355f804b31461043b5780635bf177731461045b5780635dc70c71146104715780636352211e1461048657806370a08231146104a657600080fd5b80633d3066d71461039957806342842e0e146103cd578063464d31db146103ed57806349eb869c146104005780634f6ccce71461041b57600080fd5b806323b872dd1161020e57806323b872dd1461031b57806323cf0a221461033b5780632f745c591461034e578063305c7d4a1461036e5780633ccfd60b1461038457600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046125ef565b61074f565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610760565b6040516102779190612664565b3480156102ae57600080fd5b506102c26102bd366004612677565b6107f2565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046126ac565b61088c565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b506102fa6103363660046126d6565b6109a2565b6102fa610349366004612712565b6109d3565b34801561035a57600080fd5b5061030d6103693660046126ac565b610c34565b34801561037a57600080fd5b5061030d60145481565b34801561039057600080fd5b506102fa610cca565b3480156103a557600080fd5b50601a546103ba9062010000900461ffff1681565b60405161ffff9091168152602001610277565b3480156103d957600080fd5b506102fa6103e83660046126d6565b610dfd565b6102fa6103fb366004612712565b610e18565b34801561040c57600080fd5b50601a546103ba9061ffff1681565b34801561042757600080fd5b5061030d610436366004612677565b611012565b34801561044757600080fd5b506102fa6104563660046127c2565b6110a5565b34801561046757600080fd5b5061030d60185481565b34801561047d57600080fd5b506102fa6110e6565b34801561049257600080fd5b506102c26104a1366004612677565b61111f565b3480156104b257600080fd5b5061030d6104c136600461280b565b611196565b3480156104d257600080fd5b506102fa61121d565b3480156104e757600080fd5b506102fa6104f6366004612677565b611253565b34801561050757600080fd5b5061030d60175481565b34801561051d57600080fd5b506102fa61052c36600461280b565b611282565b34801561053d57600080fd5b506102fa61054c36600461280b565b6112d0565b34801561055d57600080fd5b506102fa61056c36600461280b565b61131b565b34801561057d57600080fd5b50600a546001600160a01b03166102c2565b34801561059b57600080fd5b506102fa6105aa36600461280b565b6115a2565b3480156105bb57600080fd5b506102956115ed565b3480156105d057600080fd5b506102fa6105df3660046127c2565b6115fc565b3480156105f057600080fd5b506102fa6105ff366004612834565b611639565b34801561061057600080fd5b506102fa61061f366004612712565b611644565b34801561063057600080fd5b5061030d60135481565b34801561064657600080fd5b506102fa61065536600461286b565b61179e565b34801561066657600080fd5b506102fa610675366004612677565b6117d6565b34801561068657600080fd5b50610295610695366004612677565b611805565b3480156106a657600080fd5b5061026b6106b53660046128e7565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ef57600080fd5b5061030d60155481565b34801561070557600080fd5b506102fa61071436600461280b565b6118ae565b34801561072557600080fd5b506102fa61073436600461280b565b611949565b34801561074557600080fd5b5061030d60165481565b600061075a82611997565b92915050565b60606000805461076f9061291a565b80601f016020809104026020016040519081016040528092919081815260200182805461079b9061291a565b80156107e85780601f106107bd576101008083540402835291602001916107e8565b820191906000526020600020905b8154815290600101906020018083116107cb57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108705760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108978261111f565b9050806001600160a01b0316836001600160a01b031614156109055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610867565b336001600160a01b0382161480610921575061092181336106b5565b6109935760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610867565b61099d83836119bc565b505050565b6109ac3382611a2a565b6109c85760405162461bcd60e51b815260040161086790612955565b61099d838383611b21565b6002600b5414156109f65760405162461bcd60e51b8152600401610867906129a6565b6002600b5560145461ffff82161115610a625760405162461bcd60e51b815260206004820152602860248201527f596f752063616e2774206d696e74206173206d75636820746f6b656e732061746044820152671030903a34b6b29760c11b6064820152608401610867565b601a5461ffff80821691610a7e918491620100009004166129f3565b61ffff161115610ada5760405162461bcd60e51b815260206004820152602160248201527f416c6c204e465473206861766520616c7265616479206265656e206d696e74656044820152601960fa1b6064820152608401610867565b601354610aeb9061ffff8316612a19565b341015610af9601354611cc8565b604051602001610b099190612a38565b60405160208183030381529060405290610b365760405162461bcd60e51b81526004016108679190612664565b506015548161ffff16610b4833611196565b610b529190612a8d565b1115610bb25760405162461bcd60e51b815260206004820152602960248201527f596f7520616c72656164792068617665206d617820746f6b656e7320796f752060448201526831b0b71036b4b73a1760b91b6064820152608401610867565b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff16610be191906129f3565b92506101000a81548161ffff021916908361ffff160217905550610c1933601a60029054906101000a900461ffff1661ffff16611dc6565b80610c2381612aa5565b915050610bb5565b50506001600b55565b6000610c3f83611196565b8210610ca15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610867565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b478060005b610cdb60016002612ac0565b8160ff161015610da55760006103e88460128460ff1660028110610d0157610d01612ad7565b601091828204019190066002029054906101000a900461ffff1661ffff16610d299190612a19565b610d339190612b03565b905060108260ff1660028110610d4b57610d4b612ad7565b01546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610d84573d6000803e3d6000fd5b50610d8f8184612ac0565b9250508080610d9d90612b17565b915050610ccf565b506010610db460016002612ac0565b60028110610dc457610dc4612ad7565b01546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561099d573d6000803e3d6000fd5b61099d8383836040518060200160405280600081525061179e565b6002600b541415610e3b5760405162461bcd60e51b8152600401610867906129a6565b6002600b5560175461ffff82161115610e665760405162461bcd60e51b815260040161086790612b37565b601a5461ffff80821691610e82918491620100009004166129f3565b61ffff161115610ea45760405162461bcd60e51b815260040161086790612b7f565b336000908152600e602052604090205460ff16610f035760405162461bcd60e51b815260206004820152601760248201527f596f75277265206e6f742077686974656c69737465642e0000000000000000006044820152606401610867565b601654610f149061ffff8316612a19565b341015610f22601654611cc8565b604051602001610f329190612a38565b60405160208183030381529060405290610f5f5760405162461bcd60e51b81526004016108679190612664565b506018548161ffff16610f7133611196565b610f7b9190612a8d565b1115610f995760405162461bcd60e51b815260040161086790612bc1565b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff16610fc891906129f3565b92506101000a81548161ffff021916908361ffff16021790555061100033601a60029054906101000a900461ffff1661ffff16611dc6565b8061100a81612aa5565b915050610f9c565b600061101d60085490565b82106110805760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610867565b6008828154811061109357611093612ad7565b90600052602060002001549050919050565b600a546001600160a01b031633146110cf5760405162461bcd60e51b815260040161086790612c0e565b80516110e2906019906020840190612540565b5050565b600a546001600160a01b031633146111105760405162461bcd60e51b815260040161086790612c0e565b600c805460ff19166001179055565b6000818152600260205260408120546001600160a01b03168061075a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610867565b60006001600160a01b0382166112015760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610867565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146112475760405162461bcd60e51b815260040161086790612c0e565b6112516000611de0565b565b600a546001600160a01b0316331461127d5760405162461bcd60e51b815260040161086790612c0e565b601655565b600a546001600160a01b031633146112ac5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b600a546001600160a01b031633146112fa5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611364573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113889190612c43565b905080806113d85760405162461bcd60e51b815260206004820152601e60248201527f5468657265206973206e6f20746f6b656e20746f2077697468647261772e00006044820152606401610867565b60005b6113e760016002612ac0565b8160ff1610156114fa5760006103e88460128460ff166002811061140d5761140d612ad7565b601091828204019190066002029054906101000a900461ffff1661ffff166114359190612a19565b61143f9190612b03565b9050846001600160a01b031663a9059cbb60108460ff166002811061146657611466612ad7565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156114b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d99190612c5c565b506114e48184612ac0565b92505080806114f290612b17565b9150506113db565b506001600160a01b03831663a9059cbb601061151860016002612ac0565b6002811061152857611528612ad7565b015460405160e083901b6001600160e01b03191681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611577573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159b9190612c5c565b5050505050565b600a546001600160a01b031633146115cc5760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600f60205260409020805460ff19169055565b60606001805461076f9061291a565b600a546001600160a01b031633146116265760405162461bcd60e51b815260040161086790612c0e565b80516110e290600d906020840190612540565b6110e2338383611e32565b6002600b5414156116675760405162461bcd60e51b8152600401610867906129a6565b6002600b5560175461ffff821611156116925760405162461bcd60e51b815260040161086790612b37565b601a5461ffff808216916116ae918491620100009004166129f3565b61ffff1611156116d05760405162461bcd60e51b815260040161086790612b7f565b6018548161ffff166116e133611196565b6116eb9190612a8d565b11156117095760405162461bcd60e51b815260040161086790612bc1565b336000908152600f602052604090205460ff1661172557600080fd5b60005b8161ffff16811015610c2b576001601a60028282829054906101000a900461ffff1661175491906129f3565b92506101000a81548161ffff021916908361ffff16021790555061178c33601a60029054906101000a900461ffff1661ffff16611dc6565b8061179681612aa5565b915050611728565b6117a83383611a2a565b6117c45760405162461bcd60e51b815260040161086790612955565b6117d084848484611f01565b50505050565b600a546001600160a01b031633146118005760405162461bcd60e51b815260040161086790612c0e565b601355565b600c5460609060ff161561181c5761075a82611f34565b600d80546118299061291a565b80601f01602080910402602001604051908101604052809291908181526020018280546118559061291a565b80156118a25780601f10611877576101008083540402835291602001916118a2565b820191906000526020600020905b81548152906001019060200180831161188557829003601f168201915b50505050509050919050565b600a546001600160a01b031633146118d85760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03811661193d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610867565b61194681611de0565b50565b600a546001600160a01b031633146119735760405162461bcd60e51b815260040161086790612c0e565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b60006001600160e01b0319821663780e9d6360e01b148061075a575061075a8261200f565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906119f18261111f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611aa35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610867565b6000611aae8361111f565b9050806001600160a01b0316846001600160a01b03161480611ae95750836001600160a01b0316611ade846107f2565b6001600160a01b0316145b80611b1957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b348261111f565b6001600160a01b031614611b985760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610867565b6001600160a01b038216611bfa5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610867565b611c0583838361205f565b611c106000826119bc565b6001600160a01b0383166000908152600360205260408120805460019290611c39908490612ac0565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c67908490612a8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081611cec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611d165780611d0081612aa5565b9150611d0f9050600a83612b03565b9150611cf0565b60008167ffffffffffffffff811115611d3157611d31612736565b6040519080825280601f01601f191660200182016040528015611d5b576020820181803683370190505b5090505b8415611b1957611d70600183612ac0565b9150611d7d600a86612c79565b611d88906030612a8d565b60f81b818381518110611d9d57611d9d612ad7565b60200101906001600160f81b031916908160001a905350611dbf600a86612b03565b9450611d5f565b6110e282826040518060200160405280600081525061206a565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b03161415611e945760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610867565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611f0c848484611b21565b611f188484848461209d565b6117d05760405162461bcd60e51b815260040161086790612c8d565b6000818152600260205260409020546060906001600160a01b0316611fb35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610867565b6000611fbd61219b565b90506000815111611fdd5760405180602001604052806000815250612008565b80611fe784611cc8565b604051602001611ff8929190612cdf565b6040516020818303038152906040525b9392505050565b60006001600160e01b031982166380ac58cd60e01b148061204057506001600160e01b03198216635b5e139f60e01b145b8061075a57506301ffc9a760e01b6001600160e01b031983161461075a565b61099d8383836121aa565b6120748383612262565b612081600084848461209d565b61099d5760405162461bcd60e51b815260040161086790612c8d565b60006001600160a01b0384163b1561219057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906120e1903390899088908890600401612d05565b6020604051808303816000875af192505050801561211c575060408051601f3d908101601f1916820190925261211991810190612d42565b60015b612176573d80801561214a576040519150601f19603f3d011682016040523d82523d6000602084013e61214f565b606091505b50805161216e5760405162461bcd60e51b815260040161086790612c8d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b19565b506001949350505050565b60606019805461076f9061291a565b6001600160a01b0383166122055761220081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612228565b816001600160a01b0316836001600160a01b0316146122285761222883826123b0565b6001600160a01b03821661223f5761099d8161244d565b826001600160a01b0316826001600160a01b03161461099d5761099d82826124fc565b6001600160a01b0382166122b85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610867565b6000818152600260205260409020546001600160a01b03161561231d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610867565b6123296000838361205f565b6001600160a01b0382166000908152600360205260408120805460019290612352908490612a8d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016123bd84611196565b6123c79190612ac0565b60008381526007602052604090205490915080821461241a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061245f90600190612ac0565b6000838152600960205260408120546008805493945090928490811061248757612487612ad7565b9060005260206000200154905080600883815481106124a8576124a8612ad7565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124e0576124e0612d5f565b6001900381819060005260206000200160009055905550505050565b600061250783611196565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461254c9061291a565b90600052602060002090601f01602090048101928261256e57600085556125b4565b82601f1061258757805160ff19168380011785556125b4565b828001600101855582156125b4579182015b828111156125b4578251825591602001919060010190612599565b506125c09291506125c4565b5090565b5b808211156125c057600081556001016125c5565b6001600160e01b03198116811461194657600080fd5b60006020828403121561260157600080fd5b8135612008816125d9565b60005b8381101561262757818101518382015260200161260f565b838111156117d05750506000910152565b6000815180845261265081602086016020860161260c565b601f01601f19169290920160200192915050565b6020815260006120086020830184612638565b60006020828403121561268957600080fd5b5035919050565b80356001600160a01b03811681146126a757600080fd5b919050565b600080604083850312156126bf57600080fd5b6126c883612690565b946020939093013593505050565b6000806000606084860312156126eb57600080fd5b6126f484612690565b925061270260208501612690565b9150604084013590509250925092565b60006020828403121561272457600080fd5b813561ffff8116811461200857600080fd5b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561276757612767612736565b604051601f8501601f19908116603f0116810190828211818310171561278f5761278f612736565b816040528093508581528686860111156127a857600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156127d457600080fd5b813567ffffffffffffffff8111156127eb57600080fd5b8201601f810184136127fc57600080fd5b611b198482356020840161274c565b60006020828403121561281d57600080fd5b61200882612690565b801515811461194657600080fd5b6000806040838503121561284757600080fd5b61285083612690565b9150602083013561286081612826565b809150509250929050565b6000806000806080858703121561288157600080fd5b61288a85612690565b935061289860208601612690565b925060408501359150606085013567ffffffffffffffff8111156128bb57600080fd5b8501601f810187136128cc57600080fd5b6128db8782356020840161274c565b91505092959194509250565b600080604083850312156128fa57600080fd5b61290383612690565b915061291160208401612690565b90509250929050565b600181811c9082168061292e57607f821691505b6020821081141561294f57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818516808303821115612a1057612a106129dd565b01949350505050565b6000816000190483118215151615612a3357612a336129dd565b500290565b6d02cb7ba9036bab9ba1039b2b732160951b815260008251612a6181600e85016020870161260c565b74103bb2b4903a379036b4b73a1030903a37b5b2b71760591b600e939091019283015250602301919050565b60008219821115612aa057612aa06129dd565b500190565b6000600019821415612ab957612ab96129dd565b5060010190565b600082821015612ad257612ad26129dd565b500390565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082612b1257612b12612aed565b500490565b600060ff821660ff811415612b2e57612b2e6129dd565b60010192915050565b60208082526028908201527f596f752063616e2774206d696e74206173206d616e7920746f6b656e732061746040820152671030903a34b6b29760c11b606082015260800190565b60208082526022908201527f416c6c204e465473206861766520616c7265616479206265656e206d696e7465604082015261321760f11b606082015260800190565b6020808252602d908201527f596f75206172656164792068617665206d6f726520746f6b656e207468616e2060408201526c3cb7ba9031b0b71036b4b73a1760991b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612c5557600080fd5b5051919050565b600060208284031215612c6e57600080fd5b815161200881612826565b600082612c8857612c88612aed565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008351612cf181846020880161260c565b835190830190612a1081836020880161260c565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3890830184612638565b9695505050505050565b600060208284031215612d5457600080fd5b8151612008816125d9565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205346cff525f5a52c113378f6db97f84a2b8592831818ec7164c3b5e1ced2a3ad64736f6c634300080c0033
Deployed Bytecode Sourcemap
249:14546:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9686:205;;;;;;;;;;-1:-1:-1;9686:205:11;;;;;:::i;:::-;;:::i;:::-;;;565:14:15;;558:22;540:41;;528:2;513:18;9686:205:11;;;;;;;;2408:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3920:217::-;;;;;;;;;;-1:-1:-1;3920:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:15;;;1674:51;;1662:2;1647:18;3920:217:3;1528:203:15;3458:401:3;;;;;;;;;;-1:-1:-1;3458:401:3;;;;;:::i;:::-;;:::i;:::-;;1614:111:4;;;;;;;;;;-1:-1:-1;1701:10:4;:17;1614:111;;;2319:25:15;;;2307:2;2292:18;1614:111:4;2173:177:15;4647:330:3;;;;;;;;;;-1:-1:-1;4647:330:3;;;;;:::i;:::-;;:::i;11306:927:11:-;;;;;;:::i;:::-;;:::i;1290:253:4:-;;;;;;;;;;-1:-1:-1;1290:253:4;;;;;:::i;:::-;;:::i;7655:33:11:-;;;;;;;;;;;;;;;;9961:518;;;;;;;;;;;;;:::i;8196:28::-;;;;;;;;;;-1:-1:-1;8196:28:11;;;;;;;;;;;;;;3139:6:15;3127:19;;;3109:38;;3097:2;3082:18;8196:28:11;2965:188:15;5043:179:3;;;;;;;;;;-1:-1:-1;5043:179:3;;;;;:::i;:::-;;:::i;12999:1024:11:-;;;;;;:::i;:::-;;:::i;8131:30::-;;;;;;;;;;-1:-1:-1;8131:30:11;;;;;;;;1797:230:4;;;;;;;;;;-1:-1:-1;1797:230:4;;;;;:::i;:::-;;:::i;8601:107:11:-;;;;;;;;;;-1:-1:-1;8601:107:11;;;;;:::i;:::-;;:::i;7929:37::-;;;;;;;;;;;;;;;;14718:75;;;;;;;;;;;;;:::i;2111:235:3:-;;;;;;;;;;-1:-1:-1;2111:235:3;;;;;:::i;:::-;;:::i;1849:205::-;;;;;;;;;;-1:-1:-1;1849:205:3;;;;;:::i;:::-;;:::i;1661:101:12:-;;;;;;;;;;;;;:::i;9120:106:11:-;;;;;;;;;;-1:-1:-1;9120:106:11;;;;;:::i;:::-;;:::i;7888:35::-;;;;;;;;;;;;;;;;14375:115;;;;;;;;;;-1:-1:-1;14375:115:11;;;;;:::i;:::-;;:::i;14216:116::-;;;;;;;;;;-1:-1:-1;14216:116:11;;;;;:::i;:::-;;:::i;10540:732::-;;;;;;;;;;-1:-1:-1;10540:732:11;;;;;:::i;:::-;;:::i;1029:85:12:-;;;;;;;;;;-1:-1:-1;1101:6:12;;-1:-1:-1;;;;;1101:6:12;1029:85;;14532:119:11;;;;;;;;;;-1:-1:-1;14532:119:11;;;;;:::i;:::-;;:::i;2570:102:3:-;;;;;;;;;;;;;:::i;8920:144:11:-;;;;;;;;;;-1:-1:-1;8920:144:11;;;;;:::i;:::-;;:::i;4204:153:3:-;;;;;;;;;;-1:-1:-1;4204:153:3;;;;;:::i;:::-;;:::i;12267:682:11:-;;;;;;;;;;-1:-1:-1;12267:682:11;;;;;:::i;:::-;;:::i;7562:33::-;;;;;;;;;;;;;;;;5288:320:3;;;;;;;;;;-1:-1:-1;5288:320:3;;;;;:::i;:::-;;:::i;8764:100:11:-;;;;;;;;;;-1:-1:-1;8764:100:11;;;;;:::i;:::-;;:::i;9392:240::-;;;;;;;;;;-1:-1:-1;9392:240:11;;;;;:::i;:::-;;:::i;4423:162:3:-;;;;;;;;;;-1:-1:-1;4423:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4543:25:3;;;4520:4;4543:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4423:162;7694:35:11;;;;;;;;;;;;;;;;1911:198:12;;;;;;;;;;-1:-1:-1;1911:198:12;;;;;:::i;:::-;;:::i;14062:112:11:-;;;;;;;;;;-1:-1:-1;14062:112:11;;;;;:::i;:::-;;:::i;7787:36::-;;;;;;;;;;;;;;;;9686:205;9821:4;9848:36;9872:11;9848:23;:36::i;:::-;9841:43;9686:205;-1:-1:-1;;9686:205:11:o;2408:98:3:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3920:217::-;3996:7;7168:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7168:16:3;4015:73;;;;-1:-1:-1;;;4015:73:3;;6541:2:15;4015:73:3;;;6523:21:15;6580:2;6560:18;;;6553:30;6619:34;6599:18;;;6592:62;-1:-1:-1;;;6670:18:15;;;6663:42;6722:19;;4015:73:3;;;;;;;;;-1:-1:-1;4106:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4106:24:3;;3920:217::o;3458:401::-;3538:13;3554:23;3569:7;3554:14;:23::i;:::-;3538:39;;3601:5;-1:-1:-1;;;;;3595:11:3;:2;-1:-1:-1;;;;;3595:11:3;;;3587:57;;;;-1:-1:-1;;;3587:57:3;;6954:2:15;3587:57:3;;;6936:21:15;6993:2;6973:18;;;6966:30;7032:34;7012:18;;;7005:62;-1:-1:-1;;;7083:18:15;;;7076:31;7124:19;;3587:57:3;6752:397:15;3587:57:3;719:10:1;-1:-1:-1;;;;;3676:21:3;;;;:62;;-1:-1:-1;3701:37:3;3718:5;719:10:1;4423:162:3;:::i;3701:37::-;3655:165;;;;-1:-1:-1;;;3655:165:3;;7356:2:15;3655:165:3;;;7338:21:15;7395:2;7375:18;;;7368:30;7434:34;7414:18;;;7407:62;7505:26;7485:18;;;7478:54;7549:19;;3655:165:3;7154:420:15;3655:165:3;3831:21;3840:2;3844:7;3831:8;:21::i;:::-;3528:331;3458:401;;:::o;4647:330::-;4836:41;719:10:1;4869:7:3;4836:18;:41::i;:::-;4828:103;;;;-1:-1:-1;;;4828:103:3;;;;;;;:::i;:::-;4942:28;4952:4;4958:2;4962:7;4942:9;:28::i;11306:927:11:-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;;;;;;:::i;:::-;1744:1;2455:7;:18;11416:13:11::1;::::0;11400:29:::1;::::0;::::1;;;11379:116;;;::::0;-1:-1:-1;;;11379:116:11;;8559:2:15;11379:116:11::1;::::0;::::1;8541:21:15::0;8598:2;8578:18;;;8571:30;8637:34;8617:18;;;8610:62;-1:-1:-1;;;8688:18:15;;;8681:38;8736:19;;11379:116:11::1;8357:404:15::0;11379:116:11::1;11555:9;::::0;::::1;::::0;;::::1;::::0;11526:25:::1;::::0;11539:12;;11526:10;;::::1;;:25;:::i;:::-;:38;;;;11505:118;;;::::0;-1:-1:-1;;;11505:118:11;;9329:2:15;11505:118:11::1;::::0;::::1;9311:21:15::0;9368:2;9348:18;;;9341:30;9407:34;9387:18;;;9380:62;-1:-1:-1;;;9458:18:15;;;9451:31;9499:19;;11505:118:11::1;9127:397:15::0;11505:118:11::1;11682:11;::::0;11667:26:::1;::::0;::::1;::::0;::::1;;:::i;:::-;11654:9;:39;;11807:29;11824:11;;11807:16;:29::i;:::-;11731:168;;;;;;;;:::i;:::-;;;;;;;;;;;;;11633:290;;;;;-1:-1:-1::0;;;11633:290:11::1;;;;;;;;:::i;:::-;;11994:14;;11978:12;11954:36;;:21;11964:10;11954:9;:21::i;:::-;:36;;;;:::i;:::-;:54;;11933:142;;;::::0;-1:-1:-1;;;11933:142:11;;10650:2:15;11933:142:11::1;::::0;::::1;10632:21:15::0;10689:2;10669:18;;;10662:30;10728:34;10708:18;;;10701:62;-1:-1:-1;;;10779:18:15;;;10772:39;10828:19;;11933:142:11::1;10448:405:15::0;11933:142:11::1;12090:13;12085:142;12117:12;12109:20;;:5;:20;12085:142;;;12168:1;12154:10;;:15;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12183:33;12193:10;12205;;;;;;;;;;;12183:33;;:9;:33::i;:::-;12131:7:::0;::::1;::::0;::::1;:::i;:::-;;;;12085:142;;;-1:-1:-1::0;;1701:1:13;2628:7;:22;11306:927:11:o;1290:253:4:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;-1:-1:-1;;;1406:87:4;;11200:2:15;1406:87:4;;;11182:21:15;11239:2;11219:18;;;11212:30;11278:34;11258:18;;;11251:62;-1:-1:-1;;;11329:18:15;;;11322:41;11380:19;;1406:87:4;10998:407:15;1406:87:4;-1:-1:-1;;;;;;1510:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1290:253::o;9961:518:11:-;10016:21;;9998:15;10091:276;10113:28;10140:1;10113:24;:28;:::i;:::-;10109:1;:32;;;10091:276;;;10162:23;10243:4;10216:7;10189:21;10211:1;10189:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:34;;;;;;:::i;:::-;10188:59;;;;:::i;:::-;10162:85;;10261:17;10279:1;10261:20;;;;;;;;;:::i;:::-;;;:46;;-1:-1:-1;;;;;10261:20:11;;;;:46;;;;;10291:15;;10261:20;:46;:20;:46;10291:15;10261:20;:46;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10321:35:11;10341:15;10321:35;;:::i;:::-;;;10148:219;10143:3;;;;;:::i;:::-;;;;10091:276;;;-1:-1:-1;10376:17:11;10394:28;10421:1;10394:24;:28;:::i;:::-;10376:47;;;;;;;:::i;:::-;;;:96;;-1:-1:-1;;;;;10376:47:11;;;;:96;;;;;10446:16;;10376:47;:96;:47;:96;10446:16;10376:47;:96;;;;;;;;;;;;;;;;;;;5043:179:3;5176:39;5193:4;5199:2;5203:7;5176:39;;;;;;;;;;;;:16;:39::i;12999:1024:11:-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;;;;;;:::i;:::-;1744:1;2455:7;:18;13118:16:11::1;::::0;13102:32:::1;::::0;::::1;;;13081:119;;;;-1:-1:-1::0;;;13081:119:11::1;;;;;;;:::i;:::-;13260:9;::::0;::::1;::::0;;::::1;::::0;13231:25:::1;::::0;13244:12;;13231:10;;::::1;;:25;:::i;:::-;:38;;;;13210:119;;;;-1:-1:-1::0;;;13210:119:11::1;;;;;;;:::i;:::-;13361:10;13347:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;13339:61;;;::::0;-1:-1:-1;;;13339:61:11;;13123:2:15;13339:61:11::1;::::0;::::1;13105:21:15::0;13162:2;13142:18;;;13135:30;13201:25;13181:18;;;13174:53;13244:18;;13339:61:11::1;12921:347:15::0;13339:61:11::1;13459:14;::::0;13444:29:::1;::::0;::::1;::::0;::::1;;:::i;:::-;13431:9;:42;;13587:32;13604:14;;13587:16;:32::i;:::-;13511:171;;;;;;;;:::i;:::-;;;;;;;;;;;;;13410:296;;;;;-1:-1:-1::0;;;13410:296:11::1;;;;;;;;:::i;:::-;;13777:17;;13761:12;13737:36;;:21;13747:10;13737:9;:21::i;:::-;:36;;;;:::i;:::-;:57;;13716:149;;;;-1:-1:-1::0;;;13716:149:11::1;;;;;;;:::i;:::-;13880:13;13875:142;13907:12;13899:20;;:5;:20;13875:142;;;13958:1;13944:10;;:15;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13973:33;13983:10;13995;;;;;;;;;;;13973:33;;:9;:33::i;:::-;13921:7:::0;::::1;::::0;::::1;:::i;:::-;;;;13875:142;;1797:230:4::0;1872:7;1907:30;1701:10;:17;;1614:111;1907:30;1899:5;:38;1891:95;;;;-1:-1:-1;;;1891:95:4;;13889:2:15;1891:95:4;;;13871:21:15;13928:2;13908:18;;;13901:30;13967:34;13947:18;;;13940:62;-1:-1:-1;;;14018:18:15;;;14011:42;14070:19;;1891:95:4;13687:408:15;1891:95:4;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;1996:24;;1797:230;;;:::o;8601:107:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;8674:27:11;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;:::-;;8601:107:::0;:::o;14718:75::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;14769:10:11::1;:17:::0;;-1:-1:-1;;14769:17:11::1;14782:4;14769:17;::::0;;14718:75::o;2111:235:3:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:3;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:3;;14663:2:15;2244:73:3;;;14645:21:15;14702:2;14682:18;;;14675:30;14741:34;14721:18;;;14714:62;-1:-1:-1;;;14792:18:15;;;14785:39;14841:19;;2244:73:3;14461:405:15;1849:205:3;1921:7;-1:-1:-1;;;;;1948:19:3;;1940:74;;;;-1:-1:-1;;;1940:74:3;;15073:2:15;1940:74:3;;;15055:21:15;15112:2;15092:18;;;15085:30;15151:34;15131:18;;;15124:62;-1:-1:-1;;;15202:18:15;;;15195:40;15252:19;;1940:74:3;14871:406:15;1940:74:3;-1:-1:-1;;;;;;2031:16:3;;;;;:9;:16;;;;;;;1849:205::o;1661:101:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;9120:106:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;9194:14:11::1;:25:::0;9120:106::o;14375:115::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;14449:27:11::1;;::::0;;;:14:::1;:27;::::0;;;;:34;;-1:-1:-1;;14449:34:11::1;14479:4;14449:34;::::0;;14375:115::o;14216:116::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;14291:26:11::1;14320:5;14291:26:::0;;;:13:::1;:26;::::0;;;;:34;;-1:-1:-1;;14291:34:11::1;::::0;;14216:116::o;10540:732::-;10677:38;;-1:-1:-1;;;10677:38:11;;10709:4;10677:38;;;1674:51:15;10634:14:11;;10604:20;;-1:-1:-1;;;;;10677:23:11;;;;;1647:18:15;;10677:38:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10659:56;-1:-1:-1;10659:56:11;10777:20;10769:63;;;;-1:-1:-1;;;10769:63:11;;15673:2:15;10769:63:11;;;15655:21:15;15712:2;15692:18;;;15685:30;15751:32;15731:18;;;15724:60;15801:18;;10769:63:11;15471:354:15;10769:63:11;10847:7;10842:291;10864:28;10891:1;10864:24;:28;:::i;:::-;10860:1;:32;;;10842:291;;;10913:23;10994:4;10967:7;10940:21;10962:1;10940:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:34;;;;;;:::i;:::-;10939:59;;;;:::i;:::-;10913:85;;11012:13;-1:-1:-1;;;;;11012:22:11;;11035:17;11053:1;11035:20;;;;;;;;;:::i;:::-;;;11012:61;;;;;;-1:-1:-1;;;;;;11012:61:11;;;-1:-1:-1;;;;;11035:20:11;;;11012:61;;;16012:51:15;16079:18;;;16072:34;;;15985:18;;11012:61:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;11087:35:11;11107:15;11087:35;;:::i;:::-;;;10899:234;10894:3;;;;;:::i;:::-;;;;10842:291;;;-1:-1:-1;;;;;;11142:22:11;;;11178:17;11196:28;11223:1;11196:24;:28;:::i;:::-;11178:47;;;;;;;:::i;:::-;;;11142:123;;;;;;-1:-1:-1;;;;;;11142:123:11;;;-1:-1:-1;;;;;11178:47:11;;;11142:123;;;16012:51:15;16079:18;;;16072:34;;;15985:18;;11142:123:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10594:678;;;10540:732;:::o;14532:119::-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;14609:27:11::1;14639:5;14609:27:::0;;;:14:::1;:27;::::0;;;;:35;;-1:-1:-1;;14609:35:11::1;::::0;;14532:119::o;2570:102:3:-;2626:13;2658:7;2651:14;;;;;:::i;8920:144:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;9026:31:11;;::::1;::::0;:20:::1;::::0;:31:::1;::::0;::::1;::::0;::::1;:::i;4204:153:3:-:0;4298:52;719:10:1;4331:8:3;4341;4298:18;:52::i;12267:682:11:-;1744:1:13;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:13;;;;;;;:::i;:::-;1744:1;2455:7;:18;12376:16:11::1;::::0;12360:32:::1;::::0;::::1;;;12339:119;;;;-1:-1:-1::0;;;12339:119:11::1;;;;;;;:::i;:::-;12518:9;::::0;::::1;::::0;;::::1;::::0;12489:25:::1;::::0;12502:12;;12489:10;;::::1;;:25;:::i;:::-;:38;;;;12468:119;;;;-1:-1:-1::0;;;12468:119:11::1;;;;;;;:::i;:::-;12658:17;;12642:12;12618:36;;:21;12628:10;12618:9;:21::i;:::-;:36;;;;:::i;:::-;:57;;12597:149;;;;-1:-1:-1::0;;;12597:149:11::1;;;;;;;:::i;:::-;12779:10;12764:26;::::0;;;:14:::1;:26;::::0;;;;;::::1;;12756:35;;;::::0;::::1;;12806:13;12801:142;12833:12;12825:20;;:5;:20;12801:142;;;12884:1;12870:10;;:15;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12899:33;12909:10;12921;;;;;;;;;;;12899:33;;:9;:33::i;:::-;12847:7:::0;::::1;::::0;::::1;:::i;:::-;;;;12801:142;;5288:320:3::0;5457:41;719:10:1;5490:7:3;5457:18;:41::i;:::-;5449:103;;;;-1:-1:-1;;;5449:103:3;;;;;;;:::i;:::-;5562:39;5576:4;5582:2;5586:7;5595:5;5562:13;:39::i;:::-;5288:320;;;;:::o;8764:100:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;8835:11:11::1;:22:::0;8764:100::o;9392:240::-;9522:10;;9489:13;;9522:10;;9518:71;;;9555:23;9570:7;9555:14;:23::i;9518:71::-;9605:20;9598:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9392:240;;;:::o;1911:198:12:-;1101:6;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1999:22:12;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:12;;16569:2:15;1991:73:12::1;::::0;::::1;16551:21:15::0;16608:2;16588:18;;;16581:30;16647:34;16627:18;;;16620:62;-1:-1:-1;;;16698:18:15;;;16691:36;16744:19;;1991:73:12::1;16367:402:15::0;1991:73:12::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;14062:112:11:-;1101:6:12;;-1:-1:-1;;;;;1101:6:12;719:10:1;1241:23:12;1233:68;;;;-1:-1:-1;;;1233:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;14134:26:11::1;;::::0;;;:13:::1;:26;::::0;;;;:33;;-1:-1:-1;;14134:33:11::1;14163:4;14134:33;::::0;;14062:112::o;989:222:4:-;1091:4;-1:-1:-1;;;;;;1114:50:4;;-1:-1:-1;;;1114:50:4;;:90;;;1168:36;1192:11;1168:23;:36::i;11089:171:3:-;11163:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11163:29:3;-1:-1:-1;;;;;11163:29:3;;;;;;;;:24;;11216:23;11163:24;11216:14;:23::i;:::-;-1:-1:-1;;;;;11207:46:3;;;;;;;;;;;11089:171;;:::o;7363:344::-;7456:4;7168:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7168:16:3;7472:73;;;;-1:-1:-1;;;7472:73:3;;16976:2:15;7472:73:3;;;16958:21:15;17015:2;16995:18;;;16988:30;17054:34;17034:18;;;17027:62;-1:-1:-1;;;17105:18:15;;;17098:42;17157:19;;7472:73:3;16774:408:15;7472:73:3;7555:13;7571:23;7586:7;7571:14;:23::i;:::-;7555:39;;7623:5;-1:-1:-1;;;;;7612:16:3;:7;-1:-1:-1;;;;;7612:16:3;;:51;;;;7656:7;-1:-1:-1;;;;;7632:31:3;:20;7644:7;7632:11;:20::i;:::-;-1:-1:-1;;;;;7632:31:3;;7612:51;:87;;;-1:-1:-1;;;;;;4543:25:3;;;4520:4;4543:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7667:32;7604:96;7363:344;-1:-1:-1;;;;7363:344:3:o;10373:605::-;10527:4;-1:-1:-1;;;;;10500:31:3;:23;10515:7;10500:14;:23::i;:::-;-1:-1:-1;;;;;10500:31:3;;10492:81;;;;-1:-1:-1;;;10492:81:3;;17389:2:15;10492:81:3;;;17371:21:15;17428:2;17408:18;;;17401:30;17467:34;17447:18;;;17440:62;-1:-1:-1;;;17518:18:15;;;17511:35;17563:19;;10492:81:3;17187:401:15;10492:81:3;-1:-1:-1;;;;;10591:16:3;;10583:65;;;;-1:-1:-1;;;10583:65:3;;17795:2:15;10583:65:3;;;17777:21:15;17834:2;17814:18;;;17807:30;17873:34;17853:18;;;17846:62;-1:-1:-1;;;17924:18:15;;;17917:34;17968:19;;10583:65:3;17593:400:15;10583:65:3;10659:39;10680:4;10686:2;10690:7;10659:20;:39::i;:::-;10760:29;10777:1;10781:7;10760:8;:29::i;:::-;-1:-1:-1;;;;;10800:15:3;;;;;;:9;:15;;;;;:20;;10819:1;;10800:15;:20;;10819:1;;10800:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10830:13:3;;;;;;:9;:13;;;;;:18;;10847:1;;10830:13;:18;;10847:1;;10830:18;:::i;:::-;;;;-1:-1:-1;;10858:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10858:21:3;-1:-1:-1;;;;;10858:21:3;;;;;;;;;10895:27;;10858:16;;10895:27;;;;;;;3528:331;3458:401;;:::o;328:703:14:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:14;;;;;;;;;;;;-1:-1:-1;;;627:10:14;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:14;;-1:-1:-1;773:2:14;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:14;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:14;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:14;;;;;;;;-1:-1:-1;972:11:14;981:2;972:11;;:::i;:::-;;;844:150;;8037:108:3;8112:26;8122:2;8126:7;8112:26;;;;;;;;;;;;:9;:26::i;2263:187:12:-;2355:6;;;-1:-1:-1;;;;;2371:17:12;;;-1:-1:-1;;;;;;2371:17:12;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;11395:307:3:-;11545:8;-1:-1:-1;;;;;11536:17:3;:5;-1:-1:-1;;;;;11536:17:3;;;11528:55;;;;-1:-1:-1;;;11528:55:3;;18317:2:15;11528:55:3;;;18299:21:15;18356:2;18336:18;;;18329:30;18395:27;18375:18;;;18368:55;18440:18;;11528:55:3;18115:349:15;11528:55:3;-1:-1:-1;;;;;11593:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11593:46:3;;;;;;;;;;11654:41;;540::15;;;11654::3;;513:18:15;11654:41:3;;;;;;;11395:307;;;:::o;6470:::-;6621:28;6631:4;6637:2;6641:7;6621:9;:28::i;:::-;6667:48;6690:4;6696:2;6700:7;6709:5;6667:22;:48::i;:::-;6659:111;;;;-1:-1:-1;;;6659:111:3;;;;;;;:::i;2738:329::-;7145:4;7168:16;;;:7;:16;;;;;;2811:13;;-1:-1:-1;;;;;7168:16:3;2836:76;;;;-1:-1:-1;;;2836:76:3;;19090:2:15;2836:76:3;;;19072:21:15;19129:2;19109:18;;;19102:30;19168:34;19148:18;;;19141:62;-1:-1:-1;;;19219:18:15;;;19212:45;19274:19;;2836:76:3;18888:411:15;2836:76:3;2923:21;2947:10;:8;:10::i;:::-;2923:34;;2998:1;2980:7;2974:21;:25;:86;;;;;;;;;;;;;;;;;3026:7;3035:18;:7;:16;:18::i;:::-;3009:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2974:86;2967:93;2738:329;-1:-1:-1;;;2738:329:3:o;1490:300::-;1592:4;-1:-1:-1;;;;;;1627:40:3;;-1:-1:-1;;;1627:40:3;;:104;;-1:-1:-1;;;;;;;1683:48:3;;-1:-1:-1;;;1683:48:3;1627:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:2;;;1747:36:3;829:155:2;8309:209:11;8466:45;8493:4;8499:2;8503:7;8466:26;:45::i;8366:311:3:-;8491:18;8497:2;8501:7;8491:5;:18::i;:::-;8540:54;8571:1;8575:2;8579:7;8588:5;8540:22;:54::i;:::-;8519:151;;;;-1:-1:-1;;;8519:151:3;;;;;;;:::i;12255:778::-;12405:4;-1:-1:-1;;;;;12425:13:3;;1450:19:0;:23;12421:606:3;;12460:72;;-1:-1:-1;;;12460:72:3;;-1:-1:-1;;;;;12460:36:3;;;;;:72;;719:10:1;;12511:4:3;;12517:7;;12526:5;;12460:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12460:72:3;;;;;;;;-1:-1:-1;;12460:72:3;;;;;;;;;;;;:::i;:::-;;;12456:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12699:13:3;;12695:266;;12741:60;;-1:-1:-1;;;12741:60:3;;;;;;;:::i;12695:266::-;12913:6;12907:13;12898:6;12894:2;12890:15;12883:38;12456:519;-1:-1:-1;;;;;;12582:51:3;-1:-1:-1;;;12582:51:3;;-1:-1:-1;12575:58:3;;12421:606;-1:-1:-1;13012:4:3;12255:778;;;;;;:::o;9271:115:11:-;9331:13;9363:16;9356:23;;;;;:::i;2623:572:4:-;-1:-1:-1;;;;;2822:18:4;;2818:183;;2856:40;2888:7;4004:10;:17;;3977:24;;;;:15;:24;;;;;:44;;;4031:24;;;;;;;;;;;;3901:161;2856:40;2818:183;;;2925:2;-1:-1:-1;;;;;2917:10:4;:4;-1:-1:-1;;;;;2917:10:4;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;-1:-1:-1;;;;;3014:16:4;;3010:179;;3046:45;3083:7;3046:36;:45::i;3010:179::-;3118:4;-1:-1:-1;;;;;3112:10:4;:2;-1:-1:-1;;;;;3112:10:4;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;8999:427:3:-;-1:-1:-1;;;;;9078:16:3;;9070:61;;;;-1:-1:-1;;;9070:61:3;;20729:2:15;9070:61:3;;;20711:21:15;;;20748:18;;;20741:30;20807:34;20787:18;;;20780:62;20859:18;;9070:61:3;20527:356:15;9070:61:3;7145:4;7168:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7168:16:3;:30;9141:58;;;;-1:-1:-1;;;9141:58:3;;21090:2:15;9141:58:3;;;21072:21:15;21129:2;21109:18;;;21102:30;21168;21148:18;;;21141:58;21216:18;;9141:58:3;20888:352:15;9141:58:3;9210:45;9239:1;9243:2;9247:7;9210:20;:45::i;:::-;-1:-1:-1;;;;;9266:13:3;;;;;;:9;:13;;;;;:18;;9283:1;;9266:13;:18;;9283:1;;9266:18;:::i;:::-;;;;-1:-1:-1;;9294:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9294:21:3;-1:-1:-1;;;;;9294:21:3;;;;;;;;9331:33;;9294:16;;;9331:33;;9294:16;;9331:33;8674:27:11::1;8601:107:::0;:::o;4679:970:4:-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;5002:18;5023:26;;;:17;:26;;;;;;4941:51;;-1:-1:-1;5153:28:4;;;5149:323;;-1:-1:-1;;;;;5219:18:4;;5197:19;5219:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5268:30;;;;;;:44;;;5384:30;;:17;:30;;;;;:43;;;5149:323;-1:-1:-1;5565:26:4;;;;:17;:26;;;;;;;;5558:33;;;-1:-1:-1;;;;;5608:18:4;;;;;:12;:18;;;;;:34;;;;;;;5601:41;4679:970::o;5937:1061::-;6211:10;:17;6186:22;;6211:21;;6231:1;;6211:21;:::i;:::-;6242:18;6263:24;;;:15;:24;;;;;;6631:10;:26;;6186:46;;-1:-1:-1;6263:24:4;;6186:46;;6631:26;;;;;;:::i;:::-;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6772:28;;;:15;:28;;;;;;;:41;;;6941:24;;;;;6934:31;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;-1:-1:-1;;;;;3620:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3664:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3489:217:4:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:15;-1:-1:-1;;;;;;88:32:15;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:15;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:15;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:15:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:15;;1343:180;-1:-1:-1;1343:180:15:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:15;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:15:o;2355:328::-;2432:6;2440;2448;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2540:29;2559:9;2540:29;:::i;:::-;2530:39;;2588:38;2622:2;2611:9;2607:18;2588:38;:::i;:::-;2578:48;;2673:2;2662:9;2658:18;2645:32;2635:42;;2355:328;;;;;:::o;2688:272::-;2746:6;2799:2;2787:9;2778:7;2774:23;2770:32;2767:52;;;2815:1;2812;2805:12;2767:52;2854:9;2841:23;2904:6;2897:5;2893:18;2886:5;2883:29;2873:57;;2926:1;2923;2916:12;3158:127;3219:10;3214:3;3210:20;3207:1;3200:31;3250:4;3247:1;3240:15;3274:4;3271:1;3264:15;3290:632;3355:5;3385:18;3426:2;3418:6;3415:14;3412:40;;;3432:18;;:::i;:::-;3507:2;3501:9;3475:2;3561:15;;-1:-1:-1;;3557:24:15;;;3583:2;3553:33;3549:42;3537:55;;;3607:18;;;3627:22;;;3604:46;3601:72;;;3653:18;;:::i;:::-;3693:10;3689:2;3682:22;3722:6;3713:15;;3752:6;3744;3737:22;3792:3;3783:6;3778:3;3774:16;3771:25;3768:45;;;3809:1;3806;3799:12;3768:45;3859:6;3854:3;3847:4;3839:6;3835:17;3822:44;3914:1;3907:4;3898:6;3890;3886:19;3882:30;3875:41;;;;3290:632;;;;;:::o;3927:451::-;3996:6;4049:2;4037:9;4028:7;4024:23;4020:32;4017:52;;;4065:1;4062;4055:12;4017:52;4105:9;4092:23;4138:18;4130:6;4127:30;4124:50;;;4170:1;4167;4160:12;4124:50;4193:22;;4246:4;4238:13;;4234:27;-1:-1:-1;4224:55:15;;4275:1;4272;4265:12;4224:55;4298:74;4364:7;4359:2;4346:16;4341:2;4337;4333:11;4298:74;:::i;4383:186::-;4442:6;4495:2;4483:9;4474:7;4470:23;4466:32;4463:52;;;4511:1;4508;4501:12;4463:52;4534:29;4553:9;4534:29;:::i;4574:118::-;4660:5;4653:13;4646:21;4639:5;4636:32;4626:60;;4682:1;4679;4672:12;4697:315;4762:6;4770;4823:2;4811:9;4802:7;4798:23;4794:32;4791:52;;;4839:1;4836;4829:12;4791:52;4862:29;4881:9;4862:29;:::i;:::-;4852:39;;4941:2;4930:9;4926:18;4913:32;4954:28;4976:5;4954:28;:::i;:::-;5001:5;4991:15;;;4697:315;;;;;:::o;5017:667::-;5112:6;5120;5128;5136;5189:3;5177:9;5168:7;5164:23;5160:33;5157:53;;;5206:1;5203;5196:12;5157:53;5229:29;5248:9;5229:29;:::i;:::-;5219:39;;5277:38;5311:2;5300:9;5296:18;5277:38;:::i;:::-;5267:48;;5362:2;5351:9;5347:18;5334:32;5324:42;;5417:2;5406:9;5402:18;5389:32;5444:18;5436:6;5433:30;5430:50;;;5476:1;5473;5466:12;5430:50;5499:22;;5552:4;5544:13;;5540:27;-1:-1:-1;5530:55:15;;5581:1;5578;5571:12;5530:55;5604:74;5670:7;5665:2;5652:16;5647:2;5643;5639:11;5604:74;:::i;:::-;5594:84;;;5017:667;;;;;;;:::o;5689:260::-;5757:6;5765;5818:2;5806:9;5797:7;5793:23;5789:32;5786:52;;;5834:1;5831;5824:12;5786:52;5857:29;5876:9;5857:29;:::i;:::-;5847:39;;5905:38;5939:2;5928:9;5924:18;5905:38;:::i;:::-;5895:48;;5689:260;;;;;:::o;5954:380::-;6033:1;6029:12;;;;6076;;;6097:61;;6151:4;6143:6;6139:17;6129:27;;6097:61;6204:2;6196:6;6193:14;6173:18;6170:38;6167:161;;;6250:10;6245:3;6241:20;6238:1;6231:31;6285:4;6282:1;6275:15;6313:4;6310:1;6303:15;6167:161;;5954:380;;;:::o;7579:413::-;7781:2;7763:21;;;7820:2;7800:18;;;7793:30;7859:34;7854:2;7839:18;;7832:62;-1:-1:-1;;;7925:2:15;7910:18;;7903:47;7982:3;7967:19;;7579:413::o;7997:355::-;8199:2;8181:21;;;8238:2;8218:18;;;8211:30;8277:33;8272:2;8257:18;;8250:61;8343:2;8328:18;;7997:355::o;8766:127::-;8827:10;8822:3;8818:20;8815:1;8808:31;8858:4;8855:1;8848:15;8882:4;8879:1;8872:15;8898:224;8937:3;8965:6;8998:2;8995:1;8991:10;9028:2;9025:1;9021:10;9059:3;9055:2;9051:12;9046:3;9043:21;9040:47;;;9067:18;;:::i;:::-;9103:13;;8898:224;-1:-1:-1;;;;8898:224:15:o;9529:168::-;9569:7;9635:1;9631;9627:6;9623:14;9620:1;9617:21;9612:1;9605:9;9598:17;9594:45;9591:71;;;9642:18;;:::i;:::-;-1:-1:-1;9682:9:15;;9529:168::o;9702:608::-;-1:-1:-1;;;10060:3:15;10053:29;10035:3;10111:6;10105:13;10127:62;10182:6;10177:2;10172:3;10168:12;10161:4;10153:6;10149:17;10127:62;:::i;:::-;-1:-1:-1;;;10248:2:15;10208:16;;;;10240:11;;;10233:44;-1:-1:-1;10301:2:15;10293:11;;9702:608;-1:-1:-1;9702:608:15:o;10315:128::-;10355:3;10386:1;10382:6;10379:1;10376:13;10373:39;;;10392:18;;:::i;:::-;-1:-1:-1;10428:9:15;;10315:128::o;10858:135::-;10897:3;-1:-1:-1;;10918:17:15;;10915:43;;;10938:18;;:::i;:::-;-1:-1:-1;10985:1:15;10974:13;;10858:135::o;11410:125::-;11450:4;11478:1;11475;11472:8;11469:34;;;11483:18;;:::i;:::-;-1:-1:-1;11520:9:15;;11410:125::o;11540:127::-;11601:10;11596:3;11592:20;11589:1;11582:31;11632:4;11629:1;11622:15;11656:4;11653:1;11646:15;11672:127;11733:10;11728:3;11724:20;11721:1;11714:31;11764:4;11761:1;11754:15;11788:4;11785:1;11778:15;11804:120;11844:1;11870;11860:35;;11875:18;;:::i;:::-;-1:-1:-1;11909:9:15;;11804:120::o;11929:175::-;11966:3;12010:4;12003:5;11999:16;12039:4;12030:7;12027:17;12024:43;;;12047:18;;:::i;:::-;12096:1;12083:15;;11929:175;-1:-1:-1;;11929:175:15:o;12109:404::-;12311:2;12293:21;;;12350:2;12330:18;;;12323:30;12389:34;12384:2;12369:18;;12362:62;-1:-1:-1;;;12455:2:15;12440:18;;12433:38;12503:3;12488:19;;12109:404::o;12518:398::-;12720:2;12702:21;;;12759:2;12739:18;;;12732:30;12798:34;12793:2;12778:18;;12771:62;-1:-1:-1;;;12864:2:15;12849:18;;12842:32;12906:3;12891:19;;12518:398::o;13273:409::-;13475:2;13457:21;;;13514:2;13494:18;;;13487:30;13553:34;13548:2;13533:18;;13526:62;-1:-1:-1;;;13619:2:15;13604:18;;13597:43;13672:3;13657:19;;13273:409::o;14100:356::-;14302:2;14284:21;;;14321:18;;;14314:30;14380:34;14375:2;14360:18;;14353:62;14447:2;14432:18;;14100:356::o;15282:184::-;15352:6;15405:2;15393:9;15384:7;15380:23;15376:32;15373:52;;;15421:1;15418;15411:12;15373:52;-1:-1:-1;15444:16:15;;15282:184;-1:-1:-1;15282:184:15:o;16117:245::-;16184:6;16237:2;16225:9;16216:7;16212:23;16208:32;16205:52;;;16253:1;16250;16243:12;16205:52;16285:9;16279:16;16304:28;16326:5;16304:28;:::i;17998:112::-;18030:1;18056;18046:35;;18061:18;;:::i;:::-;-1:-1:-1;18095:9:15;;17998:112::o;18469:414::-;18671:2;18653:21;;;18710:2;18690:18;;;18683:30;18749:34;18744:2;18729:18;;18722:62;-1:-1:-1;;;18815:2:15;18800:18;;18793:48;18873:3;18858:19;;18469:414::o;19304:470::-;19483:3;19521:6;19515:13;19537:53;19583:6;19578:3;19571:4;19563:6;19559:17;19537:53;:::i;:::-;19653:13;;19612:16;;;;19675:57;19653:13;19612:16;19709:4;19697:17;;19675:57;:::i;19779:489::-;-1:-1:-1;;;;;20048:15:15;;;20030:34;;20100:15;;20095:2;20080:18;;20073:43;20147:2;20132:18;;20125:34;;;20195:3;20190:2;20175:18;;20168:31;;;19973:4;;20216:46;;20242:19;;20234:6;20216:46;:::i;:::-;20208:54;19779:489;-1:-1:-1;;;;;;19779:489:15:o;20273:249::-;20342:6;20395:2;20383:9;20374:7;20370:23;20366:32;20363:52;;;20411:1;20408;20401:12;20363:52;20443:9;20437:16;20462:30;20486:5;20462:30;:::i;21245:127::-;21306:10;21301:3;21297:20;21294:1;21287:31;21337:4;21334:1;21327:15;21361:4;21358:1;21351:15
Swarm Source
ipfs://5346cff525f5a52c113378f6db97f84a2b8592831818ec7164c3b5e1ced2a3ad
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.