ETH Price: $2,504.12 (-0.83%)

Token

Zombinomy (ZOMBIZZ)
 

Overview

Max Total Supply

779 ZOMBIZZ

Holders

242

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 ZOMBIZZ
0xccf0a2520592197b1a23de2efbabe27fa0715680
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Zombinomy is an NFT collection on the Ethereum Blockchain and also a society where 10,000 creepy and buzzy Zombizz vibe and thrive.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ZombitContract

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
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. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * 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;
        }
    }
}

/**
 * @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/token/ERC721/IERC721.sol

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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));
    }

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer 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 {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 {}
}

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

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

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 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/ERC721Enumerable.sol

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/zombit.sol
contract ZombitContract is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    address admin;
    uint256 public maxZombitPurchase = 10;
    uint256 public presaleMaxZombitPurchase = 5;
    uint256 public zombitPrice = 80000000000000000; //0.08 ETH
    uint256 public maxZombits = 10000;
    uint256 public saleStatus = 0; //0 close purchase,1 Pre-sale,2 public sale,3 close purchase
    mapping(address => bool) public whitelist;
    mapping(address => uint256) public totalAmount;
    // Base URI
    string private m_BaseURI = "";

    constructor(
        string memory name,
        string memory symbol,
        string memory baseURI
    ) ERC721(name, symbol) {
        admin = msg.sender;
        m_BaseURI = baseURI;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "Not admin");
        _;
    }

    /**
     * Mint Zombits
     */
    function mintZombits(uint256 numberOfTokens) public payable {
        require(
            numberOfTokens <= maxZombitPurchase,
            "Exceeds max number of Zombits in one transaction"
        );
        require(saleStatus == 1 || saleStatus == 2, "Purchase not open");
        require(
            totalSupply().add(numberOfTokens) <= maxZombits,
            "Purchase would exceed max supply of Zombits"
        );
        require(
            zombitPrice.mul(numberOfTokens) == msg.value,
            "Ether value sent is not correct"
        );
        // Pre-sale
        if (saleStatus == 1) {
            require(
                whitelist[_msgSender()],
                "No permission to participate in the pre-sale"
            );
            require(
                totalAmount[_msgSender()] + numberOfTokens <=
                    presaleMaxZombitPurchase,
                "Exceeded quantity limit"
            );
        }
        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = totalSupply();
            _safeMint(_msgSender(), tokenId);
        }
        totalAmount[_msgSender()] = totalAmount[_msgSender()] + numberOfTokens;
    }

    /**
     * Recycle Zombits
     */
    function recycleZombits(uint256 numberOfTokens) public onlyAdmin {
        require(
            totalSupply().add(numberOfTokens) <= maxZombits,
            "Purchase would exceed max supply of Zombits"
        );
        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 tokenId = totalSupply();
            _safeMint(_msgSender(), tokenId);
        }
    }

    /**
     * Add whitelist address
     */
    function addWhitelist(address[] memory addr) public onlyAdmin {
        for (uint256 i = 0; i < addr.length; i++) {
            whitelist[addr[i]] = true;
        }
    }

    /**
     * Remove whitelist address
     */
    function removeWhitelist(address[] memory addr) public onlyAdmin {
        for (uint256 i = 0; i < addr.length; i++) {
            whitelist[addr[i]] = false;
        }
    }

    /**
     * Withdraw all balance to the admin address
     */
    function withdraw() public onlyAdmin {
        uint256 balance = address(this).balance;
        require(balance > 0);
        payable(_msgSender()).transfer(balance);
    }

    //Sales switch
    function flipSaleState() public onlyAdmin {
        if (saleStatus < 3) {
            saleStatus = saleStatus + 1;
        }
    }

    function setAdmin(address addr) external onlyAdmin {
        admin = addr;
    }

    function setMaxToken(uint256 _value) external onlyAdmin {
        require(
            _value > totalSupply() && _value <= 10_000,
            "Wrong value for max supply"
        );

        maxZombits = _value;
    }

    function setPrice(uint256 _price) external onlyAdmin {
        zombitPrice = _price;
    }

    function setMaxPurchase(uint256 _value) external onlyAdmin {
        require(_value > 0, "Invalid value");
        maxZombitPurchase = _value;
    }

    function setPresaleMaxZombitPurchase(uint256 _value) external onlyAdmin {
        require(_value > 0, "Invalid value");
        presaleMaxZombitPurchase = _value;
    }

    // setBaseURI
    //  -  Metadata lives here
    function setBaseURI(string memory baseURI) external onlyAdmin {
        m_BaseURI = baseURI;
    }

    // _baseURI
    function _baseURI() internal view override returns (string memory) {
        return m_BaseURI;
    }

    //All tokens under this address
    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory ownerTokens)
    {
        uint256 tokenCount = balanceOf(_owner);

        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            for (uint256 i = 0; i < tokenCount; i++) {
                uint256 index = tokenOfOwnerByIndex(_owner, i);
                result[i] = index;
            }
            return result;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","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":"maxZombitPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxZombits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintZombits","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":"presaleMaxZombitPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"recycleZombits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addr","type":"address[]"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setAdmin","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":"_value","type":"uint256"}],"name":"setMaxPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setPresaleMaxZombitPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"ownerTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zombitPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052600a600c556005600d5567011c37937e080000600e55612710600f55600060105560405180602001604052806000815250601390805190602001906200004c929190620001d2565b503480156200005a57600080fd5b5060405162005416380380620054168339818101604052810190620000809190620002f4565b828281600090805190602001906200009a929190620001d2565b508060019080519060200190620000b3929190620001d2565b5050506000620000c8620001ca60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060139080519060200190620001c0929190620001d2565b50505050620004c6565b600033905090565b828054620001e09062000432565b90600052602060002090601f01602090048101928262000204576000855562000250565b82601f106200021f57805160ff191683800117855562000250565b8280016001018555821562000250579182015b828111156200024f57825182559160200191906001019062000232565b5b5090506200025f919062000263565b5090565b5b808211156200027e57600081600090555060010162000264565b5090565b6000620002996200029384620003c9565b62000395565b905082815260208101848484011115620002b257600080fd5b620002bf848285620003fc565b509392505050565b600082601f830112620002d957600080fd5b8151620002eb84826020860162000282565b91505092915050565b6000806000606084860312156200030a57600080fd5b600084015167ffffffffffffffff8111156200032557600080fd5b6200033386828701620002c7565b935050602084015167ffffffffffffffff8111156200035157600080fd5b6200035f86828701620002c7565b925050604084015167ffffffffffffffff8111156200037d57600080fd5b6200038b86828701620002c7565b9150509250925092565b6000604051905081810181811067ffffffffffffffff82111715620003bf57620003be62000497565b5b8060405250919050565b600067ffffffffffffffff821115620003e757620003e662000497565b5b601f19601f8301169050602081019050919050565b60005b838110156200041c578082015181840152602081019050620003ff565b838111156200042c576000848401525b50505050565b600060028204905060018216806200044b57607f821691505b6020821081141562000462576200046162000468565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614f4080620004d66000396000f3fe6080604052600436106102305760003560e01c806370a082311161012e5780639b19251a116100ab578063e985e9c51161006f578063e985e9c51461083a578063edac985b14610877578063f2fde38b146108a0578063f9020e33146108c9578063f925885e146108f457610230565b80639b19251a14610731578063a22cb4651461076e578063b88d4fde14610797578063c87b56dd146107c0578063d72b9da2146107fd57610230565b80638d6b76f0116100f25780638d6b76f01461065c5780638da5cb5b1461068757806391b7f5ed146106b257806395d89b41146106db57806395ed718d1461070657610230565b806370a082311461057757806371189742146105b4578063715018a6146105dd57806375d09d29146105f45780638462151c1461061f57610230565b80632f745c59116101bc5780634e58200e116101805780634e58200e1461048f5780634f6ccce7146104ab57806355f804b3146104e85780636352211e14610511578063704b6c021461054e57610230565b80632f745c59146103d257806334918dfd1461040f5780633890e30b146104265780633ccfd60b1461044f57806342842e0e1461046657610230565b806309acc2cb1161020357806309acc2cb1461030357806318160ddd1461032c5780631d6a89fd14610357578063232452161461038057806323b872dd146103a957610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613a75565b61091f565b6040516102699190614679565b60405180910390f35b34801561027e57600080fd5b50610287610999565b6040516102949190614694565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613b08565b610a2b565b6040516102d191906145f0565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906139f8565b610ab0565b005b34801561030f57600080fd5b5061032a60048036038101906103259190613b08565b610bc8565b005b34801561033857600080fd5b50610341610cb9565b60405161034e9190614a16565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613b08565b610cc6565b005b34801561038c57600080fd5b506103a760048036038101906103a29190613a34565b610da3565b005b3480156103b557600080fd5b506103d060048036038101906103cb91906138f2565b610eee565b005b3480156103de57600080fd5b506103f960048036038101906103f491906139f8565b610f4e565b6040516104069190614a16565b60405180910390f35b34801561041b57600080fd5b50610424610ff3565b005b34801561043257600080fd5b5061044d60048036038101906104489190613b08565b6110a6565b005b34801561045b57600080fd5b506104646111d4565b005b34801561047257600080fd5b5061048d600480360381019061048891906138f2565b6112c7565b005b6104a960048036038101906104a49190613b08565b6112e7565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613b08565b611643565b6040516104df9190614a16565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613ac7565b6116da565b005b34801561051d57600080fd5b5061053860048036038101906105339190613b08565b611784565b60405161054591906145f0565b60405180910390f35b34801561055a57600080fd5b506105756004803603810190610570919061388d565b611836565b005b34801561058357600080fd5b5061059e6004803603810190610599919061388d565b61190a565b6040516105ab9190614a16565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d69190613b08565b6119c2565b005b3480156105e957600080fd5b506105f2611a9f565b005b34801561060057600080fd5b50610609611bdc565b6040516106169190614a16565b60405180910390f35b34801561062b57600080fd5b506106466004803603810190610641919061388d565b611be2565b6040516106539190614657565b60405180910390f35b34801561066857600080fd5b50610671611d64565b60405161067e9190614a16565b60405180910390f35b34801561069357600080fd5b5061069c611d6a565b6040516106a991906145f0565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190613b08565b611d94565b005b3480156106e757600080fd5b506106f0611e2e565b6040516106fd9190614694565b60405180910390f35b34801561071257600080fd5b5061071b611ec0565b6040516107289190614a16565b60405180910390f35b34801561073d57600080fd5b506107586004803603810190610753919061388d565b611ec6565b6040516107659190614679565b60405180910390f35b34801561077a57600080fd5b50610795600480360381019061079091906139bc565b611ee6565b005b3480156107a357600080fd5b506107be60048036038101906107b99190613941565b612067565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613b08565b6120c9565b6040516107f49190614694565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f919061388d565b612170565b6040516108319190614a16565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c91906138b6565b612188565b60405161086e9190614679565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613a34565b61221c565b005b3480156108ac57600080fd5b506108c760048036038101906108c2919061388d565b612367565b005b3480156108d557600080fd5b506108de612513565b6040516108eb9190614a16565b60405180910390f35b34801561090057600080fd5b50610909612519565b6040516109169190614a16565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099257506109918261251f565b5b9050919050565b6060600080546109a890614d35565b80601f01602080910402602001604051908101604052809291908181526020018280546109d490614d35565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b5050505050905090565b6000610a3682612601565b610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90614896565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abb82611784565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2390614936565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4b61266d565b73ffffffffffffffffffffffffffffffffffffffff161480610b7a5750610b7981610b7461266d565b612188565b5b610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb0906147f6565b60405180910390fd5b610bc38383612675565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f906149f6565b60405180910390fd5b610c60610cb9565b81118015610c7057506127108111155b610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca6906149b6565b60405180910390fd5b80600f8190555050565b6000600880549050905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d906149f6565b60405180910390fd5b60008111610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d90906148f6565b60405180910390fd5b80600d8190555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a906149f6565b60405180910390fd5b60005b8151811015610eea57600060116000848481518110610e7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ee290614d67565b915050610e36565b5050565b610eff610ef961266d565b8261272e565b610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614976565b60405180910390fd5b610f4983838361280c565b505050565b6000610f598361190a565b8210610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f91906146d6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a906149f6565b60405180910390fd5b600360105410156110a457600160105461109d9190614b6a565b6010819055505b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d906149f6565b60405180910390fd5b600f5461115382611145610cb9565b612a6890919063ffffffff16565b1115611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906149d6565b60405180910390fd5b60005b818110156111d05760006111a9610cb9565b90506111bc6111b661266d565b82612a7e565b5080806111c890614d67565b915050611197565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b906149f6565b60405180910390fd5b60004790506000811161127657600080fd5b61127e61266d565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112c3573d6000803e3d6000fd5b5050565b6112e283838360405180602001604052806000815250612067565b505050565b600c5481111561132c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611323906146b6565b60405180910390fd5b6001601054148061133f57506002601054145b61137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590614756565b60405180910390fd5b600f5461139b8261138d610cb9565b612a6890919063ffffffff16565b11156113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d3906149d6565b60405180910390fd5b346113f282600e54612a9c90919063ffffffff16565b14611432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611429906147b6565b60405180910390fd5b60016010541415611567576011600061144961266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c790614956565b60405180910390fd5b600d5481601260006114e061266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115259190614b6a565b1115611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90614856565b60405180910390fd5b5b60005b818110156115a357600061157c610cb9565b905061158f61158961266d565b82612a7e565b50808061159b90614d67565b91505061156a565b5080601260006115b161266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115f69190614b6a565b6012600061160261266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600061164d610cb9565b821061168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614996565b60405180910390fd5b600882815481106116c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461176a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611761906149f6565b60405180910390fd5b806013908051906020019061178092919061361b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561182d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182490614836565b60405180910390fd5b80915050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bd906149f6565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614816565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906149f6565b60405180910390fd5b60008111611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c906148f6565b60405180910390fd5b80600c8190555050565b611aa761266d565b73ffffffffffffffffffffffffffffffffffffffff16611ac5611d6a565b73ffffffffffffffffffffffffffffffffffffffff1614611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b12906148b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600d5481565b60606000611bef8361190a565b90506000811415611c7257600067ffffffffffffffff811115611c3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611c695781602001602082028036833780820191505090505b50915050611d5f565b60008167ffffffffffffffff811115611cb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611ce25781602001602082028036833780820191505090505b50905060005b82811015611d58576000611cfc8683610f4e565b905080838381518110611d38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050508080611d5090614d67565b915050611ce8565b5080925050505b919050565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b906149f6565b60405180910390fd5b80600e8190555050565b606060018054611e3d90614d35565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6990614d35565b8015611eb65780601f10611e8b57610100808354040283529160200191611eb6565b820191906000526020600020905b815481529060010190602001808311611e9957829003601f168201915b5050505050905090565b600c5481565b60116020528060005260406000206000915054906101000a900460ff1681565b611eee61266d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390614796565b60405180910390fd5b8060056000611f6961266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661201661266d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161205b9190614679565b60405180910390a35050565b61207861207261266d565b8361272e565b6120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90614976565b60405180910390fd5b6120c384848484612ab2565b50505050565b60606120d482612601565b612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210a90614916565b60405180910390fd5b600061211d612b0e565b9050600081511161213d5760405180602001604052806000815250612168565b8061214784612ba0565b6040516020016121589291906145cc565b6040516020818303038152906040525b915050919050565b60126020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a3906149f6565b60405180910390fd5b60005b8151811015612363576001601160008484815181106122f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061235b90614d67565b9150506122af565b5050565b61236f61266d565b73ffffffffffffffffffffffffffffffffffffffff1661238d611d6a565b73ffffffffffffffffffffffffffffffffffffffff16146123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da906148b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244a90614716565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b600e5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125fa57506125f982612d4d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126e883611784565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061273982612601565b612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f906147d6565b60405180910390fd5b600061278383611784565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127f257508373ffffffffffffffffffffffffffffffffffffffff166127da84610a2b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061280357506128028185612188565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661282c82611784565b73ffffffffffffffffffffffffffffffffffffffff1614612882576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612879906148d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e990614776565b60405180910390fd5b6128fd838383612db7565b612908600082612675565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129589190614c4b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129af9190614b6a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612a769190614b6a565b905092915050565b612a98828260405180602001604052806000815250612ecb565b5050565b60008183612aaa9190614bf1565b905092915050565b612abd84848461280c565b612ac984848484612f26565b612b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aff906146f6565b60405180910390fd5b50505050565b606060138054612b1d90614d35565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4990614d35565b8015612b965780601f10612b6b57610100808354040283529160200191612b96565b820191906000526020600020905b815481529060010190602001808311612b7957829003601f168201915b5050505050905090565b60606000821415612be8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d48565b600082905060005b60008214612c1a578080612c0390614d67565b915050600a82612c139190614bc0565b9150612bf0565b60008167ffffffffffffffff811115612c5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c8e5781602001600182028036833780820191505090505b5090505b60008514612d4157600182612ca79190614c4b565b9150600a85612cb69190614db0565b6030612cc29190614b6a565b60f81b818381518110612cfe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d3a9190614bc0565b9450612c92565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dc28383836130bd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e0557612e00816130c2565b612e44565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e4357612e42838261310b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e8757612e8281613278565b612ec6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ec557612ec482826133bb565b5b5b505050565b612ed5838361343a565b612ee26000848484612f26565b612f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f18906146f6565b60405180910390fd5b505050565b6000612f478473ffffffffffffffffffffffffffffffffffffffff16613608565b156130b0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f7061266d565b8786866040518563ffffffff1660e01b8152600401612f92949392919061460b565b602060405180830381600087803b158015612fac57600080fd5b505af1925050508015612fdd57506040513d601f19601f82011682018060405250810190612fda9190613a9e565b60015b613060573d806000811461300d576040519150601f19603f3d011682016040523d82523d6000602084013e613012565b606091505b50600081511415613058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304f906146f6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130b5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131188461190a565b6131229190614c4b565b9050600060076000848152602001908152602001600020549050818114613207576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061328c9190614c4b565b90506000600960008481526020019081526020016000205490506000600883815481106132e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061332a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061339f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133c68361190a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a190614876565b60405180910390fd5b6134b381612601565b156134f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ea90614736565b60405180910390fd5b6134ff60008383612db7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461354f9190614b6a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461362790614d35565b90600052602060002090601f0160209004810192826136495760008555613690565b82601f1061366257805160ff1916838001178555613690565b82800160010185558215613690579182015b8281111561368f578251825591602001919060010190613674565b5b50905061369d91906136a1565b5090565b5b808211156136ba5760008160009055506001016136a2565b5090565b60006136d16136cc84614a62565b614a31565b905080838252602082019050828560208602820111156136f057600080fd5b60005b85811015613720578161370688826137a6565b8452602084019350602083019250506001810190506136f3565b5050509392505050565b600061373d61373884614a8e565b614a31565b90508281526020810184848401111561375557600080fd5b613760848285614cf3565b509392505050565b600061377b61377684614abe565b614a31565b90508281526020810184848401111561379357600080fd5b61379e848285614cf3565b509392505050565b6000813590506137b581614eae565b92915050565b600082601f8301126137cc57600080fd5b81356137dc8482602086016136be565b91505092915050565b6000813590506137f481614ec5565b92915050565b60008135905061380981614edc565b92915050565b60008151905061381e81614edc565b92915050565b600082601f83011261383557600080fd5b813561384584826020860161372a565b91505092915050565b600082601f83011261385f57600080fd5b813561386f848260208601613768565b91505092915050565b60008135905061388781614ef3565b92915050565b60006020828403121561389f57600080fd5b60006138ad848285016137a6565b91505092915050565b600080604083850312156138c957600080fd5b60006138d7858286016137a6565b92505060206138e8858286016137a6565b9150509250929050565b60008060006060848603121561390757600080fd5b6000613915868287016137a6565b9350506020613926868287016137a6565b925050604061393786828701613878565b9150509250925092565b6000806000806080858703121561395757600080fd5b6000613965878288016137a6565b9450506020613976878288016137a6565b935050604061398787828801613878565b925050606085013567ffffffffffffffff8111156139a457600080fd5b6139b087828801613824565b91505092959194509250565b600080604083850312156139cf57600080fd5b60006139dd858286016137a6565b92505060206139ee858286016137e5565b9150509250929050565b60008060408385031215613a0b57600080fd5b6000613a19858286016137a6565b9250506020613a2a85828601613878565b9150509250929050565b600060208284031215613a4657600080fd5b600082013567ffffffffffffffff811115613a6057600080fd5b613a6c848285016137bb565b91505092915050565b600060208284031215613a8757600080fd5b6000613a95848285016137fa565b91505092915050565b600060208284031215613ab057600080fd5b6000613abe8482850161380f565b91505092915050565b600060208284031215613ad957600080fd5b600082013567ffffffffffffffff811115613af357600080fd5b613aff8482850161384e565b91505092915050565b600060208284031215613b1a57600080fd5b6000613b2884828501613878565b91505092915050565b6000613b3d83836145ae565b60208301905092915050565b613b5281614c7f565b82525050565b6000613b6382614afe565b613b6d8185614b2c565b9350613b7883614aee565b8060005b83811015613ba9578151613b908882613b31565b9750613b9b83614b1f565b925050600181019050613b7c565b5085935050505092915050565b613bbf81614c91565b82525050565b6000613bd082614b09565b613bda8185614b3d565b9350613bea818560208601614d02565b613bf381614e9d565b840191505092915050565b6000613c0982614b14565b613c138185614b4e565b9350613c23818560208601614d02565b613c2c81614e9d565b840191505092915050565b6000613c4282614b14565b613c4c8185614b5f565b9350613c5c818560208601614d02565b80840191505092915050565b6000613c75603083614b4e565b91507f45786365656473206d6178206e756d626572206f66205a6f6d6269747320696e60008301527f206f6e65207472616e73616374696f6e000000000000000000000000000000006020830152604082019050919050565b6000613cdb602b83614b4e565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d41603283614b4e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613da7602683614b4e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e0d601c83614b4e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e4d601183614b4e565b91507f5075726368617365206e6f74206f70656e0000000000000000000000000000006000830152602082019050919050565b6000613e8d602483614b4e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ef3601983614b4e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f33601f83614b4e565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613f73602c83614b4e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613fd9603883614b4e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061403f602a83614b4e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006140a5602983614b4e565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061410b601783614b4e565b91507f4578636565646564207175616e74697479206c696d69740000000000000000006000830152602082019050919050565b600061414b602083614b4e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061418b602c83614b4e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141f1602083614b4e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614231602983614b4e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614297600d83614b4e565b91507f496e76616c69642076616c7565000000000000000000000000000000000000006000830152602082019050919050565b60006142d7602f83614b4e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061433d602183614b4e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a3602c83614b4e565b91507f4e6f207065726d697373696f6e20746f20706172746963697061746520696e2060008301527f746865207072652d73616c6500000000000000000000000000000000000000006020830152604082019050919050565b6000614409603183614b4e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061446f602c83614b4e565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006144d5601a83614b4e565b91507f57726f6e672076616c756520666f72206d617820737570706c790000000000006000830152602082019050919050565b6000614515602b83614b4e565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66205a6f6d626974730000000000000000000000000000000000000000006020830152604082019050919050565b600061457b600983614b4e565b91507f4e6f742061646d696e00000000000000000000000000000000000000000000006000830152602082019050919050565b6145b781614ce9565b82525050565b6145c681614ce9565b82525050565b60006145d88285613c37565b91506145e48284613c37565b91508190509392505050565b60006020820190506146056000830184613b49565b92915050565b60006080820190506146206000830187613b49565b61462d6020830186613b49565b61463a60408301856145bd565b818103606083015261464c8184613bc5565b905095945050505050565b600060208201905081810360008301526146718184613b58565b905092915050565b600060208201905061468e6000830184613bb6565b92915050565b600060208201905081810360008301526146ae8184613bfe565b905092915050565b600060208201905081810360008301526146cf81613c68565b9050919050565b600060208201905081810360008301526146ef81613cce565b9050919050565b6000602082019050818103600083015261470f81613d34565b9050919050565b6000602082019050818103600083015261472f81613d9a565b9050919050565b6000602082019050818103600083015261474f81613e00565b9050919050565b6000602082019050818103600083015261476f81613e40565b9050919050565b6000602082019050818103600083015261478f81613e80565b9050919050565b600060208201905081810360008301526147af81613ee6565b9050919050565b600060208201905081810360008301526147cf81613f26565b9050919050565b600060208201905081810360008301526147ef81613f66565b9050919050565b6000602082019050818103600083015261480f81613fcc565b9050919050565b6000602082019050818103600083015261482f81614032565b9050919050565b6000602082019050818103600083015261484f81614098565b9050919050565b6000602082019050818103600083015261486f816140fe565b9050919050565b6000602082019050818103600083015261488f8161413e565b9050919050565b600060208201905081810360008301526148af8161417e565b9050919050565b600060208201905081810360008301526148cf816141e4565b9050919050565b600060208201905081810360008301526148ef81614224565b9050919050565b6000602082019050818103600083015261490f8161428a565b9050919050565b6000602082019050818103600083015261492f816142ca565b9050919050565b6000602082019050818103600083015261494f81614330565b9050919050565b6000602082019050818103600083015261496f81614396565b9050919050565b6000602082019050818103600083015261498f816143fc565b9050919050565b600060208201905081810360008301526149af81614462565b9050919050565b600060208201905081810360008301526149cf816144c8565b9050919050565b600060208201905081810360008301526149ef81614508565b9050919050565b60006020820190508181036000830152614a0f8161456e565b9050919050565b6000602082019050614a2b60008301846145bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a5857614a57614e6e565b5b8060405250919050565b600067ffffffffffffffff821115614a7d57614a7c614e6e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aa957614aa8614e6e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614ad957614ad8614e6e565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b7582614ce9565b9150614b8083614ce9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bb557614bb4614de1565b5b828201905092915050565b6000614bcb82614ce9565b9150614bd683614ce9565b925082614be657614be5614e10565b5b828204905092915050565b6000614bfc82614ce9565b9150614c0783614ce9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4057614c3f614de1565b5b828202905092915050565b6000614c5682614ce9565b9150614c6183614ce9565b925082821015614c7457614c73614de1565b5b828203905092915050565b6000614c8a82614cc9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d20578082015181840152602081019050614d05565b83811115614d2f576000848401525b50505050565b60006002820490506001821680614d4d57607f821691505b60208210811415614d6157614d60614e3f565b5b50919050565b6000614d7282614ce9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614da557614da4614de1565b5b600182019050919050565b6000614dbb82614ce9565b9150614dc683614ce9565b925082614dd657614dd5614e10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614eb781614c7f565b8114614ec257600080fd5b50565b614ece81614c91565b8114614ed957600080fd5b50565b614ee581614c9d565b8114614ef057600080fd5b50565b614efc81614ce9565b8114614f0757600080fd5b5056fea2646970667358221220676673b2541ab5708a84328d036883491ae88042640f01de48e51374de125b1064736f6c63430008000033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000095a6f6d62696e6f6d79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075a4f4d42495a5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d506b5064674b4a32797846364e344648324d773367484e6b444878667a39386e564b4b6132534870745a43522f00000000000000000000

Deployed Bytecode

0x6080604052600436106102305760003560e01c806370a082311161012e5780639b19251a116100ab578063e985e9c51161006f578063e985e9c51461083a578063edac985b14610877578063f2fde38b146108a0578063f9020e33146108c9578063f925885e146108f457610230565b80639b19251a14610731578063a22cb4651461076e578063b88d4fde14610797578063c87b56dd146107c0578063d72b9da2146107fd57610230565b80638d6b76f0116100f25780638d6b76f01461065c5780638da5cb5b1461068757806391b7f5ed146106b257806395d89b41146106db57806395ed718d1461070657610230565b806370a082311461057757806371189742146105b4578063715018a6146105dd57806375d09d29146105f45780638462151c1461061f57610230565b80632f745c59116101bc5780634e58200e116101805780634e58200e1461048f5780634f6ccce7146104ab57806355f804b3146104e85780636352211e14610511578063704b6c021461054e57610230565b80632f745c59146103d257806334918dfd1461040f5780633890e30b146104265780633ccfd60b1461044f57806342842e0e1461046657610230565b806309acc2cb1161020357806309acc2cb1461030357806318160ddd1461032c5780631d6a89fd14610357578063232452161461038057806323b872dd146103a957610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613a75565b61091f565b6040516102699190614679565b60405180910390f35b34801561027e57600080fd5b50610287610999565b6040516102949190614694565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613b08565b610a2b565b6040516102d191906145f0565b60405180910390f35b3480156102e657600080fd5b5061030160048036038101906102fc91906139f8565b610ab0565b005b34801561030f57600080fd5b5061032a60048036038101906103259190613b08565b610bc8565b005b34801561033857600080fd5b50610341610cb9565b60405161034e9190614a16565b60405180910390f35b34801561036357600080fd5b5061037e60048036038101906103799190613b08565b610cc6565b005b34801561038c57600080fd5b506103a760048036038101906103a29190613a34565b610da3565b005b3480156103b557600080fd5b506103d060048036038101906103cb91906138f2565b610eee565b005b3480156103de57600080fd5b506103f960048036038101906103f491906139f8565b610f4e565b6040516104069190614a16565b60405180910390f35b34801561041b57600080fd5b50610424610ff3565b005b34801561043257600080fd5b5061044d60048036038101906104489190613b08565b6110a6565b005b34801561045b57600080fd5b506104646111d4565b005b34801561047257600080fd5b5061048d600480360381019061048891906138f2565b6112c7565b005b6104a960048036038101906104a49190613b08565b6112e7565b005b3480156104b757600080fd5b506104d260048036038101906104cd9190613b08565b611643565b6040516104df9190614a16565b60405180910390f35b3480156104f457600080fd5b5061050f600480360381019061050a9190613ac7565b6116da565b005b34801561051d57600080fd5b5061053860048036038101906105339190613b08565b611784565b60405161054591906145f0565b60405180910390f35b34801561055a57600080fd5b506105756004803603810190610570919061388d565b611836565b005b34801561058357600080fd5b5061059e6004803603810190610599919061388d565b61190a565b6040516105ab9190614a16565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d69190613b08565b6119c2565b005b3480156105e957600080fd5b506105f2611a9f565b005b34801561060057600080fd5b50610609611bdc565b6040516106169190614a16565b60405180910390f35b34801561062b57600080fd5b506106466004803603810190610641919061388d565b611be2565b6040516106539190614657565b60405180910390f35b34801561066857600080fd5b50610671611d64565b60405161067e9190614a16565b60405180910390f35b34801561069357600080fd5b5061069c611d6a565b6040516106a991906145f0565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190613b08565b611d94565b005b3480156106e757600080fd5b506106f0611e2e565b6040516106fd9190614694565b60405180910390f35b34801561071257600080fd5b5061071b611ec0565b6040516107289190614a16565b60405180910390f35b34801561073d57600080fd5b506107586004803603810190610753919061388d565b611ec6565b6040516107659190614679565b60405180910390f35b34801561077a57600080fd5b50610795600480360381019061079091906139bc565b611ee6565b005b3480156107a357600080fd5b506107be60048036038101906107b99190613941565b612067565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613b08565b6120c9565b6040516107f49190614694565b60405180910390f35b34801561080957600080fd5b50610824600480360381019061081f919061388d565b612170565b6040516108319190614a16565b60405180910390f35b34801561084657600080fd5b50610861600480360381019061085c91906138b6565b612188565b60405161086e9190614679565b60405180910390f35b34801561088357600080fd5b5061089e60048036038101906108999190613a34565b61221c565b005b3480156108ac57600080fd5b506108c760048036038101906108c2919061388d565b612367565b005b3480156108d557600080fd5b506108de612513565b6040516108eb9190614a16565b60405180910390f35b34801561090057600080fd5b50610909612519565b6040516109169190614a16565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099257506109918261251f565b5b9050919050565b6060600080546109a890614d35565b80601f01602080910402602001604051908101604052809291908181526020018280546109d490614d35565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b5050505050905090565b6000610a3682612601565b610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c90614896565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abb82611784565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2390614936565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4b61266d565b73ffffffffffffffffffffffffffffffffffffffff161480610b7a5750610b7981610b7461266d565b612188565b5b610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb0906147f6565b60405180910390fd5b610bc38383612675565b505050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f906149f6565b60405180910390fd5b610c60610cb9565b81118015610c7057506127108111155b610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca6906149b6565b60405180910390fd5b80600f8190555050565b6000600880549050905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d906149f6565b60405180910390fd5b60008111610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d90906148f6565b60405180910390fd5b80600d8190555050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2a906149f6565b60405180910390fd5b60005b8151811015610eea57600060116000848481518110610e7e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ee290614d67565b915050610e36565b5050565b610eff610ef961266d565b8261272e565b610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590614976565b60405180910390fd5b610f4983838361280c565b505050565b6000610f598361190a565b8210610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f91906146d6565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a906149f6565b60405180910390fd5b600360105410156110a457600160105461109d9190614b6a565b6010819055505b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112d906149f6565b60405180910390fd5b600f5461115382611145610cb9565b612a6890919063ffffffff16565b1115611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906149d6565b60405180910390fd5b60005b818110156111d05760006111a9610cb9565b90506111bc6111b661266d565b82612a7e565b5080806111c890614d67565b915050611197565b5050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b906149f6565b60405180910390fd5b60004790506000811161127657600080fd5b61127e61266d565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156112c3573d6000803e3d6000fd5b5050565b6112e283838360405180602001604052806000815250612067565b505050565b600c5481111561132c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611323906146b6565b60405180910390fd5b6001601054148061133f57506002601054145b61137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590614756565b60405180910390fd5b600f5461139b8261138d610cb9565b612a6890919063ffffffff16565b11156113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d3906149d6565b60405180910390fd5b346113f282600e54612a9c90919063ffffffff16565b14611432576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611429906147b6565b60405180910390fd5b60016010541415611567576011600061144961266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c790614956565b60405180910390fd5b600d5481601260006114e061266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115259190614b6a565b1115611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90614856565b60405180910390fd5b5b60005b818110156115a357600061157c610cb9565b905061158f61158961266d565b82612a7e565b50808061159b90614d67565b91505061156a565b5080601260006115b161266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115f69190614b6a565b6012600061160261266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b600061164d610cb9565b821061168e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168590614996565b60405180910390fd5b600882815481106116c8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461176a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611761906149f6565b60405180910390fd5b806013908051906020019061178092919061361b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561182d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182490614836565b60405180910390fd5b80915050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bd906149f6565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561197b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197290614816565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906149f6565b60405180910390fd5b60008111611a95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8c906148f6565b60405180910390fd5b80600c8190555050565b611aa761266d565b73ffffffffffffffffffffffffffffffffffffffff16611ac5611d6a565b73ffffffffffffffffffffffffffffffffffffffff1614611b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b12906148b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600d5481565b60606000611bef8361190a565b90506000811415611c7257600067ffffffffffffffff811115611c3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611c695781602001602082028036833780820191505090505b50915050611d5f565b60008167ffffffffffffffff811115611cb4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611ce25781602001602082028036833780820191505090505b50905060005b82811015611d58576000611cfc8683610f4e565b905080838381518110611d38577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050508080611d5090614d67565b915050611ce8565b5080925050505b919050565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b906149f6565b60405180910390fd5b80600e8190555050565b606060018054611e3d90614d35565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6990614d35565b8015611eb65780601f10611e8b57610100808354040283529160200191611eb6565b820191906000526020600020905b815481529060010190602001808311611e9957829003601f168201915b5050505050905090565b600c5481565b60116020528060005260406000206000915054906101000a900460ff1681565b611eee61266d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5390614796565b60405180910390fd5b8060056000611f6961266d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661201661266d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161205b9190614679565b60405180910390a35050565b61207861207261266d565b8361272e565b6120b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ae90614976565b60405180910390fd5b6120c384848484612ab2565b50505050565b60606120d482612601565b612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210a90614916565b60405180910390fd5b600061211d612b0e565b9050600081511161213d5760405180602001604052806000815250612168565b8061214784612ba0565b6040516020016121589291906145cc565b6040516020818303038152906040525b915050919050565b60126020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a3906149f6565b60405180910390fd5b60005b8151811015612363576001601160008484815181106122f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061235b90614d67565b9150506122af565b5050565b61236f61266d565b73ffffffffffffffffffffffffffffffffffffffff1661238d611d6a565b73ffffffffffffffffffffffffffffffffffffffff16146123e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123da906148b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244a90614716565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b600e5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125fa57506125f982612d4d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126e883611784565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061273982612601565b612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f906147d6565b60405180910390fd5b600061278383611784565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127f257508373ffffffffffffffffffffffffffffffffffffffff166127da84610a2b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061280357506128028185612188565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661282c82611784565b73ffffffffffffffffffffffffffffffffffffffff1614612882576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612879906148d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e990614776565b60405180910390fd5b6128fd838383612db7565b612908600082612675565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129589190614c4b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129af9190614b6a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612a769190614b6a565b905092915050565b612a98828260405180602001604052806000815250612ecb565b5050565b60008183612aaa9190614bf1565b905092915050565b612abd84848461280c565b612ac984848484612f26565b612b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aff906146f6565b60405180910390fd5b50505050565b606060138054612b1d90614d35565b80601f0160208091040260200160405190810160405280929190818152602001828054612b4990614d35565b8015612b965780601f10612b6b57610100808354040283529160200191612b96565b820191906000526020600020905b815481529060010190602001808311612b7957829003601f168201915b5050505050905090565b60606000821415612be8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d48565b600082905060005b60008214612c1a578080612c0390614d67565b915050600a82612c139190614bc0565b9150612bf0565b60008167ffffffffffffffff811115612c5c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c8e5781602001600182028036833780820191505090505b5090505b60008514612d4157600182612ca79190614c4b565b9150600a85612cb69190614db0565b6030612cc29190614b6a565b60f81b818381518110612cfe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d3a9190614bc0565b9450612c92565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dc28383836130bd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e0557612e00816130c2565b612e44565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e4357612e42838261310b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e8757612e8281613278565b612ec6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ec557612ec482826133bb565b5b5b505050565b612ed5838361343a565b612ee26000848484612f26565b612f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f18906146f6565b60405180910390fd5b505050565b6000612f478473ffffffffffffffffffffffffffffffffffffffff16613608565b156130b0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f7061266d565b8786866040518563ffffffff1660e01b8152600401612f92949392919061460b565b602060405180830381600087803b158015612fac57600080fd5b505af1925050508015612fdd57506040513d601f19601f82011682018060405250810190612fda9190613a9e565b60015b613060573d806000811461300d576040519150601f19603f3d011682016040523d82523d6000602084013e613012565b606091505b50600081511415613058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304f906146f6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130b5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131188461190a565b6131229190614c4b565b9050600060076000848152602001908152602001600020549050818114613207576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061328c9190614c4b565b90506000600960008481526020019081526020016000205490506000600883815481106132e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061332a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061339f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133c68361190a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a190614876565b60405180910390fd5b6134b381612601565b156134f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ea90614736565b60405180910390fd5b6134ff60008383612db7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461354f9190614b6a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461362790614d35565b90600052602060002090601f0160209004810192826136495760008555613690565b82601f1061366257805160ff1916838001178555613690565b82800160010185558215613690579182015b8281111561368f578251825591602001919060010190613674565b5b50905061369d91906136a1565b5090565b5b808211156136ba5760008160009055506001016136a2565b5090565b60006136d16136cc84614a62565b614a31565b905080838252602082019050828560208602820111156136f057600080fd5b60005b85811015613720578161370688826137a6565b8452602084019350602083019250506001810190506136f3565b5050509392505050565b600061373d61373884614a8e565b614a31565b90508281526020810184848401111561375557600080fd5b613760848285614cf3565b509392505050565b600061377b61377684614abe565b614a31565b90508281526020810184848401111561379357600080fd5b61379e848285614cf3565b509392505050565b6000813590506137b581614eae565b92915050565b600082601f8301126137cc57600080fd5b81356137dc8482602086016136be565b91505092915050565b6000813590506137f481614ec5565b92915050565b60008135905061380981614edc565b92915050565b60008151905061381e81614edc565b92915050565b600082601f83011261383557600080fd5b813561384584826020860161372a565b91505092915050565b600082601f83011261385f57600080fd5b813561386f848260208601613768565b91505092915050565b60008135905061388781614ef3565b92915050565b60006020828403121561389f57600080fd5b60006138ad848285016137a6565b91505092915050565b600080604083850312156138c957600080fd5b60006138d7858286016137a6565b92505060206138e8858286016137a6565b9150509250929050565b60008060006060848603121561390757600080fd5b6000613915868287016137a6565b9350506020613926868287016137a6565b925050604061393786828701613878565b9150509250925092565b6000806000806080858703121561395757600080fd5b6000613965878288016137a6565b9450506020613976878288016137a6565b935050604061398787828801613878565b925050606085013567ffffffffffffffff8111156139a457600080fd5b6139b087828801613824565b91505092959194509250565b600080604083850312156139cf57600080fd5b60006139dd858286016137a6565b92505060206139ee858286016137e5565b9150509250929050565b60008060408385031215613a0b57600080fd5b6000613a19858286016137a6565b9250506020613a2a85828601613878565b9150509250929050565b600060208284031215613a4657600080fd5b600082013567ffffffffffffffff811115613a6057600080fd5b613a6c848285016137bb565b91505092915050565b600060208284031215613a8757600080fd5b6000613a95848285016137fa565b91505092915050565b600060208284031215613ab057600080fd5b6000613abe8482850161380f565b91505092915050565b600060208284031215613ad957600080fd5b600082013567ffffffffffffffff811115613af357600080fd5b613aff8482850161384e565b91505092915050565b600060208284031215613b1a57600080fd5b6000613b2884828501613878565b91505092915050565b6000613b3d83836145ae565b60208301905092915050565b613b5281614c7f565b82525050565b6000613b6382614afe565b613b6d8185614b2c565b9350613b7883614aee565b8060005b83811015613ba9578151613b908882613b31565b9750613b9b83614b1f565b925050600181019050613b7c565b5085935050505092915050565b613bbf81614c91565b82525050565b6000613bd082614b09565b613bda8185614b3d565b9350613bea818560208601614d02565b613bf381614e9d565b840191505092915050565b6000613c0982614b14565b613c138185614b4e565b9350613c23818560208601614d02565b613c2c81614e9d565b840191505092915050565b6000613c4282614b14565b613c4c8185614b5f565b9350613c5c818560208601614d02565b80840191505092915050565b6000613c75603083614b4e565b91507f45786365656473206d6178206e756d626572206f66205a6f6d6269747320696e60008301527f206f6e65207472616e73616374696f6e000000000000000000000000000000006020830152604082019050919050565b6000613cdb602b83614b4e565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d41603283614b4e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613da7602683614b4e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e0d601c83614b4e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e4d601183614b4e565b91507f5075726368617365206e6f74206f70656e0000000000000000000000000000006000830152602082019050919050565b6000613e8d602483614b4e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ef3601983614b4e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f33601f83614b4e565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613f73602c83614b4e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613fd9603883614b4e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061403f602a83614b4e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006140a5602983614b4e565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061410b601783614b4e565b91507f4578636565646564207175616e74697479206c696d69740000000000000000006000830152602082019050919050565b600061414b602083614b4e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061418b602c83614b4e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141f1602083614b4e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614231602983614b4e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614297600d83614b4e565b91507f496e76616c69642076616c7565000000000000000000000000000000000000006000830152602082019050919050565b60006142d7602f83614b4e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061433d602183614b4e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a3602c83614b4e565b91507f4e6f207065726d697373696f6e20746f20706172746963697061746520696e2060008301527f746865207072652d73616c6500000000000000000000000000000000000000006020830152604082019050919050565b6000614409603183614b4e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061446f602c83614b4e565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006144d5601a83614b4e565b91507f57726f6e672076616c756520666f72206d617820737570706c790000000000006000830152602082019050919050565b6000614515602b83614b4e565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66205a6f6d626974730000000000000000000000000000000000000000006020830152604082019050919050565b600061457b600983614b4e565b91507f4e6f742061646d696e00000000000000000000000000000000000000000000006000830152602082019050919050565b6145b781614ce9565b82525050565b6145c681614ce9565b82525050565b60006145d88285613c37565b91506145e48284613c37565b91508190509392505050565b60006020820190506146056000830184613b49565b92915050565b60006080820190506146206000830187613b49565b61462d6020830186613b49565b61463a60408301856145bd565b818103606083015261464c8184613bc5565b905095945050505050565b600060208201905081810360008301526146718184613b58565b905092915050565b600060208201905061468e6000830184613bb6565b92915050565b600060208201905081810360008301526146ae8184613bfe565b905092915050565b600060208201905081810360008301526146cf81613c68565b9050919050565b600060208201905081810360008301526146ef81613cce565b9050919050565b6000602082019050818103600083015261470f81613d34565b9050919050565b6000602082019050818103600083015261472f81613d9a565b9050919050565b6000602082019050818103600083015261474f81613e00565b9050919050565b6000602082019050818103600083015261476f81613e40565b9050919050565b6000602082019050818103600083015261478f81613e80565b9050919050565b600060208201905081810360008301526147af81613ee6565b9050919050565b600060208201905081810360008301526147cf81613f26565b9050919050565b600060208201905081810360008301526147ef81613f66565b9050919050565b6000602082019050818103600083015261480f81613fcc565b9050919050565b6000602082019050818103600083015261482f81614032565b9050919050565b6000602082019050818103600083015261484f81614098565b9050919050565b6000602082019050818103600083015261486f816140fe565b9050919050565b6000602082019050818103600083015261488f8161413e565b9050919050565b600060208201905081810360008301526148af8161417e565b9050919050565b600060208201905081810360008301526148cf816141e4565b9050919050565b600060208201905081810360008301526148ef81614224565b9050919050565b6000602082019050818103600083015261490f8161428a565b9050919050565b6000602082019050818103600083015261492f816142ca565b9050919050565b6000602082019050818103600083015261494f81614330565b9050919050565b6000602082019050818103600083015261496f81614396565b9050919050565b6000602082019050818103600083015261498f816143fc565b9050919050565b600060208201905081810360008301526149af81614462565b9050919050565b600060208201905081810360008301526149cf816144c8565b9050919050565b600060208201905081810360008301526149ef81614508565b9050919050565b60006020820190508181036000830152614a0f8161456e565b9050919050565b6000602082019050614a2b60008301846145bd565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a5857614a57614e6e565b5b8060405250919050565b600067ffffffffffffffff821115614a7d57614a7c614e6e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aa957614aa8614e6e565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614ad957614ad8614e6e565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b7582614ce9565b9150614b8083614ce9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bb557614bb4614de1565b5b828201905092915050565b6000614bcb82614ce9565b9150614bd683614ce9565b925082614be657614be5614e10565b5b828204905092915050565b6000614bfc82614ce9565b9150614c0783614ce9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c4057614c3f614de1565b5b828202905092915050565b6000614c5682614ce9565b9150614c6183614ce9565b925082821015614c7457614c73614de1565b5b828203905092915050565b6000614c8a82614cc9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d20578082015181840152602081019050614d05565b83811115614d2f576000848401525b50505050565b60006002820490506001821680614d4d57607f821691505b60208210811415614d6157614d60614e3f565b5b50919050565b6000614d7282614ce9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614da557614da4614de1565b5b600182019050919050565b6000614dbb82614ce9565b9150614dc683614ce9565b925082614dd657614dd5614e10565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614eb781614c7f565b8114614ec257600080fd5b50565b614ece81614c91565b8114614ed957600080fd5b50565b614ee581614c9d565b8114614ef057600080fd5b50565b614efc81614ce9565b8114614f0757600080fd5b5056fea2646970667358221220676673b2541ab5708a84328d036883491ae88042640f01de48e51374de125b1064736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000095a6f6d62696e6f6d79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075a4f4d42495a5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d506b5064674b4a32797846364e344648324d773367484e6b444878667a39386e564b4b6132534870745a43522f00000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Zombinomy
Arg [1] : symbol (string): ZOMBIZZ
Arg [2] : baseURI (string): ipfs://QmPkPdgKJ2yxF6N4FH2Mw3gHNkDHxfz98nVKKa2SHptZCR/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 5a6f6d62696e6f6d790000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 5a4f4d42495a5a00000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [8] : 697066733a2f2f516d506b5064674b4a32797846364e344648324d773367484e
Arg [9] : 6b444878667a39386e564b4b6132534870745a43522f00000000000000000000


Deployed Bytecode Sourcemap

52392:5121:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43620:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29823:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31405:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30928:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55930:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44423:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56422:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55240:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32464:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44004:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55698:134;;;;;;;;;;;;;:::i;:::-;;54567:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55494:176;;;;;;;;;;;;;:::i;:::-;;32911:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53303:1214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44613:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56652:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29430:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55840:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29073:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56263:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51770:148;;;;;;;;;;;;;:::i;:::-;;52549:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56924:586;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52663:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51119:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56163:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29992:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52505:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52800:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31785:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33167:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30167:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52848:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32183:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55007:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52073:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52703:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52599:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43620:300;43767:4;43824:35;43809:50;;;:11;:50;;;;:103;;;;43876:36;43900:11;43876:23;:36::i;:::-;43809:103;43789:123;;43620:300;;;:::o;29823:100::-;29877:13;29910:5;29903:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29823:100;:::o;31405:308::-;31526:7;31573:16;31581:7;31573;:16::i;:::-;31551:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31681:15;:24;31697:7;31681:24;;;;;;;;;;;;;;;;;;;;;31674:31;;31405:308;;;:::o;30928:411::-;31009:13;31025:23;31040:7;31025:14;:23::i;:::-;31009:39;;31073:5;31067:11;;:2;:11;;;;31059:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31167:5;31151:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31176:37;31193:5;31200:12;:10;:12::i;:::-;31176:16;:37::i;:::-;31151:62;31129:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31310:21;31319:2;31323:7;31310:8;:21::i;:::-;30928:411;;;:::o;55930:225::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;56028:13:::1;:11;:13::i;:::-;56019:6;:22;:42;;;;;56055:6;56045;:16;;56019:42;55997:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;56141:6;56128:10;:19;;;;55930:225:::0;:::o;44423:113::-;44484:7;44511:10;:17;;;;44504:24;;44423:113;:::o;56422:171::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;56522:1:::1;56513:6;:10;56505:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;56579:6;56552:24;:33;;;;56422:171:::0;:::o;55240:178::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;55321:9:::1;55316:95;55340:4;:11;55336:1;:15;55316:95;;;55394:5;55373:9;:18;55383:4;55388:1;55383:7;;;;;;;;;;;;;;;;;;;;;;55373:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;55353:3;;;;;:::i;:::-;;;;55316:95;;;;55240:178:::0;:::o;32464:376::-;32673:41;32692:12;:10;:12::i;:::-;32706:7;32673:18;:41::i;:::-;32651:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;32804:28;32814:4;32820:2;32824:7;32804:9;:28::i;:::-;32464:376;;;:::o;44004:343::-;44146:7;44201:23;44218:5;44201:16;:23::i;:::-;44193:5;:31;44171:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;44313:12;:19;44326:5;44313:19;;;;;;;;;;;;;;;:26;44333:5;44313:26;;;;;;;;;;;;44306:33;;44004:343;;;;:::o;55698:134::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;55768:1:::1;55755:10;;:14;55751:74;;;55812:1;55799:10;;:14;;;;:::i;:::-;55786:10;:27;;;;55751:74;55698:134::o:0;54567:384::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;54702:10:::1;;54665:33;54683:14;54665:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;54643:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;54799:9;54794:150;54818:14;54814:1;:18;54794:150;;;54854:15;54872:13;:11;:13::i;:::-;54854:31;;54900:32;54910:12;:10;:12::i;:::-;54924:7;54900:9;:32::i;:::-;54794:150;54834:3;;;;;:::i;:::-;;;;54794:150;;;;54567:384:::0;:::o;55494:176::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;55542:15:::1;55560:21;55542:39;;55610:1;55600:7;:11;55592:20;;;::::0;::::1;;55631:12;:10;:12::i;:::-;55623:30;;:39;55654:7;55623:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;53247:1;55494:176::o:0;32911:185::-;33049:39;33066:4;33072:2;33076:7;33049:39;;;;;;;;;;;;:16;:39::i;:::-;32911:185;;;:::o;53303:1214::-;53414:17;;53396:14;:35;;53374:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;53540:1;53526:10;;:15;:34;;;;53559:1;53545:10;;:15;53526:34;53518:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;53652:10;;53615:33;53633:14;53615:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;53593:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;53801:9;53766:31;53782:14;53766:11;;:15;;:31;;;;:::i;:::-;:44;53744:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;53919:1;53905:10;;:15;53901:368;;;53963:9;:23;53973:12;:10;:12::i;:::-;53963:23;;;;;;;;;;;;;;;;;;;;;;;;;53937:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;54174:24;;54135:14;54107:11;:25;54119:12;:10;:12::i;:::-;54107:25;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:91;;54081:176;;;;;;;;;;;;:::i;:::-;;;;;;;;;53901:368;54284:9;54279:150;54303:14;54299:1;:18;54279:150;;;54339:15;54357:13;:11;:13::i;:::-;54339:31;;54385:32;54395:12;:10;:12::i;:::-;54409:7;54385:9;:32::i;:::-;54279:150;54319:3;;;;;:::i;:::-;;;;54279:150;;;;54495:14;54467:11;:25;54479:12;:10;:12::i;:::-;54467:25;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;54439:11;:25;54451:12;:10;:12::i;:::-;54439:25;;;;;;;;;;;;;;;:70;;;;53303:1214;:::o;44613:320::-;44733:7;44788:30;:28;:30::i;:::-;44780:5;:38;44758:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;44908:10;44919:5;44908:17;;;;;;;;;;;;;;;;;;;;;;;;44901:24;;44613:320;;;:::o;56652:100::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;56737:7:::1;56725:9;:19;;;;;;;;;;;;:::i;:::-;;56652:100:::0;:::o;29430:326::-;29547:7;29572:13;29588:7;:16;29596:7;29588:16;;;;;;;;;;;;;;;;;;;;;29572:32;;29654:1;29637:19;;:5;:19;;;;29615:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;29743:5;29736:12;;;29430:326;;;:::o;55840:82::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;55910:4:::1;55902:5;;:12;;;;;;;;;;;;;;;;;;55840:82:::0;:::o;29073:295::-;29190:7;29254:1;29237:19;;:5;:19;;;;29215:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29344:9;:16;29354:5;29344:16;;;;;;;;;;;;;;;;29337:23;;29073:295;;;:::o;56263:151::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;56350:1:::1;56341:6;:10;56333:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;56400:6;56380:17;:26;;;;56263:151:::0;:::o;51770:148::-;51350:12;:10;:12::i;:::-;51339:23;;:7;:5;:7::i;:::-;:23;;;51331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51877:1:::1;51840:40;;51861:6;;;;;;;;;;;51840:40;;;;;;;;;;;;51908:1;51891:6;;:19;;;;;;;;;;;;;;;;;;51770:148::o:0;52549:43::-;;;;:::o;56924:586::-;57013:28;57059:18;57080:17;57090:6;57080:9;:17::i;:::-;57059:38;;57128:1;57114:10;:15;57110:393;;;57205:1;57191:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57184:23;;;;;57110:393;57240:23;57280:10;57266:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57240:51;;57311:9;57306:158;57330:10;57326:1;:14;57306:158;;;57366:13;57382:30;57402:6;57410:1;57382:19;:30::i;:::-;57366:46;;57443:5;57431:6;57438:1;57431:9;;;;;;;;;;;;;;;;;;;;;:17;;;;;57306:158;57342:3;;;;;:::i;:::-;;;;57306:158;;;;57485:6;57478:13;;;;56924:586;;;;:::o;52663:33::-;;;;:::o;51119:87::-;51165:7;51192:6;;;;;;;;;;;51185:13;;51119:87;:::o;56163:92::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;56241:6:::1;56227:11;:20;;;;56163:92:::0;:::o;29992:104::-;30048:13;30081:7;30074:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29992:104;:::o;52505:37::-;;;;:::o;52800:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;31785:327::-;31932:12;:10;:12::i;:::-;31920:24;;:8;:24;;;;31912:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32032:8;31987:18;:32;32006:12;:10;:12::i;:::-;31987:32;;;;;;;;;;;;;;;:42;32020:8;31987:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32085:8;32056:48;;32071:12;:10;:12::i;:::-;32056:48;;;32095:8;32056:48;;;;;;:::i;:::-;;;;;;;;31785:327;;:::o;33167:365::-;33356:41;33375:12;:10;:12::i;:::-;33389:7;33356:18;:41::i;:::-;33334:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;33485:39;33499:4;33505:2;33509:7;33518:5;33485:13;:39::i;:::-;33167:365;;;;:::o;30167:468::-;30285:13;30338:16;30346:7;30338;:16::i;:::-;30316:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;30442:21;30466:10;:8;:10::i;:::-;30442:34;;30531:1;30513:7;30507:21;:25;:120;;;;;;;;;;;;;;;;;30576:7;30585:18;:7;:16;:18::i;:::-;30559:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30507:120;30487:140;;;30167:468;;;:::o;52848:46::-;;;;;;;;;;;;;;;;;:::o;32183:214::-;32325:4;32354:18;:25;32373:5;32354:25;;;;;;;;;;;;;;;:35;32380:8;32354:35;;;;;;;;;;;;;;;;;;;;;;;;;32347:42;;32183:214;;;;:::o;55007:174::-;53217:5;;;;;;;;;;;53203:19;;:10;:19;;;53195:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;55085:9:::1;55080:94;55104:4;:11;55100:1;:15;55080:94;;;55158:4;55137:9;:18;55147:4;55152:1;55147:7;;;;;;;;;;;;;;;;;;;;;;55137:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;55117:3;;;;;:::i;:::-;;;;55080:94;;;;55007:174:::0;:::o;52073:281::-;51350:12;:10;:12::i;:::-;51339:23;;:7;:5;:7::i;:::-;:23;;;51331:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52196:1:::1;52176:22;;:8;:22;;;;52154:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;52309:8;52280:38;;52301:6;;;;;;;;;;;52280:38;;;;;;;;;;;;52338:8;52329:6;;:17;;;;;;;;;;;;;;;;;;52073:281:::0;:::o;52703:29::-;;;;:::o;52599:46::-;;;;:::o;28654:355::-;28801:4;28858:25;28843:40;;;:11;:40;;;;:105;;;;28915:33;28900:48;;;:11;:48;;;;28843:105;:158;;;;28965:36;28989:11;28965:23;:36::i;:::-;28843:158;28823:178;;28654:355;;;:::o;35079:127::-;35144:4;35196:1;35168:30;;:7;:16;35176:7;35168:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35161:37;;35079:127;;;:::o;23977:98::-;24030:7;24057:10;24050:17;;23977:98;:::o;39202:174::-;39304:2;39277:15;:24;39293:7;39277:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39360:7;39356:2;39322:46;;39331:23;39346:7;39331:14;:23::i;:::-;39322:46;;;;;;;;;;;;39202:174;;:::o;35373:452::-;35502:4;35546:16;35554:7;35546;:16::i;:::-;35524:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;35645:13;35661:23;35676:7;35661:14;:23::i;:::-;35645:39;;35714:5;35703:16;;:7;:16;;;:64;;;;35760:7;35736:31;;:20;35748:7;35736:11;:20::i;:::-;:31;;;35703:64;:113;;;;35784:32;35801:5;35808:7;35784:16;:32::i;:::-;35703:113;35695:122;;;35373:452;;;;:::o;38469:615::-;38642:4;38615:31;;:23;38630:7;38615:14;:23::i;:::-;:31;;;38593:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;38748:1;38734:16;;:2;:16;;;;38726:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38804:39;38825:4;38831:2;38835:7;38804:20;:39::i;:::-;38908:29;38925:1;38929:7;38908:8;:29::i;:::-;38969:1;38950:9;:15;38960:4;38950:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;38998:1;38981:9;:13;38991:2;38981:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39029:2;39010:7;:16;39018:7;39010:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39068:7;39064:2;39049:27;;39058:4;39049:27;;;;;;;;;;;;38469:615;;;:::o;2992:98::-;3050:7;3081:1;3077;:5;;;;:::i;:::-;3070:12;;2992:98;;;;:::o;36167:110::-;36243:26;36253:2;36257:7;36243:26;;;;;;;;;;;;:9;:26::i;:::-;36167:110;;:::o;3730:98::-;3788:7;3819:1;3815;:5;;;;:::i;:::-;3808:12;;3730:98;;;;:::o;34414:352::-;34571:28;34581:4;34587:2;34591:7;34571:9;:28::i;:::-;34632:48;34655:4;34661:2;34665:7;34674:5;34632:22;:48::i;:::-;34610:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;34414:352;;;;:::o;56777:102::-;56829:13;56862:9;56855:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56777:102;:::o;24601:723::-;24657:13;24887:1;24878:5;:10;24874:53;;;24905:10;;;;;;;;;;;;;;;;;;;;;24874:53;24937:12;24952:5;24937:20;;24968:14;24993:78;25008:1;25000:4;:9;24993:78;;25026:8;;;;;:::i;:::-;;;;25057:2;25049:10;;;;;:::i;:::-;;;24993:78;;;25081:19;25113:6;25103:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25081:39;;25131:154;25147:1;25138:5;:10;25131:154;;25175:1;25165:11;;;;;:::i;:::-;;;25242:2;25234:5;:10;;;;:::i;:::-;25221:2;:24;;;;:::i;:::-;25208:39;;25191:6;25198;25191:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;25271:2;25262:11;;;;;:::i;:::-;;;25131:154;;;25309:6;25295:21;;;;;24601:723;;;;:::o;27153:207::-;27283:4;27327:25;27312:40;;;:11;:40;;;;27305:47;;27153:207;;;:::o;45546:589::-;45690:45;45717:4;45723:2;45727:7;45690:26;:45::i;:::-;45768:1;45752:18;;:4;:18;;;45748:187;;;45787:40;45819:7;45787:31;:40::i;:::-;45748:187;;;45857:2;45849:10;;:4;:10;;;45845:90;;45876:47;45909:4;45915:7;45876:32;:47::i;:::-;45845:90;45748:187;45963:1;45949:16;;:2;:16;;;45945:183;;;45982:45;46019:7;45982:36;:45::i;:::-;45945:183;;;46055:4;46049:10;;:2;:10;;;46045:83;;46076:40;46104:2;46108:7;46076:27;:40::i;:::-;46045:83;45945:183;45546:589;;;:::o;36504:321::-;36634:18;36640:2;36644:7;36634:5;:18::i;:::-;36685:54;36716:1;36720:2;36724:7;36733:5;36685:22;:54::i;:::-;36663:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36504:321;;;:::o;39941:1053::-;40096:4;40117:15;:2;:13;;;:15::i;:::-;40113:874;;;40186:2;40170:36;;;40229:12;:10;:12::i;:::-;40264:4;40291:7;40321:5;40170:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40149:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40549:1;40532:6;:13;:18;40528:389;;;40575:108;;;;;;;;;;:::i;:::-;;;;;;;;40528:389;40867:6;40861:13;40852:6;40848:2;40844:15;40837:38;40149:783;40419:45;;;40409:55;;;:6;:55;;;;40402:62;;;;;40113:874;40971:4;40964:11;;39941:1053;;;;;;;:::o;41607:126::-;;;;:::o;46858:164::-;46962:10;:17;;;;46935:15;:24;46951:7;46935:24;;;;;;;;;;;:44;;;;46990:10;47006:7;46990:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46858:164;:::o;47649:1002::-;47929:22;47979:1;47954:22;47971:4;47954:16;:22::i;:::-;:26;;;;:::i;:::-;47929:51;;47991:18;48012:17;:26;48030:7;48012:26;;;;;;;;;;;;47991:47;;48159:14;48145:10;:28;48141:328;;48190:19;48212:12;:18;48225:4;48212:18;;;;;;;;;;;;;;;:34;48231:14;48212:34;;;;;;;;;;;;48190:56;;48296:11;48263:12;:18;48276:4;48263:18;;;;;;;;;;;;;;;:30;48282:10;48263:30;;;;;;;;;;;:44;;;;48413:10;48380:17;:30;48398:11;48380:30;;;;;;;;;;;:43;;;;48141:328;;48565:17;:26;48583:7;48565:26;;;;;;;;;;;48558:33;;;48609:12;:18;48622:4;48609:18;;;;;;;;;;;;;;;:34;48628:14;48609:34;;;;;;;;;;;48602:41;;;47649:1002;;;;:::o;48946:1079::-;49199:22;49244:1;49224:10;:17;;;;:21;;;;:::i;:::-;49199:46;;49256:18;49277:15;:24;49293:7;49277:24;;;;;;;;;;;;49256:45;;49628:19;49650:10;49661:14;49650:26;;;;;;;;;;;;;;;;;;;;;;;;49628:48;;49714:11;49689:10;49700;49689:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;49825:10;49794:15;:28;49810:11;49794:28;;;;;;;;;;;:41;;;;49966:15;:24;49982:7;49966:24;;;;;;;;;;;49959:31;;;50001:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48946:1079;;;;:::o;46436:221::-;46521:14;46538:20;46555:2;46538:16;:20::i;:::-;46521:37;;46596:7;46569:12;:16;46582:2;46569:16;;;;;;;;;;;;;;;:24;46586:6;46569:24;;;;;;;;;;;:34;;;;46643:6;46614:17;:26;46632:7;46614:26;;;;;;;;;;;:35;;;;46436:221;;;:::o;37161:382::-;37255:1;37241:16;;:2;:16;;;;37233:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37314:16;37322:7;37314;:16::i;:::-;37313:17;37305:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37376:45;37405:1;37409:2;37413:7;37376:20;:45::i;:::-;37451:1;37434:9;:13;37444:2;37434:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37482:2;37463:7;:16;37471:7;37463:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37527:7;37523:2;37502:33;;37519:1;37502:33;;;;;;;;;;;;37161:382;;:::o;15424:444::-;15484:4;15692:12;15816:7;15804:20;15796:28;;15859:1;15852:4;:8;15845:15;;;15424:444;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:262::-;;3086:2;3074:9;3065:7;3061:23;3057:32;3054:2;;;3102:1;3099;3092:12;3054:2;3145:1;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3116:117;3044:196;;;;:::o;3246:407::-;;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3387:1;3384;3377:12;3339:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3557:2;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3528:118;3329:324;;;;;:::o;3659:552::-;;;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3987:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3958:118;4115:2;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4086:118;3759:452;;;;;:::o;4217:809::-;;;;;4385:3;4373:9;4364:7;4360:23;4356:33;4353:2;;;4402:1;4399;4392:12;4353:2;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4856:2;4845:9;4841:18;4828:32;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4799:220;4343:683;;;;;;;:::o;5032:401::-;;;5154:2;5142:9;5133:7;5129:23;5125:32;5122:2;;;5170:1;5167;5160:12;5122:2;5213:1;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5184:117;5340:2;5366:50;5408:7;5399:6;5388:9;5384:22;5366:50;:::i;:::-;5356:60;;5311:115;5112:321;;;;;:::o;5439:407::-;;;5564:2;5552:9;5543:7;5539:23;5535:32;5532:2;;;5580:1;5577;5570:12;5532:2;5623:1;5648:53;5693:7;5684:6;5673:9;5669:22;5648:53;:::i;:::-;5638:63;;5594:117;5750:2;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5721:118;5522:324;;;;;:::o;5852:405::-;;5985:2;5973:9;5964:7;5960:23;5956:32;5953:2;;;6001:1;5998;5991:12;5953:2;6072:1;6061:9;6057:17;6044:31;6102:18;6094:6;6091:30;6088:2;;;6134:1;6131;6124:12;6088:2;6162:78;6232:7;6223:6;6212:9;6208:22;6162:78;:::i;:::-;6152:88;;6015:235;5943:314;;;;:::o;6263:260::-;;6370:2;6358:9;6349:7;6345:23;6341:32;6338:2;;;6386:1;6383;6376:12;6338:2;6429:1;6454:52;6498:7;6489:6;6478:9;6474:22;6454:52;:::i;:::-;6444:62;;6400:116;6328:195;;;;:::o;6529:282::-;;6647:2;6635:9;6626:7;6622:23;6618:32;6615:2;;;6663:1;6660;6653:12;6615:2;6706:1;6731:63;6786:7;6777:6;6766:9;6762:22;6731:63;:::i;:::-;6721:73;;6677:127;6605:206;;;;:::o;6817:375::-;;6935:2;6923:9;6914:7;6910:23;6906:32;6903:2;;;6951:1;6948;6941:12;6903:2;7022:1;7011:9;7007:17;6994:31;7052:18;7044:6;7041:30;7038:2;;;7084:1;7081;7074:12;7038:2;7112:63;7167:7;7158:6;7147:9;7143:22;7112:63;:::i;:::-;7102:73;;6965:220;6893:299;;;;:::o;7198:262::-;;7306:2;7294:9;7285:7;7281:23;7277:32;7274:2;;;7322:1;7319;7312:12;7274:2;7365:1;7390:53;7435:7;7426:6;7415:9;7411:22;7390:53;:::i;:::-;7380:63;;7336:117;7264:196;;;;:::o;7466:179::-;;7556:46;7598:3;7590:6;7556:46;:::i;:::-;7634:4;7629:3;7625:14;7611:28;;7546:99;;;;:::o;7651:118::-;7738:24;7756:5;7738:24;:::i;:::-;7733:3;7726:37;7716:53;;:::o;7805:732::-;;7953:54;8001:5;7953:54;:::i;:::-;8023:86;8102:6;8097:3;8023:86;:::i;:::-;8016:93;;8133:56;8183:5;8133:56;:::i;:::-;8212:7;8243:1;8228:284;8253:6;8250:1;8247:13;8228:284;;;8329:6;8323:13;8356:63;8415:3;8400:13;8356:63;:::i;:::-;8349:70;;8442:60;8495:6;8442:60;:::i;:::-;8432:70;;8288:224;8275:1;8272;8268:9;8263:14;;8228:284;;;8232:14;8528:3;8521:10;;7929:608;;;;;;;:::o;8543:109::-;8624:21;8639:5;8624:21;:::i;:::-;8619:3;8612:34;8602:50;;:::o;8658:360::-;;8772:38;8804:5;8772:38;:::i;:::-;8826:70;8889:6;8884:3;8826:70;:::i;:::-;8819:77;;8905:52;8950:6;8945:3;8938:4;8931:5;8927:16;8905:52;:::i;:::-;8982:29;9004:6;8982:29;:::i;:::-;8977:3;8973:39;8966:46;;8748:270;;;;;:::o;9024:364::-;;9140:39;9173:5;9140:39;:::i;:::-;9195:71;9259:6;9254:3;9195:71;:::i;:::-;9188:78;;9275:52;9320:6;9315:3;9308:4;9301:5;9297:16;9275:52;:::i;:::-;9352:29;9374:6;9352:29;:::i;:::-;9347:3;9343:39;9336:46;;9116:272;;;;;:::o;9394:377::-;;9528:39;9561:5;9528:39;:::i;:::-;9583:89;9665:6;9660:3;9583:89;:::i;:::-;9576:96;;9681:52;9726:6;9721:3;9714:4;9707:5;9703:16;9681:52;:::i;:::-;9758:6;9753:3;9749:16;9742:23;;9504:267;;;;;:::o;9777:380::-;;9940:67;10004:2;9999:3;9940:67;:::i;:::-;9933:74;;10037:34;10033:1;10028:3;10024:11;10017:55;10103:18;10098:2;10093:3;10089:12;10082:40;10148:2;10143:3;10139:12;10132:19;;9923:234;;;:::o;10163:375::-;;10326:67;10390:2;10385:3;10326:67;:::i;:::-;10319:74;;10423:34;10419:1;10414:3;10410:11;10403:55;10489:13;10484:2;10479:3;10475:12;10468:35;10529:2;10524:3;10520:12;10513:19;;10309:229;;;:::o;10544:382::-;;10707:67;10771:2;10766:3;10707:67;:::i;:::-;10700:74;;10804:34;10800:1;10795:3;10791:11;10784:55;10870:20;10865:2;10860:3;10856:12;10849:42;10917:2;10912:3;10908:12;10901:19;;10690:236;;;:::o;10932:370::-;;11095:67;11159:2;11154:3;11095:67;:::i;:::-;11088:74;;11192:34;11188:1;11183:3;11179:11;11172:55;11258:8;11253:2;11248:3;11244:12;11237:30;11293:2;11288:3;11284:12;11277:19;;11078:224;;;:::o;11308:326::-;;11471:67;11535:2;11530:3;11471:67;:::i;:::-;11464:74;;11568:30;11564:1;11559:3;11555:11;11548:51;11625:2;11620:3;11616:12;11609:19;;11454:180;;;:::o;11640:315::-;;11803:67;11867:2;11862:3;11803:67;:::i;:::-;11796:74;;11900:19;11896:1;11891:3;11887:11;11880:40;11946:2;11941:3;11937:12;11930:19;;11786:169;;;:::o;11961:368::-;;12124:67;12188:2;12183:3;12124:67;:::i;:::-;12117:74;;12221:34;12217:1;12212:3;12208:11;12201:55;12287:6;12282:2;12277:3;12273:12;12266:28;12320:2;12315:3;12311:12;12304:19;;12107:222;;;:::o;12335:323::-;;12498:67;12562:2;12557:3;12498:67;:::i;:::-;12491:74;;12595:27;12591:1;12586:3;12582:11;12575:48;12649:2;12644:3;12640:12;12633:19;;12481:177;;;:::o;12664:329::-;;12827:67;12891:2;12886:3;12827:67;:::i;:::-;12820:74;;12924:33;12920:1;12915:3;12911:11;12904:54;12984:2;12979:3;12975:12;12968:19;;12810:183;;;:::o;12999:376::-;;13162:67;13226:2;13221:3;13162:67;:::i;:::-;13155:74;;13259:34;13255:1;13250:3;13246:11;13239:55;13325:14;13320:2;13315:3;13311:12;13304:36;13366:2;13361:3;13357:12;13350:19;;13145:230;;;:::o;13381:388::-;;13544:67;13608:2;13603:3;13544:67;:::i;:::-;13537:74;;13641:34;13637:1;13632:3;13628:11;13621:55;13707:26;13702:2;13697:3;13693:12;13686:48;13760:2;13755:3;13751:12;13744:19;;13527:242;;;:::o;13775:374::-;;13938:67;14002:2;13997:3;13938:67;:::i;:::-;13931:74;;14035:34;14031:1;14026:3;14022:11;14015:55;14101:12;14096:2;14091:3;14087:12;14080:34;14140:2;14135:3;14131:12;14124:19;;13921:228;;;:::o;14155:373::-;;14318:67;14382:2;14377:3;14318:67;:::i;:::-;14311:74;;14415:34;14411:1;14406:3;14402:11;14395:55;14481:11;14476:2;14471:3;14467:12;14460:33;14519:2;14514:3;14510:12;14503:19;;14301:227;;;:::o;14534:321::-;;14697:67;14761:2;14756:3;14697:67;:::i;:::-;14690:74;;14794:25;14790:1;14785:3;14781:11;14774:46;14846:2;14841:3;14837:12;14830:19;;14680:175;;;:::o;14861:330::-;;15024:67;15088:2;15083:3;15024:67;:::i;:::-;15017:74;;15121:34;15117:1;15112:3;15108:11;15101:55;15182:2;15177:3;15173:12;15166:19;;15007:184;;;:::o;15197:376::-;;15360:67;15424:2;15419:3;15360:67;:::i;:::-;15353:74;;15457:34;15453:1;15448:3;15444:11;15437:55;15523:14;15518:2;15513:3;15509:12;15502:36;15564:2;15559:3;15555:12;15548:19;;15343:230;;;:::o;15579:330::-;;15742:67;15806:2;15801:3;15742:67;:::i;:::-;15735:74;;15839:34;15835:1;15830:3;15826:11;15819:55;15900:2;15895:3;15891:12;15884:19;;15725:184;;;:::o;15915:373::-;;16078:67;16142:2;16137:3;16078:67;:::i;:::-;16071:74;;16175:34;16171:1;16166:3;16162:11;16155:55;16241:11;16236:2;16231:3;16227:12;16220:33;16279:2;16274:3;16270:12;16263:19;;16061:227;;;:::o;16294:311::-;;16457:67;16521:2;16516:3;16457:67;:::i;:::-;16450:74;;16554:15;16550:1;16545:3;16541:11;16534:36;16596:2;16591:3;16587:12;16580:19;;16440:165;;;:::o;16611:379::-;;16774:67;16838:2;16833:3;16774:67;:::i;:::-;16767:74;;16871:34;16867:1;16862:3;16858:11;16851:55;16937:17;16932:2;16927:3;16923:12;16916:39;16981:2;16976:3;16972:12;16965:19;;16757:233;;;:::o;16996:365::-;;17159:67;17223:2;17218:3;17159:67;:::i;:::-;17152:74;;17256:34;17252:1;17247:3;17243:11;17236:55;17322:3;17317:2;17312:3;17308:12;17301:25;17352:2;17347:3;17343:12;17336:19;;17142:219;;;:::o;17367:376::-;;17530:67;17594:2;17589:3;17530:67;:::i;:::-;17523:74;;17627:34;17623:1;17618:3;17614:11;17607:55;17693:14;17688:2;17683:3;17679:12;17672:36;17734:2;17729:3;17725:12;17718:19;;17513:230;;;:::o;17749:381::-;;17912:67;17976:2;17971:3;17912:67;:::i;:::-;17905:74;;18009:34;18005:1;18000:3;17996:11;17989:55;18075:19;18070:2;18065:3;18061:12;18054:41;18121:2;18116:3;18112:12;18105:19;;17895:235;;;:::o;18136:376::-;;18299:67;18363:2;18358:3;18299:67;:::i;:::-;18292:74;;18396:34;18392:1;18387:3;18383:11;18376:55;18462:14;18457:2;18452:3;18448:12;18441:36;18503:2;18498:3;18494:12;18487:19;;18282:230;;;:::o;18518:324::-;;18681:67;18745:2;18740:3;18681:67;:::i;:::-;18674:74;;18778:28;18774:1;18769:3;18765:11;18758:49;18833:2;18828:3;18824:12;18817:19;;18664:178;;;:::o;18848:375::-;;19011:67;19075:2;19070:3;19011:67;:::i;:::-;19004:74;;19108:34;19104:1;19099:3;19095:11;19088:55;19174:13;19169:2;19164:3;19160:12;19153:35;19214:2;19209:3;19205:12;19198:19;;18994:229;;;:::o;19229:306::-;;19392:66;19456:1;19451:3;19392:66;:::i;:::-;19385:73;;19488:11;19484:1;19479:3;19475:11;19468:32;19526:2;19521:3;19517:12;19510:19;;19375:160;;;:::o;19541:108::-;19618:24;19636:5;19618:24;:::i;:::-;19613:3;19606:37;19596:53;;:::o;19655:118::-;19742:24;19760:5;19742:24;:::i;:::-;19737:3;19730:37;19720:53;;:::o;19779:435::-;;19981:95;20072:3;20063:6;19981:95;:::i;:::-;19974:102;;20093:95;20184:3;20175:6;20093:95;:::i;:::-;20086:102;;20205:3;20198:10;;19963:251;;;;;:::o;20220:222::-;;20351:2;20340:9;20336:18;20328:26;;20364:71;20432:1;20421:9;20417:17;20408:6;20364:71;:::i;:::-;20318:124;;;;:::o;20448:640::-;;20681:3;20670:9;20666:19;20658:27;;20695:71;20763:1;20752:9;20748:17;20739:6;20695:71;:::i;:::-;20776:72;20844:2;20833:9;20829:18;20820:6;20776:72;:::i;:::-;20858;20926:2;20915:9;20911:18;20902:6;20858:72;:::i;:::-;20977:9;20971:4;20967:20;20962:2;20951:9;20947:18;20940:48;21005:76;21076:4;21067:6;21005:76;:::i;:::-;20997:84;;20648:440;;;;;;;:::o;21094:373::-;;21275:2;21264:9;21260:18;21252:26;;21324:9;21318:4;21314:20;21310:1;21299:9;21295:17;21288:47;21352:108;21455:4;21446:6;21352:108;:::i;:::-;21344:116;;21242:225;;;;:::o;21473:210::-;;21598:2;21587:9;21583:18;21575:26;;21611:65;21673:1;21662:9;21658:17;21649:6;21611:65;:::i;:::-;21565:118;;;;:::o;21689:313::-;;21840:2;21829:9;21825:18;21817:26;;21889:9;21883:4;21879:20;21875:1;21864:9;21860:17;21853:47;21917:78;21990:4;21981:6;21917:78;:::i;:::-;21909:86;;21807:195;;;;:::o;22008:419::-;;22212:2;22201:9;22197:18;22189:26;;22261:9;22255:4;22251:20;22247:1;22236:9;22232:17;22225:47;22289:131;22415:4;22289:131;:::i;:::-;22281:139;;22179:248;;;:::o;22433:419::-;;22637:2;22626:9;22622:18;22614:26;;22686:9;22680:4;22676:20;22672:1;22661:9;22657:17;22650:47;22714:131;22840:4;22714:131;:::i;:::-;22706:139;;22604:248;;;:::o;22858:419::-;;23062:2;23051:9;23047:18;23039:26;;23111:9;23105:4;23101:20;23097:1;23086:9;23082:17;23075:47;23139:131;23265:4;23139:131;:::i;:::-;23131:139;;23029:248;;;:::o;23283:419::-;;23487:2;23476:9;23472:18;23464:26;;23536:9;23530:4;23526:20;23522:1;23511:9;23507:17;23500:47;23564:131;23690:4;23564:131;:::i;:::-;23556:139;;23454:248;;;:::o;23708:419::-;;23912:2;23901:9;23897:18;23889:26;;23961:9;23955:4;23951:20;23947:1;23936:9;23932:17;23925:47;23989:131;24115:4;23989:131;:::i;:::-;23981:139;;23879:248;;;:::o;24133:419::-;;24337:2;24326:9;24322:18;24314:26;;24386:9;24380:4;24376:20;24372:1;24361:9;24357:17;24350:47;24414:131;24540:4;24414:131;:::i;:::-;24406:139;;24304:248;;;:::o;24558:419::-;;24762:2;24751:9;24747:18;24739:26;;24811:9;24805:4;24801:20;24797:1;24786:9;24782:17;24775:47;24839:131;24965:4;24839:131;:::i;:::-;24831:139;;24729:248;;;:::o;24983:419::-;;25187:2;25176:9;25172:18;25164:26;;25236:9;25230:4;25226:20;25222:1;25211:9;25207:17;25200:47;25264:131;25390:4;25264:131;:::i;:::-;25256:139;;25154:248;;;:::o;25408:419::-;;25612:2;25601:9;25597:18;25589:26;;25661:9;25655:4;25651:20;25647:1;25636:9;25632:17;25625:47;25689:131;25815:4;25689:131;:::i;:::-;25681:139;;25579:248;;;:::o;25833:419::-;;26037:2;26026:9;26022:18;26014:26;;26086:9;26080:4;26076:20;26072:1;26061:9;26057:17;26050:47;26114:131;26240:4;26114:131;:::i;:::-;26106:139;;26004:248;;;:::o;26258:419::-;;26462:2;26451:9;26447:18;26439:26;;26511:9;26505:4;26501:20;26497:1;26486:9;26482:17;26475:47;26539:131;26665:4;26539:131;:::i;:::-;26531:139;;26429:248;;;:::o;26683:419::-;;26887:2;26876:9;26872:18;26864:26;;26936:9;26930:4;26926:20;26922:1;26911:9;26907:17;26900:47;26964:131;27090:4;26964:131;:::i;:::-;26956:139;;26854:248;;;:::o;27108:419::-;;27312:2;27301:9;27297:18;27289:26;;27361:9;27355:4;27351:20;27347:1;27336:9;27332:17;27325:47;27389:131;27515:4;27389:131;:::i;:::-;27381:139;;27279:248;;;:::o;27533:419::-;;27737:2;27726:9;27722:18;27714:26;;27786:9;27780:4;27776:20;27772:1;27761:9;27757:17;27750:47;27814:131;27940:4;27814:131;:::i;:::-;27806:139;;27704:248;;;:::o;27958:419::-;;28162:2;28151:9;28147:18;28139:26;;28211:9;28205:4;28201:20;28197:1;28186:9;28182:17;28175:47;28239:131;28365:4;28239:131;:::i;:::-;28231:139;;28129:248;;;:::o;28383:419::-;;28587:2;28576:9;28572:18;28564:26;;28636:9;28630:4;28626:20;28622:1;28611:9;28607:17;28600:47;28664:131;28790:4;28664:131;:::i;:::-;28656:139;;28554:248;;;:::o;28808:419::-;;29012:2;29001:9;28997:18;28989:26;;29061:9;29055:4;29051:20;29047:1;29036:9;29032:17;29025:47;29089:131;29215:4;29089:131;:::i;:::-;29081:139;;28979:248;;;:::o;29233:419::-;;29437:2;29426:9;29422:18;29414:26;;29486:9;29480:4;29476:20;29472:1;29461:9;29457:17;29450:47;29514:131;29640:4;29514:131;:::i;:::-;29506:139;;29404:248;;;:::o;29658:419::-;;29862:2;29851:9;29847:18;29839:26;;29911:9;29905:4;29901:20;29897:1;29886:9;29882:17;29875:47;29939:131;30065:4;29939:131;:::i;:::-;29931:139;;29829:248;;;:::o;30083:419::-;;30287:2;30276:9;30272:18;30264:26;;30336:9;30330:4;30326:20;30322:1;30311:9;30307:17;30300:47;30364:131;30490:4;30364:131;:::i;:::-;30356:139;;30254:248;;;:::o;30508:419::-;;30712:2;30701:9;30697:18;30689:26;;30761:9;30755:4;30751:20;30747:1;30736:9;30732:17;30725:47;30789:131;30915:4;30789:131;:::i;:::-;30781:139;;30679:248;;;:::o;30933:419::-;;31137:2;31126:9;31122:18;31114:26;;31186:9;31180:4;31176:20;31172:1;31161:9;31157:17;31150:47;31214:131;31340:4;31214:131;:::i;:::-;31206:139;;31104:248;;;:::o;31358:419::-;;31562:2;31551:9;31547:18;31539:26;;31611:9;31605:4;31601:20;31597:1;31586:9;31582:17;31575:47;31639:131;31765:4;31639:131;:::i;:::-;31631:139;;31529:248;;;:::o;31783:419::-;;31987:2;31976:9;31972:18;31964:26;;32036:9;32030:4;32026:20;32022:1;32011:9;32007:17;32000:47;32064:131;32190:4;32064:131;:::i;:::-;32056:139;;31954:248;;;:::o;32208:419::-;;32412:2;32401:9;32397:18;32389:26;;32461:9;32455:4;32451:20;32447:1;32436:9;32432:17;32425:47;32489:131;32615:4;32489:131;:::i;:::-;32481:139;;32379:248;;;:::o;32633:419::-;;32837:2;32826:9;32822:18;32814:26;;32886:9;32880:4;32876:20;32872:1;32861:9;32857:17;32850:47;32914:131;33040:4;32914:131;:::i;:::-;32906:139;;32804:248;;;:::o;33058:419::-;;33262:2;33251:9;33247:18;33239:26;;33311:9;33305:4;33301:20;33297:1;33286:9;33282:17;33275:47;33339:131;33465:4;33339:131;:::i;:::-;33331:139;;33229:248;;;:::o;33483:222::-;;33614:2;33603:9;33599:18;33591:26;;33627:71;33695:1;33684:9;33680:17;33671:6;33627:71;:::i;:::-;33581:124;;;;:::o;33711:283::-;;33777:2;33771:9;33761:19;;33819:4;33811:6;33807:17;33926:6;33914:10;33911:22;33890:18;33878:10;33875:34;33872:62;33869:2;;;33937:18;;:::i;:::-;33869:2;33977:10;33973:2;33966:22;33751:243;;;;:::o;34000:311::-;;34167:18;34159:6;34156:30;34153:2;;;34189:18;;:::i;:::-;34153:2;34239:4;34231:6;34227:17;34219:25;;34299:4;34293;34289:15;34281:23;;34082:229;;;:::o;34317:331::-;;34468:18;34460:6;34457:30;34454:2;;;34490:18;;:::i;:::-;34454:2;34575:4;34571:9;34564:4;34556:6;34552:17;34548:33;34540:41;;34636:4;34630;34626:15;34618:23;;34383:265;;;:::o;34654:332::-;;34806:18;34798:6;34795:30;34792:2;;;34828:18;;:::i;:::-;34792:2;34913:4;34909:9;34902:4;34894:6;34890:17;34886:33;34878:41;;34974:4;34968;34964:15;34956:23;;34721:265;;;:::o;34992:132::-;;35082:3;35074:11;;35112:4;35107:3;35103:14;35095:22;;35064:60;;;:::o;35130:114::-;;35231:5;35225:12;35215:22;;35204:40;;;:::o;35250:98::-;;35335:5;35329:12;35319:22;;35308:40;;;:::o;35354:99::-;;35440:5;35434:12;35424:22;;35413:40;;;:::o;35459:113::-;;35561:4;35556:3;35552:14;35544:22;;35534:38;;;:::o;35578:184::-;;35711:6;35706:3;35699:19;35751:4;35746:3;35742:14;35727:29;;35689:73;;;;:::o;35768:168::-;;35885:6;35880:3;35873:19;35925:4;35920:3;35916:14;35901:29;;35863:73;;;;:::o;35942:169::-;;36060:6;36055:3;36048:19;36100:4;36095:3;36091:14;36076:29;;36038:73;;;;:::o;36117:148::-;;36256:3;36241:18;;36231:34;;;;:::o;36271:305::-;;36330:20;36348:1;36330:20;:::i;:::-;36325:25;;36364:20;36382:1;36364:20;:::i;:::-;36359:25;;36518:1;36450:66;36446:74;36443:1;36440:81;36437:2;;;36524:18;;:::i;:::-;36437:2;36568:1;36565;36561:9;36554:16;;36315:261;;;;:::o;36582:185::-;;36639:20;36657:1;36639:20;:::i;:::-;36634:25;;36673:20;36691:1;36673:20;:::i;:::-;36668:25;;36712:1;36702:2;;36717:18;;:::i;:::-;36702:2;36759:1;36756;36752:9;36747:14;;36624:143;;;;:::o;36773:348::-;;36836:20;36854:1;36836:20;:::i;:::-;36831:25;;36870:20;36888:1;36870:20;:::i;:::-;36865:25;;37058:1;36990:66;36986:74;36983:1;36980:81;36975:1;36968:9;36961:17;36957:105;36954:2;;;37065:18;;:::i;:::-;36954:2;37113:1;37110;37106:9;37095:20;;36821:300;;;;:::o;37127:191::-;;37187:20;37205:1;37187:20;:::i;:::-;37182:25;;37221:20;37239:1;37221:20;:::i;:::-;37216:25;;37260:1;37257;37254:8;37251:2;;;37265:18;;:::i;:::-;37251:2;37310:1;37307;37303:9;37295:17;;37172:146;;;;:::o;37324:96::-;;37390:24;37408:5;37390:24;:::i;:::-;37379:35;;37369:51;;;:::o;37426:90::-;;37503:5;37496:13;37489:21;37478:32;;37468:48;;;:::o;37522:149::-;;37598:66;37591:5;37587:78;37576:89;;37566:105;;;:::o;37677:126::-;;37754:42;37747:5;37743:54;37732:65;;37722:81;;;:::o;37809:77::-;;37875:5;37864:16;;37854:32;;;:::o;37892:154::-;37976:6;37971:3;37966;37953:30;38038:1;38029:6;38024:3;38020:16;38013:27;37943:103;;;:::o;38052:307::-;38120:1;38130:113;38144:6;38141:1;38138:13;38130:113;;;38229:1;38224:3;38220:11;38214:18;38210:1;38205:3;38201:11;38194:39;38166:2;38163:1;38159:10;38154:15;;38130:113;;;38261:6;38258:1;38255:13;38252:2;;;38341:1;38332:6;38327:3;38323:16;38316:27;38252:2;38101:258;;;;:::o;38365:320::-;;38446:1;38440:4;38436:12;38426:22;;38493:1;38487:4;38483:12;38514:18;38504:2;;38570:4;38562:6;38558:17;38548:27;;38504:2;38632;38624:6;38621:14;38601:18;38598:38;38595:2;;;38651:18;;:::i;:::-;38595:2;38416:269;;;;:::o;38691:233::-;;38753:24;38771:5;38753:24;:::i;:::-;38744:33;;38799:66;38792:5;38789:77;38786:2;;;38869:18;;:::i;:::-;38786:2;38916:1;38909:5;38905:13;38898:20;;38734:190;;;:::o;38930:176::-;;38979:20;38997:1;38979:20;:::i;:::-;38974:25;;39013:20;39031:1;39013:20;:::i;:::-;39008:25;;39052:1;39042:2;;39057:18;;:::i;:::-;39042:2;39098:1;39095;39091:9;39086:14;;38964:142;;;;:::o;39112:180::-;39160:77;39157:1;39150:88;39257:4;39254:1;39247:15;39281:4;39278:1;39271:15;39298:180;39346:77;39343:1;39336:88;39443:4;39440:1;39433:15;39467:4;39464:1;39457:15;39484:180;39532:77;39529:1;39522:88;39629:4;39626:1;39619:15;39653:4;39650:1;39643:15;39670:180;39718:77;39715:1;39708:88;39815:4;39812:1;39805:15;39839:4;39836:1;39829:15;39856:102;;39948:2;39944:7;39939:2;39932:5;39928:14;39924:28;39914:38;;39904:54;;;:::o;39964:122::-;40037:24;40055:5;40037:24;:::i;:::-;40030:5;40027:35;40017:2;;40076:1;40073;40066:12;40017:2;40007:79;:::o;40092:116::-;40162:21;40177:5;40162:21;:::i;:::-;40155:5;40152:32;40142:2;;40198:1;40195;40188:12;40142:2;40132:76;:::o;40214:120::-;40286:23;40303:5;40286:23;:::i;:::-;40279:5;40276:34;40266:2;;40324:1;40321;40314:12;40266:2;40256:78;:::o;40340:122::-;40413:24;40431:5;40413:24;:::i;:::-;40406:5;40403:35;40393:2;;40452:1;40449;40442:12;40393:2;40383:79;:::o

Swarm Source

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