ETH Price: $2,635.30 (+8.02%)
 

Overview

Max Total Supply

210 TRANSLOOT

Holders

41

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
ramsus.eth
Balance
5 TRANSLOOT
0xBb60F9F245505F3d132974169BE1c01Aa68F66f7
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TRANSLOOT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : TRANSLOOT.sol
/*
 *  _        _______  _______ _________
 * ( \      (  ___  )(  ___  )\__   __/
 * | (      | (   ) || (   ) |   ) (   
 * | |      | |   | || |   | |   | |   
 * | |      | |   | || |   | |   | |   
 * | |      | |   | || |   | |   | |   
 * | (____/\| (___) || (___) |   | |   
 * (_______/(_______)(_______)   )_(
 *
 *  ▄▄▄      ▄▄▄      ▄▄▄▄▄▄▄▄   ▄▄▄·  ▐ ▄ .▄▄ ·      ▄▄ • ▪  ▄▄▄  ▄▄▌  .▄▄ · 
 * ▐▄▄·▪     ▀▄ █·    •██  ▀▄ █·▐█ ▀█ •█▌▐█▐█ ▀.     ▐█ ▀ ▪██ ▀▄ █·██•  ▐█ ▀. 
 * ██▪  ▄█▀▄ ▐▀▀▄      ▐█.▪▐▀▀▄ ▄█▀▀█ ▐█▐▐▌▄▀▀▀█▄    ▄█ ▀█▄▐█·▐▀▀▄ ██▪  ▄▀▀▀█▄
 * ██▌.▐█▌.▐▌▐█•█▌     ▐█▌·▐█•█▌▐█ ▪▐▌██▐█▌▐█▄▪▐█    ▐█▄▪▐█▐█▌▐█•█▌▐█▌▐▌▐█▄▪▐█
 * ▀▀▀  ▀█▄▀▪.▀  ▀     ▀▀▀ .▀  ▀ ▀  ▀ ▀▀ █▪ ▀▀▀▀     ·▀▀▀▀ ▀▀▀.▀  ▀.▀▀▀  ▀▀▀▀ 
 *
 * 6969 fully on-chain starter kits
 *     a cc0 project by thorne
 */
pragma solidity ^0.8.7;

import "./ERC721A.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

// SPDX-License-Identifier: CC0-1.0
contract TRANSLOOT is ERC721A, ReentrancyGuard, Ownable {
    constructor() ERC721A("Trans Loot", "TRANSLOOT") Ownable() {}

    uint256 public mintPrice = 0.01 ether;
    uint256 public constant maxTokens = 6969;

    // Estrogen Sources
    string[] private e = [
        "Titty Skittles",
        "Conjugated Estrogens",
        "Injectable Estradiol",
        "Transdermal Estradiol",
        "Bathtub Estrogen"
    ];

    // Testosterone Prevention
    string[] private antiT = [
        "Spironolactone",
        "Cyproterone",
        "Orchi",
        "Vaginoplasty"
    ];
    
    string[] private bodyOutfit = [
        "Kitty Kigurumi",
        "Corgi Kigurumi",
        "Bear Kigurumi",
        "Dino Kigurumi",
        "Against Me! T-Shirt",
        "Shinji T-Shirt",
        "Asuka T-Shirt",
        "Boymode Hoodie",
        "Pink Hoodie",
        "White Sun Dress (Go Spinny)",
        "Floral Sun Dress (Go Spinny)",
        "Slutty Black Dress (Go Spinny)",
        "Trans Flag T-Shirt"
    ];
    
    string[] private headOutfit = [
        "Kitty Ears",
        "Pupper Ears",
        "Miqo'te Ears",
        "Gaming Headset",
        "Beige Sun Hat",
        "Violet Sun Hat",
        "uwu Face Mask",
        "Anime Face Mask",
        "O-Ring Collar",
        "Heart Choker Collar"
    ];
    
    string[] private legs = [
        "Blue Striped Thigh-Highs",
        "Pink Striped Thigh-Highs",
        "Lavender Striped Thigh-Highs",
        "Yoga Pants",
        "Teal Skirt (Go Spinny)",
        "Lavender Skirt (Go Spinny)",
        "Black Skirt (Go Spinny)",
        "Gray Skirt (Go Spinny)",
        "Skinny Jeans",
        "Pink Pajama Pants",
        "Heart Pajama Pants",
        "Flower Pajama Pants"
    ];
    
    string[] private snacks = [
        "Pickles",
        "Popcorn",
        "Baja Blast",
        "Chicken Nuggies",
        "French Fries",
        "Takis",
        "Monster Zero Ultra",
        "Hi-Chew"
    ];
    
    string[] private games = [
        "Minecraft",
        "Fallout: New Vegas",
        "Stardew Valley",
        "Animal Crossing: New Horizons",
        "VRChat",
        "Final Fantasy VII",
        "Final Fantasy VII: Remake",
        "Hearts of Iron IV",
        "Civilization VI",
        "Cookie Clicker"
    ];
    
    string[] private politics = [
        "Tankie",
        "Normie Lib",
        "#BernieOrBust",
        "Medlock Sock",
        "Cypherpunk",
        "Anarcho-Syndicalist",
        "Pragmatic Progressive",
        "Georgist",
        "Warren Democrat"
    ];
    
    string[] private suffixes = [
        "of Peculiar Power",
        "of the Catgirl Clowder",
        "of the Weebs",
        "of the Rowlingless Coven",
        "of Boundless Hope",
        "of the Phoenix",
        "of the Ether",
        "of Being a Good Girl",
        "of Bottom Text"
        "of TERF Repulsion",
        "of Edgelord Blocking",
        "of Gatekeeper Evasion",
        "of the Endless Euphoria"
    ];
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getE(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "E", e, true);
    }

    function getAntiT(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "ANTI-T", antiT, true);
    }
    
    function getBody(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "BODY", bodyOutfit, true);
    }
    
    function getHead(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "HEAD", headOutfit, true);
    }

    function getLegs(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "LEGS", legs, true);
    }
    
    function getSnack(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "SNACK", snacks, true);
    }
    
    function getGame(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "GAME", games, false);
    }
    
    function getPolitics(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "POLITICS", politics, false);
    }
    
    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray, bool decorate) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];

        if(decorate) {
            uint256 greatness = rand % 21;
            if (greatness > 14) {
                output = string(abi.encodePacked(output, " ", suffixes[rand % suffixes.length]));
            }
        }
        
        return output;
    }

    // Assemble both the SVG data and on-chain trait data
    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[17] memory parts;
        string[8] memory traits;

        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base" fill="#7ACBF5">';

        parts[1] = getE(tokenId);
        traits[0] = string(abi.encodePacked('{"trait_type":"E","value":"', parts[1], '"},')); 

        parts[2] = '</text><text x="10" y="40" class="base" fill="#EAACB8">';

        parts[3] = getAntiT(tokenId);
        traits[1] = string(abi.encodePacked('{"trait_type":"Anti-T","value":"', parts[3], '"},')); 

        parts[4] = '</text><text x="10" y="60" class="base" fill="#FFF">';

        parts[5] = getHead(tokenId);
        traits[2] = string(abi.encodePacked('{"trait_type":"Head","value":"', parts[5], '"},')); 

        parts[6] = '</text><text x="10" y="80" class="base" fill="#7ACBF5">';

        parts[7] = getBody(tokenId);
        traits[3] = string(abi.encodePacked('{"trait_type":"Body","value":"', parts[7], '"},')); 

        parts[8] = '</text><text x="10" y="100" class="base" fill="#EAACB8">';

        parts[9] = getLegs(tokenId);
        traits[4] = string(abi.encodePacked('{"trait_type":"Legs","value":"', parts[9], '"},')); 

        parts[10] = '</text><text x="10" y="120" class="base" fill="#FFF">';

        parts[11] = getSnack(tokenId);
        traits[5] = string(abi.encodePacked('{"trait_type":"Snack","value":"', parts[11], '"},')); 

        parts[12] = '</text><text x="10" y="140" class="base" fill="#7ACBF5">';

        parts[13] = getGame(tokenId);
        traits[6] = string(abi.encodePacked('{"trait_type":"Game","value":"', parts[13], '"},')); 

        parts[14] = '</text><text x="10" y="160" class="base" fill="#EAACB8">';

        parts[15] = getPolitics(tokenId);
        traits[7] = string(abi.encodePacked('{"trait_type":"Politics","value":"', parts[15], '"}')); 

        parts[16] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12], parts[13], parts[14], parts[15], parts[16]));

        string memory traitList = string(abi.encodePacked(traits[0],traits[1],traits[2],traits[3],traits[4],traits[5],traits[6],traits[7]));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Starter Kit #', toString(tokenId), '", "description": "Loot (for Trans Girls) is a collection of trans girl starter kits generated and stored on-chain. Stats, images, and other functionality are intentionally omitted for others to interpret. Feel free to use them in any way you want.", "attributes": [', traitList ,'], "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function _startTokenId() internal pure override returns (uint256) {
        return 1;
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        mintPrice = newPrice;
    }

    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function mintLoot(uint256 qty) public payable nonReentrant {
        require(qty <= 100, 'MAX_QTY_EXCEEDED');
        unchecked { require(mintPrice * qty <= msg.value, 'LOW_ETHER'); }
        unchecked { require(totalSupply() + qty <= maxTokens, 'MAX_REACHED'); }
        _safeMint(msg.sender, qty);
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // 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);
    }
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

