ETH Price: $3,065.85 (-2.19%)

Token

Turtle Town (TRTL)
 

Overview

Max Total Supply

10,000 TRTL

Holders

4,327

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
jinxthefloor.eth
Balance
1 TRTL
0x6c90a82b53356cdba4a1d0ab49d9ba11de2a722f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

10,000 Turtles living on the Ethereum Blockchain. Join our Discord and say hello!

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TurtleTown

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
/*
                              ▄▄▄████████▄▄▄
                          ▄▄███▀▀▀       ▀▀███▄▄       ▄██▄
                      ▄▄███▀                  ▀██▄    ▄██▀██▄
    ▄▄          ▄▄▄███▀▀                       ▀██▄▄██▀  ▄███
    ▀████████████▀▀▀                          ▄▄▄▄█████▄███▀▀
     ▀██                                 ▄▄███▀▀▀▀▀▀███▀
      ▀██▄                 ▄▄▄▄▄▄▄▄▄▄████▀▀          ▀█▌
        ▀██▄                ▀▀▀▀▀▀▀▀▀▀               ▐██
          ███▄                                       ██▌
          ██▀██▄▄                                  ▄███▌
         ██▌   ▀███▄▄                            ▄██▀ ██
         ██       ▀▀████▄▄▄▄               ▄▄▄███▀▀   ▐█▌
         ▐██            ▀▀▀████████████████▀▀▀▀       ▐██
          ██                                          ▐██
           █▌                                         ▐█▌
          ██     ▄    ▄             ▄     ▄           ██
         ▐█▌     ▀████▀             ▀█████▀          ▐██
         ▐██              ████████                  ▄██
          ██▌              ▀▀▀▀▀▀                  ▄██
           ▀██▄                                   ██▀
             ▀██▄                              ▄███
               ▀▀██▄▄                       ▄▄██▀
                   ▀▀████▄▄▄▄▄        ▄▄▄▄███▀▀
                        ▀▀▀▀▀█████████▀▀▀▀

     ______   __  __     ______     ______   __         ______
    /\__  _\ /\ \/\ \   /\  == \   /\__  _\ /\ \       /\  ___\
    \/_/\ \/ \ \ \_\ \  \ \  __<   \/_/\ \/ \ \ \____  \ \  __\
       \ \_\  \ \_____\  \ \_\ \_\    \ \_\  \ \_____\  \ \_____\
        \/_/   \/_____/   \/_/ /_/     \/_/   \/_____/   \/_____/
                     
                ______   ______     __     __     __   __
               /\__  _\ /\  __ \   /\ \  _ \ \   /\ "-.\ \  
               \/_/\ \/ \ \ \/\ \  \ \ \/ ".\ \  \ \ \-.  \ 
                  \ \_\  \ \_____\  \ \__/".~\_\  \ \_\\"\_\
                   \/_/   \/_____/   \/_/   \/_/   \/_/ \/_/
*/

pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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)
    {
        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)
    {
        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)
    {
        // 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)
    {
        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)
    {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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

// Creator: Chiru Labs

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 1 (e.g. 1, 2, 3, 4..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal _nextTokenId;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _nextTokenId = 1;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _nextTokenId - 1;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index + 1;
    }

    /**
     * @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 override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        unchecked {
            for (uint256 curr = tokenId; curr > 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: 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 override {
        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: 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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < _nextTokenId && tokenId > 0;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, "");
    }

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _nextTokenId;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(quantity != 0, "ERC721A: quantity must be greater than 0");

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if _nextTokenId + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(
                            address(0),
                            to,
                            updatedIndex,
                            _data
                        ),
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                }

                updatedIndex++;
            }

            _nextTokenId = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership
                        .startTimestamp;
                }
            }
        }

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/payment/PaymentSplitter.sol

pragma solidity ^0.8.0;

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    using SafeMath for uint256;

    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor() payable {}

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance.add(_totalReleased);
        uint256 payment = totalReceived
            .mul(_shares[account])
            .div(_totalShares)
            .sub(_released[account]);

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account].add(payment);
        _totalReleased = _totalReleased.add(payment);

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) internal {
        require(
            account != address(0),
            "PaymentSplitter: account is the zero address"
        );
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(
            _shares[account] == 0,
            "PaymentSplitter: account already has shares"
        );

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares.add(shares_);
        emit PayeeAdded(account, shares_);
    }
}

// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

pragma solidity ^0.8.0;

/**
 * @title Turtle Town contract
 * @dev Extends ERC721a Non-Fungible Token Standard basic implementation
 */
contract TurtleTown is ERC721A, Ownable, PaymentSplitter {
    bool public openWhitelistMint = false;
    bool public openPresaleMint = false;
    bool public openPublicMint = false;

    bool private initialized = false;

    uint256 public tokenPrice = 0.025 ether;

    uint256 public constant maxTokens = 10000;
    uint256 public constant maxWhitelistTokens = 1500;

    uint256 public maxMintsPerWallet = 3;

    string private _baseTokenURI;

    bytes32 public merkleRoot;

    mapping(address => bool) public whitelistClaimed;
    mapping(address => uint256) public presaleAddressMinted;
    mapping(address => uint256) public publicsaleAddressMinted;

    constructor() ERC721A("Turtle Town", "TRTL") {}

    function mintDev(uint256 quantity) external onlyOwner {
        require(totalSupply() + quantity <= maxTokens, "Minting too many");
        _safeMint(msg.sender, quantity);
    }

    function whitelistMint(bytes32[] calldata _merkleProof) public payable {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(_merkleProof, merkleRoot, leaf),
            "Invalid proof."
        );
        require(!whitelistClaimed[msg.sender], "Address has already claimed.");
        require(openWhitelistMint, "Mint closed");
        require(totalSupply() + 1 <= maxWhitelistTokens, "Minting too many");

        whitelistClaimed[msg.sender] = true;

        _safeMint(msg.sender, 1);
    }

    function preSaleMint(bytes32[] calldata _merkleProof, uint256 quantity)
        public
        payable
    {
        require(openPresaleMint, "Mint not open");
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(_merkleProof, merkleRoot, leaf),
            "Invalid proof."
        );
        require(totalSupply() + quantity <= maxTokens, "Minting too many");
        require(
            presaleAddressMinted[msg.sender] + quantity <= maxMintsPerWallet,
            "Max 3 per wallet"
        );
        require(msg.value >= tokenPrice * quantity, "Not enough ether sent");

        presaleAddressMinted[msg.sender] += quantity;

        _safeMint(msg.sender, quantity);
    }

    function publicMint(uint256 quantity) external payable {
        require(openPublicMint, "mint not open");
        require(totalSupply() + quantity <= maxTokens, "Minting over supply");
        require(
            publicsaleAddressMinted[msg.sender] + quantity <= maxMintsPerWallet,
            "Max 3 per wallet"
        );
        require(msg.value >= tokenPrice * quantity, "Not enought ether sent.");

        publicsaleAddressMinted[msg.sender] += quantity;

        _safeMint(msg.sender, quantity);
    }

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function flipWhitelistMintState() public onlyOwner {
        openWhitelistMint = !openWhitelistMint;
    }

    function whitelistMintState() public view returns (bool) {
        return openWhitelistMint;
    }

    function flipPresaleMintState() public onlyOwner {
        openPresaleMint = !openPresaleMint;
    }

    function presaleMintState() public view returns (bool) {
        return openPresaleMint;
    }

    function flipPublicMintState() public onlyOwner {
        openPublicMint = !openPublicMint;
    }

    function publicMintState() public view returns (bool) {
        return openPublicMint;
    }

    function initializePaymentSplitter(
        address[] memory payees,
        uint256[] memory shares_
    ) external onlyOwner {
        require(!initialized, "Payment Split Already Initialized!");
        require(
            payees.length == shares_.length,
            "PaymentSplitter: payees and shares length mismatch"
        );
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
        initialized = true;
    }

    function boolWhitelistMinted(address whitelist) public view returns (bool) {
        return whitelistClaimed[whitelist];
    }

    function setPrice(uint256 newPrice) external onlyOwner {
        tokenPrice = newPrice;
    }

    function setMerkleRoot(bytes32 newMerkleRoot) external onlyOwner {
        merkleRoot = newMerkleRoot;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"whitelist","type":"address"}],"name":"boolWhitelistMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPresaleMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"name":"initializePaymentSplitter","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":"maxMintsPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPresaleMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPublicMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openWhitelistMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleAddressMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMintState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicsaleAddressMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","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":[],"name":"tokenPrice","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":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600d805463ffffffff191690556658d15e17628000600e556003600f553480156200002e57600080fd5b50604080518082018252600b81526a2a3ab93a3632902a37bbb760a91b6020808301918252835180850190945260048452631514951360e21b9084015281519192916200007e91600191620000ff565b50805162000094906002906020840190620000ff565b5050600160005550620000a733620000ad565b620001e2565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200010d90620001a5565b90600052602060002090601f0160209004810192826200013157600085556200017c565b82601f106200014c57805160ff19168380011785556200017c565b828001600101855582156200017c579182015b828111156200017c5782518255916020019190600101906200015f565b506200018a9291506200018e565b5090565b5b808211156200018a57600081556001016200018f565b600181811c90821680620001ba57607f821691505b60208210811415620001dc57634e487b7160e01b600052602260045260246000fd5b50919050565b61315f80620001f26000396000f3fe6080604052600436106102cd5760003560e01c80637cb6475911610175578063b88d4fde116100dc578063e3ae869111610095578063f2fde38b1161006f578063f2fde38b146108d7578063f516a2e6146108f7578063f931a4c21461090d578063fba7d7cb1461092257600080fd5b8063e3ae869114610887578063e8315742146108a1578063e985e9c5146108b757600080fd5b8063b88d4fde146107ad578063c3058391146107cd578063c87b56dd146107ec578063ce7c2ac21461080c578063db4bec4414610842578063e33b7de31461087257600080fd5b8063922400ff1161012e578063922400ff146106ff57806395d89b41146107175780639852595c1461072c57806399c89e8114610762578063a22cb46514610777578063b6ad8b561461079757600080fd5b80637cb647591461064e5780637ff9b5961461066e57806385177e62146106845780638b83209b146106a15780638da5cb5b146106c157806391b7f5ed146106df57600080fd5b8063372f657c116102345780636352211e116101ed57806370a08231116101c757806370a08231146105cd578063715018a6146105ed578063754e9fd914610602578063781799761461063b57600080fd5b80636352211e146105605780636e260c1e146105805780636fffbd60146105a057600080fd5b8063372f657c146104b85780633a98ef39146104cb57806342842e0e146104e057806345f7e06e146105005780634f6ccce71461052057806355f804b31461054057600080fd5b80631916558711610286578063191655871461040457806322ab47a11461042457806323b872dd146104425780632555ca8a146104625780632db115441461048f5780632eb4a7ab146104a257600080fd5b806301ffc9a71461031b57806306fdde0314610350578063081812fc14610372578063082e2a72146103aa578063095ea7b3146103c157806318160ddd146103e157600080fd5b36610316577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561032757600080fd5b5061033b610336366004612d53565b610942565b60405190151581526020015b60405180910390f35b34801561035c57600080fd5b50610365610994565b6040516103479190612e96565b34801561037e57600080fd5b5061039261038d366004612d3a565b610a26565b6040516001600160a01b039091168152602001610347565b3480156103b657600080fd5b506103bf610ab4565b005b3480156103cd57600080fd5b506103bf6103dc366004612bba565b610af2565b3480156103ed57600080fd5b506103f6610c0a565b604051908152602001610347565b34801561041057600080fd5b506103bf61041f366004612a2d565b610c20565b34801561043057600080fd5b50600d5462010000900460ff1661033b565b34801561044e57600080fd5b506103bf61045d366004612a83565b610df8565b34801561046e57600080fd5b506103f661047d366004612a2d565b60136020526000908152604090205481565b6103bf61049d366004612d3a565b610e03565b3480156104ae57600080fd5b506103f660115481565b6103bf6104c6366004612cae565b610f93565b3480156104d757600080fd5b506008546103f6565b3480156104ec57600080fd5b506103bf6104fb366004612a83565b611145565b34801561050c57600080fd5b50600d5461033b9062010000900460ff1681565b34801561052c57600080fd5b506103f661053b366004612d3a565b611160565b34801561054c57600080fd5b506103bf61055b366004612d8d565b6111cf565b34801561056c57600080fd5b5061039261057b366004612d3a565b611205565b34801561058c57600080fd5b506103bf61059b366004612be6565b611217565b3480156105ac57600080fd5b506103f66105bb366004612a2d565b60146020526000908152604090205481565b3480156105d957600080fd5b506103f66105e8366004612a2d565b6113d5565b3480156105f957600080fd5b506103bf611466565b34801561060e57600080fd5b5061033b61061d366004612a2d565b6001600160a01b031660009081526012602052604090205460ff1690565b6103bf610649366004612cef565b61149c565b34801561065a57600080fd5b506103bf610669366004612d3a565b6116b7565b34801561067a57600080fd5b506103f6600e5481565b34801561069057600080fd5b50600d54610100900460ff1661033b565b3480156106ad57600080fd5b506103926106bc366004612d3a565b6116e6565b3480156106cd57600080fd5b506007546001600160a01b0316610392565b3480156106eb57600080fd5b506103bf6106fa366004612d3a565b611716565b34801561070b57600080fd5b50600d5460ff1661033b565b34801561072357600080fd5b50610365611745565b34801561073857600080fd5b506103f6610747366004612a2d565b6001600160a01b03166000908152600b602052604090205490565b34801561076e57600080fd5b506103bf611754565b34801561078357600080fd5b506103bf610792366004612b87565b61179d565b3480156107a357600080fd5b506103f66105dc81565b3480156107b957600080fd5b506103bf6107c8366004612ac4565b611862565b3480156107d957600080fd5b50600d5461033b90610100900460ff1681565b3480156107f857600080fd5b50610365610807366004612d3a565b611895565b34801561081857600080fd5b506103f6610827366004612a2d565b6001600160a01b03166000908152600a602052604090205490565b34801561084e57600080fd5b5061033b61085d366004612a2d565b60126020526000908152604090205460ff1681565b34801561087e57600080fd5b506009546103f6565b34801561089357600080fd5b50600d5461033b9060ff1681565b3480156108ad57600080fd5b506103f661271081565b3480156108c357600080fd5b5061033b6108d2366004612a4a565b611961565b3480156108e357600080fd5b506103bf6108f2366004612a2d565b61198f565b34801561090357600080fd5b506103f6600f5481565b34801561091957600080fd5b506103bf611a27565b34801561092e57600080fd5b506103bf61093d366004612d3a565b611a6e565b60006001600160e01b031982166380ac58cd60e01b148061097357506001600160e01b03198216635b5e139f60e01b145b8061098e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546109a39061303c565b80601f01602080910402602001604051908101604052809291908181526020018280546109cf9061303c565b8015610a1c5780601f106109f157610100808354040283529160200191610a1c565b820191906000526020600020905b8154815290600101906020018083116109ff57829003601f168201915b5050505050905090565b6000610a3182611ad6565b610a985760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6007546001600160a01b03163314610ade5760405162461bcd60e51b8152600401610a8f90612ed3565b600d805460ff19811660ff90911615179055565b6000610afd82611205565b9050806001600160a01b0316836001600160a01b03161415610b6c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610a8f565b336001600160a01b0382161480610b885750610b888133611961565b610bfa5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610a8f565b610c05838383611ae9565b505050565b60006001600054610c1b9190612ff9565b905090565b6001600160a01b0381166000908152600a6020526040902054610c945760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b6064820152608401610a8f565b6000610cab60095447611b4590919063ffffffff16565b6001600160a01b0383166000908152600b6020908152604080832054600854600a909352908320549394509192610cf89291610cf291610cec908790611ba4565b90611c23565b90611c7e565b905080610d5b5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610a8f565b6001600160a01b0383166000908152600b6020526040902054610d7e9082611b45565b6001600160a01b0384166000908152600b6020526040902055600954610da49082611b45565b600955610db18382611cda565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610c05838383611df3565b600d5462010000900460ff16610e4b5760405162461bcd60e51b815260206004820152600d60248201526c36b4b73a103737ba1037b832b760991b6044820152606401610a8f565b61271081610e57610c0a565b610e619190612fae565b1115610ea55760405162461bcd60e51b81526020600482015260136024820152724d696e74696e67206f76657220737570706c7960681b6044820152606401610a8f565b600f5433600090815260146020526040902054610ec3908390612fae565b1115610f045760405162461bcd60e51b815260206004820152601060248201526f13585e080cc81c195c881dd85b1b195d60821b6044820152606401610a8f565b80600e54610f129190612fda565b341015610f615760405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f756768742065746865722073656e742e0000000000000000006044820152606401610a8f565b3360009081526014602052604081208054839290610f80908490612fae565b90915550610f90905033826120d4565b50565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061100d8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060115491508490506120f2565b61104a5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610a8f565b3360009081526012602052604090205460ff16156110aa5760405162461bcd60e51b815260206004820152601c60248201527f416464726573732068617320616c726561647920636c61696d65642e000000006044820152606401610a8f565b600d5460ff166110ea5760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0818db1bdcd95960aa1b6044820152606401610a8f565b6105dc6110f5610c0a565b611100906001612fae565b111561111e5760405162461bcd60e51b8152600401610a8f90612ea9565b336000818152601260205260409020805460ff19166001908117909155610c0591906120d4565b610c0583838360405180602001604052806000815250611862565b600061116a610c0a565b82106111c45760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610a8f565b61098e826001612fae565b6007546001600160a01b031633146111f95760405162461bcd60e51b8152600401610a8f90612ed3565b610c05601083836128d7565b600061121082612108565b5192915050565b6007546001600160a01b031633146112415760405162461bcd60e51b8152600401610a8f90612ed3565b600d546301000000900460ff16156112a65760405162461bcd60e51b815260206004820152602260248201527f5061796d656e742053706c697420416c726561647920496e697469616c697a65604482015261642160f01b6064820152608401610a8f565b80518251146113125760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b6064820152608401610a8f565b60008251116113635760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401610a8f565b60005b82518110156113bd576113ab838281518110611384576113846130d2565b602002602001015183838151811061139e5761139e6130d2565b6020026020010151612243565b806113b581613077565b915050611366565b5050600d805463ff0000001916630100000017905550565b60006001600160a01b0382166114415760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610a8f565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146114905760405162461bcd60e51b8152600401610a8f90612ed3565b61149a6000612428565b565b600d54610100900460ff166114e35760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610a8f565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061155d8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060115491508490506120f2565b61159a5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610a8f565b612710826115a6610c0a565b6115b09190612fae565b11156115ce5760405162461bcd60e51b8152600401610a8f90612ea9565b600f54336000908152601360205260409020546115ec908490612fae565b111561162d5760405162461bcd60e51b815260206004820152601060248201526f13585e080cc81c195c881dd85b1b195d60821b6044820152606401610a8f565b81600e5461163b9190612fda565b3410156116825760405162461bcd60e51b8152602060048201526015602482015274139bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b6044820152606401610a8f565b33600090815260136020526040812080548492906116a1908490612fae565b909155506116b1905033836120d4565b50505050565b6007546001600160a01b031633146116e15760405162461bcd60e51b8152600401610a8f90612ed3565b601155565b6000600c82815481106116fb576116fb6130d2565b6000918252602090912001546001600160a01b031692915050565b6007546001600160a01b031633146117405760405162461bcd60e51b8152600401610a8f90612ed3565b600e55565b6060600280546109a39061303c565b6007546001600160a01b0316331461177e5760405162461bcd60e51b8152600401610a8f90612ed3565b600d805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b0382163314156117f65760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610a8f565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61186d848484611df3565b6118798484848461247a565b6116b15760405162461bcd60e51b8152600401610a8f90612f08565b60606118a082611ad6565b6119045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a8f565b600061190e612588565b905080516000141561192f576040518060200160405280600081525061195a565b8061193984612597565b60405160200161194a929190612e2a565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6007546001600160a01b031633146119b95760405162461bcd60e51b8152600401610a8f90612ed3565b6001600160a01b038116611a1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8f565b610f9081612428565b6007546001600160a01b03163314611a515760405162461bcd60e51b8152600401610a8f90612ed3565b600d805461ff001981166101009182900460ff1615909102179055565b6007546001600160a01b03163314611a985760405162461bcd60e51b8152600401610a8f90612ed3565b61271081611aa4610c0a565b611aae9190612fae565b1115611acc5760405162461bcd60e51b8152600401610a8f90612ea9565b610f9033826120d4565b600080548210801561098e575050151590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600080611b528385612fae565b90508381101561195a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a8f565b600082611bb35750600061098e565b6000611bbf8385612fda565b905082611bcc8583612fc6565b1461195a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a8f565b6000808211611c745760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610a8f565b61195a8284612fc6565b600082821115611cd05760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610a8f565b61195a8284612ff9565b80471015611d2a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a8f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d77576040519150601f19603f3d011682016040523d82523d6000602084013e611d7c565b606091505b5050905080610c055760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a8f565b6000611dfe82612108565b80519091506000906001600160a01b0316336001600160a01b03161480611e35575033611e2a84610a26565b6001600160a01b0316145b80611e4757508151611e479033611961565b905080611eb15760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610a8f565b846001600160a01b031682600001516001600160a01b031614611f255760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610a8f565b6001600160a01b038416611f895760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610a8f565b611f996000848460000151611ae9565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b03160217905590860180835291205490911661208a5761203e81611ad6565b1561208a57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6120ee828260405180602001604052806000815250612694565b5050565b6000826120ff85846126a1565b14949350505050565b604080518082019091526000808252602082015261212582611ad6565b6121845760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610a8f565b815b80156121e2576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156121d8579392505050565b5060001901612186565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610a8f565b6001600160a01b0382166122ae5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401610a8f565b600081116122fe5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401610a8f565b6001600160a01b0382166000908152600a6020526040902054156123785760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401610a8f565b600c8054600181019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0384169081179091556000908152600a602052604090208190556008546123df9082611b45565b600855604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561257c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124be903390899088908890600401612e59565b602060405180830381600087803b1580156124d857600080fd5b505af1925050508015612508575060408051601f3d908101601f1916820190925261250591810190612d70565b60015b612562573d808015612536576040519150601f19603f3d011682016040523d82523d6000602084013e61253b565b606091505b50805161255a5760405162461bcd60e51b8152600401610a8f90612f08565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612580565b5060015b949350505050565b6060601080546109a39061303c565b6060816125bb5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125e557806125cf81613077565b91506125de9050600a83612fc6565b91506125bf565b6000816001600160401b038111156125ff576125ff6130e8565b6040519080825280601f01601f191660200182016040528015612629576020820181803683370190505b5090505b84156125805761263e600183612ff9565b915061264b600a86613092565b612656906030612fae565b60f81b81838151811061266b5761266b6130d2565b60200101906001600160f81b031916908160001a90535061268d600a86612fc6565b945061262d565b610c058383836001612715565b600081815b845181101561270d5760008582815181106126c3576126c36130d2565b602002602001015190508083116126e957600083815260208290526040902092506126fa565b600081815260208490526040902092505b508061270581613077565b9150506126a6565b509392505050565b6000546001600160a01b0385166127785760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610a8f565b836127d65760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610a8f565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b858110156128ce5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156128c2576128a6600088848861247a565b6128c25760405162461bcd60e51b8152600401610a8f90612f08565b60019182019101612853565b506000556120cd565b8280546128e39061303c565b90600052602060002090601f016020900481019282612905576000855561294b565b82601f1061291e5782800160ff1982351617855561294b565b8280016001018555821561294b579182015b8281111561294b578235825591602001919060010190612930565b5061295792915061295b565b5090565b5b80821115612957576000815560010161295c565b60008083601f84011261298257600080fd5b5081356001600160401b0381111561299957600080fd5b6020830191508360208260051b85010111156129b457600080fd5b9250929050565b600082601f8301126129cc57600080fd5b813560206129e16129dc83612f8b565b612f5b565b80838252828201915082860187848660051b8901011115612a0157600080fd5b60005b85811015612a2057813584529284019290840190600101612a04565b5090979650505050505050565b600060208284031215612a3f57600080fd5b813561195a816130fe565b60008060408385031215612a5d57600080fd5b8235612a68816130fe565b91506020830135612a78816130fe565b809150509250929050565b600080600060608486031215612a9857600080fd5b8335612aa3816130fe565b92506020840135612ab3816130fe565b929592945050506040919091013590565b60008060008060808587031215612ada57600080fd5b8435612ae5816130fe565b9350602085810135612af6816130fe565b93506040860135925060608601356001600160401b0380821115612b1957600080fd5b818801915088601f830112612b2d57600080fd5b813581811115612b3f57612b3f6130e8565b612b51601f8201601f19168501612f5b565b91508082528984828501011115612b6757600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215612b9a57600080fd5b8235612ba5816130fe565b915060208301358015158114612a7857600080fd5b60008060408385031215612bcd57600080fd5b8235612bd8816130fe565b946020939093013593505050565b60008060408385031215612bf957600080fd5b82356001600160401b0380821115612c1057600080fd5b818501915085601f830112612c2457600080fd5b81356020612c346129dc83612f8b565b8083825282820191508286018a848660051b8901011115612c5457600080fd5b600096505b84871015612c80578035612c6c816130fe565b835260019690960195918301918301612c59565b5096505086013592505080821115612c9757600080fd5b50612ca4858286016129bb565b9150509250929050565b60008060208385031215612cc157600080fd5b82356001600160401b03811115612cd757600080fd5b612ce385828601612970565b90969095509350505050565b600080600060408486031215612d0457600080fd5b83356001600160401b03811115612d1a57600080fd5b612d2686828701612970565b909790965060209590950135949350505050565b600060208284031215612d4c57600080fd5b5035919050565b600060208284031215612d6557600080fd5b813561195a81613113565b600060208284031215612d8257600080fd5b815161195a81613113565b60008060208385031215612da057600080fd5b82356001600160401b0380821115612db757600080fd5b818501915085601f830112612dcb57600080fd5b813581811115612dda57600080fd5b866020828501011115612dec57600080fd5b60209290920196919550909350505050565b60008151808452612e16816020860160208601613010565b601f01601f19169290920160200192915050565b60008351612e3c818460208801613010565b835190830190612e50818360208801613010565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e8c90830184612dfe565b9695505050505050565b60208152600061195a6020830184612dfe565b60208082526010908201526f4d696e74696e6720746f6f206d616e7960801b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612f8357612f836130e8565b604052919050565b60006001600160401b03821115612fa457612fa46130e8565b5060051b60200190565b60008219821115612fc157612fc16130a6565b500190565b600082612fd557612fd56130bc565b500490565b6000816000190483118215151615612ff457612ff46130a6565b500290565b60008282101561300b5761300b6130a6565b500390565b60005b8381101561302b578181015183820152602001613013565b838111156116b15750506000910152565b600181811c9082168061305057607f821691505b6020821081141561307157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561308b5761308b6130a6565b5060010190565b6000826130a1576130a16130bc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f9057600080fd5b6001600160e01b031981168114610f9057600080fdfea26469706673582212201538eae7177482eee475580298aee07a75a50559c75c322ae0aff1e47a0c69f464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c80637cb6475911610175578063b88d4fde116100dc578063e3ae869111610095578063f2fde38b1161006f578063f2fde38b146108d7578063f516a2e6146108f7578063f931a4c21461090d578063fba7d7cb1461092257600080fd5b8063e3ae869114610887578063e8315742146108a1578063e985e9c5146108b757600080fd5b8063b88d4fde146107ad578063c3058391146107cd578063c87b56dd146107ec578063ce7c2ac21461080c578063db4bec4414610842578063e33b7de31461087257600080fd5b8063922400ff1161012e578063922400ff146106ff57806395d89b41146107175780639852595c1461072c57806399c89e8114610762578063a22cb46514610777578063b6ad8b561461079757600080fd5b80637cb647591461064e5780637ff9b5961461066e57806385177e62146106845780638b83209b146106a15780638da5cb5b146106c157806391b7f5ed146106df57600080fd5b8063372f657c116102345780636352211e116101ed57806370a08231116101c757806370a08231146105cd578063715018a6146105ed578063754e9fd914610602578063781799761461063b57600080fd5b80636352211e146105605780636e260c1e146105805780636fffbd60146105a057600080fd5b8063372f657c146104b85780633a98ef39146104cb57806342842e0e146104e057806345f7e06e146105005780634f6ccce71461052057806355f804b31461054057600080fd5b80631916558711610286578063191655871461040457806322ab47a11461042457806323b872dd146104425780632555ca8a146104625780632db115441461048f5780632eb4a7ab146104a257600080fd5b806301ffc9a71461031b57806306fdde0314610350578063081812fc14610372578063082e2a72146103aa578063095ea7b3146103c157806318160ddd146103e157600080fd5b36610316577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561032757600080fd5b5061033b610336366004612d53565b610942565b60405190151581526020015b60405180910390f35b34801561035c57600080fd5b50610365610994565b6040516103479190612e96565b34801561037e57600080fd5b5061039261038d366004612d3a565b610a26565b6040516001600160a01b039091168152602001610347565b3480156103b657600080fd5b506103bf610ab4565b005b3480156103cd57600080fd5b506103bf6103dc366004612bba565b610af2565b3480156103ed57600080fd5b506103f6610c0a565b604051908152602001610347565b34801561041057600080fd5b506103bf61041f366004612a2d565b610c20565b34801561043057600080fd5b50600d5462010000900460ff1661033b565b34801561044e57600080fd5b506103bf61045d366004612a83565b610df8565b34801561046e57600080fd5b506103f661047d366004612a2d565b60136020526000908152604090205481565b6103bf61049d366004612d3a565b610e03565b3480156104ae57600080fd5b506103f660115481565b6103bf6104c6366004612cae565b610f93565b3480156104d757600080fd5b506008546103f6565b3480156104ec57600080fd5b506103bf6104fb366004612a83565b611145565b34801561050c57600080fd5b50600d5461033b9062010000900460ff1681565b34801561052c57600080fd5b506103f661053b366004612d3a565b611160565b34801561054c57600080fd5b506103bf61055b366004612d8d565b6111cf565b34801561056c57600080fd5b5061039261057b366004612d3a565b611205565b34801561058c57600080fd5b506103bf61059b366004612be6565b611217565b3480156105ac57600080fd5b506103f66105bb366004612a2d565b60146020526000908152604090205481565b3480156105d957600080fd5b506103f66105e8366004612a2d565b6113d5565b3480156105f957600080fd5b506103bf611466565b34801561060e57600080fd5b5061033b61061d366004612a2d565b6001600160a01b031660009081526012602052604090205460ff1690565b6103bf610649366004612cef565b61149c565b34801561065a57600080fd5b506103bf610669366004612d3a565b6116b7565b34801561067a57600080fd5b506103f6600e5481565b34801561069057600080fd5b50600d54610100900460ff1661033b565b3480156106ad57600080fd5b506103926106bc366004612d3a565b6116e6565b3480156106cd57600080fd5b506007546001600160a01b0316610392565b3480156106eb57600080fd5b506103bf6106fa366004612d3a565b611716565b34801561070b57600080fd5b50600d5460ff1661033b565b34801561072357600080fd5b50610365611745565b34801561073857600080fd5b506103f6610747366004612a2d565b6001600160a01b03166000908152600b602052604090205490565b34801561076e57600080fd5b506103bf611754565b34801561078357600080fd5b506103bf610792366004612b87565b61179d565b3480156107a357600080fd5b506103f66105dc81565b3480156107b957600080fd5b506103bf6107c8366004612ac4565b611862565b3480156107d957600080fd5b50600d5461033b90610100900460ff1681565b3480156107f857600080fd5b50610365610807366004612d3a565b611895565b34801561081857600080fd5b506103f6610827366004612a2d565b6001600160a01b03166000908152600a602052604090205490565b34801561084e57600080fd5b5061033b61085d366004612a2d565b60126020526000908152604090205460ff1681565b34801561087e57600080fd5b506009546103f6565b34801561089357600080fd5b50600d5461033b9060ff1681565b3480156108ad57600080fd5b506103f661271081565b3480156108c357600080fd5b5061033b6108d2366004612a4a565b611961565b3480156108e357600080fd5b506103bf6108f2366004612a2d565b61198f565b34801561090357600080fd5b506103f6600f5481565b34801561091957600080fd5b506103bf611a27565b34801561092e57600080fd5b506103bf61093d366004612d3a565b611a6e565b60006001600160e01b031982166380ac58cd60e01b148061097357506001600160e01b03198216635b5e139f60e01b145b8061098e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600180546109a39061303c565b80601f01602080910402602001604051908101604052809291908181526020018280546109cf9061303c565b8015610a1c5780601f106109f157610100808354040283529160200191610a1c565b820191906000526020600020905b8154815290600101906020018083116109ff57829003601f168201915b5050505050905090565b6000610a3182611ad6565b610a985760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6007546001600160a01b03163314610ade5760405162461bcd60e51b8152600401610a8f90612ed3565b600d805460ff19811660ff90911615179055565b6000610afd82611205565b9050806001600160a01b0316836001600160a01b03161415610b6c5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610a8f565b336001600160a01b0382161480610b885750610b888133611961565b610bfa5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610a8f565b610c05838383611ae9565b505050565b60006001600054610c1b9190612ff9565b905090565b6001600160a01b0381166000908152600a6020526040902054610c945760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b6064820152608401610a8f565b6000610cab60095447611b4590919063ffffffff16565b6001600160a01b0383166000908152600b6020908152604080832054600854600a909352908320549394509192610cf89291610cf291610cec908790611ba4565b90611c23565b90611c7e565b905080610d5b5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610a8f565b6001600160a01b0383166000908152600b6020526040902054610d7e9082611b45565b6001600160a01b0384166000908152600b6020526040902055600954610da49082611b45565b600955610db18382611cda565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b610c05838383611df3565b600d5462010000900460ff16610e4b5760405162461bcd60e51b815260206004820152600d60248201526c36b4b73a103737ba1037b832b760991b6044820152606401610a8f565b61271081610e57610c0a565b610e619190612fae565b1115610ea55760405162461bcd60e51b81526020600482015260136024820152724d696e74696e67206f76657220737570706c7960681b6044820152606401610a8f565b600f5433600090815260146020526040902054610ec3908390612fae565b1115610f045760405162461bcd60e51b815260206004820152601060248201526f13585e080cc81c195c881dd85b1b195d60821b6044820152606401610a8f565b80600e54610f129190612fda565b341015610f615760405162461bcd60e51b815260206004820152601760248201527f4e6f7420656e6f756768742065746865722073656e742e0000000000000000006044820152606401610a8f565b3360009081526014602052604081208054839290610f80908490612fae565b90915550610f90905033826120d4565b50565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061100d8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060115491508490506120f2565b61104a5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610a8f565b3360009081526012602052604090205460ff16156110aa5760405162461bcd60e51b815260206004820152601c60248201527f416464726573732068617320616c726561647920636c61696d65642e000000006044820152606401610a8f565b600d5460ff166110ea5760405162461bcd60e51b815260206004820152600b60248201526a135a5b9d0818db1bdcd95960aa1b6044820152606401610a8f565b6105dc6110f5610c0a565b611100906001612fae565b111561111e5760405162461bcd60e51b8152600401610a8f90612ea9565b336000818152601260205260409020805460ff19166001908117909155610c0591906120d4565b610c0583838360405180602001604052806000815250611862565b600061116a610c0a565b82106111c45760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610a8f565b61098e826001612fae565b6007546001600160a01b031633146111f95760405162461bcd60e51b8152600401610a8f90612ed3565b610c05601083836128d7565b600061121082612108565b5192915050565b6007546001600160a01b031633146112415760405162461bcd60e51b8152600401610a8f90612ed3565b600d546301000000900460ff16156112a65760405162461bcd60e51b815260206004820152602260248201527f5061796d656e742053706c697420416c726561647920496e697469616c697a65604482015261642160f01b6064820152608401610a8f565b80518251146113125760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b6064820152608401610a8f565b60008251116113635760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401610a8f565b60005b82518110156113bd576113ab838281518110611384576113846130d2565b602002602001015183838151811061139e5761139e6130d2565b6020026020010151612243565b806113b581613077565b915050611366565b5050600d805463ff0000001916630100000017905550565b60006001600160a01b0382166114415760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610a8f565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6007546001600160a01b031633146114905760405162461bcd60e51b8152600401610a8f90612ed3565b61149a6000612428565b565b600d54610100900460ff166114e35760405162461bcd60e51b815260206004820152600d60248201526c26b4b73a103737ba1037b832b760991b6044820152606401610a8f565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061155d8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060115491508490506120f2565b61159a5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b210383937b7b31760911b6044820152606401610a8f565b612710826115a6610c0a565b6115b09190612fae565b11156115ce5760405162461bcd60e51b8152600401610a8f90612ea9565b600f54336000908152601360205260409020546115ec908490612fae565b111561162d5760405162461bcd60e51b815260206004820152601060248201526f13585e080cc81c195c881dd85b1b195d60821b6044820152606401610a8f565b81600e5461163b9190612fda565b3410156116825760405162461bcd60e51b8152602060048201526015602482015274139bdd08195b9bdd59da08195d1a195c881cd95b9d605a1b6044820152606401610a8f565b33600090815260136020526040812080548492906116a1908490612fae565b909155506116b1905033836120d4565b50505050565b6007546001600160a01b031633146116e15760405162461bcd60e51b8152600401610a8f90612ed3565b601155565b6000600c82815481106116fb576116fb6130d2565b6000918252602090912001546001600160a01b031692915050565b6007546001600160a01b031633146117405760405162461bcd60e51b8152600401610a8f90612ed3565b600e55565b6060600280546109a39061303c565b6007546001600160a01b0316331461177e5760405162461bcd60e51b8152600401610a8f90612ed3565b600d805462ff0000198116620100009182900460ff1615909102179055565b6001600160a01b0382163314156117f65760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610a8f565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61186d848484611df3565b6118798484848461247a565b6116b15760405162461bcd60e51b8152600401610a8f90612f08565b60606118a082611ad6565b6119045760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a8f565b600061190e612588565b905080516000141561192f576040518060200160405280600081525061195a565b8061193984612597565b60405160200161194a929190612e2a565b6040516020818303038152906040525b9392505050565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6007546001600160a01b031633146119b95760405162461bcd60e51b8152600401610a8f90612ed3565b6001600160a01b038116611a1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8f565b610f9081612428565b6007546001600160a01b03163314611a515760405162461bcd60e51b8152600401610a8f90612ed3565b600d805461ff001981166101009182900460ff1615909102179055565b6007546001600160a01b03163314611a985760405162461bcd60e51b8152600401610a8f90612ed3565b61271081611aa4610c0a565b611aae9190612fae565b1115611acc5760405162461bcd60e51b8152600401610a8f90612ea9565b610f9033826120d4565b600080548210801561098e575050151590565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600080611b528385612fae565b90508381101561195a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a8f565b600082611bb35750600061098e565b6000611bbf8385612fda565b905082611bcc8583612fc6565b1461195a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a8f565b6000808211611c745760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610a8f565b61195a8284612fc6565b600082821115611cd05760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610a8f565b61195a8284612ff9565b80471015611d2a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a8f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611d77576040519150601f19603f3d011682016040523d82523d6000602084013e611d7c565b606091505b5050905080610c055760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a8f565b6000611dfe82612108565b80519091506000906001600160a01b0316336001600160a01b03161480611e35575033611e2a84610a26565b6001600160a01b0316145b80611e4757508151611e479033611961565b905080611eb15760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610a8f565b846001600160a01b031682600001516001600160a01b031614611f255760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610a8f565b6001600160a01b038416611f895760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610a8f565b611f996000848460000151611ae9565b6001600160a01b03858116600090815260046020908152604080832080546001600160801b03198082166001600160801b03928316600019018316179092558986168086528386208054938416938316600190810190931693909317909255888552600390935281842080546001600160e01b031916909117600160a01b426001600160401b03160217905590860180835291205490911661208a5761203e81611ad6565b1561208a57825160008281526003602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b6120ee828260405180602001604052806000815250612694565b5050565b6000826120ff85846126a1565b14949350505050565b604080518082019091526000808252602082015261212582611ad6565b6121845760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610a8f565b815b80156121e2576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156121d8579392505050565b5060001901612186565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610a8f565b6001600160a01b0382166122ae5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401610a8f565b600081116122fe5760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401610a8f565b6001600160a01b0382166000908152600a6020526040902054156123785760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401610a8f565b600c8054600181019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319166001600160a01b0384169081179091556000908152600a602052604090208190556008546123df9082611b45565b600855604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561257c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124be903390899088908890600401612e59565b602060405180830381600087803b1580156124d857600080fd5b505af1925050508015612508575060408051601f3d908101601f1916820190925261250591810190612d70565b60015b612562573d808015612536576040519150601f19603f3d011682016040523d82523d6000602084013e61253b565b606091505b50805161255a5760405162461bcd60e51b8152600401610a8f90612f08565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612580565b5060015b949350505050565b6060601080546109a39061303c565b6060816125bb5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125e557806125cf81613077565b91506125de9050600a83612fc6565b91506125bf565b6000816001600160401b038111156125ff576125ff6130e8565b6040519080825280601f01601f191660200182016040528015612629576020820181803683370190505b5090505b84156125805761263e600183612ff9565b915061264b600a86613092565b612656906030612fae565b60f81b81838151811061266b5761266b6130d2565b60200101906001600160f81b031916908160001a90535061268d600a86612fc6565b945061262d565b610c058383836001612715565b600081815b845181101561270d5760008582815181106126c3576126c36130d2565b602002602001015190508083116126e957600083815260208290526040902092506126fa565b600081815260208490526040902092505b508061270581613077565b9150506126a6565b509392505050565b6000546001600160a01b0385166127785760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610a8f565b836127d65760405162461bcd60e51b815260206004820152602860248201527f455243373231413a207175616e74697479206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608401610a8f565b6001600160a01b03851660008181526004602090815260408083208054600160801b6001600160801b031982166001600160801b039283168c01831690811782900483168c01909216021790558483526003909152812080546001600160e01b031916909217600160a01b426001600160401b0316021790915581905b858110156128ce5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a483156128c2576128a6600088848861247a565b6128c25760405162461bcd60e51b8152600401610a8f90612f08565b60019182019101612853565b506000556120cd565b8280546128e39061303c565b90600052602060002090601f016020900481019282612905576000855561294b565b82601f1061291e5782800160ff1982351617855561294b565b8280016001018555821561294b579182015b8281111561294b578235825591602001919060010190612930565b5061295792915061295b565b5090565b5b80821115612957576000815560010161295c565b60008083601f84011261298257600080fd5b5081356001600160401b0381111561299957600080fd5b6020830191508360208260051b85010111156129b457600080fd5b9250929050565b600082601f8301126129cc57600080fd5b813560206129e16129dc83612f8b565b612f5b565b80838252828201915082860187848660051b8901011115612a0157600080fd5b60005b85811015612a2057813584529284019290840190600101612a04565b5090979650505050505050565b600060208284031215612a3f57600080fd5b813561195a816130fe565b60008060408385031215612a5d57600080fd5b8235612a68816130fe565b91506020830135612a78816130fe565b809150509250929050565b600080600060608486031215612a9857600080fd5b8335612aa3816130fe565b92506020840135612ab3816130fe565b929592945050506040919091013590565b60008060008060808587031215612ada57600080fd5b8435612ae5816130fe565b9350602085810135612af6816130fe565b93506040860135925060608601356001600160401b0380821115612b1957600080fd5b818801915088601f830112612b2d57600080fd5b813581811115612b3f57612b3f6130e8565b612b51601f8201601f19168501612f5b565b91508082528984828501011115612b6757600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215612b9a57600080fd5b8235612ba5816130fe565b915060208301358015158114612a7857600080fd5b60008060408385031215612bcd57600080fd5b8235612bd8816130fe565b946020939093013593505050565b60008060408385031215612bf957600080fd5b82356001600160401b0380821115612c1057600080fd5b818501915085601f830112612c2457600080fd5b81356020612c346129dc83612f8b565b8083825282820191508286018a848660051b8901011115612c5457600080fd5b600096505b84871015612c80578035612c6c816130fe565b835260019690960195918301918301612c59565b5096505086013592505080821115612c9757600080fd5b50612ca4858286016129bb565b9150509250929050565b60008060208385031215612cc157600080fd5b82356001600160401b03811115612cd757600080fd5b612ce385828601612970565b90969095509350505050565b600080600060408486031215612d0457600080fd5b83356001600160401b03811115612d1a57600080fd5b612d2686828701612970565b909790965060209590950135949350505050565b600060208284031215612d4c57600080fd5b5035919050565b600060208284031215612d6557600080fd5b813561195a81613113565b600060208284031215612d8257600080fd5b815161195a81613113565b60008060208385031215612da057600080fd5b82356001600160401b0380821115612db757600080fd5b818501915085601f830112612dcb57600080fd5b813581811115612dda57600080fd5b866020828501011115612dec57600080fd5b60209290920196919550909350505050565b60008151808452612e16816020860160208601613010565b601f01601f19169290920160200192915050565b60008351612e3c818460208801613010565b835190830190612e50818360208801613010565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612e8c90830184612dfe565b9695505050505050565b60208152600061195a6020830184612dfe565b60208082526010908201526f4d696e74696e6720746f6f206d616e7960801b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715612f8357612f836130e8565b604052919050565b60006001600160401b03821115612fa457612fa46130e8565b5060051b60200190565b60008219821115612fc157612fc16130a6565b500190565b600082612fd557612fd56130bc565b500490565b6000816000190483118215151615612ff457612ff46130a6565b500290565b60008282101561300b5761300b6130a6565b500390565b60005b8381101561302b578181015183820152602001613013565b838111156116b15750506000910152565b600181811c9082168061305057607f821691505b6020821081141561307157634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561308b5761308b6130a6565b5060010190565b6000826130a1576130a16130bc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610f9057600080fd5b6001600160e01b031981168114610f9057600080fdfea26469706673582212201538eae7177482eee475580298aee07a75a50559c75c322ae0aff1e47a0c69f464736f6c63430008070033

