ETH Price: $3,106.39 (-0.02%)

Token

SpaceBoysNFT (SBNFT)
 

Overview

Max Total Supply

8,888 SBNFT

Holders

4,593

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SBNFT
0x594c84B388a2eFf796287A326aCb3775B343C5Ef
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome everyone. SpaceBoys is a warm community of 8,888 friends with lots of fun activities to do together.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SpaceBoys

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-01
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
//Developed by blockchainguy.net
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);
}
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;
}
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);
}
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);
}
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);
}
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
abstract contract ContextMixin {
    function msgSender() internal view returns (address payable sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}
contract Migrations {
  address public owner;
  uint public last_completed_migration;

  constructor() {
    owner = msg.sender;
  }

  modifier restricted() {
    if (msg.sender == owner) _;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }

  function upgrade(address new_address) public restricted {
    Migrations upgraded = Migrations(new_address);
    upgraded.setCompleted(last_completed_migration);
  }
}
contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string public constant ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
        keccak256(
            bytes(
                "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
            )
        );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(string memory name) internal initializer {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}
contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}


contract SpaceBoys is
    ContextMixin,
    ERC721Enumerable,
    NativeMetaTransaction,
    Ownable
{
    using SafeMath for uint256;

    uint256 public _currentTokenId = 0;

    uint256 MAX_SUPPLY =  8888;
    string public baseTokenURI = "https://gateway.pinata.cloud/ipfs/QmYrfA72SNSGFjva5UxmNMhF2qHx9kFbcCBgcJMsi1354s/";
   
    uint256 public presale_Startdate = 1633069810; // 04/10/2021 18:00:00 UTC+7 - 1633345200
    uint256 public presale_Enddate = 1633070700; // 04/10/2021 18:30:00 UTC+7 - 1633347000
    bool public end_presale = false;
    
    uint256 public NFT_price = 0.039 ether; 
    uint256 public NFT_price_for_3 = 0.099 ether; 

    uint256 public startTime = 1633070701; // 04/10/2021 18:30:01 UTC+7 - 1633347001
    string _name = "SpaceBoysNFT";
    string _symbol = "SBNFT";
    
    bool public isBuy_1_Get_free_enabled = true;
    
    address[] public whitelistedAddresses;
  
    uint256 public reveal_time = 1633062318; // 05/10/2021 17:00 UTC+7 - 1633341600
  

    constructor() ERC721(_name, _symbol) {
        // baseTokenURI = _uri;
        _initializeEIP712(_name);
    }
    
    function set_Buy_1_Get_1_free(bool result) external onlyOwner{
        isBuy_1_Get_free_enabled = result;
    }
    
    function set_reveal_time(uint256 temp_time) external onlyOwner{
        reveal_time = temp_time;
    }
    
    function set_start_time(uint256 time) external onlyOwner{
        startTime = time;
    }
    function set_presale_dates(uint256 start, uint256 end) external onlyOwner{
        presale_Startdate = start;
        presale_Enddate = end;
    }
    function end_presale_manually() external onlyOwner{
        end_presale = true;
    }


    
    //Presale Functions
    
    //Buy one get 3 free
    function mintPresale() external payable{
        require(block.timestamp > presale_Startdate, "Presale have not started yet.");
        require(block.timestamp < presale_Enddate, "Presale Ended.");
        require(_currentTokenId + 3 < MAX_SUPPLY, "Max Supply Reached");
        require(end_presale == false,"Presale Ended");
        require(isWhitelisted(_msgSender()) , "You are not Whitelisted.");
        require(msg.value == NFT_price, "Sent Amount Not Enough");
        
        
        for(uint256 i=0; i<3; i++){
            _mint(_msgSender(),  _getNextTokenId());
            _incrementTokenId();
        }
    }
    //Buy 3 get 7 free
    function mintThreePresale() external payable{
        require(block.timestamp > presale_Startdate, "Presale have not started yet.");
        require(block.timestamp < presale_Enddate, "Presale Ended.");
        require(_currentTokenId + 7 < MAX_SUPPLY, "Max Supply Reached");
        require(end_presale == false,"Presale Ended");
        require(isWhitelisted(_msgSender()) , "You are not Whitelisted.");
        require(msg.value == NFT_price_for_3, "Sent Amount Not Enough");
        

        for(uint256 i=0; i< 7; i++){
            _mint(_msgSender(),  _getNextTokenId());
            _incrementTokenId();
        }
    }
    
    //Customer Buy Functions
    
    function claimFree() external {
        require(balanceOf(_msgSender()) == 0, "You have already Claimed Free Nft.");
        _mint(_msgSender(), _getNextTokenId());
        _incrementTokenId();
    }
    
    //Buy 1 get 3 free
    function buy() public payable {
        require(block.timestamp >= startTime, "It's not time yet");
        require(msg.value == NFT_price, "Sent Amount Not Enough");
        uint256 num = 1;
         
        if(isBuy_1_Get_free_enabled == true){
            num = num * 2;
        }
        if(balanceOf(_msgSender()) == 0 ){
            num = num + 1;
        }
        
        require(_currentTokenId.add(num) < MAX_SUPPLY, "Max Supply Reached");
        for(uint256 i=0; i<num; i++){

            _mint(_msgSender(), _getNextTokenId());
            _incrementTokenId();
        }
    }
    
    function buyThree() public payable {
        require(block.timestamp >= startTime, "It's not time yet");
        require(msg.value == NFT_price_for_3, "Sent Amount Wrong");
        uint256 num = 3;
         
        if(isBuy_1_Get_free_enabled == true){
            num = num * 2;
        }
        
        if(balanceOf(_msgSender()) == 0 ){
            num = num + 1;
        }
        require(_currentTokenId.add(num) < MAX_SUPPLY, "Max Supply Reached");
        for(uint256 i=0; i<num; i++){

            _mint(_msgSender(), _getNextTokenId());
            _incrementTokenId();
        }
    }
    
    ////////
    
    //Owner Mint Functions
    
    function mintMany(uint256 num, address _to) public onlyOwner {
        require(_currentTokenId + num < MAX_SUPPLY, "Max Supply Reached");
        require(num <= 20, "Max 20 Allowed.");
        for(uint256 i=0; i<num; i++){

            _mint(_to, _getNextTokenId());
            _incrementTokenId();
        }
    }
    
    function mintTo(address _to) public onlyOwner {
        require(_currentTokenId < MAX_SUPPLY, "Max Supply Reached");
        uint256 newTokenId = _getNextTokenId();
        _mint(_to, newTokenId);
        _incrementTokenId();
    }
    
    
    
  function isWhitelisted(address _user) public view returns (bool) {
    for (uint i = 0; i < whitelistedAddresses.length; i++) {
      if (whitelistedAddresses[i] == _user) {
          return true;
      }
    }
    return false;
  }
  
  function whitelistUsers(address[] calldata _users) public onlyOwner {
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }
  
  function isPresaleActive() external view returns (bool){

      if(block.timestamp > presale_Startdate && block.timestamp < presale_Enddate && end_presale == false ){
          return true;
      }else{
          return false;
      }
  }
  
  function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    /**
     * @dev calculates the next token ID based on value of _currentTokenId
     * @return uint256 for the next token ID
     */
    function _getNextTokenId() private view returns (uint256) {
        return _currentTokenId.add(1);
    }

    /**
     * @dev increments the value of _currentTokenId,When all 9,788 Ghosts are sold out, a randomHash Ghost NFT owner will win a Tesla Model Y. The more NFT owned, the bigger the chance.
     */
    function _incrementTokenId() private {
        require(_currentTokenId < MAX_SUPPLY);

        _currentTokenId++;
    }

    /**
     * @dev change the baseGhostURI if there are future problems with the API service
     */
    function setBaseUri(string memory _uri) external onlyOwner {
        baseTokenURI = _uri;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        
        if(block.timestamp < reveal_time){
            return "https://gateway.pinata.cloud/ipfs/QmP9zdYtEVy5dZWkXYDumknEnQBaeMGNE4tADq25eqAbDD";
        }
        return
            string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId), ".json"));
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }
    function increaseMaxSupply(uint256 temp) external onlyOwner {
        MAX_SUPPLY = MAX_SUPPLY + temp;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_price_for_3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"buyThree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"end_presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"end_presale_manually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp","type":"uint256"}],"name":"increaseMaxSupply","outputs":[],"stateMutability":"nonpayable","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":"isBuy_1_Get_free_enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"mintMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintThreePresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","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":"presale_Enddate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale_Startdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal_time","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"result","type":"bool"}],"name":"set_Buy_1_Get_1_free","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"set_presale_dates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"temp_time","type":"uint256"}],"name":"set_reveal_time","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"set_start_time","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[],"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":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600a805460ff191690556000600e556122b8600f55610100604052605160808181529062003b1660a03980516200003f91601091602090910190620004e6565b50636156aaf2601155636156ae6c6012556013805460ff19169055668a8e4b1a3d800060145567015fb7f9b8c38000601555636156ae6d60165560408051808201909152600c8082526b14dc1858d9509bde5cd3919560a21b6020909201918252620000ae91601791620004e6565b506040805180820190915260058082526414d093919560da1b6020909201918252620000dd91601891620004e6565b506019805460ff191660011790556361568dae601b553480156200010057600080fd5b506017805462000110906200058c565b80601f01602080910402602001604051908101604052809291908181526020018280546200013e906200058c565b80156200018f5780601f1062000163576101008083540402835291602001916200018f565b820191906000526020600020905b8154815290600101906020018083116200017157829003601f168201915b505050505060188054620001a3906200058c565b80601f0160208091040260200160405190810160405280929190818152602001828054620001d1906200058c565b8015620002225780601f10620001f65761010080835404028352916020019162000222565b820191906000526020600020905b8154815290600101906020018083116200020457829003601f168201915b505084516200023c935060009250602086019150620004e6565b50805162000252906001906020840190620004e6565b5050506200026f620002696200031360201b60201c565b6200032f565b6200030d6017805462000282906200058c565b80601f0160208091040260200160405190810160405280929190818152602001828054620002b0906200058c565b8015620003015780601f10620002d55761010080835404028352916020019162000301565b820191906000526020600020905b815481529060010190602001808311620002e357829003601f168201915b50506200038192505050565b620005c9565b60006200032a620003e560201b62001ec41760201c565b905090565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff1615620003ca5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b620003d58162000444565b50600a805460ff19166001179055565b6000333014156200043e57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620004419050565b50335b90565b6040518060800160405280604f815260200162003ac7604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600b55565b828054620004f4906200058c565b90600052602060002090601f01602090048101928262000518576000855562000563565b82601f106200053357805160ff191683800117855562000563565b8280016001018555821562000563579182015b828111156200056357825182559160200191906001019062000546565b506200057192915062000575565b5090565b5b8082111562000571576000815560010162000576565b600181811c90821680620005a157607f821691505b60208210811415620005c357634e487b7160e01b600052602260045260246000fd5b50919050565b6134ee80620005d96000396000f3fe60806040526004361061031a5760003560e01c8063755edd17116101ab578063b8c73cc2116100f7578063db59969811610095578063edec5f271161006f578063edec5f27146108aa578063f2fde38b146108ca578063f366afc9146108ea578063fdb7ecc5146108ff57600080fd5b8063db59969814610843578063e1b775d21461084b578063e985e9c51461086157600080fd5b8063c963483c116100d1578063c963483c146107e2578063d547cfb7146107f8578063d71ac32e1461080d578063d9bf49361461082357600080fd5b8063b8c73cc21461078c578063ba4e5c49146107a2578063c87b56dd146107c257600080fd5b8063a0bcfc7f11610164578063a6f2ae3a1161013e578063a6f2ae3a1461072e578063b27b1a6d14610736578063b293631914610756578063b88d4fde1461076c57600080fd5b8063a0bcfc7f146106ce578063a1f69e04146106ee578063a22cb4651461070e57600080fd5b8063755edd171461062557806378e97925146106455780638da5cb5b1461065b57806390edbfee1461067957806395d89b41146106995780639667e4d5146106ae57600080fd5b80633408e4701161026a57806360d938dc1161022357806370a08231116101fd57806370a08231146105c857806370ee874b146105e8578063715018a6146105f0578063748973151461060557600080fd5b806360d938dc1461057e57806362422612146105935780636352211e146105a857600080fd5b80633408e470146104dc5780633af32abf146104ef5780633ccfd60b1461050f5780634114e8a41461052457806342842e0e1461053e5780634f6ccce71461055e57600080fd5b806312cfa116116102d757806320379ee5116102b157806320379ee51461045157806323b872dd146104665780632d0335ab146104865780632f745c59146104bc57600080fd5b806312cfa1161461041057806316c8c21b1461041857806318160ddd1461043c57600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630c53c51c146103d05780630f7e5970146103e3575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612ec2565b610919565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610944565b60405161034b9190613162565b34801561038257600080fd5b50610396610391366004612f45565b6109d6565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004612e08565b610a70565b005b6103696103de366004612d8c565b610b98565b3480156103ef57600080fd5b50610369604051806040016040528060018152602001603160f81b81525081565b6103ce610d82565b34801561042457600080fd5b5061042e60115481565b60405190815260200161034b565b34801561044857600080fd5b5060085461042e565b34801561045d57600080fd5b50600b5461042e565b34801561047257600080fd5b506103ce610481366004612cbe565b610eb9565b34801561049257600080fd5b5061042e6104a1366004612c70565b6001600160a01b03166000908152600c602052604090205490565b3480156104c857600080fd5b5061042e6104d7366004612e08565b610ef1565b3480156104e857600080fd5b504661042e565b3480156104fb57600080fd5b5061033f61050a366004612c70565b610f87565b34801561051b57600080fd5b506103ce610ff1565b34801561053057600080fd5b5060135461033f9060ff1681565b34801561054a57600080fd5b506103ce610559366004612cbe565b611076565b34801561056a57600080fd5b5061042e610579366004612f45565b611091565b34801561058a57600080fd5b5061033f611124565b34801561059f57600080fd5b506103ce61115b565b3480156105b457600080fd5b506103966105c3366004612f45565b6111b3565b3480156105d457600080fd5b5061042e6105e3366004612c70565b61122a565b6103ce6112b1565b3480156105fc57600080fd5b506103ce611459565b34801561061157600080fd5b506103ce610620366004612f5e565b6114ae565b34801561063157600080fd5b506103ce610640366004612c70565b611599565b34801561065157600080fd5b5061042e60165481565b34801561066757600080fd5b50600d546001600160a01b0316610396565b34801561068557600080fd5b506103ce610694366004612f45565b611623565b3480156106a557600080fd5b50610369611680565b3480156106ba57600080fd5b506103ce6106c9366004612f45565b61168f565b3480156106da57600080fd5b506103ce6106e9366004612efc565b6116dd565b3480156106fa57600080fd5b506103ce610709366004612ea7565b611739565b34801561071a57600080fd5b506103ce610729366004612d62565b611795565b6103ce611897565b34801561074257600080fd5b506103ce610751366004612f45565b611998565b34801561076257600080fd5b5061042e60155481565b34801561077857600080fd5b506103ce610787366004612cfa565b6119e6565b34801561079857600080fd5b5061042e60125481565b3480156107ae57600080fd5b506103966107bd366004612f45565b611a25565b3480156107ce57600080fd5b506103696107dd366004612f45565b611a4f565b3480156107ee57600080fd5b5061042e600e5481565b34801561080457600080fd5b50610369611aac565b34801561081957600080fd5b5061042e60145481565b34801561082f57600080fd5b506103ce61083e366004612f81565b611b3a565b6103ce611b8e565b34801561085757600080fd5b5061042e601b5481565b34801561086d57600080fd5b5061033f61087c366004612c8b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108b657600080fd5b506103ce6108c5366004612e32565b611d36565b3480156108d657600080fd5b506103ce6108e5366004612c70565b611d97565b3480156108f657600080fd5b506103ce611e4e565b34801561090b57600080fd5b5060195461033f9060ff1681565b60006001600160e01b0319821663780e9d6360e01b148061093e575061093e82611f20565b92915050565b60606000805461095390613337565b80601f016020809104026020016040519081016040528092919081815260200182805461097f90613337565b80156109cc5780601f106109a1576101008083540402835291602001916109cc565b820191906000526020600020905b8154815290600101906020018083116109af57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a545760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a7b826111b3565b9050806001600160a01b0316836001600160a01b03161415610ae95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a4b565b806001600160a01b0316610afb611f70565b6001600160a01b03161480610b175750610b178161087c611f70565b610b895760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a4b565b610b938383611f7f565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610bd68782878787611fed565b610c2c5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610a4b565b6001600160a01b0387166000908152600c6020526040902054610c509060016120dd565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610ca090899033908a906130f9565b60405180910390a1600080306001600160a01b0316888a604051602001610cc8929190613007565b60408051601f1981840301815290829052610ce291612feb565b6000604051808303816000865af19150503d8060008114610d1f576040519150601f19603f3d011682016040523d82523d6000602084013e610d24565b606091505b509150915081610d765760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610a4b565b98975050505050505050565b601654421015610dc85760405162461bcd60e51b8152602060048201526011602482015270125d09dcc81b9bdd081d1a5b59481e595d607a1b6044820152606401610a4b565b6015543414610e0d5760405162461bcd60e51b815260206004820152601160248201527053656e7420416d6f756e742057726f6e6760781b6044820152606401610a4b565b60195460039060ff16151560011415610e2e57610e2b8160026132d5565b90505b610e396105e3611f70565b610e4b57610e488160016132a9565b90505b600f54600e54610e5b90836120dd565b10610e785760405162461bcd60e51b8152600401610a4b9061327d565b60005b81811015610eb557610e9b610e8e611f70565b610e966120f0565b612101565b610ea361224f565b80610ead81613372565b915050610e7b565b5050565b610eca610ec4611f70565b82612276565b610ee65760405162461bcd60e51b8152600401610a4b9061322c565b610b9383838361236d565b6000610efc8361122a565b8210610f5e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a4b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b601a54811015610fe857826001600160a01b0316601a8281548110610fb257610fb26133e3565b6000918252602090912001546001600160a01b03161415610fd65750600192915050565b80610fe081613372565b915050610f8b565b50600092915050565b610ff9611f70565b6001600160a01b0316611014600d546001600160a01b031690565b6001600160a01b03161461103a5760405162461bcd60e51b8152600401610a4b906131c7565b600d546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611073573d6000803e3d6000fd5b50565b610b93838383604051806020016040528060008152506119e6565b600061109c60085490565b82106110ff5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a4b565b60088281548110611112576111126133e3565b90600052602060002001549050919050565b600060115442118015611138575060125442105b8015611147575060135460ff16155b156111525750600190565b50600090565b90565b611163611f70565b6001600160a01b031661117e600d546001600160a01b031690565b6001600160a01b0316146111a45760405162461bcd60e51b8152600401610a4b906131c7565b6013805460ff19166001179055565b6000818152600260205260408120546001600160a01b03168061093e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a4b565b60006001600160a01b0382166112955760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a4b565b506001600160a01b031660009081526003602052604090205490565b60115442116113025760405162461bcd60e51b815260206004820152601d60248201527f50726573616c652068617665206e6f742073746172746564207965742e0000006044820152606401610a4b565b60125442106113445760405162461bcd60e51b815260206004820152600e60248201526d283932b9b0b6329022b73232b21760911b6044820152606401610a4b565b600f54600e546113559060076132a9565b106113725760405162461bcd60e51b8152600401610a4b9061327d565b60135460ff16156113b55760405162461bcd60e51b815260206004820152600d60248201526c141c995cd85b1948115b991959609a1b6044820152606401610a4b565b6113c061050a611f70565b6114075760405162461bcd60e51b81526020600482015260186024820152772cb7ba9030b932903737ba102bb434ba32b634b9ba32b21760411b6044820152606401610a4b565b60155434146114285760405162461bcd60e51b8152600401610a4b906131fc565b60005b60078110156110735761143f610e8e611f70565b61144761224f565b8061145181613372565b91505061142b565b611461611f70565b6001600160a01b031661147c600d546001600160a01b031690565b6001600160a01b0316146114a25760405162461bcd60e51b8152600401610a4b906131c7565b6114ac6000612518565b565b6114b6611f70565b6001600160a01b03166114d1600d546001600160a01b031690565b6001600160a01b0316146114f75760405162461bcd60e51b8152600401610a4b906131c7565b600f5482600e5461150891906132a9565b106115255760405162461bcd60e51b8152600401610a4b9061327d565b60148211156115685760405162461bcd60e51b815260206004820152600f60248201526e26b0bc1019181020b63637bbb2b21760891b6044820152606401610a4b565b60005b82811015610b935761157f82610e966120f0565b61158761224f565b8061159181613372565b91505061156b565b6115a1611f70565b6001600160a01b03166115bc600d546001600160a01b031690565b6001600160a01b0316146115e25760405162461bcd60e51b8152600401610a4b906131c7565b600f54600e54106116055760405162461bcd60e51b8152600401610a4b9061327d565b600061160f6120f0565b905061161b8282612101565b610eb561224f565b61162b611f70565b6001600160a01b0316611646600d546001600160a01b031690565b6001600160a01b03161461166c5760405162461bcd60e51b8152600401610a4b906131c7565b80600f5461167a91906132a9565b600f5550565b60606001805461095390613337565b611697611f70565b6001600160a01b03166116b2600d546001600160a01b031690565b6001600160a01b0316146116d85760405162461bcd60e51b8152600401610a4b906131c7565b601b55565b6116e5611f70565b6001600160a01b0316611700600d546001600160a01b031690565b6001600160a01b0316146117265760405162461bcd60e51b8152600401610a4b906131c7565b8051610eb5906010906020840190612aa4565b611741611f70565b6001600160a01b031661175c600d546001600160a01b031690565b6001600160a01b0316146117825760405162461bcd60e51b8152600401610a4b906131c7565b6019805460ff1916911515919091179055565b61179d611f70565b6001600160a01b0316826001600160a01b031614156117fe5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a4b565b806005600061180b611f70565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561184f611f70565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161188b911515815260200190565b60405180910390a35050565b6016544210156118dd5760405162461bcd60e51b8152602060048201526011602482015270125d09dcc81b9bdd081d1a5b59481e595d607a1b6044820152606401610a4b565b60145434146118fe5760405162461bcd60e51b8152600401610a4b906131fc565b60195460019060ff16151581141561191e5761191b8160026132d5565b90505b6119296105e3611f70565b61193b576119388160016132a9565b90505b600f54600e5461194b90836120dd565b106119685760405162461bcd60e51b8152600401610a4b9061327d565b60005b81811015610eb55761197e610e8e611f70565b61198661224f565b8061199081613372565b91505061196b565b6119a0611f70565b6001600160a01b03166119bb600d546001600160a01b031690565b6001600160a01b0316146119e15760405162461bcd60e51b8152600401610a4b906131c7565b601655565b6119f76119f1611f70565b83612276565b611a135760405162461bcd60e51b8152600401610a4b9061322c565b611a1f8484848461256a565b50505050565b601a8181548110611a3557600080fd5b6000918252602090912001546001600160a01b0316905081565b6060601b54421015611a7a576040518060800160405280605081526020016134696050913992915050565b6010611a858361259d565b604051602001611a9692919061303e565b6040516020818303038152906040529050919050565b60108054611ab990613337565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae590613337565b8015611b325780601f10611b0757610100808354040283529160200191611b32565b820191906000526020600020905b815481529060010190602001808311611b1557829003601f168201915b505050505081565b611b42611f70565b6001600160a01b0316611b5d600d546001600160a01b031690565b6001600160a01b031614611b835760405162461bcd60e51b8152600401610a4b906131c7565b601191909155601255565b6011544211611bdf5760405162461bcd60e51b815260206004820152601d60248201527f50726573616c652068617665206e6f742073746172746564207965742e0000006044820152606401610a4b565b6012544210611c215760405162461bcd60e51b815260206004820152600e60248201526d283932b9b0b6329022b73232b21760911b6044820152606401610a4b565b600f54600e54611c329060036132a9565b10611c4f5760405162461bcd60e51b8152600401610a4b9061327d565b60135460ff1615611c925760405162461bcd60e51b815260206004820152600d60248201526c141c995cd85b1948115b991959609a1b6044820152606401610a4b565b611c9d61050a611f70565b611ce45760405162461bcd60e51b81526020600482015260186024820152772cb7ba9030b932903737ba102bb434ba32b634b9ba32b21760411b6044820152606401610a4b565b6014543414611d055760405162461bcd60e51b8152600401610a4b906131fc565b60005b600381101561107357611d1c610e8e611f70565b611d2461224f565b80611d2e81613372565b915050611d08565b611d3e611f70565b6001600160a01b0316611d59600d546001600160a01b031690565b6001600160a01b031614611d7f5760405162461bcd60e51b8152600401610a4b906131c7565b611d8b601a6000612b28565b610b93601a8383612b46565b611d9f611f70565b6001600160a01b0316611dba600d546001600160a01b031690565b6001600160a01b031614611de05760405162461bcd60e51b8152600401610a4b906131c7565b6001600160a01b038116611e455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a4b565b61107381612518565b611e596105e3611f70565b15611eb15760405162461bcd60e51b815260206004820152602260248201527f596f75206861766520616c726561647920436c61696d65642046726565204e666044820152613a1760f11b6064820152608401610a4b565b611ebc610e8e611f70565b6114ac61224f565b600033301415611f1b57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506111589050565b503390565b60006001600160e01b031982166380ac58cd60e01b1480611f5157506001600160e01b03198216635b5e139f60e01b145b8061093e57506301ffc9a760e01b6001600160e01b031983161461093e565b6000611f7a611ec4565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611fb4826111b3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166120535760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610a4b565b60016120666120618761269b565b612718565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156120b4573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006120e982846132a9565b9392505050565b600e54600090611f7a9060016120dd565b6001600160a01b0382166121575760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a4b565b6000818152600260205260409020546001600160a01b0316156121bc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a4b565b6121c860008383612748565b6001600160a01b03821660009081526003602052604081208054600192906121f19084906132a9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600f54600e541061225f57600080fd5b600e805490600061226f83613372565b9190505550565b6000818152600260205260408120546001600160a01b03166122ef5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a4b565b60006122fa836111b3565b9050806001600160a01b0316846001600160a01b031614806123355750836001600160a01b031661232a846109d6565b6001600160a01b0316145b8061236557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612380826111b3565b6001600160a01b0316146123e85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a4b565b6001600160a01b03821661244a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a4b565b612455838383612748565b612460600082611f7f565b6001600160a01b03831660009081526003602052604081208054600192906124899084906132f4565b90915550506001600160a01b03821660009081526003602052604081208054600192906124b79084906132a9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61257584848461236d565b61258184848484612800565b611a1f5760405162461bcd60e51b8152600401610a4b90613175565b6060816125c15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125eb57806125d581613372565b91506125e49050600a836132c1565b91506125c5565b60008167ffffffffffffffff811115612606576126066133f9565b6040519080825280601f01601f191660200182016040528015612630576020820181803683370190505b5090505b8415612365576126456001836132f4565b9150612652600a8661338d565b61265d9060306132a9565b60f81b818381518110612672576126726133e3565b60200101906001600160f81b031916908160001a905350612694600a866132c1565b9450612634565b600060405180608001604052806043815260200161342660439139805160209182012083518483015160408087015180519086012090516126fb950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000612723600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016126fb565b6001600160a01b0383166127a35761279e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6127c6565b816001600160a01b0316836001600160a01b0316146127c6576127c68382612914565b6001600160a01b0382166127dd57610b93816129b1565b826001600160a01b0316826001600160a01b031614610b9357610b938282612a60565b60006001600160a01b0384163b1561290957836001600160a01b031663150b7a02612829611f70565b8786866040518563ffffffff1660e01b815260040161284b9493929190613125565b602060405180830381600087803b15801561286557600080fd5b505af1925050508015612895575060408051601f3d908101601f1916820190925261289291810190612edf565b60015b6128ef573d8080156128c3576040519150601f19603f3d011682016040523d82523d6000602084013e6128c8565b606091505b5080516128e75760405162461bcd60e51b8152600401610a4b90613175565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612365565b506001949350505050565b600060016129218461122a565b61292b91906132f4565b60008381526007602052604090205490915080821461297e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906129c3906001906132f4565b600083815260096020526040812054600880549394509092849081106129eb576129eb6133e3565b906000526020600020015490508060088381548110612a0c57612a0c6133e3565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612a4457612a446133cd565b6001900381819060005260206000200160009055905550505050565b6000612a6b8361122a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612ab090613337565b90600052602060002090601f016020900481019282612ad25760008555612b18565b82601f10612aeb57805160ff1916838001178555612b18565b82800160010185558215612b18579182015b82811115612b18578251825591602001919060010190612afd565b50612b24929150612b99565b5090565b50805460008255906000526020600020908101906110739190612b99565b828054828255906000526020600020908101928215612b18579160200282015b82811115612b185781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612b66565b5b80821115612b245760008155600101612b9a565b600067ffffffffffffffff80841115612bc957612bc96133f9565b604051601f8501601f19908116603f01168101908282118183101715612bf157612bf16133f9565b81604052809350858152868686011115612c0a57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612c3b57600080fd5b919050565b80358015158114612c3b57600080fd5b600082601f830112612c6157600080fd5b6120e983833560208501612bae565b600060208284031215612c8257600080fd5b6120e982612c24565b60008060408385031215612c9e57600080fd5b612ca783612c24565b9150612cb560208401612c24565b90509250929050565b600080600060608486031215612cd357600080fd5b612cdc84612c24565b9250612cea60208501612c24565b9150604084013590509250925092565b60008060008060808587031215612d1057600080fd5b612d1985612c24565b9350612d2760208601612c24565b925060408501359150606085013567ffffffffffffffff811115612d4a57600080fd5b612d5687828801612c50565b91505092959194509250565b60008060408385031215612d7557600080fd5b612d7e83612c24565b9150612cb560208401612c40565b600080600080600060a08688031215612da457600080fd5b612dad86612c24565b9450602086013567ffffffffffffffff811115612dc957600080fd5b612dd588828901612c50565b9450506040860135925060608601359150608086013560ff81168114612dfa57600080fd5b809150509295509295909350565b60008060408385031215612e1b57600080fd5b612e2483612c24565b946020939093013593505050565b60008060208385031215612e4557600080fd5b823567ffffffffffffffff80821115612e5d57600080fd5b818501915085601f830112612e7157600080fd5b813581811115612e8057600080fd5b8660208260051b8501011115612e9557600080fd5b60209290920196919550909350505050565b600060208284031215612eb957600080fd5b6120e982612c40565b600060208284031215612ed457600080fd5b81356120e98161340f565b600060208284031215612ef157600080fd5b81516120e98161340f565b600060208284031215612f0e57600080fd5b813567ffffffffffffffff811115612f2557600080fd5b8201601f81018413612f3657600080fd5b61236584823560208401612bae565b600060208284031215612f5757600080fd5b5035919050565b60008060408385031215612f7157600080fd5b82359150612cb560208401612c24565b60008060408385031215612f9457600080fd5b50508035926020909101359150565b60008151808452612fbb81602086016020860161330b565b601f01601f19169290920160200192915050565b60008151612fe181856020860161330b565b9290920192915050565b60008251612ffd81846020870161330b565b9190910192915050565b6000835161301981846020880161330b565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600080845481600182811c91508083168061305a57607f831692505b602080841082141561307a57634e487b7160e01b86526022600452602486fd5b81801561308e576001811461309f576130cc565b60ff198616895284890196506130cc565b60008b81526020902060005b868110156130c45781548b8201529085019083016130ab565b505084890196505b5050505050506130f06130df8286612fcf565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038481168252831660208201526060604082018190526000906130f090830184612fa3565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061315890830184612fa3565b9695505050505050565b6020815260006120e96020830184612fa3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152750a6cadce84082dadeeadce8409cdee8408adcdeeaced60531b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526012908201527113585e0814dd5c1c1b1e4814995858da195960721b604082015260600190565b600082198211156132bc576132bc6133a1565b500190565b6000826132d0576132d06133b7565b500490565b60008160001904831182151516156132ef576132ef6133a1565b500290565b600082821015613306576133066133a1565b500390565b60005b8381101561332657818101518382015260200161330e565b83811115611a1f5750506000910152565b600181811c9082168061334b57607f821691505b6020821081141561336c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613386576133866133a1565b5060010190565b60008261339c5761339c6133b7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461107357600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652968747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d50397a64597445567935645a576b585944756d6b6e456e514261654d474e4534744144713235657141624444a26469706673582212206b20e6f786a6ff37ce8c71e4c2969ae23df6d926fd08ae19beeb85d418f1058164736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742968747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d597266413732534e5347466a76613555786d4e4d684632714878396b466263434267634a4d736931333534732f

