ETH Price: $3,430.40 (+3.52%)

Token

(0xd7ac080800566d42ab9789a99b7ed0dd5ecbe594)
 

Overview

Max Total Supply

7,777 ERC-721 TOKEN*

Holders

2,162

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 ERC-721 TOKEN*
0x4Dfd01933C8af1151d208a897b97926A2a47867E
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:
PsychonautApeDivision

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-28
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

// File: contracts/Ownable.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.
 *
 * Source: Openzeppelin
 */
abstract contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(msg.sender);
    }

    /**
     * @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() == msg.sender, "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() external virtual onlyOwner {
        _setOwner(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) external virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * Source: Openzeppelin
 */

/**
 * @dev String operations.
 */
library Strings {

    /**
     * @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);
    }
}


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol)

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0));
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered) = tryRecover(hash, signature);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0));
        }
        if (v != 27 && v != 28) {
            return (address(0));
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0));
        }

        return (signer);
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

}

// File: contracts/Address.sol


/**
 * Source: Openzeppelin
 */

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

// File: contracts/IERC721Receiver.sol

/**
 * @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: contracts/IERC165.sol

// https://eips.ethereum.org/EIPS/eip-165 



interface IERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// File: contracts/IERC2981.sol


/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: contracts/ERC165.sol


/**
 * Source: Openzeppelin
 */


/**
 * @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: contracts/IERC721.sol

// https://eips.ethereum.org/EIPS/eip-721, http://erc721.org/ 

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://eips.ethereum.org/EIPS/eip-721
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface IERC721 is IERC165 {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

// File: contracts/IERC721Metadata.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: contracts/ERC721.sol



/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension.
 * Made for efficiancy!
 */
contract ERC721 is ERC165, IERC721, IERC721Metadata, Ownable {
    using Address for address;
    using Strings for uint256;

    uint16 public totalSupply;

    address public proxyRegistryAddress;

    string private baseURI;

    // Mapping from token ID to owner address
    mapping(uint256 => address) internal _owners;

    // Mapping owner address to token count
    mapping(address => uint256) internal _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;


    constructor(address _openseaProxyRegistry, string memory _baseURI) {
        proxyRegistryAddress = _openseaProxyRegistry;
        baseURI = _baseURI;
    }

    /**
     * @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);
    }

    function getBaseURI() external view returns(string memory) {
        return baseURI;
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() external pure override returns (string memory) {
        return "Psychonaut Ape Division";
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() external pure override returns (string memory) {
        return "PAD";
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) external view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    function setBaseURI(string memory uri) external onlyOwner {
        baseURI = uri;
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) external override {
        address owner = _owners[tokenId];
        require(to != owner, "ERC721: approval to current owner");

        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override  returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) external override {
        _setApprovalForAll(msg.sender, operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return _operatorApprovals[owner][operator];
    }

    function setOpenseaProxyRegistry(address addr) external onlyOwner {
        proxyRegistryAddress = addr;
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = _owners[tokenId];
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(uint256 amount, address to) internal {
        uint tokenId = totalSupply;

        _balances[to] += amount;
        
        for (uint i; i < amount; i++) {
            tokenId++;

            _owners[tokenId] = to;
            emit Transfer(address(0), to, tokenId);
        }
        
        totalSupply += uint16(amount);

        require(
            _checkOnERC721Received(address(0), to, tokenId, ""),
            "ERC721: transfer to non ERC721Receiver implementer"
        ); // checking it once will make sure that the address can recieve NFTs
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(_owners[tokenId] == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

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

        _balances[from]--;
        _balances[to]++;
        
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

}

contract OwnableDelegateProxy {}

/**
 * Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users
 */
contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

// File: contracts/PsychonautApeDivision.sol

contract PsychonautApeDivision is Ownable, IERC2981, ERC721 {
    
    bool private _onlyMintList;
    bool private _mintingEnabled;

    address public devWallet;
    address public teamWallet;

    mapping (address => uint8) private amountMinted;

    constructor(
        address _openseaProxyRegistry,
        string memory _tempBaseURI
    ) ERC721(_openseaProxyRegistry, _tempBaseURI) { }
    
    function mintFromReserve(uint amount, address to) external onlyOwner {
        require(amount + totalSupply < 7778, "Request will exceed max supply!");
        _mint(amount, to);
    }

    modifier mintFunc(uint amount, uint price) {
        require(totalSupply + amount < 7778, "Request exceeds max supply!");
        require(msg.value == amount * price, "ETH Amount is not correct!");

        _;

        _mint(amount, msg.sender);
    }

    modifier mintlistFunc(uint amount) {
        require(_onlyMintList, "Minting is not enabled!");

        _;

        amountMinted[msg.sender] += uint8(amount);
    }

    function mint(uint256 amount) external payable mintFunc(amount, 1e17) {
        require(_mintingEnabled, "Minting is not enabled!");
        require(amount < 21 && amount != 0, "Invalid request amount!");
    }

    function mintlistMint(bytes calldata sig, uint256 amount) external payable mintlistFunc(amount) mintFunc(amount, 9e16)  {
        require(checkMintlist(sig), "User not on mintlist!");
        require(amount + amountMinted[msg.sender] < 4 && amount != 0, "Request exceeds max per wallet!");
    }

    function checkMintlist(bytes calldata sig) private view returns(bool) {
        return(
            _checkSig(keccak256(abi.encodePacked(msg.sender)), sig) ||
            IERC721(0x3302F0674f316584092C15B865b9e5C8f10751D2).balanceOf(msg.sender) > 0
        );
    }

    function vipMintlistMint(uint256 amount, bytes calldata sig) external payable mintlistFunc(amount) mintFunc(amount, 8e16) {
        require(checkVipMintlist(sig), "User not on VIP mintlist!");
        require(amount + amountMinted[msg.sender] < 6 && amount != 0, "Request exceeds max per wallet!");
    }

    function checkVipMintlist(bytes calldata sig) private view returns(bool) {
        return(
            _checkSig(keccak256(abi.encodePacked(msg.sender, "VIP")), sig)
        );
    }

    function _checkSig(bytes32 hash, bytes memory sig) private view returns(bool) {
        return ECDSA.recover(
            ECDSA.toEthSignedMessageHash(hash),
            sig
        ) == owner();
    }

    function checkSig(address wallet, bytes3 list, bytes memory sig) external view returns(bool) {
        return list != bytes3(0) ?
            _checkSig(keccak256(abi.encodePacked(wallet, list)), sig) :
            _checkSig(keccak256(abi.encodePacked(wallet)), sig);
    }

    function getMsg(address wallet, bytes3 list) external pure returns(bytes32) {
        return list != bytes3(0) ?
            keccak256(abi.encodePacked(wallet, list)) :
            keccak256(abi.encodePacked(wallet));
    }

    function getSalesStatus() external view returns(bool onlyWhitelist, bool mintingEnabled) {
        onlyWhitelist = _onlyMintList;
        mintingEnabled = _mintingEnabled;
    }

    /**
     * @notice returns royalty info for EIP2981 supporting marketplaces
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint tokenId, uint salePrice) external view override returns(address receiver, uint256 royaltyAmount) {
        require(_exists(tokenId), "Royality querry for non-existant token!");
        return(owner(), (salePrice * 7) / 100);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function setDevWallet(address addr) onlyOwner external {
        devWallet = addr;
    }

    function setTeamWallet(address addr) onlyOwner external {
        teamWallet = addr;
    }

    function withdraw() onlyOwner external {
        uint bal = address(this).balance;
        
        (bool success1, ) = payable(msg.sender).call{value: bal * 2 / 10, gas: 2600}("");
        (bool success2, ) = payable(teamWallet).call{value: bal * 4 / 10, gas: 2600}("");
        (bool success3, ) = payable(devWallet).call{value: bal * 4 / 10, gas: 2600}("");
        require(
            success1 &&
            success2 &&
            success3,
            "One of the transfers failed!"
        );
    }

    /**
     * @notice toggles pre sale
     * @dev enables the pre sale functions. NEVER USE THIS AFTER ENABLING THE PUBLIC SALE FUNCTIONS UNLESS ITS NECESSARY
     */
    function togglePresale() external onlyOwner {
        _onlyMintList = !_onlyMintList;
    }

    /**
     * @notice toggles the public sale
     * @dev enables/disables public sale functions and disables pre sale functions
     */
    function togglePublicSale() external onlyOwner {
        _onlyMintList = false;
        _mintingEnabled = !_mintingEnabled;
    }

    function tokensOfOwner(address owner) external view returns(uint[] memory) {
        uint[] memory tokens = new uint[](balanceOf(owner));
        uint x;

        for (uint i = 1; i <= totalSupply; i++) {
            if (_owners[i] == owner) {
                tokens[x] = i;
                x++;
            }
        }

        return tokens;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_openseaProxyRegistry","type":"address"},{"internalType":"string","name":"_tempBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"address","name":"wallet","type":"address"},{"internalType":"bytes3","name":"list","type":"bytes3"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"checkSig","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes3","name":"list","type":"bytes3"}],"name":"getMsg","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getSalesStatus","outputs":[{"internalType":"bool","name":"onlyWhitelist","type":"bool"},{"internalType":"bool","name":"mintingEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setOpenseaProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setTeamWallet","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":"pure","type":"function"},{"inputs":[],"name":"teamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"vipMintlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003bab38038062003bab833981016040819052620000349162000172565b818162000041336200007c565b600180546001600160a01b0319166001600160a01b038416179055805162000071906002906020840190620000cc565b5050505050620002c5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620000da9062000272565b90600052602060002090601f016020900481019282620000fe576000855562000149565b82601f106200011957805160ff191683800117855562000149565b8280016001018555821562000149579182015b82811115620001495782518255916020019190600101906200012c565b50620001579291506200015b565b5090565b5b808211156200015757600081556001016200015c565b600080604083850312156200018657600080fd5b82516001600160a01b03811681146200019e57600080fd5b602084810151919350906001600160401b0380821115620001be57600080fd5b818601915086601f830112620001d357600080fd5b815181811115620001e857620001e8620002af565b604051601f8201601f19908116603f01168101908382118183101715620002135762000213620002af565b8160405282815289868487010111156200022c57600080fd5b600093505b8284101562000250578484018601518185018701529285019262000231565b82841115620002625760008684830101525b8096505050505050509250929050565b600181811c908216806200028757607f821691505b60208210811415620002a957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6138d680620002d56000396000f3fe60806040526004361061026a5760003560e01c80638462151c11610153578063b23f729c116100cb578063c87b56dd1161007f578063e222c7f911610064578063e222c7f914610757578063e985e9c51461076c578063f2fde38b1461078c57600080fd5b8063c87b56dd14610717578063cd7c03261461073757600080fd5b8063b88d4fde116100b0578063b88d4fde146106c4578063bd2f5244146106e4578063be0ac3e71461070457600080fd5b8063b23f729c14610691578063b79593c1146106a457600080fd5b806395d89b4111610122578063a0712d6811610107578063a0712d681461063e578063a22cb46514610651578063adb03e4f1461067157600080fd5b806395d89b41146105d857806395f94bde1461061e57600080fd5b80638462151c146105345780638b2c92ab146105615780638da5cb5b146105945780638ea5220f146105b257600080fd5b806334393743116101e657806359927044116101b557806370a082311161019a57806370a08231146104dc578063714c53981461050a578063715018a61461051f57600080fd5b8063599270441461049c5780636352211e146104bc57600080fd5b806334393743146104325780633ccfd60b1461044757806342842e0e1461045c57806355f804b31461047c57600080fd5b80631525ff7d1161023d5780631f53ac02116102225780631f53ac02146103b357806323b872dd146103d35780632a55205a146103f357600080fd5b80631525ff7d1461034d57806318160ddd1461036d57600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561027b57600080fd5b5061028f61028a366004613233565b6107ac565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5060408051808201909152601781527f50737963686f6e61757420417065204469766973696f6e00000000000000000060208201525b60405161029b91906135c1565b3480156102ff57600080fd5b5061031361030e36600461331f565b610808565b6040516001600160a01b03909116815260200161029b565b34801561033757600080fd5b5061034b610346366004613207565b6108b3565b005b34801561035957600080fd5b5061034b61036836600461303c565b6109e2565b34801561037957600080fd5b506000546103a09074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff909116815260200161029b565b3480156103bf57600080fd5b5061034b6103ce36600461303c565b610a85565b3480156103df57600080fd5b5061034b6103ee366004613092565b610b2e565b3480156103ff57600080fd5b5061041361040e3660046133c2565b610bb5565b604080516001600160a01b03909316835260208301919091520161029b565b34801561043e57600080fd5b5061034b610c70565b34801561045357600080fd5b5061034b610d0b565b34801561046857600080fd5b5061034b610477366004613092565b610f29565b34801561048857600080fd5b5061034b6104973660046132d6565b610f44565b3480156104a857600080fd5b50600854610313906001600160a01b031681565b3480156104c857600080fd5b506103136104d736600461331f565b610fc4565b3480156104e857600080fd5b506104fc6104f736600461303c565b61104f565b60405190815260200161029b565b34801561051657600080fd5b506102e66110e9565b34801561052b57600080fd5b5061034b61117b565b34801561054057600080fd5b5061055461054f36600461303c565b6111f0565b60405161029b919061357d565b34801561056d57600080fd5b5060075460ff8082169161010090041660408051921515835290151560208301520161029b565b3480156105a057600080fd5b506000546001600160a01b0316610313565b3480156105be57600080fd5b50600754610313906201000090046001600160a01b031681565b3480156105e457600080fd5b5060408051808201909152600381527f504144000000000000000000000000000000000000000000000000000000000060208201526102e6565b34801561062a57600080fd5b506104fc610639366004613172565b6112d4565b61034b61064c36600461331f565b6113c2565b34801561065d57600080fd5b5061034b61066c36600461313f565b61155d565b34801561067d57600080fd5b5061034b61068c366004613351565b611568565b61034b61069f366004613376565b611655565b3480156106b057600080fd5b5061028f6106bf3660046131a7565b6118a2565b3480156106d057600080fd5b5061034b6106df3660046130d3565b61198e565b3480156106f057600080fd5b5061034b6106ff36600461303c565b611a16565b61034b61071236600461326d565b611ab9565b34801561072357600080fd5b506102e661073236600461331f565b611cb7565b34801561074357600080fd5b50600154610313906001600160a01b031681565b34801561076357600080fd5b5061034b611d76565b34801561077857600080fd5b5061028f610787366004613059565b611e3a565b34801561079857600080fd5b5061034b6107a736600461303c565b611f21565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610802575061080282612012565b92915050565b6000818152600360205260408120546001600160a01b03166108975760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000818152600360205260409020546001600160a01b039081169083168114156109455760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161088e565b336001600160a01b038216148061096157506109618133611e3a565b6109d35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161088e565b6109dd83836120f5565b505050565b336109f56000546001600160a01b031690565b6001600160a01b031614610a4b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b33610a986000546001600160a01b031690565b6001600160a01b031614610aee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600780546001600160a01b0390921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b610b38338261217b565b610baa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161088e565b6109dd838383612258565b60008281526003602052604081205481906001600160a01b0316610c415760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e2100000000000000000000000000000000000000000000000000606482015260840161088e565b6000546001600160a01b03166064610c5a85600761364b565b610c649190613637565b915091505b9250929050565b33610c836000546001600160a01b031690565b6001600160a01b031614610cd95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b33610d1e6000546001600160a01b031690565b6001600160a01b031614610d745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b47600033600a610d8584600261364b565b610d8f9190613637565b604051610a2891906000818181858888f193505050503d8060008114610dd1576040519150601f19603f3d011682016040523d82523d6000602084013e610dd6565b606091505b50506008549091506000906001600160a01b0316600a610df785600461364b565b610e019190613637565b604051610a2891906000818181858888f193505050503d8060008114610e43576040519150601f19603f3d011682016040523d82523d6000602084013e610e48565b606091505b50506007549091506000906201000090046001600160a01b0316600a610e6f86600461364b565b610e799190613637565b604051610a2891906000818181858888f193505050503d8060008114610ebb576040519150601f19603f3d011682016040523d82523d6000602084013e610ec0565b606091505b50509050828015610ece5750815b8015610ed75750805b610f235760405162461bcd60e51b815260206004820152601c60248201527f4f6e65206f6620746865207472616e7366657273206661696c65642100000000604482015260640161088e565b50505050565b6109dd8383836040518060200160405280600081525061198e565b33610f576000546001600160a01b031690565b6001600160a01b031614610fad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b8051610fc0906002906020840190612e78565b5050565b6000818152600360205260408120546001600160a01b0316806108025760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161088e565b60006001600160a01b0382166110cd5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161088e565b506001600160a01b031660009081526004602052604090205490565b6060600280546110f890613700565b80601f016020809104026020016040519081016040528092919081815260200182805461112490613700565b80156111715780601f1061114657610100808354040283529160200191611171565b820191906000526020600020905b81548152906001019060200180831161115457829003601f168201915b5050505050905090565b3361118e6000546001600160a01b031690565b6001600160a01b0316146111e45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b6111ee6000612433565b565b606060006111fd8361104f565b67ffffffffffffffff8111156112155761121561382e565b60405190808252806020026020018201604052801561123e578160200160208202803683370190505b509050600060015b60005474010000000000000000000000000000000000000000900461ffff1681116112cb576000818152600360205260409020546001600160a01b03868116911614156112b957808383815181106112a0576112a06137ff565b6020908102919091010152816112b581613754565b9250505b806112c381613754565b915050611246565b50909392505050565b60007fffffff0000000000000000000000000000000000000000000000000000000000821661134a576040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152603401604051602081830303815290604052805190602001206113bb565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b1660208201527fffffff000000000000000000000000000000000000000000000000000000000083166034820152603701604051602081830303815290604052805190602001205b9392505050565b600054819067016345785d8a000090611e62906113fc90849074010000000000000000000000000000000000000000900461ffff166135fa565b106114495760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c79210000000000604482015260640161088e565b611453818361364b565b34146114a15760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f727265637421000000000000604482015260640161088e565b600754610100900460ff166114f85760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c656421000000000000000000604482015260640161088e565b60158310801561150757508215155b6115535760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964207265717565737420616d6f756e7421000000000000000000604482015260640161088e565b6109dd823361249b565b610fc0338383612647565b3361157b6000546001600160a01b031690565b6001600160a01b0316146115d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600054611e62906115fe9074010000000000000000000000000000000000000000900461ffff16846135fa565b1061164b5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742077696c6c20657863656564206d617820737570706c792100604482015260640161088e565b610fc0828261249b565b600754839060ff166116a95760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c656421000000000000000000604482015260640161088e565b600054849067011c37937e08000090611e62906116e390849074010000000000000000000000000000000000000000900461ffff166135fa565b106117305760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c79210000000000604482015260640161088e565b61173a818361364b565b34146117885760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f727265637421000000000000604482015260640161088e565b6117928585612734565b6117de5760405162461bcd60e51b815260206004820152601960248201527f55736572206e6f74206f6e20564950206d696e746c6973742100000000000000604482015260640161088e565b336000908152600960205260409020546006906117fe9060ff16886135fa565b10801561180a57508515155b6118565760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c65742100604482015260640161088e565b611860823361249b565b5050336000908152600960205260408120805483929061188490849060ff16613612565b92506101000a81548160ff021916908360ff16021790555050505050565b60007fffffff00000000000000000000000000000000000000000000000000000000008316611923576040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b16602082015261191e906034015b60405160208183030381529060405280519060200120836127e5565b611986565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201527fffffff00000000000000000000000000000000000000000000000000000000008416603482015261198690603701611902565b949350505050565b611998338361217b565b611a0a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161088e565b610f2384848484612863565b33611a296000546001600160a01b031690565b6001600160a01b031614611a7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600754819060ff16611b0d5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c656421000000000000000000604482015260640161088e565b600054829067013fbe85edc9000090611e6290611b4790849074010000000000000000000000000000000000000000900461ffff166135fa565b10611b945760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c79210000000000604482015260640161088e565b611b9e818361364b565b3414611bec5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f727265637421000000000000604482015260640161088e565b611bf686866128ec565b611c425760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f74206f6e206d696e746c697374210000000000000000000000604482015260640161088e565b33600090815260096020526040902054600490611c629060ff16866135fa565b10801561180a5750836118565760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c65742100604482015260640161088e565b6000818152600360205260409020546060906001600160a01b0316611d445760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161088e565b6002611d4f836129d5565b604051602001611d6092919061344a565b6040516020818303038152906040529050919050565b33611d896000546001600160a01b031690565b6001600160a01b031614611ddf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600780546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681900460ff1615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909116179055565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611ea057600080fd5b505afa158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed891906132b9565b6001600160a01b03161415611ef1576001915050610802565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b33611f346000546001600160a01b031690565b6001600160a01b031614611f8a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b6001600160a01b0381166120065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161088e565b61200f81612433565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806120a557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061080257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610802565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061214282610fc4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166122055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161088e565b6000828152600360205260409020546001600160a01b039081169084168114806122485750836001600160a01b031661223d84610808565b6001600160a01b0316145b8061198657506119868185611e3a565b6000818152600360205260409020546001600160a01b038481169116146122e75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161088e565b6001600160a01b0382166123625760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161088e565b61236d6000826120f5565b6001600160a01b0383166000908152600460205260408120805491612391836136cb565b90915550506001600160a01b03821660009081526004602052604081208054916123ba83613754565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080546001600160a01b038316825260046020526040822080547401000000000000000000000000000000000000000090920461ffff169285926124e19084906135fa565b90915550600090505b8381101561257f57816124fc81613754565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061257781613754565b9150506124ea565b5082600060148282829054906101000a900461ffff1661259f91906135d4565b92506101000a81548161ffff021916908361ffff1602179055506125d56000838360405180602001604052806000815250612b07565b6109dd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161088e565b816001600160a01b0316836001600160a01b031614156126a95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161088e565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660208201527f564950000000000000000000000000000000000000000000000000000000000060348201526000906113bb906037015b6040516020818303038152906040528051906020012084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127e592505050565b600080546001600160a01b031661285261284c856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b84612cd2565b6001600160a01b0316149392505050565b61286e848484612258565b61287a84848484612b07565b610f235760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161088e565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260009061292990603401612793565b806113bb57506040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152600090733302f0674f316584092c15b865b9e5c8f10751d2906370a082319060240160206040518083038186803b15801561299557600080fd5b505afa1580156129a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cd9190613338565b119392505050565b606081612a1557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612a3f5780612a2981613754565b9150612a389050600a83613637565b9150612a19565b60008167ffffffffffffffff811115612a5a57612a5a61382e565b6040519080825280601f01601f191660200182016040528015612a84576020820181803683370190505b5090505b841561198657612a99600183613688565b9150612aa6600a8661378d565b612ab19060306135fa565b60f81b818381518110612ac657612ac66137ff565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b00600a86613637565b9450612a88565b60006001600160a01b0384163b15612cc7576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612b6490339089908890889060040161354b565b602060405180830381600087803b158015612b7e57600080fd5b505af1925050508015612bcc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612bc991810190613250565b60015b612c7c573d808015612bfa576040519150601f19603f3d011682016040523d82523d6000602084013e612bff565b606091505b508051612c745760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161088e565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611986565b506001949350505050565b60008061198684846000815160411415612d0e5760208201516040830151606084015160001a612d0486828585612d3e565b9350505050610802565b815160401415612d365760208201516040830151612d2d858383612e35565b92505050610802565b506000610802565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612d7057506000611986565b8360ff16601b14158015612d8857508360ff16601c14155b15612d9557506000611986565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015612de9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116612e2c576000915050611986565b95945050505050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821660ff83901c601b01612e6e86828785612d3e565b9695505050505050565b828054612e8490613700565b90600052602060002090601f016020900481019282612ea65760008555612eec565b82601f10612ebf57805160ff1916838001178555612eec565b82800160010185558215612eec579182015b82811115612eec578251825591602001919060010190612ed1565b50612ef8929150612efc565b5090565b5b80821115612ef85760008155600101612efd565b600067ffffffffffffffff80841115612f2c57612f2c61382e565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612f7257612f7261382e565b81604052809350858152868686011115612f8b57600080fd5b858560208301376000602087830101525050509392505050565b80357fffffff000000000000000000000000000000000000000000000000000000000081168114612fd557600080fd5b919050565b60008083601f840112612fec57600080fd5b50813567ffffffffffffffff81111561300457600080fd5b602083019150836020828501011115610c6957600080fd5b600082601f83011261302d57600080fd5b6113bb83833560208501612f11565b60006020828403121561304e57600080fd5b81356113bb8161385d565b6000806040838503121561306c57600080fd5b82356130778161385d565b915060208301356130878161385d565b809150509250929050565b6000806000606084860312156130a757600080fd5b83356130b28161385d565b925060208401356130c28161385d565b929592945050506040919091013590565b600080600080608085870312156130e957600080fd5b84356130f48161385d565b935060208501356131048161385d565b925060408501359150606085013567ffffffffffffffff81111561312757600080fd5b6131338782880161301c565b91505092959194509250565b6000806040838503121561315257600080fd5b823561315d8161385d565b91506020830135801515811461308757600080fd5b6000806040838503121561318557600080fd5b82356131908161385d565b915061319e60208401612fa5565b90509250929050565b6000806000606084860312156131bc57600080fd5b83356131c78161385d565b92506131d560208501612fa5565b9150604084013567ffffffffffffffff8111156131f157600080fd5b6131fd8682870161301c565b9150509250925092565b6000806040838503121561321a57600080fd5b82356132258161385d565b946020939093013593505050565b60006020828403121561324557600080fd5b81356113bb81613872565b60006020828403121561326257600080fd5b81516113bb81613872565b60008060006040848603121561328257600080fd5b833567ffffffffffffffff81111561329957600080fd5b6132a586828701612fda565b909790965060209590950135949350505050565b6000602082840312156132cb57600080fd5b81516113bb8161385d565b6000602082840312156132e857600080fd5b813567ffffffffffffffff8111156132ff57600080fd5b8201601f8101841361331057600080fd5b61198684823560208401612f11565b60006020828403121561333157600080fd5b5035919050565b60006020828403121561334a57600080fd5b5051919050565b6000806040838503121561336457600080fd5b8235915060208301356130878161385d565b60008060006040848603121561338b57600080fd5b83359250602084013567ffffffffffffffff8111156133a957600080fd5b6133b586828701612fda565b9497909650939450505050565b600080604083850312156133d557600080fd5b50508035926020909101359150565b600081518084526133fc81602086016020860161369f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815161344081856020860161369f565b9290920192915050565b600080845481600182811c91508083168061346657607f831692505b602080841082141561349f577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156134b357600181146134e25761350f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061350f565b60008b81526020902060005b868110156135075781548b8201529085019083016134ee565b505084890196505b505050505050612e2c613522828661342e565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612e6e60808301846133e4565b6020808252825182820181905260009190848201906040850190845b818110156135b557835183529284019291840191600101613599565b50909695505050505050565b6020815260006113bb60208301846133e4565b600061ffff8083168185168083038211156135f1576135f16137a1565b01949350505050565b6000821982111561360d5761360d6137a1565b500190565b600060ff821660ff84168060ff0382111561362f5761362f6137a1565b019392505050565b600082613646576136466137d0565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613683576136836137a1565b500290565b60008282101561369a5761369a6137a1565b500390565b60005b838110156136ba5781810151838201526020016136a2565b83811115610f235750506000910152565b6000816136da576136da6137a1565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c9082168061371457607f821691505b6020821081141561374e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613786576137866137a1565b5060010190565b60008261379c5761379c6137d0565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461200f57600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461200f57600080fdfea2646970667358221220e34d057b7d108661a59c6b8ceefdeacc5b7219c6aee71dc57df8bb1a0238d60964736f6c63430008070033000000000000000000000000bfb49c02369af568e1d9b5ce1e3584fcf943baf80000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000474656d7000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061026a5760003560e01c80638462151c11610153578063b23f729c116100cb578063c87b56dd1161007f578063e222c7f911610064578063e222c7f914610757578063e985e9c51461076c578063f2fde38b1461078c57600080fd5b8063c87b56dd14610717578063cd7c03261461073757600080fd5b8063b88d4fde116100b0578063b88d4fde146106c4578063bd2f5244146106e4578063be0ac3e71461070457600080fd5b8063b23f729c14610691578063b79593c1146106a457600080fd5b806395d89b4111610122578063a0712d6811610107578063a0712d681461063e578063a22cb46514610651578063adb03e4f1461067157600080fd5b806395d89b41146105d857806395f94bde1461061e57600080fd5b80638462151c146105345780638b2c92ab146105615780638da5cb5b146105945780638ea5220f146105b257600080fd5b806334393743116101e657806359927044116101b557806370a082311161019a57806370a08231146104dc578063714c53981461050a578063715018a61461051f57600080fd5b8063599270441461049c5780636352211e146104bc57600080fd5b806334393743146104325780633ccfd60b1461044757806342842e0e1461045c57806355f804b31461047c57600080fd5b80631525ff7d1161023d5780631f53ac02116102225780631f53ac02146103b357806323b872dd146103d35780632a55205a146103f357600080fd5b80631525ff7d1461034d57806318160ddd1461036d57600080fd5b806301ffc9a71461026f57806306fdde03146102a4578063081812fc146102f3578063095ea7b31461032b575b600080fd5b34801561027b57600080fd5b5061028f61028a366004613233565b6107ac565b60405190151581526020015b60405180910390f35b3480156102b057600080fd5b5060408051808201909152601781527f50737963686f6e61757420417065204469766973696f6e00000000000000000060208201525b60405161029b91906135c1565b3480156102ff57600080fd5b5061031361030e36600461331f565b610808565b6040516001600160a01b03909116815260200161029b565b34801561033757600080fd5b5061034b610346366004613207565b6108b3565b005b34801561035957600080fd5b5061034b61036836600461303c565b6109e2565b34801561037957600080fd5b506000546103a09074010000000000000000000000000000000000000000900461ffff1681565b60405161ffff909116815260200161029b565b3480156103bf57600080fd5b5061034b6103ce36600461303c565b610a85565b3480156103df57600080fd5b5061034b6103ee366004613092565b610b2e565b3480156103ff57600080fd5b5061041361040e3660046133c2565b610bb5565b604080516001600160a01b03909316835260208301919091520161029b565b34801561043e57600080fd5b5061034b610c70565b34801561045357600080fd5b5061034b610d0b565b34801561046857600080fd5b5061034b610477366004613092565b610f29565b34801561048857600080fd5b5061034b6104973660046132d6565b610f44565b3480156104a857600080fd5b50600854610313906001600160a01b031681565b3480156104c857600080fd5b506103136104d736600461331f565b610fc4565b3480156104e857600080fd5b506104fc6104f736600461303c565b61104f565b60405190815260200161029b565b34801561051657600080fd5b506102e66110e9565b34801561052b57600080fd5b5061034b61117b565b34801561054057600080fd5b5061055461054f36600461303c565b6111f0565b60405161029b919061357d565b34801561056d57600080fd5b5060075460ff8082169161010090041660408051921515835290151560208301520161029b565b3480156105a057600080fd5b506000546001600160a01b0316610313565b3480156105be57600080fd5b50600754610313906201000090046001600160a01b031681565b3480156105e457600080fd5b5060408051808201909152600381527f504144000000000000000000000000000000000000000000000000000000000060208201526102e6565b34801561062a57600080fd5b506104fc610639366004613172565b6112d4565b61034b61064c36600461331f565b6113c2565b34801561065d57600080fd5b5061034b61066c36600461313f565b61155d565b34801561067d57600080fd5b5061034b61068c366004613351565b611568565b61034b61069f366004613376565b611655565b3480156106b057600080fd5b5061028f6106bf3660046131a7565b6118a2565b3480156106d057600080fd5b5061034b6106df3660046130d3565b61198e565b3480156106f057600080fd5b5061034b6106ff36600461303c565b611a16565b61034b61071236600461326d565b611ab9565b34801561072357600080fd5b506102e661073236600461331f565b611cb7565b34801561074357600080fd5b50600154610313906001600160a01b031681565b34801561076357600080fd5b5061034b611d76565b34801561077857600080fd5b5061028f610787366004613059565b611e3a565b34801561079857600080fd5b5061034b6107a736600461303c565b611f21565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001480610802575061080282612012565b92915050565b6000818152600360205260408120546001600160a01b03166108975760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000818152600360205260409020546001600160a01b039081169083168114156109455760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161088e565b336001600160a01b038216148061096157506109618133611e3a565b6109d35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161088e565b6109dd83836120f5565b505050565b336109f56000546001600160a01b031690565b6001600160a01b031614610a4b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b33610a986000546001600160a01b031690565b6001600160a01b031614610aee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600780546001600160a01b0390921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b610b38338261217b565b610baa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161088e565b6109dd838383612258565b60008281526003602052604081205481906001600160a01b0316610c415760405162461bcd60e51b815260206004820152602760248201527f526f79616c6974792071756572727920666f72206e6f6e2d6578697374616e7460448201527f20746f6b656e2100000000000000000000000000000000000000000000000000606482015260840161088e565b6000546001600160a01b03166064610c5a85600761364b565b610c649190613637565b915091505b9250929050565b33610c836000546001600160a01b031690565b6001600160a01b031614610cd95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b33610d1e6000546001600160a01b031690565b6001600160a01b031614610d745760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b47600033600a610d8584600261364b565b610d8f9190613637565b604051610a2891906000818181858888f193505050503d8060008114610dd1576040519150601f19603f3d011682016040523d82523d6000602084013e610dd6565b606091505b50506008549091506000906001600160a01b0316600a610df785600461364b565b610e019190613637565b604051610a2891906000818181858888f193505050503d8060008114610e43576040519150601f19603f3d011682016040523d82523d6000602084013e610e48565b606091505b50506007549091506000906201000090046001600160a01b0316600a610e6f86600461364b565b610e799190613637565b604051610a2891906000818181858888f193505050503d8060008114610ebb576040519150601f19603f3d011682016040523d82523d6000602084013e610ec0565b606091505b50509050828015610ece5750815b8015610ed75750805b610f235760405162461bcd60e51b815260206004820152601c60248201527f4f6e65206f6620746865207472616e7366657273206661696c65642100000000604482015260640161088e565b50505050565b6109dd8383836040518060200160405280600081525061198e565b33610f576000546001600160a01b031690565b6001600160a01b031614610fad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b8051610fc0906002906020840190612e78565b5050565b6000818152600360205260408120546001600160a01b0316806108025760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606482015260840161088e565b60006001600160a01b0382166110cd5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015260840161088e565b506001600160a01b031660009081526004602052604090205490565b6060600280546110f890613700565b80601f016020809104026020016040519081016040528092919081815260200182805461112490613700565b80156111715780601f1061114657610100808354040283529160200191611171565b820191906000526020600020905b81548152906001019060200180831161115457829003601f168201915b5050505050905090565b3361118e6000546001600160a01b031690565b6001600160a01b0316146111e45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b6111ee6000612433565b565b606060006111fd8361104f565b67ffffffffffffffff8111156112155761121561382e565b60405190808252806020026020018201604052801561123e578160200160208202803683370190505b509050600060015b60005474010000000000000000000000000000000000000000900461ffff1681116112cb576000818152600360205260409020546001600160a01b03868116911614156112b957808383815181106112a0576112a06137ff565b6020908102919091010152816112b581613754565b9250505b806112c381613754565b915050611246565b50909392505050565b60007fffffff0000000000000000000000000000000000000000000000000000000000821661134a576040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152603401604051602081830303815290604052805190602001206113bb565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b1660208201527fffffff000000000000000000000000000000000000000000000000000000000083166034820152603701604051602081830303815290604052805190602001205b9392505050565b600054819067016345785d8a000090611e62906113fc90849074010000000000000000000000000000000000000000900461ffff166135fa565b106114495760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c79210000000000604482015260640161088e565b611453818361364b565b34146114a15760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f727265637421000000000000604482015260640161088e565b600754610100900460ff166114f85760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c656421000000000000000000604482015260640161088e565b60158310801561150757508215155b6115535760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964207265717565737420616d6f756e7421000000000000000000604482015260640161088e565b6109dd823361249b565b610fc0338383612647565b3361157b6000546001600160a01b031690565b6001600160a01b0316146115d15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600054611e62906115fe9074010000000000000000000000000000000000000000900461ffff16846135fa565b1061164b5760405162461bcd60e51b815260206004820152601f60248201527f526571756573742077696c6c20657863656564206d617820737570706c792100604482015260640161088e565b610fc0828261249b565b600754839060ff166116a95760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c656421000000000000000000604482015260640161088e565b600054849067011c37937e08000090611e62906116e390849074010000000000000000000000000000000000000000900461ffff166135fa565b106117305760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c79210000000000604482015260640161088e565b61173a818361364b565b34146117885760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f727265637421000000000000604482015260640161088e565b6117928585612734565b6117de5760405162461bcd60e51b815260206004820152601960248201527f55736572206e6f74206f6e20564950206d696e746c6973742100000000000000604482015260640161088e565b336000908152600960205260409020546006906117fe9060ff16886135fa565b10801561180a57508515155b6118565760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c65742100604482015260640161088e565b611860823361249b565b5050336000908152600960205260408120805483929061188490849060ff16613612565b92506101000a81548160ff021916908360ff16021790555050505050565b60007fffffff00000000000000000000000000000000000000000000000000000000008316611923576040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b16602082015261191e906034015b60405160208183030381529060405280519060200120836127e5565b611986565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201527fffffff00000000000000000000000000000000000000000000000000000000008416603482015261198690603701611902565b949350505050565b611998338361217b565b611a0a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606482015260840161088e565b610f2384848484612863565b33611a296000546001600160a01b031690565b6001600160a01b031614611a7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b600754819060ff16611b0d5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e67206973206e6f7420656e61626c656421000000000000000000604482015260640161088e565b600054829067013fbe85edc9000090611e6290611b4790849074010000000000000000000000000000000000000000900461ffff166135fa565b10611b945760405162461bcd60e51b815260206004820152601b60248201527f526571756573742065786365656473206d617820737570706c79210000000000604482015260640161088e565b611b9e818361364b565b3414611bec5760405162461bcd60e51b815260206004820152601a60248201527f45544820416d6f756e74206973206e6f7420636f727265637421000000000000604482015260640161088e565b611bf686866128ec565b611c425760405162461bcd60e51b815260206004820152601560248201527f55736572206e6f74206f6e206d696e746c697374210000000000000000000000604482015260640161088e565b33600090815260096020526040902054600490611c629060ff16866135fa565b10801561180a5750836118565760405162461bcd60e51b815260206004820152601f60248201527f526571756573742065786365656473206d6178207065722077616c6c65742100604482015260640161088e565b6000818152600360205260409020546060906001600160a01b0316611d445760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161088e565b6002611d4f836129d5565b604051602001611d6092919061344a565b6040516020818303038152906040529050919050565b33611d896000546001600160a01b031690565b6001600160a01b031614611ddf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b600780546101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681900460ff1615027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909116179055565b6001546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b158015611ea057600080fd5b505afa158015611eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ed891906132b9565b6001600160a01b03161415611ef1576001915050610802565b50506001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b33611f346000546001600160a01b031690565b6001600160a01b031614611f8a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088e565b6001600160a01b0381166120065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161088e565b61200f81612433565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806120a557507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061080257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610802565b600081815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038416908117909155819061214282610fc4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166122055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e0000000000000000000000000000000000000000606482015260840161088e565b6000828152600360205260409020546001600160a01b039081169084168114806122485750836001600160a01b031661223d84610808565b6001600160a01b0316145b8061198657506119868185611e3a565b6000818152600360205260409020546001600160a01b038481169116146122e75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161088e565b6001600160a01b0382166123625760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161088e565b61236d6000826120f5565b6001600160a01b0383166000908152600460205260408120805491612391836136cb565b90915550506001600160a01b03821660009081526004602052604081208054916123ba83613754565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080546001600160a01b038316825260046020526040822080547401000000000000000000000000000000000000000090920461ffff169285926124e19084906135fa565b90915550600090505b8381101561257f57816124fc81613754565b60008181526003602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389169081179091559051929550859350917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061257781613754565b9150506124ea565b5082600060148282829054906101000a900461ffff1661259f91906135d4565b92506101000a81548161ffff021916908361ffff1602179055506125d56000838360405180602001604052806000815250612b07565b6109dd5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161088e565b816001600160a01b0316836001600160a01b031614156126a95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161088e565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660208201527f564950000000000000000000000000000000000000000000000000000000000060348201526000906113bb906037015b6040516020818303038152906040528051906020012084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127e592505050565b600080546001600160a01b031661285261284c856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b84612cd2565b6001600160a01b0316149392505050565b61286e848484612258565b61287a84848484612b07565b610f235760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161088e565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b16602082015260009061292990603401612793565b806113bb57506040517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152600090733302f0674f316584092c15b865b9e5c8f10751d2906370a082319060240160206040518083038186803b15801561299557600080fd5b505afa1580156129a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cd9190613338565b119392505050565b606081612a1557505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612a3f5780612a2981613754565b9150612a389050600a83613637565b9150612a19565b60008167ffffffffffffffff811115612a5a57612a5a61382e565b6040519080825280601f01601f191660200182016040528015612a84576020820181803683370190505b5090505b841561198657612a99600183613688565b9150612aa6600a8661378d565b612ab19060306135fa565b60f81b818381518110612ac657612ac66137ff565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612b00600a86613637565b9450612a88565b60006001600160a01b0384163b15612cc7576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a0290612b6490339089908890889060040161354b565b602060405180830381600087803b158015612b7e57600080fd5b505af1925050508015612bcc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252612bc991810190613250565b60015b612c7c573d808015612bfa576040519150601f19603f3d011682016040523d82523d6000602084013e612bff565b606091505b508051612c745760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161088e565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050611986565b506001949350505050565b60008061198684846000815160411415612d0e5760208201516040830151606084015160001a612d0486828585612d3e565b9350505050610802565b815160401415612d365760208201516040830151612d2d858383612e35565b92505050610802565b506000610802565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612d7057506000611986565b8360ff16601b14158015612d8857508360ff16601c14155b15612d9557506000611986565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015612de9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b038116612e2c576000915050611986565b95945050505050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821660ff83901c601b01612e6e86828785612d3e565b9695505050505050565b828054612e8490613700565b90600052602060002090601f016020900481019282612ea65760008555612eec565b82601f10612ebf57805160ff1916838001178555612eec565b82800160010185558215612eec579182015b82811115612eec578251825591602001919060010190612ed1565b50612ef8929150612efc565b5090565b5b80821115612ef85760008155600101612efd565b600067ffffffffffffffff80841115612f2c57612f2c61382e565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612f7257612f7261382e565b81604052809350858152868686011115612f8b57600080fd5b858560208301376000602087830101525050509392505050565b80357fffffff000000000000000000000000000000000000000000000000000000000081168114612fd557600080fd5b919050565b60008083601f840112612fec57600080fd5b50813567ffffffffffffffff81111561300457600080fd5b602083019150836020828501011115610c6957600080fd5b600082601f83011261302d57600080fd5b6113bb83833560208501612f11565b60006020828403121561304e57600080fd5b81356113bb8161385d565b6000806040838503121561306c57600080fd5b82356130778161385d565b915060208301356130878161385d565b809150509250929050565b6000806000606084860312156130a757600080fd5b83356130b28161385d565b925060208401356130c28161385d565b929592945050506040919091013590565b600080600080608085870312156130e957600080fd5b84356130f48161385d565b935060208501356131048161385d565b925060408501359150606085013567ffffffffffffffff81111561312757600080fd5b6131338782880161301c565b91505092959194509250565b6000806040838503121561315257600080fd5b823561315d8161385d565b91506020830135801515811461308757600080fd5b6000806040838503121561318557600080fd5b82356131908161385d565b915061319e60208401612fa5565b90509250929050565b6000806000606084860312156131bc57600080fd5b83356131c78161385d565b92506131d560208501612fa5565b9150604084013567ffffffffffffffff8111156131f157600080fd5b6131fd8682870161301c565b9150509250925092565b6000806040838503121561321a57600080fd5b82356132258161385d565b946020939093013593505050565b60006020828403121561324557600080fd5b81356113bb81613872565b60006020828403121561326257600080fd5b81516113bb81613872565b60008060006040848603121561328257600080fd5b833567ffffffffffffffff81111561329957600080fd5b6132a586828701612fda565b909790965060209590950135949350505050565b6000602082840312156132cb57600080fd5b81516113bb8161385d565b6000602082840312156132e857600080fd5b813567ffffffffffffffff8111156132ff57600080fd5b8201601f8101841361331057600080fd5b61198684823560208401612f11565b60006020828403121561333157600080fd5b5035919050565b60006020828403121561334a57600080fd5b5051919050565b6000806040838503121561336457600080fd5b8235915060208301356130878161385d565b60008060006040848603121561338b57600080fd5b83359250602084013567ffffffffffffffff8111156133a957600080fd5b6133b586828701612fda565b9497909650939450505050565b600080604083850312156133d557600080fd5b50508035926020909101359150565b600081518084526133fc81602086016020860161369f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000815161344081856020860161369f565b9290920192915050565b600080845481600182811c91508083168061346657607f831692505b602080841082141561349f577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156134b357600181146134e25761350f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952848901965061350f565b60008b81526020902060005b868110156135075781548b8201529085019083016134ee565b505084890196505b505050505050612e2c613522828661342e565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b60006001600160a01b03808716835280861660208401525083604083015260806060830152612e6e60808301846133e4565b6020808252825182820181905260009190848201906040850190845b818110156135b557835183529284019291840191600101613599565b50909695505050505050565b6020815260006113bb60208301846133e4565b600061ffff8083168185168083038211156135f1576135f16137a1565b01949350505050565b6000821982111561360d5761360d6137a1565b500190565b600060ff821660ff84168060ff0382111561362f5761362f6137a1565b019392505050565b600082613646576136466137d0565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613683576136836137a1565b500290565b60008282101561369a5761369a6137a1565b500390565b60005b838110156136ba5781810151838201526020016136a2565b83811115610f235750506000910152565b6000816136da576136da6137a1565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600181811c9082168061371457607f821691505b6020821081141561374e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613786576137866137a1565b5060010190565b60008261379c5761379c6137d0565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6001600160a01b038116811461200f57600080fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461200f57600080fdfea2646970667358221220e34d057b7d108661a59c6b8ceefdeacc5b7219c6aee71dc57df8bb1a0238d60964736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000bfb49c02369af568e1d9b5ce1e3584fcf943baf80000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000474656d7000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _openseaProxyRegistry (address): 0xbfb49C02369AF568e1D9B5ce1E3584FcF943Baf8
Arg [1] : _tempBaseURI (string): temp

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000bfb49c02369af568e1d9b5ce1e3584fcf943baf8
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 74656d7000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

32326:6006:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36438:241;;;;;;;;;;-1:-1:-1;36438:241:0;;;;;:::i;:::-;;:::i;:::-;;;13614:14:1;;13607:22;13589:41;;13577:2;13562:18;36438:241:0;;;;;;;;22736:114;;;;;;;;;;-1:-1:-1;22810:32:0;;;;;;;;;;;;;;;;;22736:114;;;;;;;:::i;23965:214::-;;;;;;;;;;-1:-1:-1;23965:214:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11927:55:1;;;11909:74;;11897:2;11882:18;23965:214:0;11763:226:1;23505:394:0;;;;;;;;;;-1:-1:-1;23505:394:0;;;;;:::i;:::-;;:::i;:::-;;36785:92;;;;;;;;;;-1:-1:-1;36785:92:0;;;;;:::i;:::-;;:::i;20926:25::-;;;;;;;;;;-1:-1:-1;20926:25:0;;;;;;;;;;;;;;24161:6:1;24149:19;;;24131:38;;24119:2;24104:18;20926:25:0;23987:188:1;36687:90:0;;;;;;;;;;-1:-1:-1;36687:90:0;;;;;:::i;:::-;;:::i;25056:331::-;;;;;;;;;;-1:-1:-1;25056:331:0;;;;;:::i;:::-;;:::i;36107:259::-;;;;;;;;;;-1:-1:-1;36107:259:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12702:55:1;;;12684:74;;12789:2;12774:18;;12767:34;;;;12657:18;36107:259:0;12510:297:1;37585:93:0;;;;;;;;;;;;;:::i;36885:519::-;;;;;;;;;;;;;:::i;25458:179::-;;;;;;;;;;-1:-1:-1;25458:179:0;;;;;:::i;:::-;;:::i;23353:90::-;;;;;;;;;;-1:-1:-1;23353:90:0;;;;;:::i;:::-;;:::i;32500:25::-;;;;;;;;;;-1:-1:-1;32500:25:0;;;;-1:-1:-1;;;;;32500:25:0;;;22438:231;;;;;;;;;;-1:-1:-1;22438:231:0;;;;;:::i;:::-;;:::i;22176:200::-;;;;;;;;;;-1:-1:-1;22176:200:0;;;;;:::i;:::-;;:::i;:::-;;;14060:25:1;;;14048:2;14033:18;22176:200:0;13914:177:1;22020:92:0;;;;;;;;;;;;;:::i;1671:96::-;;;;;;;;;;;;;:::i;37968:361::-;;;;;;;;;;-1:-1:-1;37968:361:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35432:180::-;;;;;;;;;;-1:-1:-1;35548:13:0;;;;;;;;35589:15;;;35432:180;;;13828:14:1;;13821:22;13803:41;;13887:14;;13880:22;13875:2;13860:18;;13853:50;13776:18;35432:180:0;13641:268:1;1022:87:0;;;;;;;;;;-1:-1:-1;1068:7:0;1095:6;-1:-1:-1;;;;;1095:6:0;1022:87;;32469:24;;;;;;;;;;-1:-1:-1;32469:24:0;;;;;;;-1:-1:-1;;;;;32469:24:0;;;22919:96;;;;;;;;;;-1:-1:-1;22995:12:0;;;;;;;;;;;;;;;;;22919:96;;35197:227;;;;;;;;;;-1:-1:-1;35197:227:0;;;;;:::i;:::-;;:::i;33385:213::-;;;;;;:::i;:::-;;:::i;24251:147::-;;;;;;;;;;-1:-1:-1;24251:147:0;;;;;:::i;:::-;;:::i;32745:187::-;;;;;;;;;;-1:-1:-1;32745:187:0;;;;;:::i;:::-;;:::i;34190:307::-;;;;;;:::i;:::-;;:::i;34913:276::-;;;;;;;;;;-1:-1:-1;34913:276:0;;;;;:::i;:::-;;:::i;25708:318::-;;;;;;;;;;-1:-1:-1;25708:318:0;;;;;:::i;:::-;;:::i;24877:112::-;;;;;;;;;;-1:-1:-1;24877:112:0;;;;;:::i;:::-;;:::i;33606:298::-;;;;;;:::i;:::-;;:::i;23086:259::-;;;;;;;;;;-1:-1:-1;23086:259:0;;;;;:::i;:::-;;:::i;20960:35::-;;;;;;;;;;-1:-1:-1;20960:35:0;;;;-1:-1:-1;;;;;20960:35:0;;;37828:132;;;;;;;;;;;;;:::i;24469:400::-;;;;;;;;;;-1:-1:-1;24469:400:0;;;;;:::i;:::-;;:::i;1922:194::-;;;;;;;;;;-1:-1:-1;1922:194:0;;;;;:::i;:::-;;:::i;36438:241::-;36540:4;36577:41;;;36592:26;36577:41;;:94;;;36635:36;36659:11;36635:23;:36::i;:::-;36557:114;36438:241;-1:-1:-1;;36438:241:0:o;23965:214::-;24034:7;27556:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27556:16:0;24054:73;;;;-1:-1:-1;;;24054:73:0;;20757:2:1;24054:73:0;;;20739:21:1;20796:2;20776:18;;;20769:30;20835:34;20815:18;;;20808:62;20906:14;20886:18;;;20879:42;20938:19;;24054:73:0;;;;;;;;;-1:-1:-1;24147:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24147:24:0;;23965:214::o;23505:394::-;23580:13;23596:16;;;:7;:16;;;;;;-1:-1:-1;;;;;23596:16:0;;;;23631:11;;;;;23623:57;;;;-1:-1:-1;;;23623:57:0;;22661:2:1;23623:57:0;;;22643:21:1;22700:2;22680:18;;;22673:30;22739:34;22719:18;;;22712:62;22810:3;22790:18;;;22783:31;22831:19;;23623:57:0;22459:397:1;23623:57:0;23715:10;-1:-1:-1;;;;;23715:19:0;;;;:58;;;23738:35;23755:5;23762:10;23738:16;:35::i;:::-;23693:164;;;;-1:-1:-1;;;23693:164:0;;19103:2:1;23693:164:0;;;19085:21:1;19142:2;19122:18;;;19115:30;19181:34;19161:18;;;19154:62;19252:26;19232:18;;;19225:54;19296:19;;23693:164:0;18901:420:1;23693:164:0;23870:21;23879:2;23883:7;23870:8;:21::i;:::-;23569:330;23505:394;;:::o;36785:92::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;36852:10:::1;:17:::0;;;::::1;-1:-1:-1::0;;;;;36852:17:0;;;::::1;::::0;;;::::1;::::0;;36785:92::o;36687:90::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;36753:9:::1;:16:::0;;-1:-1:-1;;;;;36753:16:0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;36687:90::o;25056:331::-;25245:39;25264:10;25276:7;25245:18;:39::i;:::-;25237:101;;;;-1:-1:-1;;;25237:101:0;;23063:2:1;25237:101:0;;;23045:21:1;23102:2;23082:18;;;23075:30;23141:34;23121:18;;;23114:62;23212:19;23192:18;;;23185:47;23249:19;;25237:101:0;22861:413:1;25237:101:0;25351:28;25361:4;25367:2;25371:7;25351:9;:28::i;36107:259::-;36189:16;27556;;;:7;:16;;;;;;36189;;-1:-1:-1;;;;;27556:16:0;36241:68;;;;-1:-1:-1;;;36241:68:0;;20349:2:1;36241:68:0;;;20331:21:1;20388:2;20368:18;;;20361:30;20427:34;20407:18;;;20400:62;20498:9;20478:18;;;20471:37;20525:19;;36241:68:0;20147:403:1;36241:68:0;1068:7;1095:6;-1:-1:-1;;;;;1095:6:0;36354:3;36337:13;:9;36349:1;36337:13;:::i;:::-;36336:21;;;;:::i;:::-;36320:38;;;;36107:259;;;;;;:::o;37585:93::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;37657:13:::1;::::0;;37640:30;;::::1;37657:13;::::0;;::::1;37656:14;37640:30;::::0;;37585:93::o;36885:519::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;36946:21:::1;36935:8;37016:10;37050:2;37040:7;36946:21:::0;37046:1:::1;37040:7;:::i;:::-;:12;;;;:::i;:::-;37008:60;::::0;37059:4:::1;::::0;37008:60;::::1;::::0;;;;;37059:4;37008:60:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;37107:10:0::1;::::0;36988:80;;-1:-1:-1;37080:13:0::1;::::0;-1:-1:-1;;;;;37107:10:0::1;37141:2;37131:7;:3:::0;37137:1:::1;37131:7;:::i;:::-;:12;;;;:::i;:::-;37099:60;::::0;37150:4:::1;::::0;37099:60;::::1;::::0;;;;;37150:4;37099:60:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;37198:9:0::1;::::0;37079:80;;-1:-1:-1;37171:13:0::1;::::0;37198:9;;::::1;-1:-1:-1::0;;;;;37198:9:0::1;37231:2;37221:7;:3:::0;37227:1:::1;37221:7;:::i;:::-;:12;;;;:::i;:::-;37190:59;::::0;37240:4:::1;::::0;37190:59;::::1;::::0;;;;;37240:4;37190:59:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37170:79;;;37282:8;:33;;;;;37307:8;37282:33;:58;;;;;37332:8;37282:58;37260:136;;;::::0;-1:-1:-1;;;37260:136:0;;18386:2:1;37260:136:0::1;::::0;::::1;18368:21:1::0;18425:2;18405:18;;;18398:30;18464;18444:18;;;18437:58;18512:18;;37260:136:0::1;18184:352:1::0;37260:136:0::1;36924:480;;;;36885:519::o:0;25458:179::-;25590:39;25607:4;25613:2;25617:7;25590:39;;;;;;;;;;;;:16;:39::i;23353:90::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;23422:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;23353:90:::0;:::o;22438:231::-;22502:7;22538:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22538:16:0;22573:19;22565:73;;;;-1:-1:-1;;;22565:73:0;;19939:2:1;22565:73:0;;;19921:21:1;19978:2;19958:18;;;19951:30;20017:34;19997:18;;;19990:62;20088:11;20068:18;;;20061:39;20117:19;;22565:73:0;19737:405:1;22176:200:0;22240:7;-1:-1:-1;;;;;22268:19:0;;22260:74;;;;-1:-1:-1;;;22260:74:0;;19528:2:1;22260:74:0;;;19510:21:1;19567:2;19547:18;;;19540:30;19606:34;19586:18;;;19579:62;19677:12;19657:18;;;19650:40;19707:19;;22260:74:0;19326:406:1;22260:74:0;-1:-1:-1;;;;;;22352:16:0;;;;;:9;:16;;;;;;;22176:200::o;22020:92::-;22064:13;22097:7;22090:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22020:92;:::o;1671:96::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;1738:21:::1;1756:1;1738:9;:21::i;:::-;1671:96::o:0;37968:361::-;38028:13;38054:20;38088:16;38098:5;38088:9;:16::i;:::-;38077:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38077:28:0;-1:-1:-1;38054:51:0;-1:-1:-1;38116:6:0;38149:1;38135:161;38157:11;;;;;;;38152:16;;38135:161;;38194:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;38194:19:0;;;:10;;:19;38190:95;;;38246:1;38234:6;38241:1;38234:9;;;;;;;;:::i;:::-;;;;;;;;;;:13;38266:3;;;;:::i;:::-;;;;38190:95;38170:3;;;;:::i;:::-;;;;38135:161;;;-1:-1:-1;38315:6:0;;37968:361;-1:-1:-1;;;37968:361:0:o;35197:227::-;35264:7;35291:17;;;:125;;35391:24;;8829:66:1;8816:2;8812:15;;;8808:88;35391:24:0;;;8796:101:1;8913:12;;35391:24:0;;;;;;;;;;;;35381:35;;;;;;35291:125;;;35334:30;;9124:66:1;9111:2;9107:15;;;9103:88;35334:30:0;;;9091:101:1;9234:66;9222:79;;9208:12;;;9201:101;9318:12;;35334:30:0;;;;;;;;;;;;35324:41;;;;;;35291:125;35284:132;35197:227;-1:-1:-1;;;35197:227:0:o;33385:213::-;33002:11;;33441:6;;33449:4;;33025;;33002:20;;33441:6;;33002:11;;;;;:20;:::i;:::-;:27;32994:67;;;;-1:-1:-1;;;32994:67:0;;23481:2:1;32994:67:0;;;23463:21:1;23520:2;23500:18;;;23493:30;23559:29;23539:18;;;23532:57;23606:18;;32994:67:0;23279:351:1;32994:67:0;33093:14;33102:5;33093:6;:14;:::i;:::-;33080:9;:27;33072:66;;;;-1:-1:-1;;;33072:66:0;;17618:2:1;33072:66:0;;;17600:21:1;17657:2;17637:18;;;17630:30;17696:28;17676:18;;;17669:56;17742:18;;33072:66:0;17416:350:1;33072:66:0;33474:15:::1;::::0;::::1;::::0;::::1;;;33466:51;;;::::0;-1:-1:-1;;;33466:51:0;;16916:2:1;33466:51:0::1;::::0;::::1;16898:21:1::0;16955:2;16935:18;;;16928:30;16994:25;16974:18;;;16967:53;17037:18;;33466:51:0::1;16714:347:1::0;33466:51:0::1;33545:2;33536:6;:11;:26;;;;-1:-1:-1::0;33551:11:0;;::::1;33536:26;33528:62;;;::::0;-1:-1:-1;;;33528:62:0;;23837:2:1;33528:62:0::1;::::0;::::1;23819:21:1::0;23876:2;23856:18;;;23849:30;23915:25;23895:18;;;23888:53;23958:18;;33528:62:0::1;23635:347:1::0;33528:62:0::1;33165:25:::0;33171:6;33179:10;33165:5;:25::i;24251:147::-;24340:50;24359:10;24371:8;24381;24340:18;:50::i;32745:187::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;32842:11:::1;::::0;32856:4:::1;::::0;32833:20:::1;::::0;32842:11;;::::1;;;32833:6:::0;:20:::1;:::i;:::-;:27;32825:71;;;::::0;-1:-1:-1;;;32825:71:0;;22301:2:1;32825:71:0::1;::::0;::::1;22283:21:1::0;22340:2;22320:18;;;22313:30;22379:33;22359:18;;;22352:61;22430:18;;32825:71:0::1;22099:355:1::0;32825:71:0::1;32907:17;32913:6;32921:2;32907:5;:17::i;34190:307::-:0;33260:13;;34281:6;;33260:13;;33252:49;;;;-1:-1:-1;;;33252:49:0;;16916:2:1;33252:49:0;;;16898:21:1;16955:2;16935:18;;;16928:30;16994:25;16974:18;;;16967:53;17037:18;;33252:49:0;16714:347:1;33252:49:0;33002:11:::1;::::0;34298:6;;34306:4:::1;::::0;33025::::1;::::0;33002:20:::1;::::0;34298:6;;33002:11;;::::1;;;:20;:::i;:::-;:27;32994:67;;;::::0;-1:-1:-1;;;32994:67:0;;23481:2:1;32994:67:0::1;::::0;::::1;23463:21:1::0;23520:2;23500:18;;;23493:30;23559:29;23539:18;;;23532:57;23606:18;;32994:67:0::1;23279:351:1::0;32994:67:0::1;33093:14;33102:5:::0;33093:6;:14:::1;:::i;:::-;33080:9;:27;33072:66;;;::::0;-1:-1:-1;;;33072:66:0;;17618:2:1;33072:66:0::1;::::0;::::1;17600:21:1::0;17657:2;17637:18;;;17630:30;17696:28;17676:18;;;17669:56;17742:18;;33072:66:0::1;17416:350:1::0;33072:66:0::1;34331:21:::2;34348:3;;34331:16;:21::i;:::-;34323:59;;;::::0;-1:-1:-1;;;34323:59:0;;21170:2:1;34323:59:0::2;::::0;::::2;21152:21:1::0;21209:2;21189:18;;;21182:30;21248:27;21228:18;;;21221:55;21293:18;;34323:59:0::2;20968:349:1::0;34323:59:0::2;34423:10;34410:24;::::0;;;:12:::2;:24;::::0;;;;;34437:1:::2;::::0;34401:33:::2;::::0;34410:24:::2;;34401:6:::0;:33:::2;:::i;:::-;:37;:52;;;;-1:-1:-1::0;34442:11:0;;::::2;34401:52;34393:96;;;::::0;-1:-1:-1;;;34393:96:0;;18743:2:1;34393:96:0::2;::::0;::::2;18725:21:1::0;18782:2;18762:18;;;18755:30;18821:33;18801:18;;;18794:61;18872:18;;34393:96:0::2;18541:355:1::0;34393:96:0::2;33165:25:::1;33171:6;33179:10;33165:5;:25::i;:::-;-1:-1:-1::0;;33341:10:0;33328:24;;;;:12;:24;;;;;:41;;33362:6;;33328:24;:41;;33362:6;;33328:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34190:307;;;;:::o;34913:276::-;35000:4;35024:17;;;:157;;35150:24;;8829:66:1;8816:2;8812:15;;;8808:88;35150:24:0;;;8796:101:1;35130:51:0;;8913:12:1;;35150:24:0;;;;;;;;;;;;;35140:35;;;;;;35177:3;35130:9;:51::i;:::-;35024:157;;;35077:30;;9124:66:1;9111:2;9107:15;;;9103:88;35077:30:0;;;9091:101:1;9234:66;9222:79;;9208:12;;;9201:101;35057:57:0;;9318:12:1;;35077:30:0;8936:400:1;35057:57:0;35017:164;34913:276;-1:-1:-1;;;;34913:276:0:o;25708:318::-;25875:39;25894:10;25906:7;25875:18;:39::i;:::-;25867:101;;;;-1:-1:-1;;;25867:101:0;;23063:2:1;25867:101:0;;;23045:21:1;23102:2;23082:18;;;23075:30;23141:34;23121:18;;;23114:62;23212:19;23192:18;;;23185:47;23249:19;;25867:101:0;22861:413:1;25867:101:0;25979:39;25993:4;25999:2;26003:7;26012:5;25979:13;:39::i;24877:112::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;24954:20:::1;:27:::0;;;::::1;-1:-1:-1::0;;;;;24954:27:0;;;::::1;::::0;;;::::1;::::0;;24877:112::o;33606:298::-;33260:13;;33694:6;;33260:13;;33252:49;;;;-1:-1:-1;;;33252:49:0;;16916:2:1;33252:49:0;;;16898:21:1;16955:2;16935:18;;;16928:30;16994:25;16974:18;;;16967:53;17037:18;;33252:49:0;16714:347:1;33252:49:0;33002:11:::1;::::0;33711:6;;33719:4:::1;::::0;33025::::1;::::0;33002:20:::1;::::0;33711:6;;33002:11;;::::1;;;:20;:::i;:::-;:27;32994:67;;;::::0;-1:-1:-1;;;32994:67:0;;23481:2:1;32994:67:0::1;::::0;::::1;23463:21:1::0;23520:2;23500:18;;;23493:30;23559:29;23539:18;;;23532:57;23606:18;;32994:67:0::1;23279:351:1::0;32994:67:0::1;33093:14;33102:5:::0;33093:6;:14:::1;:::i;:::-;33080:9;:27;33072:66;;;::::0;-1:-1:-1;;;33072:66:0;;17618:2:1;33072:66:0::1;::::0;::::1;17600:21:1::0;17657:2;17637:18;;;17630:30;17696:28;17676:18;;;17669:56;17742:18;;33072:66:0::1;17416:350:1::0;33072:66:0::1;33745:18:::2;33759:3;;33745:13;:18::i;:::-;33737:52;;;::::0;-1:-1:-1;;;33737:52:0;;17268:2:1;33737:52:0::2;::::0;::::2;17250:21:1::0;17307:2;17287:18;;;17280:30;17346:23;17326:18;;;17319:51;17387:18;;33737:52:0::2;17066:345:1::0;33737:52:0::2;33830:10;33817:24;::::0;;;:12:::2;:24;::::0;;;;;33844:1:::2;::::0;33808:33:::2;::::0;33817:24:::2;;33808:6:::0;:33:::2;:::i;:::-;:37;:52;;;;-1:-1:-1::0;33849:11:0;33800:96:::2;;;::::0;-1:-1:-1;;;33800:96:0;;18743:2:1;33800:96:0::2;::::0;::::2;18725:21:1::0;18782:2;18762:18;;;18755:30;18821:33;18801:18;;;18794:61;18872:18;;33800:96:0::2;18541:355:1::0;23086:259:0;27532:4;27556:16;;;:7;:16;;;;;;23153:13;;-1:-1:-1;;;;;27556:16:0;23179:76;;;;-1:-1:-1;;;23179:76:0;;21885:2:1;23179:76:0;;;21867:21:1;21924:2;21904:18;;;21897:30;21963:34;21943:18;;;21936:62;22034:17;22014:18;;;22007:45;22069:19;;23179:76:0;21683:411:1;23179:76:0;23299:7;23308:18;:7;:16;:18::i;:::-;23282:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23268:69;;23086:259;;;:::o;37828:132::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;37886:13:::1;:21:::0;;::::1;::::0;;::::1;37937:15:::0;;::::1;37886:21;37937:15;37936:16;37918:34;::::0;;;;::::1;::::0;;37828:132::o;24469:400::-;24682:20;;24726:28;;;;;-1:-1:-1;;;;;11927:55:1;;;24726:28:0;;;11909:74:1;24558:4:0;;24682:20;;;24718:49;;;;24682:20;;24726:21;;11882:18:1;;24726:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24718:49:0;;24714:93;;;24791:4;24784:11;;;;;24714:93;-1:-1:-1;;;;;;;24826:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24469:400::o;1922:194::-;1253:10;1242:7;1068;1095:6;-1:-1:-1;;;;;1095:6:0;;1022:87;1242:7;-1:-1:-1;;;;;1242:21:0;;1234:66;;;;-1:-1:-1;;;1234:66:0;;21524:2:1;1234:66:0;;;21506:21:1;;;21543:18;;;21536:30;21602:34;21582:18;;;21575:62;21654:18;;1234:66:0;21322:356:1;1234:66:0;-1:-1:-1;;;;;2013:22:0;::::1;2005:73;;;::::0;-1:-1:-1;;;2005:73:0;;15344:2:1;2005:73:0::1;::::0;::::1;15326:21:1::0;15383:2;15363:18;;;15356:30;15422:34;15402:18;;;15395:62;15493:8;15473:18;;;15466:36;15519:19;;2005:73:0::1;15142:402:1::0;2005:73:0::1;2089:19;2099:8;2089:9;:19::i;:::-;1922:194:::0;:::o;21707:305::-;21809:4;21846:40;;;21861:25;21846:40;;:105;;-1:-1:-1;21903:48:0;;;21918:33;21903:48;21846:105;:158;;;-1:-1:-1;13981:25:0;13966:40;;;;21968:36;13857:157;30005:174;30080:24;;;;:15;:24;;;;;:29;;;;-1:-1:-1;;;;;30080:29:0;;;;;;;;:24;;30134:23;30080:24;30134:14;:23::i;:::-;-1:-1:-1;;;;;30125:46:0;;;;;;;;;;;30005:174;;:::o;27761:341::-;27854:4;27556:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27556:16:0;27871:73;;;;-1:-1:-1;;;27871:73:0;;17973:2:1;27871:73:0;;;17955:21:1;18012:2;17992:18;;;17985:30;18051:34;18031:18;;;18024:62;18122:14;18102:18;;;18095:42;18154:19;;27871:73:0;17771:408:1;27871:73:0;27955:13;27971:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27971:16:0;;;;28006;;;;;:51;;;28050:7;-1:-1:-1;;;;;28026:31:0;:20;28038:7;28026:11;:20::i;:::-;-1:-1:-1;;;;;28026:31:0;;28006:51;:87;;;;28061:32;28078:5;28085:7;28061:16;:32::i;29368:519::-;29500:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;29500:24:0;;;:16;;:24;29492:74;;;;-1:-1:-1;;;29492:74:0;;15751:2:1;29492:74:0;;;15733:21:1;15790:2;15770:18;;;15763:30;15829:34;15809:18;;;15802:62;15900:7;15880:18;;;15873:35;15925:19;;29492:74:0;15549:401:1;29492:74:0;-1:-1:-1;;;;;29585:16:0;;29577:65;;;;-1:-1:-1;;;29577:65:0;;16157:2:1;29577:65:0;;;16139:21:1;16196:2;16176:18;;;16169:30;16235:34;16215:18;;;16208:62;16306:6;16286:18;;;16279:34;16330:19;;29577:65:0;15955:400:1;29577:65:0;29707:29;29724:1;29728:7;29707:8;:29::i;:::-;-1:-1:-1;;;;;29749:15:0;;;;;;:9;:15;;;;;:17;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;29777:13:0;;;;;;:9;:13;;;;;:15;;;;;;:::i;:::-;;;;-1:-1:-1;;29813:16:0;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;29813:21:0;;;;;;;;;29852:27;;29813:16;;29852:27;;;;;;;29368:519;;;:::o;2124:173::-;2180:16;2199:6;;-1:-1:-1;;;;;2216:17:0;;;;;;;;;;2249:40;;2199:6;;;;;;;2249:40;;2180:16;2249:40;2169:128;2124:173;:::o;28438:593::-;28501:12;28516:11;;-1:-1:-1;;;;;28540:13:0;;;;:9;:13;;;;;:23;;28516:11;;;;;;;28557:6;;28540:23;;28557:6;;28540:23;:::i;:::-;;;;-1:-1:-1;28589:6:0;;-1:-1:-1;28584:157:0;28601:6;28597:1;:10;28584:157;;;28629:9;;;;:::i;:::-;28655:16;;;;:7;:16;;;;;;:21;;;;-1:-1:-1;;;;;28655:21:0;;;;;;;;28696:33;;28655:16;;-1:-1:-1;28655:16:0;;-1:-1:-1;28655:21:0;28696:33;;28655:16;;28696:33;28609:3;;;;:::i;:::-;;;;28584:157;;;;28783:6;28761:11;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28825:51;28856:1;28860:2;28864:7;28825:51;;;;;;;;;;;;:22;:51::i;:::-;28803:151;;;;-1:-1:-1;;;28803:151:0;;14925:2:1;28803:151:0;;;14907:21:1;14964:2;14944:18;;;14937:30;15003:34;14983:18;;;14976:62;15074:20;15054:18;;;15047:48;15112:19;;28803:151:0;14723:414:1;30321:315:0;30476:8;-1:-1:-1;;;;;30467:17:0;:5;-1:-1:-1;;;;;30467:17:0;;;30459:55;;;;-1:-1:-1;;;30459:55:0;;16562:2:1;30459:55:0;;;16544:21:1;16601:2;16581:18;;;16574:30;16640:27;16620:18;;;16613:55;16685:18;;30459:55:0;16360:349:1;30459:55:0;-1:-1:-1;;;;;30525:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;30587:41;;13589::1;;;30587::0;;13562:18:1;30587:41:0;;;;;;;30321:315;;;:::o;34505:186::-;34630:35;;9604:66:1;34647:10:0;9591:2:1;9587:15;9583:88;34630:35:0;;;9571:101:1;9702:5;9688:12;;;9681:27;34572:4:0;;34610:62;;9724:12:1;;34630:35:0;;;;;;;;;;;;;34620:46;;;;;;34668:3;;34610:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34610:9:0;;-1:-1:-1;;;34610:62:0:i;34699:206::-;34771:4;1095:6;;-1:-1:-1;;;;;1095:6:0;34795:91;34823:34;34852:4;9680:58;;11410:66:1;9680:58:0;;;11398:79:1;11493:12;;;11486:28;;;9547:7:0;;11530:12:1;;9680:58:0;;;;;;;;;;;;9670:69;;;;;;9663:76;;9478:269;;;;34823:34;34872:3;34795:13;:91::i;:::-;-1:-1:-1;;;;;34795:102:0;;;34699:206;-1:-1:-1;;;34699:206:0:o;26908:315::-;27065:28;27075:4;27081:2;27085:7;27065:9;:28::i;:::-;27112:48;27135:4;27141:2;27145:7;27154:5;27112:22;:48::i;:::-;27104:111;;;;-1:-1:-1;;;27104:111:0;;14925:2:1;27104:111:0;;;14907:21:1;14964:2;14944:18;;;14937:30;15003:34;14983:18;;;14976:62;15074:20;15054:18;;;15047:48;15112:19;;27104:111:0;14723:414:1;33912:270:0;34034:28;;8829:66:1;34051:10:0;8816:2:1;8812:15;8808:88;34034:28:0;;;8796:101:1;33976:4:0;;34014:55;;8913:12:1;;34034:28:0;8667:264:1;34014:55:0;:149;;;-1:-1:-1;34086:73:0;;;;;34148:10;34086:73;;;11909:74:1;34162:1:0;;34094:42;;34086:61;;11882:18:1;;34086:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:77;;33912:270;-1:-1:-1;;;33912:270:0:o;2502:723::-;2558:13;2779:10;2775:53;;-1:-1:-1;;2806:10:0;;;;;;;;;;;;;;;;;;2502:723::o;2775:53::-;2853:5;2838:12;2894:78;2901:9;;2894:78;;2927:8;;;;:::i;:::-;;-1:-1:-1;2950:10:0;;-1:-1:-1;2958:2:0;2950:10;;:::i;:::-;;;2894:78;;;2982:19;3014:6;3004:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3004:17:0;;2982:39;;3032:154;3039:10;;3032:154;;3066:11;3076:1;3066:11;;:::i;:::-;;-1:-1:-1;3135:10:0;3143:2;3135:5;:10;:::i;:::-;3122:24;;:2;:24;:::i;:::-;3109:39;;3092:6;3099;3092:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;3163:11:0;3172:2;3163:11;;:::i;:::-;;;3032:154;;31201:797;31356:4;-1:-1:-1;;;;;31377:13:0;;10833:20;10881:8;31373:618;;31413:70;;;;;-1:-1:-1;;;;;31413:36:0;;;;;:70;;31450:10;;31462:4;;31468:7;;31477:5;;31413:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31413:70:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31409:527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31653:13:0;;31649:272;;31696:60;;-1:-1:-1;;;31696:60:0;;14925:2:1;31696:60:0;;;14907:21:1;14964:2;14944:18;;;14937:30;15003:34;14983:18;;;14976:62;15074:20;15054:18;;;15047:48;15112:19;;31696:60:0;14723:414:1;31649:272:0;31871:6;31865:13;31856:6;31852:2;31848:15;31841:38;31409:527;31534:51;;31544:41;31534:51;;-1:-1:-1;31527:58:0;;31373:618;-1:-1:-1;31975:4:0;31201:797;;;;;;:::o;6673:182::-;6751:7;6772:17;6793:27;6804:4;6810:9;4695:7;4915:9;:16;4935:2;4915:22;4911:953;;;5211:4;5196:20;;5190:27;5261:4;5246:20;;5240:27;5319:4;5304:20;;5298:27;4954:9;5290:36;5362:25;5373:4;5290:36;5190:27;5240;5362:10;:25::i;:::-;5355:32;;;;;;;4911:953;5409:9;:16;5429:2;5409:22;5405:459;;;5684:4;5669:20;;5663:27;5735:4;5720:20;;5714:27;5777:23;5788:4;5663:27;5714;5777:10;:23::i;:::-;5770:30;;;;;;5405:459;-1:-1:-1;5849:1:0;5833:19;;7677:1501;7808:7;8728:66;8715:79;;8711:131;;;-1:-1:-1;8827:1:0;8811:19;;8711:131;8856:1;:7;;8861:2;8856:7;;:18;;;;;8867:1;:7;;8872:2;8867:7;;8856:18;8852:70;;;-1:-1:-1;8907:1:0;8891:19;;8852:70;9036:24;;;9019:14;9036:24;;;;;;;;;14323:25:1;;;14396:4;14384:17;;14364:18;;;14357:45;;;;14418:18;;;14411:34;;;14461:18;;;14454:34;;;9036:24:0;;14295:19:1;;9036:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;9036:24:0;;;;;;-1:-1:-1;;;;;;;9075:20:0;;9071:72;;9128:1;9112:19;;;;;9071:72;9163:6;7677:1501;-1:-1:-1;;;;;7677:1501:0:o;7118:377::-;7232:7;7327:66;7319:75;;7421:3;7417:12;;;7431:2;7413:21;7462:25;7473:4;7413:21;7482:1;7319:75;7462:10;:25::i;:::-;7455:32;7118:377;-1:-1:-1;;;;;;7118:377:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:690:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;289:2;283:9;355:2;343:15;;194:66;339:24;;;365:2;335:33;331:42;319:55;;;389:18;;;409:22;;;386:46;383:72;;;435:18;;:::i;:::-;475:10;471:2;464:22;504:6;495:15;;534:6;526;519:22;574:3;565:6;560:3;556:16;553:25;550:45;;;591:1;588;581:12;550:45;641:6;636:3;629:4;621:6;617:17;604:44;696:1;689:4;680:6;672;668:19;664:30;657:41;;;;14:690;;;;;:::o;709:219::-;776:20;;836:66;825:78;;815:89;;805:117;;918:1;915;908:12;805:117;709:219;;;:::o;933:347::-;984:8;994:6;1048:3;1041:4;1033:6;1029:17;1025:27;1015:55;;1066:1;1063;1056:12;1015:55;-1:-1:-1;1089:20:1;;1132:18;1121:30;;1118:50;;;1164:1;1161;1154:12;1118:50;1201:4;1193:6;1189:17;1177:29;;1253:3;1246:4;1237:6;1229;1225:19;1221:30;1218:39;1215:59;;;1270:1;1267;1260:12;1285:220;1327:5;1380:3;1373:4;1365:6;1361:17;1357:27;1347:55;;1398:1;1395;1388:12;1347:55;1420:79;1495:3;1486:6;1473:20;1466:4;1458:6;1454:17;1420:79;:::i;1510:247::-;1569:6;1622:2;1610:9;1601:7;1597:23;1593:32;1590:52;;;1638:1;1635;1628:12;1590:52;1677:9;1664:23;1696:31;1721:5;1696:31;:::i;1762:388::-;1830:6;1838;1891:2;1879:9;1870:7;1866:23;1862:32;1859:52;;;1907:1;1904;1897:12;1859:52;1946:9;1933:23;1965:31;1990:5;1965:31;:::i;:::-;2015:5;-1:-1:-1;2072:2:1;2057:18;;2044:32;2085:33;2044:32;2085:33;:::i;:::-;2137:7;2127:17;;;1762:388;;;;;:::o;2155:456::-;2232:6;2240;2248;2301:2;2289:9;2280:7;2276:23;2272:32;2269:52;;;2317:1;2314;2307:12;2269:52;2356:9;2343:23;2375:31;2400:5;2375:31;:::i;:::-;2425:5;-1:-1:-1;2482:2:1;2467:18;;2454:32;2495:33;2454:32;2495:33;:::i;:::-;2155:456;;2547:7;;-1:-1:-1;;;2601:2:1;2586:18;;;;2573:32;;2155:456::o;2616:665::-;2711:6;2719;2727;2735;2788:3;2776:9;2767:7;2763:23;2759:33;2756:53;;;2805:1;2802;2795:12;2756:53;2844:9;2831:23;2863:31;2888:5;2863:31;:::i;:::-;2913:5;-1:-1:-1;2970:2:1;2955:18;;2942:32;2983:33;2942:32;2983:33;:::i;:::-;3035:7;-1:-1:-1;3089:2:1;3074:18;;3061:32;;-1:-1:-1;3144:2:1;3129:18;;3116:32;3171:18;3160:30;;3157:50;;;3203:1;3200;3193:12;3157:50;3226:49;3267:7;3258:6;3247:9;3243:22;3226:49;:::i;:::-;3216:59;;;2616:665;;;;;;;:::o;3286:416::-;3351:6;3359;3412:2;3400:9;3391:7;3387:23;3383:32;3380:52;;;3428:1;3425;3418:12;3380:52;3467:9;3454:23;3486:31;3511:5;3486:31;:::i;:::-;3536:5;-1:-1:-1;3593:2:1;3578:18;;3565:32;3635:15;;3628:23;3616:36;;3606:64;;3666:1;3663;3656:12;3707:319;3774:6;3782;3835:2;3823:9;3814:7;3810:23;3806:32;3803:52;;;3851:1;3848;3841:12;3803:52;3890:9;3877:23;3909:31;3934:5;3909:31;:::i;:::-;3959:5;-1:-1:-1;3983:37:1;4016:2;4001:18;;3983:37;:::i;:::-;3973:47;;3707:319;;;;;:::o;4031:527::-;4116:6;4124;4132;4185:2;4173:9;4164:7;4160:23;4156:32;4153:52;;;4201:1;4198;4191:12;4153:52;4240:9;4227:23;4259:31;4284:5;4259:31;:::i;:::-;4309:5;-1:-1:-1;4333:37:1;4366:2;4351:18;;4333:37;:::i;:::-;4323:47;;4421:2;4410:9;4406:18;4393:32;4448:18;4440:6;4437:30;4434:50;;;4480:1;4477;4470:12;4434:50;4503:49;4544:7;4535:6;4524:9;4520:22;4503:49;:::i;:::-;4493:59;;;4031:527;;;;;:::o;4563:315::-;4631:6;4639;4692:2;4680:9;4671:7;4667:23;4663:32;4660:52;;;4708:1;4705;4698:12;4660:52;4747:9;4734:23;4766:31;4791:5;4766:31;:::i;:::-;4816:5;4868:2;4853:18;;;;4840:32;;-1:-1:-1;;;4563:315:1:o;4883:245::-;4941:6;4994:2;4982:9;4973:7;4969:23;4965:32;4962:52;;;5010:1;5007;5000:12;4962:52;5049:9;5036:23;5068:30;5092:5;5068:30;:::i;5133:249::-;5202:6;5255:2;5243:9;5234:7;5230:23;5226:32;5223:52;;;5271:1;5268;5261:12;5223:52;5303:9;5297:16;5322:30;5346:5;5322:30;:::i;5387:477::-;5466:6;5474;5482;5535:2;5523:9;5514:7;5510:23;5506:32;5503:52;;;5551:1;5548;5541:12;5503:52;5591:9;5578:23;5624:18;5616:6;5613:30;5610:50;;;5656:1;5653;5646:12;5610:50;5695:58;5745:7;5736:6;5725:9;5721:22;5695:58;:::i;:::-;5772:8;;5669:84;;-1:-1:-1;5854:2:1;5839:18;;;;5826:32;;5387:477;-1:-1:-1;;;;5387:477:1:o;5869:280::-;5968:6;6021:2;6009:9;6000:7;5996:23;5992:32;5989:52;;;6037:1;6034;6027:12;5989:52;6069:9;6063:16;6088:31;6113:5;6088:31;:::i;6154:450::-;6223:6;6276:2;6264:9;6255:7;6251:23;6247:32;6244:52;;;6292:1;6289;6282:12;6244:52;6332:9;6319:23;6365:18;6357:6;6354:30;6351:50;;;6397:1;6394;6387:12;6351:50;6420:22;;6473:4;6465:13;;6461:27;-1:-1:-1;6451:55:1;;6502:1;6499;6492:12;6451:55;6525:73;6590:7;6585:2;6572:16;6567:2;6563;6559:11;6525:73;:::i;6609:180::-;6668:6;6721:2;6709:9;6700:7;6696:23;6692:32;6689:52;;;6737:1;6734;6727:12;6689:52;-1:-1:-1;6760:23:1;;6609:180;-1:-1:-1;6609:180:1:o;6794:184::-;6864:6;6917:2;6905:9;6896:7;6892:23;6888:32;6885:52;;;6933:1;6930;6923:12;6885:52;-1:-1:-1;6956:16:1;;6794:184;-1:-1:-1;6794:184:1:o;6983:315::-;7051:6;7059;7112:2;7100:9;7091:7;7087:23;7083:32;7080:52;;;7128:1;7125;7118:12;7080:52;7164:9;7151:23;7141:33;;7224:2;7213:9;7209:18;7196:32;7237:31;7262:5;7237:31;:::i;7303:477::-;7382:6;7390;7398;7451:2;7439:9;7430:7;7426:23;7422:32;7419:52;;;7467:1;7464;7457:12;7419:52;7503:9;7490:23;7480:33;;7564:2;7553:9;7549:18;7536:32;7591:18;7583:6;7580:30;7577:50;;;7623:1;7620;7613:12;7577:50;7662:58;7712:7;7703:6;7692:9;7688:22;7662:58;:::i;:::-;7303:477;;7739:8;;-1:-1:-1;7636:84:1;;-1:-1:-1;;;;7303:477:1:o;7785:248::-;7853:6;7861;7914:2;7902:9;7893:7;7889:23;7885:32;7882:52;;;7930:1;7927;7920:12;7882:52;-1:-1:-1;;7953:23:1;;;8023:2;8008:18;;;7995:32;;-1:-1:-1;7785:248:1:o;8038:316::-;8079:3;8117:5;8111:12;8144:6;8139:3;8132:19;8160:63;8216:6;8209:4;8204:3;8200:14;8193:4;8186:5;8182:16;8160:63;:::i;:::-;8268:2;8256:15;8273:66;8252:88;8243:98;;;;8343:4;8239:109;;8038:316;-1:-1:-1;;8038:316:1:o;8359:185::-;8401:3;8439:5;8433:12;8454:52;8499:6;8494:3;8487:4;8480:5;8476:16;8454:52;:::i;:::-;8522:16;;;;;8359:185;-1:-1:-1;;8359:185:1:o;9747:1416::-;10024:3;10053:1;10086:6;10080:13;10116:3;10138:1;10166:9;10162:2;10158:18;10148:28;;10226:2;10215:9;10211:18;10248;10238:61;;10292:4;10284:6;10280:17;10270:27;;10238:61;10318:2;10366;10358:6;10355:14;10335:18;10332:38;10329:222;;;10405:77;10400:3;10393:90;10506:4;10503:1;10496:15;10536:4;10531:3;10524:17;10329:222;10567:18;10594:162;;;;10770:1;10765:320;;;;10560:525;;10594:162;10642:66;10631:9;10627:82;10622:3;10615:95;10739:6;10734:3;10730:16;10723:23;;10594:162;;10765:320;24435:1;24428:14;;;24472:4;24459:18;;10860:1;10874:165;10888:6;10885:1;10882:13;10874:165;;;10966:14;;10953:11;;;10946:35;11009:16;;;;10903:10;;10874:165;;;10878:3;;11068:6;11063:3;11059:16;11052:23;;10560:525;;;;;;;11101:56;11126:30;11152:3;11144:6;11126:30;:::i;:::-;8621:7;8609:20;;8654:1;8645:11;;8549:113;11994:511;12188:4;-1:-1:-1;;;;;12298:2:1;12290:6;12286:15;12275:9;12268:34;12350:2;12342:6;12338:15;12333:2;12322:9;12318:18;12311:43;;12390:6;12385:2;12374:9;12370:18;12363:34;12433:3;12428:2;12417:9;12413:18;12406:31;12454:45;12494:3;12483:9;12479:19;12471:6;12454:45;:::i;12812:632::-;12983:2;13035:21;;;13105:13;;13008:18;;;13127:22;;;12954:4;;12983:2;13206:15;;;;13180:2;13165:18;;;12954:4;13249:169;13263:6;13260:1;13257:13;13249:169;;;13324:13;;13312:26;;13393:15;;;;13358:12;;;;13285:1;13278:9;13249:169;;;-1:-1:-1;13435:3:1;;12812:632;-1:-1:-1;;;;;;12812:632:1:o;14499:219::-;14648:2;14637:9;14630:21;14611:4;14668:44;14708:2;14697:9;14693:18;14685:6;14668:44;:::i;24488:224::-;24527:3;24555:6;24588:2;24585:1;24581:10;24618:2;24615:1;24611:10;24649:3;24645:2;24641:12;24636:3;24633:21;24630:47;;;24657:18;;:::i;:::-;24693:13;;24488:224;-1:-1:-1;;;;24488:224:1:o;24717:128::-;24757:3;24788:1;24784:6;24781:1;24778:13;24775:39;;;24794:18;;:::i;:::-;-1:-1:-1;24830:9:1;;24717:128::o;24850:204::-;24888:3;24924:4;24921:1;24917:12;24956:4;24953:1;24949:12;24991:3;24985:4;24981:14;24976:3;24973:23;24970:49;;;24999:18;;:::i;:::-;25035:13;;24850:204;-1:-1:-1;;;24850:204:1:o;25059:120::-;25099:1;25125;25115:35;;25130:18;;:::i;:::-;-1:-1:-1;25164:9:1;;25059:120::o;25184:228::-;25224:7;25350:1;25282:66;25278:74;25275:1;25272:81;25267:1;25260:9;25253:17;25249:105;25246:131;;;25357:18;;:::i;:::-;-1:-1:-1;25397:9:1;;25184:228::o;25417:125::-;25457:4;25485:1;25482;25479:8;25476:34;;;25490:18;;:::i;:::-;-1:-1:-1;25527:9:1;;25417:125::o;25547:258::-;25619:1;25629:113;25643:6;25640:1;25637:13;25629:113;;;25719:11;;;25713:18;25700:11;;;25693:39;25665:2;25658:10;25629:113;;;25760:6;25757:1;25754:13;25751:48;;;-1:-1:-1;;25795:1:1;25777:16;;25770:27;25547:258::o;25810:196::-;25849:3;25877:5;25867:39;;25886:18;;:::i;:::-;-1:-1:-1;25933:66:1;25922:78;;25810:196::o;26011:437::-;26090:1;26086:12;;;;26133;;;26154:61;;26208:4;26200:6;26196:17;26186:27;;26154:61;26261:2;26253:6;26250:14;26230:18;26227:38;26224:218;;;26298:77;26295:1;26288:88;26399:4;26396:1;26389:15;26427:4;26424:1;26417:15;26224:218;;26011:437;;;:::o;26453:195::-;26492:3;26523:66;26516:5;26513:77;26510:103;;;26593:18;;:::i;:::-;-1:-1:-1;26640:1:1;26629:13;;26453:195::o;26653:112::-;26685:1;26711;26701:35;;26716:18;;:::i;:::-;-1:-1:-1;26750:9:1;;26653:112::o;26770:184::-;26822:77;26819:1;26812:88;26919:4;26916:1;26909:15;26943:4;26940:1;26933:15;26959:184;27011:77;27008:1;27001:88;27108:4;27105:1;27098:15;27132:4;27129:1;27122:15;27148:184;27200:77;27197:1;27190:88;27297:4;27294:1;27287:15;27321:4;27318:1;27311:15;27337:184;27389:77;27386:1;27379:88;27486:4;27483:1;27476:15;27510:4;27507:1;27500:15;27526:154;-1:-1:-1;;;;;27605:5:1;27601:54;27594:5;27591:65;27581:93;;27670:1;27667;27660:12;27685:177;27770:66;27763:5;27759:78;27752:5;27749:89;27739:117;;27852:1;27849;27842:12

Swarm Source

ipfs://e34d057b7d108661a59c6b8ceefdeacc5b7219c6aee71dc57df8bb1a0238d609
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.