ETH Price: $3,289.89 (-5.03%)

Token

MetaHelmet (MTAH)
 

Overview

Max Total Supply

5,672 MTAH

Holders

2,625

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 MTAH
0x4209abe5c692da9177e3d013d364bced1ed1c418
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The M.T.A. is on a mission to explore and protect the internet’s new frontier: The Metaverse.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Metahelmet

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**  
 * 
 * Metaverse Travel Agency
 * =======================
 * https://themta.io
 * twiter: @themtaofficial
 *
 * MetaHelmet
 * ----------
 */


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

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


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

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


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

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


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


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


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

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

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

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

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

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

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

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

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

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

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

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

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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;


    string private baseURI = "";

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _setBaseURI(string memory baseURI_) internal {
        baseURI = baseURI_;
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



contract Metahelmet is ERC721Enumerable, Ownable {

    using SafeMath for uint256;

    string public METAHELMET_PROVENANCE = "";
 
    uint256 public constant PRICE = 101010000000000000;

    uint256 public constant MAX_METAHELMETS = 10101;

    uint256 public constant MAX_PURCHASE = 7;

    bool public saleIsActive = false;

    mapping (address => uint256) public whitelistMinted;

    address public WHITELIST_SIGNER;

    event Merge(uint256 indexed tokenId, address indexed nftContract, uint256 indexed nftId);

    event Unmerge(uint256 indexed tokenId);

    constructor() ERC721("MetaHelmet", "MTAH") {}

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

    function toggleSale() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function setWhiteListSigner(address signer) public onlyOwner {
        WHITELIST_SIGNER = signer;
    }

    /**
     * Set some Metahelmets aside
     */
    function reserveMetahelmets() public onlyOwner {     
        require(saleIsActive == false, "Impossible reserve a Metahelmet when sale is active");   
        uint supply = totalSupply();
        for (uint i = 0; i < 21; i++) {
            _safeMint(_msgSender(), supply + i);
        }
    }

    /**
    * Mint Metahelmet
    */
    function mintMetahelmet(uint256 numberOfTokens) public payable {
        require(saleIsActive, "Sale must be active to mint Metahelmet");
        require(numberOfTokens <= MAX_PURCHASE, "Can only mint 7 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= MAX_METAHELMETS, "Purchase would exceed max supply of Metahelmets");
        require(PRICE.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");
        
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_METAHELMETS) {
                _safeMint(_msgSender(), mintIndex);
            }
        }
    }

    /**
     * PreMint: Only people in whitelist can mint
     */
    function preMintMetahelmet(uint256 numberOfTokens, uint max, bytes memory signature) public payable {
        bytes32 hash;
        require(WHITELIST_SIGNER != address(0), "Pre-Mint is not available yet");
        require(saleIsActive == false, "Impossible Pre-Mint a Matahelmet when sale is active");   
        require(numberOfTokens <= MAX_PURCHASE, "Can only mint 7 tokens at a time");
        require(totalSupply().add(numberOfTokens) <= MAX_METAHELMETS, "Purchase would exceed max supply of Metahelmets");
        require(PRICE.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");

        /*
         * keccak256(address,number);
         */
        hash = keccak256(abi.encodePacked(_msgSender(), max));

        /*
         * Check Signature
         */ 
        require(recover(hash,signature) == WHITELIST_SIGNER, "Invalid Signature");

        /*
         * Check max min reached
         */ 
        require(whitelistMinted[_msgSender()].add(numberOfTokens) <= max, "Max mint reached");

        /*
         * Update total minted in preMint state
         */
        whitelistMinted[_msgSender()] = whitelistMinted[_msgSender()].add(numberOfTokens);

        uint supply = totalSupply();
        for(uint i = 0; i < numberOfTokens; i++) {
            _safeMint(_msgSender(), supply+i);
        }
    }

    /**      
     * Set provenance once it's calculated
     */
    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        METAHELMET_PROVENANCE = provenanceHash;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }

    function merge(uint256 _tokenId, IERC721 _nftContract, uint256 _nftId) public {
        require(ownerOf(_tokenId) == _msgSender(), "Only owner can merge tokens");
        require(_nftContract.ownerOf(_nftId) == _msgSender(), "Only owner can merge tokens");
    
        emit Merge(_tokenId, address(_nftContract), _nftId);
    }

    function unmerge(uint256 _tokenId) public {
        require(ownerOf(_tokenId) == _msgSender(), "Only owner can unmerge tokens");
        emit Unmerge(_tokenId);
    }

    function recover(bytes32 _hash, bytes memory _signed) internal pure returns(address) {
        bytes32 r;
        bytes32 s;
        uint8 v;
        
        assembly {
            r:= mload(add(_signed,32))
            s:= mload(add(_signed,64))
            v:= and(mload(add(_signed,65)) ,255)
        }
        return ecrecover(_hash,v,r,s);
    } 
}

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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"nftContract","type":"address"},{"indexed":true,"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"Merge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Unmerge","type":"event"},{"inputs":[],"name":"MAX_METAHELMETS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METAHELMET_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SIGNER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"contract IERC721","name":"_nftContract","type":"address"},{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintMetahelmet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"preMintMetahelmet","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveMetahelmets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setWhiteListSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unmerge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600290805190602001906200002b92919062000211565b5060405180602001604052806000815250600c90805190602001906200005392919062000211565b506000600d60006101000a81548160ff0219169083151502179055503480156200007c57600080fd5b506040518060400160405280600a81526020017f4d65746148656c6d6574000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d5441480000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010192919062000211565b5080600190805190602001906200011a92919062000211565b5050506200013d620001316200014360201b60201c565b6200014b60201b60201c565b62000326565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021f90620002c1565b90600052602060002090601f0160209004810192826200024357600085556200028f565b82601f106200025e57805160ff19168380011785556200028f565b828001600101855582156200028f579182015b828111156200028e57825182559160200191906001019062000271565b5b5090506200029e9190620002a2565b5090565b5b80821115620002bd576000816000905550600101620002a3565b5090565b60006002820490506001821680620002da57607f821691505b60208210811415620002f157620002f0620002f7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614e8780620003366000396000f3fe60806040526004361061020f5760003560e01c806370a08231116101185780639d74e820116100a0578063ce2634901161006f578063ce26349014610759578063e985e9c514610782578063eb8d2444146107bf578063f2fde38b146107ea578063fa971a0a146108135761020f565b80639d74e820146106a1578063a22cb465146106ca578063b88d4fde146106f3578063c87b56dd1461071c5761020f565b806384bdb6e0116100e757806384bdb6e0146105ba5780638d859f3e146105e35780638da5cb5b1461060e57806395d89b411461063957806398a8cffe146106645761020f565b806370a08231146105245780637146bd0814610561578063715018a61461058c5780637d8966e4146105a35761020f565b80633ccfd60b1161019b5780634f6ccce71161016a5780634f6ccce71461043a57806355f804b3146104775780636352211e146104a0578063665e7203146104dd5780636c89bc8d146104f95761020f565b80633ccfd60b146103b8578063417b9483146103cf57806342842e0e146103fa5780634d2a1b19146104235761020f565b806310969523116101e257806310969523146102e257806318160ddd1461030b57806323b872dd146103365780632f4eb8611461035f5780632f745c591461037b5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613760565b61083e565b6040516102489190614510565b60405180910390f35b34801561025d57600080fd5b506102666108b8565b6040516102739190614570565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906137f3565b61094a565b6040516102b091906144a9565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613724565b6109cf565b005b3480156102ee57600080fd5b50610309600480360381019061030491906137b2565b610ae7565b005b34801561031757600080fd5b50610320610b7d565b60405161032d9190614932565b60405180910390f35b34801561034257600080fd5b5061035d6004803603810190610358919061361e565b610b8a565b005b610379600480360381019061037491906137f3565b610bea565b005b34801561038757600080fd5b506103a2600480360381019061039d9190613724565b610d8a565b6040516103af9190614932565b60405180910390f35b3480156103c457600080fd5b506103cd610e2f565b005b3480156103db57600080fd5b506103e4610f07565b6040516103f191906144a9565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c919061361e565b610f2d565b005b34801561042f57600080fd5b50610438610f4d565b005b34801561044657600080fd5b50610461600480360381019061045c91906137f3565b61106a565b60405161046e9190614932565b60405180910390f35b34801561048357600080fd5b5061049e600480360381019061049991906137b2565b611101565b005b3480156104ac57600080fd5b506104c760048036038101906104c291906137f3565b611189565b6040516104d491906144a9565b60405180910390f35b6104f760048036038101906104f2919061386b565b61123b565b005b34801561050557600080fd5b5061050e61167a565b60405161051b9190614570565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190613590565b611708565b6040516105589190614932565b60405180910390f35b34801561056d57600080fd5b506105766117c0565b6040516105839190614932565b60405180910390f35b34801561059857600080fd5b506105a16117c5565b005b3480156105af57600080fd5b506105b861184d565b005b3480156105c657600080fd5b506105e160048036038101906105dc9190613590565b6118f5565b005b3480156105ef57600080fd5b506105f86119b5565b6040516106059190614932565b60405180910390f35b34801561061a57600080fd5b506106236119c1565b60405161063091906144a9565b60405180910390f35b34801561064557600080fd5b5061064e6119eb565b60405161065b9190614570565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613590565b611a7d565b6040516106989190614932565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c3919061381c565b611a95565b005b3480156106d657600080fd5b506106f160048036038101906106ec91906136e8565b611c59565b005b3480156106ff57600080fd5b5061071a6004803603810190610715919061366d565b611dda565b005b34801561072857600080fd5b50610743600480360381019061073e91906137f3565b611e3c565b6040516107509190614570565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b91906137f3565b611ee4565b005b34801561078e57600080fd5b506107a960048036038101906107a491906135e2565b611f91565b6040516107b69190614510565b60405180910390f35b3480156107cb57600080fd5b506107d4612025565b6040516107e19190614510565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190613590565b612038565b005b34801561081f57600080fd5b50610828612130565b6040516108359190614932565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b157506108b082612136565b5b9050919050565b6060600080546108c790614c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546108f390614c2a565b80156109405780601f1061091557610100808354040283529160200191610940565b820191906000526020600020905b81548152906001019060200180831161092357829003601f168201915b5050505050905090565b600061095582612218565b610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b90614772565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109da82611189565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4290614832565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a6a612284565b73ffffffffffffffffffffffffffffffffffffffff161480610a995750610a9881610a93612284565b611f91565b5b610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf906146f2565b60405180910390fd5b610ae2838361228c565b505050565b610aef612284565b73ffffffffffffffffffffffffffffffffffffffff16610b0d6119c1565b73ffffffffffffffffffffffffffffffffffffffff1614610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a906147b2565b60405180910390fd5b80600c9080519060200190610b7992919061338a565b5050565b6000600980549050905090565b610b9b610b95612284565b82612345565b610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd190614892565b60405180910390fd5b610be5838383612423565b505050565b600d60009054906101000a900460ff16610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c30906148f2565b60405180910390fd5b6007811115610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c74906148d2565b60405180910390fd5b612775610c9a82610c8c610b7d565b61267f90919063ffffffff16565b1115610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290614692565b60405180910390fd5b34610cf782670166dc0f50c3200061269590919063ffffffff16565b1115610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f90614672565b60405180910390fd5b60005b81811015610d86576000610d4d610b7d565b9050612775610d5a610b7d565b1015610d7257610d71610d6b612284565b826126ab565b5b508080610d7e90614c5c565b915050610d3b565b5050565b6000610d9583611708565b8210610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90614592565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e37612284565b73ffffffffffffffffffffffffffffffffffffffff16610e556119c1565b73ffffffffffffffffffffffffffffffffffffffff1614610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea2906147b2565b60405180910390fd5b6000610eb5612284565b905060004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f02573d6000803e3d6000fd5b505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f4883838360405180602001604052806000815250611dda565b505050565b610f55612284565b73ffffffffffffffffffffffffffffffffffffffff16610f736119c1565b73ffffffffffffffffffffffffffffffffffffffff1614610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc0906147b2565b60405180910390fd5b60001515600d60009054906101000a900460ff1615151461101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690614912565b60405180910390fd5b6000611029610b7d565b905060005b601581101561106657611053611042612284565b828461104e9190614a36565b6126ab565b808061105e90614c5c565b91505061102e565b5050565b6000611074610b7d565b82106110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac906148b2565b60405180910390fd5b600982815481106110ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611109612284565b73ffffffffffffffffffffffffffffffffffffffff166111276119c1565b73ffffffffffffffffffffffffffffffffffffffff161461117d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611174906147b2565b60405180910390fd5b611186816126c9565b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122990614732565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590614852565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90614652565b60405180910390fd5b6007841115611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f906148d2565b60405180910390fd5b61277561138585611377610b7d565b61267f90919063ffffffff16565b11156113c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bd90614692565b60405180910390fd5b346113e285670166dc0f50c3200061269590919063ffffffff16565b1115611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a90614672565b60405180910390fd5b61142b612284565b8360405160200161143d929190614459565b604051602081830303815290604052805190602001209050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661149882846126e3565b73ffffffffffffffffffffffffffffffffffffffff16146114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590614792565b60405180910390fd5b8261154885600e60006114ff612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461267f90919063ffffffff16565b1115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090614872565b60405180910390fd5b6115e284600e6000611599612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461267f90919063ffffffff16565b600e60006115ee612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000611636610b7d565b905060005b858110156116725761165f61164e612284565b828461165a9190614a36565b6126ab565b808061166a90614c5c565b91505061163b565b505050505050565b600c805461168790614c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546116b390614c2a565b80156117005780601f106116d557610100808354040283529160200191611700565b820191906000526020600020905b8154815290600101906020018083116116e357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177090614712565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600781565b6117cd612284565b73ffffffffffffffffffffffffffffffffffffffff166117eb6119c1565b73ffffffffffffffffffffffffffffffffffffffff1614611841576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611838906147b2565b60405180910390fd5b61184b600061275b565b565b611855612284565b73ffffffffffffffffffffffffffffffffffffffff166118736119c1565b73ffffffffffffffffffffffffffffffffffffffff16146118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c0906147b2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6118fd612284565b73ffffffffffffffffffffffffffffffffffffffff1661191b6119c1565b73ffffffffffffffffffffffffffffffffffffffff1614611971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611968906147b2565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b670166dc0f50c3200081565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119fa90614c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2690614c2a565b8015611a735780601f10611a4857610100808354040283529160200191611a73565b820191906000526020600020905b815481529060010190602001808311611a5657829003601f168201915b5050505050905090565b600e6020528060005260406000206000915090505481565b611a9d612284565b73ffffffffffffffffffffffffffffffffffffffff16611abc84611189565b73ffffffffffffffffffffffffffffffffffffffff1614611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614812565b60405180910390fd5b611b1a612284565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611b699190614932565b60206040518083038186803b158015611b8157600080fd5b505afa158015611b95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb991906135b9565b73ffffffffffffffffffffffffffffffffffffffff1614611c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0690614812565b60405180910390fd5b808273ffffffffffffffffffffffffffffffffffffffff16847f605166ae6aadc5b8b03d67e8f6d83467a99c03d72a932587f17dfed34a23586f60405160405180910390a4505050565b611c61612284565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690614632565b60405180910390fd5b8060066000611cdc612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d89612284565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dce9190614510565b60405180910390a35050565b611deb611de5612284565b83612345565b611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190614892565b60405180910390fd5b611e3684848484612821565b50505050565b6060611e4782612218565b611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d906147f2565b60405180910390fd5b6000611e9061287d565b90506000815111611eb05760405180602001604052806000815250611edc565b6002611ebb8461290f565b604051602001611ecc929190614485565b6040516020818303038152906040525b915050919050565b611eec612284565b73ffffffffffffffffffffffffffffffffffffffff16611f0b82611189565b73ffffffffffffffffffffffffffffffffffffffff1614611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f58906146d2565b60405180910390fd5b807fd46896a90637bfb4400eda974dbcac4511eafd99999c27e2a46fb8b681781e3260405160405180910390a250565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b612040612284565b73ffffffffffffffffffffffffffffffffffffffff1661205e6119c1565b73ffffffffffffffffffffffffffffffffffffffff16146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab906147b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b906145d2565b60405180910390fd5b61212d8161275b565b50565b61277581565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061220157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612211575061221082612abc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122ff83611189565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061235082612218565b61238f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612386906146b2565b60405180910390fd5b600061239a83611189565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240957508373ffffffffffffffffffffffffffffffffffffffff166123f18461094a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061241a57506124198185611f91565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661244382611189565b73ffffffffffffffffffffffffffffffffffffffff1614612499576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612490906147d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090614612565b60405180910390fd5b612514838383612b26565b61251f60008261228c565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256f9190614b17565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c69190614a36565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361268d9190614a36565b905092915050565b600081836126a39190614abd565b905092915050565b6126c5828260405180602001604052806000815250612c3a565b5050565b80600290805190602001906126df92919061338a565b5050565b600080600080602085015192506040850151915060ff604186015116905060018682858560405160008152602001604052604051612724949392919061452b565b6020604051602081039080840390855afa158015612746573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61282c848484612423565b61283884848484612c95565b612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e906145b2565b60405180910390fd5b50505050565b60606002805461288c90614c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546128b890614c2a565b80156129055780601f106128da57610100808354040283529160200191612905565b820191906000526020600020905b8154815290600101906020018083116128e857829003601f168201915b5050505050905090565b60606000821415612957576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ab7565b600082905060005b6000821461298957808061297290614c5c565b915050600a826129829190614a8c565b915061295f565b60008167ffffffffffffffff8111156129cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129fd5781602001600182028036833780820191505090505b5090505b60008514612ab057600182612a169190614b17565b9150600a85612a259190614cd3565b6030612a319190614a36565b60f81b818381518110612a6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612aa99190614a8c565b9450612a01565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b31838383612e2c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7457612b6f81612e31565b612bb3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bb257612bb18382612e7a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf657612bf181612fe7565b612c35565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3457612c33828261312a565b5b5b505050565b612c4483836131a9565b612c516000848484612c95565b612c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c87906145b2565b60405180910390fd5b505050565b6000612cb68473ffffffffffffffffffffffffffffffffffffffff16613377565b15612e1f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cdf612284565b8786866040518563ffffffff1660e01b8152600401612d0194939291906144c4565b602060405180830381600087803b158015612d1b57600080fd5b505af1925050508015612d4c57506040513d601f19601f82011682018060405250810190612d499190613789565b60015b612dcf573d8060008114612d7c576040519150601f19603f3d011682016040523d82523d6000602084013e612d81565b606091505b50600081511415612dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbe906145b2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e24565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e8784611708565b612e919190614b17565b9050600060086000848152602001908152602001600020549050818114612f76576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612ffb9190614b17565b90506000600a6000848152602001908152602001600020549050600060098381548110613051577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110613099577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061310e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061313583611708565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321090614752565b60405180910390fd5b61322281612218565b15613262576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613259906145f2565b60405180910390fd5b61326e60008383612b26565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132be9190614a36565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461339690614c2a565b90600052602060002090601f0160209004810192826133b857600085556133ff565b82601f106133d157805160ff19168380011785556133ff565b828001600101855582156133ff579182015b828111156133fe5782518255916020019190600101906133e3565b5b50905061340c9190613410565b5090565b5b80821115613429576000816000905550600101613411565b5090565b600061344061343b8461497e565b61494d565b90508281526020810184848401111561345857600080fd5b613463848285614be8565b509392505050565b600061347e613479846149ae565b61494d565b90508281526020810184848401111561349657600080fd5b6134a1848285614be8565b509392505050565b6000813590506134b881614dde565b92915050565b6000815190506134cd81614dde565b92915050565b6000813590506134e281614df5565b92915050565b6000813590506134f781614e0c565b92915050565b60008151905061350c81614e0c565b92915050565b600082601f83011261352357600080fd5b813561353384826020860161342d565b91505092915050565b60008135905061354b81614e23565b92915050565b600082601f83011261356257600080fd5b813561357284826020860161346b565b91505092915050565b60008135905061358a81614e3a565b92915050565b6000602082840312156135a257600080fd5b60006135b0848285016134a9565b91505092915050565b6000602082840312156135cb57600080fd5b60006135d9848285016134be565b91505092915050565b600080604083850312156135f557600080fd5b6000613603858286016134a9565b9250506020613614858286016134a9565b9150509250929050565b60008060006060848603121561363357600080fd5b6000613641868287016134a9565b9350506020613652868287016134a9565b92505060406136638682870161357b565b9150509250925092565b6000806000806080858703121561368357600080fd5b6000613691878288016134a9565b94505060206136a2878288016134a9565b93505060406136b38782880161357b565b925050606085013567ffffffffffffffff8111156136d057600080fd5b6136dc87828801613512565b91505092959194509250565b600080604083850312156136fb57600080fd5b6000613709858286016134a9565b925050602061371a858286016134d3565b9150509250929050565b6000806040838503121561373757600080fd5b6000613745858286016134a9565b92505060206137568582860161357b565b9150509250929050565b60006020828403121561377257600080fd5b6000613780848285016134e8565b91505092915050565b60006020828403121561379b57600080fd5b60006137a9848285016134fd565b91505092915050565b6000602082840312156137c457600080fd5b600082013567ffffffffffffffff8111156137de57600080fd5b6137ea84828501613551565b91505092915050565b60006020828403121561380557600080fd5b60006138138482850161357b565b91505092915050565b60008060006060848603121561383157600080fd5b600061383f8682870161357b565b93505060206138508682870161353c565b92505060406138618682870161357b565b9150509250925092565b60008060006060848603121561388057600080fd5b600061388e8682870161357b565b935050602061389f8682870161357b565b925050604084013567ffffffffffffffff8111156138bc57600080fd5b6138c886828701613512565b9150509250925092565b6138db81614b4b565b82525050565b6138f26138ed82614b4b565b614ca5565b82525050565b61390181614b5d565b82525050565b61391081614b69565b82525050565b6000613921826149f3565b61392b8185614a09565b935061393b818560208601614bf7565b61394481614dc0565b840191505092915050565b600061395a826149fe565b6139648185614a1a565b9350613974818560208601614bf7565b61397d81614dc0565b840191505092915050565b6000613993826149fe565b61399d8185614a2b565b93506139ad818560208601614bf7565b80840191505092915050565b600081546139c681614c2a565b6139d08186614a2b565b945060018216600081146139eb57600181146139fc57613a2f565b60ff19831686528186019350613a2f565b613a05856149de565b60005b83811015613a2757815481890152600182019150602081019050613a08565b838801955050505b50505092915050565b6000613a45602b83614a1a565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613aab603283614a1a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613b11602683614a1a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b77601c83614a1a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613bb7602483614a1a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c1d601983614a1a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613c5d603483614a1a565b91507f496d706f737369626c65205072652d4d696e742061204d61746168656c6d657460008301527f207768656e2073616c65206973206163746976650000000000000000000000006020830152604082019050919050565b6000613cc3601f83614a1a565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613d03602f83614a1a565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204d65746168656c6d65747300000000000000000000000000000000006020830152604082019050919050565b6000613d69602c83614a1a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613dcf601d83614a1a565b91507f4f6e6c79206f776e65722063616e20756e6d6572676520746f6b656e730000006000830152602082019050919050565b6000613e0f603883614a1a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613e75602a83614a1a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613edb602983614a1a565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f41602083614a1a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613f81602c83614a1a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613fe7601183614a1a565b91507f496e76616c6964205369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000614027602083614a1a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614067602983614a1a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140cd602f83614a1a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614133601b83614a1a565b91507f4f6e6c79206f776e65722063616e206d6572676520746f6b656e7300000000006000830152602082019050919050565b6000614173602183614a1a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141d9601d83614a1a565b91507f5072652d4d696e74206973206e6f7420617661696c61626c65207965740000006000830152602082019050919050565b6000614219601083614a1a565b91507f4d6178206d696e742072656163686564000000000000000000000000000000006000830152602082019050919050565b6000614259603183614a1a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006142bf602c83614a1a565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614325602083614a1a565b91507f43616e206f6e6c79206d696e74203720746f6b656e7320617420612074696d656000830152602082019050919050565b6000614365602683614a1a565b91507f53616c65206d7573742062652061637469766520746f206d696e74204d65746160008301527f68656c6d657400000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143cb603383614a1a565b91507f496d706f737369626c6520726573657276652061204d65746168656c6d65742060008301527f7768656e2073616c6520697320616374697665000000000000000000000000006020830152604082019050919050565b61442d81614bd1565b82525050565b61444461443f82614bd1565b614cc9565b82525050565b61445381614bdb565b82525050565b600061446582856138e1565b6014820191506144758284614433565b6020820191508190509392505050565b600061449182856139b9565b915061449d8284613988565b91508190509392505050565b60006020820190506144be60008301846138d2565b92915050565b60006080820190506144d960008301876138d2565b6144e660208301866138d2565b6144f36040830185614424565b81810360608301526145058184613916565b905095945050505050565b600060208201905061452560008301846138f8565b92915050565b60006080820190506145406000830187613907565b61454d602083018661444a565b61455a6040830185613907565b6145676060830184613907565b95945050505050565b6000602082019050818103600083015261458a818461394f565b905092915050565b600060208201905081810360008301526145ab81613a38565b9050919050565b600060208201905081810360008301526145cb81613a9e565b9050919050565b600060208201905081810360008301526145eb81613b04565b9050919050565b6000602082019050818103600083015261460b81613b6a565b9050919050565b6000602082019050818103600083015261462b81613baa565b9050919050565b6000602082019050818103600083015261464b81613c10565b9050919050565b6000602082019050818103600083015261466b81613c50565b9050919050565b6000602082019050818103600083015261468b81613cb6565b9050919050565b600060208201905081810360008301526146ab81613cf6565b9050919050565b600060208201905081810360008301526146cb81613d5c565b9050919050565b600060208201905081810360008301526146eb81613dc2565b9050919050565b6000602082019050818103600083015261470b81613e02565b9050919050565b6000602082019050818103600083015261472b81613e68565b9050919050565b6000602082019050818103600083015261474b81613ece565b9050919050565b6000602082019050818103600083015261476b81613f34565b9050919050565b6000602082019050818103600083015261478b81613f74565b9050919050565b600060208201905081810360008301526147ab81613fda565b9050919050565b600060208201905081810360008301526147cb8161401a565b9050919050565b600060208201905081810360008301526147eb8161405a565b9050919050565b6000602082019050818103600083015261480b816140c0565b9050919050565b6000602082019050818103600083015261482b81614126565b9050919050565b6000602082019050818103600083015261484b81614166565b9050919050565b6000602082019050818103600083015261486b816141cc565b9050919050565b6000602082019050818103600083015261488b8161420c565b9050919050565b600060208201905081810360008301526148ab8161424c565b9050919050565b600060208201905081810360008301526148cb816142b2565b9050919050565b600060208201905081810360008301526148eb81614318565b9050919050565b6000602082019050818103600083015261490b81614358565b9050919050565b6000602082019050818103600083015261492b816143be565b9050919050565b60006020820190506149476000830184614424565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561497457614973614d91565b5b8060405250919050565b600067ffffffffffffffff82111561499957614998614d91565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156149c9576149c8614d91565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a4182614bd1565b9150614a4c83614bd1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a8157614a80614d04565b5b828201905092915050565b6000614a9782614bd1565b9150614aa283614bd1565b925082614ab257614ab1614d33565b5b828204905092915050565b6000614ac882614bd1565b9150614ad383614bd1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b0c57614b0b614d04565b5b828202905092915050565b6000614b2282614bd1565b9150614b2d83614bd1565b925082821015614b4057614b3f614d04565b5b828203905092915050565b6000614b5682614bb1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614baa82614b4b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614c15578082015181840152602081019050614bfa565b83811115614c24576000848401525b50505050565b60006002820490506001821680614c4257607f821691505b60208210811415614c5657614c55614d62565b5b50919050565b6000614c6782614bd1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c9a57614c99614d04565b5b600182019050919050565b6000614cb082614cb7565b9050919050565b6000614cc282614dd1565b9050919050565b6000819050919050565b6000614cde82614bd1565b9150614ce983614bd1565b925082614cf957614cf8614d33565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614de781614b4b565b8114614df257600080fd5b50565b614dfe81614b5d565b8114614e0957600080fd5b50565b614e1581614b73565b8114614e2057600080fd5b50565b614e2c81614b9f565b8114614e3757600080fd5b50565b614e4381614bd1565b8114614e4e57600080fd5b5056fea2646970667358221220466182dd39ac7cbd7d98eef45494de28b7999841e633af415644420d5487298464736f6c63430008000033

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806370a08231116101185780639d74e820116100a0578063ce2634901161006f578063ce26349014610759578063e985e9c514610782578063eb8d2444146107bf578063f2fde38b146107ea578063fa971a0a146108135761020f565b80639d74e820146106a1578063a22cb465146106ca578063b88d4fde146106f3578063c87b56dd1461071c5761020f565b806384bdb6e0116100e757806384bdb6e0146105ba5780638d859f3e146105e35780638da5cb5b1461060e57806395d89b411461063957806398a8cffe146106645761020f565b806370a08231146105245780637146bd0814610561578063715018a61461058c5780637d8966e4146105a35761020f565b80633ccfd60b1161019b5780634f6ccce71161016a5780634f6ccce71461043a57806355f804b3146104775780636352211e146104a0578063665e7203146104dd5780636c89bc8d146104f95761020f565b80633ccfd60b146103b8578063417b9483146103cf57806342842e0e146103fa5780634d2a1b19146104235761020f565b806310969523116101e257806310969523146102e257806318160ddd1461030b57806323b872dd146103365780632f4eb8611461035f5780632f745c591461037b5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613760565b61083e565b6040516102489190614510565b60405180910390f35b34801561025d57600080fd5b506102666108b8565b6040516102739190614570565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e91906137f3565b61094a565b6040516102b091906144a9565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db9190613724565b6109cf565b005b3480156102ee57600080fd5b50610309600480360381019061030491906137b2565b610ae7565b005b34801561031757600080fd5b50610320610b7d565b60405161032d9190614932565b60405180910390f35b34801561034257600080fd5b5061035d6004803603810190610358919061361e565b610b8a565b005b610379600480360381019061037491906137f3565b610bea565b005b34801561038757600080fd5b506103a2600480360381019061039d9190613724565b610d8a565b6040516103af9190614932565b60405180910390f35b3480156103c457600080fd5b506103cd610e2f565b005b3480156103db57600080fd5b506103e4610f07565b6040516103f191906144a9565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c919061361e565b610f2d565b005b34801561042f57600080fd5b50610438610f4d565b005b34801561044657600080fd5b50610461600480360381019061045c91906137f3565b61106a565b60405161046e9190614932565b60405180910390f35b34801561048357600080fd5b5061049e600480360381019061049991906137b2565b611101565b005b3480156104ac57600080fd5b506104c760048036038101906104c291906137f3565b611189565b6040516104d491906144a9565b60405180910390f35b6104f760048036038101906104f2919061386b565b61123b565b005b34801561050557600080fd5b5061050e61167a565b60405161051b9190614570565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190613590565b611708565b6040516105589190614932565b60405180910390f35b34801561056d57600080fd5b506105766117c0565b6040516105839190614932565b60405180910390f35b34801561059857600080fd5b506105a16117c5565b005b3480156105af57600080fd5b506105b861184d565b005b3480156105c657600080fd5b506105e160048036038101906105dc9190613590565b6118f5565b005b3480156105ef57600080fd5b506105f86119b5565b6040516106059190614932565b60405180910390f35b34801561061a57600080fd5b506106236119c1565b60405161063091906144a9565b60405180910390f35b34801561064557600080fd5b5061064e6119eb565b60405161065b9190614570565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190613590565b611a7d565b6040516106989190614932565b60405180910390f35b3480156106ad57600080fd5b506106c860048036038101906106c3919061381c565b611a95565b005b3480156106d657600080fd5b506106f160048036038101906106ec91906136e8565b611c59565b005b3480156106ff57600080fd5b5061071a6004803603810190610715919061366d565b611dda565b005b34801561072857600080fd5b50610743600480360381019061073e91906137f3565b611e3c565b6040516107509190614570565b60405180910390f35b34801561076557600080fd5b50610780600480360381019061077b91906137f3565b611ee4565b005b34801561078e57600080fd5b506107a960048036038101906107a491906135e2565b611f91565b6040516107b69190614510565b60405180910390f35b3480156107cb57600080fd5b506107d4612025565b6040516107e19190614510565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190613590565b612038565b005b34801561081f57600080fd5b50610828612130565b6040516108359190614932565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b157506108b082612136565b5b9050919050565b6060600080546108c790614c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546108f390614c2a565b80156109405780601f1061091557610100808354040283529160200191610940565b820191906000526020600020905b81548152906001019060200180831161092357829003601f168201915b5050505050905090565b600061095582612218565b610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098b90614772565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109da82611189565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4290614832565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a6a612284565b73ffffffffffffffffffffffffffffffffffffffff161480610a995750610a9881610a93612284565b611f91565b5b610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf906146f2565b60405180910390fd5b610ae2838361228c565b505050565b610aef612284565b73ffffffffffffffffffffffffffffffffffffffff16610b0d6119c1565b73ffffffffffffffffffffffffffffffffffffffff1614610b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5a906147b2565b60405180910390fd5b80600c9080519060200190610b7992919061338a565b5050565b6000600980549050905090565b610b9b610b95612284565b82612345565b610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd190614892565b60405180910390fd5b610be5838383612423565b505050565b600d60009054906101000a900460ff16610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c30906148f2565b60405180910390fd5b6007811115610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c74906148d2565b60405180910390fd5b612775610c9a82610c8c610b7d565b61267f90919063ffffffff16565b1115610cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd290614692565b60405180910390fd5b34610cf782670166dc0f50c3200061269590919063ffffffff16565b1115610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f90614672565b60405180910390fd5b60005b81811015610d86576000610d4d610b7d565b9050612775610d5a610b7d565b1015610d7257610d71610d6b612284565b826126ab565b5b508080610d7e90614c5c565b915050610d3b565b5050565b6000610d9583611708565b8210610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd90614592565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e37612284565b73ffffffffffffffffffffffffffffffffffffffff16610e556119c1565b73ffffffffffffffffffffffffffffffffffffffff1614610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea2906147b2565b60405180910390fd5b6000610eb5612284565b905060004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f02573d6000803e3d6000fd5b505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f4883838360405180602001604052806000815250611dda565b505050565b610f55612284565b73ffffffffffffffffffffffffffffffffffffffff16610f736119c1565b73ffffffffffffffffffffffffffffffffffffffff1614610fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc0906147b2565b60405180910390fd5b60001515600d60009054906101000a900460ff1615151461101f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101690614912565b60405180910390fd5b6000611029610b7d565b905060005b601581101561106657611053611042612284565b828461104e9190614a36565b6126ab565b808061105e90614c5c565b91505061102e565b5050565b6000611074610b7d565b82106110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac906148b2565b60405180910390fd5b600982815481106110ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611109612284565b73ffffffffffffffffffffffffffffffffffffffff166111276119c1565b73ffffffffffffffffffffffffffffffffffffffff161461117d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611174906147b2565b60405180910390fd5b611186816126c9565b50565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122990614732565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c590614852565b60405180910390fd5b60001515600d60009054906101000a900460ff16151514611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90614652565b60405180910390fd5b6007841115611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f906148d2565b60405180910390fd5b61277561138585611377610b7d565b61267f90919063ffffffff16565b11156113c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bd90614692565b60405180910390fd5b346113e285670166dc0f50c3200061269590919063ffffffff16565b1115611423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141a90614672565b60405180910390fd5b61142b612284565b8360405160200161143d929190614459565b604051602081830303815290604052805190602001209050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661149882846126e3565b73ffffffffffffffffffffffffffffffffffffffff16146114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590614792565b60405180910390fd5b8261154885600e60006114ff612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461267f90919063ffffffff16565b1115611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090614872565b60405180910390fd5b6115e284600e6000611599612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461267f90919063ffffffff16565b600e60006115ee612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000611636610b7d565b905060005b858110156116725761165f61164e612284565b828461165a9190614a36565b6126ab565b808061166a90614c5c565b91505061163b565b505050505050565b600c805461168790614c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546116b390614c2a565b80156117005780601f106116d557610100808354040283529160200191611700565b820191906000526020600020905b8154815290600101906020018083116116e357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177090614712565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600781565b6117cd612284565b73ffffffffffffffffffffffffffffffffffffffff166117eb6119c1565b73ffffffffffffffffffffffffffffffffffffffff1614611841576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611838906147b2565b60405180910390fd5b61184b600061275b565b565b611855612284565b73ffffffffffffffffffffffffffffffffffffffff166118736119c1565b73ffffffffffffffffffffffffffffffffffffffff16146118c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c0906147b2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6118fd612284565b73ffffffffffffffffffffffffffffffffffffffff1661191b6119c1565b73ffffffffffffffffffffffffffffffffffffffff1614611971576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611968906147b2565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b670166dc0f50c3200081565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546119fa90614c2a565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2690614c2a565b8015611a735780601f10611a4857610100808354040283529160200191611a73565b820191906000526020600020905b815481529060010190602001808311611a5657829003601f168201915b5050505050905090565b600e6020528060005260406000206000915090505481565b611a9d612284565b73ffffffffffffffffffffffffffffffffffffffff16611abc84611189565b73ffffffffffffffffffffffffffffffffffffffff1614611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0990614812565b60405180910390fd5b611b1a612284565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611b699190614932565b60206040518083038186803b158015611b8157600080fd5b505afa158015611b95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb991906135b9565b73ffffffffffffffffffffffffffffffffffffffff1614611c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0690614812565b60405180910390fd5b808273ffffffffffffffffffffffffffffffffffffffff16847f605166ae6aadc5b8b03d67e8f6d83467a99c03d72a932587f17dfed34a23586f60405160405180910390a4505050565b611c61612284565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690614632565b60405180910390fd5b8060066000611cdc612284565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d89612284565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dce9190614510565b60405180910390a35050565b611deb611de5612284565b83612345565b611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190614892565b60405180910390fd5b611e3684848484612821565b50505050565b6060611e4782612218565b611e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7d906147f2565b60405180910390fd5b6000611e9061287d565b90506000815111611eb05760405180602001604052806000815250611edc565b6002611ebb8461290f565b604051602001611ecc929190614485565b6040516020818303038152906040525b915050919050565b611eec612284565b73ffffffffffffffffffffffffffffffffffffffff16611f0b82611189565b73ffffffffffffffffffffffffffffffffffffffff1614611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f58906146d2565b60405180910390fd5b807fd46896a90637bfb4400eda974dbcac4511eafd99999c27e2a46fb8b681781e3260405160405180910390a250565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b612040612284565b73ffffffffffffffffffffffffffffffffffffffff1661205e6119c1565b73ffffffffffffffffffffffffffffffffffffffff16146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab906147b2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211b906145d2565b60405180910390fd5b61212d8161275b565b50565b61277581565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061220157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612211575061221082612abc565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122ff83611189565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061235082612218565b61238f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612386906146b2565b60405180910390fd5b600061239a83611189565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240957508373ffffffffffffffffffffffffffffffffffffffff166123f18461094a565b73ffffffffffffffffffffffffffffffffffffffff16145b8061241a57506124198185611f91565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661244382611189565b73ffffffffffffffffffffffffffffffffffffffff1614612499576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612490906147d2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250090614612565b60405180910390fd5b612514838383612b26565b61251f60008261228c565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256f9190614b17565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125c69190614a36565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818361268d9190614a36565b905092915050565b600081836126a39190614abd565b905092915050565b6126c5828260405180602001604052806000815250612c3a565b5050565b80600290805190602001906126df92919061338a565b5050565b600080600080602085015192506040850151915060ff604186015116905060018682858560405160008152602001604052604051612724949392919061452b565b6020604051602081039080840390855afa158015612746573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61282c848484612423565b61283884848484612c95565b612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e906145b2565b60405180910390fd5b50505050565b60606002805461288c90614c2a565b80601f01602080910402602001604051908101604052809291908181526020018280546128b890614c2a565b80156129055780601f106128da57610100808354040283529160200191612905565b820191906000526020600020905b8154815290600101906020018083116128e857829003601f168201915b5050505050905090565b60606000821415612957576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ab7565b600082905060005b6000821461298957808061297290614c5c565b915050600a826129829190614a8c565b915061295f565b60008167ffffffffffffffff8111156129cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129fd5781602001600182028036833780820191505090505b5090505b60008514612ab057600182612a169190614b17565b9150600a85612a259190614cd3565b6030612a319190614a36565b60f81b818381518110612a6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612aa99190614a8c565b9450612a01565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b31838383612e2c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7457612b6f81612e31565b612bb3565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bb257612bb18382612e7a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bf657612bf181612fe7565b612c35565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3457612c33828261312a565b5b5b505050565b612c4483836131a9565b612c516000848484612c95565b612c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c87906145b2565b60405180910390fd5b505050565b6000612cb68473ffffffffffffffffffffffffffffffffffffffff16613377565b15612e1f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cdf612284565b8786866040518563ffffffff1660e01b8152600401612d0194939291906144c4565b602060405180830381600087803b158015612d1b57600080fd5b505af1925050508015612d4c57506040513d601f19601f82011682018060405250810190612d499190613789565b60015b612dcf573d8060008114612d7c576040519150601f19603f3d011682016040523d82523d6000602084013e612d81565b606091505b50600081511415612dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbe906145b2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e24565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e8784611708565b612e919190614b17565b9050600060086000848152602001908152602001600020549050818114612f76576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612ffb9190614b17565b90506000600a6000848152602001908152602001600020549050600060098381548110613051577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060098381548110613099577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061310e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061313583611708565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161321090614752565b60405180910390fd5b61322281612218565b15613262576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613259906145f2565b60405180910390fd5b61326e60008383612b26565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132be9190614a36565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461339690614c2a565b90600052602060002090601f0160209004810192826133b857600085556133ff565b82601f106133d157805160ff19168380011785556133ff565b828001600101855582156133ff579182015b828111156133fe5782518255916020019190600101906133e3565b5b50905061340c9190613410565b5090565b5b80821115613429576000816000905550600101613411565b5090565b600061344061343b8461497e565b61494d565b90508281526020810184848401111561345857600080fd5b613463848285614be8565b509392505050565b600061347e613479846149ae565b61494d565b90508281526020810184848401111561349657600080fd5b6134a1848285614be8565b509392505050565b6000813590506134b881614dde565b92915050565b6000815190506134cd81614dde565b92915050565b6000813590506134e281614df5565b92915050565b6000813590506134f781614e0c565b92915050565b60008151905061350c81614e0c565b92915050565b600082601f83011261352357600080fd5b813561353384826020860161342d565b91505092915050565b60008135905061354b81614e23565b92915050565b600082601f83011261356257600080fd5b813561357284826020860161346b565b91505092915050565b60008135905061358a81614e3a565b92915050565b6000602082840312156135a257600080fd5b60006135b0848285016134a9565b91505092915050565b6000602082840312156135cb57600080fd5b60006135d9848285016134be565b91505092915050565b600080604083850312156135f557600080fd5b6000613603858286016134a9565b9250506020613614858286016134a9565b9150509250929050565b60008060006060848603121561363357600080fd5b6000613641868287016134a9565b9350506020613652868287016134a9565b92505060406136638682870161357b565b9150509250925092565b6000806000806080858703121561368357600080fd5b6000613691878288016134a9565b94505060206136a2878288016134a9565b93505060406136b38782880161357b565b925050606085013567ffffffffffffffff8111156136d057600080fd5b6136dc87828801613512565b91505092959194509250565b600080604083850312156136fb57600080fd5b6000613709858286016134a9565b925050602061371a858286016134d3565b9150509250929050565b6000806040838503121561373757600080fd5b6000613745858286016134a9565b92505060206137568582860161357b565b9150509250929050565b60006020828403121561377257600080fd5b6000613780848285016134e8565b91505092915050565b60006020828403121561379b57600080fd5b60006137a9848285016134fd565b91505092915050565b6000602082840312156137c457600080fd5b600082013567ffffffffffffffff8111156137de57600080fd5b6137ea84828501613551565b91505092915050565b60006020828403121561380557600080fd5b60006138138482850161357b565b91505092915050565b60008060006060848603121561383157600080fd5b600061383f8682870161357b565b93505060206138508682870161353c565b92505060406138618682870161357b565b9150509250925092565b60008060006060848603121561388057600080fd5b600061388e8682870161357b565b935050602061389f8682870161357b565b925050604084013567ffffffffffffffff8111156138bc57600080fd5b6138c886828701613512565b9150509250925092565b6138db81614b4b565b82525050565b6138f26138ed82614b4b565b614ca5565b82525050565b61390181614b5d565b82525050565b61391081614b69565b82525050565b6000613921826149f3565b61392b8185614a09565b935061393b818560208601614bf7565b61394481614dc0565b840191505092915050565b600061395a826149fe565b6139648185614a1a565b9350613974818560208601614bf7565b61397d81614dc0565b840191505092915050565b6000613993826149fe565b61399d8185614a2b565b93506139ad818560208601614bf7565b80840191505092915050565b600081546139c681614c2a565b6139d08186614a2b565b945060018216600081146139eb57600181146139fc57613a2f565b60ff19831686528186019350613a2f565b613a05856149de565b60005b83811015613a2757815481890152600182019150602081019050613a08565b838801955050505b50505092915050565b6000613a45602b83614a1a565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613aab603283614a1a565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613b11602683614a1a565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b77601c83614a1a565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613bb7602483614a1a565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c1d601983614a1a565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613c5d603483614a1a565b91507f496d706f737369626c65205072652d4d696e742061204d61746168656c6d657460008301527f207768656e2073616c65206973206163746976650000000000000000000000006020830152604082019050919050565b6000613cc3601f83614a1a565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613d03602f83614a1a565b91507f507572636861736520776f756c6420657863656564206d617820737570706c7960008301527f206f66204d65746168656c6d65747300000000000000000000000000000000006020830152604082019050919050565b6000613d69602c83614a1a565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613dcf601d83614a1a565b91507f4f6e6c79206f776e65722063616e20756e6d6572676520746f6b656e730000006000830152602082019050919050565b6000613e0f603883614a1a565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613e75602a83614a1a565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613edb602983614a1a565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f41602083614a1a565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613f81602c83614a1a565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613fe7601183614a1a565b91507f496e76616c6964205369676e61747572650000000000000000000000000000006000830152602082019050919050565b6000614027602083614a1a565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614067602983614a1a565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006140cd602f83614a1a565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614133601b83614a1a565b91507f4f6e6c79206f776e65722063616e206d6572676520746f6b656e7300000000006000830152602082019050919050565b6000614173602183614a1a565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141d9601d83614a1a565b91507f5072652d4d696e74206973206e6f7420617661696c61626c65207965740000006000830152602082019050919050565b6000614219601083614a1a565b91507f4d6178206d696e742072656163686564000000000000000000000000000000006000830152602082019050919050565b6000614259603183614a1a565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006142bf602c83614a1a565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614325602083614a1a565b91507f43616e206f6e6c79206d696e74203720746f6b656e7320617420612074696d656000830152602082019050919050565b6000614365602683614a1a565b91507f53616c65206d7573742062652061637469766520746f206d696e74204d65746160008301527f68656c6d657400000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143cb603383614a1a565b91507f496d706f737369626c6520726573657276652061204d65746168656c6d65742060008301527f7768656e2073616c6520697320616374697665000000000000000000000000006020830152604082019050919050565b61442d81614bd1565b82525050565b61444461443f82614bd1565b614cc9565b82525050565b61445381614bdb565b82525050565b600061446582856138e1565b6014820191506144758284614433565b6020820191508190509392505050565b600061449182856139b9565b915061449d8284613988565b91508190509392505050565b60006020820190506144be60008301846138d2565b92915050565b60006080820190506144d960008301876138d2565b6144e660208301866138d2565b6144f36040830185614424565b81810360608301526145058184613916565b905095945050505050565b600060208201905061452560008301846138f8565b92915050565b60006080820190506145406000830187613907565b61454d602083018661444a565b61455a6040830185613907565b6145676060830184613907565b95945050505050565b6000602082019050818103600083015261458a818461394f565b905092915050565b600060208201905081810360008301526145ab81613a38565b9050919050565b600060208201905081810360008301526145cb81613a9e565b9050919050565b600060208201905081810360008301526145eb81613b04565b9050919050565b6000602082019050818103600083015261460b81613b6a565b9050919050565b6000602082019050818103600083015261462b81613baa565b9050919050565b6000602082019050818103600083015261464b81613c10565b9050919050565b6000602082019050818103600083015261466b81613c50565b9050919050565b6000602082019050818103600083015261468b81613cb6565b9050919050565b600060208201905081810360008301526146ab81613cf6565b9050919050565b600060208201905081810360008301526146cb81613d5c565b9050919050565b600060208201905081810360008301526146eb81613dc2565b9050919050565b6000602082019050818103600083015261470b81613e02565b9050919050565b6000602082019050818103600083015261472b81613e68565b9050919050565b6000602082019050818103600083015261474b81613ece565b9050919050565b6000602082019050818103600083015261476b81613f34565b9050919050565b6000602082019050818103600083015261478b81613f74565b9050919050565b600060208201905081810360008301526147ab81613fda565b9050919050565b600060208201905081810360008301526147cb8161401a565b9050919050565b600060208201905081810360008301526147eb8161405a565b9050919050565b6000602082019050818103600083015261480b816140c0565b9050919050565b6000602082019050818103600083015261482b81614126565b9050919050565b6000602082019050818103600083015261484b81614166565b9050919050565b6000602082019050818103600083015261486b816141cc565b9050919050565b6000602082019050818103600083015261488b8161420c565b9050919050565b600060208201905081810360008301526148ab8161424c565b9050919050565b600060208201905081810360008301526148cb816142b2565b9050919050565b600060208201905081810360008301526148eb81614318565b9050919050565b6000602082019050818103600083015261490b81614358565b9050919050565b6000602082019050818103600083015261492b816143be565b9050919050565b60006020820190506149476000830184614424565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561497457614973614d91565b5b8060405250919050565b600067ffffffffffffffff82111561499957614998614d91565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156149c9576149c8614d91565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a4182614bd1565b9150614a4c83614bd1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a8157614a80614d04565b5b828201905092915050565b6000614a9782614bd1565b9150614aa283614bd1565b925082614ab257614ab1614d33565b5b828204905092915050565b6000614ac882614bd1565b9150614ad383614bd1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b0c57614b0b614d04565b5b828202905092915050565b6000614b2282614bd1565b9150614b2d83614bd1565b925082821015614b4057614b3f614d04565b5b828203905092915050565b6000614b5682614bb1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614baa82614b4b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614c15578082015181840152602081019050614bfa565b83811115614c24576000848401525b50505050565b60006002820490506001821680614c4257607f821691505b60208210811415614c5657614c55614d62565b5b50919050565b6000614c6782614bd1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c9a57614c99614d04565b5b600182019050919050565b6000614cb082614cb7565b9050919050565b6000614cc282614dd1565b9050919050565b6000819050919050565b6000614cde82614bd1565b9150614ce983614bd1565b925082614cf957614cf8614d33565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614de781614b4b565b8114614df257600080fd5b50565b614dfe81614b5d565b8114614e0957600080fd5b50565b614e1581614b73565b8114614e2057600080fd5b50565b614e2c81614b9f565b8114614e3757600080fd5b50565b614e4381614bd1565b8114614e4e57600080fd5b5056fea2646970667358221220466182dd39ac7cbd7d98eef45494de28b7999841e633af415644420d5487298464736f6c63430008000033

Deployed Bytecode Sourcemap

49231:4775:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40691:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27713:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29378:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28901:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52876:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41331:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30268:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50675:685;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40999:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49876:184;;;;;;;;;;;;;:::i;:::-;;49639:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30678:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50328:299;;;;;;;;;;;;;:::i;:::-;;41521:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53015:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27407:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51437:1363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49324:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27137:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49489:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48410:103;;;;;;;;;;;;;:::i;:::-;;50068:86;;;;;;;;;;;;;:::i;:::-;;50162:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49374:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47759:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27882:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49579:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53122:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29671:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30934:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28057:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53463:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30037:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49538:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48668:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49433:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40691:224;40793:4;40832:35;40817:50;;;:11;:50;;;;:90;;;;40871:36;40895:11;40871:23;:36::i;:::-;40817:90;40810:97;;40691:224;;;:::o;27713:100::-;27767:13;27800:5;27793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27713:100;:::o;29378:221::-;29454:7;29482:16;29490:7;29482;:16::i;:::-;29474:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29567:15;:24;29583:7;29567:24;;;;;;;;;;;;;;;;;;;;;29560:31;;29378:221;;;:::o;28901:411::-;28982:13;28998:23;29013:7;28998:14;:23::i;:::-;28982:39;;29046:5;29040:11;;:2;:11;;;;29032:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29140:5;29124:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29149:37;29166:5;29173:12;:10;:12::i;:::-;29149:16;:37::i;:::-;29124:62;29102:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29283:21;29292:2;29296:7;29283:8;:21::i;:::-;28901:411;;;:::o;52876:131::-;47990:12;:10;:12::i;:::-;47979:23;;:7;:5;:7::i;:::-;:23;;;47971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52985:14:::1;52961:21;:38;;;;;;;;;;;;:::i;:::-;;52876:131:::0;:::o;41331:113::-;41392:7;41419:10;:17;;;;41412:24;;41331:113;:::o;30268:339::-;30463:41;30482:12;:10;:12::i;:::-;30496:7;30463:18;:41::i;:::-;30455:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30571:28;30581:4;30587:2;30591:7;30571:9;:28::i;:::-;30268:339;;;:::o;50675:685::-;50757:12;;;;;;;;;;;50749:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49528:1;50831:14;:30;;50823:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49475:5;50917:33;50935:14;50917:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:52;;50909:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;51069:9;51040:25;51050:14;49406:18;51040:9;;:25;;;;:::i;:::-;:38;;51032:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;51139:6;51135:218;51155:14;51151:1;:18;51135:218;;;51191:14;51208:13;:11;:13::i;:::-;51191:30;;49475:5;51240:13;:11;:13::i;:::-;:31;51236:106;;;51292:34;51302:12;:10;:12::i;:::-;51316:9;51292;:34::i;:::-;51236:106;51135:218;51171:3;;;;;:::i;:::-;;;;51135:218;;;;50675:685;:::o;40999:256::-;41096:7;41132:23;41149:5;41132:16;:23::i;:::-;41124:5;:31;41116:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41221:12;:19;41234:5;41221:19;;;;;;;;;;;;;;;:26;41241:5;41221:26;;;;;;;;;;;;41214:33;;40999:256;;;;:::o;49876:184::-;47990:12;:10;:12::i;:::-;47979:23;;:7;:5;:7::i;:::-;:23;;;47971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49924:22:::1;49957:12;:10;:12::i;:::-;49924:46;;49981:12;49996:21;49981:36;;50028:6;:15;;:24;50044:7;50028:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;48050:1;;49876:184::o:0;49639:31::-;;;;;;;;;;;;;:::o;30678:185::-;30816:39;30833:4;30839:2;30843:7;30816:39;;;;;;;;;;;;:16;:39::i;:::-;30678:185;;;:::o;50328:299::-;47990:12;:10;:12::i;:::-;47979:23;;:7;:5;:7::i;:::-;:23;;;47971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50415:5:::1;50399:21;;:12;;;;;;;;;;;:21;;;50391:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;50490:11;50504:13;:11;:13::i;:::-;50490:27;;50533:6;50528:92;50549:2;50545:1;:6;50528:92;;;50573:35;50583:12;:10;:12::i;:::-;50606:1;50597:6;:10;;;;:::i;:::-;50573:9;:35::i;:::-;50553:3;;;;;:::i;:::-;;;;50528:92;;;;48050:1;50328:299::o:0;41521:233::-;41596:7;41632:30;:28;:30::i;:::-;41624:5;:38;41616:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41729:10;41740:5;41729:17;;;;;;;;;;;;;;;;;;;;;;;;41722:24;;41521:233;;;:::o;53015:99::-;47990:12;:10;:12::i;:::-;47979:23;;:7;:5;:7::i;:::-;:23;;;47971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53086:20:::1;53098:7;53086:11;:20::i;:::-;53015:99:::0;:::o;27407:239::-;27479:7;27499:13;27515:7;:16;27523:7;27515:16;;;;;;;;;;;;;;;;;;;;;27499:32;;27567:1;27550:19;;:5;:19;;;;27542:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27633:5;27626:12;;;27407:239;;;:::o;51437:1363::-;51548:12;51607:1;51579:30;;:16;;;;;;;;;;;:30;;;;51571:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51678:5;51662:21;;:12;;;;;;;;;;;:21;;;51654:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;49528:1;51762:14;:30;;51754:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49475:5;51848:33;51866:14;51848:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:52;;51840:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;52000:9;51971:25;51981:14;49406:18;51971:9;;:25;;;;:::i;:::-;:38;;51963:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52156:12;:10;:12::i;:::-;52170:3;52139:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52129:46;;;;;;52122:53;;52277:16;;;;;;;;;;;52250:43;;:23;52258:4;52263:9;52250:7;:23::i;:::-;:43;;;52242:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52449:3;52396:49;52430:14;52396:15;:29;52412:12;:10;:12::i;:::-;52396:29;;;;;;;;;;;;;;;;:33;;:49;;;;:::i;:::-;:56;;52388:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;52592:49;52626:14;52592:15;:29;52608:12;:10;:12::i;:::-;52592:29;;;;;;;;;;;;;;;;:33;;:49;;;;:::i;:::-;52560:15;:29;52576:12;:10;:12::i;:::-;52560:29;;;;;;;;;;;;;;;:81;;;;52654:11;52668:13;:11;:13::i;:::-;52654:27;;52696:6;52692:101;52712:14;52708:1;:18;52692:101;;;52748:33;52758:12;:10;:12::i;:::-;52779:1;52772:6;:8;;;;:::i;:::-;52748:9;:33::i;:::-;52728:3;;;;;:::i;:::-;;;;52692:101;;;;51437:1363;;;;;:::o;49324:40::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27137:208::-;27209:7;27254:1;27237:19;;:5;:19;;;;27229:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27321:9;:16;27331:5;27321:16;;;;;;;;;;;;;;;;27314:23;;27137:208;;;:::o;49489:40::-;49528:1;49489:40;:::o;48410:103::-;47990:12;:10;:12::i;:::-;47979:23;;:7;:5;:7::i;:::-;:23;;;47971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48475:30:::1;48502:1;48475:18;:30::i;:::-;48410:103::o:0;50068:86::-;47990:12;:10;:12::i;:::-;47979:23;;:7;:5;:7::i;:::-;:23;;;47971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50134:12:::1;;;;;;;;;;;50133:13;50118:12;;:28;;;;;;;;;;;;;;;;;;50068:86::o:0;50162:105::-;47990:12;:10;:12::i;:::-;47979:23;;:7;:5;:7::i;:::-;:23;;;47971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50253:6:::1;50234:16;;:25;;;;;;;;;;;;;;;;;;50162:105:::0;:::o;49374:50::-;49406:18;49374:50;:::o;47759:87::-;47805:7;47832:6;;;;;;;;;;;47825:13;;47759:87;:::o;27882:104::-;27938:13;27971:7;27964:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27882:104;:::o;49579:51::-;;;;;;;;;;;;;;;;;:::o;53122:333::-;53240:12;:10;:12::i;:::-;53219:33;;:17;53227:8;53219:7;:17::i;:::-;:33;;;53211:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53335:12;:10;:12::i;:::-;53303:44;;:12;:20;;;53324:6;53303:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;53295:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53440:6;53425:12;53401:46;;53407:8;53401:46;;;;;;;;;;53122:333;;;:::o;29671:295::-;29786:12;:10;:12::i;:::-;29774:24;;:8;:24;;;;29766:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29886:8;29841:18;:32;29860:12;:10;:12::i;:::-;29841:32;;;;;;;;;;;;;;;:42;29874:8;29841:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29939:8;29910:48;;29925:12;:10;:12::i;:::-;29910:48;;;29949:8;29910:48;;;;;;:::i;:::-;;;;;;;;29671:295;;:::o;30934:328::-;31109:41;31128:12;:10;:12::i;:::-;31142:7;31109:18;:41::i;:::-;31101:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31215:39;31229:4;31235:2;31239:7;31248:5;31215:13;:39::i;:::-;30934:328;;;;:::o;28057:336::-;28130:13;28164:16;28172:7;28164;:16::i;:::-;28156:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28245:22;28270:10;:8;:10::i;:::-;28245:35;;28323:1;28304:8;28298:22;:26;:87;;;;;;;;;;;;;;;;;28351:7;28360:18;:7;:16;:18::i;:::-;28334:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28298:87;28291:94;;;28057:336;;;:::o;53463:169::-;53545:12;:10;:12::i;:::-;53524:33;;:17;53532:8;53524:7;:17::i;:::-;:33;;;53516:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;53615:8;53607:17;;;;;;;;;;53463:169;:::o;30037:164::-;30134:4;30158:18;:25;30177:5;30158:25;;;;;;;;;;;;;;;:35;30184:8;30158:35;;;;;;;;;;;;;;;;;;;;;;;;;30151:42;;30037:164;;;;:::o;49538:32::-;;;;;;;;;;;;;:::o;48668:201::-;47990:12;:10;:12::i;:::-;47979:23;;:7;:5;:7::i;:::-;:23;;;47971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48777:1:::1;48757:22;;:8;:22;;;;48749:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48833:28;48852:8;48833:18;:28::i;:::-;48668:201:::0;:::o;49433:47::-;49475:5;49433:47;:::o;26768:305::-;26870:4;26922:25;26907:40;;;:11;:40;;;;:105;;;;26979:33;26964:48;;;:11;:48;;;;26907:105;:158;;;;27029:36;27053:11;27029:23;:36::i;:::-;26907:158;26887:178;;26768:305;;;:::o;32772:127::-;32837:4;32889:1;32861:30;;:7;:16;32869:7;32861:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32854:37;;32772:127;;;:::o;16586:98::-;16639:7;16666:10;16659:17;;16586:98;:::o;36754:174::-;36856:2;36829:15;:24;36845:7;36829:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36912:7;36908:2;36874:46;;36883:23;36898:7;36883:14;:23::i;:::-;36874:46;;;;;;;;;;;;36754:174;;:::o;33066:348::-;33159:4;33184:16;33192:7;33184;:16::i;:::-;33176:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33260:13;33276:23;33291:7;33276:14;:23::i;:::-;33260:39;;33329:5;33318:16;;:7;:16;;;:51;;;;33362:7;33338:31;;:20;33350:7;33338:11;:20::i;:::-;:31;;;33318:51;:87;;;;33373:32;33390:5;33397:7;33373:16;:32::i;:::-;33318:87;33310:96;;;33066:348;;;;:::o;36058:578::-;36217:4;36190:31;;:23;36205:7;36190:14;:23::i;:::-;:31;;;36182:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36300:1;36286:16;;:2;:16;;;;36278:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36356:39;36377:4;36383:2;36387:7;36356:20;:39::i;:::-;36460:29;36477:1;36481:7;36460:8;:29::i;:::-;36521:1;36502:9;:15;36512:4;36502:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36550:1;36533:9;:13;36543:2;36533:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36581:2;36562:7;:16;36570:7;36562:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36620:7;36616:2;36601:27;;36610:4;36601:27;;;;;;;;;;;;36058:578;;;:::o;21335:98::-;21393:7;21424:1;21420;:5;;;;:::i;:::-;21413:12;;21335:98;;;;:::o;22073:::-;22131:7;22162:1;22158;:5;;;;:::i;:::-;22151:12;;22073:98;;;;:::o;33756:110::-;33832:26;33842:2;33846:7;33832:26;;;;;;;;;;;;:9;:26::i;:::-;33756:110;;:::o;28748:91::-;28823:8;28813:7;:18;;;;;;;;;;;;:::i;:::-;;28748:91;:::o;53640:362::-;53716:7;53736:9;53756;53776:7;53850:2;53842:7;53838:15;53832:22;53828:26;;53890:2;53882:7;53878:15;53872:22;53868:26;;53940:3;53934:2;53926:7;53922:15;53916:22;53912:32;53908:36;;53972:22;53982:5;53988:1;53990;53992;53972:22;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53965:29;;;;;53640:362;;;;:::o;49029:191::-;49103:16;49122:6;;;;;;;;;;;49103:25;;49148:8;49139:6;;:17;;;;;;;;;;;;;;;;;;49203:8;49172:40;;49193:8;49172:40;;;;;;;;;;;;49029:191;;:::o;32144:315::-;32301:28;32311:4;32317:2;32321:7;32301:9;:28::i;:::-;32348:48;32371:4;32377:2;32381:7;32390:5;32348:22;:48::i;:::-;32340:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32144:315;;;;:::o;28641:99::-;28692:13;28725:7;28718:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28641:99;:::o;17029:723::-;17085:13;17315:1;17306:5;:10;17302:53;;;17333:10;;;;;;;;;;;;;;;;;;;;;17302:53;17365:12;17380:5;17365:20;;17396:14;17421:78;17436:1;17428:4;:9;17421:78;;17454:8;;;;;:::i;:::-;;;;17485:2;17477:10;;;;;:::i;:::-;;;17421:78;;;17509:19;17541:6;17531:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17509:39;;17559:154;17575:1;17566:5;:10;17559:154;;17603:1;17593:11;;;;;:::i;:::-;;;17670:2;17662:5;:10;;;;:::i;:::-;17649:2;:24;;;;:::i;:::-;17636:39;;17619:6;17626;17619:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17699:2;17690:11;;;;;:::i;:::-;;;17559:154;;;17737:6;17723:21;;;;;17029:723;;;;:::o;6380:157::-;6465:4;6504:25;6489:40;;;:11;:40;;;;6482:47;;6380:157;;;:::o;42367:589::-;42511:45;42538:4;42544:2;42548:7;42511:26;:45::i;:::-;42589:1;42573:18;;:4;:18;;;42569:187;;;42608:40;42640:7;42608:31;:40::i;:::-;42569:187;;;42678:2;42670:10;;:4;:10;;;42666:90;;42697:47;42730:4;42736:7;42697:32;:47::i;:::-;42666:90;42569:187;42784:1;42770:16;;:2;:16;;;42766:183;;;42803:45;42840:7;42803:36;:45::i;:::-;42766:183;;;42876:4;42870:10;;:2;:10;;;42866:83;;42897:40;42925:2;42929:7;42897:27;:40::i;:::-;42866:83;42766:183;42367:589;;;:::o;34093:321::-;34223:18;34229:2;34233:7;34223:5;:18::i;:::-;34274:54;34305:1;34309:2;34313:7;34322:5;34274:22;:54::i;:::-;34252:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34093:321;;;:::o;37493:799::-;37648:4;37669:15;:2;:13;;;:15::i;:::-;37665:620;;;37721:2;37705:36;;;37742:12;:10;:12::i;:::-;37756:4;37762:7;37771:5;37705:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37701:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37964:1;37947:6;:13;:18;37943:272;;;37990:60;;;;;;;;;;:::i;:::-;;;;;;;;37943:272;38165:6;38159:13;38150:6;38146:2;38142:15;38135:38;37701:529;37838:41;;;37828:51;;;:6;:51;;;;37821:58;;;;;37665:620;38269:4;38262:11;;37493:799;;;;;;;:::o;38864:126::-;;;;:::o;43679:164::-;43783:10;:17;;;;43756:15;:24;43772:7;43756:24;;;;;;;;;;;:44;;;;43811:10;43827:7;43811:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43679:164;:::o;44470:988::-;44736:22;44786:1;44761:22;44778:4;44761:16;:22::i;:::-;:26;;;;:::i;:::-;44736:51;;44798:18;44819:17;:26;44837:7;44819:26;;;;;;;;;;;;44798:47;;44966:14;44952:10;:28;44948:328;;44997:19;45019:12;:18;45032:4;45019:18;;;;;;;;;;;;;;;:34;45038:14;45019:34;;;;;;;;;;;;44997:56;;45103:11;45070:12;:18;45083:4;45070:18;;;;;;;;;;;;;;;:30;45089:10;45070:30;;;;;;;;;;;:44;;;;45220:10;45187:17;:30;45205:11;45187:30;;;;;;;;;;;:43;;;;44948:328;;45372:17;:26;45390:7;45372:26;;;;;;;;;;;45365:33;;;45416:12;:18;45429:4;45416:18;;;;;;;;;;;;;;;:34;45435:14;45416:34;;;;;;;;;;;45409:41;;;44470:988;;;;:::o;45753:1079::-;46006:22;46051:1;46031:10;:17;;;;:21;;;;:::i;:::-;46006:46;;46063:18;46084:15;:24;46100:7;46084:24;;;;;;;;;;;;46063:45;;46435:19;46457:10;46468:14;46457:26;;;;;;;;;;;;;;;;;;;;;;;;46435:48;;46521:11;46496:10;46507;46496:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;46632:10;46601:15;:28;46617:11;46601:28;;;;;;;;;;;:41;;;;46773:15;:24;46789:7;46773:24;;;;;;;;;;;46766:31;;;46808:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45753:1079;;;;:::o;43257:221::-;43342:14;43359:20;43376:2;43359:16;:20::i;:::-;43342:37;;43417:7;43390:12;:16;43403:2;43390:16;;;;;;;;;;;;;;;:24;43407:6;43390:24;;;;;;;;;;;:34;;;;43464:6;43435:17;:26;43453:7;43435:26;;;;;;;;;;;:35;;;;43257:221;;;:::o;34750:382::-;34844:1;34830:16;;:2;:16;;;;34822:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34903:16;34911:7;34903;:16::i;:::-;34902:17;34894:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34965:45;34994:1;34998:2;35002:7;34965:20;:45::i;:::-;35040:1;35023:9;:13;35033:2;35023:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35071:2;35052:7;:16;35060:7;35052:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35116:7;35112:2;35091:33;;35108:1;35091:33;;;;;;;;;;;;34750:382;;:::o;8712:387::-;8772:4;8980:12;9047:7;9035:20;9027:28;;9090:1;9083:4;:8;9076:15;;;8712:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:143::-;;938:6;932:13;923:22;;954:33;981:5;954:33;:::i;:::-;913:80;;;;:::o;999:133::-;;1080:6;1067:20;1058:29;;1096:30;1120:5;1096:30;:::i;:::-;1048:84;;;;:::o;1138:137::-;;1221:6;1208:20;1199:29;;1237:32;1263:5;1237:32;:::i;:::-;1189:86;;;;:::o;1281:141::-;;1368:6;1362:13;1353:22;;1384:32;1410:5;1384:32;:::i;:::-;1343:79;;;;:::o;1441:271::-;;1545:3;1538:4;1530:6;1526:17;1522:27;1512:2;;1563:1;1560;1553:12;1512:2;1603:6;1590:20;1628:78;1702:3;1694:6;1687:4;1679:6;1675:17;1628:78;:::i;:::-;1619:87;;1502:210;;;;;:::o;1718:169::-;;1817:6;1804:20;1795:29;;1833:48;1875:5;1833:48;:::i;:::-;1785:102;;;;:::o;1907:273::-;;2012:3;2005:4;1997:6;1993:17;1989:27;1979:2;;2030:1;2027;2020:12;1979:2;2070:6;2057:20;2095:79;2170:3;2162:6;2155:4;2147:6;2143:17;2095:79;:::i;:::-;2086:88;;1969:211;;;;;:::o;2186:139::-;;2270:6;2257:20;2248:29;;2286:33;2313:5;2286:33;:::i;:::-;2238:87;;;;:::o;2331:262::-;;2439:2;2427:9;2418:7;2414:23;2410:32;2407:2;;;2455:1;2452;2445:12;2407:2;2498:1;2523:53;2568:7;2559:6;2548:9;2544:22;2523:53;:::i;:::-;2513:63;;2469:117;2397:196;;;;:::o;2599:284::-;;2718:2;2706:9;2697:7;2693:23;2689:32;2686:2;;;2734:1;2731;2724:12;2686:2;2777:1;2802:64;2858:7;2849:6;2838:9;2834:22;2802:64;:::i;:::-;2792:74;;2748:128;2676:207;;;;:::o;2889:407::-;;;3014:2;3002:9;2993:7;2989:23;2985:32;2982:2;;;3030:1;3027;3020:12;2982:2;3073:1;3098:53;3143:7;3134:6;3123:9;3119:22;3098:53;:::i;:::-;3088:63;;3044:117;3200:2;3226:53;3271:7;3262:6;3251:9;3247:22;3226:53;:::i;:::-;3216:63;;3171:118;2972:324;;;;;:::o;3302:552::-;;;;3444:2;3432:9;3423:7;3419:23;3415:32;3412:2;;;3460:1;3457;3450:12;3412:2;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3402:452;;;;;:::o;3860:809::-;;;;;4028:3;4016:9;4007:7;4003:23;3999:33;3996:2;;;4045:1;4042;4035:12;3996:2;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;4215:2;4241:53;4286:7;4277:6;4266:9;4262:22;4241:53;:::i;:::-;4231:63;;4186:118;4343:2;4369:53;4414:7;4405:6;4394:9;4390:22;4369:53;:::i;:::-;4359:63;;4314:118;4499:2;4488:9;4484:18;4471:32;4530:18;4522:6;4519:30;4516:2;;;4562:1;4559;4552:12;4516:2;4590:62;4644:7;4635:6;4624:9;4620:22;4590:62;:::i;:::-;4580:72;;4442:220;3986:683;;;;;;;:::o;4675:401::-;;;4797:2;4785:9;4776:7;4772:23;4768:32;4765:2;;;4813:1;4810;4803:12;4765:2;4856:1;4881:53;4926:7;4917:6;4906:9;4902:22;4881:53;:::i;:::-;4871:63;;4827:117;4983:2;5009:50;5051:7;5042:6;5031:9;5027:22;5009:50;:::i;:::-;4999:60;;4954:115;4755:321;;;;;:::o;5082:407::-;;;5207:2;5195:9;5186:7;5182:23;5178:32;5175:2;;;5223:1;5220;5213:12;5175:2;5266:1;5291:53;5336:7;5327:6;5316:9;5312:22;5291:53;:::i;:::-;5281:63;;5237:117;5393:2;5419:53;5464:7;5455:6;5444:9;5440:22;5419:53;:::i;:::-;5409:63;;5364:118;5165:324;;;;;:::o;5495:260::-;;5602:2;5590:9;5581:7;5577:23;5573:32;5570:2;;;5618:1;5615;5608:12;5570:2;5661:1;5686:52;5730:7;5721:6;5710:9;5706:22;5686:52;:::i;:::-;5676:62;;5632:116;5560:195;;;;:::o;5761:282::-;;5879:2;5867:9;5858:7;5854:23;5850:32;5847:2;;;5895:1;5892;5885:12;5847:2;5938:1;5963:63;6018:7;6009:6;5998:9;5994:22;5963:63;:::i;:::-;5953:73;;5909:127;5837:206;;;;:::o;6049:375::-;;6167:2;6155:9;6146:7;6142:23;6138:32;6135:2;;;6183:1;6180;6173:12;6135:2;6254:1;6243:9;6239:17;6226:31;6284:18;6276:6;6273:30;6270:2;;;6316:1;6313;6306:12;6270:2;6344:63;6399:7;6390:6;6379:9;6375:22;6344:63;:::i;:::-;6334:73;;6197:220;6125:299;;;;:::o;6430:262::-;;6538:2;6526:9;6517:7;6513:23;6509:32;6506:2;;;6554:1;6551;6544:12;6506:2;6597:1;6622:53;6667:7;6658:6;6647:9;6643:22;6622:53;:::i;:::-;6612:63;;6568:117;6496:196;;;;:::o;6698:582::-;;;;6855:2;6843:9;6834:7;6830:23;6826:32;6823:2;;;6871:1;6868;6861:12;6823:2;6914:1;6939:53;6984:7;6975:6;6964:9;6960:22;6939:53;:::i;:::-;6929:63;;6885:117;7041:2;7067:68;7127:7;7118:6;7107:9;7103:22;7067:68;:::i;:::-;7057:78;;7012:133;7184:2;7210:53;7255:7;7246:6;7235:9;7231:22;7210:53;:::i;:::-;7200:63;;7155:118;6813:467;;;;;:::o;7286:663::-;;;;7437:2;7425:9;7416:7;7412:23;7408:32;7405:2;;;7453:1;7450;7443:12;7405:2;7496:1;7521:53;7566:7;7557:6;7546:9;7542:22;7521:53;:::i;:::-;7511:63;;7467:117;7623:2;7649:53;7694:7;7685:6;7674:9;7670:22;7649:53;:::i;:::-;7639:63;;7594:118;7779:2;7768:9;7764:18;7751:32;7810:18;7802:6;7799:30;7796:2;;;7842:1;7839;7832:12;7796:2;7870:62;7924:7;7915:6;7904:9;7900:22;7870:62;:::i;:::-;7860:72;;7722:220;7395:554;;;;;:::o;7955:118::-;8042:24;8060:5;8042:24;:::i;:::-;8037:3;8030:37;8020:53;;:::o;8079:157::-;8184:45;8204:24;8222:5;8204:24;:::i;:::-;8184:45;:::i;:::-;8179:3;8172:58;8162:74;;:::o;8242:109::-;8323:21;8338:5;8323:21;:::i;:::-;8318:3;8311:34;8301:50;;:::o;8357:118::-;8444:24;8462:5;8444:24;:::i;:::-;8439:3;8432:37;8422:53;;:::o;8481:360::-;;8595:38;8627:5;8595:38;:::i;:::-;8649:70;8712:6;8707:3;8649:70;:::i;:::-;8642:77;;8728:52;8773:6;8768:3;8761:4;8754:5;8750:16;8728:52;:::i;:::-;8805:29;8827:6;8805:29;:::i;:::-;8800:3;8796:39;8789:46;;8571:270;;;;;:::o;8847:364::-;;8963:39;8996:5;8963:39;:::i;:::-;9018:71;9082:6;9077:3;9018:71;:::i;:::-;9011:78;;9098:52;9143:6;9138:3;9131:4;9124:5;9120:16;9098:52;:::i;:::-;9175:29;9197:6;9175:29;:::i;:::-;9170:3;9166:39;9159:46;;8939:272;;;;;:::o;9217:377::-;;9351:39;9384:5;9351:39;:::i;:::-;9406:89;9488:6;9483:3;9406:89;:::i;:::-;9399:96;;9504:52;9549:6;9544:3;9537:4;9530:5;9526:16;9504:52;:::i;:::-;9581:6;9576:3;9572:16;9565:23;;9327:267;;;;;:::o;9624:845::-;;9764:5;9758:12;9793:36;9819:9;9793:36;:::i;:::-;9845:89;9927:6;9922:3;9845:89;:::i;:::-;9838:96;;9965:1;9954:9;9950:17;9981:1;9976:137;;;;10127:1;10122:341;;;;9943:520;;9976:137;10060:4;10056:9;10045;10041:25;10036:3;10029:38;10096:6;10091:3;10087:16;10080:23;;9976:137;;10122:341;10189:38;10221:5;10189:38;:::i;:::-;10249:1;10263:154;10277:6;10274:1;10271:13;10263:154;;;10351:7;10345:14;10341:1;10336:3;10332:11;10325:35;10401:1;10392:7;10388:15;10377:26;;10299:4;10296:1;10292:12;10287:17;;10263:154;;;10446:6;10441:3;10437:16;10430:23;;10129:334;;9943:520;;9731:738;;;;;;:::o;10475:375::-;;10638:67;10702:2;10697:3;10638:67;:::i;:::-;10631:74;;10735:34;10731:1;10726:3;10722:11;10715:55;10801:13;10796:2;10791:3;10787:12;10780:35;10841:2;10836:3;10832:12;10825:19;;10621:229;;;:::o;10856:382::-;;11019:67;11083:2;11078:3;11019:67;:::i;:::-;11012:74;;11116:34;11112:1;11107:3;11103:11;11096:55;11182:20;11177:2;11172:3;11168:12;11161:42;11229:2;11224:3;11220:12;11213:19;;11002:236;;;:::o;11244:370::-;;11407:67;11471:2;11466:3;11407:67;:::i;:::-;11400:74;;11504:34;11500:1;11495:3;11491:11;11484:55;11570:8;11565:2;11560:3;11556:12;11549:30;11605:2;11600:3;11596:12;11589:19;;11390:224;;;:::o;11620:326::-;;11783:67;11847:2;11842:3;11783:67;:::i;:::-;11776:74;;11880:30;11876:1;11871:3;11867:11;11860:51;11937:2;11932:3;11928:12;11921:19;;11766:180;;;:::o;11952:368::-;;12115:67;12179:2;12174:3;12115:67;:::i;:::-;12108:74;;12212:34;12208:1;12203:3;12199:11;12192:55;12278:6;12273:2;12268:3;12264:12;12257:28;12311:2;12306:3;12302:12;12295:19;;12098:222;;;:::o;12326:323::-;;12489:67;12553:2;12548:3;12489:67;:::i;:::-;12482:74;;12586:27;12582:1;12577:3;12573:11;12566:48;12640:2;12635:3;12631:12;12624:19;;12472:177;;;:::o;12655:384::-;;12818:67;12882:2;12877:3;12818:67;:::i;:::-;12811:74;;12915:34;12911:1;12906:3;12902:11;12895:55;12981:22;12976:2;12971:3;12967:12;12960:44;13030:2;13025:3;13021:12;13014:19;;12801:238;;;:::o;13045:329::-;;13208:67;13272:2;13267:3;13208:67;:::i;:::-;13201:74;;13305:33;13301:1;13296:3;13292:11;13285:54;13365:2;13360:3;13356:12;13349:19;;13191:183;;;:::o;13380:379::-;;13543:67;13607:2;13602:3;13543:67;:::i;:::-;13536:74;;13640:34;13636:1;13631:3;13627:11;13620:55;13706:17;13701:2;13696:3;13692:12;13685:39;13750:2;13745:3;13741:12;13734:19;;13526:233;;;:::o;13765:376::-;;13928:67;13992:2;13987:3;13928:67;:::i;:::-;13921:74;;14025:34;14021:1;14016:3;14012:11;14005:55;14091:14;14086:2;14081:3;14077:12;14070:36;14132:2;14127:3;14123:12;14116:19;;13911:230;;;:::o;14147:327::-;;14310:67;14374:2;14369:3;14310:67;:::i;:::-;14303:74;;14407:31;14403:1;14398:3;14394:11;14387:52;14465:2;14460:3;14456:12;14449:19;;14293:181;;;:::o;14480:388::-;;14643:67;14707:2;14702:3;14643:67;:::i;:::-;14636:74;;14740:34;14736:1;14731:3;14727:11;14720:55;14806:26;14801:2;14796:3;14792:12;14785:48;14859:2;14854:3;14850:12;14843:19;;14626:242;;;:::o;14874:374::-;;15037:67;15101:2;15096:3;15037:67;:::i;:::-;15030:74;;15134:34;15130:1;15125:3;15121:11;15114:55;15200:12;15195:2;15190:3;15186:12;15179:34;15239:2;15234:3;15230:12;15223:19;;15020:228;;;:::o;15254:373::-;;15417:67;15481:2;15476:3;15417:67;:::i;:::-;15410:74;;15514:34;15510:1;15505:3;15501:11;15494:55;15580:11;15575:2;15570:3;15566:12;15559:33;15618:2;15613:3;15609:12;15602:19;;15400:227;;;:::o;15633:330::-;;15796:67;15860:2;15855:3;15796:67;:::i;:::-;15789:74;;15893:34;15889:1;15884:3;15880:11;15873:55;15954:2;15949:3;15945:12;15938:19;;15779:184;;;:::o;15969:376::-;;16132:67;16196:2;16191:3;16132:67;:::i;:::-;16125:74;;16229:34;16225:1;16220:3;16216:11;16209:55;16295:14;16290:2;16285:3;16281:12;16274:36;16336:2;16331:3;16327:12;16320:19;;16115:230;;;:::o;16351:315::-;;16514:67;16578:2;16573:3;16514:67;:::i;:::-;16507:74;;16611:19;16607:1;16602:3;16598:11;16591:40;16657:2;16652:3;16648:12;16641:19;;16497:169;;;:::o;16672:330::-;;16835:67;16899:2;16894:3;16835:67;:::i;:::-;16828:74;;16932:34;16928:1;16923:3;16919:11;16912:55;16993:2;16988:3;16984:12;16977:19;;16818:184;;;:::o;17008:373::-;;17171:67;17235:2;17230:3;17171:67;:::i;:::-;17164:74;;17268:34;17264:1;17259:3;17255:11;17248:55;17334:11;17329:2;17324:3;17320:12;17313:33;17372:2;17367:3;17363:12;17356:19;;17154:227;;;:::o;17387:379::-;;17550:67;17614:2;17609:3;17550:67;:::i;:::-;17543:74;;17647:34;17643:1;17638:3;17634:11;17627:55;17713:17;17708:2;17703:3;17699:12;17692:39;17757:2;17752:3;17748:12;17741:19;;17533:233;;;:::o;17772:325::-;;17935:67;17999:2;17994:3;17935:67;:::i;:::-;17928:74;;18032:29;18028:1;18023:3;18019:11;18012:50;18088:2;18083:3;18079:12;18072:19;;17918:179;;;:::o;18103:365::-;;18266:67;18330:2;18325:3;18266:67;:::i;:::-;18259:74;;18363:34;18359:1;18354:3;18350:11;18343:55;18429:3;18424:2;18419:3;18415:12;18408:25;18459:2;18454:3;18450:12;18443:19;;18249:219;;;:::o;18474:327::-;;18637:67;18701:2;18696:3;18637:67;:::i;:::-;18630:74;;18734:31;18730:1;18725:3;18721:11;18714:52;18792:2;18787:3;18783:12;18776:19;;18620:181;;;:::o;18807:314::-;;18970:67;19034:2;19029:3;18970:67;:::i;:::-;18963:74;;19067:18;19063:1;19058:3;19054:11;19047:39;19112:2;19107:3;19103:12;19096:19;;18953:168;;;:::o;19127:381::-;;19290:67;19354:2;19349:3;19290:67;:::i;:::-;19283:74;;19387:34;19383:1;19378:3;19374:11;19367:55;19453:19;19448:2;19443:3;19439:12;19432:41;19499:2;19494:3;19490:12;19483:19;;19273:235;;;:::o;19514:376::-;;19677:67;19741:2;19736:3;19677:67;:::i;:::-;19670:74;;19774:34;19770:1;19765:3;19761:11;19754:55;19840:14;19835:2;19830:3;19826:12;19819:36;19881:2;19876:3;19872:12;19865:19;;19660:230;;;:::o;19896:330::-;;20059:67;20123:2;20118:3;20059:67;:::i;:::-;20052:74;;20156:34;20152:1;20147:3;20143:11;20136:55;20217:2;20212:3;20208:12;20201:19;;20042:184;;;:::o;20232:370::-;;20395:67;20459:2;20454:3;20395:67;:::i;:::-;20388:74;;20492:34;20488:1;20483:3;20479:11;20472:55;20558:8;20553:2;20548:3;20544:12;20537:30;20593:2;20588:3;20584:12;20577:19;;20378:224;;;:::o;20608:383::-;;20771:67;20835:2;20830:3;20771:67;:::i;:::-;20764:74;;20868:34;20864:1;20859:3;20855:11;20848:55;20934:21;20929:2;20924:3;20920:12;20913:43;20982:2;20977:3;20973:12;20966:19;;20754:237;;;:::o;20997:118::-;21084:24;21102:5;21084:24;:::i;:::-;21079:3;21072:37;21062:53;;:::o;21121:157::-;21226:45;21246:24;21264:5;21246:24;:::i;:::-;21226:45;:::i;:::-;21221:3;21214:58;21204:74;;:::o;21284:112::-;21367:22;21383:5;21367:22;:::i;:::-;21362:3;21355:35;21345:51;;:::o;21402:397::-;;21557:75;21628:3;21619:6;21557:75;:::i;:::-;21657:2;21652:3;21648:12;21641:19;;21670:75;21741:3;21732:6;21670:75;:::i;:::-;21770:2;21765:3;21761:12;21754:19;;21790:3;21783:10;;21546:253;;;;;:::o;21805:429::-;;22004:92;22092:3;22083:6;22004:92;:::i;:::-;21997:99;;22113:95;22204:3;22195:6;22113:95;:::i;:::-;22106:102;;22225:3;22218:10;;21986:248;;;;;:::o;22240:222::-;;22371:2;22360:9;22356:18;22348:26;;22384:71;22452:1;22441:9;22437:17;22428:6;22384:71;:::i;:::-;22338:124;;;;:::o;22468:640::-;;22701:3;22690:9;22686:19;22678:27;;22715:71;22783:1;22772:9;22768:17;22759:6;22715:71;:::i;:::-;22796:72;22864:2;22853:9;22849:18;22840:6;22796:72;:::i;:::-;22878;22946:2;22935:9;22931:18;22922:6;22878:72;:::i;:::-;22997:9;22991:4;22987:20;22982:2;22971:9;22967:18;22960:48;23025:76;23096:4;23087:6;23025:76;:::i;:::-;23017:84;;22668:440;;;;;;;:::o;23114:210::-;;23239:2;23228:9;23224:18;23216:26;;23252:65;23314:1;23303:9;23299:17;23290:6;23252:65;:::i;:::-;23206:118;;;;:::o;23330:545::-;;23541:3;23530:9;23526:19;23518:27;;23555:71;23623:1;23612:9;23608:17;23599:6;23555:71;:::i;:::-;23636:68;23700:2;23689:9;23685:18;23676:6;23636:68;:::i;:::-;23714:72;23782:2;23771:9;23767:18;23758:6;23714:72;:::i;:::-;23796;23864:2;23853:9;23849:18;23840:6;23796:72;:::i;:::-;23508:367;;;;;;;:::o;23881:313::-;;24032:2;24021:9;24017:18;24009:26;;24081:9;24075:4;24071:20;24067:1;24056:9;24052:17;24045:47;24109:78;24182:4;24173:6;24109:78;:::i;:::-;24101:86;;23999:195;;;;:::o;24200:419::-;;24404:2;24393:9;24389:18;24381:26;;24453:9;24447:4;24443:20;24439:1;24428:9;24424:17;24417:47;24481:131;24607:4;24481:131;:::i;:::-;24473:139;;24371:248;;;:::o;24625:419::-;;24829:2;24818:9;24814:18;24806:26;;24878:9;24872:4;24868:20;24864:1;24853:9;24849:17;24842:47;24906:131;25032:4;24906:131;:::i;:::-;24898:139;;24796:248;;;:::o;25050:419::-;;25254:2;25243:9;25239:18;25231:26;;25303:9;25297:4;25293:20;25289:1;25278:9;25274:17;25267:47;25331:131;25457:4;25331:131;:::i;:::-;25323:139;;25221:248;;;:::o;25475:419::-;;25679:2;25668:9;25664:18;25656:26;;25728:9;25722:4;25718:20;25714:1;25703:9;25699:17;25692:47;25756:131;25882:4;25756:131;:::i;:::-;25748:139;;25646:248;;;:::o;25900:419::-;;26104:2;26093:9;26089:18;26081:26;;26153:9;26147:4;26143:20;26139:1;26128:9;26124:17;26117:47;26181:131;26307:4;26181:131;:::i;:::-;26173:139;;26071:248;;;:::o;26325:419::-;;26529:2;26518:9;26514:18;26506:26;;26578:9;26572:4;26568:20;26564:1;26553:9;26549:17;26542:47;26606:131;26732:4;26606:131;:::i;:::-;26598:139;;26496:248;;;:::o;26750:419::-;;26954:2;26943:9;26939:18;26931:26;;27003:9;26997:4;26993:20;26989:1;26978:9;26974:17;26967:47;27031:131;27157:4;27031:131;:::i;:::-;27023:139;;26921:248;;;:::o;27175:419::-;;27379:2;27368:9;27364:18;27356:26;;27428:9;27422:4;27418:20;27414:1;27403:9;27399:17;27392:47;27456:131;27582:4;27456:131;:::i;:::-;27448:139;;27346:248;;;:::o;27600:419::-;;27804:2;27793:9;27789:18;27781:26;;27853:9;27847:4;27843:20;27839:1;27828:9;27824:17;27817:47;27881:131;28007:4;27881:131;:::i;:::-;27873:139;;27771:248;;;:::o;28025:419::-;;28229:2;28218:9;28214:18;28206:26;;28278:9;28272:4;28268:20;28264:1;28253:9;28249:17;28242:47;28306:131;28432:4;28306:131;:::i;:::-;28298:139;;28196:248;;;:::o;28450:419::-;;28654:2;28643:9;28639:18;28631:26;;28703:9;28697:4;28693:20;28689:1;28678:9;28674:17;28667:47;28731:131;28857:4;28731:131;:::i;:::-;28723:139;;28621:248;;;:::o;28875:419::-;;29079:2;29068:9;29064:18;29056:26;;29128:9;29122:4;29118:20;29114:1;29103:9;29099:17;29092:47;29156:131;29282:4;29156:131;:::i;:::-;29148:139;;29046:248;;;:::o;29300:419::-;;29504:2;29493:9;29489:18;29481:26;;29553:9;29547:4;29543:20;29539:1;29528:9;29524:17;29517:47;29581:131;29707:4;29581:131;:::i;:::-;29573:139;;29471:248;;;:::o;29725:419::-;;29929:2;29918:9;29914:18;29906:26;;29978:9;29972:4;29968:20;29964:1;29953:9;29949:17;29942:47;30006:131;30132:4;30006:131;:::i;:::-;29998:139;;29896:248;;;:::o;30150:419::-;;30354:2;30343:9;30339:18;30331:26;;30403:9;30397:4;30393:20;30389:1;30378:9;30374:17;30367:47;30431:131;30557:4;30431:131;:::i;:::-;30423:139;;30321:248;;;:::o;30575:419::-;;30779:2;30768:9;30764:18;30756:26;;30828:9;30822:4;30818:20;30814:1;30803:9;30799:17;30792:47;30856:131;30982:4;30856:131;:::i;:::-;30848:139;;30746:248;;;:::o;31000:419::-;;31204:2;31193:9;31189:18;31181:26;;31253:9;31247:4;31243:20;31239:1;31228:9;31224:17;31217:47;31281:131;31407:4;31281:131;:::i;:::-;31273:139;;31171:248;;;:::o;31425:419::-;;31629:2;31618:9;31614:18;31606:26;;31678:9;31672:4;31668:20;31664:1;31653:9;31649:17;31642:47;31706:131;31832:4;31706:131;:::i;:::-;31698:139;;31596:248;;;:::o;31850:419::-;;32054:2;32043:9;32039:18;32031:26;;32103:9;32097:4;32093:20;32089:1;32078:9;32074:17;32067:47;32131:131;32257:4;32131:131;:::i;:::-;32123:139;;32021:248;;;:::o;32275:419::-;;32479:2;32468:9;32464:18;32456:26;;32528:9;32522:4;32518:20;32514:1;32503:9;32499:17;32492:47;32556:131;32682:4;32556:131;:::i;:::-;32548:139;;32446:248;;;:::o;32700:419::-;;32904:2;32893:9;32889:18;32881:26;;32953:9;32947:4;32943:20;32939:1;32928:9;32924:17;32917:47;32981:131;33107:4;32981:131;:::i;:::-;32973:139;;32871:248;;;:::o;33125:419::-;;33329:2;33318:9;33314:18;33306:26;;33378:9;33372:4;33368:20;33364:1;33353:9;33349:17;33342:47;33406:131;33532:4;33406:131;:::i;:::-;33398:139;;33296:248;;;:::o;33550:419::-;;33754:2;33743:9;33739:18;33731:26;;33803:9;33797:4;33793:20;33789:1;33778:9;33774:17;33767:47;33831:131;33957:4;33831:131;:::i;:::-;33823:139;;33721:248;;;:::o;33975:419::-;;34179:2;34168:9;34164:18;34156:26;;34228:9;34222:4;34218:20;34214:1;34203:9;34199:17;34192:47;34256:131;34382:4;34256:131;:::i;:::-;34248:139;;34146:248;;;:::o;34400:419::-;;34604:2;34593:9;34589:18;34581:26;;34653:9;34647:4;34643:20;34639:1;34628:9;34624:17;34617:47;34681:131;34807:4;34681:131;:::i;:::-;34673:139;;34571:248;;;:::o;34825:419::-;;35029:2;35018:9;35014:18;35006:26;;35078:9;35072:4;35068:20;35064:1;35053:9;35049:17;35042:47;35106:131;35232:4;35106:131;:::i;:::-;35098:139;;34996:248;;;:::o;35250:419::-;;35454:2;35443:9;35439:18;35431:26;;35503:9;35497:4;35493:20;35489:1;35478:9;35474:17;35467:47;35531:131;35657:4;35531:131;:::i;:::-;35523:139;;35421:248;;;:::o;35675:419::-;;35879:2;35868:9;35864:18;35856:26;;35928:9;35922:4;35918:20;35914:1;35903:9;35899:17;35892:47;35956:131;36082:4;35956:131;:::i;:::-;35948:139;;35846:248;;;:::o;36100:419::-;;36304:2;36293:9;36289:18;36281:26;;36353:9;36347:4;36343:20;36339:1;36328:9;36324:17;36317:47;36381:131;36507:4;36381:131;:::i;:::-;36373:139;;36271:248;;;:::o;36525:222::-;;36656:2;36645:9;36641:18;36633:26;;36669:71;36737:1;36726:9;36722:17;36713:6;36669:71;:::i;:::-;36623:124;;;;:::o;36753:283::-;;36819:2;36813:9;36803:19;;36861:4;36853:6;36849:17;36968:6;36956:10;36953:22;36932:18;36920:10;36917:34;36914:62;36911:2;;;36979:18;;:::i;:::-;36911:2;37019:10;37015:2;37008:22;36793:243;;;;:::o;37042:331::-;;37193:18;37185:6;37182:30;37179:2;;;37215:18;;:::i;:::-;37179:2;37300:4;37296:9;37289:4;37281:6;37277:17;37273:33;37265:41;;37361:4;37355;37351:15;37343:23;;37108:265;;;:::o;37379:332::-;;37531:18;37523:6;37520:30;37517:2;;;37553:18;;:::i;:::-;37517:2;37638:4;37634:9;37627:4;37619:6;37615:17;37611:33;37603:41;;37699:4;37693;37689:15;37681:23;;37446:265;;;:::o;37717:141::-;;37789:3;37781:11;;37812:3;37809:1;37802:14;37846:4;37843:1;37833:18;37825:26;;37771:87;;;:::o;37864:98::-;;37949:5;37943:12;37933:22;;37922:40;;;:::o;37968:99::-;;38054:5;38048:12;38038:22;;38027:40;;;:::o;38073:168::-;;38190:6;38185:3;38178:19;38230:4;38225:3;38221:14;38206:29;;38168:73;;;;:::o;38247:169::-;;38365:6;38360:3;38353:19;38405:4;38400:3;38396:14;38381:29;;38343:73;;;;:::o;38422:148::-;;38561:3;38546:18;;38536:34;;;;:::o;38576:305::-;;38635:20;38653:1;38635:20;:::i;:::-;38630:25;;38669:20;38687:1;38669:20;:::i;:::-;38664:25;;38823:1;38755:66;38751:74;38748:1;38745:81;38742:2;;;38829:18;;:::i;:::-;38742:2;38873:1;38870;38866:9;38859:16;;38620:261;;;;:::o;38887:185::-;;38944:20;38962:1;38944:20;:::i;:::-;38939:25;;38978:20;38996:1;38978:20;:::i;:::-;38973:25;;39017:1;39007:2;;39022:18;;:::i;:::-;39007:2;39064:1;39061;39057:9;39052:14;;38929:143;;;;:::o;39078:348::-;;39141:20;39159:1;39141:20;:::i;:::-;39136:25;;39175:20;39193:1;39175:20;:::i;:::-;39170:25;;39363:1;39295:66;39291:74;39288:1;39285:81;39280:1;39273:9;39266:17;39262:105;39259:2;;;39370:18;;:::i;:::-;39259:2;39418:1;39415;39411:9;39400:20;;39126:300;;;;:::o;39432:191::-;;39492:20;39510:1;39492:20;:::i;:::-;39487:25;;39526:20;39544:1;39526:20;:::i;:::-;39521:25;;39565:1;39562;39559:8;39556:2;;;39570:18;;:::i;:::-;39556:2;39615:1;39612;39608:9;39600:17;;39477:146;;;;:::o;39629:96::-;;39695:24;39713:5;39695:24;:::i;:::-;39684:35;;39674:51;;;:::o;39731:90::-;;39808:5;39801:13;39794:21;39783:32;;39773:48;;;:::o;39827:77::-;;39893:5;39882:16;;39872:32;;;:::o;39910:149::-;;39986:66;39979:5;39975:78;39964:89;;39954:105;;;:::o;40065:111::-;;40146:24;40164:5;40146:24;:::i;:::-;40135:35;;40125:51;;;:::o;40182:126::-;;40259:42;40252:5;40248:54;40237:65;;40227:81;;;:::o;40314:77::-;;40380:5;40369:16;;40359:32;;;:::o;40397:86::-;;40472:4;40465:5;40461:16;40450:27;;40440:43;;;:::o;40489:154::-;40573:6;40568:3;40563;40550:30;40635:1;40626:6;40621:3;40617:16;40610:27;40540:103;;;:::o;40649:307::-;40717:1;40727:113;40741:6;40738:1;40735:13;40727:113;;;40826:1;40821:3;40817:11;40811:18;40807:1;40802:3;40798:11;40791:39;40763:2;40760:1;40756:10;40751:15;;40727:113;;;40858:6;40855:1;40852:13;40849:2;;;40938:1;40929:6;40924:3;40920:16;40913:27;40849:2;40698:258;;;;:::o;40962:320::-;;41043:1;41037:4;41033:12;41023:22;;41090:1;41084:4;41080:12;41111:18;41101:2;;41167:4;41159:6;41155:17;41145:27;;41101:2;41229;41221:6;41218:14;41198:18;41195:38;41192:2;;;41248:18;;:::i;:::-;41192:2;41013:269;;;;:::o;41288:233::-;;41350:24;41368:5;41350:24;:::i;:::-;41341:33;;41396:66;41389:5;41386:77;41383:2;;;41466:18;;:::i;:::-;41383:2;41513:1;41506:5;41502:13;41495:20;;41331:190;;;:::o;41527:100::-;;41595:26;41615:5;41595:26;:::i;:::-;41584:37;;41574:53;;;:::o;41633:94::-;;41701:20;41715:5;41701:20;:::i;:::-;41690:31;;41680:47;;;:::o;41733:79::-;;41801:5;41790:16;;41780:32;;;:::o;41818:176::-;;41867:20;41885:1;41867:20;:::i;:::-;41862:25;;41901:20;41919:1;41901:20;:::i;:::-;41896:25;;41940:1;41930:2;;41945:18;;:::i;:::-;41930:2;41986:1;41983;41979:9;41974:14;;41852:142;;;;:::o;42000:180::-;42048:77;42045:1;42038:88;42145:4;42142:1;42135:15;42169:4;42166:1;42159:15;42186:180;42234:77;42231:1;42224:88;42331:4;42328:1;42321:15;42355:4;42352:1;42345:15;42372:180;42420:77;42417:1;42410:88;42517:4;42514:1;42507:15;42541:4;42538:1;42531:15;42558:180;42606:77;42603:1;42596:88;42703:4;42700:1;42693:15;42727:4;42724:1;42717:15;42744:102;;42836:2;42832:7;42827:2;42820:5;42816:14;42812:28;42802:38;;42792:54;;;:::o;42852:94::-;;42933:5;42929:2;42925:14;42904:35;;42894:52;;;:::o;42952:122::-;43025:24;43043:5;43025:24;:::i;:::-;43018:5;43015:35;43005:2;;43064:1;43061;43054:12;43005:2;42995:79;:::o;43080:116::-;43150:21;43165:5;43150:21;:::i;:::-;43143:5;43140:32;43130:2;;43186:1;43183;43176:12;43130:2;43120:76;:::o;43202:120::-;43274:23;43291:5;43274:23;:::i;:::-;43267:5;43264:34;43254:2;;43312:1;43309;43302:12;43254:2;43244:78;:::o;43328:152::-;43416:39;43449:5;43416:39;:::i;:::-;43409:5;43406:50;43396:2;;43470:1;43467;43460:12;43396:2;43386:94;:::o;43486:122::-;43559:24;43577:5;43559:24;:::i;:::-;43552:5;43549:35;43539:2;;43598:1;43595;43588:12;43539:2;43529:79;:::o

Swarm Source

ipfs://466182dd39ac7cbd7d98eef45494de28b7999841e633af415644420d54872984
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.