ETH Price: $3,397.19 (+0.93%)

Token

GM frens (GM)
 

Overview

Max Total Supply

6,900 GM

Holders

1,433

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 GM
0xff13cbc9f9b94f3c47c1008a52585287985c3d8f
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:
GMfrens

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-16
*/

// Sources flattened with hardhat v2.9.3 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @openzeppelin/contracts/interfaces/[email protected]

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;


// File @openzeppelin/contracts/interfaces/[email protected]

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @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/utils/IERC721A.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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/utils/ERC721A.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length != 0
                ? string(abi.encodePacked(baseURI, _toString(tokenId)))
                : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

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

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

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

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

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

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

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

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

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

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

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

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

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

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

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

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

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

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try
            ERC721A__IERC721Receiver(to).onERC721Received(
                _msgSenderERC721A(),
                from,
                tokenId,
                _data
            )
        returns (bytes4 retval) {
            return
                retval ==
                ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @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
        unchecked {
            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;
                buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
                value /= 10;
            }
            return string(buffer);
        }
    }
}


// File contracts/custom/GMfrens.sol


pragma solidity ^0.8.4;






contract GMfrens is IERC2981, ERC721A, Ownable {
    using Address for address;
    using Strings for uint256;

    uint256 public cost;
    uint32 public maxPerMint;
    uint32 public maxPerWallet;
    bool public open;
    bool public revealed;
    bool public presaleOpen;
    bool public referralOpen;
    uint256 public referralCap;
    address public reqToken;
    uint256 internal maxSupply;
    string internal baseUri;
    address internal recipient;
    uint256 internal recipientFee;
    string internal uriNotRevealed;
    bytes32 private merkleRoot;
    mapping(address => uint256) private referralMap;
    address private constant _Dev = 0x460Fd5059E7301680fA53E63bbBF7272E643e89C;
    mapping(address => uint256) private _shares;
    address[] private _payees;

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _maxSupply
    ) public ERC721A(_name, _symbol) {
        maxSupply = _maxSupply;
        revealed = false;

        _shares[_Dev] = 49;
        _shares[owner()] = 951;
        _payees.push(_Dev);
        _payees.push(owner());
    }

    // ------ Dev Only ------

    function setCommission(uint256 _val1) public {
        require(msg.sender == _Dev, "Invalid address");
        uint256 diff = _shares[_Dev] - _val1;
        _shares[_Dev] = _val1;
        _shares[_payees[1]] += diff;
    }

    // ------ Owner Only ------

    function updateSale(
        bool _open,
        uint256 _cost,
        uint32 _maxW,
        uint32 _maxM
    ) public onlyOwner {
        open = _open;
        cost = _cost;
        maxPerWallet = _maxW;
        maxPerMint = _maxM;
    }

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

    function updateReqToken(address _address) public onlyOwner {
        reqToken = _address;
    }

    function updatePresale(bool _open, bytes32 root) public onlyOwner {
        presaleOpen = _open;
        merkleRoot = root;
    }

    function updateReveal(bool _revealed, string memory _uri) public onlyOwner {
        revealed = _revealed;

        if (_revealed == false) {
            uriNotRevealed = _uri;
        }

        if (_revealed == true) {
            bytes memory b1 = bytes(baseUri);
            if (b1.length == 0) {
                baseUri = _uri;
            }
        }
    }

    function updateWithdrawSplit(
        address[] memory _addresses,
        uint256[] memory _fees
    ) public onlyOwner {
        for (uint256 i = 1; i < _payees.length; i++) {
            delete _shares[_payees[i]];
        }
        _payees = new address[](_addresses.length + 1);
        _payees[0] = _Dev;

        for (uint256 i = 0; i < _addresses.length; i++) {
            _shares[_addresses[i]] = _fees[i];
            _payees[i + 1] = _addresses[i];
        }
    }

    function getWithdrawSplit()
        public
        view
        returns (address[] memory, uint256[] memory)
    {
        uint256[] memory values = new uint256[](_payees.length);

        for (uint256 i = 0; i < _payees.length; i++) {
            values[i] = _shares[_payees[i]];
        }

        return (_payees, values);
    }

    function updateReferral(bool _open, uint256 _val) public onlyOwner {
        referralOpen = _open;
        referralCap = _val;
    }

    function updateRoyalties(address _recipient, uint256 _fee)
        public
        onlyOwner
    {
        recipient = _recipient;
        recipientFee = _fee;
    }

    function withdraw() public payable {
        uint256 balance = address(this).balance;
        require(balance > 0, "Zero balance");

        for (uint256 i = 0; i < _payees.length; i++) {
            uint256 split = _shares[_payees[i]];
            uint256 value = ((split * balance) / 1000);
            Address.sendValue(payable(_payees[i]), value);
        }
    }

    // ------ Mint! ------
    function airdrop(address[] memory _recipients, uint256[] memory _amount)
        public
        onlyOwner
    {
        require(_recipients.length == _amount.length);

        for (uint256 i = 0; i < _amount.length; i++) {
            require(
                supply() + _amount[i] <= totalSupply(),
                "reached max supply"
            );
            _safeMint(_recipients[i], _amount[i]);
        }
    }

    function mint(uint256 count) external payable preMintChecks(count) {
        require(open == true, "Mint not open");
        _safeMint(msg.sender, count);
    }

    function presaleMint(uint32 count, bytes32[] calldata proof)
        external
        payable
        preMintChecks(count)
    {
        require(presaleOpen, "Presale not open");
        require(merkleRoot != "", "Presale not ready");
        require(
            MerkleProof.verify(
                proof,
                merkleRoot,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Not a presale member"
        );

        _safeMint(msg.sender, count);
    }

    function referralMint(uint32 count, address referrer)
        external
        payable
        preMintChecks(count)
    {
        require(referralOpen == true, "Referrals not open");
        require(open == true, "Mint not open");
        require(referralCap > 0, "Cap is set to zero");
        require(_numberMinted(referrer) > 0, "Referrer has not minted");
        require(msg.sender != referrer, "Cannot refer yourself");

        _safeMint(msg.sender, count);

        referralMap[referrer] += 1;
        if (referralMap[referrer] % referralCap == 0) {
            if (supply() < totalSupply()) {
                _safeMint(referrer, 1);
            }
        }
    }

    // ------ Read ------
    function supply() public view returns (uint256) {
        return _currentIndex - 1;
    }

    function totalSupply() public view override returns (uint256) {
        return maxSupply - _burnCounter;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC2981).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (recipient, (_salePrice * recipientFee) / 1000);
    }

    function affiliatesOf(address owner) public view virtual returns (uint256) {
        return referralMap[owner];
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "Does not exist");
        if (revealed == false) {
            return
                string(
                    abi.encodePacked(
                        uriNotRevealed,
                        Strings.toString(_tokenId),
                        ".json"
                    )
                );
        }

        return
            string(
                abi.encodePacked(baseUri, Strings.toString(_tokenId), ".json")
            );
    }

    // ------ Modifiers ------

    modifier preMintChecks(uint256 count) {
        require(count > 0, "Mint at least one.");
        require(count <= maxPerMint, "Max mint reached.");
        require(supply() + count <= totalSupply(), "reached max supply");
        require(
            _numberMinted(msg.sender) + count <= maxPerWallet,
            "can not mint this many"
        );
        require(msg.value >= cost * count, "Not enough fund.");
        if (reqToken != address(0)) {
            ERC721A accessToken = ERC721A(reqToken);
            require(
                accessToken.balanceOf(msg.sender) > 0,
                "Access token not owned"
            );
        }

        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"affiliatesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawSplit","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerMint","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"count","type":"uint32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"count","type":"uint32"},{"internalType":"address","name":"referrer","type":"address"}],"name":"referralMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"referralOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reqToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"_val1","type":"uint256"}],"name":"setCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"updatePresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"uint256","name":"_val","type":"uint256"}],"name":"updateReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"updateReqToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_uri","type":"string"}],"name":"updateReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_open","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint32","name":"_maxW","type":"uint32"},{"internalType":"uint32","name":"_maxM","type":"uint32"}],"name":"updateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_fees","type":"uint256[]"}],"name":"updateWithdrawSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003ae238038062003ae2833981016040819052620000349162000353565b8251839083906200004d906002906020850190620001fa565b50805162000063906003906020840190620001fa565b50506001600055506200007633620001a8565b600d819055600a805460ff60481b1916905573460fd5059e7301680fa53e63bbbf7272e643e89c60009081526014602081905260317f97e14843bcb52e469f69b929a6475681fc82e2504cc873ce324f65b7a071f5b5556103b791620000e46008546001600160a01b031690565b6001600160a01b03168152602081019190915260400160009081209190915560158054600181018255918190527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec47590910180546001600160a01b03191673460fd5059e7301680fa53e63bbbf7272e643e89c1790556200016c6008546001600160a01b031690565b81546001810183556000928352602090922090910180546001600160a01b0319166001600160a01b039092169190911790555062000416915050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200020890620003c3565b90600052602060002090601f0160209004810192826200022c576000855562000277565b82601f106200024757805160ff191683800117855562000277565b8280016001018555821562000277579182015b82811115620002775782518255916020019190600101906200025a565b506200028592915062000289565b5090565b5b808211156200028557600081556001016200028a565b600082601f830112620002b1578081fd5b81516001600160401b0380821115620002ce57620002ce62000400565b604051601f8301601f19908116603f01168101908282118183101715620002f957620002f962000400565b8160405283815260209250868385880101111562000315578485fd5b8491505b8382101562000338578582018301518183018401529082019062000319565b838211156200034957848385830101525b9695505050505050565b60008060006060848603121562000368578283fd5b83516001600160401b03808211156200037f578485fd5b6200038d87838801620002a0565b94506020860151915080821115620003a3578384fd5b50620003b286828701620002a0565b925050604084015190509250925092565b600181811c90821680620003d857607f821691505b60208210811415620003fa57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6136bc80620004266000396000f3fe60806040526004361061028c5760003560e01c80636c2f5acd11610164578063c7d12610116100c6578063e985e9c51161008a578063f5ca4dfd11610064578063f5ca4dfd146107c7578063fcfff16f146107ea578063fe25219a1461080b57600080fd5b8063e985e9c51461074b578063f179dca114610794578063f2fde38b146107a757600080fd5b8063c7d126101461069f578063c87b56dd146106bf578063d6c5b414146106df578063db31882b14610715578063dfdd9b9a1461073557600080fd5b806395d89b4111610128578063b88d4fde11610102578063b88d4fde1461063e578063be8e43ee1461065e578063bee6348a1461067e57600080fd5b806395d89b41146105f6578063a0712d681461060b578063a22cb4651461061e57600080fd5b80636c2f5acd1461056357806370a0823114610583578063715018a6146105a3578063828c12ce146105b85780638da5cb5b146105d857600080fd5b806323b872dd1161020d578063453c2310116101d15780636352211e116101ab5780636352211e1461050257806364bb106114610522578063672434821461054357600080fd5b8063453c23101461048a578063507e094f146104c457806351830227146104e157600080fd5b806323b872dd146103e35780632a55205a14610403578063355e6b43146104425780633ccfd60b1461046257806342842e0e1461046a57600080fd5b8063095ea7b311610254578063095ea7b3146103585780631012c3301461037857806313faede61461039857806318160ddd146103ae5780631d02161d146103c357600080fd5b806301ffc9a7146102915780630364d22a146102c6578063047fc9aa146102db57806306fdde03146102fe578063081812fc14610320575b600080fd5b34801561029d57600080fd5b506102b16102ac3660046131c0565b61082b565b60405190151581526020015b60405180910390f35b6102d96102d4366004613264565b610856565b005b3480156102e757600080fd5b506102f0610c4c565b6040519081526020016102bd565b34801561030a57600080fd5b50610313610c62565b6040516102bd9190613499565b34801561032c57600080fd5b5061034061033b3660046131f8565b610cf4565b6040516001600160a01b0390911681526020016102bd565b34801561036457600080fd5b506102d961037336600461301a565b610d38565b34801561038457600080fd5b506102d9610393366004612eea565b610e0b565b3480156103a457600080fd5b506102f060095481565b3480156103ba57600080fd5b506102f0610e57565b3480156103cf57600080fd5b506102d96103de366004613174565b610e69565b3480156103ef57600080fd5b506102d96103fe366004612f3d565b610ee7565b34801561040f57600080fd5b5061042361041e366004613228565b610ef7565b604080516001600160a01b0390931683526020830191909152016102bd565b34801561044e57600080fd5b506102d961045d3660046131f8565b610f31565b6102d961107f565b34801561047657600080fd5b506102d9610485366004612f3d565b611188565b34801561049657600080fd5b50600a546104af90640100000000900463ffffffff1681565b60405163ffffffff90911681526020016102bd565b3480156104d057600080fd5b50600a546104af9063ffffffff1681565b3480156104ed57600080fd5b50600a546102b190600160481b900460ff1681565b34801561050e57600080fd5b5061034061051d3660046131f8565b6111a3565b34801561052e57600080fd5b50600a546102b190600160581b900460ff1681565b34801561054f57600080fd5b506102d961055e366004613043565b6111b5565b34801561056f57600080fd5b506102d961057e36600461301a565b6112e8565b34801561058f57600080fd5b506102f061059e366004612eea565b611338565b3480156105af57600080fd5b506102d9611387565b3480156105c457600080fd5b506102d96105d336600461311f565b6113bd565b3480156105e457600080fd5b506008546001600160a01b0316610340565b34801561060257600080fd5b506103136114da565b6102d96106193660046131f8565b6114e9565b34801561062a57600080fd5b506102d9610639366004612ff1565b6117c6565b34801561064a57600080fd5b506102d9610659366004612f78565b61185c565b34801561066a57600080fd5b506102d9610679366004613043565b6118a0565b34801561068a57600080fd5b50600a546102b190600160501b900460ff1681565b3480156106ab57600080fd5b50600c54610340906001600160a01b031681565b3480156106cb57600080fd5b506103136106da3660046131f8565b611b18565b3480156106eb57600080fd5b506102f06106fa366004612eea565b6001600160a01b031660009081526013602052604090205490565b34801561072157600080fd5b506102d9610730366004613104565b611bae565b34801561074157600080fd5b506102f0600b5481565b34801561075757600080fd5b506102b1610766366004612f0b565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102d96107a2366004613249565b611c01565b3480156107b357600080fd5b506102d96107c2366004612eea565b6120ae565b3480156107d357600080fd5b506107dc612149565b6040516102bd929190613423565b3480156107f657600080fd5b50600a546102b190600160401b900460ff1681565b34801561081757600080fd5b506102d9610826366004613104565b6122a5565b60006001600160e01b0319821663152a902d60e11b14806108505750610850826122f9565b92915050565b8263ffffffff16600081116108a75760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b60448201526064015b60405180910390fd5b600a5463ffffffff168111156108f35760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b604482015260640161089e565b6108fb610e57565b81610904610c4c565b61090e9190613536565b11156109515760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161089e565b600a54640100000000900463ffffffff168161096c33612347565b6109769190613536565b11156109bd5760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161089e565b806009546109cb9190613562565b341015610a0d5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b604482015260640161089e565b600c546001600160a01b031615610ae657600c546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613210565b11610ae45760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b604482015260640161089e565b505b600a54600160501b900460ff16610b325760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b604482015260640161089e565b601254610b755760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b604482015260640161089e565b610bea838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506012546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120612373565b610c365760405162461bcd60e51b815260206004820152601460248201527f4e6f7420612070726573616c65206d656d626572000000000000000000000000604482015260640161089e565b610c46338563ffffffff16612389565b50505050565b60006001600054610c5d9190613581565b905090565b606060028054610c71906135c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9d906135c4565b8015610cea5780601f10610cbf57610100808354040283529160200191610cea565b820191906000526020600020905b815481529060010190602001808311610ccd57829003601f168201915b5050505050905090565b6000610cff826123a3565b610d1c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d43826111a3565b9050806001600160a01b0316836001600160a01b03161415610d785760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610daf57610d928133610766565b610daf576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610e355760405162461bcd60e51b815260040161089e906134ac565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000600154600d54610c5d9190613581565b6008546001600160a01b03163314610e935760405162461bcd60e51b815260040161089e906134ac565b600a805460099490945568ffffffffff0000000019909316600160401b9415159490940267ffffffff0000000019169390931764010000000063ffffffff928316021763ffffffff19169216919091179055565b610ef28383836123dc565b505050565b600f5460105460009182916001600160a01b03909116906103e890610f1c9086613562565b610f26919061354e565b915091509250929050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c14610f865760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161089e565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815260146020527f97e14843bcb52e469f69b929a6475681fc82e2504cc873ce324f65b7a071f5b554610fd2908390613581565b73460fd5059e7301680fa53e63bbbf7272e643e89c6000908152601460208190527f97e14843bcb52e469f69b929a6475681fc82e2504cc873ce324f65b7a071f5b5859055601580549394508493919291600190811061104257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181208054909190611076908490613536565b90915550505050565b47806110bc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b604482015260640161089e565b60005b60155481101561118457600060146000601584815481106110f057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181205491506103e86111248584613562565b61112e919061354e565b905061116f6015848154811061115457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316826125da565b5050808061117c906135ff565b9150506110bf565b5050565b610ef28383836040518060200160405280600081525061185c565b60006111ae826126f3565b5192915050565b6008546001600160a01b031633146111df5760405162461bcd60e51b815260040161089e906134ac565b80518251146111ed57600080fd5b60005b8151811015610ef257611201610e57565b82828151811061122157634e487b7160e01b600052603260045260246000fd5b6020026020010151611231610c4c565b61123b9190613536565b111561127e5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161089e565b6112d68382815181106112a157634e487b7160e01b600052603260045260246000fd5b60200260200101518383815181106112c957634e487b7160e01b600052603260045260246000fd5b6020026020010151612389565b806112e0816135ff565b9150506111f0565b6008546001600160a01b031633146113125760405162461bcd60e51b815260040161089e906134ac565b600f80546001600160a01b0319166001600160a01b039390931692909217909155601055565b60006001600160a01b038216611361576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146113b15760405162461bcd60e51b815260040161089e906134ac565b6113bb6000612817565b565b6008546001600160a01b031633146113e75760405162461bcd60e51b815260040161089e906134ac565b600a805469ff0000000000000000001916600160481b84151590810291909117909155611423578051611421906011906020840190612cf5565b505b60018215151415611184576000600e805461143d906135c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611469906135c4565b80156114b65780601f1061148b576101008083540402835291602001916114b6565b820191906000526020600020905b81548152906001019060200180831161149957829003601f168201915b50505050509050805160001415610ef2578151610c4690600e906020850190612cf5565b606060038054610c71906135c4565b806000811161152f5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b604482015260640161089e565b600a5463ffffffff1681111561157b5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b604482015260640161089e565b611583610e57565b8161158c610c4c565b6115969190613536565b11156115d95760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161089e565b600a54640100000000900463ffffffff16816115f433612347565b6115fe9190613536565b11156116455760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161089e565b806009546116539190613562565b3410156116955760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b604482015260640161089e565b600c546001600160a01b03161561176e57600c546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156116ee57600080fd5b505afa158015611702573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117269190613210565b1161176c5760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b604482015260640161089e565b505b600a54600160401b900460ff1615156001146117bc5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b604482015260640161089e565b6111843383612389565b6001600160a01b0382163314156117f05760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118678484846123dc565b6001600160a01b0383163b15610c465761188384848484612869565b610c46576040516368d2bf6b60e11b815260040160405180910390fd5b6008546001600160a01b031633146118ca5760405162461bcd60e51b815260040161089e906134ac565b60015b6015548110156119335760146000601583815481106118fc57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040018120558061192b816135ff565b9150506118cd565b508151611941906001613536565b67ffffffffffffffff81111561196757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611990578160200160208202803683370190505b5080516119a591601591602090910190612d79565b5073460fd5059e7301680fa53e63bbbf7272e643e89c60156000815481106119dd57634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091555b8251811015610ef257818181518110611a3057634e487b7160e01b600052603260045260246000fd5b602002602001015160146000858481518110611a5c57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110611aa857634e487b7160e01b600052603260045260246000fd5b60200260200101516015826001611abf9190613536565b81548110611add57634e487b7160e01b600052603260045260246000fd5b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905580611b10816135ff565b915050611a07565b6060611b23826123a3565b611b605760405162461bcd60e51b815260206004820152600e60248201526d111bd95cc81b9bdd08195e1a5cdd60921b604482015260640161089e565b600a54600160481b900460ff16611ba3576011611b7c83612961565b604051602001611b8d92919061332d565b6040516020818303038152906040529050919050565b600e611b7c83612961565b6008546001600160a01b03163314611bd85760405162461bcd60e51b815260040161089e906134ac565b600a8054921515600160501b026aff000000000000000000001990931692909217909155601255565b8163ffffffff1660008111611c4d5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b604482015260640161089e565b600a5463ffffffff16811115611c995760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b604482015260640161089e565b611ca1610e57565b81611caa610c4c565b611cb49190613536565b1115611cf75760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161089e565b600a54640100000000900463ffffffff1681611d1233612347565b611d1c9190613536565b1115611d635760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161089e565b80600954611d719190613562565b341015611db35760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b604482015260640161089e565b600c546001600160a01b031615611e8c57600c546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015611e0c57600080fd5b505afa158015611e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e449190613210565b11611e8a5760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b604482015260640161089e565b505b600a54600160581b900460ff161515600114611edf5760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b604482015260640161089e565b600a54600160401b900460ff161515600114611f2d5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b604482015260640161089e565b6000600b5411611f745760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b604482015260640161089e565b6000611f7f83612347565b11611fcc5760405162461bcd60e51b815260206004820152601760248201527f526566657272657220686173206e6f74206d696e746564000000000000000000604482015260640161089e565b336001600160a01b03831614156120255760405162461bcd60e51b815260206004820152601560248201527f43616e6e6f7420726566657220796f757273656c660000000000000000000000604482015260640161089e565b612035338463ffffffff16612389565b6001600160a01b038216600090815260136020526040812080546001929061205e908490613536565b9091555050600b546001600160a01b038316600090815260136020526040902054612089919061361a565b610ef257612095610e57565b61209d610c4c565b1015610ef257610ef2826001612389565b6008546001600160a01b031633146120d85760405162461bcd60e51b815260040161089e906134ac565b6001600160a01b03811661213d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161089e565b61214681612817565b50565b606080600060158054905067ffffffffffffffff81111561217a57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156121a3578160200160208202803683370190505b50905060005b60155481101561223c5760146000601583815481106121d857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061221f57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280612234816135ff565b9150506121a9565b506015818180548060200260200160405190810160405280929190818152602001828054801561229557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612277575b5050505050915092509250509091565b6008546001600160a01b031633146122cf5760405162461bcd60e51b815260040161089e906134ac565b600a8054921515600160581b026bff00000000000000000000001990931692909217909155600b55565b60006301ffc9a760e01b6001600160e01b03198316148061232a57506380ac58cd60e01b6001600160e01b03198316145b806108505750506001600160e01b031916635b5e139f60e01b1490565b6001600160a01b0316600090815260056020526040902054600160401b900467ffffffffffffffff1690565b6000826123808584612a7b565b14949350505050565b611184828260405180602001604052806000815250612b35565b6000816001111580156123b7575060005482105b8015610850575050600090815260046020526040902054600160e01b900460ff161590565b60006123e7826126f3565b9050836001600160a01b031681600001516001600160a01b03161461241e5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061243c575061243c8533610766565b8061245757503361244c84610cf4565b6001600160a01b0316145b90508061247757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661249e57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b03888116845260058352818420805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898316808752848720805493841693831660019081018416949094179055898752600490955283862080546001600160e01b031916909517600160a01b429092169190910217845587018085529190932080549293919290911661258f57600054821461258f578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b8047101561262a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161089e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612677576040519150601f19603f3d011682016040523d82523d6000602084013e61267c565b606091505b5050905080610ef25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161089e565b604080516060810182526000808252602082018190529181019190915281806001116127fe576000548110156127fe57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906127fc5780516001600160a01b031615612792579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff16151592810192909252156127f7579392505050565b612792565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061289e9033908990889088906004016133e7565b602060405180830381600087803b1580156128b857600080fd5b505af19250505080156128e8575060408051601f3d908101601f191682019092526128e5918101906131dc565b60015b612943573d808015612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b50805161293b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816129855750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129af5780612999816135ff565b91506129a89050600a8361354e565b9150612989565b60008167ffffffffffffffff8111156129d857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a02576020820181803683370190505b5090505b841561295957612a17600183613581565b9150612a24600a8661361a565b612a2f906030613536565b60f81b818381518110612a5257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612a74600a8661354e565b9450612a06565b600081815b8451811015612b2d576000858281518110612aab57634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311612aed576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b1a565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b25816135ff565b915050612a80565b509392505050565b6000546001600160a01b038416612b5e57604051622e076360e81b815260040160405180910390fd5b82612b7c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612ca0575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612c696000878480600101955087612869565b612c86576040516368d2bf6b60e11b815260040160405180910390fd5b808210612c1e578260005414612c9b57600080fd5b612ce5565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612ca1575b506000908155610c469085838684565b828054612d01906135c4565b90600052602060002090601f016020900481019282612d235760008555612d69565b82601f10612d3c57805160ff1916838001178555612d69565b82800160010185558215612d69579182015b82811115612d69578251825591602001919060010190612d4e565b50612d75929150612dce565b5090565b828054828255906000526020600020908101928215612d69579160200282015b82811115612d6957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612d99565b5b80821115612d755760008155600101612dcf565b600067ffffffffffffffff831115612dfd57612dfd61365a565b612e10601f8401601f19166020016134e1565b9050828152838383011115612e2457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612e5257600080fd5b919050565b600082601f830112612e67578081fd5b81356020612e7c612e7783613512565b6134e1565b80838252828201915082860187848660051b8901011115612e9b578586fd5b855b85811015612eb957813584529284019290840190600101612e9d565b5090979650505050505050565b80358015158114612e5257600080fd5b803563ffffffff81168114612e5257600080fd5b600060208284031215612efb578081fd5b612f0482612e3b565b9392505050565b60008060408385031215612f1d578081fd5b612f2683612e3b565b9150612f3460208401612e3b565b90509250929050565b600080600060608486031215612f51578081fd5b612f5a84612e3b565b9250612f6860208501612e3b565b9150604084013590509250925092565b60008060008060808587031215612f8d578081fd5b612f9685612e3b565b9350612fa460208601612e3b565b925060408501359150606085013567ffffffffffffffff811115612fc6578182fd5b8501601f81018713612fd6578182fd5b612fe587823560208401612de3565b91505092959194509250565b60008060408385031215613003578182fd5b61300c83612e3b565b9150612f3460208401612ec6565b6000806040838503121561302c578182fd5b61303583612e3b565b946020939093013593505050565b60008060408385031215613055578182fd5b823567ffffffffffffffff8082111561306c578384fd5b818501915085601f83011261307f578384fd5b8135602061308f612e7783613512565b8083825282820191508286018a848660051b89010111156130ae578889fd5b8896505b848710156130d7576130c381612e3b565b8352600196909601959183019183016130b2565b50965050860135925050808211156130ed578283fd5b506130fa85828601612e57565b9150509250929050565b60008060408385031215613116578182fd5b61303583612ec6565b60008060408385031215613131578182fd5b61313a83612ec6565b9150602083013567ffffffffffffffff811115613155578182fd5b8301601f81018513613165578182fd5b6130fa85823560208401612de3565b60008060008060808587031215613189578182fd5b61319285612ec6565b9350602085013592506131a760408601612ed6565b91506131b560608601612ed6565b905092959194509250565b6000602082840312156131d1578081fd5b8135612f0481613670565b6000602082840312156131ed578081fd5b8151612f0481613670565b600060208284031215613209578081fd5b5035919050565b600060208284031215613221578081fd5b5051919050565b6000806040838503121561323a578182fd5b50508035926020909101359150565b6000806040838503121561325b578182fd5b612f2683612ed6565b600080600060408486031215613278578081fd5b61328184612ed6565b9250602084013567ffffffffffffffff8082111561329d578283fd5b818601915086601f8301126132b0578283fd5b8135818111156132be578384fd5b8760208260051b85010111156132d2578384fd5b6020830194508093505050509250925092565b600081518084526132fd816020860160208601613598565b601f01601f19169290920160200192915050565b60008151613323818560208601613598565b9290920192915050565b600080845482600182811c91508083168061334957607f831692505b602080841082141561336957634e487b7160e01b87526022600452602487fd5b81801561337d576001811461338e576133ba565b60ff198616895284890196506133ba565b60008b815260209020885b868110156133b25781548b820152908501908301613399565b505084890196505b5050505050506133de6133cd8286613311565b64173539b7b760d91b815260050190565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261341960808301846132e5565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b828110156134655781516001600160a01b031684529284019290840190600101613440565b50505083810382850152845180825285830191830190845b81811015612eb95783518352928401929184019160010161347d565b602081526000612f0460208301846132e5565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561350a5761350a61365a565b604052919050565b600067ffffffffffffffff82111561352c5761352c61365a565b5060051b60200190565b600082198211156135495761354961362e565b500190565b60008261355d5761355d613644565b500490565b600081600019048311821515161561357c5761357c61362e565b500290565b6000828210156135935761359361362e565b500390565b60005b838110156135b357818101518382015260200161359b565b83811115610c465750506000910152565b600181811c908216806135d857607f821691505b602082108114156135f957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136135761361361362e565b5060010190565b60008261362957613629613644565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461214657600080fdfea2646970667358221220128d070ab1aed27ee7c9526a32a323ef75027169b119fcf356c2fd6ef71a08c064736f6c63430008040033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001af40000000000000000000000000000000000000000000000000000000000000008474d206672656e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002474d000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061028c5760003560e01c80636c2f5acd11610164578063c7d12610116100c6578063e985e9c51161008a578063f5ca4dfd11610064578063f5ca4dfd146107c7578063fcfff16f146107ea578063fe25219a1461080b57600080fd5b8063e985e9c51461074b578063f179dca114610794578063f2fde38b146107a757600080fd5b8063c7d126101461069f578063c87b56dd146106bf578063d6c5b414146106df578063db31882b14610715578063dfdd9b9a1461073557600080fd5b806395d89b4111610128578063b88d4fde11610102578063b88d4fde1461063e578063be8e43ee1461065e578063bee6348a1461067e57600080fd5b806395d89b41146105f6578063a0712d681461060b578063a22cb4651461061e57600080fd5b80636c2f5acd1461056357806370a0823114610583578063715018a6146105a3578063828c12ce146105b85780638da5cb5b146105d857600080fd5b806323b872dd1161020d578063453c2310116101d15780636352211e116101ab5780636352211e1461050257806364bb106114610522578063672434821461054357600080fd5b8063453c23101461048a578063507e094f146104c457806351830227146104e157600080fd5b806323b872dd146103e35780632a55205a14610403578063355e6b43146104425780633ccfd60b1461046257806342842e0e1461046a57600080fd5b8063095ea7b311610254578063095ea7b3146103585780631012c3301461037857806313faede61461039857806318160ddd146103ae5780631d02161d146103c357600080fd5b806301ffc9a7146102915780630364d22a146102c6578063047fc9aa146102db57806306fdde03146102fe578063081812fc14610320575b600080fd5b34801561029d57600080fd5b506102b16102ac3660046131c0565b61082b565b60405190151581526020015b60405180910390f35b6102d96102d4366004613264565b610856565b005b3480156102e757600080fd5b506102f0610c4c565b6040519081526020016102bd565b34801561030a57600080fd5b50610313610c62565b6040516102bd9190613499565b34801561032c57600080fd5b5061034061033b3660046131f8565b610cf4565b6040516001600160a01b0390911681526020016102bd565b34801561036457600080fd5b506102d961037336600461301a565b610d38565b34801561038457600080fd5b506102d9610393366004612eea565b610e0b565b3480156103a457600080fd5b506102f060095481565b3480156103ba57600080fd5b506102f0610e57565b3480156103cf57600080fd5b506102d96103de366004613174565b610e69565b3480156103ef57600080fd5b506102d96103fe366004612f3d565b610ee7565b34801561040f57600080fd5b5061042361041e366004613228565b610ef7565b604080516001600160a01b0390931683526020830191909152016102bd565b34801561044e57600080fd5b506102d961045d3660046131f8565b610f31565b6102d961107f565b34801561047657600080fd5b506102d9610485366004612f3d565b611188565b34801561049657600080fd5b50600a546104af90640100000000900463ffffffff1681565b60405163ffffffff90911681526020016102bd565b3480156104d057600080fd5b50600a546104af9063ffffffff1681565b3480156104ed57600080fd5b50600a546102b190600160481b900460ff1681565b34801561050e57600080fd5b5061034061051d3660046131f8565b6111a3565b34801561052e57600080fd5b50600a546102b190600160581b900460ff1681565b34801561054f57600080fd5b506102d961055e366004613043565b6111b5565b34801561056f57600080fd5b506102d961057e36600461301a565b6112e8565b34801561058f57600080fd5b506102f061059e366004612eea565b611338565b3480156105af57600080fd5b506102d9611387565b3480156105c457600080fd5b506102d96105d336600461311f565b6113bd565b3480156105e457600080fd5b506008546001600160a01b0316610340565b34801561060257600080fd5b506103136114da565b6102d96106193660046131f8565b6114e9565b34801561062a57600080fd5b506102d9610639366004612ff1565b6117c6565b34801561064a57600080fd5b506102d9610659366004612f78565b61185c565b34801561066a57600080fd5b506102d9610679366004613043565b6118a0565b34801561068a57600080fd5b50600a546102b190600160501b900460ff1681565b3480156106ab57600080fd5b50600c54610340906001600160a01b031681565b3480156106cb57600080fd5b506103136106da3660046131f8565b611b18565b3480156106eb57600080fd5b506102f06106fa366004612eea565b6001600160a01b031660009081526013602052604090205490565b34801561072157600080fd5b506102d9610730366004613104565b611bae565b34801561074157600080fd5b506102f0600b5481565b34801561075757600080fd5b506102b1610766366004612f0b565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6102d96107a2366004613249565b611c01565b3480156107b357600080fd5b506102d96107c2366004612eea565b6120ae565b3480156107d357600080fd5b506107dc612149565b6040516102bd929190613423565b3480156107f657600080fd5b50600a546102b190600160401b900460ff1681565b34801561081757600080fd5b506102d9610826366004613104565b6122a5565b60006001600160e01b0319821663152a902d60e11b14806108505750610850826122f9565b92915050565b8263ffffffff16600081116108a75760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b60448201526064015b60405180910390fd5b600a5463ffffffff168111156108f35760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b604482015260640161089e565b6108fb610e57565b81610904610c4c565b61090e9190613536565b11156109515760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161089e565b600a54640100000000900463ffffffff168161096c33612347565b6109769190613536565b11156109bd5760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161089e565b806009546109cb9190613562565b341015610a0d5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b604482015260640161089e565b600c546001600160a01b031615610ae657600c546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015610a6657600080fd5b505afa158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613210565b11610ae45760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b604482015260640161089e565b505b600a54600160501b900460ff16610b325760405162461bcd60e51b815260206004820152601060248201526f283932b9b0b632903737ba1037b832b760811b604482015260640161089e565b601254610b755760405162461bcd60e51b815260206004820152601160248201527050726573616c65206e6f7420726561647960781b604482015260640161089e565b610bea838380806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506012546040516bffffffffffffffffffffffff193360601b166020820152909250603401905060405160208183030381529060405280519060200120612373565b610c365760405162461bcd60e51b815260206004820152601460248201527f4e6f7420612070726573616c65206d656d626572000000000000000000000000604482015260640161089e565b610c46338563ffffffff16612389565b50505050565b60006001600054610c5d9190613581565b905090565b606060028054610c71906135c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9d906135c4565b8015610cea5780601f10610cbf57610100808354040283529160200191610cea565b820191906000526020600020905b815481529060010190602001808311610ccd57829003601f168201915b5050505050905090565b6000610cff826123a3565b610d1c576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d43826111a3565b9050806001600160a01b0316836001600160a01b03161415610d785760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614610daf57610d928133610766565b610daf576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610e355760405162461bcd60e51b815260040161089e906134ac565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000600154600d54610c5d9190613581565b6008546001600160a01b03163314610e935760405162461bcd60e51b815260040161089e906134ac565b600a805460099490945568ffffffffff0000000019909316600160401b9415159490940267ffffffff0000000019169390931764010000000063ffffffff928316021763ffffffff19169216919091179055565b610ef28383836123dc565b505050565b600f5460105460009182916001600160a01b03909116906103e890610f1c9086613562565b610f26919061354e565b915091509250929050565b3373460fd5059e7301680fa53e63bbbf7272e643e89c14610f865760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161089e565b73460fd5059e7301680fa53e63bbbf7272e643e89c600090815260146020527f97e14843bcb52e469f69b929a6475681fc82e2504cc873ce324f65b7a071f5b554610fd2908390613581565b73460fd5059e7301680fa53e63bbbf7272e643e89c6000908152601460208190527f97e14843bcb52e469f69b929a6475681fc82e2504cc873ce324f65b7a071f5b5859055601580549394508493919291600190811061104257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181208054909190611076908490613536565b90915550505050565b47806110bc5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2062616c616e636560a01b604482015260640161089e565b60005b60155481101561118457600060146000601584815481106110f057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181205491506103e86111248584613562565b61112e919061354e565b905061116f6015848154811061115457634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316826125da565b5050808061117c906135ff565b9150506110bf565b5050565b610ef28383836040518060200160405280600081525061185c565b60006111ae826126f3565b5192915050565b6008546001600160a01b031633146111df5760405162461bcd60e51b815260040161089e906134ac565b80518251146111ed57600080fd5b60005b8151811015610ef257611201610e57565b82828151811061122157634e487b7160e01b600052603260045260246000fd5b6020026020010151611231610c4c565b61123b9190613536565b111561127e5760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161089e565b6112d68382815181106112a157634e487b7160e01b600052603260045260246000fd5b60200260200101518383815181106112c957634e487b7160e01b600052603260045260246000fd5b6020026020010151612389565b806112e0816135ff565b9150506111f0565b6008546001600160a01b031633146113125760405162461bcd60e51b815260040161089e906134ac565b600f80546001600160a01b0319166001600160a01b039390931692909217909155601055565b60006001600160a01b038216611361576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146113b15760405162461bcd60e51b815260040161089e906134ac565b6113bb6000612817565b565b6008546001600160a01b031633146113e75760405162461bcd60e51b815260040161089e906134ac565b600a805469ff0000000000000000001916600160481b84151590810291909117909155611423578051611421906011906020840190612cf5565b505b60018215151415611184576000600e805461143d906135c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611469906135c4565b80156114b65780601f1061148b576101008083540402835291602001916114b6565b820191906000526020600020905b81548152906001019060200180831161149957829003601f168201915b50505050509050805160001415610ef2578151610c4690600e906020850190612cf5565b606060038054610c71906135c4565b806000811161152f5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b604482015260640161089e565b600a5463ffffffff1681111561157b5760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b604482015260640161089e565b611583610e57565b8161158c610c4c565b6115969190613536565b11156115d95760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161089e565b600a54640100000000900463ffffffff16816115f433612347565b6115fe9190613536565b11156116455760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161089e565b806009546116539190613562565b3410156116955760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b604482015260640161089e565b600c546001600160a01b03161561176e57600c546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156116ee57600080fd5b505afa158015611702573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117269190613210565b1161176c5760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b604482015260640161089e565b505b600a54600160401b900460ff1615156001146117bc5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b604482015260640161089e565b6111843383612389565b6001600160a01b0382163314156117f05760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118678484846123dc565b6001600160a01b0383163b15610c465761188384848484612869565b610c46576040516368d2bf6b60e11b815260040160405180910390fd5b6008546001600160a01b031633146118ca5760405162461bcd60e51b815260040161089e906134ac565b60015b6015548110156119335760146000601583815481106118fc57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040018120558061192b816135ff565b9150506118cd565b508151611941906001613536565b67ffffffffffffffff81111561196757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611990578160200160208202803683370190505b5080516119a591601591602090910190612d79565b5073460fd5059e7301680fa53e63bbbf7272e643e89c60156000815481106119dd57634e487b7160e01b600052603260045260246000fd5b6000918252602082200180546001600160a01b0319166001600160a01b0393909316929092179091555b8251811015610ef257818181518110611a3057634e487b7160e01b600052603260045260246000fd5b602002602001015160146000858481518110611a5c57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550828181518110611aa857634e487b7160e01b600052603260045260246000fd5b60200260200101516015826001611abf9190613536565b81548110611add57634e487b7160e01b600052603260045260246000fd5b600091825260209091200180546001600160a01b0319166001600160a01b039290921691909117905580611b10816135ff565b915050611a07565b6060611b23826123a3565b611b605760405162461bcd60e51b815260206004820152600e60248201526d111bd95cc81b9bdd08195e1a5cdd60921b604482015260640161089e565b600a54600160481b900460ff16611ba3576011611b7c83612961565b604051602001611b8d92919061332d565b6040516020818303038152906040529050919050565b600e611b7c83612961565b6008546001600160a01b03163314611bd85760405162461bcd60e51b815260040161089e906134ac565b600a8054921515600160501b026aff000000000000000000001990931692909217909155601255565b8163ffffffff1660008111611c4d5760405162461bcd60e51b815260206004820152601260248201527126b4b73a1030ba103632b0b9ba1037b7329760711b604482015260640161089e565b600a5463ffffffff16811115611c995760405162461bcd60e51b815260206004820152601160248201527026b0bc1036b4b73a103932b0b1b432b21760791b604482015260640161089e565b611ca1610e57565b81611caa610c4c565b611cb49190613536565b1115611cf75760405162461bcd60e51b815260206004820152601260248201527172656163686564206d617820737570706c7960701b604482015260640161089e565b600a54640100000000900463ffffffff1681611d1233612347565b611d1c9190613536565b1115611d635760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b604482015260640161089e565b80600954611d719190613562565b341015611db35760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b410333ab7321760811b604482015260640161089e565b600c546001600160a01b031615611e8c57600c546040516370a0823160e01b81523360048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b158015611e0c57600080fd5b505afa158015611e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e449190613210565b11611e8a5760405162461bcd60e51b81526020600482015260166024820152751058d8d95cdcc81d1bdad95b881b9bdd081bdddb995960521b604482015260640161089e565b505b600a54600160581b900460ff161515600114611edf5760405162461bcd60e51b81526020600482015260126024820152712932b332b93930b639903737ba1037b832b760711b604482015260640161089e565b600a54600160401b900460ff161515600114611f2d5760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b604482015260640161089e565b6000600b5411611f745760405162461bcd60e51b81526020600482015260126024820152714361702069732073657420746f207a65726f60701b604482015260640161089e565b6000611f7f83612347565b11611fcc5760405162461bcd60e51b815260206004820152601760248201527f526566657272657220686173206e6f74206d696e746564000000000000000000604482015260640161089e565b336001600160a01b03831614156120255760405162461bcd60e51b815260206004820152601560248201527f43616e6e6f7420726566657220796f757273656c660000000000000000000000604482015260640161089e565b612035338463ffffffff16612389565b6001600160a01b038216600090815260136020526040812080546001929061205e908490613536565b9091555050600b546001600160a01b038316600090815260136020526040902054612089919061361a565b610ef257612095610e57565b61209d610c4c565b1015610ef257610ef2826001612389565b6008546001600160a01b031633146120d85760405162461bcd60e51b815260040161089e906134ac565b6001600160a01b03811661213d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161089e565b61214681612817565b50565b606080600060158054905067ffffffffffffffff81111561217a57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156121a3578160200160208202803683370190505b50905060005b60155481101561223c5760146000601583815481106121d857634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061221f57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280612234816135ff565b9150506121a9565b506015818180548060200260200160405190810160405280929190818152602001828054801561229557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612277575b5050505050915092509250509091565b6008546001600160a01b031633146122cf5760405162461bcd60e51b815260040161089e906134ac565b600a8054921515600160581b026bff00000000000000000000001990931692909217909155600b55565b60006301ffc9a760e01b6001600160e01b03198316148061232a57506380ac58cd60e01b6001600160e01b03198316145b806108505750506001600160e01b031916635b5e139f60e01b1490565b6001600160a01b0316600090815260056020526040902054600160401b900467ffffffffffffffff1690565b6000826123808584612a7b565b14949350505050565b611184828260405180602001604052806000815250612b35565b6000816001111580156123b7575060005482105b8015610850575050600090815260046020526040902054600160e01b900460ff161590565b60006123e7826126f3565b9050836001600160a01b031681600001516001600160a01b03161461241e5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061243c575061243c8533610766565b8061245757503361244c84610cf4565b6001600160a01b0316145b90508061247757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661249e57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b03888116845260058352818420805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898316808752848720805493841693831660019081018416949094179055898752600490955283862080546001600160e01b031916909517600160a01b429092169190910217845587018085529190932080549293919290911661258f57600054821461258f578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b8047101561262a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161089e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612677576040519150601f19603f3d011682016040523d82523d6000602084013e61267c565b606091505b5050905080610ef25760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161089e565b604080516060810182526000808252602082018190529181019190915281806001116127fe576000548110156127fe57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906127fc5780516001600160a01b031615612792579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff16151592810192909252156127f7579392505050565b612792565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061289e9033908990889088906004016133e7565b602060405180830381600087803b1580156128b857600080fd5b505af19250505080156128e8575060408051601f3d908101601f191682019092526128e5918101906131dc565b60015b612943573d808015612916576040519150601f19603f3d011682016040523d82523d6000602084013e61291b565b606091505b50805161293b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816129855750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129af5780612999816135ff565b91506129a89050600a8361354e565b9150612989565b60008167ffffffffffffffff8111156129d857634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a02576020820181803683370190505b5090505b841561295957612a17600183613581565b9150612a24600a8661361a565b612a2f906030613536565b60f81b818381518110612a5257634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612a74600a8661354e565b9450612a06565b600081815b8451811015612b2d576000858281518110612aab57634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311612aed576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612b1a565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612b25816135ff565b915050612a80565b509392505050565b6000546001600160a01b038416612b5e57604051622e076360e81b815260040160405180910390fd5b82612b7c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452600490925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b15612ca0575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612c696000878480600101955087612869565b612c86576040516368d2bf6b60e11b815260040160405180910390fd5b808210612c1e578260005414612c9b57600080fd5b612ce5565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612ca1575b506000908155610c469085838684565b828054612d01906135c4565b90600052602060002090601f016020900481019282612d235760008555612d69565b82601f10612d3c57805160ff1916838001178555612d69565b82800160010185558215612d69579182015b82811115612d69578251825591602001919060010190612d4e565b50612d75929150612dce565b5090565b828054828255906000526020600020908101928215612d69579160200282015b82811115612d6957825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612d99565b5b80821115612d755760008155600101612dcf565b600067ffffffffffffffff831115612dfd57612dfd61365a565b612e10601f8401601f19166020016134e1565b9050828152838383011115612e2457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612e5257600080fd5b919050565b600082601f830112612e67578081fd5b81356020612e7c612e7783613512565b6134e1565b80838252828201915082860187848660051b8901011115612e9b578586fd5b855b85811015612eb957813584529284019290840190600101612e9d565b5090979650505050505050565b80358015158114612e5257600080fd5b803563ffffffff81168114612e5257600080fd5b600060208284031215612efb578081fd5b612f0482612e3b565b9392505050565b60008060408385031215612f1d578081fd5b612f2683612e3b565b9150612f3460208401612e3b565b90509250929050565b600080600060608486031215612f51578081fd5b612f5a84612e3b565b9250612f6860208501612e3b565b9150604084013590509250925092565b60008060008060808587031215612f8d578081fd5b612f9685612e3b565b9350612fa460208601612e3b565b925060408501359150606085013567ffffffffffffffff811115612fc6578182fd5b8501601f81018713612fd6578182fd5b612fe587823560208401612de3565b91505092959194509250565b60008060408385031215613003578182fd5b61300c83612e3b565b9150612f3460208401612ec6565b6000806040838503121561302c578182fd5b61303583612e3b565b946020939093013593505050565b60008060408385031215613055578182fd5b823567ffffffffffffffff8082111561306c578384fd5b818501915085601f83011261307f578384fd5b8135602061308f612e7783613512565b8083825282820191508286018a848660051b89010111156130ae578889fd5b8896505b848710156130d7576130c381612e3b565b8352600196909601959183019183016130b2565b50965050860135925050808211156130ed578283fd5b506130fa85828601612e57565b9150509250929050565b60008060408385031215613116578182fd5b61303583612ec6565b60008060408385031215613131578182fd5b61313a83612ec6565b9150602083013567ffffffffffffffff811115613155578182fd5b8301601f81018513613165578182fd5b6130fa85823560208401612de3565b60008060008060808587031215613189578182fd5b61319285612ec6565b9350602085013592506131a760408601612ed6565b91506131b560608601612ed6565b905092959194509250565b6000602082840312156131d1578081fd5b8135612f0481613670565b6000602082840312156131ed578081fd5b8151612f0481613670565b600060208284031215613209578081fd5b5035919050565b600060208284031215613221578081fd5b5051919050565b6000806040838503121561323a578182fd5b50508035926020909101359150565b6000806040838503121561325b578182fd5b612f2683612ed6565b600080600060408486031215613278578081fd5b61328184612ed6565b9250602084013567ffffffffffffffff8082111561329d578283fd5b818601915086601f8301126132b0578283fd5b8135818111156132be578384fd5b8760208260051b85010111156132d2578384fd5b6020830194508093505050509250925092565b600081518084526132fd816020860160208601613598565b601f01601f19169290920160200192915050565b60008151613323818560208601613598565b9290920192915050565b600080845482600182811c91508083168061334957607f831692505b602080841082141561336957634e487b7160e01b87526022600452602487fd5b81801561337d576001811461338e576133ba565b60ff198616895284890196506133ba565b60008b815260209020885b868110156133b25781548b820152908501908301613399565b505084890196505b5050505050506133de6133cd8286613311565b64173539b7b760d91b815260050190565b95945050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261341960808301846132e5565b9695505050505050565b604080825283519082018190526000906020906060840190828701845b828110156134655781516001600160a01b031684529284019290840190600101613440565b50505083810382850152845180825285830191830190845b81811015612eb95783518352928401929184019160010161347d565b602081526000612f0460208301846132e5565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561350a5761350a61365a565b604052919050565b600067ffffffffffffffff82111561352c5761352c61365a565b5060051b60200190565b600082198211156135495761354961362e565b500190565b60008261355d5761355d613644565b500490565b600081600019048311821515161561357c5761357c61362e565b500290565b6000828210156135935761359361362e565b500390565b60005b838110156135b357818101518382015260200161359b565b83811115610c465750506000910152565b600181811c908216806135d857607f821691505b602082108114156135f957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136135761361361362e565b5060010190565b60008261362957613629613644565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461214657600080fdfea2646970667358221220128d070ab1aed27ee7c9526a32a323ef75027169b119fcf356c2fd6ef71a08c064736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001af40000000000000000000000000000000000000000000000000000000000000008474d206672656e730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002474d000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): GM frens