File 2 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/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);
    }
}

File 3 of 12 : ReentrancyGuard.sol
// 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;
    }
}

File 4 of 12 : ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

File 5 of 12 : ERC165.sol
// 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;
    }
}

File 6 of 12 : Strings.sol
// 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);
    }
}

File 7 of 12 : Context.sol
// 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;
    }
}

File 8 of 12 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (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);
            }
        }
    }
}

File 9 of 12 : IERC721Metadata.sol
// 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);
}

File 10 of 12 : IERC721Receiver.sol
// 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 `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 11 of 12 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/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;
}

File 12 of 12 : IERC165.sol
// 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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[{"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":"getAntiT","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getBody","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getGame","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHead","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLegs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPolitics","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSnack","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintLoot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"renounceOwnership","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":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052662386f26fc10000600a556040518060a001604052806040518060400160405280600e81526020017f546974747920536b6974746c657300000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f436f6e6a75676174656420457374726f67656e7300000000000000000000000081525081526020016040518060400160405280601481526020017f496e6a65637461626c6520457374726164696f6c00000000000000000000000081525081526020016040518060400160405280601581526020017f5472616e736465726d616c20457374726164696f6c000000000000000000000081525081526020016040518060400160405280601081526020017f4261746874756220457374726f67656e00000000000000000000000000000000815250815250600b90600562000151929190620015fc565b5060405180608001604052806040518060400160405280600e81526020017f537069726f6e6f6c6163746f6e6500000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f437970726f7465726f6e6500000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4f7263686900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f566167696e6f706c617374790000000000000000000000000000000000000000815250815250600c9060046200025992919062001663565b50604051806101a001604052806040518060400160405280600e81526020017f4b69747479204b69677572756d6900000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f436f726769204b69677572756d6900000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f42656172204b69677572756d690000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f44696e6f204b69677572756d690000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f416761696e7374204d652120542d53686972740000000000000000000000000081525081526020016040518060400160405280600e81526020017f5368696e6a6920542d536869727400000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f4173756b6120542d53686972740000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f426f796d6f646520486f6f64696500000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f50696e6b20486f6f64696500000000000000000000000000000000000000000081525081526020016040518060400160405280601b81526020017f57686974652053756e2044726573732028476f205370696e6e7929000000000081525081526020016040518060400160405280601c81526020017f466c6f72616c2053756e2044726573732028476f205370696e6e79290000000081525081526020016040518060400160405280601e81526020017f536c7574747920426c61636b2044726573732028476f205370696e6e7929000081525081526020016040518060400160405280601281526020017f5472616e7320466c616720542d53686972740000000000000000000000000000815250815250600d90600d62000575929190620016ca565b506040518061014001604052806040518060400160405280600a81526020017f4b6974747920456172730000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f507570706572204561727300000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4d69716f2774652045617273000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f47616d696e67204865616473657400000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f42656967652053756e204861740000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f56696f6c65742053756e2048617400000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f7577752046616365204d61736b0000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f416e696d652046616365204d61736b000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f4f2d52696e6720436f6c6c61720000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f48656172742043686f6b657220436f6c6c617200000000000000000000000000815250815250600e90600a620007e092919062001731565b506040518061018001604052806040518060400160405280601881526020017f426c756520537472697065642054686967682d4869676873000000000000000081525081526020016040518060400160405280601881526020017f50696e6b20537472697065642054686967682d4869676873000000000000000081525081526020016040518060400160405280601c81526020017f4c6176656e64657220537472697065642054686967682d48696768730000000081525081526020016040518060400160405280600a81526020017f596f67612050616e74730000000000000000000000000000000000000000000081525081526020016040518060400160405280601681526020017f5465616c20536b6972742028476f205370696e6e79290000000000000000000081525081526020016040518060400160405280601a81526020017f4c6176656e64657220536b6972742028476f205370696e6e792900000000000081525081526020016040518060400160405280601781526020017f426c61636b20536b6972742028476f205370696e6e792900000000000000000081525081526020016040518060400160405280601681526020017f4772617920536b6972742028476f205370696e6e79290000000000000000000081525081526020016040518060400160405280600c81526020017f536b696e6e79204a65616e73000000000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f50696e6b2050616a616d612050616e747300000000000000000000000000000081525081526020016040518060400160405280601281526020017f48656172742050616a616d612050616e7473000000000000000000000000000081525081526020016040518060400160405280601381526020017f466c6f7765722050616a616d612050616e747300000000000000000000000000815250815250600f90600c62000ac192919062001798565b506040518061010001604052806040518060400160405280600781526020017f5069636b6c65730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f506f70636f726e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f42616a6120426c6173740000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f436869636b656e204e756767696573000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4672656e6368204672696573000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f54616b697300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f4d6f6e73746572205a65726f20556c747261000000000000000000000000000081525081526020016040518060400160405280600781526020017f48692d4368657700000000000000000000000000000000000000000000000000815250815250601090600862000cb6929190620017ff565b506040518061014001604052806040518060400160405280600981526020017f4d696e656372616674000000000000000000000000000000000000000000000081525081526020016040518060400160405280601281526020017f46616c6c6f75743a204e6577205665676173000000000000000000000000000081525081526020016040518060400160405280600e81526020017f537461726465772056616c6c657900000000000000000000000000000000000081525081526020016040518060400160405280601d81526020017f416e696d616c2043726f7373696e673a204e657720486f72697a6f6e7300000081525081526020016040518060400160405280600681526020017f565243686174000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f46696e616c2046616e746173792056494900000000000000000000000000000081525081526020016040518060400160405280601981526020017f46696e616c2046616e74617379205649493a2052656d616b650000000000000081525081526020016040518060400160405280601181526020017f486561727473206f662049726f6e20495600000000000000000000000000000081525081526020016040518060400160405280600f81526020017f436976696c697a6174696f6e205649000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f436f6f6b696520436c69636b6572000000000000000000000000000000000000815250815250601190600a62000f2192919062001731565b506040518061012001604052806040518060400160405280600681526020017f54616e6b6965000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4e6f726d6965204c69620000000000000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f234265726e69654f72427573740000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f4d65646c6f636b20536f636b000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f43797068657270756e6b0000000000000000000000000000000000000000000081525081526020016040518060400160405280601381526020017f416e617263686f2d53796e646963616c6973740000000000000000000000000081525081526020016040518060400160405280601581526020017f507261676d617469632050726f6772657373697665000000000000000000000081525081526020016040518060400160405280600881526020017f47656f726769737400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f57617272656e2044656d6f63726174000000000000000000000000000000000081525081525060129060096200115192919062001866565b506040518061018001604052806040518060400160405280601181526020017f6f6620506563756c69617220506f77657200000000000000000000000000000081525081526020016040518060400160405280601681526020017f6f6620746865204361746769726c20436c6f776465720000000000000000000081525081526020016040518060400160405280600c81526020017f6f6620746865205765656273000000000000000000000000000000000000000081525081526020016040518060400160405280601881526020017f6f662074686520526f776c696e676c65737320436f76656e000000000000000081525081526020016040518060400160405280601181526020017f6f6620426f756e646c65737320486f706500000000000000000000000000000081525081526020016040518060400160405280600e81526020017f6f66207468652050686f656e697800000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f6f6620746865204574686572000000000000000000000000000000000000000081525081526020016040518060400160405280601481526020017f6f66204265696e67206120476f6f64204769726c00000000000000000000000081525081526020016040518060400160405280601f81526020017f6f6620426f74746f6d20546578746f66205445524620526570756c73696f6e0081525081526020016040518060400160405280601481526020017f6f6620456467656c6f726420426c6f636b696e6700000000000000000000000081525081526020016040518060400160405280601581526020017f6f6620476174656b65657065722045766173696f6e000000000000000000000081525081526020016040518060400160405280601781526020017f6f662074686520456e646c65737320457570686f726961000000000000000000815250815250601390600c6200143292919062001798565b503480156200144057600080fd5b506040518060400160405280600a81526020017f5472616e73204c6f6f74000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f5452414e534c4f4f5400000000000000000000000000000000000000000000008152508160029080519060200190620014c5929190620018cd565b508060039080519060200190620014de929190620018cd565b50620014ef6200152560201b60201c565b600081905550505060016008819055506200151f620015136200152e60201b60201c565b6200153660201b60201c565b62001a50565b60006001905090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562001650579160200282015b828111156200164f5782518290805190602001906200163e929190620018cd565b50916020019190600101906200161d565b5b5090506200165f91906200195e565b5090565b828054828255906000526020600020908101928215620016b7579160200282015b82811115620016b6578251829080519060200190620016a5929190620018cd565b509160200191906001019062001684565b5b509050620016c691906200195e565b5090565b8280548282559060005260206000209081019282156200171e579160200282015b828111156200171d5782518290805190602001906200170c929190620018cd565b5091602001919060010190620016eb565b5b5090506200172d91906200195e565b5090565b82805482825590600052602060002090810192821562001785579160200282015b828111156200178457825182908051906020019062001773929190620018cd565b509160200191906001019062001752565b5b5090506200179491906200195e565b5090565b828054828255906000526020600020908101928215620017ec579160200282015b82811115620017eb578251829080519060200190620017da929190620018cd565b5091602001919060010190620017b9565b5b509050620017fb91906200195e565b5090565b82805482825590600052602060002090810192821562001853579160200282015b828111156200185257825182908051906020019062001841929190620018cd565b509160200191906001019062001820565b5b5090506200186291906200195e565b5090565b828054828255906000526020600020908101928215620018ba579160200282015b82811115620018b9578251829080519060200190620018a8929190620018cd565b509160200191906001019062001887565b5b509050620018c991906200195e565b5090565b828054620018db90620019eb565b90600052602060002090601f016020900481019282620018ff57600085556200194b565b82601f106200191a57805160ff19168380011785556200194b565b828001600101855582156200194b579182015b828111156200194a5782518255916020019190600101906200192d565b5b5090506200195a919062001986565b5090565b5b80821115620019825760008181620019789190620019a5565b506001016200195f565b5090565b5b80821115620019a157600081600090555060010162001987565b5090565b508054620019b390620019eb565b6000825580601f10620019c75750620019e8565b601f016020900490600052602060002090810190620019e7919062001986565b5b50565b6000600282049050600182168062001a0457607f821691505b6020821081141562001a1b5762001a1a62001a21565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6151a58062001a606000396000f3fe6080604052600436106101cd5760003560e01c8063715018a6116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd146106c5578063e831574214610702578063e985e9c51461072d578063f2fde38b1461076a576101cd565b8063a22cb4651461061a578063a2f77bcc14610643578063a813fb2014610680578063b88d4fde1461069c576101cd565b806391b7f5ed116100d157806391b7f5ed1461054c578063920d971c1461057557806395d89b41146105b25780639720c969146105dd576101cd565b8063715018a6146104cd57806387ed0143146104e45780638da5cb5b14610521576101cd565b806329338ead1161016f5780635b18208f1161013e5780635b18208f146103eb5780636352211e146104285780636817c76c1461046557806370a0823114610490576101cd565b806329338ead1461033157806336911d1f1461036e5780633ccfd60b146103ab57806342842e0e146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806316ff9bd6146102a057806318160ddd146102dd57806323b872dd14610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613b77565b610793565b60405161020691906143d7565b60405180910390f35b34801561021b57600080fd5b50610224610875565b60405161023191906143f2565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190613bd1565b610907565b60405161026e9190614370565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190613b37565b610983565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190613bd1565b610a8e565b6040516102d491906143f2565b60405180910390f35b3480156102e957600080fd5b506102f2610baa565b6040516102ff91906144d4565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613a21565b610bc1565b005b34801561033d57600080fd5b5061035860048036038101906103539190613bd1565b610bd1565b60405161036591906143f2565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190613bd1565b610ced565b6040516103a291906143f2565b60405180910390f35b3480156103b757600080fd5b506103c0610e09565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190613a21565b610ece565b005b3480156103f757600080fd5b50610412600480360381019061040d9190613bd1565b610eee565b60405161041f91906143f2565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190613bd1565b61100a565b60405161045c9190614370565b60405180910390f35b34801561047157600080fd5b5061047a611020565b60405161048791906144d4565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b291906139b4565b611026565b6040516104c491906144d4565b60405180910390f35b3480156104d957600080fd5b506104e26110f6565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613bd1565b61117e565b60405161051891906143f2565b60405180910390f35b34801561052d57600080fd5b5061053661129a565b6040516105439190614370565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613bd1565b6112c4565b005b34801561058157600080fd5b5061059c60048036038101906105979190613bd1565b61134a565b6040516105a991906143f2565b60405180910390f35b3480156105be57600080fd5b506105c7611466565b6040516105d491906143f2565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190613bd1565b6114f8565b60405161061191906143f2565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613af7565b611614565b005b34801561064f57600080fd5b5061066a60048036038101906106659190613bd1565b61178c565b60405161067791906143f2565b60405180910390f35b61069a60048036038101906106959190613bd1565b6118a8565b005b3480156106a857600080fd5b506106c360048036038101906106be9190613a74565b6119e4565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190613bd1565b611a60565b6040516106f991906143f2565b60405180910390f35b34801561070e57600080fd5b50610717612394565b60405161072491906144d4565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f91906139e1565b61239a565b60405161076191906143d7565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906139b4565b61242e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061086e575061086d82612526565b5b9050919050565b60606002805461088490614768565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090614768565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b5050505050905090565b600061091282612590565b610948576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098e8261100a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109f6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a156125de565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a475750610a4581610a406125de565b61239a565b155b15610a7e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a898383836125e6565b505050565b6060610ba3826040518060400160405280600881526020017f504f4c49544943530000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610b98578382906000526020600020018054610b0b90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790614768565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b505050505081526020019060010190610aec565b505050506000612698565b9050919050565b6000610bb461277b565b6001546000540303905090565b610bcc838383612784565b505050565b6060610ce6826040518060400160405280600481526020017f424f445900000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610cdb578382906000526020600020018054610c4e90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7a90614768565b8015610cc75780601f10610c9c57610100808354040283529160200191610cc7565b820191906000526020600020905b815481529060010190602001808311610caa57829003601f168201915b505050505081526020019060010190610c2f565b505050506001612698565b9050919050565b6060610e02826040518060400160405280600481526020017f4c45475300000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610df7578382906000526020600020018054610d6a90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9690614768565b8015610de35780601f10610db857610100808354040283529160200191610de3565b820191906000526020600020905b815481529060010190602001808311610dc657829003601f168201915b505050505081526020019060010190610d4b565b505050506001612698565b9050919050565b610e116125de565b73ffffffffffffffffffffffffffffffffffffffff16610e2f61129a565b73ffffffffffffffffffffffffffffffffffffffff1614610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614454565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ecb573d6000803e3d6000fd5b50565b610ee9838383604051806020016040528060008152506119e4565b505050565b6060611003826040518060400160405280600181526020017f4500000000000000000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015610ff8578382906000526020600020018054610f6b90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9790614768565b8015610fe45780601f10610fb957610100808354040283529160200191610fe4565b820191906000526020600020905b815481529060010190602001808311610fc757829003601f168201915b505050505081526020019060010190610f4c565b505050506001612698565b9050919050565b600061101582612c3a565b600001519050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110fe6125de565b73ffffffffffffffffffffffffffffffffffffffff1661111c61129a565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614454565b60405180910390fd5b61117c6000612ec9565b565b6060611293826040518060400160405280600681526020017f414e54492d540000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156112885783829060005260206000200180546111fb90614768565b80601f016020809104026020016040519081016040528092919081815260200182805461122790614768565b80156112745780601f1061124957610100808354040283529160200191611274565b820191906000526020600020905b81548152906001019060200180831161125757829003601f168201915b5050505050815260200190600101906111dc565b505050506001612698565b9050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112cc6125de565b73ffffffffffffffffffffffffffffffffffffffff166112ea61129a565b73ffffffffffffffffffffffffffffffffffffffff1614611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614454565b60405180910390fd5b80600a8190555050565b606061145f826040518060400160405280600581526020017f534e41434b0000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b828210156114545783829060005260206000200180546113c790614768565b80601f01602080910402602001604051908101604052809291908181526020018280546113f390614768565b80156114405780601f1061141557610100808354040283529160200191611440565b820191906000526020600020905b81548152906001019060200180831161142357829003601f168201915b5050505050815260200190600101906113a8565b505050506001612698565b9050919050565b60606003805461147590614768565b80601f01602080910402602001604051908101604052809291908181526020018280546114a190614768565b80156114ee5780601f106114c3576101008083540402835291602001916114ee565b820191906000526020600020905b8154815290600101906020018083116114d157829003601f168201915b5050505050905090565b606061160d826040518060400160405280600481526020017f4845414400000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561160257838290600052602060002001805461157590614768565b80601f01602080910402602001604051908101604052809291908181526020018280546115a190614768565b80156115ee5780601f106115c3576101008083540402835291602001916115ee565b820191906000526020600020905b8154815290600101906020018083116115d157829003601f168201915b505050505081526020019060010190611556565b505050506001612698565b9050919050565b61161c6125de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611681576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061168e6125de565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661173b6125de565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161178091906143d7565b60405180910390a35050565b60606118a1826040518060400160405280600481526020017f47414d45000000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561189657838290600052602060002001805461180990614768565b80601f016020809104026020016040519081016040528092919081815260200182805461183590614768565b80156118825780601f1061185757610100808354040283529160200191611882565b820191906000526020600020905b81548152906001019060200180831161186557829003601f168201915b5050505050815260200190600101906117ea565b505050506000612698565b9050919050565b600260085414156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906144b4565b60405180910390fd5b6002600881905550606481111561193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190614494565b60405180910390fd5b3481600a54021115611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614474565b60405180910390fd5b611b398161198d610baa565b0111156119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690614434565b60405180910390fd5b6119d93382612f8f565b600160088190555050565b6119ef848484612784565b611a0e8373ffffffffffffffffffffffffffffffffffffffff16612fad565b8015611a235750611a2184848484612fd0565b155b15611a5a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611a6a613848565b611a72613870565b60405180610120016040528060ff8152602001614eb260ff913982600060118110611aa057611a9f6148d2565b5b6020020181905250611ab184610eee565b82600160118110611ac557611ac46148d2565b5b602002018190525081600160118110611ae157611ae06148d2565b5b6020020151604051602001611af69190614189565b60405160208183030381529060405281600060088110611b1957611b186148d2565b5b60200201819052506040518060600160405280603781526020016150286037913982600260118110611b4e57611b4d6148d2565b5b6020020181905250611b5f8461117e565b82600360118110611b7357611b726148d2565b5b602002018190525081600360118110611b8f57611b8e6148d2565b5b6020020151604051602001611ba491906141b6565b60405160208183030381529060405281600160088110611bc757611bc66148d2565b5b602002018190525060405180606001604052806034815260200161513c6034913982600460118110611bfc57611bfb6148d2565b5b6020020181905250611c0d846114f8565b82600560118110611c2157611c206148d2565b5b602002018190525081600560118110611c3d57611c3c6148d2565b5b6020020151604051602001611c52919061423d565b60405160208183030381529060405281600260088110611c7557611c746148d2565b5b6020020181905250604051806060016040528060378152602001614ff16037913982600660118110611caa57611ca96148d2565b5b6020020181905250611cbb84610bd1565b82600760118110611ccf57611cce6148d2565b5b602002018190525081600760118110611ceb57611cea6148d2565b5b6020020151604051602001611d009190614297565b60405160208183030381529060405281600360088110611d2357611d226148d2565b5b60200201819052506040518060600160405280603881526020016150976038913982600860118110611d5857611d576148d2565b5b6020020181905250611d6984610ced565b82600960118110611d7d57611d7c6148d2565b5b602002018190525081600960118110611d9957611d986148d2565b5b6020020151604051602001611dae9190614210565b60405160208183030381529060405281600460088110611dd157611dd06148d2565b5b60200201819052506040518060600160405280603581526020016151076035913982600a60118110611e0657611e056148d2565b5b6020020181905250611e178461134a565b82600b60118110611e2b57611e2a6148d2565b5b602002018190525081600b60118110611e4757611e466148d2565b5b6020020151604051602001611e5c919061426a565b60405160208183030381529060405281600560088110611e7f57611e7e6148d2565b5b602002018190525060405180606001604052806038815260200161505f6038913982600c60118110611eb457611eb36148d2565b5b6020020181905250611ec58461178c565b82600d60118110611ed957611ed86148d2565b5b602002018190525081600d60118110611ef557611ef46148d2565b5b6020020151604051602001611f0a9190614343565b60405160208183030381529060405281600660088110611f2d57611f2c6148d2565b5b60200201819052506040518060600160405280603881526020016150cf6038913982600e60118110611f6257611f616148d2565b5b6020020181905250611f7384610a8e565b82600f60118110611f8757611f866148d2565b5b602002018190525081600f60118110611fa357611fa26148d2565b5b6020020151604051602001611fb891906141e3565b60405160208183030381529060405281600760088110611fdb57611fda6148d2565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152508260106011811061202d5761202c6148d2565b5b602002018190525060008260006011811061204b5761204a6148d2565b5b602002015183600160118110612064576120636148d2565b5b60200201518460026011811061207d5761207c6148d2565b5b602002015185600360118110612096576120956148d2565b5b6020020151866004601181106120af576120ae6148d2565b5b6020020151876005601181106120c8576120c76148d2565b5b6020020151886006601181106120e1576120e06148d2565b5b6020020151896007601181106120fa576120f96148d2565b5b60200201518a600860118110612113576121126148d2565b5b6020020151604051602001612130999897969594939291906140db565b60405160208183030381529060405290508083600960118110612156576121556148d2565b5b602002015184600a6011811061216f5761216e6148d2565b5b602002015185600b60118110612188576121876148d2565b5b602002015186600c601181106121a1576121a06148d2565b5b602002015187600d601181106121ba576121b96148d2565b5b602002015188600e601181106121d3576121d26148d2565b5b602002015189600f601181106121ec576121eb6148d2565b5b60200201518a601060118110612205576122046148d2565b5b6020020151604051602001612222999897969594939291906140db565b6040516020818303038152906040529050600082600060088110612249576122486148d2565b5b602002015183600160088110612262576122616148d2565b5b60200201518460026008811061227b5761227a6148d2565b5b602002015185600360088110612294576122936148d2565b5b6020020151866004600881106122ad576122ac6148d2565b5b6020020151876005600881106122c6576122c56148d2565b5b6020020151886006600881106122df576122de6148d2565b5b6020020151896007600881106122f8576122f76148d2565b5b6020020151604051602001612314989796959493929190614069565b6040516020818303038152906040529050600061236361233388613130565b8361233d86613291565b60405160200161234f939291906142c4565b604051602081830303815290604052613291565b9050806040516020016123769190614321565b60405160208183030381529060405292508295505050505050919050565b611b3981565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124366125de565b73ffffffffffffffffffffffffffffffffffffffff1661245461129a565b73ffffffffffffffffffffffffffffffffffffffff16146124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614454565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251190614414565b60405180910390fd5b61252381612ec9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161259b61277b565b111580156125aa575060005482105b80156125d7575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b606060006126ce856126a988613130565b6040516020016126ba929190614045565b604051602081830303815290604052613429565b90506000848551836126e09190614814565b815181106126f1576126f06148d2565b5b60200260200101519050831561276e5760006015836127109190614814565b9050600e81111561276c5781601380805490508561272e9190614814565b8154811061273f5761273e6148d2565b5b9060005260206000200160405160200161275a92919061415a565b60405160208183030381529060405291505b505b8092505050949350505050565b60006001905090565b600061278f82612c3a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127fa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661281b6125de565b73ffffffffffffffffffffffffffffffffffffffff16148061284a5750612849856128446125de565b61239a565b5b8061288f57506128586125de565b73ffffffffffffffffffffffffffffffffffffffff1661287784610907565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128c8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561292f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61293c858585600161345c565b612948600084876125e6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612bc8576000548214612bc757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c338585856001613462565b5050505050565b612c42613898565b600082905080612c5061277b565b11158015612c5f575060005481105b15612e92576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d74578092505050612ec4565b5b600115612e8f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e8a578092505050612ec4565b612d75565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fa9828260405180602001604052806000815250613468565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ff66125de565b8786866040518563ffffffff1660e01b8152600401613018949392919061438b565b602060405180830381600087803b15801561303257600080fd5b505af192505050801561306357506040513d601f19601f820116820180604052508101906130609190613ba4565b60015b6130dd573d8060008114613093576040519150601f19603f3d011682016040523d82523d6000602084013e613098565b606091505b506000815114156130d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613178576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061328c565b600082905060005b600082146131aa578080613193906147cb565b915050600a826131a391906145f3565b9150613180565b60008167ffffffffffffffff8111156131c6576131c5614901565b5b6040519080825280601f01601f1916602001820160405280156131f85781602001600182028036833780820191505090505b5090505b6000851461328557600182613211919061467e565b9150600a856132209190614814565b603061322c919061459d565b60f81b818381518110613242576132416148d2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561327e91906145f3565b94506131fc565b8093505050505b919050565b606060008251905060008114156132ba5760405180602001604052806000815250915050613424565b600060036002836132cb919061459d565b6132d591906145f3565b60046132e19190614624565b905060006020826132f2919061459d565b67ffffffffffffffff81111561330b5761330a614901565b5b6040519080825280601f01601f19166020018201604052801561333d5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614fb1604091399050600181016020830160005b868110156133e15760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613368565b5060038606600181146133fb576002811461340b57613416565b613d3d60f01b6002830352613416565b603d60f81b60018303525b508484525050819450505050505b919050565b60008160405160200161343c919061402e565b6040516020818303038152906040528051906020012060001c9050919050565b50505050565b50505050565b613475838383600161347a565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134e7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613522576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61352f600086838761345c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156136f957506136f88773ffffffffffffffffffffffffffffffffffffffff16612fad565b5b156137bf575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461376e6000888480600101955088612fd0565b6137a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156136ff5782600054146137ba57600080fd5b61382b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156137c0575b8160008190555050506138416000868387613462565b5050505050565b6040518061022001604052806011905b60608152602001906001900390816138585790505090565b6040518061010001604052806008905b60608152602001906001900390816138805790505090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b60006138ee6138e984614514565b6144ef565b90508281526020810184848401111561390a57613909614935565b5b613915848285614726565b509392505050565b60008135905061392c81614e55565b92915050565b60008135905061394181614e6c565b92915050565b60008135905061395681614e83565b92915050565b60008151905061396b81614e83565b92915050565b600082601f83011261398657613985614930565b5b81356139968482602086016138db565b91505092915050565b6000813590506139ae81614e9a565b92915050565b6000602082840312156139ca576139c961493f565b5b60006139d88482850161391d565b91505092915050565b600080604083850312156139f8576139f761493f565b5b6000613a068582860161391d565b9250506020613a178582860161391d565b9150509250929050565b600080600060608486031215613a3a57613a3961493f565b5b6000613a488682870161391d565b9350506020613a598682870161391d565b9250506040613a6a8682870161399f565b9150509250925092565b60008060008060808587031215613a8e57613a8d61493f565b5b6000613a9c8782880161391d565b9450506020613aad8782880161391d565b9350506040613abe8782880161399f565b925050606085013567ffffffffffffffff811115613adf57613ade61493a565b5b613aeb87828801613971565b91505092959194509250565b60008060408385031215613b0e57613b0d61493f565b5b6000613b1c8582860161391d565b9250506020613b2d85828601613932565b9150509250929050565b60008060408385031215613b4e57613b4d61493f565b5b6000613b5c8582860161391d565b9250506020613b6d8582860161399f565b9150509250929050565b600060208284031215613b8d57613b8c61493f565b5b6000613b9b84828501613947565b91505092915050565b600060208284031215613bba57613bb961493f565b5b6000613bc88482850161395c565b91505092915050565b600060208284031215613be757613be661493f565b5b6000613bf58482850161399f565b91505092915050565b613c07816146b2565b82525050565b613c16816146c4565b82525050565b6000613c278261455a565b613c318185614570565b9350613c41818560208601614735565b613c4a81614944565b840191505092915050565b6000613c6082614565565b613c6a8185614581565b9350613c7a818560208601614735565b613c8381614944565b840191505092915050565b6000613c9982614565565b613ca38185614592565b9350613cb3818560208601614735565b80840191505092915050565b60008154613ccc81614768565b613cd68186614592565b94506001821660008114613cf15760018114613d0257613d35565b60ff19831686528186019350613d35565b613d0b85614545565b60005b83811015613d2d57815481890152600182019150602081019050613d0e565b838801955050505b50505092915050565b6000613d4b602683614581565b9150613d5682614955565b604082019050919050565b6000613d6e601b83614592565b9150613d79826149a4565b601b82019050919050565b6000613d91600383614592565b9150613d9c826149cd565b600382019050919050565b6000613db4602083614592565b9150613dbf826149f6565b602082019050919050565b6000613dd7602283614592565b9150613de282614a1f565b602282019050919050565b6000613dfa601e83614592565b9150613e0582614a6e565b601e82019050919050565b6000613e1d601e83614592565b9150613e2882614a97565b601e82019050919050565b6000613e40601f83614592565b9150613e4b82614ac0565b601f82019050919050565b6000613e63600183614592565b9150613e6e82614ae9565b600182019050919050565b6000613e86601e83614592565b9150613e9182614b12565b601e82019050919050565b6000613ea9600283614592565b9150613eb482614b3b565b600282019050919050565b6000613ecc600b83614581565b9150613ed782614b64565b602082019050919050565b6000613ef061010a83614592565b9150613efb82614b8d565b61010a82019050919050565b6000613f14602083614581565b9150613f1f82614ce7565b602082019050919050565b6000613f37600983614581565b9150613f4282614d10565b602082019050919050565b6000613f5a601783614592565b9150613f6582614d39565b601782019050919050565b6000613f7d601083614581565b9150613f8882614d62565b602082019050919050565b6000613fa0602783614592565b9150613fab82614d8b565b602782019050919050565b6000613fc3601d83614592565b9150613fce82614dda565b601d82019050919050565b6000613fe6601f83614581565b9150613ff182614e03565b602082019050919050565b6000614009601e83614592565b915061401482614e2c565b601e82019050919050565b6140288161471c565b82525050565b600061403a8284613c8e565b915081905092915050565b60006140518285613c8e565b915061405d8284613c8e565b91508190509392505050565b6000614075828b613c8e565b9150614081828a613c8e565b915061408d8289613c8e565b91506140998288613c8e565b91506140a58287613c8e565b91506140b18286613c8e565b91506140bd8285613c8e565b91506140c98284613c8e565b91508190509998505050505050505050565b60006140e7828c613c8e565b91506140f3828b613c8e565b91506140ff828a613c8e565b915061410b8289613c8e565b91506141178288613c8e565b91506141238287613c8e565b915061412f8286613c8e565b915061413b8285613c8e565b91506141478284613c8e565b91508190509a9950505050505050505050565b60006141668285613c8e565b915061417182613e56565b915061417d8284613cbf565b91508190509392505050565b600061419482613d61565b91506141a08284613c8e565b91506141ab82613d84565b915081905092915050565b60006141c182613da7565b91506141cd8284613c8e565b91506141d882613d84565b915081905092915050565b60006141ee82613dca565b91506141fa8284613c8e565b915061420582613e9c565b915081905092915050565b600061421b82613ded565b91506142278284613c8e565b915061423282613d84565b915081905092915050565b600061424882613e10565b91506142548284613c8e565b915061425f82613d84565b915081905092915050565b600061427582613e33565b91506142818284613c8e565b915061428c82613d84565b915081905092915050565b60006142a282613e79565b91506142ae8284613c8e565b91506142b982613d84565b915081905092915050565b60006142cf82613f4d565b91506142db8286613c8e565b91506142e682613ee2565b91506142f28285613c8e565b91506142fd82613f93565b91506143098284613c8e565b915061431482613e9c565b9150819050949350505050565b600061432c82613fb6565b91506143388284613c8e565b915081905092915050565b600061434e82613ffc565b915061435a8284613c8e565b915061436582613d84565b915081905092915050565b60006020820190506143856000830184613bfe565b92915050565b60006080820190506143a06000830187613bfe565b6143ad6020830186613bfe565b6143ba604083018561401f565b81810360608301526143cc8184613c1c565b905095945050505050565b60006020820190506143ec6000830184613c0d565b92915050565b6000602082019050818103600083015261440c8184613c55565b905092915050565b6000602082019050818103600083015261442d81613d3e565b9050919050565b6000602082019050818103600083015261444d81613ebf565b9050919050565b6000602082019050818103600083015261446d81613f07565b9050919050565b6000602082019050818103600083015261448d81613f2a565b9050919050565b600060208201905081810360008301526144ad81613f70565b9050919050565b600060208201905081810360008301526144cd81613fd9565b9050919050565b60006020820190506144e9600083018461401f565b92915050565b60006144f961450a565b9050614505828261479a565b919050565b6000604051905090565b600067ffffffffffffffff82111561452f5761452e614901565b5b61453882614944565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145a88261471c565b91506145b38361471c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145e8576145e7614845565b5b828201905092915050565b60006145fe8261471c565b91506146098361471c565b92508261461957614618614874565b5b828204905092915050565b600061462f8261471c565b915061463a8361471c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561467357614672614845565b5b828202905092915050565b60006146898261471c565b91506146948361471c565b9250828210156146a7576146a6614845565b5b828203905092915050565b60006146bd826146fc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614753578082015181840152602081019050614738565b83811115614762576000848401525b50505050565b6000600282049050600182168061478057607f821691505b60208210811415614794576147936148a3565b5b50919050565b6147a382614944565b810181811067ffffffffffffffff821117156147c2576147c1614901565b5b80604052505050565b60006147d68261471c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561480957614808614845565b5b600182019050919050565b600061481f8261471c565b915061482a8361471c565b92508261483a57614839614874565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2245222c2276616c7565223a220000000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a22416e74692d54222c2276616c7565223a22600082015250565b7f7b2274726169745f74797065223a22506f6c6974696373222c2276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a224c656773222c2276616c7565223a220000600082015250565b7f7b2274726169745f74797065223a2248656164222c2276616c7565223a220000600082015250565b7f7b2274726169745f74797065223a22536e61636b222c2276616c7565223a2200600082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a22426f6479222c2276616c7565223a220000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4d41585f52454143484544000000000000000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a20224c6f6f742028666f722054726160008201527f6e73204769726c7329206973206120636f6c6c656374696f6e206f662074726160208201527f6e73206769726c2073746172746572206b6974732067656e657261746564206160408201527f6e642073746f726564206f6e2d636861696e2e2053746174732c20696d61676560608201527f732c20616e64206f746865722066756e6374696f6e616c69747920617265206960808201527f6e74656e74696f6e616c6c79206f6d697474656420666f72206f74686572732060a08201527f746f20696e746572707265742e204665656c206672656520746f20757365207460c08201527f68656d20696e20616e792077617920796f752077616e742e222c20226174747260e08201527f696275746573223a205b0000000000000000000000000000000000000000000061010082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4c4f575f45544845520000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a202253746172746572204b69742023000000000000000000600082015250565b7f4d41585f5154595f455843454544454400000000000000000000000000000000600082015250565b7f5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b60008201527f6261736536342c00000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f7b2274726169745f74797065223a2247616d65222c2276616c7565223a220000600082015250565b614e5e816146b2565b8114614e6957600080fd5b50565b614e75816146c4565b8114614e8057600080fd5b50565b614e8c816146d0565b8114614e9757600080fd5b50565b614ea38161471c565b8114614eae57600080fd5b5056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365222066696c6c3d2223374143424635223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365222066696c6c3d2223374143424635223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365222066696c6c3d2223374143424635223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365222066696c6c3d2223464646223e3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365222066696c6c3d2223464646223ea2646970667358221220afa903785934da64c397d88b7e2855506fcb6bab867c38da3d3e4587bc05cbf664736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c8063715018a6116100f7578063a22cb46511610095578063c87b56dd11610064578063c87b56dd146106c5578063e831574214610702578063e985e9c51461072d578063f2fde38b1461076a576101cd565b8063a22cb4651461061a578063a2f77bcc14610643578063a813fb2014610680578063b88d4fde1461069c576101cd565b806391b7f5ed116100d157806391b7f5ed1461054c578063920d971c1461057557806395d89b41146105b25780639720c969146105dd576101cd565b8063715018a6146104cd57806387ed0143146104e45780638da5cb5b14610521576101cd565b806329338ead1161016f5780635b18208f1161013e5780635b18208f146103eb5780636352211e146104285780636817c76c1461046557806370a0823114610490576101cd565b806329338ead1461033157806336911d1f1461036e5780633ccfd60b146103ab57806342842e0e146103c2576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806316ff9bd6146102a057806318160ddd146102dd57806323b872dd14610308576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190613b77565b610793565b60405161020691906143d7565b60405180910390f35b34801561021b57600080fd5b50610224610875565b60405161023191906143f2565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190613bd1565b610907565b60405161026e9190614370565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190613b37565b610983565b005b3480156102ac57600080fd5b506102c760048036038101906102c29190613bd1565b610a8e565b6040516102d491906143f2565b60405180910390f35b3480156102e957600080fd5b506102f2610baa565b6040516102ff91906144d4565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a9190613a21565b610bc1565b005b34801561033d57600080fd5b5061035860048036038101906103539190613bd1565b610bd1565b60405161036591906143f2565b60405180910390f35b34801561037a57600080fd5b5061039560048036038101906103909190613bd1565b610ced565b6040516103a291906143f2565b60405180910390f35b3480156103b757600080fd5b506103c0610e09565b005b3480156103ce57600080fd5b506103e960048036038101906103e49190613a21565b610ece565b005b3480156103f757600080fd5b50610412600480360381019061040d9190613bd1565b610eee565b60405161041f91906143f2565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190613bd1565b61100a565b60405161045c9190614370565b60405180910390f35b34801561047157600080fd5b5061047a611020565b60405161048791906144d4565b60405180910390f35b34801561049c57600080fd5b506104b760048036038101906104b291906139b4565b611026565b6040516104c491906144d4565b60405180910390f35b3480156104d957600080fd5b506104e26110f6565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613bd1565b61117e565b60405161051891906143f2565b60405180910390f35b34801561052d57600080fd5b5061053661129a565b6040516105439190614370565b60405180910390f35b34801561055857600080fd5b50610573600480360381019061056e9190613bd1565b6112c4565b005b34801561058157600080fd5b5061059c60048036038101906105979190613bd1565b61134a565b6040516105a991906143f2565b60405180910390f35b3480156105be57600080fd5b506105c7611466565b6040516105d491906143f2565b60405180910390f35b3480156105e957600080fd5b5061060460048036038101906105ff9190613bd1565b6114f8565b60405161061191906143f2565b60405180910390f35b34801561062657600080fd5b50610641600480360381019061063c9190613af7565b611614565b005b34801561064f57600080fd5b5061066a60048036038101906106659190613bd1565b61178c565b60405161067791906143f2565b60405180910390f35b61069a60048036038101906106959190613bd1565b6118a8565b005b3480156106a857600080fd5b506106c360048036038101906106be9190613a74565b6119e4565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190613bd1565b611a60565b6040516106f991906143f2565b60405180910390f35b34801561070e57600080fd5b50610717612394565b60405161072491906144d4565b60405180910390f35b34801561073957600080fd5b50610754600480360381019061074f91906139e1565b61239a565b60405161076191906143d7565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906139b4565b61242e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061085e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061086e575061086d82612526565b5b9050919050565b60606002805461088490614768565b80601f01602080910402602001604051908101604052809291908181526020018280546108b090614768565b80156108fd5780601f106108d2576101008083540402835291602001916108fd565b820191906000526020600020905b8154815290600101906020018083116108e057829003601f168201915b5050505050905090565b600061091282612590565b610948576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098e8261100a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109f6576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a156125de565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a475750610a4581610a406125de565b61239a565b155b15610a7e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a898383836125e6565b505050565b6060610ba3826040518060400160405280600881526020017f504f4c49544943530000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610b98578382906000526020600020018054610b0b90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790614768565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b505050505081526020019060010190610aec565b505050506000612698565b9050919050565b6000610bb461277b565b6001546000540303905090565b610bcc838383612784565b505050565b6060610ce6826040518060400160405280600481526020017f424f445900000000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b82821015610cdb578382906000526020600020018054610c4e90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7a90614768565b8015610cc75780601f10610c9c57610100808354040283529160200191610cc7565b820191906000526020600020905b815481529060010190602001808311610caa57829003601f168201915b505050505081526020019060010190610c2f565b505050506001612698565b9050919050565b6060610e02826040518060400160405280600481526020017f4c45475300000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610df7578382906000526020600020018054610d6a90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9690614768565b8015610de35780601f10610db857610100808354040283529160200191610de3565b820191906000526020600020905b815481529060010190602001808311610dc657829003601f168201915b505050505081526020019060010190610d4b565b505050506001612698565b9050919050565b610e116125de565b73ffffffffffffffffffffffffffffffffffffffff16610e2f61129a565b73ffffffffffffffffffffffffffffffffffffffff1614610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614454565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ecb573d6000803e3d6000fd5b50565b610ee9838383604051806020016040528060008152506119e4565b505050565b6060611003826040518060400160405280600181526020017f4500000000000000000000000000000000000000000000000000000000000000815250600b805480602002602001604051908101604052809291908181526020016000905b82821015610ff8578382906000526020600020018054610f6b90614768565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9790614768565b8015610fe45780601f10610fb957610100808354040283529160200191610fe4565b820191906000526020600020905b815481529060010190602001808311610fc757829003601f168201915b505050505081526020019060010190610f4c565b505050506001612698565b9050919050565b600061101582612c3a565b600001519050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108e576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110fe6125de565b73ffffffffffffffffffffffffffffffffffffffff1661111c61129a565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614454565b60405180910390fd5b61117c6000612ec9565b565b6060611293826040518060400160405280600681526020017f414e54492d540000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156112885783829060005260206000200180546111fb90614768565b80601f016020809104026020016040519081016040528092919081815260200182805461122790614768565b80156112745780601f1061124957610100808354040283529160200191611274565b820191906000526020600020905b81548152906001019060200180831161125757829003601f168201915b5050505050815260200190600101906111dc565b505050506001612698565b9050919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112cc6125de565b73ffffffffffffffffffffffffffffffffffffffff166112ea61129a565b73ffffffffffffffffffffffffffffffffffffffff1614611340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133790614454565b60405180910390fd5b80600a8190555050565b606061145f826040518060400160405280600581526020017f534e41434b0000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b828210156114545783829060005260206000200180546113c790614768565b80601f01602080910402602001604051908101604052809291908181526020018280546113f390614768565b80156114405780601f1061141557610100808354040283529160200191611440565b820191906000526020600020905b81548152906001019060200180831161142357829003601f168201915b5050505050815260200190600101906113a8565b505050506001612698565b9050919050565b60606003805461147590614768565b80601f01602080910402602001604051908101604052809291908181526020018280546114a190614768565b80156114ee5780601f106114c3576101008083540402835291602001916114ee565b820191906000526020600020905b8154815290600101906020018083116114d157829003601f168201915b5050505050905090565b606061160d826040518060400160405280600481526020017f4845414400000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b8282101561160257838290600052602060002001805461157590614768565b80601f01602080910402602001604051908101604052809291908181526020018280546115a190614768565b80156115ee5780601f106115c3576101008083540402835291602001916115ee565b820191906000526020600020905b8154815290600101906020018083116115d157829003601f168201915b505050505081526020019060010190611556565b505050506001612698565b9050919050565b61161c6125de565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611681576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061168e6125de565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661173b6125de565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161178091906143d7565b60405180910390a35050565b60606118a1826040518060400160405280600481526020017f47414d45000000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b8282101561189657838290600052602060002001805461180990614768565b80601f016020809104026020016040519081016040528092919081815260200182805461183590614768565b80156118825780601f1061185757610100808354040283529160200191611882565b820191906000526020600020905b81548152906001019060200180831161186557829003601f168201915b5050505050815260200190600101906117ea565b505050506000612698565b9050919050565b600260085414156118ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e5906144b4565b60405180910390fd5b6002600881905550606481111561193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190614494565b60405180910390fd5b3481600a54021115611981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197890614474565b60405180910390fd5b611b398161198d610baa565b0111156119cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c690614434565b60405180910390fd5b6119d93382612f8f565b600160088190555050565b6119ef848484612784565b611a0e8373ffffffffffffffffffffffffffffffffffffffff16612fad565b8015611a235750611a2184848484612fd0565b155b15611a5a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060611a6a613848565b611a72613870565b60405180610120016040528060ff8152602001614eb260ff913982600060118110611aa057611a9f6148d2565b5b6020020181905250611ab184610eee565b82600160118110611ac557611ac46148d2565b5b602002018190525081600160118110611ae157611ae06148d2565b5b6020020151604051602001611af69190614189565b60405160208183030381529060405281600060088110611b1957611b186148d2565b5b60200201819052506040518060600160405280603781526020016150286037913982600260118110611b4e57611b4d6148d2565b5b6020020181905250611b5f8461117e565b82600360118110611b7357611b726148d2565b5b602002018190525081600360118110611b8f57611b8e6148d2565b5b6020020151604051602001611ba491906141b6565b60405160208183030381529060405281600160088110611bc757611bc66148d2565b5b602002018190525060405180606001604052806034815260200161513c6034913982600460118110611bfc57611bfb6148d2565b5b6020020181905250611c0d846114f8565b82600560118110611c2157611c206148d2565b5b602002018190525081600560118110611c3d57611c3c6148d2565b5b6020020151604051602001611c52919061423d565b60405160208183030381529060405281600260088110611c7557611c746148d2565b5b6020020181905250604051806060016040528060378152602001614ff16037913982600660118110611caa57611ca96148d2565b5b6020020181905250611cbb84610bd1565b82600760118110611ccf57611cce6148d2565b5b602002018190525081600760118110611ceb57611cea6148d2565b5b6020020151604051602001611d009190614297565b60405160208183030381529060405281600360088110611d2357611d226148d2565b5b60200201819052506040518060600160405280603881526020016150976038913982600860118110611d5857611d576148d2565b5b6020020181905250611d6984610ced565b82600960118110611d7d57611d7c6148d2565b5b602002018190525081600960118110611d9957611d986148d2565b5b6020020151604051602001611dae9190614210565b60405160208183030381529060405281600460088110611dd157611dd06148d2565b5b60200201819052506040518060600160405280603581526020016151076035913982600a60118110611e0657611e056148d2565b5b6020020181905250611e178461134a565b82600b60118110611e2b57611e2a6148d2565b5b602002018190525081600b60118110611e4757611e466148d2565b5b6020020151604051602001611e5c919061426a565b60405160208183030381529060405281600560088110611e7f57611e7e6148d2565b5b602002018190525060405180606001604052806038815260200161505f6038913982600c60118110611eb457611eb36148d2565b5b6020020181905250611ec58461178c565b82600d60118110611ed957611ed86148d2565b5b602002018190525081600d60118110611ef557611ef46148d2565b5b6020020151604051602001611f0a9190614343565b60405160208183030381529060405281600660088110611f2d57611f2c6148d2565b5b60200201819052506040518060600160405280603881526020016150cf6038913982600e60118110611f6257611f616148d2565b5b6020020181905250611f7384610a8e565b82600f60118110611f8757611f866148d2565b5b602002018190525081600f60118110611fa357611fa26148d2565b5b6020020151604051602001611fb891906141e3565b60405160208183030381529060405281600760088110611fdb57611fda6148d2565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152508260106011811061202d5761202c6148d2565b5b602002018190525060008260006011811061204b5761204a6148d2565b5b602002015183600160118110612064576120636148d2565b5b60200201518460026011811061207d5761207c6148d2565b5b602002015185600360118110612096576120956148d2565b5b6020020151866004601181106120af576120ae6148d2565b5b6020020151876005601181106120c8576120c76148d2565b5b6020020151886006601181106120e1576120e06148d2565b5b6020020151896007601181106120fa576120f96148d2565b5b60200201518a600860118110612113576121126148d2565b5b6020020151604051602001612130999897969594939291906140db565b60405160208183030381529060405290508083600960118110612156576121556148d2565b5b602002015184600a6011811061216f5761216e6148d2565b5b602002015185600b60118110612188576121876148d2565b5b602002015186600c601181106121a1576121a06148d2565b5b602002015187600d601181106121ba576121b96148d2565b5b602002015188600e601181106121d3576121d26148d2565b5b602002015189600f601181106121ec576121eb6148d2565b5b60200201518a601060118110612205576122046148d2565b5b6020020151604051602001612222999897969594939291906140db565b6040516020818303038152906040529050600082600060088110612249576122486148d2565b5b602002015183600160088110612262576122616148d2565b5b60200201518460026008811061227b5761227a6148d2565b5b602002015185600360088110612294576122936148d2565b5b6020020151866004600881106122ad576122ac6148d2565b5b6020020151876005600881106122c6576122c56148d2565b5b6020020151886006600881106122df576122de6148d2565b5b6020020151896007600881106122f8576122f76148d2565b5b6020020151604051602001612314989796959493929190614069565b6040516020818303038152906040529050600061236361233388613130565b8361233d86613291565b60405160200161234f939291906142c4565b604051602081830303815290604052613291565b9050806040516020016123769190614321565b60405160208183030381529060405292508295505050505050919050565b611b3981565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124366125de565b73ffffffffffffffffffffffffffffffffffffffff1661245461129a565b73ffffffffffffffffffffffffffffffffffffffff16146124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a190614454565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561251a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251190614414565b60405180910390fd5b61252381612ec9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161259b61277b565b111580156125aa575060005482105b80156125d7575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b606060006126ce856126a988613130565b6040516020016126ba929190614045565b604051602081830303815290604052613429565b90506000848551836126e09190614814565b815181106126f1576126f06148d2565b5b60200260200101519050831561276e5760006015836127109190614814565b9050600e81111561276c5781601380805490508561272e9190614814565b8154811061273f5761273e6148d2565b5b9060005260206000200160405160200161275a92919061415a565b60405160208183030381529060405291505b505b8092505050949350505050565b60006001905090565b600061278f82612c3a565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127fa576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661281b6125de565b73ffffffffffffffffffffffffffffffffffffffff16148061284a5750612849856128446125de565b61239a565b5b8061288f57506128586125de565b73ffffffffffffffffffffffffffffffffffffffff1661287784610907565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128c8576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561292f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61293c858585600161345c565b612948600084876125e6565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612bc8576000548214612bc757878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c338585856001613462565b5050505050565b612c42613898565b600082905080612c5061277b565b11158015612c5f575060005481105b15612e92576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e9057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d74578092505050612ec4565b5b600115612e8f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e8a578092505050612ec4565b612d75565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fa9828260405180602001604052806000815250613468565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ff66125de565b8786866040518563ffffffff1660e01b8152600401613018949392919061438b565b602060405180830381600087803b15801561303257600080fd5b505af192505050801561306357506040513d601f19601f820116820180604052508101906130609190613ba4565b60015b6130dd573d8060008114613093576040519150601f19603f3d011682016040523d82523d6000602084013e613098565b606091505b506000815114156130d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415613178576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061328c565b600082905060005b600082146131aa578080613193906147cb565b915050600a826131a391906145f3565b9150613180565b60008167ffffffffffffffff8111156131c6576131c5614901565b5b6040519080825280601f01601f1916602001820160405280156131f85781602001600182028036833780820191505090505b5090505b6000851461328557600182613211919061467e565b9150600a856132209190614814565b603061322c919061459d565b60f81b818381518110613242576132416148d2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561327e91906145f3565b94506131fc565b8093505050505b919050565b606060008251905060008114156132ba5760405180602001604052806000815250915050613424565b600060036002836132cb919061459d565b6132d591906145f3565b60046132e19190614624565b905060006020826132f2919061459d565b67ffffffffffffffff81111561330b5761330a614901565b5b6040519080825280601f01601f19166020018201604052801561333d5781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614fb1604091399050600181016020830160005b868110156133e15760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050613368565b5060038606600181146133fb576002811461340b57613416565b613d3d60f01b6002830352613416565b603d60f81b60018303525b508484525050819450505050505b919050565b60008160405160200161343c919061402e565b6040516020818303038152906040528051906020012060001c9050919050565b50505050565b50505050565b613475838383600161347a565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134e7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613522576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61352f600086838761345c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156136f957506136f88773ffffffffffffffffffffffffffffffffffffffff16612fad565b5b156137bf575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461376e6000888480600101955088612fd0565b6137a4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156136ff5782600054146137ba57600080fd5b61382b565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156137c0575b8160008190555050506138416000868387613462565b5050505050565b6040518061022001604052806011905b60608152602001906001900390816138585790505090565b6040518061010001604052806008905b60608152602001906001900390816138805790505090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b60006138ee6138e984614514565b6144ef565b90508281526020810184848401111561390a57613909614935565b5b613915848285614726565b509392505050565b60008135905061392c81614e55565b92915050565b60008135905061394181614e6c565b92915050565b60008135905061395681614e83565b92915050565b60008151905061396b81614e83565b92915050565b600082601f83011261398657613985614930565b5b81356139968482602086016138db565b91505092915050565b6000813590506139ae81614e9a565b92915050565b6000602082840312156139ca576139c961493f565b5b60006139d88482850161391d565b91505092915050565b600080604083850312156139f8576139f761493f565b5b6000613a068582860161391d565b9250506020613a178582860161391d565b9150509250929050565b600080600060608486031215613a3a57613a3961493f565b5b6000613a488682870161391d565b9350506020613a598682870161391d565b9250506040613a6a8682870161399f565b9150509250925092565b60008060008060808587031215613a8e57613a8d61493f565b5b6000613a9c8782880161391d565b9450506020613aad8782880161391d565b9350506040613abe8782880161399f565b925050606085013567ffffffffffffffff811115613adf57613ade61493a565b5b613aeb87828801613971565b91505092959194509250565b60008060408385031215613b0e57613b0d61493f565b5b6000613b1c8582860161391d565b9250506020613b2d85828601613932565b9150509250929050565b60008060408385031215613b4e57613b4d61493f565b5b6000613b5c8582860161391d565b9250506020613b6d8582860161399f565b9150509250929050565b600060208284031215613b8d57613b8c61493f565b5b6000613b9b84828501613947565b91505092915050565b600060208284031215613bba57613bb961493f565b5b6000613bc88482850161395c565b91505092915050565b600060208284031215613be757613be661493f565b5b6000613bf58482850161399f565b91505092915050565b613c07816146b2565b82525050565b613c16816146c4565b82525050565b6000613c278261455a565b613c318185614570565b9350613c41818560208601614735565b613c4a81614944565b840191505092915050565b6000613c6082614565565b613c6a8185614581565b9350613c7a818560208601614735565b613c8381614944565b840191505092915050565b6000613c9982614565565b613ca38185614592565b9350613cb3818560208601614735565b80840191505092915050565b60008154613ccc81614768565b613cd68186614592565b94506001821660008114613cf15760018114613d0257613d35565b60ff19831686528186019350613d35565b613d0b85614545565b60005b83811015613d2d57815481890152600182019150602081019050613d0e565b838801955050505b50505092915050565b6000613d4b602683614581565b9150613d5682614955565b604082019050919050565b6000613d6e601b83614592565b9150613d79826149a4565b601b82019050919050565b6000613d91600383614592565b9150613d9c826149cd565b600382019050919050565b6000613db4602083614592565b9150613dbf826149f6565b602082019050919050565b6000613dd7602283614592565b9150613de282614a1f565b602282019050919050565b6000613dfa601e83614592565b9150613e0582614a6e565b601e82019050919050565b6000613e1d601e83614592565b9150613e2882614a97565b601e82019050919050565b6000613e40601f83614592565b9150613e4b82614ac0565b601f82019050919050565b6000613e63600183614592565b9150613e6e82614ae9565b600182019050919050565b6000613e86601e83614592565b9150613e9182614b12565b601e82019050919050565b6000613ea9600283614592565b9150613eb482614b3b565b600282019050919050565b6000613ecc600b83614581565b9150613ed782614b64565b602082019050919050565b6000613ef061010a83614592565b9150613efb82614b8d565b61010a82019050919050565b6000613f14602083614581565b9150613f1f82614ce7565b602082019050919050565b6000613f37600983614581565b9150613f4282614d10565b602082019050919050565b6000613f5a601783614592565b9150613f6582614d39565b601782019050919050565b6000613f7d601083614581565b9150613f8882614d62565b602082019050919050565b6000613fa0602783614592565b9150613fab82614d8b565b602782019050919050565b6000613fc3601d83614592565b9150613fce82614dda565b601d82019050919050565b6000613fe6601f83614581565b9150613ff182614e03565b602082019050919050565b6000614009601e83614592565b915061401482614e2c565b601e82019050919050565b6140288161471c565b82525050565b600061403a8284613c8e565b915081905092915050565b60006140518285613c8e565b915061405d8284613c8e565b91508190509392505050565b6000614075828b613c8e565b9150614081828a613c8e565b915061408d8289613c8e565b91506140998288613c8e565b91506140a58287613c8e565b91506140b18286613c8e565b91506140bd8285613c8e565b91506140c98284613c8e565b91508190509998505050505050505050565b60006140e7828c613c8e565b91506140f3828b613c8e565b91506140ff828a613c8e565b915061410b8289613c8e565b91506141178288613c8e565b91506141238287613c8e565b915061412f8286613c8e565b915061413b8285613c8e565b91506141478284613c8e565b91508190509a9950505050505050505050565b60006141668285613c8e565b915061417182613e56565b915061417d8284613cbf565b91508190509392505050565b600061419482613d61565b91506141a08284613c8e565b91506141ab82613d84565b915081905092915050565b60006141c182613da7565b91506141cd8284613c8e565b91506141d882613d84565b915081905092915050565b60006141ee82613dca565b91506141fa8284613c8e565b915061420582613e9c565b915081905092915050565b600061421b82613ded565b91506142278284613c8e565b915061423282613d84565b915081905092915050565b600061424882613e10565b91506142548284613c8e565b915061425f82613d84565b915081905092915050565b600061427582613e33565b91506142818284613c8e565b915061428c82613d84565b915081905092915050565b60006142a282613e79565b91506142ae8284613c8e565b91506142b982613d84565b915081905092915050565b60006142cf82613f4d565b91506142db8286613c8e565b91506142e682613ee2565b91506142f28285613c8e565b91506142fd82613f93565b91506143098284613c8e565b915061431482613e9c565b9150819050949350505050565b600061432c82613fb6565b91506143388284613c8e565b915081905092915050565b600061434e82613ffc565b915061435a8284613c8e565b915061436582613d84565b915081905092915050565b60006020820190506143856000830184613bfe565b92915050565b60006080820190506143a06000830187613bfe565b6143ad6020830186613bfe565b6143ba604083018561401f565b81810360608301526143cc8184613c1c565b905095945050505050565b60006020820190506143ec6000830184613c0d565b92915050565b6000602082019050818103600083015261440c8184613c55565b905092915050565b6000602082019050818103600083015261442d81613d3e565b9050919050565b6000602082019050818103600083015261444d81613ebf565b9050919050565b6000602082019050818103600083015261446d81613f07565b9050919050565b6000602082019050818103600083015261448d81613f2a565b9050919050565b600060208201905081810360008301526144ad81613f70565b9050919050565b600060208201905081810360008301526144cd81613fd9565b9050919050565b60006020820190506144e9600083018461401f565b92915050565b60006144f961450a565b9050614505828261479a565b919050565b6000604051905090565b600067ffffffffffffffff82111561452f5761452e614901565b5b61453882614944565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145a88261471c565b91506145b38361471c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145e8576145e7614845565b5b828201905092915050565b60006145fe8261471c565b91506146098361471c565b92508261461957614618614874565b5b828204905092915050565b600061462f8261471c565b915061463a8361471c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561467357614672614845565b5b828202905092915050565b60006146898261471c565b91506146948361471c565b9250828210156146a7576146a6614845565b5b828203905092915050565b60006146bd826146fc565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614753578082015181840152602081019050614738565b83811115614762576000848401525b50505050565b6000600282049050600182168061478057607f821691505b60208210811415614794576147936148a3565b5b50919050565b6147a382614944565b810181811067ffffffffffffffff821117156147c2576147c1614901565b5b80604052505050565b60006147d68261471c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561480957614808614845565b5b600182019050919050565b600061481f8261471c565b915061482a8361471c565b92508261483a57614839614874565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a2245222c2276616c7565223a220000000000600082015250565b7f227d2c0000000000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a22416e74692d54222c2276616c7565223a22600082015250565b7f7b2274726169745f74797065223a22506f6c6974696373222c2276616c75652260008201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b7f7b2274726169745f74797065223a224c656773222c2276616c7565223a220000600082015250565b7f7b2274726169745f74797065223a2248656164222c2276616c7565223a220000600082015250565b7f7b2274726169745f74797065223a22536e61636b222c2276616c7565223a2200600082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f7b2274726169745f74797065223a22426f6479222c2276616c7565223a220000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4d41585f52454143484544000000000000000000000000000000000000000000600082015250565b7f222c20226465736372697074696f6e223a20224c6f6f742028666f722054726160008201527f6e73204769726c7329206973206120636f6c6c656374696f6e206f662074726160208201527f6e73206769726c2073746172746572206b6974732067656e657261746564206160408201527f6e642073746f726564206f6e2d636861696e2e2053746174732c20696d61676560608201527f732c20616e64206f746865722066756e6374696f6e616c69747920617265206960808201527f6e74656e74696f6e616c6c79206f6d697474656420666f72206f74686572732060a08201527f746f20696e746572707265742e204665656c206672656520746f20757365207460c08201527f68656d20696e20616e792077617920796f752077616e742e222c20226174747260e08201527f696275746573223a205b0000000000000000000000000000000000000000000061010082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4c4f575f45544845520000000000000000000000000000000000000000000000600082015250565b7f7b226e616d65223a202253746172746572204b69742023000000000000000000600082015250565b7f4d41585f5154595f455843454544454400000000000000000000000000000000600082015250565b7f5d2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b60008201527f6261736536342c00000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f7b2274726169745f74797065223a2247616d65222c2276616c7565223a220000600082015250565b614e5e816146b2565b8114614e6957600080fd5b50565b614e75816146c4565b8114614e8057600080fd5b50565b614e8c816146d0565b8114614e9757600080fd5b50565b614ea38161471c565b8114614eae57600080fd5b5056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365222066696c6c3d2223374143424635223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365222066696c6c3d2223374143424635223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365222066696c6c3d2223374143424635223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365222066696c6c3d2223454141434238223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365222066696c6c3d2223464646223e3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365222066696c6c3d2223464646223ea2646970667358221220afa903785934da64c397d88b7e2855506fcb6bab867c38da3d3e4587bc05cbf664736f6c63430008070033

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.