Deployed Bytecode

0x60806040526004361061031a5760003560e01c8063755edd17116101ab578063b8c73cc2116100f7578063db59969811610095578063edec5f271161006f578063edec5f27146108aa578063f2fde38b146108ca578063f366afc9146108ea578063fdb7ecc5146108ff57600080fd5b8063db59969814610843578063e1b775d21461084b578063e985e9c51461086157600080fd5b8063c963483c116100d1578063c963483c146107e2578063d547cfb7146107f8578063d71ac32e1461080d578063d9bf49361461082357600080fd5b8063b8c73cc21461078c578063ba4e5c49146107a2578063c87b56dd146107c257600080fd5b8063a0bcfc7f11610164578063a6f2ae3a1161013e578063a6f2ae3a1461072e578063b27b1a6d14610736578063b293631914610756578063b88d4fde1461076c57600080fd5b8063a0bcfc7f146106ce578063a1f69e04146106ee578063a22cb4651461070e57600080fd5b8063755edd171461062557806378e97925146106455780638da5cb5b1461065b57806390edbfee1461067957806395d89b41146106995780639667e4d5146106ae57600080fd5b80633408e4701161026a57806360d938dc1161022357806370a08231116101fd57806370a08231146105c857806370ee874b146105e8578063715018a6146105f0578063748973151461060557600080fd5b806360d938dc1461057e57806362422612146105935780636352211e146105a857600080fd5b80633408e470146104dc5780633af32abf146104ef5780633ccfd60b1461050f5780634114e8a41461052457806342842e0e1461053e5780634f6ccce71461055e57600080fd5b806312cfa116116102d757806320379ee5116102b157806320379ee51461045157806323b872dd146104665780632d0335ab146104865780632f745c59146104bc57600080fd5b806312cfa1161461041057806316c8c21b1461041857806318160ddd1461043c57600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae5780630c53c51c146103d05780630f7e5970146103e3575b600080fd5b34801561032b57600080fd5b5061033f61033a366004612ec2565b610919565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610944565b60405161034b9190613162565b34801561038257600080fd5b50610396610391366004612f45565b6109d6565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004612e08565b610a70565b005b6103696103de366004612d8c565b610b98565b3480156103ef57600080fd5b50610369604051806040016040528060018152602001603160f81b81525081565b6103ce610d82565b34801561042457600080fd5b5061042e60115481565b60405190815260200161034b565b34801561044857600080fd5b5060085461042e565b34801561045d57600080fd5b50600b5461042e565b34801561047257600080fd5b506103ce610481366004612cbe565b610eb9565b34801561049257600080fd5b5061042e6104a1366004612c70565b6001600160a01b03166000908152600c602052604090205490565b3480156104c857600080fd5b5061042e6104d7366004612e08565b610ef1565b3480156104e857600080fd5b504661042e565b3480156104fb57600080fd5b5061033f61050a366004612c70565b610f87565b34801561051b57600080fd5b506103ce610ff1565b34801561053057600080fd5b5060135461033f9060ff1681565b34801561054a57600080fd5b506103ce610559366004612cbe565b611076565b34801561056a57600080fd5b5061042e610579366004612f45565b611091565b34801561058a57600080fd5b5061033f611124565b34801561059f57600080fd5b506103ce61115b565b3480156105b457600080fd5b506103966105c3366004612f45565b6111b3565b3480156105d457600080fd5b5061042e6105e3366004612c70565b61122a565b6103ce6112b1565b3480156105fc57600080fd5b506103ce611459565b34801561061157600080fd5b506103ce610620366004612f5e565b6114ae565b34801561063157600080fd5b506103ce610640366004612c70565b611599565b34801561065157600080fd5b5061042e60165481565b34801561066757600080fd5b50600d546001600160a01b0316610396565b34801561068557600080fd5b506103ce610694366004612f45565b611623565b3480156106a557600080fd5b50610369611680565b3480156106ba57600080fd5b506103ce6106c9366004612f45565b61168f565b3480156106da57600080fd5b506103ce6106e9366004612efc565b6116dd565b3480156106fa57600080fd5b506103ce610709366004612ea7565b611739565b34801561071a57600080fd5b506103ce610729366004612d62565b611795565b6103ce611897565b34801561074257600080fd5b506103ce610751366004612f45565b611998565b34801561076257600080fd5b5061042e60155481565b34801561077857600080fd5b506103ce610787366004612cfa565b6119e6565b34801561079857600080fd5b5061042e60125481565b3480156107ae57600080fd5b506103966107bd366004612f45565b611a25565b3480156107ce57600080fd5b506103696107dd366004612f45565b611a4f565b3480156107ee57600080fd5b5061042e600e5481565b34801561080457600080fd5b50610369611aac565b34801561081957600080fd5b5061042e60145481565b34801561082f57600080fd5b506103ce61083e366004612f81565b611b3a565b6103ce611b8e565b34801561085757600080fd5b5061042e601b5481565b34801561086d57600080fd5b5061033f61087c366004612c8b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108b657600080fd5b506103ce6108c5366004612e32565b611d36565b3480156108d657600080fd5b506103ce6108e5366004612c70565b611d97565b3480156108f657600080fd5b506103ce611e4e565b34801561090b57600080fd5b5060195461033f9060ff1681565b60006001600160e01b0319821663780e9d6360e01b148061093e575061093e82611f20565b92915050565b60606000805461095390613337565b80601f016020809104026020016040519081016040528092919081815260200182805461097f90613337565b80156109cc5780601f106109a1576101008083540402835291602001916109cc565b820191906000526020600020905b8154815290600101906020018083116109af57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610a545760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a7b826111b3565b9050806001600160a01b0316836001600160a01b03161415610ae95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a4b565b806001600160a01b0316610afb611f70565b6001600160a01b03161480610b175750610b178161087c611f70565b610b895760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a4b565b610b938383611f7f565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610bd68782878787611fed565b610c2c5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610a4b565b6001600160a01b0387166000908152600c6020526040902054610c509060016120dd565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610ca090899033908a906130f9565b60405180910390a1600080306001600160a01b0316888a604051602001610cc8929190613007565b60408051601f1981840301815290829052610ce291612feb565b6000604051808303816000865af19150503d8060008114610d1f576040519150601f19603f3d011682016040523d82523d6000602084013e610d24565b606091505b509150915081610d765760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610a4b565b98975050505050505050565b601654421015610dc85760405162461bcd60e51b8152602060048201526011602482015270125d09dcc81b9bdd081d1a5b59481e595d607a1b6044820152606401610a4b565b6015543414610e0d5760405162461bcd60e51b815260206004820152601160248201527053656e7420416d6f756e742057726f6e6760781b6044820152606401610a4b565b60195460039060ff16151560011415610e2e57610e2b8160026132d5565b90505b610e396105e3611f70565b610e4b57610e488160016132a9565b90505b600f54600e54610e5b90836120dd565b10610e785760405162461bcd60e51b8152600401610a4b9061327d565b60005b81811015610eb557610e9b610e8e611f70565b610e966120f0565b612101565b610ea361224f565b80610ead81613372565b915050610e7b565b5050565b610eca610ec4611f70565b82612276565b610ee65760405162461bcd60e51b8152600401610a4b9061322c565b610b9383838361236d565b6000610efc8361122a565b8210610f5e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a4b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000805b601a54811015610fe857826001600160a01b0316601a8281548110610fb257610fb26133e3565b6000918252602090912001546001600160a01b03161415610fd65750600192915050565b80610fe081613372565b915050610f8b565b50600092915050565b610ff9611f70565b6001600160a01b0316611014600d546001600160a01b031690565b6001600160a01b03161461103a5760405162461bcd60e51b8152600401610a4b906131c7565b600d546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611073573d6000803e3d6000fd5b50565b610b93838383604051806020016040528060008152506119e6565b600061109c60085490565b82106110ff5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a4b565b60088281548110611112576111126133e3565b90600052602060002001549050919050565b600060115442118015611138575060125442105b8015611147575060135460ff16155b156111525750600190565b50600090565b90565b611163611f70565b6001600160a01b031661117e600d546001600160a01b031690565b6001600160a01b0316146111a45760405162461bcd60e51b8152600401610a4b906131c7565b6013805460ff19166001179055565b6000818152600260205260408120546001600160a01b03168061093e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a4b565b60006001600160a01b0382166112955760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a4b565b506001600160a01b031660009081526003602052604090205490565b60115442116113025760405162461bcd60e51b815260206004820152601d60248201527f50726573616c652068617665206e6f742073746172746564207965742e0000006044820152606401610a4b565b60125442106113445760405162461bcd60e51b815260206004820152600e60248201526d283932b9b0b6329022b73232b21760911b6044820152606401610a4b565b600f54600e546113559060076132a9565b106113725760405162461bcd60e51b8152600401610a4b9061327d565b60135460ff16156113b55760405162461bcd60e51b815260206004820152600d60248201526c141c995cd85b1948115b991959609a1b6044820152606401610a4b565b6113c061050a611f70565b6114075760405162461bcd60e51b81526020600482015260186024820152772cb7ba9030b932903737ba102bb434ba32b634b9ba32b21760411b6044820152606401610a4b565b60155434146114285760405162461bcd60e51b8152600401610a4b906131fc565b60005b60078110156110735761143f610e8e611f70565b61144761224f565b8061145181613372565b91505061142b565b611461611f70565b6001600160a01b031661147c600d546001600160a01b031690565b6001600160a01b0316146114a25760405162461bcd60e51b8152600401610a4b906131c7565b6114ac6000612518565b565b6114b6611f70565b6001600160a01b03166114d1600d546001600160a01b031690565b6001600160a01b0316146114f75760405162461bcd60e51b8152600401610a4b906131c7565b600f5482600e5461150891906132a9565b106115255760405162461bcd60e51b8152600401610a4b9061327d565b60148211156115685760405162461bcd60e51b815260206004820152600f60248201526e26b0bc1019181020b63637bbb2b21760891b6044820152606401610a4b565b60005b82811015610b935761157f82610e966120f0565b61158761224f565b8061159181613372565b91505061156b565b6115a1611f70565b6001600160a01b03166115bc600d546001600160a01b031690565b6001600160a01b0316146115e25760405162461bcd60e51b8152600401610a4b906131c7565b600f54600e54106116055760405162461bcd60e51b8152600401610a4b9061327d565b600061160f6120f0565b905061161b8282612101565b610eb561224f565b61162b611f70565b6001600160a01b0316611646600d546001600160a01b031690565b6001600160a01b03161461166c5760405162461bcd60e51b8152600401610a4b906131c7565b80600f5461167a91906132a9565b600f5550565b60606001805461095390613337565b611697611f70565b6001600160a01b03166116b2600d546001600160a01b031690565b6001600160a01b0316146116d85760405162461bcd60e51b8152600401610a4b906131c7565b601b55565b6116e5611f70565b6001600160a01b0316611700600d546001600160a01b031690565b6001600160a01b0316146117265760405162461bcd60e51b8152600401610a4b906131c7565b8051610eb5906010906020840190612aa4565b611741611f70565b6001600160a01b031661175c600d546001600160a01b031690565b6001600160a01b0316146117825760405162461bcd60e51b8152600401610a4b906131c7565b6019805460ff1916911515919091179055565b61179d611f70565b6001600160a01b0316826001600160a01b031614156117fe5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a4b565b806005600061180b611f70565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561184f611f70565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161188b911515815260200190565b60405180910390a35050565b6016544210156118dd5760405162461bcd60e51b8152602060048201526011602482015270125d09dcc81b9bdd081d1a5b59481e595d607a1b6044820152606401610a4b565b60145434146118fe5760405162461bcd60e51b8152600401610a4b906131fc565b60195460019060ff16151581141561191e5761191b8160026132d5565b90505b6119296105e3611f70565b61193b576119388160016132a9565b90505b600f54600e5461194b90836120dd565b106119685760405162461bcd60e51b8152600401610a4b9061327d565b60005b81811015610eb55761197e610e8e611f70565b61198661224f565b8061199081613372565b91505061196b565b6119a0611f70565b6001600160a01b03166119bb600d546001600160a01b031690565b6001600160a01b0316146119e15760405162461bcd60e51b8152600401610a4b906131c7565b601655565b6119f76119f1611f70565b83612276565b611a135760405162461bcd60e51b8152600401610a4b9061322c565b611a1f8484848461256a565b50505050565b601a8181548110611a3557600080fd5b6000918252602090912001546001600160a01b0316905081565b6060601b54421015611a7a576040518060800160405280605081526020016134696050913992915050565b6010611a858361259d565b604051602001611a9692919061303e565b6040516020818303038152906040529050919050565b60108054611ab990613337565b80601f0160208091040260200160405190810160405280929190818152602001828054611ae590613337565b8015611b325780601f10611b0757610100808354040283529160200191611b32565b820191906000526020600020905b815481529060010190602001808311611b1557829003601f168201915b505050505081565b611b42611f70565b6001600160a01b0316611b5d600d546001600160a01b031690565b6001600160a01b031614611b835760405162461bcd60e51b8152600401610a4b906131c7565b601191909155601255565b6011544211611bdf5760405162461bcd60e51b815260206004820152601d60248201527f50726573616c652068617665206e6f742073746172746564207965742e0000006044820152606401610a4b565b6012544210611c215760405162461bcd60e51b815260206004820152600e60248201526d283932b9b0b6329022b73232b21760911b6044820152606401610a4b565b600f54600e54611c329060036132a9565b10611c4f5760405162461bcd60e51b8152600401610a4b9061327d565b60135460ff1615611c925760405162461bcd60e51b815260206004820152600d60248201526c141c995cd85b1948115b991959609a1b6044820152606401610a4b565b611c9d61050a611f70565b611ce45760405162461bcd60e51b81526020600482015260186024820152772cb7ba9030b932903737ba102bb434ba32b634b9ba32b21760411b6044820152606401610a4b565b6014543414611d055760405162461bcd60e51b8152600401610a4b906131fc565b60005b600381101561107357611d1c610e8e611f70565b611d2461224f565b80611d2e81613372565b915050611d08565b611d3e611f70565b6001600160a01b0316611d59600d546001600160a01b031690565b6001600160a01b031614611d7f5760405162461bcd60e51b8152600401610a4b906131c7565b611d8b601a6000612b28565b610b93601a8383612b46565b611d9f611f70565b6001600160a01b0316611dba600d546001600160a01b031690565b6001600160a01b031614611de05760405162461bcd60e51b8152600401610a4b906131c7565b6001600160a01b038116611e455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a4b565b61107381612518565b611e596105e3611f70565b15611eb15760405162461bcd60e51b815260206004820152602260248201527f596f75206861766520616c726561647920436c61696d65642046726565204e666044820152613a1760f11b6064820152608401610a4b565b611ebc610e8e611f70565b6114ac61224f565b600033301415611f1b57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506111589050565b503390565b60006001600160e01b031982166380ac58cd60e01b1480611f5157506001600160e01b03198216635b5e139f60e01b145b8061093e57506301ffc9a760e01b6001600160e01b031983161461093e565b6000611f7a611ec4565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611fb4826111b3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166120535760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610a4b565b60016120666120618761269b565b612718565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156120b4573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006120e982846132a9565b9392505050565b600e54600090611f7a9060016120dd565b6001600160a01b0382166121575760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a4b565b6000818152600260205260409020546001600160a01b0316156121bc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a4b565b6121c860008383612748565b6001600160a01b03821660009081526003602052604081208054600192906121f19084906132a9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600f54600e541061225f57600080fd5b600e805490600061226f83613372565b9190505550565b6000818152600260205260408120546001600160a01b03166122ef5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a4b565b60006122fa836111b3565b9050806001600160a01b0316846001600160a01b031614806123355750836001600160a01b031661232a846109d6565b6001600160a01b0316145b8061236557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612380826111b3565b6001600160a01b0316146123e85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a4b565b6001600160a01b03821661244a5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a4b565b612455838383612748565b612460600082611f7f565b6001600160a01b03831660009081526003602052604081208054600192906124899084906132f4565b90915550506001600160a01b03821660009081526003602052604081208054600192906124b79084906132a9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61257584848461236d565b61258184848484612800565b611a1f5760405162461bcd60e51b8152600401610a4b90613175565b6060816125c15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125eb57806125d581613372565b91506125e49050600a836132c1565b91506125c5565b60008167ffffffffffffffff811115612606576126066133f9565b6040519080825280601f01601f191660200182016040528015612630576020820181803683370190505b5090505b8415612365576126456001836132f4565b9150612652600a8661338d565b61265d9060306132a9565b60f81b818381518110612672576126726133e3565b60200101906001600160f81b031916908160001a905350612694600a866132c1565b9450612634565b600060405180608001604052806043815260200161342660439139805160209182012083518483015160408087015180519086012090516126fb950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000612723600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016126fb565b6001600160a01b0383166127a35761279e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6127c6565b816001600160a01b0316836001600160a01b0316146127c6576127c68382612914565b6001600160a01b0382166127dd57610b93816129b1565b826001600160a01b0316826001600160a01b031614610b9357610b938282612a60565b60006001600160a01b0384163b1561290957836001600160a01b031663150b7a02612829611f70565b8786866040518563ffffffff1660e01b815260040161284b9493929190613125565b602060405180830381600087803b15801561286557600080fd5b505af1925050508015612895575060408051601f3d908101601f1916820190925261289291810190612edf565b60015b6128ef573d8080156128c3576040519150601f19603f3d011682016040523d82523d6000602084013e6128c8565b606091505b5080516128e75760405162461bcd60e51b8152600401610a4b90613175565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612365565b506001949350505050565b600060016129218461122a565b61292b91906132f4565b60008381526007602052604090205490915080821461297e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906129c3906001906132f4565b600083815260096020526040812054600880549394509092849081106129eb576129eb6133e3565b906000526020600020015490508060088381548110612a0c57612a0c6133e3565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612a4457612a446133cd565b6001900381819060005260206000200160009055905550505050565b6000612a6b8361122a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612ab090613337565b90600052602060002090601f016020900481019282612ad25760008555612b18565b82601f10612aeb57805160ff1916838001178555612b18565b82800160010185558215612b18579182015b82811115612b18578251825591602001919060010190612afd565b50612b24929150612b99565b5090565b50805460008255906000526020600020908101906110739190612b99565b828054828255906000526020600020908101928215612b18579160200282015b82811115612b185781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612b66565b5b80821115612b245760008155600101612b9a565b600067ffffffffffffffff80841115612bc957612bc96133f9565b604051601f8501601f19908116603f01168101908282118183101715612bf157612bf16133f9565b81604052809350858152868686011115612c0a57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612c3b57600080fd5b919050565b80358015158114612c3b57600080fd5b600082601f830112612c6157600080fd5b6120e983833560208501612bae565b600060208284031215612c8257600080fd5b6120e982612c24565b60008060408385031215612c9e57600080fd5b612ca783612c24565b9150612cb560208401612c24565b90509250929050565b600080600060608486031215612cd357600080fd5b612cdc84612c24565b9250612cea60208501612c24565b9150604084013590509250925092565b60008060008060808587031215612d1057600080fd5b612d1985612c24565b9350612d2760208601612c24565b925060408501359150606085013567ffffffffffffffff811115612d4a57600080fd5b612d5687828801612c50565b91505092959194509250565b60008060408385031215612d7557600080fd5b612d7e83612c24565b9150612cb560208401612c40565b600080600080600060a08688031215612da457600080fd5b612dad86612c24565b9450602086013567ffffffffffffffff811115612dc957600080fd5b612dd588828901612c50565b9450506040860135925060608601359150608086013560ff81168114612dfa57600080fd5b809150509295509295909350565b60008060408385031215612e1b57600080fd5b612e2483612c24565b946020939093013593505050565b60008060208385031215612e4557600080fd5b823567ffffffffffffffff80821115612e5d57600080fd5b818501915085601f830112612e7157600080fd5b813581811115612e8057600080fd5b8660208260051b8501011115612e9557600080fd5b60209290920196919550909350505050565b600060208284031215612eb957600080fd5b6120e982612c40565b600060208284031215612ed457600080fd5b81356120e98161340f565b600060208284031215612ef157600080fd5b81516120e98161340f565b600060208284031215612f0e57600080fd5b813567ffffffffffffffff811115612f2557600080fd5b8201601f81018413612f3657600080fd5b61236584823560208401612bae565b600060208284031215612f5757600080fd5b5035919050565b60008060408385031215612f7157600080fd5b82359150612cb560208401612c24565b60008060408385031215612f9457600080fd5b50508035926020909101359150565b60008151808452612fbb81602086016020860161330b565b601f01601f19169290920160200192915050565b60008151612fe181856020860161330b565b9290920192915050565b60008251612ffd81846020870161330b565b9190910192915050565b6000835161301981846020880161330b565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600080845481600182811c91508083168061305a57607f831692505b602080841082141561307a57634e487b7160e01b86526022600452602486fd5b81801561308e576001811461309f576130cc565b60ff198616895284890196506130cc565b60008b81526020902060005b868110156130c45781548b8201529085019083016130ab565b505084890196505b5050505050506130f06130df8286612fcf565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038481168252831660208201526060604082018190526000906130f090830184612fa3565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061315890830184612fa3565b9695505050505050565b6020815260006120e96020830184612fa3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601690820152750a6cadce84082dadeeadce8409cdee8408adcdeeaced60531b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526012908201527113585e0814dd5c1c1b1e4814995858da195960721b604082015260600190565b600082198211156132bc576132bc6133a1565b500190565b6000826132d0576132d06133b7565b500490565b60008160001904831182151516156132ef576132ef6133a1565b500290565b600082821015613306576133066133a1565b500390565b60005b8381101561332657818101518382015260200161330e565b83811115611a1f5750506000910152565b600181811c9082168061334b57607f821691505b6020821081141561336c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613386576133866133a1565b5060010190565b60008261339c5761339c6133b7565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461107357600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652968747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d50397a64597445567935645a576b585944756d6b6e456e514261654d474e4534744144713235657141624444a26469706673582212206b20e6f786a6ff37ce8c71e4c2969ae23df6d926fd08ae19beeb85d418f1058164736f6c63430008070033