Deployed Bytecode Sourcemap

57037:4607:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51591:40;13275:10;51591:40;;;-1:-1:-1;;;;;9527:32:1;;;9509:51;;51621:9:0;9591:2:1;9576:18;;9569:34;9482:18;51591:40:0;;;;;;;57037:4607;;;;;35264:355;;;;;;;;;;-1:-1:-1;35264:355:0;;;;;:::i;:::-;;:::i;:::-;;;10551:14:1;;10544:22;10526:41;;10514:2;10499:18;35264:355:0;;;;;;;;37238:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38934:292::-;;;;;;;;;;-1:-1:-1;38934:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9283:32:1;;;9265:51;;9253:2;9238:18;38934:292:0;9119:203:1;60076:108:0;;;;;;;;;;;;;:::i;:::-;;38455:413;;;;;;;;;;-1:-1:-1;38455:413:0;;;;;:::i;:::-;;:::i;34838:95::-;;;;;;;;;;;;;:::i;:::-;;;10724:25:1;;;10712:2;10697:18;34838:95:0;10578:177:1;52797:671:0;;;;;;;;;;-1:-1:-1;52797:671:0;;;;;:::i;:::-;;:::i;60621:94::-;;;;;;;;;;-1:-1:-1;60693:14:0;;;;;;;60621:94;;39961:162;;;;;;;;;;-1:-1:-1;39961:162:0;;;;;:::i;:::-;;:::i;57596:55::-;;;;;;;;;;-1:-1:-1;57596:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;59309:523;;;;;;:::i;:::-;;:::i;57507:25::-;;;;;;;;;;;;;;;;57969:566;;;;;;:::i;:::-;;:::i;51722:91::-;;;;;;;;;;-1:-1:-1;51793:12:0;;51722:91;;40194:177;;;;;;;;;;-1:-1:-1;40194:177:0;;;;;:::i;:::-;;:::i;57187:34::-;;;;;;;;;;-1:-1:-1;57187:34:0;;;;;;;;;;;35010:182;;;;;;;;;;-1:-1:-1;35010:182:0;;;;;:::i;:::-;;:::i;59962:106::-;;;;;;;;;;-1:-1:-1;59962:106:0;;;;;:::i;:::-;;:::i;37047:124::-;;;;;;;;;;-1:-1:-1;37047:124:0;;;;;:::i;:::-;;:::i;60723:561::-;;;;;;;;;;-1:-1:-1;60723:561:0;;;;;:::i;:::-;;:::i;57658:58::-;;;;;;;;;;-1:-1:-1;57658:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;35683:258;;;;;;;;;;-1:-1:-1;35683:258:0;;;;;:::i;:::-;;:::i;15088:103::-;;;;;;;;;;;;;:::i;61292:128::-;;;;;;;;;;-1:-1:-1;61292:128:0;;;;;:::i;:::-;-1:-1:-1;;;;;61385:27:0;61361:4;61385:27;;;:16;:27;;;;;;;;;61292:128;58543:758;;;;;;:::i;:::-;;:::i;61531:110::-;;;;;;;;;;-1:-1:-1;61531:110:0;;;;;:::i;:::-;;:::i;57271:39::-;;;;;;;;;;;;;;;;60410:96;;;;;;;;;;-1:-1:-1;60483:15:0;;;;;;;60410:96;;52497:100;;;;;;;;;;-1:-1:-1;52497:100:0;;;;;:::i;:::-;;:::i;14437:87::-;;;;;;;;;;-1:-1:-1;14510:6:0;;-1:-1:-1;;;;;14510:6:0;14437:87;;61428:95;;;;;;;;;;-1:-1:-1;61428:95:0;;;;;:::i;:::-;;:::i;60192:100::-;;;;;;;;;;-1:-1:-1;60267:17:0;;;;60192:100;;37407:104;;;;;;;;;;;;;:::i;52297:109::-;;;;;;;;;;-1:-1:-1;52297:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;52380:18:0;52353:7;52380:18;;;:9;:18;;;;;;;52297:109;60514:99;;;;;;;;;;;;;:::i;39298:311::-;;;;;;;;;;-1:-1:-1;39298:311:0;;;;;:::i;:::-;;:::i;57367:49::-;;;;;;;;;;;;57412:4;57367:49;;40442:355;;;;;;;;;;-1:-1:-1;40442:355:0;;;;;:::i;:::-;;:::i;57145:35::-;;;;;;;;;;-1:-1:-1;57145:35:0;;;;;;;;;;;37582:469;;;;;;;;;;-1:-1:-1;37582:469:0;;;;;:::i;:::-;;:::i;52093:105::-;;;;;;;;;;-1:-1:-1;52093:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;52174:16:0;52147:7;52174:16;;;:7;:16;;;;;;;52093:105;57541:48;;;;;;;;;;-1:-1:-1;57541:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;51907:95;;;;;;;;;;-1:-1:-1;51980:14:0;;51907:95;;57101:37;;;;;;;;;;-1:-1:-1;57101:37:0;;;;;;;;57319:41;;;;;;;;;;;;57355:5;57319:41;;39680:214;;;;;;;;;;-1:-1:-1;39680:214:0;;;;;:::i;:::-;;:::i;15346:238::-;;;;;;;;;;-1:-1:-1;15346:238:0;;;;;:::i;:::-;;:::i;57425:36::-;;;;;;;;;;;;;;;;60300:102;;;;;;;;;;;;;:::i;57780:181::-;;;;;;;;;;-1:-1:-1;57780:181:0;;;;;:::i;:::-;;:::i;35264:355::-;35411:4;-1:-1:-1;;;;;;35453:40:0;;-1:-1:-1;;;35453:40:0;;:105;;-1:-1:-1;;;;;;;35510:48:0;;-1:-1:-1;;;35510:48:0;35453:105;:158;;;-1:-1:-1;;;;;;;;;;27332:40:0;;;35575:36;35433:178;35264:355;-1:-1:-1;;35264:355:0:o;37238:100::-;37292:13;37325:5;37318:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37238:100;:::o;38934:292::-;39038:7;39085:16;39093:7;39085;:16::i;:::-;39063:111;;;;-1:-1:-1;;;39063:111:0;;26202:2:1;39063:111:0;;;26184:21:1;26241:2;26221:18;;;26214:30;26280:34;26260:18;;;26253:62;-1:-1:-1;;;26331:18:1;;;26324:43;26384:19;;39063:111:0;;;;;;;;;-1:-1:-1;39194:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;39194:24:0;;38934:292::o;60076:108::-;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;60159:17:::1;::::0;;-1:-1:-1;;60138:38:0;::::1;60159:17;::::0;;::::1;60158:18;60138:38;::::0;;60076:108::o;38455:413::-;38528:13;38544:24;38560:7;38544:15;:24::i;:::-;38528:40;;38593:5;-1:-1:-1;;;;;38587:11:0;:2;-1:-1:-1;;;;;38587:11:0;;;38579:58;;;;-1:-1:-1;;;38579:58:0;;22352:2:1;38579:58:0;;;22334:21:1;22391:2;22371:18;;;22364:30;22430:34;22410:18;;;22403:62;-1:-1:-1;;;22481:18:1;;;22474:32;22523:19;;38579:58:0;22150:398:1;38579:58:0;13275:10;-1:-1:-1;;;;;38672:21:0;;;;:62;;-1:-1:-1;38697:37:0;38714:5;13275:10;39680:214;:::i;38697:37::-;38650:169;;;;-1:-1:-1;;;38650:169:0;;18048:2:1;38650:169:0;;;18030:21:1;18087:2;18067:18;;;18060:30;18126:34;18106:18;;;18099:62;18197:27;18177:18;;;18170:55;18242:19;;38650:169:0;17846:421:1;38650:169:0;38832:28;38841:2;38845:7;38854:5;38832:8;:28::i;:::-;38517:351;38455:413;;:::o;34838:95::-;34882:7;34924:1;34909:12;;:16;;;;:::i;:::-;34902:23;;34838:95;:::o;52797:671::-;-1:-1:-1;;;;;52873:16:0;;52892:1;52873:16;;;:7;:16;;;;;;52865:71;;;;-1:-1:-1;;;52865:71:0;;14227:2:1;52865:71:0;;;14209:21:1;14266:2;14246:18;;;14239:30;14305:34;14285:18;;;14278:62;-1:-1:-1;;;14356:18:1;;;14349:36;14402:19;;52865:71:0;14025:402:1;52865:71:0;52949:21;52973:41;52999:14;;52973:21;:25;;:41;;;;:::i;:::-;-1:-1:-1;;;;;53143:18:0;;53025:15;53143:18;;;:9;:18;;;;;;;;;53111:12;;53075:7;:16;;;;;;;52949:65;;-1:-1:-1;53025:15:0;;53043:119;;53143:18;53043:81;;:49;;52949:65;;53043:31;:49::i;:::-;:67;;:81::i;:::-;:99;;:119::i;:::-;53025:137;-1:-1:-1;53183:12:0;53175:68;;;;-1:-1:-1;;;53175:68:0;;16929:2:1;53175:68:0;;;16911:21:1;16968:2;16948:18;;;16941:30;17007:34;16987:18;;;16980:62;-1:-1:-1;;;17058:18:1;;;17051:41;17109:19;;53175:68:0;16727:407:1;53175:68:0;-1:-1:-1;;;;;53277:18:0;;;;;;:9;:18;;;;;;:31;;53300:7;53277:22;:31::i;:::-;-1:-1:-1;;;;;53256:18:0;;;;;;:9;:18;;;;;:52;53336:14;;:27;;53355:7;53336:18;:27::i;:::-;53319:14;:44;53376:35;53394:7;53403;53376:17;:35::i;:::-;53427:33;;;-1:-1:-1;;;;;9527:32:1;;9509:51;;9591:2;9576:18;;9569:34;;;53427:33:0;;9482:18:1;53427:33:0;;;;;;;52854:614;;52797:671;:::o;39961:162::-;40087:28;40097:4;40103:2;40107:7;40087:9;:28::i;59309:523::-;59383:14;;;;;;;59375:40;;;;-1:-1:-1;;;59375:40:0;;16229:2:1;59375:40:0;;;16211:21:1;16268:2;16248:18;;;16241:30;-1:-1:-1;;;16287:18:1;;;16280:43;16340:18;;59375:40:0;16027:337:1;59375:40:0;57355:5;59450:8;59434:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;59426:69;;;;-1:-1:-1;;;59426:69:0;;12708:2:1;59426:69:0;;;12690:21:1;12747:2;12727:18;;;12720:30;-1:-1:-1;;;12766:18:1;;;12759:49;12825:18;;59426:69:0;12506:343:1;59426:69:0;59578:17;;59552:10;59528:35;;;;:23;:35;;;;;;:46;;59566:8;;59528:46;:::i;:::-;:67;;59506:133;;;;-1:-1:-1;;;59506:133:0;;19695:2:1;59506:133:0;;;19677:21:1;19734:2;19714:18;;;19707:30;-1:-1:-1;;;19753:18:1;;;19746:46;19809:18;;59506:133:0;19493:340:1;59506:133:0;59684:8;59671:10;;:21;;;;:::i;:::-;59658:9;:34;;59650:70;;;;-1:-1:-1;;;59650:70:0;;17696:2:1;59650:70:0;;;17678:21:1;17735:2;17715:18;;;17708:30;17774:25;17754:18;;;17747:53;17817:18;;59650:70:0;17494:347:1;59650:70:0;59757:10;59733:35;;;;:23;:35;;;;;:47;;59772:8;;59733:35;:47;;59772:8;;59733:47;:::i;:::-;;;;-1:-1:-1;59793:31:0;;-1:-1:-1;59803:10:0;59815:8;59793:9;:31::i;:::-;59309:523;:::o;57969:566::-;58076:28;;-1:-1:-1;;58093:10:0;8349:2:1;8345:15;8341:53;58076:28:0;;;8329:66:1;58051:12:0;;8411::1;;58076:28:0;;;;;;;;;;;;58066:39;;;;;;58051:54;;58138:50;58157:12;;58138:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58171:10:0;;;-1:-1:-1;58183:4:0;;-1:-1:-1;58138:18:0;:50::i;:::-;58116:114;;;;-1:-1:-1;;;58116:114:0;;24676:2:1;58116:114:0;;;24658:21:1;24715:2;24695:18;;;24688:30;-1:-1:-1;;;24734:18:1;;;24727:44;24788:18;;58116:114:0;24474:338:1;58116:114:0;58267:10;58250:28;;;;:16;:28;;;;;;;;58249:29;58241:70;;;;-1:-1:-1;;;58241:70:0;;11186:2:1;58241:70:0;;;11168:21:1;11225:2;11205:18;;;11198:30;11264;11244:18;;;11237:58;11312:18;;58241:70:0;10984:352:1;58241:70:0;58330:17;;;;58322:41;;;;-1:-1:-1;;;58322:41:0;;22755:2:1;58322:41:0;;;22737:21:1;22794:2;22774:18;;;22767:30;-1:-1:-1;;;22813:18:1;;;22806:41;22864:18;;58322:41:0;22553:335:1;58322:41:0;57412:4;58382:13;:11;:13::i;:::-;:17;;58398:1;58382:17;:::i;:::-;:39;;58374:68;;;;-1:-1:-1;;;58374:68:0;;;;;;;:::i;:::-;58472:10;58455:28;;;;:16;:28;;;;;:35;;-1:-1:-1;;58455:35:0;58486:4;58455:35;;;;;;58503:24;;58472:10;58503:9;:24::i;40194:177::-;40324:39;40341:4;40347:2;40351:7;40324:39;;;;;;;;;;;;:16;:39::i;35010:182::-;35068:7;35104:13;:11;:13::i;:::-;35096:5;:21;35088:69;;;;-1:-1:-1;;;35088:69:0;;13823:2:1;35088:69:0;;;13805:21:1;13862:2;13842:18;;;13835:30;13901:34;13881:18;;;13874:62;-1:-1:-1;;;13952:18:1;;;13945:33;13995:19;;35088:69:0;13621:399:1;35088:69:0;35175:9;:5;35183:1;35175:9;:::i;59962:106::-;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;60037:23:::1;:13;60053:7:::0;;60037:23:::1;:::i;37047:124::-:0;37111:7;37138:20;37150:7;37138:11;:20::i;:::-;:25;;37047:124;-1:-1:-1;;37047:124:0:o;60723:561::-;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;60873:11:::1;::::0;;;::::1;;;60872:12;60864:59;;;::::0;-1:-1:-1;;;60864:59:0;;15040:2:1;60864:59:0::1;::::0;::::1;15022:21:1::0;15079:2;15059:18;;;15052:30;15118:34;15098:18;;;15091:62;-1:-1:-1;;;15169:18:1;;;15162:32;15211:19;;60864:59:0::1;14838:398:1::0;60864:59:0::1;60973:7;:14;60956:6;:13;:31;60934:131;;;::::0;-1:-1:-1;;;60934:131:0;;21591:2:1;60934:131:0::1;::::0;::::1;21573:21:1::0;21630:2;21610:18;;;21603:30;21669:34;21649:18;;;21642:62;-1:-1:-1;;;21720:18:1;;;21713:48;21778:19;;60934:131:0::1;21389:414:1::0;60934:131:0::1;61100:1;61084:6;:13;:17;61076:56;;;::::0;-1:-1:-1;;;61076:56:0;;25847:2:1;61076:56:0::1;::::0;::::1;25829:21:1::0;25886:2;25866:18;;;25859:30;25925:28;25905:18;;;25898:56;25971:18;;61076:56:0::1;25645:350:1::0;61076:56:0::1;61150:9;61145:103;61169:6;:13;61165:1;:17;61145:103;;;61204:32;61214:6;61221:1;61214:9;;;;;;;;:::i;:::-;;;;;;;61225:7;61233:1;61225:10;;;;;;;;:::i;:::-;;;;;;;61204:9;:32::i;:::-;61184:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61145:103;;;-1:-1:-1::0;;61258:11:0::1;:18:::0;;-1:-1:-1;;61258:18:0::1;::::0;::::1;::::0;;-1:-1:-1;60723:561:0:o;35683:258::-;35747:7;-1:-1:-1;;;;;35789:19:0;;35767:112;;;;-1:-1:-1;;;35767:112:0;;18474:2:1;35767:112:0;;;18456:21:1;18513:2;18493:18;;;18486:30;18552:34;18532:18;;;18525:62;-1:-1:-1;;;18603:18:1;;;18596:41;18654:19;;35767:112:0;18272:407:1;35767:112:0;-1:-1:-1;;;;;;35905:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;35905:27:0;;35683:258::o;15088:103::-;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;15153:30:::1;15180:1;15153:18;:30::i;:::-;15088:103::o:0;58543:758::-;58672:15;;;;;;;58664:41;;;;-1:-1:-1;;;58664:41:0;;22010:2:1;58664:41:0;;;21992:21:1;22049:2;22029:18;;;22022:30;-1:-1:-1;;;22068:18:1;;;22061:43;22121:18;;58664:41:0;21808:337:1;58664:41:0;58741:28;;-1:-1:-1;;58758:10:0;8349:2:1;8345:15;8341:53;58741:28:0;;;8329:66:1;58716:12:0;;8411::1;;58741:28:0;;;;;;;;;;;;58731:39;;;;;;58716:54;;58803:50;58822:12;;58803:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58836:10:0;;;-1:-1:-1;58848:4:0;;-1:-1:-1;58803:18:0;:50::i;:::-;58781:114;;;;-1:-1:-1;;;58781:114:0;;24676:2:1;58781:114:0;;;24658:21:1;24715:2;24695:18;;;24688:30;-1:-1:-1;;;24734:18:1;;;24727:44;24788:18;;58781:114:0;24474:338:1;58781:114:0;57355:5;58930:8;58914:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;58906:66;;;;-1:-1:-1;;;58906:66:0;;;;;;;:::i;:::-;59052:17;;59026:10;59005:32;;;;:20;:32;;;;;;:43;;59040:8;;59005:43;:::i;:::-;:64;;58983:130;;;;-1:-1:-1;;;58983:130:0;;19695:2:1;58983:130:0;;;19677:21:1;19734:2;19714:18;;;19707:30;-1:-1:-1;;;19753:18:1;;;19746:46;19809:18;;58983:130:0;19493:340:1;58983:130:0;59158:8;59145:10;;:21;;;;:::i;:::-;59132:9;:34;;59124:68;;;;-1:-1:-1;;;59124:68:0;;23515:2:1;59124:68:0;;;23497:21:1;23554:2;23534:18;;;23527:30;-1:-1:-1;;;23573:18:1;;;23566:51;23634:18;;59124:68:0;23313:345:1;59124:68:0;59226:10;59205:32;;;;:20;:32;;;;;:44;;59241:8;;59205:32;:44;;59241:8;;59205:44;:::i;:::-;;;;-1:-1:-1;59262:31:0;;-1:-1:-1;59272:10:0;59284:8;59262:9;:31::i;:::-;58653:648;58543:758;;;:::o;61531:110::-;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;61607:10:::1;:26:::0;61531:110::o;52497:100::-;52548:7;52575;52583:5;52575:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;52575:14:0;;52497:100;-1:-1:-1;;52497:100:0:o;61428:95::-;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;61494:10:::1;:21:::0;61428:95::o;37407:104::-;37463:13;37496:7;37489:14;;;;;:::i;60514:99::-;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;60591:14:::1;::::0;;-1:-1:-1;;60573:32:0;::::1;60591:14:::0;;;;::::1;;;60590:15;60573:32:::0;;::::1;;::::0;;60514:99::o;39298:311::-;-1:-1:-1;;;;;39416:24:0;;13275:10;39416:24;;39408:63;;;;-1:-1:-1;;;39408:63:0;;20817:2:1;39408:63:0;;;20799:21:1;20856:2;20836:18;;;20829:30;20895:28;20875:18;;;20868:56;20941:18;;39408:63:0;20615:350:1;39408:63:0;13275:10;39484:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;39484:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;39484:53:0;;;;;;;;;;39553:48;;10526:41:1;;;39484:42:0;;13275:10;39553:48;;10499:18:1;39553:48:0;;;;;;;39298:311;;:::o;40442:355::-;40601:28;40611:4;40617:2;40621:7;40601:9;:28::i;:::-;40662:48;40685:4;40691:2;40695:7;40704:5;40662:22;:48::i;:::-;40640:149;;;;-1:-1:-1;;;40640:149:0;;;;;;;:::i;37582:469::-;37700:13;37753:16;37761:7;37753;:16::i;:::-;37731:113;;;;-1:-1:-1;;;37731:113:0;;20401:2:1;37731:113:0;;;20383:21:1;20440:2;20420:18;;;20413:30;20479:34;20459:18;;;20452:62;-1:-1:-1;;;20530:18:1;;;20523:45;20585:19;;37731:113:0;20199:411:1;37731:113:0;37857:21;37881:10;:8;:10::i;:::-;37857:34;;37928:7;37922:21;37947:1;37922:26;;:121;;;;;;;;;;;;;;;;;37992:7;38001:18;:7;:16;:18::i;:::-;37975:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37922:121;37902:141;37582:469;-1:-1:-1;;;37582:469:0:o;39680:214::-;-1:-1:-1;;;;;39851:25:0;;;39822:4;39851:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;39680:214::o;15346:238::-;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15449:22:0;::::1;15427:110;;;::::0;-1:-1:-1;;;15427:110:0;;11956:2:1;15427:110:0::1;::::0;::::1;11938:21:1::0;11995:2;11975:18;;;11968:30;12034:34;12014:18;;;12007:62;-1:-1:-1;;;12085:18:1;;;12078:36;12131:19;;15427:110:0::1;11754:402:1::0;15427:110:0::1;15548:28;15567:8;15548:18;:28::i;60300:102::-:0;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;60379:15:::1;::::0;;-1:-1:-1;;60360:34:0;::::1;60379:15;::::0;;;::::1;;;60378:16;60360:34:::0;;::::1;;::::0;;60300:102::o;57780:181::-;14510:6;;-1:-1:-1;;;;;14510:6:0;13275:10;14657:23;14649:68;;;;-1:-1:-1;;;14649:68:0;;;;;;;:::i;:::-;57355:5:::1;57869:8;57853:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;57845:66;;;;-1:-1:-1::0;;;57845:66:0::1;;;;;;;:::i;:::-;57922:31;57932:10;57944:8;57922:9;:31::i;41052:126::-:0;41109:4;41143:12;;41133:7;:22;:37;;;;-1:-1:-1;;41159:11:0;;;41052:126::o;46230:196::-;46345:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;46345:29:0;-1:-1:-1;;;;;46345:29:0;;;;;;;;;46390:28;;46345:24;;46390:28;;;;;;;46230:196;;;:::o;5703:179::-;5761:7;;5793:5;5797:1;5793;:5;:::i;:::-;5781:17;;5822:1;5817;:6;;5809:46;;;;-1:-1:-1;;;5809:46:0;;13467:2:1;5809:46:0;;;13449:21:1;13506:2;13486:18;;;13479:30;13545:29;13525:18;;;13518:57;13592:18;;5809:46:0;13265:351:1;6582:220:0;6640:7;6664:6;6660:20;;-1:-1:-1;6679:1:0;6672:8;;6660:20;6691:9;6703:5;6707:1;6703;:5;:::i;:::-;6691:17;-1:-1:-1;6736:1:0;6727:5;6731:1;6691:17;6727:5;:::i;:::-;:10;6719:56;;;;-1:-1:-1;;;6719:56:0;;18886:2:1;6719:56:0;;;18868:21:1;18925:2;18905:18;;;18898:30;18964:34;18944:18;;;18937:62;-1:-1:-1;;;19015:18:1;;;19008:31;19056:19;;6719:56:0;18684:397:1;7280:153:0;7338:7;7370:1;7366;:5;7358:44;;;;-1:-1:-1;;;7358:44:0;;17341:2:1;7358:44:0;;;17323:21:1;17380:2;17360:18;;;17353:30;17419:28;17399:18;;;17392:56;17465:18;;7358:44:0;17139:350:1;7358:44:0;7420:5;7424:1;7420;:5;:::i;6165:158::-;6223:7;6256:1;6251;:6;;6243:49;;;;-1:-1:-1;;;6243:49:0;;15443:2:1;6243:49:0;;;15425:21:1;15482:2;15462:18;;;15455:30;15521:32;15501:18;;;15494:60;15571:18;;6243:49:0;15241:354:1;6243:49:0;6310:5;6314:1;6310;:5;:::i;18028:391::-;18157:6;18132:21;:31;;18110:110;;;;-1:-1:-1;;;18110:110:0;;16571:2:1;18110:110:0;;;16553:21:1;16610:2;16590:18;;;16583:30;16649:31;16629:18;;;16622:59;16698:18;;18110:110:0;16369:353:1;18110:110:0;18234:12;18252:9;-1:-1:-1;;;;;18252:14:0;18274:6;18252:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18233:52;;;18318:7;18296:115;;;;-1:-1:-1;;;18296:115:0;;15802:2:1;18296:115:0;;;15784:21:1;15841:2;15821:18;;;15814:30;15880:34;15860:18;;;15853:62;15951:28;15931:18;;;15924:56;15997:19;;18296:115:0;15600:422:1;44010:2102:0;44125:35;44163:20;44175:7;44163:11;:20::i;:::-;44238:18;;44125:58;;-1:-1:-1;44196:22:0;;-1:-1:-1;;;;;44222:34:0;13275:10;-1:-1:-1;;;;;44222:34:0;;:87;;;-1:-1:-1;13275:10:0;44273:20;44285:7;44273:11;:20::i;:::-;-1:-1:-1;;;;;44273:36:0;;44222:87;:154;;;-1:-1:-1;44343:18:0;;44326:50;;13275:10;39680:214;:::i;44326:50::-;44196:181;;44412:17;44390:117;;;;-1:-1:-1;;;44390:117:0;;21172:2:1;44390:117:0;;;21154:21:1;21211:2;21191:18;;;21184:30;21250:34;21230:18;;;21223:62;-1:-1:-1;;;21301:18:1;;;21294:48;21359:19;;44390:117:0;20970:414:1;44390:117:0;44564:4;-1:-1:-1;;;;;44542:26:0;:13;:18;;;-1:-1:-1;;;;;44542:26:0;;44520:114;;;;-1:-1:-1;;;44520:114:0;;19288:2:1;44520:114:0;;;19270:21:1;19327:2;19307:18;;;19300:30;19366:34;19346:18;;;19339:62;-1:-1:-1;;;19417:18:1;;;19410:36;19463:19;;44520:114:0;19086:402:1;44520:114:0;-1:-1:-1;;;;;44653:16:0;;44645:66;;;;-1:-1:-1;;;44645:66:0;;14634:2:1;44645:66:0;;;14616:21:1;14673:2;14653:18;;;14646:30;14712:34;14692:18;;;14685:62;-1:-1:-1;;;14763:18:1;;;14756:35;14808:19;;44645:66:0;14432:401:1;44645:66:0;44832:49;44849:1;44853:7;44862:13;:18;;;44832:8;:49::i;:::-;-1:-1:-1;;;;;45177:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;;;;;45177:31:0;;;-1:-1:-1;;;;;45177:31:0;;;-1:-1:-1;;45177:31:0;;;;;;;45223:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;45223:29:0;;;;;;;;;;;;;45269:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;45314:61:0;;;;-1:-1:-1;;;45359:15:0;-1:-1:-1;;;;;45314:61:0;;;;;45649:11;;;45679:24;;;;;:29;45649:11;;45679:29;45675:321;;45747:20;45755:11;45747:7;:20::i;:::-;45743:238;;;45824:18;;;45792:24;;;:11;:24;;;;;;;;:50;;45907:54;;;;-1:-1:-1;;;;;45865:96:0;-1:-1:-1;;;45865:96:0;-1:-1:-1;;;;;;45865:96:0;;;-1:-1:-1;;;;;45792:50:0;;;45865:96;;;;;;;45743:238;45152:855;46043:7;46039:2;-1:-1:-1;;;;;46024:27:0;46033:4;-1:-1:-1;;;;;46024:27:0;;;;;;;;;;;46062:42;44114:1998;;44010:2102;;;:::o;41186:104::-;41255:27;41265:2;41269:8;41255:27;;;;;;;;;;;;:9;:27::i;:::-;41186:104;;:::o;55365:190::-;55490:4;55543;55514:25;55527:5;55534:4;55514:12;:25::i;:::-;:33;;55365:190;-1:-1:-1;;;;55365:190:0:o;36417:568::-;-1:-1:-1;;;;;;;;;;;;;;;;;36552:16:0;36560:7;36552;:16::i;:::-;36544:71;;;;-1:-1:-1;;;36544:71:0;;13056:2:1;36544:71:0;;;13038:21:1;13095:2;13075:18;;;13068:30;13134:34;13114:18;;;13107:62;-1:-1:-1;;;13185:18:1;;;13178:40;13235:19;;36544:71:0;12854:406:1;36544:71:0;36673:7;36653:244;36682:8;;36653:244;;36719:31;36753:17;;;:11;:17;;;;;;;;;36719:51;;;;;;;;;-1:-1:-1;;;;;36719:51:0;;;;;-1:-1:-1;;;36719:51:0;;;-1:-1:-1;;;;;36719:51:0;;;;;;;;36793:28;36789:93;;36853:9;36417:568;-1:-1:-1;;;36417:568:0:o;36789:93::-;-1:-1:-1;;;36692:6:0;36653:244;;;-1:-1:-1;36920:57:0;;-1:-1:-1;;;36920:57:0;;25431:2:1;36920:57:0;;;25413:21:1;25470:2;25450:18;;;25443:30;25509:34;25489:18;;;25482:62;-1:-1:-1;;;25560:18:1;;;25553:45;25615:19;;36920:57:0;25229:411:1;53660:551:0;-1:-1:-1;;;;;53755:21:0;;53733:115;;;;-1:-1:-1;;;53733:115:0;;11543:2:1;53733:115:0;;;11525:21:1;11582:2;11562:18;;;11555:30;11621:34;11601:18;;;11594:62;-1:-1:-1;;;11672:18:1;;;11665:42;11724:19;;53733:115:0;11341:408:1;53733:115:0;53877:1;53867:7;:11;53859:53;;;;-1:-1:-1;;;53859:53:0;;26616:2:1;53859:53:0;;;26598:21:1;26655:2;26635:18;;;26628:30;26694:31;26674:18;;;26667:59;26743:18;;53859:53:0;26414:353:1;53859:53:0;-1:-1:-1;;;;;53945:16:0;;;;;;:7;:16;;;;;;:21;53923:114;;;;-1:-1:-1;;;53923:114:0;;25019:2:1;53923:114:0;;;25001:21:1;25058:2;25038:18;;;25031:30;25097:34;25077:18;;;25070:62;-1:-1:-1;;;25148:18:1;;;25141:41;25199:19;;53923:114:0;24817:407:1;53923:114:0;54050:7;:21;;;;;;;;;;;;-1:-1:-1;;;;;;54050:21:0;-1:-1:-1;;;;;54050:21:0;;;;;;;;-1:-1:-1;54082:16:0;;;:7;54050:21;54082:16;;;;:26;;;54134:12;;:25;;54082:26;54134:16;:25::i;:::-;54119:12;:40;54175:28;;;-1:-1:-1;;;;;9527:32:1;;9509:51;;9591:2;9576:18;;9569:34;;;54175:28:0;;9482:18:1;54175:28:0;;;;;;;53660:551;;:::o;15744:191::-;15837:6;;;-1:-1:-1;;;;;15854:17:0;;;-1:-1:-1;;;;;;15854:17:0;;;;;;;15887:40;;15837:6;;;15854:17;15837:6;;15887:40;;15818:16;;15887:40;15807:128;15744:191;:::o;46991:985::-;47146:4;-1:-1:-1;;;;;47167:13:0;;17029:20;17077:8;47163:806;;47220:175;;-1:-1:-1;;;47220:175:0;;-1:-1:-1;;;;;47220:36:0;;;;;:175;;13275:10;;47314:4;;47341:7;;47371:5;;47220:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47220:175:0;;;;;;;;-1:-1:-1;;47220:175:0;;;;;;;;;;;;:::i;:::-;;;47199:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47582:13:0;;47578:321;;47625:109;;-1:-1:-1;;;47625:109:0;;;;;;;:::i;47578:321::-;47849:6;47843:13;47834:6;47830:2;47826:15;47819:38;47199:715;-1:-1:-1;;;;;;47459:55:0;-1:-1:-1;;;47459:55:0;;-1:-1:-1;47452:62:0;;47163:806;-1:-1:-1;47953:4:0;47163:806;46991:985;;;;;;:::o;59840:114::-;59900:13;59933;59926:20;;;;;:::i;10781:723::-;10837:13;11058:10;11054:53;;-1:-1:-1;;11085:10:0;;;;;;;;;;;;-1:-1:-1;;;11085:10:0;;;;;10781:723::o;11054:53::-;11132:5;11117:12;11173:78;11180:9;;11173:78;;11206:8;;;;:::i;:::-;;-1:-1:-1;11229:10:0;;-1:-1:-1;11237:2:0;11229:10;;:::i;:::-;;;11173:78;;;11261:19;11293:6;-1:-1:-1;;;;;11283:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11283:17:0;;11261:39;;11311:154;11318:10;;11311:154;;11345:11;11355:1;11345:11;;:::i;:::-;;-1:-1:-1;11414:10:0;11422:2;11414:5;:10;:::i;:::-;11401:24;;:2;:24;:::i;:::-;11388:39;;11371:6;11378;11371:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11371:56:0;;;;;;;;-1:-1:-1;11442:11:0;11451:2;11442:11;;:::i;:::-;;;11311:154;;41653:163;41776:32;41782:2;41786:8;41796:5;41803:4;41776:5;:32::i;55916:707::-;56026:7;56074:4;56026:7;56089:497;56113:5;:12;56109:1;:16;56089:497;;;56147:20;56170:5;56176:1;56170:8;;;;;;;;:::i;:::-;;;;;;;56147:31;;56213:12;56197;:28;56193:382;;56726:13;56781:15;;;56817:4;56810:15;;;56864:4;56848:21;;56325:57;;56193:382;;;56726:13;56781:15;;;56817:4;56810:15;;;56864:4;56848:21;;56502:57;;56193:382;-1:-1:-1;56127:3:0;;;;:::i;:::-;;;;56089:497;;;-1:-1:-1;56603:12:0;55916:707;-1:-1:-1;;;55916:707:0:o;42075:1681::-;42214:20;42237:12;-1:-1:-1;;;;;42268:16:0;;42260:62;;;;-1:-1:-1;;;42260:62:0;;23865:2:1;42260:62:0;;;23847:21:1;23904:2;23884:18;;;23877:30;23943:34;23923:18;;;23916:62;-1:-1:-1;;;23994:18:1;;;23987:31;24035:19;;42260:62:0;23663:397:1;42260:62:0;42341:13;42333:66;;;;-1:-1:-1;;;42333:66:0;;24267:2:1;42333:66:0;;;24249:21:1;24306:2;24286:18;;;24279:30;24345:34;24325:18;;;24318:62;-1:-1:-1;;;24396:18:1;;;24389:38;24444:19;;42333:66:0;24065:404:1;42333:66:0;-1:-1:-1;;;;;42751:16:0;;;;;;:12;:16;;;;;;;;:45;;-1:-1:-1;;;;;;;;;42751:45:0;;-1:-1:-1;;;;;42751:45:0;;;;;;;;;;42811:50;;;;;;;;;;;;;;42878:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;42928:66:0;;;;-1:-1:-1;;;42978:15:0;-1:-1:-1;;;;;42928:66:0;;;;;;42878:25;;43063:558;43083:8;43079:1;:12;43063:558;;;43122:38;;43147:12;;-1:-1:-1;;;;;43122:38:0;;;43139:1;;43122:38;;43139:1;;43122:38;43183:4;43179:392;;;43246:202;43307:1;43340:2;43373:12;43416:5;43246:22;:202::i;:::-;43212:339;;;;-1:-1:-1;;;43212:339:0;;;;;;;:::i;:::-;43591:14;;;;;43093:3;43063:558;;;-1:-1:-1;43637:12:0;:27;43688:60;58543:758;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:367:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;-1:-1:-1;;;;;214:30:1;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:673::-;440:5;493:3;486:4;478:6;474:17;470:27;460:55;;511:1;508;501:12;460:55;547:6;534:20;573:4;597:60;613:43;653:2;613:43;:::i;:::-;597:60;:::i;:::-;679:3;703:2;698:3;691:15;731:2;726:3;722:12;715:19;;766:2;758:6;754:15;818:3;813:2;807;804:1;800:10;792:6;788:23;784:32;781:41;778:61;;;835:1;832;825:12;778:61;857:1;867:163;881:2;878:1;875:9;867:163;;;938:17;;926:30;;976:12;;;;1008;;;;899:1;892:9;867:163;;;-1:-1:-1;1048:5:1;;386:673;-1:-1:-1;;;;;;;386:673:1:o;1064:247::-;1123:6;1176:2;1164:9;1155:7;1151:23;1147:32;1144:52;;;1192:1;1189;1182:12;1144:52;1231:9;1218:23;1250:31;1275:5;1250:31;:::i;1576:388::-;1644:6;1652;1705:2;1693:9;1684:7;1680:23;1676:32;1673:52;;;1721:1;1718;1711:12;1673:52;1760:9;1747:23;1779:31;1804:5;1779:31;:::i;:::-;1829:5;-1:-1:-1;1886:2:1;1871:18;;1858:32;1899:33;1858:32;1899:33;:::i;:::-;1951:7;1941:17;;;1576:388;;;;;:::o;1969:456::-;2046:6;2054;2062;2115:2;2103:9;2094:7;2090:23;2086:32;2083:52;;;2131:1;2128;2121:12;2083:52;2170:9;2157:23;2189:31;2214:5;2189:31;:::i;:::-;2239:5;-1:-1:-1;2296:2:1;2281:18;;2268:32;2309:33;2268:32;2309:33;:::i;:::-;1969:456;;2361:7;;-1:-1:-1;;;2415:2:1;2400:18;;;;2387:32;;1969:456::o;2430:1108::-;2525:6;2533;2541;2549;2602:3;2590:9;2581:7;2577:23;2573:33;2570:53;;;2619:1;2616;2609:12;2570:53;2658:9;2645:23;2677:31;2702:5;2677:31;:::i;:::-;2727:5;-1:-1:-1;2751:2:1;2790:18;;;2777:32;2818:33;2777:32;2818:33;:::i;:::-;2870:7;-1:-1:-1;2924:2:1;2909:18;;2896:32;;-1:-1:-1;2979:2:1;2964:18;;2951:32;-1:-1:-1;;;;;3032:14:1;;;3029:34;;;3059:1;3056;3049:12;3029:34;3097:6;3086:9;3082:22;3072:32;;3142:7;3135:4;3131:2;3127:13;3123:27;3113:55;;3164:1;3161;3154:12;3113:55;3200:2;3187:16;3222:2;3218;3215:10;3212:36;;;3228:18;;:::i;:::-;3270:53;3313:2;3294:13;;-1:-1:-1;;3290:27:1;3286:36;;3270:53;:::i;:::-;3257:66;;3346:2;3339:5;3332:17;3386:7;3381:2;3376;3372;3368:11;3364:20;3361:33;3358:53;;;3407:1;3404;3397:12;3358:53;3462:2;3457;3453;3449:11;3444:2;3437:5;3433:14;3420:45;3506:1;3501:2;3496;3489:5;3485:14;3481:23;3474:34;;3527:5;3517:15;;;;;2430:1108;;;;;;;:::o;3543:416::-;3608:6;3616;3669:2;3657:9;3648:7;3644:23;3640:32;3637:52;;;3685:1;3682;3675:12;3637:52;3724:9;3711:23;3743:31;3768:5;3743:31;:::i;:::-;3793:5;-1:-1:-1;3850:2:1;3835:18;;3822:32;3892:15;;3885:23;3873:36;;3863:64;;3923:1;3920;3913:12;3964:315;4032:6;4040;4093:2;4081:9;4072:7;4068:23;4064:32;4061:52;;;4109:1;4106;4099:12;4061:52;4148:9;4135:23;4167:31;4192:5;4167:31;:::i;:::-;4217:5;4269:2;4254:18;;;;4241:32;;-1:-1:-1;;;3964:315:1:o;4284:1226::-;4402:6;4410;4463:2;4451:9;4442:7;4438:23;4434:32;4431:52;;;4479:1;4476;4469:12;4431:52;4519:9;4506:23;-1:-1:-1;;;;;4589:2:1;4581:6;4578:14;4575:34;;;4605:1;4602;4595:12;4575:34;4643:6;4632:9;4628:22;4618:32;;4688:7;4681:4;4677:2;4673:13;4669:27;4659:55;;4710:1;4707;4700:12;4659:55;4746:2;4733:16;4768:4;4792:60;4808:43;4848:2;4808:43;:::i;4792:60::-;4874:3;4898:2;4893:3;4886:15;4926:2;4921:3;4917:12;4910:19;;4957:2;4953;4949:11;5005:7;5000:2;4994;4991:1;4987:10;4983:2;4979:19;4975:28;4972:41;4969:61;;;5026:1;5023;5016:12;4969:61;5048:1;5039:10;;5058:238;5072:2;5069:1;5066:9;5058:238;;;5143:3;5130:17;5160:31;5185:5;5160:31;:::i;:::-;5204:18;;5090:1;5083:9;;;;;5242:12;;;;5274;;5058:238;;;-1:-1:-1;5315:5:1;-1:-1:-1;;5358:18:1;;5345:32;;-1:-1:-1;;5389:16:1;;;5386:36;;;5418:1;5415;5408:12;5386:36;;5441:63;5496:7;5485:8;5474:9;5470:24;5441:63;:::i;:::-;5431:73;;;4284:1226;;;;;:::o;5515:437::-;5601:6;5609;5662:2;5650:9;5641:7;5637:23;5633:32;5630:52;;;5678:1;5675;5668:12;5630:52;5718:9;5705:23;-1:-1:-1;;;;;5743:6:1;5740:30;5737:50;;;5783:1;5780;5773:12;5737:50;5822:70;5884:7;5875:6;5864:9;5860:22;5822:70;:::i;:::-;5911:8;;5796:96;;-1:-1:-1;5515:437:1;-1:-1:-1;;;;5515:437:1:o;5957:505::-;6052:6;6060;6068;6121:2;6109:9;6100:7;6096:23;6092:32;6089:52;;;6137:1;6134;6127:12;6089:52;6177:9;6164:23;-1:-1:-1;;;;;6202:6:1;6199:30;6196:50;;;6242:1;6239;6232:12;6196:50;6281:70;6343:7;6334:6;6323:9;6319:22;6281:70;:::i;:::-;6370:8;;6255:96;;-1:-1:-1;6452:2:1;6437:18;;;;6424:32;;5957:505;-1:-1:-1;;;;5957:505:1:o;6467:180::-;6526:6;6579:2;6567:9;6558:7;6554:23;6550:32;6547:52;;;6595:1;6592;6585:12;6547:52;-1:-1:-1;6618:23:1;;6467:180;-1:-1:-1;6467:180:1:o;6652:245::-;6710:6;6763:2;6751:9;6742:7;6738:23;6734:32;6731:52;;;6779:1;6776;6769:12;6731:52;6818:9;6805:23;6837:30;6861:5;6837:30;:::i;6902:249::-;6971:6;7024:2;7012:9;7003:7;6999:23;6995:32;6992:52;;;7040:1;7037;7030:12;6992:52;7072:9;7066:16;7091:30;7115:5;7091:30;:::i;7156:592::-;7227:6;7235;7288:2;7276:9;7267:7;7263:23;7259:32;7256:52;;;7304:1;7301;7294:12;7256:52;7344:9;7331:23;-1:-1:-1;;;;;7414:2:1;7406:6;7403:14;7400:34;;;7430:1;7427;7420:12;7400:34;7468:6;7457:9;7453:22;7443:32;;7513:7;7506:4;7502:2;7498:13;7494:27;7484:55;;7535:1;7532;7525:12;7484:55;7575:2;7562:16;7601:2;7593:6;7590:14;7587:34;;;7617:1;7614;7607:12;7587:34;7662:7;7657:2;7648:6;7644:2;7640:15;7636:24;7633:37;7630:57;;;7683:1;7680;7673:12;7630:57;7714:2;7706:11;;;;;7736:6;;-1:-1:-1;7156:592:1;;-1:-1:-1;;;;7156:592:1:o;7938:257::-;7979:3;8017:5;8011:12;8044:6;8039:3;8032:19;8060:63;8116:6;8109:4;8104:3;8100:14;8093:4;8086:5;8082:16;8060:63;:::i;:::-;8177:2;8156:15;-1:-1:-1;;8152:29:1;8143:39;;;;8184:4;8139:50;;7938:257;-1:-1:-1;;7938:257:1:o;8434:470::-;8613:3;8651:6;8645:13;8667:53;8713:6;8708:3;8701:4;8693:6;8689:17;8667:53;:::i;:::-;8783:13;;8742:16;;;;8805:57;8783:13;8742:16;8839:4;8827:17;;8805:57;:::i;:::-;8878:20;;8434:470;-1:-1:-1;;;;8434:470:1:o;9614:488::-;-1:-1:-1;;;;;9883:15:1;;;9865:34;;9935:15;;9930:2;9915:18;;9908:43;9982:2;9967:18;;9960:34;;;10030:3;10025:2;10010:18;;10003:31;;;9808:4;;10051:45;;10076:19;;10068:6;10051:45;:::i;:::-;10043:53;9614:488;-1:-1:-1;;;;;;9614:488:1:o;10760:219::-;10909:2;10898:9;10891:21;10872:4;10929:44;10969:2;10958:9;10954:18;10946:6;10929:44;:::i;12161:340::-;12363:2;12345:21;;;12402:2;12382:18;;;12375:30;-1:-1:-1;;;12436:2:1;12421:18;;12414:46;12492:2;12477:18;;12161:340::o;19838:356::-;20040:2;20022:21;;;20059:18;;;20052:30;20118:34;20113:2;20098:18;;20091:62;20185:2;20170:18;;19838:356::o;22893:415::-;23095:2;23077:21;;;23134:2;23114:18;;;23107:30;23173:34;23168:2;23153:18;;23146:62;-1:-1:-1;;;23239:2:1;23224:18;;23217:49;23298:3;23283:19;;22893:415::o;26954:275::-;27025:2;27019:9;27090:2;27071:13;;-1:-1:-1;;27067:27:1;27055:40;;-1:-1:-1;;;;;27110:34:1;;27146:22;;;27107:62;27104:88;;;27172:18;;:::i;:::-;27208:2;27201:22;26954:275;;-1:-1:-1;26954:275:1:o;27234:183::-;27294:4;-1:-1:-1;;;;;27319:6:1;27316:30;27313:56;;;27349:18;;:::i;:::-;-1:-1:-1;27394:1:1;27390:14;27406:4;27386:25;;27234:183::o;27422:128::-;27462:3;27493:1;27489:6;27486:1;27483:13;27480:39;;;27499:18;;:::i;:::-;-1:-1:-1;27535:9:1;;27422:128::o;27555:120::-;27595:1;27621;27611:35;;27626:18;;:::i;:::-;-1:-1:-1;27660:9:1;;27555:120::o;27680:168::-;27720:7;27786:1;27782;27778:6;27774:14;27771:1;27768:21;27763:1;27756:9;27749:17;27745:45;27742:71;;;27793:18;;:::i;:::-;-1:-1:-1;27833:9:1;;27680:168::o;27853:125::-;27893:4;27921:1;27918;27915:8;27912:34;;;27926:18;;:::i;:::-;-1:-1:-1;27963:9:1;;27853:125::o;27983:258::-;28055:1;28065:113;28079:6;28076:1;28073:13;28065:113;;;28155:11;;;28149:18;28136:11;;;28129:39;28101:2;28094:10;28065:113;;;28196:6;28193:1;28190:13;28187:48;;;-1:-1:-1;;28231:1:1;28213:16;;28206:27;27983:258::o;28246:380::-;28325:1;28321:12;;;;28368;;;28389:61;;28443:4;28435:6;28431:17;28421:27;;28389:61;28496:2;28488:6;28485:14;28465:18;28462:38;28459:161;;;28542:10;28537:3;28533:20;28530:1;28523:31;28577:4;28574:1;28567:15;28605:4;28602:1;28595:15;28459:161;;28246:380;;;:::o;28631:135::-;28670:3;-1:-1:-1;;28691:17:1;;28688:43;;;28711:18;;:::i;:::-;-1:-1:-1;28758:1:1;28747:13;;28631:135::o;28771:112::-;28803:1;28829;28819:35;;28834:18;;:::i;:::-;-1:-1:-1;28868:9:1;;28771:112::o;28888:127::-;28949:10;28944:3;28940:20;28937:1;28930:31;28980:4;28977:1;28970:15;29004:4;29001:1;28994:15;29020:127;29081:10;29076:3;29072:20;29069:1;29062:31;29112:4;29109:1;29102:15;29136:4;29133:1;29126:15;29152:127;29213:10;29208:3;29204:20;29201:1;29194:31;29244:4;29241:1;29234:15;29268:4;29265:1;29258:15;29284:127;29345:10;29340:3;29336:20;29333:1;29326:31;29376:4;29373:1;29366:15;29400:4;29397:1;29390:15;29416:131;-1:-1:-1;;;;;29491:31:1;;29481:42;;29471:70;;29537:1;29534;29527:12;29552:131;-1:-1:-1;;;;;;29626:32:1;;29616:43;;29606:71;;29673:1;29670;29663:12

Swarm Source

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