Arg [1] : _symbol (string): GM
Arg [2] : _maxSupply (uint256): 6900

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001af4
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 474d206672656e73000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [6] : 474d000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

50819:8112:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56920:275;;;;;;;;;;-1:-1:-1;56920:275:0;;;;;:::i;:::-;;:::i;:::-;;;13617:14:1;;13610:22;13592:41;;13580:2;13565:18;56920:275:0;;;;;;;;55455:513;;;;;;:::i;:::-;;:::i;:::-;;56701:91;;;;;;;;;;;;;:::i;:::-;;;21460:25:1;;;21448:2;21433:18;56701:91:0;21415:76:1;33354:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35036:245::-;;;;;;;;;;-1:-1:-1;35036:245:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11355:55:1;;;11337:74;;11325:2;11310:18;35036:245:0;11292:125:1;34517:453:0;;;;;;;;;;-1:-1:-1;34517:453:0;;;;;:::i;:::-;;:::i;52635:97::-;;;;;;;;;;-1:-1:-1;52635:97:0;;;;;:::i;:::-;;:::i;50939:19::-;;;;;;;;;;;;;;;;56800:112;;;;;;;;;;;;;:::i;52269:249::-;;;;;;;;;;-1:-1:-1;52269:249:0;;;;;:::i;:::-;;:::i;36045:170::-;;;;;;;;;;-1:-1:-1;36045:170:0;;;;;:::i;:::-;;:::i;57203:246::-;;;;;;;;;;-1:-1:-1;57203:246:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12130:55:1;;;12112:74;;12217:2;12202:18;;12195:34;;;;12085:18;57203:246:0;12067:168:1;51999:227:0;;;;;;;;;;-1:-1:-1;51999:227:0;;;;;:::i;:::-;;:::i;54433:376::-;;;:::i;36286:185::-;;;;;;;;;;-1:-1:-1;36286:185:0;;;;;:::i;:::-;;:::i;50996:26::-;;;;;;;;;;-1:-1:-1;50996:26:0;;;;;;;;;;;;;;21670:10:1;21658:23;;;21640:42;;21628:2;21613:18;50996:26:0;21595:93:1;50965:24:0;;;;;;;;;;-1:-1:-1;50965:24:0;;;;;;;;51052:20;;;;;;;;;;-1:-1:-1;51052:20:0;;;;-1:-1:-1;;;51052:20:0;;;;;;33162:125;;;;;;;;;;-1:-1:-1;33162:125:0;;;;;:::i;:::-;;:::i;51109:24::-;;;;;;;;;;-1:-1:-1;51109:24:0;;;;-1:-1:-1;;;51109:24:0;;;;;;54845:431;;;;;;;;;;-1:-1:-1;54845:431:0;;;;;:::i;:::-;;:::i;54255:170::-;;;;;;;;;;-1:-1:-1;54255:170:0;;;;;:::i;:::-;;:::i;30487:206::-;;;;;;;;;;-1:-1:-1;30487:206:0;;;;;:::i;:::-;;:::i;2678:103::-;;;;;;;;;;;;;:::i;52880:375::-;;;;;;;;;;-1:-1:-1;52880:375:0;;;;;:::i;:::-;;:::i;2027:87::-;;;;;;;;;;-1:-1:-1;2100:6:0;;-1:-1:-1;;;;;2100:6:0;2027:87;;33523:104;;;;;;;;;;;;;:::i;55284:163::-;;;;;;:::i;:::-;;:::i;35353:340::-;;;;;;;;;;-1:-1:-1;35353:340:0;;;;;:::i;:::-;;:::i;36542:396::-;;;;;;;;;;-1:-1:-1;36542:396:0;;;;;:::i;:::-;;:::i;53263:490::-;;;;;;;;;;-1:-1:-1;53263:490:0;;;;;:::i;:::-;;:::i;51079:23::-;;;;;;;;;;-1:-1:-1;51079:23:0;;;;-1:-1:-1;;;51079:23:0;;;;;;51173;;;;;;;;;;-1:-1:-1;51173:23:0;;;;-1:-1:-1;;;;;51173:23:0;;;57584:619;;;;;;;;;;-1:-1:-1;57584:619:0;;;;;:::i;:::-;;:::i;57457:119::-;;;;;;;;;;-1:-1:-1;57457:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;57550:18:0;57523:7;57550:18;;;:11;:18;;;;;;;57457:119;52740:132;;;;;;;;;;-1:-1:-1;52740:132:0;;;;;:::i;:::-;;:::i;51140:26::-;;;;;;;;;;;;;;;;35764:214;;;;;;;;;;-1:-1:-1;35764:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;35935:25:0;;;35906:4;35935:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35764:214;55976:690;;;;;;:::i;:::-;;:::i;2936:201::-;;;;;;;;;;-1:-1:-1;2936:201:0;;;;;:::i;:::-;;:::i;53761:343::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;51029:16::-;;;;;;;;;;-1:-1:-1;51029:16:0;;;;-1:-1:-1;;;51029:16:0;;;;;;54112:135;;;;;;;;;;-1:-1:-1;54112:135:0;;;;;:::i;:::-;;:::i;56920:275::-;57051:4;-1:-1:-1;;;;;;57093:41:0;;-1:-1:-1;;;57093:41:0;;:94;;;57151:36;57175:11;57151:23;:36::i;:::-;57073:114;56920:275;-1:-1:-1;;56920:275:0:o;55455:513::-;55574:5;58245:683;;58310:1;58302:5;:9;58294:40;;;;-1:-1:-1;;;58294:40:0;;21169:2:1;58294:40:0;;;21151:21:1;21208:2;21188:18;;;21181:30;-1:-1:-1;;;21227:18:1;;;21220:48;21285:18;;58294:40:0;;;;;;;;;58362:10;;;;58353:19;;;58345:49;;;;-1:-1:-1;;;58345:49:0;;20823:2:1;58345:49:0;;;20805:21:1;20862:2;20842:18;;;20835:30;-1:-1:-1;;;20881:18:1;;;20874:47;20938:18;;58345:49:0;20795:167:1;58345:49:0;58433:13;:11;:13::i;:::-;58424:5;58413:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;58405:64;;;;-1:-1:-1;;;58405:64:0;;17349:2:1;58405:64:0;;;17331:21:1;17388:2;17368:18;;;17361:30;-1:-1:-1;;;17407:18:1;;;17400:48;17465:18;;58405:64:0;17321:168:1;58405:64:0;58539:12;;;;;;;58530:5;58502:25;58516:10;58502:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;58480:121;;;;-1:-1:-1;;;58480:121:0;;19786:2:1;58480:121:0;;;19768:21:1;19825:2;19805:18;;;19798:30;-1:-1:-1;;;19844:18:1;;;19837:52;19906:18;;58480:121:0;19758:172:1;58480:121:0;58640:5;58633:4;;:12;;;;:::i;:::-;58620:9;:25;;58612:54;;;;-1:-1:-1;;;58612:54:0;;20478:2:1;58612:54:0;;;20460:21:1;20517:2;20497:18;;;20490:30;-1:-1:-1;;;20536:18:1;;;20529:46;20592:18;;58612:54:0;20450:166:1;58612:54:0;58681:8;;-1:-1:-1;;;;;58681:8:0;:22;58677:230;;58750:8;;58800:33;;-1:-1:-1;;;58800:33:0;;58822:10;58800:33;;;11337:74:1;-1:-1:-1;;;;;58750:8:0;;;;58720:19;;58750:8;;58800:21;;11310:18:1;;58800:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;58774:121;;;;-1:-1:-1;;;58774:121:0;;16998:2:1;58774:121:0;;;16980:21:1;17037:2;17017:18;;;17010:30;-1:-1:-1;;;17056:18:1;;;17049:52;17118:18;;58774:121:0;16970:172:1;58774:121:0;58677:230;;55605:11:::1;::::0;-1:-1:-1;;;55605:11:0;::::1;;;55597:40;;;::::0;-1:-1:-1;;;55597:40:0;;19441:2:1;55597:40:0::1;::::0;::::1;19423:21:1::0;19480:2;19460:18;;;19453:30;-1:-1:-1;;;19499:18:1;;;19492:46;19555:18;;55597:40:0::1;19413:166:1::0;55597:40:0::1;55656:10;::::0;55648:46:::1;;;::::0;-1:-1:-1;;;55648:46:0;;14070:2:1;55648:46:0::1;::::0;::::1;14052:21:1::0;14109:2;14089:18;;;14082:30;-1:-1:-1;;;14128:18:1;;;14121:47;14185:18;;55648:46:0::1;14042:167:1::0;55648:46:0::1;55727:144;55764:5;;55727:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;55788:10:0::1;::::0;55827:28:::1;::::0;-1:-1:-1;;55844:10:0::1;9334:2:1::0;9330:15;9326:53;55827:28:0::1;::::0;::::1;9314:66:1::0;55788:10:0;;-1:-1:-1;9396:12:1;;;-1:-1:-1;55827:28:0::1;;;;;;;;;;;;55817:39;;;;;;55727:18;:144::i;:::-;55705:214;;;::::0;-1:-1:-1;;;55705:214:0;;15517:2:1;55705:214:0::1;::::0;::::1;15499:21:1::0;15556:2;15536:18;;;15529:30;15595:22;15575:18;;;15568:50;15635:18;;55705:214:0::1;15489:170:1::0;55705:214:0::1;55932:28;55942:10;55954:5;55932:28;;:9;:28::i;:::-;55455:513:::0;;;;:::o;56701:91::-;56740:7;56783:1;56767:13;;:17;;;;:::i;:::-;56760:24;;56701:91;:::o;33354:100::-;33408:13;33441:5;33434:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33354:100;:::o;35036:245::-;35140:7;35170:16;35178:7;35170;:16::i;:::-;35165:64;;35195:34;;-1:-1:-1;;;35195:34:0;;;;;;;;;;;35165:64;-1:-1:-1;35249:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;35249:24:0;;35036:245::o;34517:453::-;34590:13;34606:24;34622:7;34606:15;:24::i;:::-;34590:40;;34651:5;-1:-1:-1;;;;;34645:11:0;:2;-1:-1:-1;;;;;34645:11:0;;34641:48;;;34665:24;;-1:-1:-1;;;34665:24:0;;;;;;;;;;;34641:48;49792:10;-1:-1:-1;;;;;34706:28:0;;;34702:175;;34754:44;34771:5;49792:10;35764:214;:::i;34754:44::-;34749:128;;34826:35;;-1:-1:-1;;;34826:35:0;;;;;;;;;;;34749:128;34889:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;34889:29:0;-1:-1:-1;;;;;34889:29:0;;;;;;;;;34934:28;;34889:24;;34934:28;;;;;;;34517:453;;;:::o;52635:97::-;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;52705:8:::1;:19:::0;;-1:-1:-1;;;;;;52705:19:0::1;-1:-1:-1::0;;;;;52705:19:0;;;::::1;::::0;;;::::1;::::0;;52635:97::o;56800:112::-;56853:7;56892:12;;56880:9;;:24;;;;:::i;52269:249::-;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;52415:4:::1;:12:::0;;52438:4:::1;:12:::0;;;;-1:-1:-1;;52461:20:0;;;-1:-1:-1;;;52415:12:0;::::1;;::::0;;;::::1;-1:-1:-1::0;;52461:20:0;;;;;;::::1;::::0;;::::1;;;-1:-1:-1::0;;52492:18:0::1;::::0;::::1;::::0;;;::::1;::::0;;52269:249::o;36045:170::-;36179:28;36189:4;36195:2;36199:7;36179:9;:28::i;:::-;36045:170;;;:::o;57203:246::-;57395:9;;57420:12;;57330:16;;;;-1:-1:-1;;;;;57395:9:0;;;;57436:4;;57407:25;;:10;:25;:::i;:::-;57406:34;;;;:::i;:::-;57387:54;;;;57203:246;;;;;:::o;51999:227::-;52063:10;51491:42;52063:18;52055:46;;;;-1:-1:-1;;;52055:46:0;;14416:2:1;52055:46:0;;;14398:21:1;14455:2;14435:18;;;14428:30;-1:-1:-1;;;14474:18:1;;;14467:45;14529:18;;52055:46:0;14388:165:1;52055:46:0;51491:42;52112:12;52127:13;;;:7;:13;;;;:21;;52143:5;;52127:21;:::i;:::-;51491:42;52159:13;;;;:7;:13;;;;;:21;;;52199:7;:10;;52112:36;;-1:-1:-1;52112:36:0;;52159:7;;:13;52207:1;;52199:10;;;;-1:-1:-1;;;52199:10:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52199:10:0;52191:19;;;;;;;;;;;;:27;;:19;;52199:10;52191:27;;;;;:::i;:::-;;;;-1:-1:-1;;;;51999:227:0:o;54433:376::-;54497:21;54537:11;54529:36;;;;-1:-1:-1;;;54529:36:0;;20137:2:1;54529:36:0;;;20119:21:1;20176:2;20156:18;;;20149:30;-1:-1:-1;;;20195:18:1;;;20188:42;20247:18;;54529:36:0;20109:162:1;54529:36:0;54583:9;54578:224;54602:7;:14;54598:18;;54578:224;;;54638:13;54654:7;:19;54662:7;54670:1;54662:10;;;;;;-1:-1:-1;;;54662:10:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54662:10:0;54654:19;;;;;;;;;;;;;;-1:-1:-1;54725:4:0;54706:15;54714:7;54654:19;54706:15;:::i;:::-;54705:24;;;;:::i;:::-;54688:42;;54745:45;54771:7;54779:1;54771:10;;;;;;-1:-1:-1;;;54771:10:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54771:10:0;54784:5;54745:17;:45::i;:::-;54578:224;;54618:3;;;;;:::i;:::-;;;;54578:224;;;;54433:376;:::o;36286:185::-;36424:39;36441:4;36447:2;36451:7;36424:39;;;;;;;;;;;;:16;:39::i;33162:125::-;33226:7;33253:21;33266:7;33253:12;:21::i;:::-;:26;;33162:125;-1:-1:-1;;33162:125:0:o;54845:431::-;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;54999:7:::1;:14;54977:11;:18;:36;54969:45;;;::::0;::::1;;55032:9;55027:242;55051:7;:14;55047:1;:18;55027:242;;;55138:13;:11;:13::i;:::-;55124:7;55132:1;55124:10;;;;;;-1:-1:-1::0;;;55124:10:0::1;;;;;;;;;;;;;;;55113:8;:6;:8::i;:::-;:21;;;;:::i;:::-;:38;;55087:118;;;::::0;-1:-1:-1;;;55087:118:0;;17349:2:1;55087:118:0::1;::::0;::::1;17331:21:1::0;17388:2;17368:18;;;17361:30;-1:-1:-1;;;17407:18:1;;;17400:48;17465:18;;55087:118:0::1;17321:168:1::0;55087:118:0::1;55220:37;55230:11;55242:1;55230:14;;;;;;-1:-1:-1::0;;;55230:14:0::1;;;;;;;;;;;;;;;55246:7;55254:1;55246:10;;;;;;-1:-1:-1::0;;;55246:10:0::1;;;;;;;;;;;;;;;55220:9;:37::i;:::-;55067:3:::0;::::1;::::0;::::1;:::i;:::-;;;;55027:242;;54255:170:::0;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;54365:9:::1;:22:::0;;-1:-1:-1;;;;;;54365:22:0::1;-1:-1:-1::0;;;;;54365:22:0;;;::::1;::::0;;;::::1;::::0;;;54398:12:::1;:19:::0;54255:170::o;30487:206::-;30551:7;-1:-1:-1;;;;;30575:19:0;;30571:60;;30603:28;;-1:-1:-1;;;30603:28:0;;;;;;;;;;;30571:60;-1:-1:-1;;;;;;30657:19:0;;;;;:12;:19;;;;;:27;;;;30487:206::o;2678:103::-;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;2743:30:::1;2770:1;2743:18;:30::i;:::-;2678:103::o:0;52880:375::-;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;52966:8:::1;:20:::0;;-1:-1:-1;;52966:20:0::1;-1:-1:-1::0;;;52966:20:0;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;52999:72:::1;;53038:21:::0;;::::1;::::0;:14:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;52999:72;53100:4;53087:17:::0;::::1;;;53083:165;;;53121:15;53145:7;53121:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53172:2;:9;53185:1;53172:14;53168:69;;;53207:14:::0;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;33523:104::-:0;33579:13;33612:7;33605:14;;;;;:::i;55284:163::-;55344:5;58310:1;58302:5;:9;58294:40;;;;-1:-1:-1;;;58294:40:0;;21169:2:1;58294:40:0;;;21151:21:1;21208:2;21188:18;;;21181:30;-1:-1:-1;;;21227:18:1;;;21220:48;21285:18;;58294:40:0;21141:168:1;58294:40:0;58362:10;;;;58353:19;;;58345:49;;;;-1:-1:-1;;;58345:49:0;;20823:2:1;58345:49:0;;;20805:21:1;20862:2;20842:18;;;20835:30;-1:-1:-1;;;20881:18:1;;;20874:47;20938:18;;58345:49:0;20795:167:1;58345:49:0;58433:13;:11;:13::i;:::-;58424:5;58413:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;58405:64;;;;-1:-1:-1;;;58405:64:0;;17349:2:1;58405:64:0;;;17331:21:1;17388:2;17368:18;;;17361:30;-1:-1:-1;;;17407:18:1;;;17400:48;17465:18;;58405:64:0;17321:168:1;58405:64:0;58539:12;;;;;;;58530:5;58502:25;58516:10;58502:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;58480:121;;;;-1:-1:-1;;;58480:121:0;;19786:2:1;58480:121:0;;;19768:21:1;19825:2;19805:18;;;19798:30;-1:-1:-1;;;19844:18:1;;;19837:52;19906:18;;58480:121:0;19758:172:1;58480:121:0;58640:5;58633:4;;:12;;;;:::i;:::-;58620:9;:25;;58612:54;;;;-1:-1:-1;;;58612:54:0;;20478:2:1;58612:54:0;;;20460:21:1;20517:2;20497:18;;;20490:30;-1:-1:-1;;;20536:18:1;;;20529:46;20592:18;;58612:54:0;20450:166:1;58612:54:0;58681:8;;-1:-1:-1;;;;;58681:8:0;:22;58677:230;;58750:8;;58800:33;;-1:-1:-1;;;58800:33:0;;58822:10;58800:33;;;11337:74:1;-1:-1:-1;;;;;58750:8:0;;;;58720:19;;58750:8;;58800:21;;11310:18:1;;58800:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;58774:121;;;;-1:-1:-1;;;58774:121:0;;16998:2:1;58774:121:0;;;16980:21:1;17037:2;17017:18;;;17010:30;-1:-1:-1;;;17056:18:1;;;17049:52;17118:18;;58774:121:0;16970:172:1;58774:121:0;58677:230;;55370:4:::1;::::0;-1:-1:-1;;;55370:4:0;::::1;;;:12;;55378:4;55370:12;55362:38;;;::::0;-1:-1:-1;;;55362:38:0;;19099:2:1;55362:38:0::1;::::0;::::1;19081:21:1::0;19138:2;19118:18;;;19111:30;-1:-1:-1;;;19157:18:1;;;19150:43;19210:18;;55362:38:0::1;19071:163:1::0;55362:38:0::1;55411:28;55421:10;55433:5;55411:9;:28::i;35353:340::-:0;-1:-1:-1;;;;;35484:31:0;;49792:10;35484:31;35480:61;;;35524:17;;-1:-1:-1;;;35524:17:0;;;;;;;;;;;35480:61;49792:10;35554:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;35554:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;35554:60:0;;;;;;;;;;35630:55;;13592:41:1;;;35554:49:0;;49792:10;35630:55;;13565:18:1;35630:55:0;;;;;;;35353:340;;:::o;36542:396::-;36709:28;36719:4;36725:2;36729:7;36709:9;:28::i;:::-;-1:-1:-1;;;;;36752:14:0;;;:19;36748:183;;36791:56;36822:4;36828:2;36832:7;36841:5;36791:30;:56::i;:::-;36786:145;;36875:40;;-1:-1:-1;;;36875:40:0;;;;;;;;;;;53263:490;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;53415:1:::1;53398:98;53422:7;:14:::0;53418:18;::::1;53398:98;;;53465:7;:19;53473:7;53481:1;53473:10;;;;;;-1:-1:-1::0;;;53473:10:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;53473:10:0::1;53465:19:::0;;;::::1;::::0;;;;;;;;53458:26;53438:3;::::1;::::0;::::1;:::i;:::-;;;;53398:98;;;-1:-1:-1::0;53530:17:0;;:21:::1;::::0;53550:1:::1;53530:21;:::i;:::-;53516:36;;;;;;-1:-1:-1::0;;;53516:36:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;53516:36:0::1;-1:-1:-1::0;53506:46:0;;::::1;::::0;:7:::1;::::0;:46:::1;::::0;;::::1;::::0;::::1;:::i;:::-;;51491:42;53563:7;53571:1;53563:10;;;;;;-1:-1:-1::0;;;53563:10:0::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;:17:::0;;-1:-1:-1;;;;;;53563:17:0::1;-1:-1:-1::0;;;;;53563:17:0;;;::::1;::::0;;;::::1;::::0;;;53593:153:::1;53617:10;:17;53613:1;:21;53593:153;;;53681:5;53687:1;53681:8;;;;;;-1:-1:-1::0;;;53681:8:0::1;;;;;;;;;;;;;;;53656:7;:22;53664:10;53675:1;53664:13;;;;;;-1:-1:-1::0;;;53664:13:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;53656:22:0::1;-1:-1:-1::0;;;;;53656:22:0::1;;;;;;;;;;;;:33;;;;53721:10;53732:1;53721:13;;;;;;-1:-1:-1::0;;;53721:13:0::1;;;;;;;;;;;;;;;53704:7;53712:1;53716;53712:5;;;;:::i;:::-;53704:14;;;;;;-1:-1:-1::0;;;53704:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:30:::0;;-1:-1:-1;;;;;;53704:30:0::1;-1:-1:-1::0;;;;;53704:30:0;;;::::1;::::0;;;::::1;::::0;;53636:3;::::1;::::0;::::1;:::i;:::-;;;;53593:153;;57584:619:::0;57686:13;57725:17;57733:8;57725:7;:17::i;:::-;57717:44;;;;-1:-1:-1;;;57717:44:0;;18756:2:1;57717:44:0;;;18738:21:1;18795:2;18775:18;;;18768:30;-1:-1:-1;;;18814:18:1;;;18807:44;18868:18;;57717:44:0;18728:164:1;57717:44:0;57776:8;;-1:-1:-1;;;57776:8:0;;;;57772:289;;57906:14;57947:26;57964:8;57947:16;:26::i;:::-;57863:167;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57810:239;;57584:619;;;:::o;57772:289::-;58135:7;58144:26;58161:8;58144:16;:26::i;52740:132::-;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;52817:11:::1;:19:::0;;;::::1;;-1:-1:-1::0;;;52817:19:0::1;-1:-1:-1::0;;52817:19:0;;::::1;::::0;;;::::1;::::0;;;52847:10:::1;:17:::0;52740:132::o;55976:690::-;56088:5;58245:683;;58310:1;58302:5;:9;58294:40;;;;-1:-1:-1;;;58294:40:0;;21169:2:1;58294:40:0;;;21151:21:1;21208:2;21188:18;;;21181:30;-1:-1:-1;;;21227:18:1;;;21220:48;21285:18;;58294:40:0;21141:168:1;58294:40:0;58362:10;;;;58353:19;;;58345:49;;;;-1:-1:-1;;;58345:49:0;;20823:2:1;58345:49:0;;;20805:21:1;20862:2;20842:18;;;20835:30;-1:-1:-1;;;20881:18:1;;;20874:47;20938:18;;58345:49:0;20795:167:1;58345:49:0;58433:13;:11;:13::i;:::-;58424:5;58413:8;:6;:8::i;:::-;:16;;;;:::i;:::-;:33;;58405:64;;;;-1:-1:-1;;;58405:64:0;;17349:2:1;58405:64:0;;;17331:21:1;17388:2;17368:18;;;17361:30;-1:-1:-1;;;17407:18:1;;;17400:48;17465:18;;58405:64:0;17321:168:1;58405:64:0;58539:12;;;;;;;58530:5;58502:25;58516:10;58502:13;:25::i;:::-;:33;;;;:::i;:::-;:49;;58480:121;;;;-1:-1:-1;;;58480:121:0;;19786:2:1;58480:121:0;;;19768:21:1;19825:2;19805:18;;;19798:30;-1:-1:-1;;;19844:18:1;;;19837:52;19906:18;;58480:121:0;19758:172:1;58480:121:0;58640:5;58633:4;;:12;;;;:::i;:::-;58620:9;:25;;58612:54;;;;-1:-1:-1;;;58612:54:0;;20478:2:1;58612:54:0;;;20460:21:1;20517:2;20497:18;;;20490:30;-1:-1:-1;;;20536:18:1;;;20529:46;20592:18;;58612:54:0;20450:166:1;58612:54:0;58681:8;;-1:-1:-1;;;;;58681:8:0;:22;58677:230;;58750:8;;58800:33;;-1:-1:-1;;;58800:33:0;;58822:10;58800:33;;;11337:74:1;-1:-1:-1;;;;;58750:8:0;;;;58720:19;;58750:8;;58800:21;;11310:18:1;;58800:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;58774:121;;;;-1:-1:-1;;;58774:121:0;;16998:2:1;58774:121:0;;;16980:21:1;17037:2;17017:18;;;17010:30;-1:-1:-1;;;17056:18:1;;;17049:52;17118:18;;58774:121:0;16970:172:1;58774:121:0;58677:230;;56119:12:::1;::::0;-1:-1:-1;;;56119:12:0;::::1;;;:20;;56135:4;56119:20;56111:51;;;::::0;-1:-1:-1;;;56111:51:0;;15866:2:1;56111:51:0::1;::::0;::::1;15848:21:1::0;15905:2;15885:18;;;15878:30;-1:-1:-1;;;15924:18:1;;;15917:48;15982:18;;56111:51:0::1;15838:168:1::0;56111:51:0::1;56181:4;::::0;-1:-1:-1;;;56181:4:0;::::1;;;:12;;56189:4;56181:12;56173:38;;;::::0;-1:-1:-1;;;56173:38:0;;19099:2:1;56173:38:0::1;::::0;::::1;19081:21:1::0;19138:2;19118:18;;;19111:30;-1:-1:-1;;;19157:18:1;;;19150:43;19210:18;;56173:38:0::1;19071:163:1::0;56173:38:0::1;56244:1;56230:11;;:15;56222:46;;;::::0;-1:-1:-1;;;56222:46:0;;17696:2:1;56222:46:0::1;::::0;::::1;17678:21:1::0;17735:2;17715:18;;;17708:30;-1:-1:-1;;;17754:18:1;;;17747:48;17812:18;;56222:46:0::1;17668:168:1::0;56222:46:0::1;56313:1;56287:23;56301:8;56287:13;:23::i;:::-;:27;56279:63;;;::::0;-1:-1:-1;;;56279:63:0;;18043:2:1;56279:63:0::1;::::0;::::1;18025:21:1::0;18082:2;18062:18;;;18055:30;18121:25;18101:18;;;18094:53;18164:18;;56279:63:0::1;18015:173:1::0;56279:63:0::1;56361:10;-1:-1:-1::0;;;;;56361:22:0;::::1;;;56353:56;;;::::0;-1:-1:-1;;;56353:56:0;;14760:2:1;56353:56:0::1;::::0;::::1;14742:21:1::0;14799:2;14779:18;;;14772:30;14838:23;14818:18;;;14811:51;14879:18;;56353:56:0::1;14732:171:1::0;56353:56:0::1;56422:28;56432:10;56444:5;56422:28;;:9;:28::i;:::-;-1:-1:-1::0;;;;;56463:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;:26;;56488:1:::1;::::0;56463:21;:26:::1;::::0;56488:1;;56463:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;56528:11:0::1;::::0;-1:-1:-1;;;;;56504:21:0;::::1;;::::0;;;:11:::1;:21;::::0;;;;;:35:::1;::::0;56528:11;56504:35:::1;:::i;:::-;56500:159;;56576:13;:11;:13::i;:::-;56565:8;:6;:8::i;:::-;:24;56561:87;;;56610:22;56620:8;56630:1;56610:9;:22::i;2936:201::-:0;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3025:22:0;::::1;3017:73;;;::::0;-1:-1:-1;;;3017:73:0;;15110:2:1;3017:73:0::1;::::0;::::1;15092:21:1::0;15149:2;15129:18;;;15122:30;15188:34;15168:18;;;15161:62;-1:-1:-1;;;15239:18:1;;;15232:36;15285:19;;3017:73:0::1;15082:228:1::0;3017:73:0::1;3101:28;3120:8;3101:18;:28::i;:::-;2936:201:::0;:::o;53761:343::-;53837:16;53855;53889:23;53929:7;:14;;;;53915:29;;;;;;-1:-1:-1;;;53915:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53915:29:0;;53889:55;;53962:9;53957:103;53981:7;:14;53977:18;;53957:103;;;54029:7;:19;54037:7;54045:1;54037:10;;;;;;-1:-1:-1;;;54037:10:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54037:10:0;54029:19;;;;;;;;;;;;;54017:9;;:6;;54024:1;;54017:9;;;;-1:-1:-1;;;54017:9:0;;;;;;;;;;;;;;;;;;:31;53997:3;;;;:::i;:::-;;;;53957:103;;;;54080:7;54089:6;54072:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54072:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53761:343;;:::o;54112:135::-;2100:6;;-1:-1:-1;;;;;2100:6:0;49792:10;2247:23;2239:68;;;;-1:-1:-1;;;2239:68:0;;;;;;;:::i;:::-;54190:12:::1;:20:::0;;;::::1;;-1:-1:-1::0;;;54190:20:0::1;-1:-1:-1::0;;54190:20:0;;::::1;::::0;;;::::1;::::0;;;:12:::1;54221:18:::0;54112:135::o;29758:665::-;29888:4;-1:-1:-1;;;;;;;;;30193:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;30270:25:0;;;30193:102;:179;;;-1:-1:-1;;;;;;;;30347:25:0;-1:-1:-1;;;30347:25:0;;29758:665::o;30775:137::-;-1:-1:-1;;;;;30871:19:0;30836:7;30871:19;;;:12;:19;;;;;:32;-1:-1:-1;;;30871:32:0;;;;;30775:137::o;14696:190::-;14821:4;14874;14845:25;14858:5;14865:4;14845:12;:25::i;:::-;:33;;14696:190;-1:-1:-1;;;;14696:190:0:o;37490:104::-;37559:27;37569:2;37573:8;37559:27;;;;;;;;;;;;:9;:27::i;37193:213::-;37250:4;37306:7;52618:1;37287:26;;:66;;;;;37340:13;;37330:7;:23;37287:66;:111;;;;-1:-1:-1;;37371:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;37371:27:0;;;;37370:28;;37193:213::o;41597:2148::-;41712:35;41750:21;41763:7;41750:12;:21::i;:::-;41712:59;;41810:4;-1:-1:-1;;;;;41788:26:0;:13;:18;;;-1:-1:-1;;;;;41788:26:0;;41784:67;;41823:28;;-1:-1:-1;;;41823:28:0;;;;;;;;;;;41784:67;41864:22;49792:10;-1:-1:-1;;;;;41890:27:0;;;;:87;;-1:-1:-1;41934:43:0;41951:4;49792:10;35764:214;:::i;41934:43::-;41890:147;;;-1:-1:-1;49792:10:0;41994:20;42006:7;41994:11;:20::i;:::-;-1:-1:-1;;;;;41994:43:0;;41890:147;41864:174;;42056:17;42051:66;;42082:35;;-1:-1:-1;;;42082:35:0;;;;;;;;;;;42051:66;-1:-1:-1;;;;;42132:16:0;;42128:52;;42157:23;;-1:-1:-1;;;42157:23:0;;;;;;;;;;;42128:52;42309:24;;;;:15;:24;;;;;;;;42302:31;;-1:-1:-1;;;;;;42302:31:0;;;-1:-1:-1;;;;;42629:18:0;;;;;:12;:18;;;;;:31;;-1:-1:-1;;42629:31:0;;;;;;;-1:-1:-1;;42629:31:0;;;;;;;42675:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;42675:29:0;;;;;;;;;;;42755:20;;;:11;:20;;;;;;42790:18;;-1:-1:-1;;;;;;42823:49:0;;;;-1:-1:-1;;;42856:15:0;42823:49;;;;;;;;;;43146:11;;43206:24;;;;;;;43249:13;;42755:20;;43146:11;;43206:24;;43249:13;43245:384;;43459:13;;43444:11;:28;43440:174;;43497:20;;43566:28;;;;43540:54;;-1:-1:-1;;;43540:54:0;-1:-1:-1;;;;;;43540:54:0;;;-1:-1:-1;;;;;43497:20:0;;43540:54;;;;43440:174;41597:2148;;;43676:7;43672:2;-1:-1:-1;;;;;43657:27:0;43666:4;-1:-1:-1;;;;;43657:27:0;;;;;;;;;;;41597:2148;;;;;:::o;5643:317::-;5758:6;5733:21;:31;;5725:73;;;;-1:-1:-1;;;5725:73:0;;16640:2:1;5725:73:0;;;16622:21:1;16679:2;16659:18;;;16652:30;16718:31;16698:18;;;16691:59;16767:18;;5725:73:0;16612:179:1;5725:73:0;5812:12;5830:9;-1:-1:-1;;;;;5830:14:0;5852:6;5830:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5811:52;;;5882:7;5874:78;;;;-1:-1:-1;;;5874:78:0;;16213:2:1;5874:78:0;;;16195:21:1;16252:2;16232:18;;;16225:30;16291:34;16271:18;;;16264:62;16362:28;16342:18;;;16335:56;16408:19;;5874:78:0;16185:248:1;31868:1232:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;32011:7:0;;52618:1;32060:23;32056:977;;32113:13;;32106:4;:20;32102:931;;;32151:31;32185:17;;;:11;:17;;;;;;;;;32151:51;;;;;;;;;-1:-1:-1;;;;;32151:51:0;;;;-1:-1:-1;;;32151:51:0;;;;;;;;;;;-1:-1:-1;;;32151:51:0;;;;;;;;;;;;;;32225:789;;32279:14;;-1:-1:-1;;;;;32279:28:0;;32275:109;;32347:9;31868:1232;-1:-1:-1;;;31868:1232:0:o;32275:109::-;-1:-1:-1;;;32750:6:0;32799:17;;;;:11;:17;;;;;;;;;32787:29;;;;;;;;;-1:-1:-1;;;;;32787:29:0;;;;;-1:-1:-1;;;32787:29:0;;;;;;;;;;;-1:-1:-1;;;32787:29:0;;;;;;;;;;;;;32851:28;32847:117;;32923:9;31868:1232;-1:-1:-1;;;31868:1232:0:o;32847:117::-;32706:285;;;32102:931;;33061:31;;-1:-1:-1;;;33061:31:0;;;;;;;;;;;3297:191;3390:6;;;-1:-1:-1;;;;;3407:17:0;;;-1:-1:-1;;;;;;3407:17:0;;;;;;;3440:40;;3390:6;;;3407:17;3390:6;;3440:40;;3371:16;;3440:40;3297:191;;:::o;47059:831::-;47256:171;;-1:-1:-1;;;47256:171:0;;47222:4;;-1:-1:-1;;;;;47256:45:0;;;;;:171;;49792:10;;47358:4;;47381:7;;47407:5;;47256:171;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47256:171:0;;;;;;;;-1:-1:-1;;47256:171:0;;;;;;;;;;;;:::i;:::-;;;47239:644;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47641:13:0;;47637:235;;47687:40;;-1:-1:-1;;;47687:40:0;;;;;;;;;;;47637:235;47830:6;47824:13;47815:6;47811:2;47807:15;47800:38;47239:644;-1:-1:-1;;;;;;47500:81:0;-1:-1:-1;;;47500:81:0;;-1:-1:-1;47239:644:0;47059:831;;;;;;:::o;12023:723::-;12079:13;12300:10;12296:53;;-1:-1:-1;;12327:10:0;;;;;;;;;;;;-1:-1:-1;;;12327:10:0;;;;;12023:723::o;12296:53::-;12374:5;12359:12;12415:78;12422:9;;12415:78;;12448:8;;;;:::i;:::-;;-1:-1:-1;12471:10:0;;-1:-1:-1;12479:2:0;12471:10;;:::i;:::-;;;12415:78;;;12503:19;12535:6;12525:17;;;;;;-1:-1:-1;;;12525:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12525:17:0;;12503:39;;12553:154;12560:10;;12553:154;;12587:11;12597:1;12587:11;;:::i;:::-;;-1:-1:-1;12656:10:0;12664:2;12656:5;:10;:::i;:::-;12643:24;;:2;:24;:::i;:::-;12630:39;;12613:6;12620;12613:14;;;;;;-1:-1:-1;;;12613:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;12613:56:0;;;;;;;;-1:-1:-1;12684:11:0;12693:2;12684:11;;:::i;:::-;;;12553:154;;15248:701;15331:7;15374:4;15331:7;15389:523;15413:5;:12;15409:1;:16;15389:523;;;15447:20;15470:5;15476:1;15470:8;;;;;;-1:-1:-1;;;15470:8:0;;;;;;;;;;;;;;;15447:31;;15513:12;15497;:28;15493:408;;15650:44;;;;;;9576:19:1;;;9611:12;;;9604:28;;;9648:12;;15650:44:0;;;;;;;;;;;;15640:55;;;;;;15625:70;;15493:408;;;15840:44;;;;;;9576:19:1;;;9611:12;;;9604:28;;;9648:12;;15840:44:0;;;;;;;;;;;;15830:55;;;;;;15815:70;;15493:408;-1:-1:-1;15427:3:0;;;;:::i;:::-;;;;15389:523;;;-1:-1:-1;15929:12:0;15248:701;-1:-1:-1;;;15248:701:0:o;37967:1944::-;38090:20;38113:13;-1:-1:-1;;;;;38141:16:0;;38137:48;;38166:19;;-1:-1:-1;;;38166:19:0;;;;;;;;;;;38137:48;38200:13;38196:44;;38222:18;;-1:-1:-1;;;38222:18:0;;;;;;;;;;;38196:44;-1:-1:-1;;;;;38591:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;38650:49:0;;38591:44;;;;;;;;38650:49;;;-1:-1:-1;;;;;38591:44:0;;;;;;38650:49;;;;;;;;;;;;;;;;38716:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;38766:66:0;;;-1:-1:-1;;;38816:15:0;38766:66;;;;;;;;;;;;;38716:25;;38913:23;;;;38957:14;:19;38953:826;;38997:504;39028:38;;39053:12;;-1:-1:-1;;;;;39028:38:0;;;39045:1;;39028:38;;39045:1;;39028:38;39120:212;39189:1;39222:2;39255:14;;;;;;39300:5;39120:30;:212::i;:::-;39089:365;;39390:40;;-1:-1:-1;;;39390:40:0;;;;;;;;;;;39089:365;39496:3;39481:12;:18;38997:504;;39582:12;39565:13;;:29;39561:43;;39596:8;;;39561:43;38953:826;;;39645:119;39676:40;;39701:14;;;;;-1:-1:-1;;;;;39676:40:0;;;39693:1;;39676:40;;39693:1;;39676:40;39759:3;39744:12;:18;39645:119;;38953:826;-1:-1:-1;39793:13:0;:28;;;39843:60;;39876:2;39880:12;39894:8;39843:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:196::-;493:20;;-1:-1:-1;;;;;542:54:1;;532:65;;522:2;;611:1;608;601:12;522:2;474:147;;;:::o;626:693::-;680:5;733:3;726:4;718:6;714:17;710:27;700:2;;755:5;748;741:20;700:2;795:6;782:20;821:4;845:60;861:43;901:2;861:43;:::i;:::-;845:60;:::i;:::-;927:3;951:2;946:3;939:15;979:2;974:3;970:12;963:19;;1014:2;1006:6;1002:15;1066:3;1061:2;1055;1052:1;1048:10;1040:6;1036:23;1032:32;1029:41;1026:2;;;1087:5;1080;1073:20;1026:2;1113:5;1127:163;1141:2;1138:1;1135:9;1127:163;;;1198:17;;1186:30;;1236:12;;;;1268;;;;1159:1;1152:9;1127:163;;;-1:-1:-1;1308:5:1;;690:629;-1:-1:-1;;;;;;;690:629:1:o;1324:160::-;1389:20;;1445:13;;1438:21;1428:32;;1418:2;;1474:1;1471;1464:12;1489:163;1556:20;;1616:10;1605:22;;1595:33;;1585:2;;1642:1;1639;1632:12;1657:196;1716:6;1769:2;1757:9;1748:7;1744:23;1740:32;1737:2;;;1790:6;1782;1775:22;1737:2;1818:29;1837:9;1818:29;:::i;:::-;1808:39;1727:126;-1:-1:-1;;;1727:126:1:o;1858:270::-;1926:6;1934;1987:2;1975:9;1966:7;1962:23;1958:32;1955:2;;;2008:6;2000;1993:22;1955:2;2036:29;2055:9;2036:29;:::i;:::-;2026:39;;2084:38;2118:2;2107:9;2103:18;2084:38;:::i;:::-;2074:48;;1945:183;;;;;:::o;2133:338::-;2210:6;2218;2226;2279:2;2267:9;2258:7;2254:23;2250:32;2247:2;;;2300:6;2292;2285:22;2247:2;2328:29;2347:9;2328:29;:::i;:::-;2318:39;;2376:38;2410:2;2399:9;2395:18;2376:38;:::i;:::-;2366:48;;2461:2;2450:9;2446:18;2433:32;2423:42;;2237:234;;;;;:::o;2476:696::-;2571:6;2579;2587;2595;2648:3;2636:9;2627:7;2623:23;2619:33;2616:2;;;2670:6;2662;2655:22;2616:2;2698:29;2717:9;2698:29;:::i;:::-;2688:39;;2746:38;2780:2;2769:9;2765:18;2746:38;:::i;:::-;2736:48;;2831:2;2820:9;2816:18;2803:32;2793:42;;2886:2;2875:9;2871:18;2858:32;2913:18;2905:6;2902:30;2899:2;;;2950:6;2942;2935:22;2899:2;2978:22;;3031:4;3023:13;;3019:27;-1:-1:-1;3009:2:1;;3065:6;3057;3050:22;3009:2;3093:73;3158:7;3153:2;3140:16;3135:2;3131;3127:11;3093:73;:::i;:::-;3083:83;;;2606:566;;;;;;;:::o;3177:264::-;3242:6;3250;3303:2;3291:9;3282:7;3278:23;3274:32;3271:2;;;3324:6;3316;3309:22;3271:2;3352:29;3371:9;3352:29;:::i;:::-;3342:39;;3400:35;3431:2;3420:9;3416:18;3400:35;:::i;3446:264::-;3514:6;3522;3575:2;3563:9;3554:7;3550:23;3546:32;3543:2;;;3596:6;3588;3581:22;3543:2;3624:29;3643:9;3624:29;:::i;:::-;3614:39;3700:2;3685:18;;;;3672:32;;-1:-1:-1;;;3533:177:1:o;3715:1212::-;3833:6;3841;3894:2;3882:9;3873:7;3869:23;3865:32;3862:2;;;3915:6;3907;3900:22;3862:2;3960:9;3947:23;3989:18;4030:2;4022:6;4019:14;4016:2;;;4051:6;4043;4036:22;4016:2;4094:6;4083:9;4079:22;4069:32;;4139:7;4132:4;4128:2;4124:13;4120:27;4110:2;;4166:6;4158;4151:22;4110:2;4207;4194:16;4229:4;4253:60;4269:43;4309:2;4269:43;:::i;4253:60::-;4335:3;4359:2;4354:3;4347:15;4387:2;4382:3;4378:12;4371:19;;4418:2;4414;4410:11;4466:7;4461:2;4455;4452:1;4448:10;4444:2;4440:19;4436:28;4433:41;4430:2;;;4492:6;4484;4477:22;4430:2;4519:6;4510:15;;4534:169;4548:2;4545:1;4542:9;4534:169;;;4605:23;4624:3;4605:23;:::i;:::-;4593:36;;4566:1;4559:9;;;;;4649:12;;;;4681;;4534:169;;;-1:-1:-1;4722:5:1;-1:-1:-1;;4765:18:1;;4752:32;;-1:-1:-1;;4796:16:1;;;4793:2;;;4830:6;4822;4815:22;4793:2;;4858:63;4913:7;4902:8;4891:9;4887:24;4858:63;:::i;:::-;4848:73;;;3852:1075;;;;;:::o;4932:258::-;4997:6;5005;5058:2;5046:9;5037:7;5033:23;5029:32;5026:2;;;5079:6;5071;5064:22;5026:2;5107:26;5123:9;5107:26;:::i;5195:548::-;5270:6;5278;5331:2;5319:9;5310:7;5306:23;5302:32;5299:2;;;5352:6;5344;5337:22;5299:2;5380:26;5396:9;5380:26;:::i;:::-;5370:36;;5457:2;5446:9;5442:18;5429:32;5484:18;5476:6;5473:30;5470:2;;;5521:6;5513;5506:22;5470:2;5549:22;;5602:4;5594:13;;5590:27;-1:-1:-1;5580:2:1;;5636:6;5628;5621:22;5580:2;5664:73;5729:7;5724:2;5711:16;5706:2;5702;5698:11;5664:73;:::i;6011:403::-;6092:6;6100;6108;6116;6169:3;6157:9;6148:7;6144:23;6140:33;6137:2;;;6191:6;6183;6176:22;6137:2;6219:26;6235:9;6219:26;:::i;:::-;6209:36;;6292:2;6281:9;6277:18;6264:32;6254:42;;6315:37;6348:2;6337:9;6333:18;6315:37;:::i;:::-;6305:47;;6371:37;6404:2;6393:9;6389:18;6371:37;:::i;:::-;6361:47;;6127:287;;;;;;;:::o;6419:255::-;6477:6;6530:2;6518:9;6509:7;6505:23;6501:32;6498:2;;;6551:6;6543;6536:22;6498:2;6595:9;6582:23;6614:30;6638:5;6614:30;:::i;6679:259::-;6748:6;6801:2;6789:9;6780:7;6776:23;6772:32;6769:2;;;6822:6;6814;6807:22;6769:2;6859:9;6853:16;6878:30;6902:5;6878:30;:::i;6943:190::-;7002:6;7055:2;7043:9;7034:7;7030:23;7026:32;7023:2;;;7076:6;7068;7061:22;7023:2;-1:-1:-1;7104:23:1;;7013:120;-1:-1:-1;7013:120:1:o;7138:194::-;7208:6;7261:2;7249:9;7240:7;7236:23;7232:32;7229:2;;;7282:6;7274;7267:22;7229:2;-1:-1:-1;7310:16:1;;7219:113;-1:-1:-1;7219:113:1:o;7337:258::-;7405:6;7413;7466:2;7454:9;7445:7;7441:23;7437:32;7434:2;;;7487:6;7479;7472:22;7434:2;-1:-1:-1;;7515:23:1;;;7585:2;7570:18;;;7557:32;;-1:-1:-1;7424:171:1:o;7600:268::-;7667:6;7675;7728:2;7716:9;7707:7;7703:23;7699:32;7696:2;;;7749:6;7741;7734:22;7696:2;7777:28;7795:9;7777:28;:::i;7873:737::-;7967:6;7975;7983;8036:2;8024:9;8015:7;8011:23;8007:32;8004:2;;;8057:6;8049;8042:22;8004:2;8085:28;8103:9;8085:28;:::i;:::-;8075:38;;8164:2;8153:9;8149:18;8136:32;8187:18;8228:2;8220:6;8217:14;8214:2;;;8249:6;8241;8234:22;8214:2;8292:6;8281:9;8277:22;8267:32;;8337:7;8330:4;8326:2;8322:13;8318:27;8308:2;;8364:6;8356;8349:22;8308:2;8409;8396:16;8435:2;8427:6;8424:14;8421:2;;;8456:6;8448;8441:22;8421:2;8514:7;8509:2;8499:6;8496:1;8492:14;8488:2;8484:23;8480:32;8477:45;8474:2;;;8540:6;8532;8525:22;8474:2;8576;8572;8568:11;8558:21;;8598:6;8588:16;;;;;7994:616;;;;;:::o;8615:257::-;8656:3;8694:5;8688:12;8721:6;8716:3;8709:19;8737:63;8793:6;8786:4;8781:3;8777:14;8770:4;8763:5;8759:16;8737:63;:::i;:::-;8854:2;8833:15;-1:-1:-1;;8829:29:1;8820:39;;;;8861:4;8816:50;;8664:208;-1:-1:-1;;8664:208:1:o;8877:185::-;8919:3;8957:5;8951:12;8972:52;9017:6;9012:3;9005:4;8998:5;8994:16;8972:52;:::i;:::-;9040:16;;;;;8927:135;-1:-1:-1;;8927:135:1:o;9671:1305::-;9948:3;9977;10012:6;10006:13;10042:3;10064:1;10092:9;10088:2;10084:18;10074:28;;10152:2;10141:9;10137:18;10174;10164:2;;10218:4;10210:6;10206:17;10196:27;;10164:2;10244;10292;10284:6;10281:14;10261:18;10258:38;10255:2;;;-1:-1:-1;;;10319:33:1;;10375:4;10372:1;10365:15;10405:4;10326:3;10393:17;10255:2;10436:18;10463:104;;;;10581:1;10576:322;;;;10429:469;;10463:104;-1:-1:-1;;10496:24:1;;10484:37;;10541:16;;;;-1:-1:-1;10463:104:1;;10576:322;22208:4;22227:17;;;22277:4;22261:21;;10671:3;10687:165;10701:6;10698:1;10695:13;10687:165;;;10779:14;;10766:11;;;10759:35;10822:16;;;;10716:10;;10687:165;;;10691:3;;10881:6;10876:3;10872:16;10865:23;;10429:469;;;;;;;10914:56;10939:30;10965:3;10957:6;10939:30;:::i;:::-;-1:-1:-1;;;9127:20:1;;9172:1;9163:11;;9117:63;10914:56;10907:63;9956:1020;-1:-1:-1;;;;;9956:1020:1:o;11422:511::-;11616:4;-1:-1:-1;;;;;11726:2:1;11718:6;11714:15;11703:9;11696:34;11778:2;11770:6;11766:15;11761:2;11750:9;11746:18;11739:43;;11818:6;11813:2;11802:9;11798:18;11791:34;11861:3;11856:2;11845:9;11841:18;11834:31;11882:45;11922:3;11911:9;11907:19;11899:6;11882:45;:::i;:::-;11874:53;11625:308;-1:-1:-1;;;;;;11625:308:1:o;12240:1207::-;12508:2;12520:21;;;12590:13;;12493:18;;;12612:22;;;12460:4;;12687;;12665:2;12650:18;;;12714:15;;;12460:4;12760:218;12774:6;12771:1;12768:13;12760:218;;;12839:13;;-1:-1:-1;;;;;12835:62:1;12823:75;;12918:12;;;;12953:15;;;;12796:1;12789:9;12760:218;;;-1:-1:-1;;;13014:19:1;;;12994:18;;;12987:47;13084:13;;13106:21;;;13182:15;;;;13145:12;;;13217:4;13230:189;13246:8;13241:3;13238:17;13230:189;;;13315:15;;13301:30;;13392:17;;;;13353:14;;;;13274:1;13265:11;13230:189;;13644:219;13793:2;13782:9;13775:21;13756:4;13813:44;13853:2;13842:9;13838:18;13830:6;13813:44;:::i;18193:356::-;18395:2;18377:21;;;18414:18;;;18407:30;18473:34;18468:2;18453:18;;18446:62;18540:2;18525:18;;18367:182::o;21693:275::-;21764:2;21758:9;21829:2;21810:13;;-1:-1:-1;;21806:27:1;21794:40;;21864:18;21849:34;;21885:22;;;21846:62;21843:2;;;21911:18;;:::i;:::-;21947:2;21940:22;21738:230;;-1:-1:-1;21738:230:1:o;21973:183::-;22033:4;22066:18;22058:6;22055:30;22052:2;;;22088:18;;:::i;:::-;-1:-1:-1;22133:1:1;22129:14;22145:4;22125:25;;22042:114::o;22293:128::-;22333:3;22364:1;22360:6;22357:1;22354:13;22351:2;;;22370:18;;:::i;:::-;-1:-1:-1;22406:9:1;;22341:80::o;22426:120::-;22466:1;22492;22482:2;;22497:18;;:::i;:::-;-1:-1:-1;22531:9:1;;22472:74::o;22551:168::-;22591:7;22657:1;22653;22649:6;22645:14;22642:1;22639:21;22634:1;22627:9;22620:17;22616:45;22613:2;;;22664:18;;:::i;:::-;-1:-1:-1;22704:9:1;;22603:116::o;22724:125::-;22764:4;22792:1;22789;22786:8;22783:2;;;22797:18;;:::i;:::-;-1:-1:-1;22834:9:1;;22773:76::o;22854:258::-;22926:1;22936:113;22950:6;22947:1;22944:13;22936:113;;;23026:11;;;23020:18;23007:11;;;23000:39;22972:2;22965:10;22936:113;;;23067:6;23064:1;23061:13;23058:2;;;-1:-1:-1;;23102:1:1;23084:16;;23077:27;22907:205::o;23117:380::-;23196:1;23192:12;;;;23239;;;23260:2;;23314:4;23306:6;23302:17;23292:27;;23260:2;23367;23359:6;23356:14;23336:18;23333:38;23330:2;;;23413:10;23408:3;23404:20;23401:1;23394:31;23448:4;23445:1;23438:15;23476:4;23473:1;23466:15;23330:2;;23172:325;;;:::o;23502:135::-;23541:3;-1:-1:-1;;23562:17:1;;23559:2;;;23582:18;;:::i;:::-;-1:-1:-1;23629:1:1;23618:13;;23549:88::o;23642:112::-;23674:1;23700;23690:2;;23705:18;;:::i;:::-;-1:-1:-1;23739:9:1;;23680:74::o;23759:127::-;23820:10;23815:3;23811:20;23808:1;23801:31;23851:4;23848:1;23841:15;23875:4;23872:1;23865:15;23891:127;23952:10;23947:3;23943:20;23940:1;23933:31;23983:4;23980:1;23973:15;24007:4;24004:1;23997:15;24023:127;24084:10;24079:3;24075:20;24072:1;24065:31;24115:4;24112:1;24105:15;24139:4;24136:1;24129:15;24155:131;-1:-1:-1;;;;;;24229:32:1;;24219:43;;24209:2;;24276:1;24273;24266:12

Swarm Source

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