Deployed Bytecode Sourcemap

54014:7651:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41817:300;;;;;;;;;;-1:-1:-1;41817:300:0;;;;;:::i;:::-;;:::i;:::-;;;10527:14:1;;10520:22;10502:41;;10490:2;10475:18;41817:300:0;;;;;;;;29296:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30989:308::-;;;;;;;;;;-1:-1:-1;30989:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9367:32:1;;;9349:51;;9337:2;9322:18;30989:308:0;9203:203:1;30512:411:0;;;;;;;;;;-1:-1:-1;30512:411:0;;;;;:::i;:::-;;:::i;:::-;;51827:1151;;;;;;:::i;:::-;;:::i;49083:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;49083:43:0;;;;;58038:615;;;:::i;54362:45::-;;;;;;;;;;;;;;;;;;;10700:25:1;;;10688:2;10673:18;54362:45:0;10554:177:1;42620:113:0;;;;;;;;;;-1:-1:-1;42708:10:0;:17;42620:113;;50078:101;;;;;;;;;;-1:-1:-1;50156:15:0;;50078:101;;32048:376;;;;;;;;;;-1:-1:-1;32048:376:0;;;;;:::i;:::-;;:::i;53404:107::-;;;;;;;;;;-1:-1:-1;53404:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;53491:12:0;53457:13;53491:12;;;:6;:12;;;;;;;53404:107;42201:343;;;;;;;;;;-1:-1:-1;42201:343:0;;;;;:::i;:::-;;:::i;50187:161::-;;;;;;;;;;-1:-1:-1;50301:9:0;50187:161;;59312:239;;;;;;;;;;-1:-1:-1;59312:239:0;;;;;:::i;:::-;;:::i;59964:106::-;;;;;;;;;;;;;:::i;54548:31::-;;;;;;;;;;-1:-1:-1;54548:31:0;;;;;;;;32495:185;;;;;;;;;;-1:-1:-1;32495:185:0;;;;;:::i;:::-;;:::i;42810:320::-;;;;;;;;;;-1:-1:-1;42810:320:0;;;;;:::i;:::-;;:::i;59711:245::-;;;;;;;;;;;;;:::i;55664:87::-;;;;;;;;;;;;;:::i;28903:326::-;;;;;;;;;;-1:-1:-1;28903:326:0;;;;;:::i;:::-;;:::i;28546:295::-;;;;;;;;;;-1:-1:-1;28546:295:0;;;;;:::i;:::-;;:::i;56490:640::-;;;:::i;26167:94::-;;;;;;;;;;;;;:::i;58719:323::-;;;;;;;;;;-1:-1:-1;58719:323:0;;;;;:::i;:::-;;:::i;59054:236::-;;;;;;;;;;-1:-1:-1;59054:236:0;;;;;:::i;:::-;;:::i;54692:37::-;;;;;;;;;;;;;;;;25516:87;;;;;;;;;;-1:-1:-1;25589:6:0;;-1:-1:-1;;;;;25589:6:0;25516:87;;61553:109;;;;;;;;;;-1:-1:-1;61553:109:0;;;;;:::i;:::-;;:::i;29465:104::-;;;;;;;;;;;;;:::i;55296:::-;;;;;;;;;;-1:-1:-1;55296:104:0;;;;;:::i;:::-;;:::i;60773:97::-;;;;;;;;;;-1:-1:-1;60773:97:0;;;;;:::i;:::-;;:::i;55171:113::-;;;;;;;;;;-1:-1:-1;55171:113:0;;;;;:::i;:::-;;:::i;31369:327::-;;;;;;;;;;-1:-1:-1;31369:327:0;;;;;:::i;:::-;;:::i;57417:609::-;;;:::i;55412:91::-;;;;;;;;;;-1:-1:-1;55412:91:0;;;;;:::i;:::-;;:::i;54638:44::-;;;;;;;;;;;;;;;;32751:365;;;;;;;;;;-1:-1:-1;32751:365:0;;;;;:::i;:::-;;:::i;54456:43::-;;;;;;;;;;;;;;;;54907:37;;;;;;;;;;-1:-1:-1;54907:37:0;;;;;:::i;:::-;;:::i;60878:405::-;;;;;;;;;;-1:-1:-1;60878:405:0;;;;;:::i;:::-;;:::i;54162:34::-;;;;;;;;;;;;;;;;54238:112;;;;;;;;;;;;;:::i;54592:38::-;;;;;;;;;;;;;;;;55509:149;;;;;;;;;;-1:-1:-1;55509:149:0;;;;;:::i;:::-;;:::i;55824:636::-;;;:::i;54955:39::-;;;;;;;;;;;;;;;;31767:214;;;;;;;;;;-1:-1:-1;31767:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;31938:25:0;;;31909:4;31938:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31767:214;59559:144;;;;;;;;;;-1:-1:-1;59559:144:0;;;;;:::i;:::-;;:::i;26416:229::-;;;;;;;;;;-1:-1:-1;26416:229:0;;;;;:::i;:::-;;:::i;57178:203::-;;;;;;;;;;;;;:::i;54851:43::-;;;;;;;;;;-1:-1:-1;54851:43:0;;;;;;;;41817:300;41964:4;-1:-1:-1;;;;;;42006:50:0;;-1:-1:-1;;;42006:50:0;;:103;;;42073:36;42097:11;42073:23;:36::i;:::-;41986:123;41817:300;-1:-1:-1;;41817:300:0:o;29296:100::-;29350:13;29383:5;29376:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29296:100;:::o;30989:308::-;31110:7;34752:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34752:16:0;31135:110;;;;-1:-1:-1;;;31135:110:0;;17712:2:1;31135:110:0;;;17694:21:1;17751:2;17731:18;;;17724:30;17790:34;17770:18;;;17763:62;-1:-1:-1;;;17841:18:1;;;17834:42;17893:19;;31135:110:0;;;;;;;;;-1:-1:-1;31265:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31265:24:0;;30989:308::o;30512:411::-;30593:13;30609:23;30624:7;30609:14;:23::i;:::-;30593:39;;30657:5;-1:-1:-1;;;;;30651:11:0;:2;-1:-1:-1;;;;;30651:11:0;;;30643:57;;;;-1:-1:-1;;;30643:57:0;;20355:2:1;30643:57:0;;;20337:21:1;20394:2;20374:18;;;20367:30;20433:34;20413:18;;;20406:62;-1:-1:-1;;;20484:18:1;;;20477:31;20525:19;;30643:57:0;20153:397:1;30643:57:0;30751:5;-1:-1:-1;;;;;30735:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;30735:21:0;;:62;;;;30760:37;30777:5;30784:12;:10;:12::i;30760:37::-;30713:168;;;;-1:-1:-1;;;30713:168:0;;16105:2:1;30713:168:0;;;16087:21:1;16144:2;16124:18;;;16117:30;16183:34;16163:18;;;16156:62;16254:26;16234:18;;;16227:54;16298:19;;30713:168:0;15903:420:1;30713:168:0;30894:21;30903:2;30907:7;30894:8;:21::i;:::-;30582:341;30512:411;;:::o;51827:1151::-;52085:152;;;52028:12;52085:152;;;;;-1:-1:-1;;;;;52123:19:0;;52053:29;52123:19;;;:6;:19;;;;;;;;;52085:152;;;;;;;;;;;52272:45;52130:11;52085:152;52300:4;52306;52312;52272:6;:45::i;:::-;52250:128;;;;-1:-1:-1;;;52250:128:0;;19600:2:1;52250:128:0;;;19582:21:1;19639:2;19619:18;;;19612:30;19678:34;19658:18;;;19651:62;-1:-1:-1;;;19729:18:1;;;19722:31;19770:19;;52250:128:0;19398:397:1;52250:128:0;-1:-1:-1;;;;;52467:19:0;;;;;;:6;:19;;;;;;:26;;52491:1;52467:23;:26::i;:::-;-1:-1:-1;;;;;52445:19:0;;;;;;:6;:19;;;;;;;:48;;;;52511:126;;;;;52452:11;;52583:10;;52609:17;;52511:126;:::i;:::-;;;;;;;;52748:12;52762:23;52797:4;-1:-1:-1;;;;;52789:18:0;52839:17;52858:11;52822:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52822:48:0;;;;;;;;;;52789:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52747:134;;;;52900:7;52892:48;;;;-1:-1:-1;;;52892:48:0;;13469:2:1;52892:48:0;;;13451:21:1;13508:2;13488:18;;;13481:30;13547;13527:18;;;13520:58;13595:18;;52892:48:0;13267:352:1;52892:48:0;52960:10;51827:1151;-1:-1:-1;;;;;;;;51827:1151:0:o;58038:615::-;58111:9;;58092:15;:28;;58084:58;;;;-1:-1:-1;;;58084:58:0;;22272:2:1;58084:58:0;;;22254:21:1;22311:2;22291:18;;;22284:30;-1:-1:-1;;;22330:18:1;;;22323:47;22387:18;;58084:58:0;22070:341:1;58084:58:0;58174:15;;58161:9;:28;58153:58;;;;-1:-1:-1;;;58153:58:0;;18844:2:1;58153:58:0;;;18826:21:1;18883:2;18863:18;;;18856:30;-1:-1:-1;;;18902:18:1;;;18895:47;18959:18;;58153:58:0;18642:341:1;58153:58:0;58262:24;;58236:1;;58262:24;;:32;;:24;:32;58259:76;;;58316:7;:3;58322:1;58316:7;:::i;:::-;58310:13;;58259:76;58358:23;58368:12;:10;:12::i;58358:23::-;58355:73;;58409:7;:3;58415:1;58409:7;:::i;:::-;58403:13;;58355:73;58473:10;;58446:15;;:24;;58466:3;58446:19;:24::i;:::-;:37;58438:68;;;;-1:-1:-1;;;58438:68:0;;;;;;;:::i;:::-;58521:9;58517:129;58536:3;58534:1;:5;58517:129;;;58562:38;58568:12;:10;:12::i;:::-;58582:17;:15;:17::i;:::-;58562:5;:38::i;:::-;58615:19;:17;:19::i;:::-;58541:3;;;;:::i;:::-;;;;58517:129;;;;58073:580;58038:615::o;32048:376::-;32257:41;32276:12;:10;:12::i;:::-;32290:7;32257:18;:41::i;:::-;32235:140;;;;-1:-1:-1;;;32235:140:0;;;;;;;:::i;:::-;32388:28;32398:4;32404:2;32408:7;32388:9;:28::i;42201:343::-;42343:7;42398:23;42415:5;42398:16;:23::i;:::-;42390:5;:31;42368:124;;;;-1:-1:-1;;;42368:124:0;;12231:2:1;42368:124:0;;;12213:21:1;12270:2;12250:18;;;12243:30;12309:34;12289:18;;;12282:62;-1:-1:-1;;;12360:18:1;;;12353:41;12411:19;;42368:124:0;12029:407:1;42368:124:0;-1:-1:-1;;;;;;42510:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;42201:343::o;59312:239::-;59371:4;;59384:143;59405:20;:27;59401:31;;59384:143;;;59479:5;-1:-1:-1;;;;;59452:32:0;:20;59473:1;59452:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;59452:23:0;:32;59448:72;;;-1:-1:-1;59506:4:0;;59312:239;-1:-1:-1;;59312:239:0:o;59448:72::-;59434:3;;;;:::i;:::-;;;;59384:143;;;-1:-1:-1;59540:5:0;;59312:239;-1:-1:-1;;59312:239:0:o;59964:106::-;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;25589:6;;60014:48:::1;::::0;-1:-1:-1;;;;;25589:6:0;;;;60040:21:::1;60014:48:::0;::::1;;;::::0;::::1;::::0;;;60040:21;25589:6;60014:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;59964:106::o:0;32495:185::-;32633:39;32650:4;32656:2;32660:7;32633:39;;;;;;;;;;;;:16;:39::i;42810:320::-;42930:7;42985:30;42708:10;:17;;42620:113;42985:30;42977:5;:38;42955:132;;;;-1:-1:-1;;;42955:132:0;;22618:2:1;42955:132:0;;;22600:21:1;22657:2;22637:18;;;22630:30;22696:34;22676:18;;;22669:62;-1:-1:-1;;;22747:18:1;;;22740:42;22799:19;;42955:132:0;22416:408:1;42955:132:0;43105:10;43116:5;43105:17;;;;;;;;:::i;:::-;;;;;;;;;43098:24;;42810:320;;;:::o;59711:245::-;59761:4;59798:17;;59780:15;:35;:72;;;;;59837:15;;59819;:33;59780:72;:96;;;;-1:-1:-1;59856:11:0;;;;:20;59780:96;59777:174;;;-1:-1:-1;59898:4:0;;59711:245::o;59777:174::-;-1:-1:-1;59936:5:0;;59711:245::o;59777:174::-;59711:245;:::o;55664:87::-;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;55725:11:::1;:18:::0;;-1:-1:-1;;55725:18:0::1;55739:4;55725:18;::::0;;55664:87::o;28903:326::-;29020:7;29061:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29061:16:0;29110:19;29088:110;;;;-1:-1:-1;;;29088:110:0;;16941:2:1;29088:110:0;;;16923:21:1;16980:2;16960:18;;;16953:30;17019:34;16999:18;;;16992:62;-1:-1:-1;;;17070:18:1;;;17063:39;17119:19;;29088:110:0;16739:405:1;28546:295:0;28663:7;-1:-1:-1;;;;;28710:19:0;;28688:111;;;;-1:-1:-1;;;28688:111:0;;16530:2:1;28688:111:0;;;16512:21:1;16569:2;16549:18;;;16542:30;16608:34;16588:18;;;16581:62;-1:-1:-1;;;16659:18:1;;;16652:40;16709:19;;28688:111:0;16328:406:1;28688:111:0;-1:-1:-1;;;;;;28817:16:0;;;;;:9;:16;;;;;;;28546:295::o;56490:640::-;56571:17;;56553:15;:35;56545:77;;;;-1:-1:-1;;;56545:77:0;;18486:2:1;56545:77:0;;;18468:21:1;18525:2;18505:18;;;18498:30;18564:31;18544:18;;;18537:59;18613:18;;56545:77:0;18284:353:1;56545:77:0;56659:15;;56641;:33;56633:60;;;;-1:-1:-1;;;56633:60:0;;21108:2:1;56633:60:0;;;21090:21:1;21147:2;21127:18;;;21120:30;-1:-1:-1;;;21166:18:1;;;21159:44;21220:18;;56633:60:0;20906:338:1;56633:60:0;56734:10;;56712:15;;:19;;56730:1;56712:19;:::i;:::-;:32;56704:63;;;;-1:-1:-1;;;56704:63:0;;;;;;;:::i;:::-;56786:11;;;;:20;56778:45;;;;-1:-1:-1;;;56778:45:0;;23378:2:1;56778:45:0;;;23360:21:1;23417:2;23397:18;;;23390:30;-1:-1:-1;;;23436:18:1;;;23429:43;23489:18;;56778:45:0;23176:337:1;56778:45:0;56842:27;56856:12;:10;:12::i;56842:27::-;56834:65;;;;-1:-1:-1;;;56834:65:0;;20002:2:1;56834:65:0;;;19984:21:1;20041:2;20021:18;;;20014:30;-1:-1:-1;;;20060:18:1;;;20053:54;20124:18;;56834:65:0;19800:348:1;56834:65:0;56931:15;;56918:9;:28;56910:63;;;;-1:-1:-1;;;56910:63:0;;;;;;;:::i;:::-;57000:9;56996:127;57016:1;57013;:4;56996:127;;;57038:39;57044:12;:10;:12::i;57038:39::-;57092:19;:17;:19::i;:::-;57019:3;;;;:::i;:::-;;;;56996:127;;26167:94;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;26232:21:::1;26250:1;26232:9;:21::i;:::-;26167:94::o:0;58719:323::-;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;58823:10:::1;;58817:3;58799:15;;:21;;;;:::i;:::-;:34;58791:65;;;;-1:-1:-1::0;;;58791:65:0::1;;;;;;;:::i;:::-;58882:2;58875:3;:9;;58867:37;;;::::0;-1:-1:-1;;;58867:37:0;;14942:2:1;58867:37:0::1;::::0;::::1;14924:21:1::0;14981:2;14961:18;;;14954:30;-1:-1:-1;;;15000:18:1;;;14993:45;15055:18;;58867:37:0::1;14740:339:1::0;58867:37:0::1;58919:9;58915:120;58934:3;58932:1;:5;58915:120;;;58960:29;58966:3;58971:17;:15;:17::i;58960:29::-;59004:19;:17;:19::i;:::-;58939:3:::0;::::1;::::0;::::1;:::i;:::-;;;;58915:120;;59054:236:::0;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;59137:10:::1;;59119:15;;:28;59111:59;;;;-1:-1:-1::0;;;59111:59:0::1;;;;;;;:::i;:::-;59181:18;59202:17;:15;:17::i;:::-;59181:38;;59230:22;59236:3;59241:10;59230:5;:22::i;:::-;59263:19;:17;:19::i;61553:109::-:0;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;61650:4:::1;61637:10;;:17;;;;:::i;:::-;61624:10;:30:::0;-1:-1:-1;61553:109:0:o;29465:104::-;29521:13;29554:7;29547:14;;;;;:::i;55296:104::-;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;55369:11:::1;:23:::0;55296:104::o;60773:97::-;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;60843:19;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;55171:113::-:0;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;55243:24:::1;:33:::0;;-1:-1:-1;;55243:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55171:113::o;31369:327::-;31516:12;:10;:12::i;:::-;-1:-1:-1;;;;;31504:24:0;:8;-1:-1:-1;;;;;31504:24:0;;;31496:62;;;;-1:-1:-1;;;31496:62:0;;14588:2:1;31496:62:0;;;14570:21:1;14627:2;14607:18;;;14600:30;14666:27;14646:18;;;14639:55;14711:18;;31496:62:0;14386:349:1;31496:62:0;31616:8;31571:18;:32;31590:12;:10;:12::i;:::-;-1:-1:-1;;;;;31571:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;31571:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;31571:53:0;;;;;;;;;;;31655:12;:10;:12::i;:::-;-1:-1:-1;;;;;31640:48:0;;31679:8;31640:48;;;;10527:14:1;10520:22;10502:41;;10490:2;10475:18;;10362:187;31640:48:0;;;;;;;;31369:327;;:::o;57417:609::-;57485:9;;57466:15;:28;;57458:58;;;;-1:-1:-1;;;57458:58:0;;22272:2:1;57458:58:0;;;22254:21:1;22311:2;22291:18;;;22284:30;-1:-1:-1;;;22330:18:1;;;22323:47;22387:18;;57458:58:0;22070:341:1;57458:58:0;57548:9;;57535;:22;57527:57;;;;-1:-1:-1;;;57527:57:0;;;;;;;:::i;:::-;57635:24;;57609:1;;57635:24;;:32;;;;57632:76;;;57689:7;:3;57695:1;57689:7;:::i;:::-;57683:13;;57632:76;57721:23;57731:12;:10;:12::i;57721:23::-;57718:73;;57772:7;:3;57778:1;57772:7;:::i;:::-;57766:13;;57718:73;57846:10;;57819:15;;:24;;57839:3;57819:19;:24::i;:::-;:37;57811:68;;;;-1:-1:-1;;;57811:68:0;;;;;;;:::i;:::-;57894:9;57890:129;57909:3;57907:1;:5;57890:129;;;57935:38;57941:12;:10;:12::i;57935:38::-;57988:19;:17;:19::i;:::-;57914:3;;;;:::i;:::-;;;;57890:129;;55412:91;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;55479:9:::1;:16:::0;55412:91::o;32751:365::-;32940:41;32959:12;:10;:12::i;:::-;32973:7;32940:18;:41::i;:::-;32918:140;;;;-1:-1:-1;;;32918:140:0;;;;;;;:::i;:::-;33069:39;33083:4;33089:2;33093:7;33102:5;33069:13;:39::i;:::-;32751:365;;;;:::o;54907:37::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54907:37:0;;-1:-1:-1;54907:37:0;:::o;60878:405::-;60980:13;61042:11;;61024:15;:29;61021:149;;;61069:89;;;;;;;;;;;;;;;;;;60878:405;-1:-1:-1;;60878:405:0:o;61021:149::-;61224:12;61238:26;61255:8;61238:16;:26::i;:::-;61207:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61180:95;;60878:405;;;:::o;54238:112::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55509:149::-;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;55593:17:::1;:25:::0;;;;55629:15:::1;:21:::0;55509:149::o;55824:636::-;55900:17;;55882:15;:35;55874:77;;;;-1:-1:-1;;;55874:77:0;;18486:2:1;55874:77:0;;;18468:21:1;18525:2;18505:18;;;18498:30;18564:31;18544:18;;;18537:59;18613:18;;55874:77:0;18284:353:1;55874:77:0;55988:15;;55970;:33;55962:60;;;;-1:-1:-1;;;55962:60:0;;21108:2:1;55962:60:0;;;21090:21:1;21147:2;21127:18;;;21120:30;-1:-1:-1;;;21166:18:1;;;21159:44;21220:18;;55962:60:0;20906:338:1;55962:60:0;56063:10;;56041:15;;:19;;56059:1;56041:19;:::i;:::-;:32;56033:63;;;;-1:-1:-1;;;56033:63:0;;;;;;;:::i;:::-;56115:11;;;;:20;56107:45;;;;-1:-1:-1;;;56107:45:0;;23378:2:1;56107:45:0;;;23360:21:1;23417:2;23397:18;;;23390:30;-1:-1:-1;;;23436:18:1;;;23429:43;23489:18;;56107:45:0;23176:337:1;56107:45:0;56171:27;56185:12;:10;:12::i;56171:27::-;56163:65;;;;-1:-1:-1;;;56163:65:0;;20002:2:1;56163:65:0;;;19984:21:1;20041:2;20021:18;;;20014:30;-1:-1:-1;;;20060:18:1;;;20053:54;20124:18;;56163:65:0;19800:348:1;56163:65:0;56260:9;;56247;:22;56239:57;;;;-1:-1:-1;;;56239:57:0;;;;;;;:::i;:::-;56331:9;56327:126;56346:1;56344;:3;56327:126;;;56368:39;56374:12;:10;:12::i;56368:39::-;56422:19;:17;:19::i;:::-;56349:3;;;;:::i;:::-;;;;56327:126;;59559:144;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;59634:27:::1;59641:20;;59634:27;:::i;:::-;59668:29;:20;59691:6:::0;;59668:29:::1;:::i;26416:229::-:0;25747:12;:10;:12::i;:::-;-1:-1:-1;;;;;25736:23:0;:7;25589:6;;-1:-1:-1;;;;;25589:6:0;;25516:87;25736:7;-1:-1:-1;;;;;25736:23:0;;25728:68;;;;-1:-1:-1;;;25728:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26519:22:0;::::1;26497:110;;;::::0;-1:-1:-1;;;26497:110:0;;13062:2:1;26497:110:0::1;::::0;::::1;13044:21:1::0;13101:2;13081:18;;;13074:30;13140:34;13120:18;;;13113:62;-1:-1:-1;;;13191:18:1;;;13184:36;13237:19;;26497:110:0::1;12860:402:1::0;26497:110:0::1;26618:19;26628:8;26618:9;:19::i;57178:203::-:0;57227:23;57237:12;:10;:12::i;57227:23::-;:28;57219:75;;;;-1:-1:-1;;;57219:75:0;;21869:2:1;57219:75:0;;;21851:21:1;21908:2;21888:18;;;21881:30;21947:34;21927:18;;;21920:62;-1:-1:-1;;;21998:18:1;;;21991:32;22040:19;;57219:75:0;21667:398:1;57219:75:0;57305:38;57311:12;:10;:12::i;57305:38::-;57354:19;:17;:19::i;24220:618::-;24264:22;24303:10;24325:4;24303:27;24299:508;;;24347:18;24368:8;;24347:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;24407:8:0;24618:17;24612:24;-1:-1:-1;;;;;24586:134:0;;-1:-1:-1;24299:508:0;;-1:-1:-1;24299:508:0;;-1:-1:-1;24784:10:0;24220:618;:::o;28127:355::-;28274:4;-1:-1:-1;;;;;;28316:40:0;;-1:-1:-1;;;28316:40:0;;:105;;-1:-1:-1;;;;;;;28373:48:0;;-1:-1:-1;;;28373:48:0;28316:105;:158;;;-1:-1:-1;;;;;;;;;;27097:40:0;;;28438:36;26938:207;61427:120;61481:14;61515:24;:22;:24::i;:::-;61508:31;;61427:120;:::o;38786:174::-;38861:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38861:29:0;-1:-1:-1;;;;;38861:29:0;;;;;;;;:24;;38915:23;38861:24;38915:14;:23::i;:::-;-1:-1:-1;;;;;38906:46:0;;;;;;;;;;;38786:174;;:::o;53519:486::-;53697:4;-1:-1:-1;;;;;53722:20:0;;53714:70;;;;-1:-1:-1;;;53714:70:0;;15699:2:1;53714:70:0;;;15681:21:1;15738:2;15718:18;;;15711:30;15777:34;15757:18;;;15750:62;-1:-1:-1;;;15828:18:1;;;15821:35;15873:19;;53714:70:0;15497:401:1;53714:70:0;53838:159;53866:47;53885:27;53905:6;53885:19;:27::i;:::-;53866:18;:47::i;:::-;53838:159;;;;;;;;;;;;11385:25:1;;;;11458:4;11446:17;;11426:18;;;11419:45;11480:18;;;11473:34;;;11523:18;;;11516:34;;;11357:19;;53838:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53815:182:0;:6;-1:-1:-1;;;;;53815:182:0;;53795:202;;53519:486;;;;;;;:::o;2443:98::-;2501:7;2528:5;2532:1;2528;:5;:::i;:::-;2521:12;2443:98;-1:-1:-1;;;2443:98:0:o;60218:106::-;60294:15;;60267:7;;60294:22;;60314:1;60294:19;:22::i;36745:382::-;-1:-1:-1;;;;;36825:16:0;;36817:61;;;;-1:-1:-1;;;36817:61:0;;17351:2:1;36817:61:0;;;17333:21:1;;;17370:18;;;17363:30;17429:34;17409:18;;;17402:62;17481:18;;36817:61:0;17149:356:1;36817:61:0;34728:4;34752:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34752:16:0;:30;36889:58;;;;-1:-1:-1;;;36889:58:0;;13826:2:1;36889:58:0;;;13808:21:1;13865:2;13845:18;;;13838:30;13904;13884:18;;;13877:58;13952:18;;36889:58:0;13624:352:1;36889:58:0;36960:45;36989:1;36993:2;36997:7;36960:20;:45::i;:::-;-1:-1:-1;;;;;37018:13:0;;;;;;:9;:13;;;;;:18;;37035:1;;37018:13;:18;;37035:1;;37018:18;:::i;:::-;;;;-1:-1:-1;;37047:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37047:21:0;-1:-1:-1;;;;;37047:21:0;;;;;;;;37086:33;;37047:16;;;37086:33;;37047:16;;37086:33;36745:382;;:::o;60537:123::-;60611:10;;60593:15;;:28;60585:37;;;;;;60635:15;:17;;;:15;:17;;;:::i;:::-;;;;;;60537:123::o;34957:452::-;35086:4;34752:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34752:16:0;35108:110;;;;-1:-1:-1;;;35108:110:0;;15286:2:1;35108:110:0;;;15268:21:1;15325:2;15305:18;;;15298:30;15364:34;15344:18;;;15337:62;-1:-1:-1;;;15415:18:1;;;15408:42;15467:19;;35108:110:0;15084:408:1;35108:110:0;35229:13;35245:23;35260:7;35245:14;:23::i;:::-;35229:39;;35298:5;-1:-1:-1;;;;;35287:16:0;:7;-1:-1:-1;;;;;35287:16:0;;:64;;;;35344:7;-1:-1:-1;;;;;35320:31:0;:20;35332:7;35320:11;:20::i;:::-;-1:-1:-1;;;;;35320:31:0;;35287:64;:113;;;-1:-1:-1;;;;;;31938:25:0;;;31909:4;31938:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;35368:32;35279:122;34957:452;-1:-1:-1;;;;34957:452:0:o;38053:615::-;38226:4;-1:-1:-1;;;;;38199:31:0;:23;38214:7;38199:14;:23::i;:::-;-1:-1:-1;;;;;38199:31:0;;38177:122;;;;-1:-1:-1;;;38177:122:0;;19190:2:1;38177:122:0;;;19172:21:1;19229:2;19209:18;;;19202:30;19268:34;19248:18;;;19241:62;-1:-1:-1;;;19319:18:1;;;19312:39;19368:19;;38177:122:0;18988:405:1;38177:122:0;-1:-1:-1;;;;;38318:16:0;;38310:65;;;;-1:-1:-1;;;38310:65:0;;14183:2:1;38310:65:0;;;14165:21:1;14222:2;14202:18;;;14195:30;14261:34;14241:18;;;14234:62;-1:-1:-1;;;14312:18:1;;;14305:34;14356:19;;38310:65:0;13981:400:1;38310:65:0;38388:39;38409:4;38415:2;38419:7;38388:20;:39::i;:::-;38492:29;38509:1;38513:7;38492:8;:29::i;:::-;-1:-1:-1;;;;;38534:15:0;;;;;;:9;:15;;;;;:20;;38553:1;;38534:15;:20;;38553:1;;38534:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38565:13:0;;;;;;:9;:13;;;;;:18;;38582:1;;38565:13;:18;;38582:1;;38565:18;:::i;:::-;;;;-1:-1:-1;;38594:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38594:21:0;-1:-1:-1;;;;;38594:21:0;;;;;;;;;38633:27;;38594:16;;38633:27;;;;;;;38053:615;;;:::o;26653:173::-;26728:6;;;-1:-1:-1;;;;;26745:17:0;;;-1:-1:-1;;;;;;26745:17:0;;;;;;;26778:40;;26728:6;;;26745:17;26728:6;;26778:40;;26709:16;;26778:40;26698:128;26653:173;:::o;33998:352::-;34155:28;34165:4;34171:2;34175:7;34155:9;:28::i;:::-;34216:48;34239:4;34245:2;34249:7;34258:5;34216:22;:48::i;:::-;34194:148;;;;-1:-1:-1;;;34194:148:0;;;;;;;:::i;6794:723::-;6850:13;7071:10;7067:53;;-1:-1:-1;;7098:10:0;;;;;;;;;;;;-1:-1:-1;;;7098:10:0;;;;;6794:723::o;7067:53::-;7145:5;7130:12;7186:78;7193:9;;7186:78;;7219:8;;;;:::i;:::-;;-1:-1:-1;7242:10:0;;-1:-1:-1;7250:2:0;7242:10;;:::i;:::-;;;7186:78;;;7274:19;7306:6;7296:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7296:17:0;;7274:39;;7324:154;7331:10;;7324:154;;7358:11;7368:1;7358:11;;:::i;:::-;;-1:-1:-1;7427:10:0;7435:2;7427:5;:10;:::i;:::-;7414:24;;:2;:24;:::i;:::-;7401:39;;7384:6;7391;7384:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;7384:56:0;;;;;;;;-1:-1:-1;7455:11:0;7464:2;7455:11;;:::i;:::-;;;7324:154;;52986:410;53096:7;51151:108;;;;;;;;;;;;;;;;;51127:143;;;;;;;53250:12;;53285:11;;;;53329:24;;;;;53319:35;;;;;;53169:204;;;;;10967:25:1;;;11023:2;11008:18;;11001:34;;;;-1:-1:-1;;;;;11071:32:1;11066:2;11051:18;;11044:60;11135:2;11120:18;;11113:34;10954:3;10939:19;;10736:417;53169:204:0;;;;;;;;;;;;;53141:247;;;;;;53121:267;;52986:410;;;:::o;50717:258::-;50816:7;50918:20;50156:15;;;50078:101;50918:20;50889:63;;-1:-1:-1;;;50889:63:0;;;9064:27:1;9107:11;;;9100:27;;;;9143:12;;;9136:28;;;9180:12;;50889:63:0;8806:392:1;43743:589:0;-1:-1:-1;;;;;43949:18:0;;43945:187;;43984:40;44016:7;45159:10;:17;;45132:24;;;;:15;:24;;;;;:44;;;45187:24;;;;;;;;;;;;45055:164;43984:40;43945:187;;;44054:2;-1:-1:-1;;;;;44046:10:0;:4;-1:-1:-1;;;;;44046:10:0;;44042:90;;44073:47;44106:4;44112:7;44073:32;:47::i;:::-;-1:-1:-1;;;;;44146:16:0;;44142:183;;44179:45;44216:7;44179:36;:45::i;44142:183::-;44252:4;-1:-1:-1;;;;;44246:10:0;:2;-1:-1:-1;;;;;44246:10:0;;44242:83;;44273:40;44301:2;44305:7;44273:27;:40::i;39525:980::-;39680:4;-1:-1:-1;;;;;39701:13:0;;16709:20;16757:8;39697:801;;39770:2;-1:-1:-1;;;;;39754:36:0;;39813:12;:10;:12::i;:::-;39848:4;39875:7;39905:5;39754:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39754:175:0;;;;;;;;-1:-1:-1;;39754:175:0;;;;;;;;;;;;:::i;:::-;;;39733:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40112:13:0;;40108:320;;40155:108;;-1:-1:-1;;;40155:108:0;;;;;;;:::i;40108:320::-;40378:6;40372:13;40363:6;40359:2;40355:15;40348:38;39733:710;-1:-1:-1;;;;;;39993:51:0;-1:-1:-1;;;39993:51:0;;-1:-1:-1;39986:58:0;;39697:801;-1:-1:-1;40482:4:0;39525:980;;;;;;:::o;45846:1002::-;46126:22;46176:1;46151:22;46168:4;46151:16;:22::i;:::-;:26;;;;:::i;:::-;46188:18;46209:26;;;:17;:26;;;;;;46126:51;;-1:-1:-1;46342:28:0;;;46338:328;;-1:-1:-1;;;;;46409:18:0;;46387:19;46409:18;;;:12;:18;;;;;;;;:34;;;;;;;;;46460:30;;;;;;:44;;;46577:30;;:17;:30;;;;;:43;;;46338:328;-1:-1:-1;46762:26:0;;;;:17;:26;;;;;;;;46755:33;;;-1:-1:-1;;;;;46806:18:0;;;;;:12;:18;;;;;:34;;;;;;;46799:41;45846:1002::o;47143:1079::-;47421:10;:17;47396:22;;47421:21;;47441:1;;47421:21;:::i;:::-;47453:18;47474:24;;;:15;:24;;;;;;47847:10;:26;;47396:46;;-1:-1:-1;47474:24:0;;47396:46;;47847:26;;;;;;:::i;:::-;;;;;;;;;47825:48;;47911:11;47886:10;47897;47886:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;47991:28;;;:15;:28;;;;;;;:41;;;48163:24;;;;;48156:31;48198:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;47214:1008;;;47143:1079;:::o;44633:221::-;44718:14;44735:20;44752:2;44735:16;:20::i;:::-;-1:-1:-1;;;;;44766:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;44811:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;44633:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:220;1035:5;1088:3;1081:4;1073:6;1069:17;1065:27;1055:55;;1106:1;1103;1096:12;1055:55;1128:79;1203:3;1194:6;1181:20;1174:4;1166:6;1162:17;1128:79;:::i;1218:186::-;1277:6;1330:2;1318:9;1309:7;1305:23;1301:32;1298:52;;;1346:1;1343;1336:12;1298:52;1369:29;1388:9;1369:29;:::i;1409:260::-;1477:6;1485;1538:2;1526:9;1517:7;1513:23;1509:32;1506:52;;;1554:1;1551;1544:12;1506:52;1577:29;1596:9;1577:29;:::i;:::-;1567:39;;1625:38;1659:2;1648:9;1644:18;1625:38;:::i;:::-;1615:48;;1409:260;;;;;:::o;1674:328::-;1751:6;1759;1767;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;1859:29;1878:9;1859:29;:::i;:::-;1849:39;;1907:38;1941:2;1930:9;1926:18;1907:38;:::i;:::-;1897:48;;1992:2;1981:9;1977:18;1964:32;1954:42;;1674:328;;;;;:::o;2007:537::-;2102:6;2110;2118;2126;2179:3;2167:9;2158:7;2154:23;2150:33;2147:53;;;2196:1;2193;2186:12;2147:53;2219:29;2238:9;2219:29;:::i;:::-;2209:39;;2267:38;2301:2;2290:9;2286:18;2267:38;:::i;:::-;2257:48;;2352:2;2341:9;2337:18;2324:32;2314:42;;2407:2;2396:9;2392:18;2379:32;2434:18;2426:6;2423:30;2420:50;;;2466:1;2463;2456:12;2420:50;2489:49;2530:7;2521:6;2510:9;2506:22;2489:49;:::i;:::-;2479:59;;;2007:537;;;;;;;:::o;2549:254::-;2614:6;2622;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;2714:29;2733:9;2714:29;:::i;:::-;2704:39;;2762:35;2793:2;2782:9;2778:18;2762:35;:::i;2808:689::-;2910:6;2918;2926;2934;2942;2995:3;2983:9;2974:7;2970:23;2966:33;2963:53;;;3012:1;3009;3002:12;2963:53;3035:29;3054:9;3035:29;:::i;:::-;3025:39;;3115:2;3104:9;3100:18;3087:32;3142:18;3134:6;3131:30;3128:50;;;3174:1;3171;3164:12;3128:50;3197:49;3238:7;3229:6;3218:9;3214:22;3197:49;:::i;:::-;3187:59;;;3293:2;3282:9;3278:18;3265:32;3255:42;;3344:2;3333:9;3329:18;3316:32;3306:42;;3398:3;3387:9;3383:19;3370:33;3443:4;3436:5;3432:16;3425:5;3422:27;3412:55;;3463:1;3460;3453:12;3412:55;3486:5;3476:15;;;2808:689;;;;;;;;:::o;3502:254::-;3570:6;3578;3631:2;3619:9;3610:7;3606:23;3602:32;3599:52;;;3647:1;3644;3637:12;3599:52;3670:29;3689:9;3670:29;:::i;:::-;3660:39;3746:2;3731:18;;;;3718:32;;-1:-1:-1;;;3502:254:1:o;3761:615::-;3847:6;3855;3908:2;3896:9;3887:7;3883:23;3879:32;3876:52;;;3924:1;3921;3914:12;3876:52;3964:9;3951:23;3993:18;4034:2;4026:6;4023:14;4020:34;;;4050:1;4047;4040:12;4020:34;4088:6;4077:9;4073:22;4063:32;;4133:7;4126:4;4122:2;4118:13;4114:27;4104:55;;4155:1;4152;4145:12;4104:55;4195:2;4182:16;4221:2;4213:6;4210:14;4207:34;;;4237:1;4234;4227:12;4207:34;4290:7;4285:2;4275:6;4272:1;4268:14;4264:2;4260:23;4256:32;4253:45;4250:65;;;4311:1;4308;4301:12;4250:65;4342:2;4334:11;;;;;4364:6;;-1:-1:-1;3761:615:1;;-1:-1:-1;;;;3761:615:1:o;4381:180::-;4437:6;4490:2;4478:9;4469:7;4465:23;4461:32;4458:52;;;4506:1;4503;4496:12;4458:52;4529:26;4545:9;4529:26;:::i;4566:245::-;4624:6;4677:2;4665:9;4656:7;4652:23;4648:32;4645:52;;;4693:1;4690;4683:12;4645:52;4732:9;4719:23;4751:30;4775:5;4751:30;:::i;4816:249::-;4885:6;4938:2;4926:9;4917:7;4913:23;4909:32;4906:52;;;4954:1;4951;4944:12;4906:52;4986:9;4980:16;5005:30;5029:5;5005:30;:::i;5070:450::-;5139:6;5192:2;5180:9;5171:7;5167:23;5163:32;5160:52;;;5208:1;5205;5198:12;5160:52;5248:9;5235:23;5281:18;5273:6;5270:30;5267:50;;;5313:1;5310;5303:12;5267:50;5336:22;;5389:4;5381:13;;5377:27;-1:-1:-1;5367:55:1;;5418:1;5415;5408:12;5367:55;5441:73;5506:7;5501:2;5488:16;5483:2;5479;5475:11;5441:73;:::i;5525:180::-;5584:6;5637:2;5625:9;5616:7;5612:23;5608:32;5605:52;;;5653:1;5650;5643:12;5605:52;-1:-1:-1;5676:23:1;;5525:180;-1:-1:-1;5525:180:1:o;5710:254::-;5778:6;5786;5839:2;5827:9;5818:7;5814:23;5810:32;5807:52;;;5855:1;5852;5845:12;5807:52;5891:9;5878:23;5868:33;;5920:38;5954:2;5943:9;5939:18;5920:38;:::i;5969:248::-;6037:6;6045;6098:2;6086:9;6077:7;6073:23;6069:32;6066:52;;;6114:1;6111;6104:12;6066:52;-1:-1:-1;;6137:23:1;;;6207:2;6192:18;;;6179:32;;-1:-1:-1;5969:248:1:o;6222:268::-;6274:3;6312:5;6306:12;6339:6;6334:3;6327:19;6355:63;6411:6;6404:4;6399:3;6395:14;6388:4;6381:5;6377:16;6355:63;:::i;:::-;6472:2;6451:15;-1:-1:-1;;6447:29:1;6438:39;;;;6479:4;6434:50;;6222:268;-1:-1:-1;;6222:268:1:o;6495:184::-;6536:3;6574:5;6568:12;6589:52;6634:6;6629:3;6622:4;6615:5;6611:16;6589:52;:::i;:::-;6657:16;;;;;6495:184;-1:-1:-1;;6495:184:1:o;6802:274::-;6931:3;6969:6;6963:13;6985:53;7031:6;7026:3;7019:4;7011:6;7007:17;6985:53;:::i;:::-;7054:16;;;;;6802:274;-1:-1:-1;;6802:274:1:o;7081:415::-;7238:3;7276:6;7270:13;7292:53;7338:6;7333:3;7326:4;7318:6;7314:17;7292:53;:::i;:::-;7414:2;7410:15;;;;-1:-1:-1;;7406:53:1;7367:16;;;;7392:68;;;7487:2;7476:14;;7081:415;-1:-1:-1;;7081:415:1:o;7501:1300::-;7778:3;7807:1;7840:6;7834:13;7870:3;7892:1;7920:9;7916:2;7912:18;7902:28;;7980:2;7969:9;7965:18;8002;7992:61;;8046:4;8038:6;8034:17;8024:27;;7992:61;8072:2;8120;8112:6;8109:14;8089:18;8086:38;8083:165;;;-1:-1:-1;;;8147:33:1;;8203:4;8200:1;8193:15;8233:4;8154:3;8221:17;8083:165;8264:18;8291:104;;;;8409:1;8404:320;;;;8257:467;;8291:104;-1:-1:-1;;8324:24:1;;8312:37;;8369:16;;;;-1:-1:-1;8291:104:1;;8404:320;23773:1;23766:14;;;23810:4;23797:18;;8499:1;8513:165;8527:6;8524:1;8521:13;8513:165;;;8605:14;;8592:11;;;8585:35;8648:16;;;;8542:10;;8513:165;;;8517:3;;8707:6;8702:3;8698:16;8691:23;;8257:467;;;;;;;8740:55;8765:29;8790:3;8782:6;8765:29;:::i;:::-;-1:-1:-1;;;6744:20:1;;6789:1;6780:11;;6684:113;8740:55;8733:62;7501:1300;-1:-1:-1;;;;;7501:1300:1:o;9411:442::-;-1:-1:-1;;;;;9668:15:1;;;9650:34;;9720:15;;9715:2;9700:18;;9693:43;9772:2;9767;9752:18;;9745:30;;;9593:4;;9792:55;;9828:18;;9820:6;9792:55;:::i;9858:499::-;-1:-1:-1;;;;;10127:15:1;;;10109:34;;10179:15;;10174:2;10159:18;;10152:43;10226:2;10211:18;;10204:34;;;10274:3;10269:2;10254:18;;10247:31;;;10052:4;;10295:56;;10331:19;;10323:6;10295:56;:::i;:::-;10287:64;9858:499;-1:-1:-1;;;;;;9858:499:1:o;11561:228::-;11708:2;11697:9;11690:21;11671:4;11728:55;11779:2;11768:9;11764:18;11756:6;11728:55;:::i;12441:414::-;12643:2;12625:21;;;12682:2;12662:18;;;12655:30;12721:34;12716:2;12701:18;;12694:62;-1:-1:-1;;;12787:2:1;12772:18;;12765:48;12845:3;12830:19;;12441:414::o;17923:356::-;18125:2;18107:21;;;18144:18;;;18137:30;18203:34;18198:2;18183:18;;18176:62;18270:2;18255:18;;17923:356::o;20555:346::-;20757:2;20739:21;;;20796:2;20776:18;;;20769:30;-1:-1:-1;;;20830:2:1;20815:18;;20808:52;20892:2;20877:18;;20555:346::o;21249:413::-;21451:2;21433:21;;;21490:2;21470:18;;;21463:30;21529:34;21524:2;21509:18;;21502:62;-1:-1:-1;;;21595:2:1;21580:18;;21573:47;21652:3;21637:19;;21249:413::o;22829:342::-;23031:2;23013:21;;;23070:2;23050:18;;;23043:30;-1:-1:-1;;;23104:2:1;23089:18;;23082:48;23162:2;23147:18;;22829:342::o;23826:128::-;23866:3;23897:1;23893:6;23890:1;23887:13;23884:39;;;23903:18;;:::i;:::-;-1:-1:-1;23939:9:1;;23826:128::o;23959:120::-;23999:1;24025;24015:35;;24030:18;;:::i;:::-;-1:-1:-1;24064:9:1;;23959:120::o;24084:168::-;24124:7;24190:1;24186;24182:6;24178:14;24175:1;24172:21;24167:1;24160:9;24153:17;24149:45;24146:71;;;24197:18;;:::i;:::-;-1:-1:-1;24237:9:1;;24084:168::o;24257:125::-;24297:4;24325:1;24322;24319:8;24316:34;;;24330:18;;:::i;:::-;-1:-1:-1;24367:9:1;;24257:125::o;24387:258::-;24459:1;24469:113;24483:6;24480:1;24477:13;24469:113;;;24559:11;;;24553:18;24540:11;;;24533:39;24505:2;24498:10;24469:113;;;24600:6;24597:1;24594:13;24591:48;;;-1:-1:-1;;24635:1:1;24617:16;;24610:27;24387:258::o;24650:380::-;24729:1;24725:12;;;;24772;;;24793:61;;24847:4;24839:6;24835:17;24825:27;;24793:61;24900:2;24892:6;24889:14;24869:18;24866:38;24863:161;;;24946:10;24941:3;24937:20;24934:1;24927:31;24981:4;24978:1;24971:15;25009:4;25006:1;24999:15;24863:161;;24650:380;;;:::o;25035:135::-;25074:3;-1:-1:-1;;25095:17:1;;25092:43;;;25115:18;;:::i;:::-;-1:-1:-1;25162:1:1;25151:13;;25035:135::o;25175:112::-;25207:1;25233;25223:35;;25238:18;;:::i;:::-;-1:-1:-1;25272:9:1;;25175:112::o;25292:127::-;25353:10;25348:3;25344:20;25341:1;25334:31;25384:4;25381:1;25374:15;25408:4;25405:1;25398:15;25424:127;25485:10;25480:3;25476:20;25473:1;25466:31;25516:4;25513:1;25506:15;25540:4;25537:1;25530:15;25556:127;25617:10;25612:3;25608:20;25605:1;25598:31;25648:4;25645:1;25638:15;25672:4;25669:1;25662:15;25688:127;25749:10;25744:3;25740:20;25737:1;25730:31;25780:4;25777:1;25770:15;25804:4;25801:1;25794:15;25820:127;25881:10;25876:3;25872:20;25869:1;25862:31;25912:4;25909:1;25902:15;25936:4;25933:1;25926:15;25952:131;-1:-1:-1;;;;;;26026:32:1;;26016:43;;26006:71;;26073:1;26070;26063:12

Swarm Source

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