ETH Price: $2,285.87 (-3.43%)
Gas: 4.17 Gwei

Token

Mooncat Punks (MEOW)
 

Overview

Max Total Supply

12 MEOW

Holders

9

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
virtualalaska.eth
Balance
1 MEOW
0x454685DEC7796c2c747294F7AA7a30b2C5Ab05F7
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:
MooncatPunks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-07
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/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) {
        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));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

// File: @openzeppelin/contracts/utils/Counters.sol



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/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/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/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() {
        _setOwner(_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 {
    //    _setOwner(address(0));
    //}

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

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

// File: @openzeppelin/contracts/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/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/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/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    //function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

    /**
     * @dev Edit for rawOwnerOf token
     */
    function rawOwnerOf(uint256 tokenId) public view returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

    /**
     * @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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * Team QaziPolo
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);
        address to = address(0);

        _beforeTokenTransfer(owner, to, tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, to, tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}
// File: ERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    //function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
    //    require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
    //    return _ownedTokens[owner][index];
    //}

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

pragma solidity ^0.8.0;
pragma abicoder v2;

contract MooncatPunks is ERC721Enumerable, Ownable {

    using SafeMath for uint256;

    address private owner_;
    uint256 private tokenId;
    bytes32 public merkleRoot;
	bytes32 public merkleRootVIP;
	address private wallet1 = 0xfe0C6901744105F9C6FB78536cD242abEb957334;
    address private Authorized = 0x3a5a8C267134d389157fCD1a497fC13B9C3a5CFf;


    uint256 public MCPPrice_whitelist = 7500000000000000;
	uint256 public MCPPrice_public = 15000000000000000;
    uint public maxMCPTx = 20;
	uint public maxMCPPurchase = 20;
    uint public maxMCPPurchaseWl = 20;
    uint public maxMCPPurchaseVip = 20;

    uint256 public constant MAX_MCP = 6969;
    uint public MCPReserve = 100;
	uint public MCPWhitelistReserve = 6969;


    bool public whitelistSaleIsActive = false;
	bool public publicSaleIsActive = false;
    mapping(address => uint) private max_whitelist_mints_per_address;

	



    string public baseTokenURI;

    constructor() ERC721("Mooncat Punks", "MEOW") { }

    modifier onlyAuthorized {
        require(_msgSender() == owner() || _msgSender() == Authorized , "Not authorized");
        _;
    }

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

    function reserveMCP(address _to, uint256 _reserveAmount) public onlyAuthorized {
        uint supply = totalSupply();
        require(_reserveAmount > 0 && _reserveAmount <= MCPReserve, "Not enough reserve");
        for (uint i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i + 1);
        }
        MCPReserve = MCPReserve.sub(_reserveAmount);
    }


    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    function setBaseURI(string memory baseURI) public onlyAuthorized {
        baseTokenURI = baseURI;
    }


    function flipPublicSaleState() public onlyAuthorized {
        publicSaleIsActive = !publicSaleIsActive;
    }

	 function flipWPSaleState() public onlyAuthorized {
        whitelistSaleIsActive = !whitelistSaleIsActive;
    }


     function mint(uint numberOfTokens) public payable {
        require(publicSaleIsActive, "Sale not active");
        require(numberOfTokens > 0 && numberOfTokens <= maxMCPTx, "Max pTX reached");
        require(msg.value == MCPPrice_public.mul(numberOfTokens), "Check ETH");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            if (totalSupply() < MAX_MCP) {
                _safeMint(msg.sender, totalSupply()+1);
                max_whitelist_mints_per_address[msg.sender] = max_whitelist_mints_per_address[msg.sender].add(1);
            } else {
               publicSaleIsActive = !publicSaleIsActive;
                payable(msg.sender).transfer(numberOfTokens.sub(i).mul(MCPPrice_public));
                break;
            }
        }
    }


   // to set the merkle root
    function updateMerkleRoot(bytes32 newmerkleRoot) external onlyAuthorized {
        merkleRoot = newmerkleRoot;
     
    }

	function mintWhitelist(uint numberOfTokens, bytes32[] calldata merkleProof ) payable external  {
        address user_ = msg.sender;
		require(whitelistSaleIsActive, "WL sale not active");
        require(numberOfTokens > 0 && numberOfTokens <= 20, "20 pTX allowed");
        require(msg.value == MCPPrice_whitelist.mul(numberOfTokens), "Check ETH");
        require(max_whitelist_mints_per_address[msg.sender].add(numberOfTokens) <= maxMCPPurchaseVip,"Max whitelist mints pW reached");

        // Verify the merkle proof
        require(MerkleProof.verify(merkleProof, merkleRoot,  keccak256(abi.encodePacked(user_))  ), "Check proof");

		for(uint i = 0; i < numberOfTokens; i++) {
            if (totalSupply() < MAX_MCP) {
                _safeMint(msg.sender, totalSupply()+1);
                max_whitelist_mints_per_address[msg.sender] = max_whitelist_mints_per_address[msg.sender].add(1);
            }
			else {
               whitelistSaleIsActive = !whitelistSaleIsActive;
                payable(msg.sender).transfer(numberOfTokens.sub(i).mul(MCPPrice_whitelist));
                break;
            }
		}


       
    }

    function withdrawAll() external onlyOwner {
        require(address(this).balance > 0, "No balance");
        uint256 _amount = address(this).balance;
        (bool wallet1Success, ) = wallet1.call{value: _amount.mul(100).div(100)}("");

        require(wallet1Success, "Withdrawal failed.");
    }

    function setPriceWL(uint256 newPriceWL) public onlyAuthorized {
        MCPPrice_whitelist = newPriceWL;
    }

    function setPrice(uint256 newPrice) public onlyAuthorized {
        MCPPrice_public = newPrice;
    }

   function setMaxMCPTx(uint256 newMaxMCPTx) public onlyAuthorized {
        maxMCPTx = newMaxMCPTx;
    }

   function setMaxMCPPurchase(uint256 newMaxMCPPurchase) public onlyAuthorized {
        maxMCPPurchase = newMaxMCPPurchase;
    }

  function setMaxMCPPurchaseWl(uint256 newMaxMCPPurchaseWl) public onlyAuthorized {
            maxMCPPurchaseWl = newMaxMCPPurchaseWl;
        }

  function setMaxMCPPurchaseVip(uint256 newMaxMCPPurchaseVip) public onlyAuthorized {
                    maxMCPPurchaseVip = newMaxMCPPurchaseVip;
                } 

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MCP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCPPrice_public","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCPPrice_whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCPReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCPWhitelistReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWPSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMCPPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMCPPurchaseVip","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMCPPurchaseWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMCPTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootVIP","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rawOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveMCP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMCPPurchase","type":"uint256"}],"name":"setMaxMCPPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMCPPurchaseVip","type":"uint256"}],"name":"setMaxMCPPurchaseVip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMCPPurchaseWl","type":"uint256"}],"name":"setMaxMCPPurchaseWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMCPTx","type":"uint256"}],"name":"setMaxMCPTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceWL","type":"uint256"}],"name":"setPriceWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"bytes32","name":"newmerkleRoot","type":"bytes32"}],"name":"updateMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600f80546001600160a01b031990811673fe0c6901744105f9c6fb78536cd242abeb9573341790915560108054909116733a5a8c267134d389157fcd1a497fc13b9c3a5cff179055661aa535d3d0c00060115566354a6ba7a180006012556014601381905580805560158190556016556064601755611b396018556019805461ffff191690553480156200009757600080fd5b50604080518082018252600d81526c4d6f6f6e6361742050756e6b7360981b6020808301918252835180850190945260048452634d454f5760e01b908401528151919291620000e99160009162000178565b508051620000ff90600190602084019062000178565b5050506200011c620001166200012260201b60201c565b62000126565b6200025b565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000186906200021e565b90600052602060002090601f016020900481019282620001aa5760008555620001f5565b82601f10620001c557805160ff1916838001178555620001f5565b82800160010185558215620001f5579182015b82811115620001f5578251825591602001919060010190620001d8565b506200020392915062000207565b5090565b5b8082111562000203576000815560010162000208565b600181811c908216806200023357607f821691505b602082108114156200025557634e487b7160e01b600052602260045260246000fd5b50919050565b612b53806200026b6000396000f3fe6080604052600436106102885760003560e01c80637de9784c1161015a578063a0712d68116100c1578063d547cfb71161007a578063d547cfb714610740578063e985e9c514610755578063ec63d8f91461079e578063eca21757146107b4578063f2fde38b146107d4578063f6efe0ed146107f457600080fd5b8063a0712d6814610698578063a10866ef146106ab578063a22cb465146106c0578063a5cc39a1146106e0578063b88d4fde14610700578063c87b56dd1461072057600080fd5b8063853828b611610113578063853828b614610604578063865506ad146106195780638da5cb5b1461062f57806391b7f5ed1461064d57806395d89b411461066d5780639c20a5d71461068257600080fd5b80637de9784c1461054c5780637f5da878146105625780637f81be691461058257806381d8488f146105b857806383000718146105d857806384d53d28146105ee57600080fd5b80633ccfd60b116101fe5780636352211e116101b75780636352211e146104a057806367fbc385146104c05780636fab43fc146104d657806370a08231146104f657806371df600e14610516578063787f93d81461053657600080fd5b80633ccfd60b146103f55780633f73fc6c1461040a57806342842e0e146104205780634783f0ef146104405780634f6ccce71461046057806355f804b31461048057600080fd5b80630fcf2e75116102505780630fcf2e751461035157806310b5454d1461037057806318160ddd1461038a5780631a40ad9f146103a957806323b872dd146103bf5780632eb4a7ab146103df57600080fd5b806301ffc9a71461028d578063061431a8146102c257806306fdde03146102d7578063081812fc146102f9578063095ea7b314610331575b600080fd5b34801561029957600080fd5b506102ad6102a83660046126e4565b610809565b60405190151581526020015b60405180910390f35b6102d56102d0366004612767565b610834565b005b3480156102e357600080fd5b506102ec610b12565b6040516102b9919061288e565b34801561030557600080fd5b506103196103143660046126cb565b610ba4565b6040516001600160a01b0390911681526020016102b9565b34801561033d57600080fd5b506102d561034c3660046126a1565b610c39565b34801561035d57600080fd5b506019546102ad90610100900460ff1681565b34801561037c57600080fd5b506019546102ad9060ff1681565b34801561039657600080fd5b506008545b6040519081526020016102b9565b3480156103b557600080fd5b5061039b611b3981565b3480156103cb57600080fd5b506102d56103da3660046125ad565b610d4f565b3480156103eb57600080fd5b5061039b600d5481565b34801561040157600080fd5b506102d5610d80565b34801561041657600080fd5b5061039b60175481565b34801561042c57600080fd5b506102d561043b3660046125ad565b610ddd565b34801561044c57600080fd5b506102d561045b3660046126cb565b610df8565b34801561046c57600080fd5b5061039b61047b3660046126cb565b610e45565b34801561048c57600080fd5b506102d561049b36600461271e565b610ed8565b3480156104ac57600080fd5b506103196104bb3660046126cb565b610f33565b3480156104cc57600080fd5b5061039b600e5481565b3480156104e257600080fd5b506102d56104f13660046126cb565b610faa565b34801561050257600080fd5b5061039b61051136600461255f565b610ff7565b34801561052257600080fd5b506102d56105313660046126cb565b61107e565b34801561054257600080fd5b5061039b60145481565b34801561055857600080fd5b5061039b60115481565b34801561056e57600080fd5b506102d561057d3660046126a1565b6110cb565b34801561058e57600080fd5b5061031961059d3660046126cb565b6000908152600260205260409020546001600160a01b031690565b3480156105c457600080fd5b506102d56105d33660046126cb565b6111b4565b3480156105e457600080fd5b5061039b60185481565b3480156105fa57600080fd5b5061039b60135481565b34801561061057600080fd5b506102d5611201565b34801561062557600080fd5b5061039b60165481565b34801561063b57600080fd5b50600a546001600160a01b0316610319565b34801561065957600080fd5b506102d56106683660046126cb565b611315565b34801561067957600080fd5b506102ec611362565b34801561068e57600080fd5b5061039b60155481565b6102d56106a63660046126cb565b611371565b3480156106b757600080fd5b506102d5611517565b3480156106cc57600080fd5b506102d56106db366004612665565b61157c565b3480156106ec57600080fd5b506102d56106fb3660046126cb565b611641565b34801561070c57600080fd5b506102d561071b3660046125e9565b61168e565b34801561072c57600080fd5b506102ec61073b3660046126cb565b6116c6565b34801561074c57600080fd5b506102ec6117a1565b34801561076157600080fd5b506102ad61077036600461257a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107aa57600080fd5b5061039b60125481565b3480156107c057600080fd5b506102d56107cf3660046126cb565b61182f565b3480156107e057600080fd5b506102d56107ef36600461255f565b61187c565b34801561080057600080fd5b506102d5611917565b60006001600160e01b03198216632bbd609d60e11b148061082e575061082e82611973565b92915050565b601954339060ff166108825760405162461bcd60e51b8152602060048201526012602482015271574c2073616c65206e6f742061637469766560701b60448201526064015b60405180910390fd5b600084118015610893575060148411155b6108d05760405162461bcd60e51b815260206004820152600e60248201526d0c8c081c151608185b1b1bddd95960921b6044820152606401610879565b6011546108dd90856119c3565b34146109175760405162461bcd60e51b8152602060048201526009602482015268086d0cac6d6408aa8960bb1b6044820152606401610879565b601654336000908152601a602052604090205461093490866119cf565b11156109825760405162461bcd60e51b815260206004820152601e60248201527f4d61782077686974656c697374206d696e7473207057207265616368656400006044820152606401610879565b6109f883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff19606088901b1660208201529092506034019050604051602081830303815290604052805190602001206119db565b610a325760405162461bcd60e51b815260206004820152600b60248201526a21b432b1b590383937b7b360a91b6044820152606401610879565b60005b84811015610b0b57611b39610a4960085490565b1015610a9c57610a6c33610a5c60085490565b610a679060016129a1565b611a8a565b336000908152601a6020526040902054610a879060016119cf565b336000908152601a6020526040902055610af9565b6019805460ff19811660ff9091161517905560115433906108fc90610acb90610ac58986611aa4565b906119c3565b6040518115909202916000818181858888f19350505050158015610af3573d6000803e3d6000fd5b50610b0b565b80610b0381612a6a565b915050610a35565b5050505050565b606060008054610b2190612a2f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4d90612a2f565b8015610b9a5780601f10610b6f57610100808354040283529160200191610b9a565b820191906000526020600020905b815481529060010190602001808311610b7d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c1d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610879565b506000908152600460205260409020546001600160a01b031690565b6000610c4482610f33565b9050806001600160a01b0316836001600160a01b03161415610cb25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610879565b336001600160a01b0382161480610cce5750610cce8133610770565b610d405760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610879565b610d4a8383611ab0565b505050565b610d593382611b1e565b610d755760405162461bcd60e51b815260040161087990612928565b610d4a838383611c15565b600a546001600160a01b03163314610daa5760405162461bcd60e51b8152600401610879906128f3565b6040514790339082156108fc029083906000818181858888f19350505050158015610dd9573d6000803e3d6000fd5b5050565b610d4a8383836040518060200160405280600081525061168e565b600a546001600160a01b0316331480610e2457506010546001600160a01b0316336001600160a01b0316145b610e405760405162461bcd60e51b815260040161087990612979565b600d55565b6000610e5060085490565b8210610eb35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610879565b60088281548110610ec657610ec6612adb565b90600052602060002001549050919050565b600a546001600160a01b0316331480610f0457506010546001600160a01b0316336001600160a01b0316145b610f205760405162461bcd60e51b815260040161087990612979565b8051610dd990601b906020840190612434565b6000818152600260205260408120546001600160a01b03168061082e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610879565b600a546001600160a01b0316331480610fd657506010546001600160a01b0316336001600160a01b0316145b610ff25760405162461bcd60e51b815260040161087990612979565b601555565b60006001600160a01b0382166110625760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610879565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314806110aa57506010546001600160a01b0316336001600160a01b0316145b6110c65760405162461bcd60e51b815260040161087990612979565b601655565b600a546001600160a01b03163314806110f757506010546001600160a01b0316336001600160a01b0316145b6111135760405162461bcd60e51b815260040161087990612979565b600061111e60085490565b905060008211801561113257506017548211155b6111735760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f756768207265736572766560701b6044820152606401610879565b60005b8281101561119e5761118c84610a5c83856129a1565b8061119681612a6a565b915050611176565b506017546111ac9083611aa4565b601755505050565b600a546001600160a01b03163314806111e057506010546001600160a01b0316336001600160a01b0316145b6111fc5760405162461bcd60e51b815260040161087990612979565b601155565b600a546001600160a01b0316331461122b5760405162461bcd60e51b8152600401610879906128f3565b600047116112685760405162461bcd60e51b815260206004820152600a6024820152694e6f2062616c616e636560b01b6044820152606401610879565b600f5447906000906001600160a01b031661128e606461128885826119c3565b90611dc0565b604051600081818185875af1925050503d80600081146112ca576040519150601f19603f3d011682016040523d82523d6000602084013e6112cf565b606091505b5050905080610dd95760405162461bcd60e51b81526020600482015260126024820152712bb4ba34323930bbb0b6103330b4b632b21760711b6044820152606401610879565b600a546001600160a01b031633148061134157506010546001600160a01b0316336001600160a01b0316145b61135d5760405162461bcd60e51b815260040161087990612979565b601255565b606060018054610b2190612a2f565b601954610100900460ff166113ba5760405162461bcd60e51b815260206004820152600f60248201526e53616c65206e6f742061637469766560881b6044820152606401610879565b6000811180156113cc57506013548111155b61140a5760405162461bcd60e51b815260206004820152600f60248201526e13585e081c1516081c995858da1959608a1b6044820152606401610879565b60125461141790826119c3565b34146114515760405162461bcd60e51b8152602060048201526009602482015268086d0cac6d6408aa8960bb1b6044820152606401610879565b60005b81811015610dd957611b3961146860085490565b10156114ab5761147b33610a5c60085490565b336000908152601a60205260409020546114969060016119cf565b336000908152601a6020526040902055611505565b6019805461ff001981166101009182900460ff161590910217905560125433906108fc906114dd90610ac58686611aa4565b6040518115909202916000818181858888f19350505050158015610d4a573d6000803e3d6000fd5b8061150f81612a6a565b915050611454565b600a546001600160a01b031633148061154357506010546001600160a01b0316336001600160a01b0316145b61155f5760405162461bcd60e51b815260040161087990612979565b6019805461ff001981166101009182900460ff1615909102179055565b6001600160a01b0382163314156115d55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610879565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633148061166d57506010546001600160a01b0316336001600160a01b0316145b6116895760405162461bcd60e51b815260040161087990612979565b601355565b6116983383611b1e565b6116b45760405162461bcd60e51b815260040161087990612928565b6116c084848484611dcc565b50505050565b6000818152600260205260409020546060906001600160a01b03166117455760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610879565b600061174f611dff565b9050600081511161176f576040518060200160405280600081525061179a565b8061177984611e0e565b60405160200161178a929190612812565b6040516020818303038152906040525b9392505050565b601b80546117ae90612a2f565b80601f01602080910402602001604051908101604052809291908181526020018280546117da90612a2f565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b505050505081565b600a546001600160a01b031633148061185b57506010546001600160a01b0316336001600160a01b0316145b6118775760405162461bcd60e51b815260040161087990612979565b601455565b600a546001600160a01b031633146118a65760405162461bcd60e51b8152600401610879906128f3565b6001600160a01b03811661190b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610879565b61191481611f0c565b50565b600a546001600160a01b031633148061194357506010546001600160a01b0316336001600160a01b0316145b61195f5760405162461bcd60e51b815260040161087990612979565b6019805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b14806119a457506001600160e01b03198216635b5e139f60e01b145b8061082e57506301ffc9a760e01b6001600160e01b031983161461082e565b600061179a82846129cd565b600061179a82846129a1565b600081815b8551811015611a7f5760008682815181106119fd576119fd612adb565b60200260200101519050808311611a3f576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611a6c565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611a7781612a6a565b9150506119e0565b509092149392505050565b610dd9828260405180602001604052806000815250611f5e565b600061179a82846129ec565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ae582610f33565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b975760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610879565b6000611ba283610f33565b9050806001600160a01b0316846001600160a01b03161480611bdd5750836001600160a01b0316611bd284610ba4565b6001600160a01b0316145b80611c0d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c2882610f33565b6001600160a01b031614611c905760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610879565b6001600160a01b038216611cf25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610879565b611cfd838383611f91565b611d08600082611ab0565b6001600160a01b0383166000908152600360205260408120805460019290611d319084906129ec565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d5f9084906129a1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061179a82846129b9565b611dd7848484611c15565b611de384848484612049565b6116c05760405162461bcd60e51b8152600401610879906128a1565b6060601b8054610b2190612a2f565b606081611e325750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e5c5780611e4681612a6a565b9150611e559050600a836129b9565b9150611e36565b60008167ffffffffffffffff811115611e7757611e77612af1565b6040519080825280601f01601f191660200182016040528015611ea1576020820181803683370190505b5090505b8415611c0d57611eb66001836129ec565b9150611ec3600a86612a85565b611ece9060306129a1565b60f81b818381518110611ee357611ee3612adb565b60200101906001600160f81b031916908160001a905350611f05600a866129b9565b9450611ea5565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f688383612156565b611f756000848484612049565b610d4a5760405162461bcd60e51b8152600401610879906128a1565b6001600160a01b038316611fec57611fe781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61200f565b816001600160a01b0316836001600160a01b03161461200f5761200f83826122a4565b6001600160a01b03821661202657610d4a81612341565b826001600160a01b0316826001600160a01b031614610d4a57610d4a82826123f0565b60006001600160a01b0384163b1561214b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061208d903390899088908890600401612851565b602060405180830381600087803b1580156120a757600080fd5b505af19250505080156120d7575060408051601f3d908101601f191682019092526120d491810190612701565b60015b612131573d808015612105576040519150601f19603f3d011682016040523d82523d6000602084013e61210a565b606091505b5080516121295760405162461bcd60e51b8152600401610879906128a1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c0d565b506001949350505050565b6001600160a01b0382166121ac5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610879565b6000818152600260205260409020546001600160a01b0316156122115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610879565b61221d60008383611f91565b6001600160a01b03821660009081526003602052604081208054600192906122469084906129a1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016122b184610ff7565b6122bb91906129ec565b60008381526007602052604090205490915080821461230e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612353906001906129ec565b6000838152600960205260408120546008805493945090928490811061237b5761237b612adb565b90600052602060002001549050806008838154811061239c5761239c612adb565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123d4576123d4612ac5565b6001900381819060005260206000200160009055905550505050565b60006123fb83610ff7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461244090612a2f565b90600052602060002090601f01602090048101928261246257600085556124a8565b82601f1061247b57805160ff19168380011785556124a8565b828001600101855582156124a8579182015b828111156124a857825182559160200191906001019061248d565b506124b49291506124b8565b5090565b5b808211156124b457600081556001016124b9565b600067ffffffffffffffff808411156124e8576124e8612af1565b604051601f8501601f19908116603f0116810190828211818310171561251057612510612af1565b8160405280935085815286868601111561252957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461255a57600080fd5b919050565b60006020828403121561257157600080fd5b61179a82612543565b6000806040838503121561258d57600080fd5b61259683612543565b91506125a460208401612543565b90509250929050565b6000806000606084860312156125c257600080fd5b6125cb84612543565b92506125d960208501612543565b9150604084013590509250925092565b600080600080608085870312156125ff57600080fd5b61260885612543565b935061261660208601612543565b925060408501359150606085013567ffffffffffffffff81111561263957600080fd5b8501601f8101871361264a57600080fd5b612659878235602084016124cd565b91505092959194509250565b6000806040838503121561267857600080fd5b61268183612543565b91506020830135801515811461269657600080fd5b809150509250929050565b600080604083850312156126b457600080fd5b6126bd83612543565b946020939093013593505050565b6000602082840312156126dd57600080fd5b5035919050565b6000602082840312156126f657600080fd5b813561179a81612b07565b60006020828403121561271357600080fd5b815161179a81612b07565b60006020828403121561273057600080fd5b813567ffffffffffffffff81111561274757600080fd5b8201601f8101841361275857600080fd5b611c0d848235602084016124cd565b60008060006040848603121561277c57600080fd5b83359250602084013567ffffffffffffffff8082111561279b57600080fd5b818601915086601f8301126127af57600080fd5b8135818111156127be57600080fd5b8760208260051b85010111156127d357600080fd5b6020830194508093505050509250925092565b600081518084526127fe816020860160208601612a03565b601f01601f19169290920160200192915050565b60008351612824818460208801612a03565b835190830190612838818360208801612a03565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612884908301846127e6565b9695505050505050565b60208152600061179a60208301846127e6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b600082198211156129b4576129b4612a99565b500190565b6000826129c8576129c8612aaf565b500490565b60008160001904831182151516156129e7576129e7612a99565b500290565b6000828210156129fe576129fe612a99565b500390565b60005b83811015612a1e578181015183820152602001612a06565b838111156116c05750506000910152565b600181811c90821680612a4357607f821691505b60208210811415612a6457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a7e57612a7e612a99565b5060010190565b600082612a9457612a94612aaf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461191457600080fdfea264697066735822122090969da71f00ea9b2f0c3b6647c817a62a2ab33c7c8702182a9fb2132c7ba9b064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102885760003560e01c80637de9784c1161015a578063a0712d68116100c1578063d547cfb71161007a578063d547cfb714610740578063e985e9c514610755578063ec63d8f91461079e578063eca21757146107b4578063f2fde38b146107d4578063f6efe0ed146107f457600080fd5b8063a0712d6814610698578063a10866ef146106ab578063a22cb465146106c0578063a5cc39a1146106e0578063b88d4fde14610700578063c87b56dd1461072057600080fd5b8063853828b611610113578063853828b614610604578063865506ad146106195780638da5cb5b1461062f57806391b7f5ed1461064d57806395d89b411461066d5780639c20a5d71461068257600080fd5b80637de9784c1461054c5780637f5da878146105625780637f81be691461058257806381d8488f146105b857806383000718146105d857806384d53d28146105ee57600080fd5b80633ccfd60b116101fe5780636352211e116101b75780636352211e146104a057806367fbc385146104c05780636fab43fc146104d657806370a08231146104f657806371df600e14610516578063787f93d81461053657600080fd5b80633ccfd60b146103f55780633f73fc6c1461040a57806342842e0e146104205780634783f0ef146104405780634f6ccce71461046057806355f804b31461048057600080fd5b80630fcf2e75116102505780630fcf2e751461035157806310b5454d1461037057806318160ddd1461038a5780631a40ad9f146103a957806323b872dd146103bf5780632eb4a7ab146103df57600080fd5b806301ffc9a71461028d578063061431a8146102c257806306fdde03146102d7578063081812fc146102f9578063095ea7b314610331575b600080fd5b34801561029957600080fd5b506102ad6102a83660046126e4565b610809565b60405190151581526020015b60405180910390f35b6102d56102d0366004612767565b610834565b005b3480156102e357600080fd5b506102ec610b12565b6040516102b9919061288e565b34801561030557600080fd5b506103196103143660046126cb565b610ba4565b6040516001600160a01b0390911681526020016102b9565b34801561033d57600080fd5b506102d561034c3660046126a1565b610c39565b34801561035d57600080fd5b506019546102ad90610100900460ff1681565b34801561037c57600080fd5b506019546102ad9060ff1681565b34801561039657600080fd5b506008545b6040519081526020016102b9565b3480156103b557600080fd5b5061039b611b3981565b3480156103cb57600080fd5b506102d56103da3660046125ad565b610d4f565b3480156103eb57600080fd5b5061039b600d5481565b34801561040157600080fd5b506102d5610d80565b34801561041657600080fd5b5061039b60175481565b34801561042c57600080fd5b506102d561043b3660046125ad565b610ddd565b34801561044c57600080fd5b506102d561045b3660046126cb565b610df8565b34801561046c57600080fd5b5061039b61047b3660046126cb565b610e45565b34801561048c57600080fd5b506102d561049b36600461271e565b610ed8565b3480156104ac57600080fd5b506103196104bb3660046126cb565b610f33565b3480156104cc57600080fd5b5061039b600e5481565b3480156104e257600080fd5b506102d56104f13660046126cb565b610faa565b34801561050257600080fd5b5061039b61051136600461255f565b610ff7565b34801561052257600080fd5b506102d56105313660046126cb565b61107e565b34801561054257600080fd5b5061039b60145481565b34801561055857600080fd5b5061039b60115481565b34801561056e57600080fd5b506102d561057d3660046126a1565b6110cb565b34801561058e57600080fd5b5061031961059d3660046126cb565b6000908152600260205260409020546001600160a01b031690565b3480156105c457600080fd5b506102d56105d33660046126cb565b6111b4565b3480156105e457600080fd5b5061039b60185481565b3480156105fa57600080fd5b5061039b60135481565b34801561061057600080fd5b506102d5611201565b34801561062557600080fd5b5061039b60165481565b34801561063b57600080fd5b50600a546001600160a01b0316610319565b34801561065957600080fd5b506102d56106683660046126cb565b611315565b34801561067957600080fd5b506102ec611362565b34801561068e57600080fd5b5061039b60155481565b6102d56106a63660046126cb565b611371565b3480156106b757600080fd5b506102d5611517565b3480156106cc57600080fd5b506102d56106db366004612665565b61157c565b3480156106ec57600080fd5b506102d56106fb3660046126cb565b611641565b34801561070c57600080fd5b506102d561071b3660046125e9565b61168e565b34801561072c57600080fd5b506102ec61073b3660046126cb565b6116c6565b34801561074c57600080fd5b506102ec6117a1565b34801561076157600080fd5b506102ad61077036600461257a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107aa57600080fd5b5061039b60125481565b3480156107c057600080fd5b506102d56107cf3660046126cb565b61182f565b3480156107e057600080fd5b506102d56107ef36600461255f565b61187c565b34801561080057600080fd5b506102d5611917565b60006001600160e01b03198216632bbd609d60e11b148061082e575061082e82611973565b92915050565b601954339060ff166108825760405162461bcd60e51b8152602060048201526012602482015271574c2073616c65206e6f742061637469766560701b60448201526064015b60405180910390fd5b600084118015610893575060148411155b6108d05760405162461bcd60e51b815260206004820152600e60248201526d0c8c081c151608185b1b1bddd95960921b6044820152606401610879565b6011546108dd90856119c3565b34146109175760405162461bcd60e51b8152602060048201526009602482015268086d0cac6d6408aa8960bb1b6044820152606401610879565b601654336000908152601a602052604090205461093490866119cf565b11156109825760405162461bcd60e51b815260206004820152601e60248201527f4d61782077686974656c697374206d696e7473207057207265616368656400006044820152606401610879565b6109f883838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d546040516bffffffffffffffffffffffff19606088901b1660208201529092506034019050604051602081830303815290604052805190602001206119db565b610a325760405162461bcd60e51b815260206004820152600b60248201526a21b432b1b590383937b7b360a91b6044820152606401610879565b60005b84811015610b0b57611b39610a4960085490565b1015610a9c57610a6c33610a5c60085490565b610a679060016129a1565b611a8a565b336000908152601a6020526040902054610a879060016119cf565b336000908152601a6020526040902055610af9565b6019805460ff19811660ff9091161517905560115433906108fc90610acb90610ac58986611aa4565b906119c3565b6040518115909202916000818181858888f19350505050158015610af3573d6000803e3d6000fd5b50610b0b565b80610b0381612a6a565b915050610a35565b5050505050565b606060008054610b2190612a2f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4d90612a2f565b8015610b9a5780601f10610b6f57610100808354040283529160200191610b9a565b820191906000526020600020905b815481529060010190602001808311610b7d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c1d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610879565b506000908152600460205260409020546001600160a01b031690565b6000610c4482610f33565b9050806001600160a01b0316836001600160a01b03161415610cb25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610879565b336001600160a01b0382161480610cce5750610cce8133610770565b610d405760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610879565b610d4a8383611ab0565b505050565b610d593382611b1e565b610d755760405162461bcd60e51b815260040161087990612928565b610d4a838383611c15565b600a546001600160a01b03163314610daa5760405162461bcd60e51b8152600401610879906128f3565b6040514790339082156108fc029083906000818181858888f19350505050158015610dd9573d6000803e3d6000fd5b5050565b610d4a8383836040518060200160405280600081525061168e565b600a546001600160a01b0316331480610e2457506010546001600160a01b0316336001600160a01b0316145b610e405760405162461bcd60e51b815260040161087990612979565b600d55565b6000610e5060085490565b8210610eb35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610879565b60088281548110610ec657610ec6612adb565b90600052602060002001549050919050565b600a546001600160a01b0316331480610f0457506010546001600160a01b0316336001600160a01b0316145b610f205760405162461bcd60e51b815260040161087990612979565b8051610dd990601b906020840190612434565b6000818152600260205260408120546001600160a01b03168061082e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610879565b600a546001600160a01b0316331480610fd657506010546001600160a01b0316336001600160a01b0316145b610ff25760405162461bcd60e51b815260040161087990612979565b601555565b60006001600160a01b0382166110625760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610879565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314806110aa57506010546001600160a01b0316336001600160a01b0316145b6110c65760405162461bcd60e51b815260040161087990612979565b601655565b600a546001600160a01b03163314806110f757506010546001600160a01b0316336001600160a01b0316145b6111135760405162461bcd60e51b815260040161087990612979565b600061111e60085490565b905060008211801561113257506017548211155b6111735760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f756768207265736572766560701b6044820152606401610879565b60005b8281101561119e5761118c84610a5c83856129a1565b8061119681612a6a565b915050611176565b506017546111ac9083611aa4565b601755505050565b600a546001600160a01b03163314806111e057506010546001600160a01b0316336001600160a01b0316145b6111fc5760405162461bcd60e51b815260040161087990612979565b601155565b600a546001600160a01b0316331461122b5760405162461bcd60e51b8152600401610879906128f3565b600047116112685760405162461bcd60e51b815260206004820152600a6024820152694e6f2062616c616e636560b01b6044820152606401610879565b600f5447906000906001600160a01b031661128e606461128885826119c3565b90611dc0565b604051600081818185875af1925050503d80600081146112ca576040519150601f19603f3d011682016040523d82523d6000602084013e6112cf565b606091505b5050905080610dd95760405162461bcd60e51b81526020600482015260126024820152712bb4ba34323930bbb0b6103330b4b632b21760711b6044820152606401610879565b600a546001600160a01b031633148061134157506010546001600160a01b0316336001600160a01b0316145b61135d5760405162461bcd60e51b815260040161087990612979565b601255565b606060018054610b2190612a2f565b601954610100900460ff166113ba5760405162461bcd60e51b815260206004820152600f60248201526e53616c65206e6f742061637469766560881b6044820152606401610879565b6000811180156113cc57506013548111155b61140a5760405162461bcd60e51b815260206004820152600f60248201526e13585e081c1516081c995858da1959608a1b6044820152606401610879565b60125461141790826119c3565b34146114515760405162461bcd60e51b8152602060048201526009602482015268086d0cac6d6408aa8960bb1b6044820152606401610879565b60005b81811015610dd957611b3961146860085490565b10156114ab5761147b33610a5c60085490565b336000908152601a60205260409020546114969060016119cf565b336000908152601a6020526040902055611505565b6019805461ff001981166101009182900460ff161590910217905560125433906108fc906114dd90610ac58686611aa4565b6040518115909202916000818181858888f19350505050158015610d4a573d6000803e3d6000fd5b8061150f81612a6a565b915050611454565b600a546001600160a01b031633148061154357506010546001600160a01b0316336001600160a01b0316145b61155f5760405162461bcd60e51b815260040161087990612979565b6019805461ff001981166101009182900460ff1615909102179055565b6001600160a01b0382163314156115d55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610879565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633148061166d57506010546001600160a01b0316336001600160a01b0316145b6116895760405162461bcd60e51b815260040161087990612979565b601355565b6116983383611b1e565b6116b45760405162461bcd60e51b815260040161087990612928565b6116c084848484611dcc565b50505050565b6000818152600260205260409020546060906001600160a01b03166117455760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610879565b600061174f611dff565b9050600081511161176f576040518060200160405280600081525061179a565b8061177984611e0e565b60405160200161178a929190612812565b6040516020818303038152906040525b9392505050565b601b80546117ae90612a2f565b80601f01602080910402602001604051908101604052809291908181526020018280546117da90612a2f565b80156118275780601f106117fc57610100808354040283529160200191611827565b820191906000526020600020905b81548152906001019060200180831161180a57829003601f168201915b505050505081565b600a546001600160a01b031633148061185b57506010546001600160a01b0316336001600160a01b0316145b6118775760405162461bcd60e51b815260040161087990612979565b601455565b600a546001600160a01b031633146118a65760405162461bcd60e51b8152600401610879906128f3565b6001600160a01b03811661190b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610879565b61191481611f0c565b50565b600a546001600160a01b031633148061194357506010546001600160a01b0316336001600160a01b0316145b61195f5760405162461bcd60e51b815260040161087990612979565b6019805460ff19811660ff90911615179055565b60006001600160e01b031982166380ac58cd60e01b14806119a457506001600160e01b03198216635b5e139f60e01b145b8061082e57506301ffc9a760e01b6001600160e01b031983161461082e565b600061179a82846129cd565b600061179a82846129a1565b600081815b8551811015611a7f5760008682815181106119fd576119fd612adb565b60200260200101519050808311611a3f576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611a6c565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611a7781612a6a565b9150506119e0565b509092149392505050565b610dd9828260405180602001604052806000815250611f5e565b600061179a82846129ec565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ae582610f33565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b975760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610879565b6000611ba283610f33565b9050806001600160a01b0316846001600160a01b03161480611bdd5750836001600160a01b0316611bd284610ba4565b6001600160a01b0316145b80611c0d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c2882610f33565b6001600160a01b031614611c905760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610879565b6001600160a01b038216611cf25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610879565b611cfd838383611f91565b611d08600082611ab0565b6001600160a01b0383166000908152600360205260408120805460019290611d319084906129ec565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d5f9084906129a1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061179a82846129b9565b611dd7848484611c15565b611de384848484612049565b6116c05760405162461bcd60e51b8152600401610879906128a1565b6060601b8054610b2190612a2f565b606081611e325750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611e5c5780611e4681612a6a565b9150611e559050600a836129b9565b9150611e36565b60008167ffffffffffffffff811115611e7757611e77612af1565b6040519080825280601f01601f191660200182016040528015611ea1576020820181803683370190505b5090505b8415611c0d57611eb66001836129ec565b9150611ec3600a86612a85565b611ece9060306129a1565b60f81b818381518110611ee357611ee3612adb565b60200101906001600160f81b031916908160001a905350611f05600a866129b9565b9450611ea5565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611f688383612156565b611f756000848484612049565b610d4a5760405162461bcd60e51b8152600401610879906128a1565b6001600160a01b038316611fec57611fe781600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61200f565b816001600160a01b0316836001600160a01b03161461200f5761200f83826122a4565b6001600160a01b03821661202657610d4a81612341565b826001600160a01b0316826001600160a01b031614610d4a57610d4a82826123f0565b60006001600160a01b0384163b1561214b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061208d903390899088908890600401612851565b602060405180830381600087803b1580156120a757600080fd5b505af19250505080156120d7575060408051601f3d908101601f191682019092526120d491810190612701565b60015b612131573d808015612105576040519150601f19603f3d011682016040523d82523d6000602084013e61210a565b606091505b5080516121295760405162461bcd60e51b8152600401610879906128a1565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611c0d565b506001949350505050565b6001600160a01b0382166121ac5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610879565b6000818152600260205260409020546001600160a01b0316156122115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610879565b61221d60008383611f91565b6001600160a01b03821660009081526003602052604081208054600192906122469084906129a1565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016122b184610ff7565b6122bb91906129ec565b60008381526007602052604090205490915080821461230e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612353906001906129ec565b6000838152600960205260408120546008805493945090928490811061237b5761237b612adb565b90600052602060002001549050806008838154811061239c5761239c612adb565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806123d4576123d4612ac5565b6001900381819060005260206000200160009055905550505050565b60006123fb83610ff7565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461244090612a2f565b90600052602060002090601f01602090048101928261246257600085556124a8565b82601f1061247b57805160ff19168380011785556124a8565b828001600101855582156124a8579182015b828111156124a857825182559160200191906001019061248d565b506124b49291506124b8565b5090565b5b808211156124b457600081556001016124b9565b600067ffffffffffffffff808411156124e8576124e8612af1565b604051601f8501601f19908116603f0116810190828211818310171561251057612510612af1565b8160405280935085815286868601111561252957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461255a57600080fd5b919050565b60006020828403121561257157600080fd5b61179a82612543565b6000806040838503121561258d57600080fd5b61259683612543565b91506125a460208401612543565b90509250929050565b6000806000606084860312156125c257600080fd5b6125cb84612543565b92506125d960208501612543565b9150604084013590509250925092565b600080600080608085870312156125ff57600080fd5b61260885612543565b935061261660208601612543565b925060408501359150606085013567ffffffffffffffff81111561263957600080fd5b8501601f8101871361264a57600080fd5b612659878235602084016124cd565b91505092959194509250565b6000806040838503121561267857600080fd5b61268183612543565b91506020830135801515811461269657600080fd5b809150509250929050565b600080604083850312156126b457600080fd5b6126bd83612543565b946020939093013593505050565b6000602082840312156126dd57600080fd5b5035919050565b6000602082840312156126f657600080fd5b813561179a81612b07565b60006020828403121561271357600080fd5b815161179a81612b07565b60006020828403121561273057600080fd5b813567ffffffffffffffff81111561274757600080fd5b8201601f8101841361275857600080fd5b611c0d848235602084016124cd565b60008060006040848603121561277c57600080fd5b83359250602084013567ffffffffffffffff8082111561279b57600080fd5b818601915086601f8301126127af57600080fd5b8135818111156127be57600080fd5b8760208260051b85010111156127d357600080fd5b6020830194508093505050509250925092565b600081518084526127fe816020860160208601612a03565b601f01601f19169290920160200192915050565b60008351612824818460208801612a03565b835190830190612838818360208801612a03565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612884908301846127e6565b9695505050505050565b60208152600061179a60208301846127e6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b600082198211156129b4576129b4612a99565b500190565b6000826129c8576129c8612aaf565b500490565b60008160001904831182151516156129e7576129e7612a99565b500290565b6000828210156129fe576129fe612a99565b500390565b60005b83811015612a1e578181015183820152602001612a06565b838111156116c05750506000910152565b600181811c90821680612a4357607f821691505b60208210811415612a6457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a7e57612a7e612a99565b5060010190565b600082612a9457612a94612aaf565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461191457600080fdfea264697066735822122090969da71f00ea9b2f0c3b6647c817a62a2ab33c7c8702182a9fb2132c7ba9b064736f6c63430008070033

Deployed Bytecode Sourcemap

53376:5416:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47172:224;;;;;;;;;;-1:-1:-1;47172:224:0;;;;;:::i;:::-;;:::i;:::-;;;7382:14:1;;7375:22;7357:41;;7345:2;7330:18;47172:224:0;;;;;;;;56515:1158;;;;;;:::i;:::-;;:::i;:::-;;35064:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36631:221::-;;;;;;;;;;-1:-1:-1;36631:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6680:32:1;;;6662:51;;6650:2;6635:18;36631:221:0;6516:203:1;36154:411:0;;;;;;;;;;-1:-1:-1;36154:411:0;;;;;:::i;:::-;;:::i;54182:38::-;;;;;;;;;;-1:-1:-1;54182:38:0;;;;;;;;;;;54137:41;;;;;;;;;;-1:-1:-1;54137:41:0;;;;;;;;47820:113;;;;;;;;;;-1:-1:-1;47908:10:0;:17;47820:113;;;7555:25:1;;;7543:2;7528:18;47820:113:0;7409:177:1;54011:38:0;;;;;;;;;;;;54045:4;54011:38;;37521:339;;;;;;;;;;-1:-1:-1;37521:339:0;;;;;:::i;:::-;;:::i;53530:25::-;;;;;;;;;;;;;;;;54545:140;;;;;;;;;;;;;:::i;54056:28::-;;;;;;;;;;;;;;;;37931:185;;;;;;;;;;-1:-1:-1;37931:185:0;;;;;:::i;:::-;;:::i;56385:125::-;;;;;;;;;;-1:-1:-1;56385:125:0;;;;;:::i;:::-;;:::i;48010:233::-;;;;;;;;;;-1:-1:-1;48010:233:0;;;;;:::i;:::-;;:::i;55204:106::-;;;;;;;;;;-1:-1:-1;55204:106:0;;;;;:::i;:::-;;:::i;34584:239::-;;;;;;;;;;-1:-1:-1;34584:239:0;;;;;:::i;:::-;;:::i;53559:28::-;;;;;;;;;;;;;;;;58470:145;;;;;;;;;;-1:-1:-1;58470:145:0;;;;;:::i;:::-;;:::i;34314:208::-;;;;;;;;;;-1:-1:-1;34314:208:0;;;;;:::i;:::-;;:::i;58621:165::-;;;;;;;;;;-1:-1:-1;58621:165:0;;;;;:::i;:::-;;:::i;53890:31::-;;;;;;;;;;;;;;;;53748:52;;;;;;;;;;;;;;;;54693:380;;;;;;;;;;-1:-1:-1;54693:380:0;;;;;:::i;:::-;;:::i;34888:109::-;;;;;;;;;;-1:-1:-1;34888:109:0;;;;;:::i;:::-;34946:7;34973:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34973:16:0;;34888:109;57993:112;;;;;;;;;;-1:-1:-1;57993:112:0;;;;;:::i;:::-;;:::i;54088:38::-;;;;;;;;;;;;;;;;53861:25;;;;;;;;;;;;;;;;57681:304;;;;;;;;;;;;;:::i;53968:34::-;;;;;;;;;;;;;;;;13979:87;;;;;;;;;;-1:-1:-1;14052:6:0;;-1:-1:-1;;;;;14052:6:0;13979:87;;58113:103;;;;;;;;;;-1:-1:-1;58113:103:0;;;;;:::i;:::-;;:::i;35233:104::-;;;;;;;;;;;;;:::i;53928:33::-;;;;;;;;;;;;;;;;55563:782;;;;;;:::i;:::-;;:::i;55320:112::-;;;;;;;;;;;;;:::i;36924:295::-;;;;;;;;;;-1:-1:-1;36924:295:0;;;;;:::i;:::-;;:::i;58223:105::-;;;;;;;;;;-1:-1:-1;58223:105:0;;;;;:::i;:::-;;:::i;38187:328::-;;;;;;;;;;-1:-1:-1;38187:328:0;;;;;:::i;:::-;;:::i;35408:342::-;;;;;;;;;;-1:-1:-1;35408:342:0;;;;;:::i;:::-;;:::i;54309:26::-;;;;;;;;;;;;;:::i;37290:164::-;;;;;;;;;;-1:-1:-1;37290:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;37411:25:0;;;37387:4;37411:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37290:164;53804:50;;;;;;;;;;;;;;;;58335:129;;;;;;;;;;-1:-1:-1;58335:129:0;;;;;:::i;:::-;;:::i;14885:192::-;;;;;;;;;;-1:-1:-1;14885:192:0;;;;;:::i;:::-;;:::i;55438:114::-;;;;;;;;;;;;;:::i;47172:224::-;47274:4;-1:-1:-1;;;;;;47298:50:0;;-1:-1:-1;;;47298:50:0;;:90;;;47352:36;47376:11;47352:23;:36::i;:::-;47291:97;47172:224;-1:-1:-1;;47172:224:0:o;56515:1158::-;56660:21;;56637:10;;56660:21;;56652:52;;;;-1:-1:-1;;;56652:52:0;;17912:2:1;56652:52:0;;;17894:21:1;17951:2;17931:18;;;17924:30;-1:-1:-1;;;17970:18:1;;;17963:48;18028:18;;56652:52:0;;;;;;;;;56740:1;56723:14;:18;:42;;;;;56763:2;56745:14;:20;;56723:42;56715:69;;;;-1:-1:-1;;;56715:69:0;;13351:2:1;56715:69:0;;;13333:21:1;13390:2;13370:18;;;13363:30;-1:-1:-1;;;13409:18:1;;;13402:44;13463:18;;56715:69:0;13149:338:1;56715:69:0;56816:18;;:38;;56839:14;56816:22;:38::i;:::-;56803:9;:51;56795:73;;;;-1:-1:-1;;;56795:73:0;;17575:2:1;56795:73:0;;;17557:21:1;17614:1;17594:18;;;17587:29;-1:-1:-1;;;17632:18:1;;;17625:39;17681:18;;56795:73:0;17373:332:1;56795:73:0;56954:17;;56919:10;56887:43;;;;:31;:43;;;;;;:63;;56935:14;56887:47;:63::i;:::-;:84;;56879:126;;;;-1:-1:-1;;;56879:126:0;;8017:2:1;56879:126:0;;;7999:21:1;8056:2;8036:18;;;8029:30;8095:32;8075:18;;;8068:60;8145:18;;56879:126:0;7815:354:1;56879:126:0;57062:82;57081:11;;57062:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57094:10:0;;57117:23;;-1:-1:-1;;5327:2:1;5323:15;;;5319:53;57117:23:0;;;5307:66:1;57094:10:0;;-1:-1:-1;5389:12:1;;;-1:-1:-1;57117:23:0;;;;;;;;;;;;57107:34;;;;;;57062:18;:82::i;:::-;57054:106;;;;-1:-1:-1;;;57054:106:0;;14829:2:1;57054:106:0;;;14811:21:1;14868:2;14848:18;;;14841:30;-1:-1:-1;;;14887:18:1;;;14880:41;14938:18;;57054:106:0;14627:335:1;57054:106:0;57171:6;57167:486;57187:14;57183:1;:18;57167:486;;;54045:4;57227:13;47908:10;:17;;47820:113;57227:13;:23;57223:425;;;57271:38;57281:10;57293:13;47908:10;:17;;47820:113;57293:13;:15;;57307:1;57293:15;:::i;:::-;57271:9;:38::i;:::-;57406:10;57374:43;;;;:31;:43;;;;;;:50;;57422:1;57374:47;:50::i;:::-;57360:10;57328:43;;;;:31;:43;;;;;:96;57223:425;;;57493:21;;;-1:-1:-1;;57468:46:0;;57493:21;;;;57492:22;57468:46;;;57588:18;;57541:10;;57533:75;;57562:45;;:21;:14;57581:1;57562:18;:21::i;:::-;:25;;:45::i;:::-;57533:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57627:5;;57223:425;57203:3;;;;:::i;:::-;;;;57167:486;;;;56610:1063;56515:1158;;;:::o;35064:100::-;35118:13;35151:5;35144:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35064:100;:::o;36631:221::-;36707:7;40114:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40114:16:0;36727:73;;;;-1:-1:-1;;;36727:73:0;;14055:2:1;36727:73:0;;;14037:21:1;14094:2;14074:18;;;14067:30;14133:34;14113:18;;;14106:62;-1:-1:-1;;;14184:18:1;;;14177:42;14236:19;;36727:73:0;13853:408:1;36727:73:0;-1:-1:-1;36820:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36820:24:0;;36631:221::o;36154:411::-;36235:13;36251:23;36266:7;36251:14;:23::i;:::-;36235:39;;36299:5;-1:-1:-1;;;;;36293:11:0;:2;-1:-1:-1;;;;;36293:11:0;;;36285:57;;;;-1:-1:-1;;;36285:57:0;;16342:2:1;36285:57:0;;;16324:21:1;16381:2;16361:18;;;16354:30;16420:34;16400:18;;;16393:62;-1:-1:-1;;;16471:18:1;;;16464:31;16512:19;;36285:57:0;16140:397:1;36285:57:0;12847:10;-1:-1:-1;;;;;36377:21:0;;;;:62;;-1:-1:-1;36402:37:0;36419:5;12847:10;37290:164;:::i;36402:37::-;36355:168;;;;-1:-1:-1;;;36355:168:0;;12105:2:1;36355:168:0;;;12087:21:1;12144:2;12124:18;;;12117:30;12183:34;12163:18;;;12156:62;12254:26;12234:18;;;12227:54;12298:19;;36355:168:0;11903:420:1;36355:168:0;36536:21;36545:2;36549:7;36536:8;:21::i;:::-;36224:341;36154:411;;:::o;37521:339::-;37716:41;12847:10;37749:7;37716:18;:41::i;:::-;37708:103;;;;-1:-1:-1;;;37708:103:0;;;;;;;:::i;:::-;37824:28;37834:4;37840:2;37844:7;37824:9;:28::i;54545:140::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;14199:23;14191:68;;;;-1:-1:-1;;;14191:68:0;;;;;;;:::i;:::-;54640:37:::1;::::0;54608:21:::1;::::0;54648:10:::1;::::0;54640:37;::::1;;;::::0;54608:21;;54593:12:::1;54640:37:::0;54593:12;54640:37;54608:21;54648:10;54640:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;54582:103;54545:140::o:0;37931:185::-;38069:39;38086:4;38092:2;38096:7;38069:39;;;;;;;;;;;;:16;:39::i;56385:125::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;56469:10:::1;:26:::0;56385:125::o;48010:233::-;48085:7;48121:30;47908:10;:17;;47820:113;48121:30;48113:5;:38;48105:95;;;;-1:-1:-1;;;48105:95:0;;17162:2:1;48105:95:0;;;17144:21:1;17201:2;17181:18;;;17174:30;17240:34;17220:18;;;17213:62;-1:-1:-1;;;17291:18:1;;;17284:42;17343:19;;48105:95:0;16960:408:1;48105:95:0;48218:10;48229:5;48218:17;;;;;;;;:::i;:::-;;;;;;;;;48211:24;;48010:233;;;:::o;55204:106::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;55280:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;34584:239::-:0;34656:7;34692:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34692:16:0;34727:19;34719:73;;;;-1:-1:-1;;;34719:73:0;;12941:2:1;34719:73:0;;;12923:21:1;12980:2;12960:18;;;12953:30;13019:34;12999:18;;;12992:62;-1:-1:-1;;;13070:18:1;;;13063:39;13119:19;;34719:73:0;12739:405:1;58470:145:0;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;58565:16:::1;:38:::0;58470:145::o;34314:208::-;34386:7;-1:-1:-1;;;;;34414:19:0;;34406:74;;;;-1:-1:-1;;;34406:74:0;;12530:2:1;34406:74:0;;;12512:21:1;12569:2;12549:18;;;12542:30;12608:34;12588:18;;;12581:62;-1:-1:-1;;;12659:18:1;;;12652:40;12709:19;;34406:74:0;12328:406:1;34406:74:0;-1:-1:-1;;;;;;34498:16:0;;;;;:9;:16;;;;;;;34314:208::o;58621:165::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;58726:17:::1;:40:::0;58621:165::o;54693:380::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;54783:11:::1;54797:13;47908:10:::0;:17;;47820:113;54797:13:::1;54783:27;;54846:1;54829:14;:18;:50;;;;;54869:10;;54851:14;:28;;54829:50;54821:81;;;::::0;-1:-1:-1;;;54821:81:0;;15995:2:1;54821:81:0::1;::::0;::::1;15977:21:1::0;16034:2;16014:18;;;16007:30;-1:-1:-1;;;16053:18:1;;;16046:48;16111:18;;54821:81:0::1;15793:342:1::0;54821:81:0::1;54918:6;54913:99;54934:14;54930:1;:18;54913:99;;;54970:30;54980:3:::0;54985:10:::1;54994:1:::0;54985:6;:10:::1;:::i;54970:30::-;54950:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54913:99;;;-1:-1:-1::0;55035:10:0::1;::::0;:30:::1;::::0;55050:14;55035::::1;:30::i;:::-;55022:10;:43:::0;-1:-1:-1;;;54693:380:0:o;57993:112::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;58066:18:::1;:31:::0;57993:112::o;57681:304::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;14199:23;14191:68;;;;-1:-1:-1;;;14191:68:0;;;;;;;:::i;:::-;57766:1:::1;57742:21;:25;57734:48;;;::::0;-1:-1:-1;;;57734:48:0;;9903:2:1;57734:48:0::1;::::0;::::1;9885:21:1::0;9942:2;9922:18;;;9915:30;-1:-1:-1;;;9961:18:1;;;9954:40;10011:18;;57734:48:0::1;9701:334:1::0;57734:48:0::1;57869:7;::::0;57811:21:::1;::::0;57793:15:::1;::::0;-1:-1:-1;;;;;57869:7:0::1;57889:25;57910:3;57889:16;57811:21:::0;57910:3;57889:11:::1;:16::i;:::-;:20:::0;::::1;:25::i;:::-;57869:50;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57843:76;;;57940:14;57932:45;;;::::0;-1:-1:-1;;;57932:45:0;;11001:2:1;57932:45:0::1;::::0;::::1;10983:21:1::0;11040:2;11020:18;;;11013:30;-1:-1:-1;;;11059:18:1;;;11052:48;11117:18;;57932:45:0::1;10799:342:1::0;58113:103:0;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;58182:15:::1;:26:::0;58113:103::o;35233:104::-;35289:13;35322:7;35315:14;;;;;:::i;55563:782::-;55632:18;;;;;;;55624:46;;;;-1:-1:-1;;;55624:46:0;;11761:2:1;55624:46:0;;;11743:21:1;11800:2;11780:18;;;11773:30;-1:-1:-1;;;11819:18:1;;;11812:45;11874:18;;55624:46:0;11559:339:1;55624:46:0;55706:1;55689:14;:18;:48;;;;;55729:8;;55711:14;:26;;55689:48;55681:76;;;;-1:-1:-1;;;55681:76:0;;8376:2:1;55681:76:0;;;8358:21:1;8415:2;8395:18;;;8388:30;-1:-1:-1;;;8434:18:1;;;8427:45;8489:18;;55681:76:0;8174:339:1;55681:76:0;55789:15;;:35;;55809:14;55789:19;:35::i;:::-;55776:9;:48;55768:70;;;;-1:-1:-1;;;55768:70:0;;17575:2:1;55768:70:0;;;17557:21:1;17614:1;17594:18;;;17587:29;-1:-1:-1;;;17632:18:1;;;17625:39;17681:18;;55768:70:0;17373:332:1;55768:70:0;55863:6;55859:479;55879:14;55875:1;:18;55859:479;;;54045:4;55919:13;47908:10;:17;;47820:113;55919:13;:23;55915:412;;;55963:38;55973:10;55985:13;47908:10;:17;;47820:113;55963:38;56098:10;56066:43;;;;:31;:43;;;;;;:50;;56114:1;56066:47;:50::i;:::-;56052:10;56020:43;;;;:31;:43;;;;;:96;55915:412;;;56178:18;;;-1:-1:-1;;56156:40:0;;56178:18;;;;;;;56177:19;56156:40;;;;;;56270:15;;56223:10;;56215:72;;56244:42;;:21;:14;56263:1;56244:18;:21::i;:42::-;56215:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55915:412;55895:3;;;;:::i;:::-;;;;55859:479;;55320:112;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;55406:18:::1;::::0;;-1:-1:-1;;55384:40:0;::::1;55406:18;::::0;;;::::1;;;55405:19;55384:40:::0;;::::1;;::::0;;55320:112::o;36924:295::-;-1:-1:-1;;;;;37027:24:0;;12847:10;37027:24;;37019:62;;;;-1:-1:-1;;;37019:62:0;;10647:2:1;37019:62:0;;;10629:21:1;10686:2;10666:18;;;10659:30;10725:27;10705:18;;;10698:55;10770:18;;37019:62:0;10445:349:1;37019:62:0;12847:10;37094:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;37094:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;37094:53:0;;;;;;;;;;37163:48;;7357:41:1;;;37094:42:0;;12847:10;37163:48;;7330:18:1;37163:48:0;;;;;;;36924:295;;:::o;58223:105::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;58298:8:::1;:22:::0;58223:105::o;38187:328::-;38362:41;12847:10;38395:7;38362:18;:41::i;:::-;38354:103;;;;-1:-1:-1;;;38354:103:0;;;;;;;:::i;:::-;38468:39;38482:4;38488:2;38492:7;38501:5;38468:13;:39::i;:::-;38187:328;;;;:::o;35408:342::-;40090:4;40114:16;;;:7;:16;;;;;;35481:13;;-1:-1:-1;;;;;40114:16:0;35507:76;;;;-1:-1:-1;;;35507:76:0;;15579:2:1;35507:76:0;;;15561:21:1;15618:2;15598:18;;;15591:30;15657:34;15637:18;;;15630:62;-1:-1:-1;;;15708:18:1;;;15701:45;15763:19;;35507:76:0;15377:411:1;35507:76:0;35596:21;35620:10;:8;:10::i;:::-;35596:34;;35672:1;35654:7;35648:21;:25;:94;;;;;;;;;;;;;;;;;35700:7;35709:18;:7;:16;:18::i;:::-;35683:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35648:94;35641:101;35408:342;-1:-1:-1;;;35408:342:0:o;54309:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58335:129::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;58422:14:::1;:34:::0;58335:129::o;14885:192::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;14199:23;14191:68;;;;-1:-1:-1;;;14191:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14974:22:0;::::1;14966:73;;;::::0;-1:-1:-1;;;14966:73:0;;9139:2:1;14966:73:0::1;::::0;::::1;9121:21:1::0;9178:2;9158:18;;;9151:30;9217:34;9197:18;;;9190:62;-1:-1:-1;;;9268:18:1;;;9261:36;9314:19;;14966:73:0::1;8937:402:1::0;14966:73:0::1;15050:19;15060:8;15050:9;:19::i;:::-;14885:192:::0;:::o;55438:114::-;14052:6;;-1:-1:-1;;;;;14052:6:0;12847:10;54444:23;;:53;;-1:-1:-1;54487:10:0;;-1:-1:-1;;;;;54487:10:0;12847;-1:-1:-1;;;;;54471:26:0;;54444:53;54436:81;;;;-1:-1:-1;;;54436:81:0;;;;;;;:::i;:::-;55523:21:::1;::::0;;-1:-1:-1;;55498:46:0;::::1;55523:21;::::0;;::::1;55522:22;55498:46;::::0;;55438:114::o;33957:293::-;34059:4;-1:-1:-1;;;;;;34092:40:0;;-1:-1:-1;;;34092:40:0;;:101;;-1:-1:-1;;;;;;;34145:48:0;;-1:-1:-1;;;34145:48:0;34092:101;:150;;;-1:-1:-1;;;;;;;;;;26080:40:0;;;34206:36;25971:157;6645:98;6703:7;6730:5;6734:1;6730;:5;:::i;5907:98::-;5965:7;5992:5;5996:1;5992;:5;:::i;868:830::-;993:4;1033;993;1050:525;1074:5;:12;1070:1;:16;1050:525;;;1108:20;1131:5;1137:1;1131:8;;;;;;;;:::i;:::-;;;;;;;1108:31;;1176:12;1160;:28;1156:408;;1313:44;;;;;;5569:19:1;;;5604:12;;;5597:28;;;5641:12;;1313:44:0;;;;;;;;;;;;1303:55;;;;;;1288:70;;1156:408;;;1503:44;;;;;;5569:19:1;;;5604:12;;;5597:28;;;5641:12;;1503:44:0;;;;;;;;;;;;1493:55;;;;;;1478:70;;1156:408;-1:-1:-1;1088:3:0;;;;:::i;:::-;;;;1050:525;;;-1:-1:-1;1670:20:0;;;;868:830;-1:-1:-1;;;868:830:0:o;41031:110::-;41107:26;41117:2;41121:7;41107:26;;;;;;;;;;;;:9;:26::i;6288:98::-;6346:7;6373:5;6377:1;6373;:5;:::i;44047:174::-;44122:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;44122:29:0;-1:-1:-1;;;;;44122:29:0;;;;;;;;:24;;44176:23;44122:24;44176:14;:23::i;:::-;-1:-1:-1;;;;;44167:46:0;;;;;;;;;;;44047:174;;:::o;40319:348::-;40412:4;40114:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40114:16:0;40429:73;;;;-1:-1:-1;;;40429:73:0;;11348:2:1;40429:73:0;;;11330:21:1;11387:2;11367:18;;;11360:30;11426:34;11406:18;;;11399:62;-1:-1:-1;;;11477:18:1;;;11470:42;11529:19;;40429:73:0;11146:408:1;40429:73:0;40513:13;40529:23;40544:7;40529:14;:23::i;:::-;40513:39;;40582:5;-1:-1:-1;;;;;40571:16:0;:7;-1:-1:-1;;;;;40571:16:0;;:51;;;;40615:7;-1:-1:-1;;;;;40591:31:0;:20;40603:7;40591:11;:20::i;:::-;-1:-1:-1;;;;;40591:31:0;;40571:51;:87;;;-1:-1:-1;;;;;;37411:25:0;;;37387:4;37411:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;40626:32;40563:96;40319:348;-1:-1:-1;;;;40319:348:0:o;43351:578::-;43510:4;-1:-1:-1;;;;;43483:31:0;:23;43498:7;43483:14;:23::i;:::-;-1:-1:-1;;;;;43483:31:0;;43475:85;;;;-1:-1:-1;;;43475:85:0;;15169:2:1;43475:85:0;;;15151:21:1;15208:2;15188:18;;;15181:30;15247:34;15227:18;;;15220:62;-1:-1:-1;;;15298:18:1;;;15291:39;15347:19;;43475:85:0;14967:405:1;43475:85:0;-1:-1:-1;;;;;43579:16:0;;43571:65;;;;-1:-1:-1;;;43571:65:0;;10242:2:1;43571:65:0;;;10224:21:1;10281:2;10261:18;;;10254:30;10320:34;10300:18;;;10293:62;-1:-1:-1;;;10371:18:1;;;10364:34;10415:19;;43571:65:0;10040:400:1;43571:65:0;43649:39;43670:4;43676:2;43680:7;43649:20;:39::i;:::-;43753:29;43770:1;43774:7;43753:8;:29::i;:::-;-1:-1:-1;;;;;43795:15:0;;;;;;:9;:15;;;;;:20;;43814:1;;43795:15;:20;;43814:1;;43795:20;:::i;:::-;;;;-1:-1:-1;;;;;;;43826:13:0;;;;;;:9;:13;;;;;:18;;43843:1;;43826:13;:18;;43843:1;;43826:18;:::i;:::-;;;;-1:-1:-1;;43855:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43855:21:0;-1:-1:-1;;;;;43855:21:0;;;;;;;;;43894:27;;43855:16;;43894:27;;;;;;;43351:578;;;:::o;7044:98::-;7102:7;7129:5;7133:1;7129;:5;:::i;39397:315::-;39554:28;39564:4;39570:2;39574:7;39554:9;:28::i;:::-;39601:48;39624:4;39630:2;39634:7;39643:5;39601:22;:48::i;:::-;39593:111;;;;-1:-1:-1;;;39593:111:0;;;;;;;:::i;55083:113::-;55143:13;55176:12;55169:19;;;;;:::i;10383:723::-;10439:13;10660:10;10656:53;;-1:-1:-1;;10687:10:0;;;;;;;;;;;;-1:-1:-1;;;10687:10:0;;;;;10383:723::o;10656:53::-;10734:5;10719:12;10775:78;10782:9;;10775:78;;10808:8;;;;:::i;:::-;;-1:-1:-1;10831:10:0;;-1:-1:-1;10839:2:0;10831:10;;:::i;:::-;;;10775:78;;;10863:19;10895:6;10885:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10885:17:0;;10863:39;;10913:154;10920:10;;10913:154;;10947:11;10957:1;10947:11;;:::i;:::-;;-1:-1:-1;11016:10:0;11024:2;11016:5;:10;:::i;:::-;11003:24;;:2;:24;:::i;:::-;10990:39;;10973:6;10980;10973:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10973:56:0;;;;;;;;-1:-1:-1;11044:11:0;11053:2;11044:11;;:::i;:::-;;;10913:154;;15085:173;15160:6;;;-1:-1:-1;;;;;15177:17:0;;;-1:-1:-1;;;;;;15177:17:0;;;;;;;15210:40;;15160:6;;;15177:17;15160:6;;15210:40;;15141:16;;15210:40;15130:128;15085:173;:::o;41368:321::-;41498:18;41504:2;41508:7;41498:5;:18::i;:::-;41549:54;41580:1;41584:2;41588:7;41597:5;41549:22;:54::i;:::-;41527:154;;;;-1:-1:-1;;;41527:154:0;;;;;;;:::i;48856:589::-;-1:-1:-1;;;;;49062:18:0;;49058:187;;49097:40;49129:7;50272:10;:17;;50245:24;;;;:15;:24;;;;;:44;;;50300:24;;;;;;;;;;;;50168:164;49097:40;49058:187;;;49167:2;-1:-1:-1;;;;;49159:10:0;:4;-1:-1:-1;;;;;49159:10:0;;49155:90;;49186:47;49219:4;49225:7;49186:32;:47::i;:::-;-1:-1:-1;;;;;49259:16:0;;49255:183;;49292:45;49329:7;49292:36;:45::i;49255:183::-;49365:4;-1:-1:-1;;;;;49359:10:0;:2;-1:-1:-1;;;;;49359:10:0;;49355:83;;49386:40;49414:2;49418:7;49386:27;:40::i;44786:803::-;44941:4;-1:-1:-1;;;;;44962:13:0;;16354:20;16402:8;44958:624;;44998:72;;-1:-1:-1;;;44998:72:0;;-1:-1:-1;;;;;44998:36:0;;;;;:72;;12847:10;;45049:4;;45055:7;;45064:5;;44998:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44998:72:0;;;;;;;;-1:-1:-1;;44998:72:0;;;;;;;;;;;;:::i;:::-;;;44994:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45244:13:0;;45240:272;;45287:60;;-1:-1:-1;;;45287:60:0;;;;;;;:::i;45240:272::-;45462:6;45456:13;45447:6;45443:2;45439:15;45432:38;44994:533;-1:-1:-1;;;;;;45121:55:0;-1:-1:-1;;;45121:55:0;;-1:-1:-1;45114:62:0;;44958:624;-1:-1:-1;45566:4:0;44786:803;;;;;;:::o;42025:382::-;-1:-1:-1;;;;;42105:16:0;;42097:61;;;;-1:-1:-1;;;42097:61:0;;13694:2:1;42097:61:0;;;13676:21:1;;;13713:18;;;13706:30;13772:34;13752:18;;;13745:62;13824:18;;42097:61:0;13492:356:1;42097:61:0;40090:4;40114:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40114:16:0;:30;42169:58;;;;-1:-1:-1;;;42169:58:0;;9546:2:1;42169:58:0;;;9528:21:1;9585:2;9565:18;;;9558:30;9624;9604:18;;;9597:58;9672:18;;42169:58:0;9344:352:1;42169:58:0;42240:45;42269:1;42273:2;42277:7;42240:20;:45::i;:::-;-1:-1:-1;;;;;42298:13:0;;;;;;:9;:13;;;;;:18;;42315:1;;42298:13;:18;;42315:1;;42298:18;:::i;:::-;;;;-1:-1:-1;;42327:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42327:21:0;-1:-1:-1;;;;;42327:21:0;;;;;;;;42366:33;;42327:16;;;42366:33;;42327:16;;42366:33;42025:382;;:::o;50959:988::-;51225:22;51275:1;51250:22;51267:4;51250:16;:22::i;:::-;:26;;;;:::i;:::-;51287:18;51308:26;;;:17;:26;;;;;;51225:51;;-1:-1:-1;51441:28:0;;;51437:328;;-1:-1:-1;;;;;51508:18:0;;51486:19;51508:18;;;:12;:18;;;;;;;;:34;;;;;;;;;51559:30;;;;;;:44;;;51676:30;;:17;:30;;;;;:43;;;51437:328;-1:-1:-1;51861:26:0;;;;:17;:26;;;;;;;;51854:33;;;-1:-1:-1;;;;;51905:18:0;;;;;:12;:18;;;;;:34;;;;;;;51898:41;50959:988::o;52242:1079::-;52520:10;:17;52495:22;;52520:21;;52540:1;;52520:21;:::i;:::-;52552:18;52573:24;;;:15;:24;;;;;;52946:10;:26;;52495:46;;-1:-1:-1;52573:24:0;;52495:46;;52946:26;;;;;;:::i;:::-;;;;;;;;;52924:48;;53010:11;52985:10;52996;52985:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;53090:28;;;:15;:28;;;;;;;:41;;;53262:24;;;;;53255:31;53297:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;52313:1008;;;52242:1079;:::o;49746:221::-;49831:14;49848:20;49865:2;49848:16;:20::i;:::-;-1:-1:-1;;;;;49879:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;49924:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;49746:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:55:1;;2181:1;2178;2171:12;2130:55;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1617:666;;;;;;;:::o;2288:347::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2579:5;2572:13;2565:21;2558:5;2555:32;2545:60;;2601:1;2598;2591:12;2545:60;2624:5;2614:15;;;2288:347;;;;;:::o;2640:254::-;2708:6;2716;2769:2;2757:9;2748:7;2744:23;2740:32;2737:52;;;2785:1;2782;2775:12;2737:52;2808:29;2827:9;2808:29;:::i;:::-;2798:39;2884:2;2869:18;;;;2856:32;;-1:-1:-1;;;2640:254:1:o;2899:180::-;2958:6;3011:2;2999:9;2990:7;2986:23;2982:32;2979:52;;;3027:1;3024;3017:12;2979:52;-1:-1:-1;3050:23:1;;2899:180;-1:-1:-1;2899:180:1:o;3084:245::-;3142:6;3195:2;3183:9;3174:7;3170:23;3166:32;3163:52;;;3211:1;3208;3201:12;3163:52;3250:9;3237:23;3269:30;3293:5;3269:30;:::i;3334:249::-;3403:6;3456:2;3444:9;3435:7;3431:23;3427:32;3424:52;;;3472:1;3469;3462:12;3424:52;3504:9;3498:16;3523:30;3547:5;3523:30;:::i;3588:450::-;3657:6;3710:2;3698:9;3689:7;3685:23;3681:32;3678:52;;;3726:1;3723;3716:12;3678:52;3766:9;3753:23;3799:18;3791:6;3788:30;3785:50;;;3831:1;3828;3821:12;3785:50;3854:22;;3907:4;3899:13;;3895:27;-1:-1:-1;3885:55:1;;3936:1;3933;3926:12;3885:55;3959:73;4024:7;4019:2;4006:16;4001:2;3997;3993:11;3959:73;:::i;4228:683::-;4323:6;4331;4339;4392:2;4380:9;4371:7;4367:23;4363:32;4360:52;;;4408:1;4405;4398:12;4360:52;4444:9;4431:23;4421:33;;4505:2;4494:9;4490:18;4477:32;4528:18;4569:2;4561:6;4558:14;4555:34;;;4585:1;4582;4575:12;4555:34;4623:6;4612:9;4608:22;4598:32;;4668:7;4661:4;4657:2;4653:13;4649:27;4639:55;;4690:1;4687;4680:12;4639:55;4730:2;4717:16;4756:2;4748:6;4745:14;4742:34;;;4772:1;4769;4762:12;4742:34;4825:7;4820:2;4810:6;4807:1;4803:14;4799:2;4795:23;4791:32;4788:45;4785:65;;;4846:1;4843;4836:12;4785:65;4877:2;4873;4869:11;4859:21;;4899:6;4889:16;;;;;4228:683;;;;;:::o;4916:257::-;4957:3;4995:5;4989:12;5022:6;5017:3;5010:19;5038:63;5094:6;5087:4;5082:3;5078:14;5071:4;5064:5;5060:16;5038:63;:::i;:::-;5155:2;5134:15;-1:-1:-1;;5130:29:1;5121:39;;;;5162:4;5117:50;;4916:257;-1:-1:-1;;4916:257:1:o;5664:637::-;5944:3;5982:6;5976:13;5998:53;6044:6;6039:3;6032:4;6024:6;6020:17;5998:53;:::i;:::-;6114:13;;6073:16;;;;6136:57;6114:13;6073:16;6170:4;6158:17;;6136:57;:::i;:::-;-1:-1:-1;;;6215:20:1;;6244:22;;;6293:1;6282:13;;5664:637;-1:-1:-1;;;;5664:637:1:o;6724:488::-;-1:-1:-1;;;;;6993:15:1;;;6975:34;;7045:15;;7040:2;7025:18;;7018:43;7092:2;7077:18;;7070:34;;;7140:3;7135:2;7120:18;;7113:31;;;6918:4;;7161:45;;7186:19;;7178:6;7161:45;:::i;:::-;7153:53;6724:488;-1:-1:-1;;;;;;6724:488:1:o;7591:219::-;7740:2;7729:9;7722:21;7703:4;7760:44;7800:2;7789:9;7785:18;7777:6;7760:44;:::i;8518:414::-;8720:2;8702:21;;;8759:2;8739:18;;;8732:30;8798:34;8793:2;8778:18;;8771:62;-1:-1:-1;;;8864:2:1;8849:18;;8842:48;8922:3;8907:19;;8518:414::o;14266:356::-;14468:2;14450:21;;;14487:18;;;14480:30;14546:34;14541:2;14526:18;;14519:62;14613:2;14598:18;;14266:356::o;16542:413::-;16744:2;16726:21;;;16783:2;16763:18;;;16756:30;16822:34;16817:2;16802:18;;16795:62;-1:-1:-1;;;16888:2:1;16873:18;;16866:47;16945:3;16930:19;;16542:413::o;18057:338::-;18259:2;18241:21;;;18298:2;18278:18;;;18271:30;-1:-1:-1;;;18332:2:1;18317:18;;18310:44;18386:2;18371:18;;18057:338::o;18582:128::-;18622:3;18653:1;18649:6;18646:1;18643:13;18640:39;;;18659:18;;:::i;:::-;-1:-1:-1;18695:9:1;;18582:128::o;18715:120::-;18755:1;18781;18771:35;;18786:18;;:::i;:::-;-1:-1:-1;18820:9:1;;18715:120::o;18840:168::-;18880:7;18946:1;18942;18938:6;18934:14;18931:1;18928:21;18923:1;18916:9;18909:17;18905:45;18902:71;;;18953:18;;:::i;:::-;-1:-1:-1;18993:9:1;;18840:168::o;19013:125::-;19053:4;19081:1;19078;19075:8;19072:34;;;19086:18;;:::i;:::-;-1:-1:-1;19123:9:1;;19013:125::o;19143:258::-;19215:1;19225:113;19239:6;19236:1;19233:13;19225:113;;;19315:11;;;19309:18;19296:11;;;19289:39;19261:2;19254:10;19225:113;;;19356:6;19353:1;19350:13;19347:48;;;-1:-1:-1;;19391:1:1;19373:16;;19366:27;19143:258::o;19406:380::-;19485:1;19481:12;;;;19528;;;19549:61;;19603:4;19595:6;19591:17;19581:27;;19549:61;19656:2;19648:6;19645:14;19625:18;19622:38;19619:161;;;19702:10;19697:3;19693:20;19690:1;19683:31;19737:4;19734:1;19727:15;19765:4;19762:1;19755:15;19619:161;;19406:380;;;:::o;19791:135::-;19830:3;-1:-1:-1;;19851:17:1;;19848:43;;;19871:18;;:::i;:::-;-1:-1:-1;19918:1:1;19907:13;;19791:135::o;19931:112::-;19963:1;19989;19979:35;;19994:18;;:::i;:::-;-1:-1:-1;20028:9:1;;19931:112::o;20048:127::-;20109:10;20104:3;20100:20;20097:1;20090:31;20140:4;20137:1;20130:15;20164:4;20161:1;20154:15;20180:127;20241:10;20236:3;20232:20;20229:1;20222:31;20272:4;20269:1;20262:15;20296:4;20293:1;20286:15;20312:127;20373:10;20368:3;20364:20;20361:1;20354:31;20404:4;20401:1;20394:15;20428:4;20425:1;20418:15;20444:127;20505:10;20500:3;20496:20;20493:1;20486:31;20536:4;20533:1;20526:15;20560:4;20557:1;20550:15;20576:127;20637:10;20632:3;20628:20;20625:1;20618:31;20668:4;20665:1;20658:15;20692:4;20689:1;20682:15;20708:131;-1:-1:-1;;;;;;20782:32:1;;20772:43;;20762:71;;20829:1;20826;20819:12

Swarm Source

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