ETH Price: $3,260.07 (-0.18%)
Gas: 1 Gwei

Token

TheUltimateSurvivor (TUS)
 

Overview

Max Total Supply

141 TUS

Holders

73

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TUS
0x6403AAe03667cDbcEeE9c14d4Bc6D45B7Dd4728e
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheUltimateSurvivorNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-28
*/

// SPDX-License-Identifier: MIT
// File: contracts/Survivor.sol



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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

pragma solidity ^0.8.0;

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

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since 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;
        }
    }
}

pragma solidity >=0.7.0 <0.9.0;

contract TheUltimateSurvivorNFT is ERC721Enumerable, Ownable {
  using Strings for uint256;
  using SafeMath for uint256;

  mapping(address => uint256) public whiteListClaims;

  uint public constant maxSurvivorWhiteList = 3;
  uint public constant maxTokenPurchase = 10;

  uint public constant MAX_PRESALE = 1000;
  uint256 public constant TEAM_RESERVE = 6; // Team NFTs are first 6
  uint256 public CURRENT_COMMUNITY;
  uint256 public MAX_TOKENS = 9738;

  uint256 public constant whiteListPrice = 0.07 ether;
  uint256 public constant publicSalePrice = 0.09 ether;

  string public PROVENANCE = "";

  bool public saleIsActive = false;
  bool public isPresaleActive = false;

  bytes32 public whiteList; // whitelist merkle hash

  string baseURI;
  string public baseExtension = ".json";

  bool public revealed = false;
  string public notRevealedUri;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
    CURRENT_COMMUNITY = 2762;
  }

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

    function reserveTokens() public onlyOwner {    
        uint supply = totalSupply();
        uint i;
        for (i = 1; i <= TEAM_RESERVE; i++) {
            _safeMint(msg.sender, supply + i);
        }
    }
    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipPresaleState() public onlyOwner {
        isPresaleActive = !isPresaleActive;
    }

    function setProvenance(string memory provenance) public onlyOwner {
        PROVENANCE = provenance;
    }

    function setMerkleRoot(bytes32 _root) public onlyOwner {
        whiteList = _root;
    }
  // public
  function mintPresale(uint numberOfTokens, bytes32[] calldata _merkleProof) public payable {
        require(isPresaleActive, "Presale must be active");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, whiteList,leaf), "Invalid Proof");
        
        uint256 claimed = whiteListClaims[msg.sender];

        require(claimed.add(numberOfTokens) <= maxSurvivorWhiteList, "Exceeded max token purchase");

        require(totalSupply().add(numberOfTokens) <= MAX_PRESALE.add(TEAM_RESERVE), "Purchase would exceed max presale tokens");

        require(whiteListPrice.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");

        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply() + 1;
            if(mintIndex <= MAX_PRESALE + TEAM_RESERVE) {
                _safeMint(msg.sender, mintIndex);
            }
        }

        whiteListClaims[msg.sender] = whiteListClaims[msg.sender] + numberOfTokens; // error here 
    }

function mintSurvivor(uint numberOfTokens) public payable {
    require(saleIsActive, "Sale is not active");
    require(numberOfTokens <= maxTokenPurchase, "Max purchase per transfer exceeds");
    require(totalSupply() + numberOfTokens <= CURRENT_COMMUNITY, "Current community limit exceeds");
    require(publicSalePrice * numberOfTokens <= msg.value, "Ether value wrong");

    for(uint i = 0; i < numberOfTokens; i++) {
        uint mintIndex = totalSupply() + 1;
        if(mintIndex <= CURRENT_COMMUNITY) {
            _safeMint(msg.sender, mintIndex);
        }
    }
}
function withdraw() public onlyOwner {
    uint balance = address(this).balance;
    payable(msg.sender).transfer(balance);
}

function setCurrentCommunity(uint256 _max) public onlyOwner {
    require(_max <= MAX_TOKENS, "Max tokens exceeds");
    CURRENT_COMMUNITY = _max;
}

function _leaf(address account, string memory payload) internal pure returns (bytes32)
{
    return keccak256(abi.encodePacked(payload, account));
}

function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool)
{
    return MerkleProof.verify(proof, whiteList, leaf);
}

function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

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

  //only owner
  function flipReveal() public onlyOwner {
      revealed = !revealed;
  }
  
  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

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

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }


}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CURRENT_COMMUNITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSurvivorWhiteList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintSurvivor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setCurrentCommunity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteListClaims","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whiteListPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405261260a600d5560405180602001604052806000815250600e908051906020019062000031929190620003dd565b506000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506040518060400160405280600581526020017f2e6a736f6e00000000000000000000000000000000000000000000000000000081525060129080519060200190620000b5929190620003dd565b506000601360006101000a81548160ff021916908315150217905550348015620000de57600080fd5b5060405162005cb738038062005cb783398181016040528101906200010491906200050b565b838381600090805190602001906200011e929190620003dd565b50806001908051906020019062000137929190620003dd565b5050506200015a6200014e6200018f60201b60201c565b6200019760201b60201c565b6200016b826200025d60201b60201c565b6200017c816200030860201b60201c565b610aca600c819055505050505062000800565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200026d6200018f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000293620003b360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e39062000620565b60405180910390fd5b806011908051906020019062000304929190620003dd565b5050565b620003186200018f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200033e620003b360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000397576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038e9062000620565b60405180910390fd5b8060149080519060200190620003af929190620003dd565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003eb90620006e8565b90600052602060002090601f0160209004810192826200040f57600085556200045b565b82601f106200042a57805160ff19168380011785556200045b565b828001600101855582156200045b579182015b828111156200045a5782518255916020019190600101906200043d565b5b5090506200046a91906200046e565b5090565b5b80821115620004895760008160009055506001016200046f565b5090565b6000620004a46200049e846200066b565b62000642565b905082815260208101848484011115620004c357620004c2620007b7565b5b620004d0848285620006b2565b509392505050565b600082601f830112620004f057620004ef620007b2565b5b8151620005028482602086016200048d565b91505092915050565b60008060008060808587031215620005285762000527620007c1565b5b600085015167ffffffffffffffff811115620005495762000548620007bc565b5b6200055787828801620004d8565b945050602085015167ffffffffffffffff8111156200057b576200057a620007bc565b5b6200058987828801620004d8565b935050604085015167ffffffffffffffff811115620005ad57620005ac620007bc565b5b620005bb87828801620004d8565b925050606085015167ffffffffffffffff811115620005df57620005de620007bc565b5b620005ed87828801620004d8565b91505092959194509250565b600062000608602083620006a1565b91506200061582620007d7565b602082019050919050565b600060208201905081810360008301526200063b81620005f9565b9050919050565b60006200064e62000661565b90506200065c82826200071e565b919050565b6000604051905090565b600067ffffffffffffffff82111562000689576200068862000783565b5b6200069482620007c6565b9050602081019050919050565b600082825260208201905092915050565b60005b83811015620006d2578082015181840152602081019050620006b5565b83811115620006e2576000848401525b50505050565b600060028204905060018216806200070157607f821691505b6020821081141562000718576200071762000754565b5b50919050565b6200072982620007c6565b810181811067ffffffffffffffff821117156200074b576200074a62000783565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6154a780620008106000396000f3fe6080604052600436106102ae5760003560e01c80636352211e11610175578063c6682862116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610a60578063f47c84c514610a89578063f81227d414610ab4578063ffe630b514610acb576102ae565b8063e985e9c5146109cf578063eb8d244414610a0c578063f2c4ce1e14610a37576102ae565b8063c6682862146108ad578063c87b56dd146108d8578063d552f9a114610915578063da3ef23f1461093e578063e139c1e214610967578063e5408eae146109a4576102ae565b80638da5cb5b1161012e5780638da5cb5b146107af57806395d89b41146107da5780639b6860c814610805578063a22cb46514610830578063b11eb7c814610859578063b88d4fde14610884576102ae565b80636352211e1461069f5780636373a6b1146106dc578063685756851461070757806370a0823114610732578063715018a61461076f5780637cb6475914610786576102ae565b80633544a864116102195780634d4c4e99116101d25780634d4c4e991461058d5780634f6ccce7146105b857806351830227146105f55780635464e6981461062057806355f804b31461064b57806360d938dc14610674576102ae565b80633544a864146104b25780633b84d9c6146104dd5780633ccfd60b146104f457806342842e0e1461050b578063438b63001461053457806345fb0a7314610571576102ae565b80630c0a6b5e1161026b5780630c0a6b5e146103d757806318160ddd146103f357806323b872dd1461041e57806327ac36c4146104475780632f745c591461045e57806334918dfd1461049b576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063081c8c4414610358578063095ea7b31461038357806309aa3dcf146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613bcb565b610af4565b6040516102e791906143e1565b60405180910390f35b3480156102fc57600080fd5b50610305610b6e565b6040516103129190614417565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613c6e565b610c00565b60405161034f9190614358565b60405180910390f35b34801561036457600080fd5b5061036d610c85565b60405161037a9190614417565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613b5e565b610d13565b005b3480156103b857600080fd5b506103c1610e2b565b6040516103ce91906147b9565b60405180910390f35b6103f160048036038101906103ec9190613c9b565b610e30565b005b3480156103ff57600080fd5b5061040861118b565b60405161041591906147b9565b60405180910390f35b34801561042a57600080fd5b5061044560048036038101906104409190613a48565b611198565b005b34801561045357600080fd5b5061045c6111f8565b005b34801561046a57600080fd5b5061048560048036038101906104809190613b5e565b6112bb565b60405161049291906147b9565b60405180910390f35b3480156104a757600080fd5b506104b0611360565b005b3480156104be57600080fd5b506104c7611408565b6040516104d491906143fc565b60405180910390f35b3480156104e957600080fd5b506104f261140e565b005b34801561050057600080fd5b506105096114b6565b005b34801561051757600080fd5b50610532600480360381019061052d9190613a48565b611581565b005b34801561054057600080fd5b5061055b600480360381019061055691906139db565b6115a1565b60405161056891906143bf565b60405180910390f35b61058b60048036038101906105869190613c6e565b61164f565b005b34801561059957600080fd5b506105a26117de565b6040516105af91906147b9565b60405180910390f35b3480156105c457600080fd5b506105df60048036038101906105da9190613c6e565b6117e4565b6040516105ec91906147b9565b60405180910390f35b34801561060157600080fd5b5061060a611855565b60405161061791906143e1565b60405180910390f35b34801561062c57600080fd5b50610635611868565b60405161064291906147b9565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613c25565b61186e565b005b34801561068057600080fd5b50610689611904565b60405161069691906143e1565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c19190613c6e565b611917565b6040516106d39190614358565b60405180910390f35b3480156106e857600080fd5b506106f16119c9565b6040516106fe9190614417565b60405180910390f35b34801561071357600080fd5b5061071c611a57565b60405161072991906147b9565b60405180910390f35b34801561073e57600080fd5b50610759600480360381019061075491906139db565b611a62565b60405161076691906147b9565b60405180910390f35b34801561077b57600080fd5b50610784611b1a565b005b34801561079257600080fd5b506107ad60048036038101906107a89190613b9e565b611ba2565b005b3480156107bb57600080fd5b506107c4611c28565b6040516107d19190614358565b60405180910390f35b3480156107e657600080fd5b506107ef611c52565b6040516107fc9190614417565b60405180910390f35b34801561081157600080fd5b5061081a611ce4565b60405161082791906147b9565b60405180910390f35b34801561083c57600080fd5b5061085760048036038101906108529190613b1e565b611cf0565b005b34801561086557600080fd5b5061086e611e71565b60405161087b91906147b9565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a69190613a9b565b611e76565b005b3480156108b957600080fd5b506108c2611ed8565b6040516108cf9190614417565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa9190613c6e565b611f66565b60405161090c9190614417565b60405180910390f35b34801561092157600080fd5b5061093c60048036038101906109379190613c6e565b6120bf565b005b34801561094a57600080fd5b5061096560048036038101906109609190613c25565b61218a565b005b34801561097357600080fd5b5061098e600480360381019061098991906139db565b612220565b60405161099b91906147b9565b60405180910390f35b3480156109b057600080fd5b506109b9612238565b6040516109c691906147b9565b60405180910390f35b3480156109db57600080fd5b506109f660048036038101906109f19190613a08565b61223d565b604051610a0391906143e1565b60405180910390f35b348015610a1857600080fd5b50610a216122d1565b604051610a2e91906143e1565b60405180910390f35b348015610a4357600080fd5b50610a5e6004803603810190610a599190613c25565b6122e4565b005b348015610a6c57600080fd5b50610a876004803603810190610a8291906139db565b61237a565b005b348015610a9557600080fd5b50610a9e612472565b604051610aab91906147b9565b60405180910390f35b348015610ac057600080fd5b50610ac9612478565b005b348015610ad757600080fd5b50610af26004803603810190610aed9190613c25565b612520565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b675750610b66826125b6565b5b9050919050565b606060008054610b7d90614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba990614ac1565b8015610bf65780601f10610bcb57610100808354040283529160200191610bf6565b820191906000526020600020905b815481529060010190602001808311610bd957829003601f168201915b5050505050905090565b6000610c0b82612698565b610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190614679565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60148054610c9290614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe90614ac1565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b505050505081565b6000610d1e82611917565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690614719565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dae612704565b73ffffffffffffffffffffffffffffffffffffffff161480610ddd5750610ddc81610dd7612704565b61223d565b5b610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e13906145b9565b60405180910390fd5b610e26838361270c565b505050565b600a81565b600f60019054906101000a900460ff16610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e76906146b9565b60405180910390fd5b600033604051602001610e9291906142e0565b604051602081830303815290604052805190602001209050610ef8838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601054836127c5565b610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90614799565b60405180910390fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506003610f9086836127dc90919063ffffffff16565b1115610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc890614739565b60405180910390fd5b610fe760066103e86127dc90919063ffffffff16565b61100186610ff361118b565b6127dc90919063ffffffff16565b1115611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990614479565b60405180910390fd5b3461105d8666f8b0a10e4700006127f290919063ffffffff16565b111561109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590614559565b60405180910390fd5b60005b858110156110f557600060016110b561118b565b6110bf91906148ec565b905060066103e86110d091906148ec565b81116110e1576110e03382612808565b5b5080806110ed90614b24565b9150506110a1565b5084600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461114191906148ec565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b6000600880549050905090565b6111a96111a3612704565b82612826565b6111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90614759565b60405180910390fd5b6111f3838383612904565b505050565b611200612704565b73ffffffffffffffffffffffffffffffffffffffff1661121e611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b90614699565b60405180910390fd5b600061127e61118b565b90506000600190505b600681116112b7576112a433828461129f91906148ec565b612808565b80806112af90614b24565b915050611287565b5050565b60006112c683611a62565b8210611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90614439565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611368612704565b73ffffffffffffffffffffffffffffffffffffffff16611386611c28565b73ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614699565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60105481565b611416612704565b73ffffffffffffffffffffffffffffffffffffffff16611434611c28565b73ffffffffffffffffffffffffffffffffffffffff161461148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148190614699565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b6114be612704565b73ffffffffffffffffffffffffffffffffffffffff166114dc611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990614699565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561157d573d6000803e3d6000fd5b5050565b61159c83838360405180602001604052806000815250611e76565b505050565b606060006115ae83611a62565b905060008167ffffffffffffffff8111156115cc576115cb614cb7565b5b6040519080825280602002602001820160405280156115fa5781602001602082028036833780820191505090505b50905060005b828110156116445761161285826112bb565b82828151811061162557611624614c88565b5b602002602001018181525050808061163c90614b24565b915050611600565b508092505050919050565b600f60009054906101000a900460ff1661169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590614539565b60405180910390fd5b600a8111156116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990614599565b60405180910390fd5b600c54816116ee61118b565b6116f891906148ec565b1115611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090614519565b60405180910390fd5b348167013fbe85edc9000061174e9190614973565b111561178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178690614639565b60405180910390fd5b60005b818110156117da57600060016117a661118b565b6117b091906148ec565b9050600c5481116117c6576117c53382612808565b5b5080806117d290614b24565b915050611792565b5050565b6103e881565b60006117ee61118b565b821061182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690614779565b60405180910390fd5b6008828154811061184357611842614c88565b5b90600052602060002001549050919050565b601360009054906101000a900460ff1681565b600c5481565b611876612704565b73ffffffffffffffffffffffffffffffffffffffff16611894611c28565b73ffffffffffffffffffffffffffffffffffffffff16146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190614699565b60405180910390fd5b8060119080519060200190611900929190613784565b5050565b600f60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b7906145f9565b60405180910390fd5b80915050919050565b600e80546119d690614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0290614ac1565b8015611a4f5780601f10611a2457610100808354040283529160200191611a4f565b820191906000526020600020905b815481529060010190602001808311611a3257829003601f168201915b505050505081565b66f8b0a10e47000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca906145d9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b22612704565b73ffffffffffffffffffffffffffffffffffffffff16611b40611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90614699565b60405180910390fd5b611ba06000612b60565b565b611baa612704565b73ffffffffffffffffffffffffffffffffffffffff16611bc8611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1590614699565b60405180910390fd5b8060108190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611c6190614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8d90614ac1565b8015611cda5780601f10611caf57610100808354040283529160200191611cda565b820191906000526020600020905b815481529060010190602001808311611cbd57829003601f168201915b5050505050905090565b67013fbe85edc9000081565b611cf8612704565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d906144f9565b60405180910390fd5b8060056000611d73612704565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e20612704565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e6591906143e1565b60405180910390a35050565b600381565b611e87611e81612704565b83612826565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd90614759565b60405180910390fd5b611ed284848484612c26565b50505050565b60128054611ee590614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1190614ac1565b8015611f5e5780601f10611f3357610100808354040283529160200191611f5e565b820191906000526020600020905b815481529060010190602001808311611f4157829003601f168201915b505050505081565b6060611f7182612698565b611fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa7906146f9565b60405180910390fd5b60001515601360009054906101000a900460ff161515141561205e5760148054611fd990614ac1565b80601f016020809104026020016040519081016040528092919081815260200182805461200590614ac1565b80156120525780601f1061202757610100808354040283529160200191612052565b820191906000526020600020905b81548152906001019060200180831161203557829003601f168201915b505050505090506120ba565b6000612068612c82565b9050600081511161208857604051806020016040528060008152506120b6565b8061209284612d14565b60126040516020016120a693929190614327565b6040516020818303038152906040525b9150505b919050565b6120c7612704565b73ffffffffffffffffffffffffffffffffffffffff166120e5611c28565b73ffffffffffffffffffffffffffffffffffffffff161461213b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213290614699565b60405180910390fd5b600d54811115612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217790614619565b60405180910390fd5b80600c8190555050565b612192612704565b73ffffffffffffffffffffffffffffffffffffffff166121b0611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd90614699565b60405180910390fd5b806012908051906020019061221c929190613784565b5050565b600b6020528060005260406000206000915090505481565b600681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b6122ec612704565b73ffffffffffffffffffffffffffffffffffffffff1661230a611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235790614699565b60405180910390fd5b8060149080519060200190612376929190613784565b5050565b612382612704565b73ffffffffffffffffffffffffffffffffffffffff166123a0611c28565b73ffffffffffffffffffffffffffffffffffffffff16146123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614699565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245d90614499565b60405180910390fd5b61246f81612b60565b50565b600d5481565b612480612704565b73ffffffffffffffffffffffffffffffffffffffff1661249e611c28565b73ffffffffffffffffffffffffffffffffffffffff16146124f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124eb90614699565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b612528612704565b73ffffffffffffffffffffffffffffffffffffffff16612546611c28565b73ffffffffffffffffffffffffffffffffffffffff161461259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259390614699565b60405180910390fd5b80600e90805190602001906125b2929190613784565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061268157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612691575061269082612e75565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661277f83611917565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826127d28584612edf565b1490509392505050565b600081836127ea91906148ec565b905092915050565b600081836128009190614973565b905092915050565b612822828260405180602001604052806000815250612f92565b5050565b600061283182612698565b612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790614579565b60405180910390fd5b600061287b83611917565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128ea57508373ffffffffffffffffffffffffffffffffffffffff166128d284610c00565b73ffffffffffffffffffffffffffffffffffffffff16145b806128fb57506128fa818561223d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661292482611917565b73ffffffffffffffffffffffffffffffffffffffff161461297a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612971906146d9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e1906144d9565b60405180910390fd5b6129f5838383612fed565b612a0060008261270c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5091906149cd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aa791906148ec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c31848484612904565b612c3d84848484613101565b612c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7390614459565b60405180910390fd5b50505050565b606060118054612c9190614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054612cbd90614ac1565b8015612d0a5780601f10612cdf57610100808354040283529160200191612d0a565b820191906000526020600020905b815481529060010190602001808311612ced57829003601f168201915b5050505050905090565b60606000821415612d5c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e70565b600082905060005b60008214612d8e578080612d7790614b24565b915050600a82612d879190614942565b9150612d64565b60008167ffffffffffffffff811115612daa57612da9614cb7565b5b6040519080825280601f01601f191660200182016040528015612ddc5781602001600182028036833780820191505090505b5090505b60008514612e6957600182612df591906149cd565b9150600a85612e049190614b9b565b6030612e1091906148ec565b60f81b818381518110612e2657612e25614c88565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e629190614942565b9450612de0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b8451811015612f87576000858281518110612f0657612f05614c88565b5b60200260200101519050808311612f47578281604051602001612f2a9291906142fb565b604051602081830303815290604052805190602001209250612f73565b8083604051602001612f5a9291906142fb565b6040516020818303038152906040528051906020012092505b508080612f7f90614b24565b915050612ee8565b508091505092915050565b612f9c8383613298565b612fa96000848484613101565b612fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdf90614459565b60405180910390fd5b505050565b612ff8838383613466565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561303b576130368161346b565b61307a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130795761307883826134b4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bd576130b881613621565b6130fc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130fb576130fa82826136f2565b5b5b505050565b60006131228473ffffffffffffffffffffffffffffffffffffffff16613771565b1561328b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261314b612704565b8786866040518563ffffffff1660e01b815260040161316d9493929190614373565b602060405180830381600087803b15801561318757600080fd5b505af19250505080156131b857506040513d601f19601f820116820180604052508101906131b59190613bf8565b60015b61323b573d80600081146131e8576040519150601f19603f3d011682016040523d82523d6000602084013e6131ed565b606091505b50600081511415613233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322a90614459565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613290565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ff90614659565b60405180910390fd5b61331181612698565b15613351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613348906144b9565b60405180910390fd5b61335d60008383612fed565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133ad91906148ec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134c184611a62565b6134cb91906149cd565b90506000600760008481526020019081526020016000205490508181146135b0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061363591906149cd565b905060006009600084815260200190815260200160002054905060006008838154811061366557613664614c88565b5b90600052602060002001549050806008838154811061368757613686614c88565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136d6576136d5614c59565b5b6001900381819060005260206000200160009055905550505050565b60006136fd83611a62565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461379090614ac1565b90600052602060002090601f0160209004810192826137b257600085556137f9565b82601f106137cb57805160ff19168380011785556137f9565b828001600101855582156137f9579182015b828111156137f85782518255916020019190600101906137dd565b5b509050613806919061380a565b5090565b5b8082111561382357600081600090555060010161380b565b5090565b600061383a613835846147f9565b6147d4565b90508281526020810184848401111561385657613855614cf5565b5b613861848285614a7f565b509392505050565b600061387c6138778461482a565b6147d4565b90508281526020810184848401111561389857613897614cf5565b5b6138a3848285614a7f565b509392505050565b6000813590506138ba816153fe565b92915050565b60008083601f8401126138d6576138d5614ceb565b5b8235905067ffffffffffffffff8111156138f3576138f2614ce6565b5b60208301915083602082028301111561390f5761390e614cf0565b5b9250929050565b60008135905061392581615415565b92915050565b60008135905061393a8161542c565b92915050565b60008135905061394f81615443565b92915050565b60008151905061396481615443565b92915050565b600082601f83011261397f5761397e614ceb565b5b813561398f848260208601613827565b91505092915050565b600082601f8301126139ad576139ac614ceb565b5b81356139bd848260208601613869565b91505092915050565b6000813590506139d58161545a565b92915050565b6000602082840312156139f1576139f0614cff565b5b60006139ff848285016138ab565b91505092915050565b60008060408385031215613a1f57613a1e614cff565b5b6000613a2d858286016138ab565b9250506020613a3e858286016138ab565b9150509250929050565b600080600060608486031215613a6157613a60614cff565b5b6000613a6f868287016138ab565b9350506020613a80868287016138ab565b9250506040613a91868287016139c6565b9150509250925092565b60008060008060808587031215613ab557613ab4614cff565b5b6000613ac3878288016138ab565b9450506020613ad4878288016138ab565b9350506040613ae5878288016139c6565b925050606085013567ffffffffffffffff811115613b0657613b05614cfa565b5b613b128782880161396a565b91505092959194509250565b60008060408385031215613b3557613b34614cff565b5b6000613b43858286016138ab565b9250506020613b5485828601613916565b9150509250929050565b60008060408385031215613b7557613b74614cff565b5b6000613b83858286016138ab565b9250506020613b94858286016139c6565b9150509250929050565b600060208284031215613bb457613bb3614cff565b5b6000613bc28482850161392b565b91505092915050565b600060208284031215613be157613be0614cff565b5b6000613bef84828501613940565b91505092915050565b600060208284031215613c0e57613c0d614cff565b5b6000613c1c84828501613955565b91505092915050565b600060208284031215613c3b57613c3a614cff565b5b600082013567ffffffffffffffff811115613c5957613c58614cfa565b5b613c6584828501613998565b91505092915050565b600060208284031215613c8457613c83614cff565b5b6000613c92848285016139c6565b91505092915050565b600080600060408486031215613cb457613cb3614cff565b5b6000613cc2868287016139c6565b935050602084013567ffffffffffffffff811115613ce357613ce2614cfa565b5b613cef868287016138c0565b92509250509250925092565b6000613d0783836142c2565b60208301905092915050565b613d1c81614a01565b82525050565b613d33613d2e82614a01565b614b6d565b82525050565b6000613d4482614880565b613d4e81856148ae565b9350613d598361485b565b8060005b83811015613d8a578151613d718882613cfb565b9750613d7c836148a1565b925050600181019050613d5d565b5085935050505092915050565b613da081614a13565b82525050565b613daf81614a1f565b82525050565b613dc6613dc182614a1f565b614b7f565b82525050565b6000613dd78261488b565b613de181856148bf565b9350613df1818560208601614a8e565b613dfa81614d04565b840191505092915050565b6000613e1082614896565b613e1a81856148d0565b9350613e2a818560208601614a8e565b613e3381614d04565b840191505092915050565b6000613e4982614896565b613e5381856148e1565b9350613e63818560208601614a8e565b80840191505092915050565b60008154613e7c81614ac1565b613e8681866148e1565b94506001821660008114613ea15760018114613eb257613ee5565b60ff19831686528186019350613ee5565b613ebb8561486b565b60005b83811015613edd57815481890152600182019150602081019050613ebe565b838801955050505b50505092915050565b6000613efb602b836148d0565b9150613f0682614d22565b604082019050919050565b6000613f1e6032836148d0565b9150613f2982614d71565b604082019050919050565b6000613f416028836148d0565b9150613f4c82614dc0565b604082019050919050565b6000613f646026836148d0565b9150613f6f82614e0f565b604082019050919050565b6000613f87601c836148d0565b9150613f9282614e5e565b602082019050919050565b6000613faa6024836148d0565b9150613fb582614e87565b604082019050919050565b6000613fcd6019836148d0565b9150613fd882614ed6565b602082019050919050565b6000613ff0601f836148d0565b9150613ffb82614eff565b602082019050919050565b60006140136012836148d0565b915061401e82614f28565b602082019050919050565b6000614036601f836148d0565b915061404182614f51565b602082019050919050565b6000614059602c836148d0565b915061406482614f7a565b604082019050919050565b600061407c6021836148d0565b915061408782614fc9565b604082019050919050565b600061409f6038836148d0565b91506140aa82615018565b604082019050919050565b60006140c2602a836148d0565b91506140cd82615067565b604082019050919050565b60006140e56029836148d0565b91506140f0826150b6565b604082019050919050565b60006141086012836148d0565b915061411382615105565b602082019050919050565b600061412b6011836148d0565b91506141368261512e565b602082019050919050565b600061414e6020836148d0565b915061415982615157565b602082019050919050565b6000614171602c836148d0565b915061417c82615180565b604082019050919050565b60006141946020836148d0565b915061419f826151cf565b602082019050919050565b60006141b76016836148d0565b91506141c2826151f8565b602082019050919050565b60006141da6029836148d0565b91506141e582615221565b604082019050919050565b60006141fd602f836148d0565b915061420882615270565b604082019050919050565b60006142206021836148d0565b915061422b826152bf565b604082019050919050565b6000614243601b836148d0565b915061424e8261530e565b602082019050919050565b60006142666031836148d0565b915061427182615337565b604082019050919050565b6000614289602c836148d0565b915061429482615386565b604082019050919050565b60006142ac600d836148d0565b91506142b7826153d5565b602082019050919050565b6142cb81614a75565b82525050565b6142da81614a75565b82525050565b60006142ec8284613d22565b60148201915081905092915050565b60006143078285613db5565b6020820191506143178284613db5565b6020820191508190509392505050565b60006143338286613e3e565b915061433f8285613e3e565b915061434b8284613e6f565b9150819050949350505050565b600060208201905061436d6000830184613d13565b92915050565b60006080820190506143886000830187613d13565b6143956020830186613d13565b6143a260408301856142d1565b81810360608301526143b48184613dcc565b905095945050505050565b600060208201905081810360008301526143d98184613d39565b905092915050565b60006020820190506143f66000830184613d97565b92915050565b60006020820190506144116000830184613da6565b92915050565b600060208201905081810360008301526144318184613e05565b905092915050565b6000602082019050818103600083015261445281613eee565b9050919050565b6000602082019050818103600083015261447281613f11565b9050919050565b6000602082019050818103600083015261449281613f34565b9050919050565b600060208201905081810360008301526144b281613f57565b9050919050565b600060208201905081810360008301526144d281613f7a565b9050919050565b600060208201905081810360008301526144f281613f9d565b9050919050565b6000602082019050818103600083015261451281613fc0565b9050919050565b6000602082019050818103600083015261453281613fe3565b9050919050565b6000602082019050818103600083015261455281614006565b9050919050565b6000602082019050818103600083015261457281614029565b9050919050565b600060208201905081810360008301526145928161404c565b9050919050565b600060208201905081810360008301526145b28161406f565b9050919050565b600060208201905081810360008301526145d281614092565b9050919050565b600060208201905081810360008301526145f2816140b5565b9050919050565b60006020820190508181036000830152614612816140d8565b9050919050565b60006020820190508181036000830152614632816140fb565b9050919050565b600060208201905081810360008301526146528161411e565b9050919050565b6000602082019050818103600083015261467281614141565b9050919050565b6000602082019050818103600083015261469281614164565b9050919050565b600060208201905081810360008301526146b281614187565b9050919050565b600060208201905081810360008301526146d2816141aa565b9050919050565b600060208201905081810360008301526146f2816141cd565b9050919050565b60006020820190508181036000830152614712816141f0565b9050919050565b6000602082019050818103600083015261473281614213565b9050919050565b6000602082019050818103600083015261475281614236565b9050919050565b6000602082019050818103600083015261477281614259565b9050919050565b600060208201905081810360008301526147928161427c565b9050919050565b600060208201905081810360008301526147b28161429f565b9050919050565b60006020820190506147ce60008301846142d1565b92915050565b60006147de6147ef565b90506147ea8282614af3565b919050565b6000604051905090565b600067ffffffffffffffff82111561481457614813614cb7565b5b61481d82614d04565b9050602081019050919050565b600067ffffffffffffffff82111561484557614844614cb7565b5b61484e82614d04565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148f782614a75565b915061490283614a75565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561493757614936614bcc565b5b828201905092915050565b600061494d82614a75565b915061495883614a75565b92508261496857614967614bfb565b5b828204905092915050565b600061497e82614a75565b915061498983614a75565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149c2576149c1614bcc565b5b828202905092915050565b60006149d882614a75565b91506149e383614a75565b9250828210156149f6576149f5614bcc565b5b828203905092915050565b6000614a0c82614a55565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614aac578082015181840152602081019050614a91565b83811115614abb576000848401525b50505050565b60006002820490506001821680614ad957607f821691505b60208210811415614aed57614aec614c2a565b5b50919050565b614afc82614d04565b810181811067ffffffffffffffff82111715614b1b57614b1a614cb7565b5b80604052505050565b6000614b2f82614a75565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b6257614b61614bcc565b5b600182019050919050565b6000614b7882614b89565b9050919050565b6000819050919050565b6000614b9482614d15565b9050919050565b6000614ba682614a75565b9150614bb183614a75565b925082614bc157614bc0614bfb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d61782070726573616c60008201527f6520746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43757272656e7420636f6d6d756e697479206c696d6974206578636565647300600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d617820707572636861736520706572207472616e736665722065786365656460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d617820746f6b656e7320657863656564730000000000000000000000000000600082015250565b7f45746865722076616c75652077726f6e67000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f50726573616c65206d7573742062652061637469766500000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b61540781614a01565b811461541257600080fd5b50565b61541e81614a13565b811461542957600080fd5b50565b61543581614a1f565b811461544057600080fd5b50565b61544c81614a29565b811461545757600080fd5b50565b61546381614a75565b811461546e57600080fd5b5056fea26469706673582212200e85dafd88f0a3c740ac87da3ef04a7abecaf5ada798a5d2c2d60e21998faf3f64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000013546865556c74696d6174655375727669766f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003545553000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5845647058377272364b714e34364a32683957486b4a486e6a4e4e61516157626f79707551756a4d785532452f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c80636352211e11610175578063c6682862116100dc578063e985e9c511610095578063f2fde38b1161006f578063f2fde38b14610a60578063f47c84c514610a89578063f81227d414610ab4578063ffe630b514610acb576102ae565b8063e985e9c5146109cf578063eb8d244414610a0c578063f2c4ce1e14610a37576102ae565b8063c6682862146108ad578063c87b56dd146108d8578063d552f9a114610915578063da3ef23f1461093e578063e139c1e214610967578063e5408eae146109a4576102ae565b80638da5cb5b1161012e5780638da5cb5b146107af57806395d89b41146107da5780639b6860c814610805578063a22cb46514610830578063b11eb7c814610859578063b88d4fde14610884576102ae565b80636352211e1461069f5780636373a6b1146106dc578063685756851461070757806370a0823114610732578063715018a61461076f5780637cb6475914610786576102ae565b80633544a864116102195780634d4c4e99116101d25780634d4c4e991461058d5780634f6ccce7146105b857806351830227146105f55780635464e6981461062057806355f804b31461064b57806360d938dc14610674576102ae565b80633544a864146104b25780633b84d9c6146104dd5780633ccfd60b146104f457806342842e0e1461050b578063438b63001461053457806345fb0a7314610571576102ae565b80630c0a6b5e1161026b5780630c0a6b5e146103d757806318160ddd146103f357806323b872dd1461041e57806327ac36c4146104475780632f745c591461045e57806334918dfd1461049b576102ae565b806301ffc9a7146102b357806306fdde03146102f0578063081812fc1461031b578063081c8c4414610358578063095ea7b31461038357806309aa3dcf146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613bcb565b610af4565b6040516102e791906143e1565b60405180910390f35b3480156102fc57600080fd5b50610305610b6e565b6040516103129190614417565b60405180910390f35b34801561032757600080fd5b50610342600480360381019061033d9190613c6e565b610c00565b60405161034f9190614358565b60405180910390f35b34801561036457600080fd5b5061036d610c85565b60405161037a9190614417565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613b5e565b610d13565b005b3480156103b857600080fd5b506103c1610e2b565b6040516103ce91906147b9565b60405180910390f35b6103f160048036038101906103ec9190613c9b565b610e30565b005b3480156103ff57600080fd5b5061040861118b565b60405161041591906147b9565b60405180910390f35b34801561042a57600080fd5b5061044560048036038101906104409190613a48565b611198565b005b34801561045357600080fd5b5061045c6111f8565b005b34801561046a57600080fd5b5061048560048036038101906104809190613b5e565b6112bb565b60405161049291906147b9565b60405180910390f35b3480156104a757600080fd5b506104b0611360565b005b3480156104be57600080fd5b506104c7611408565b6040516104d491906143fc565b60405180910390f35b3480156104e957600080fd5b506104f261140e565b005b34801561050057600080fd5b506105096114b6565b005b34801561051757600080fd5b50610532600480360381019061052d9190613a48565b611581565b005b34801561054057600080fd5b5061055b600480360381019061055691906139db565b6115a1565b60405161056891906143bf565b60405180910390f35b61058b60048036038101906105869190613c6e565b61164f565b005b34801561059957600080fd5b506105a26117de565b6040516105af91906147b9565b60405180910390f35b3480156105c457600080fd5b506105df60048036038101906105da9190613c6e565b6117e4565b6040516105ec91906147b9565b60405180910390f35b34801561060157600080fd5b5061060a611855565b60405161061791906143e1565b60405180910390f35b34801561062c57600080fd5b50610635611868565b60405161064291906147b9565b60405180910390f35b34801561065757600080fd5b50610672600480360381019061066d9190613c25565b61186e565b005b34801561068057600080fd5b50610689611904565b60405161069691906143e1565b60405180910390f35b3480156106ab57600080fd5b506106c660048036038101906106c19190613c6e565b611917565b6040516106d39190614358565b60405180910390f35b3480156106e857600080fd5b506106f16119c9565b6040516106fe9190614417565b60405180910390f35b34801561071357600080fd5b5061071c611a57565b60405161072991906147b9565b60405180910390f35b34801561073e57600080fd5b50610759600480360381019061075491906139db565b611a62565b60405161076691906147b9565b60405180910390f35b34801561077b57600080fd5b50610784611b1a565b005b34801561079257600080fd5b506107ad60048036038101906107a89190613b9e565b611ba2565b005b3480156107bb57600080fd5b506107c4611c28565b6040516107d19190614358565b60405180910390f35b3480156107e657600080fd5b506107ef611c52565b6040516107fc9190614417565b60405180910390f35b34801561081157600080fd5b5061081a611ce4565b60405161082791906147b9565b60405180910390f35b34801561083c57600080fd5b5061085760048036038101906108529190613b1e565b611cf0565b005b34801561086557600080fd5b5061086e611e71565b60405161087b91906147b9565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a69190613a9b565b611e76565b005b3480156108b957600080fd5b506108c2611ed8565b6040516108cf9190614417565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa9190613c6e565b611f66565b60405161090c9190614417565b60405180910390f35b34801561092157600080fd5b5061093c60048036038101906109379190613c6e565b6120bf565b005b34801561094a57600080fd5b5061096560048036038101906109609190613c25565b61218a565b005b34801561097357600080fd5b5061098e600480360381019061098991906139db565b612220565b60405161099b91906147b9565b60405180910390f35b3480156109b057600080fd5b506109b9612238565b6040516109c691906147b9565b60405180910390f35b3480156109db57600080fd5b506109f660048036038101906109f19190613a08565b61223d565b604051610a0391906143e1565b60405180910390f35b348015610a1857600080fd5b50610a216122d1565b604051610a2e91906143e1565b60405180910390f35b348015610a4357600080fd5b50610a5e6004803603810190610a599190613c25565b6122e4565b005b348015610a6c57600080fd5b50610a876004803603810190610a8291906139db565b61237a565b005b348015610a9557600080fd5b50610a9e612472565b604051610aab91906147b9565b60405180910390f35b348015610ac057600080fd5b50610ac9612478565b005b348015610ad757600080fd5b50610af26004803603810190610aed9190613c25565b612520565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b675750610b66826125b6565b5b9050919050565b606060008054610b7d90614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba990614ac1565b8015610bf65780601f10610bcb57610100808354040283529160200191610bf6565b820191906000526020600020905b815481529060010190602001808311610bd957829003601f168201915b5050505050905090565b6000610c0b82612698565b610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190614679565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60148054610c9290614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe90614ac1565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b505050505081565b6000610d1e82611917565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690614719565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dae612704565b73ffffffffffffffffffffffffffffffffffffffff161480610ddd5750610ddc81610dd7612704565b61223d565b5b610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e13906145b9565b60405180910390fd5b610e26838361270c565b505050565b600a81565b600f60019054906101000a900460ff16610e7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e76906146b9565b60405180910390fd5b600033604051602001610e9291906142e0565b604051602081830303815290604052805190602001209050610ef8838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601054836127c5565b610f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2e90614799565b60405180910390fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506003610f9086836127dc90919063ffffffff16565b1115610fd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc890614739565b60405180910390fd5b610fe760066103e86127dc90919063ffffffff16565b61100186610ff361118b565b6127dc90919063ffffffff16565b1115611042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103990614479565b60405180910390fd5b3461105d8666f8b0a10e4700006127f290919063ffffffff16565b111561109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109590614559565b60405180910390fd5b60005b858110156110f557600060016110b561118b565b6110bf91906148ec565b905060066103e86110d091906148ec565b81116110e1576110e03382612808565b5b5080806110ed90614b24565b9150506110a1565b5084600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461114191906148ec565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b6000600880549050905090565b6111a96111a3612704565b82612826565b6111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df90614759565b60405180910390fd5b6111f3838383612904565b505050565b611200612704565b73ffffffffffffffffffffffffffffffffffffffff1661121e611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b90614699565b60405180910390fd5b600061127e61118b565b90506000600190505b600681116112b7576112a433828461129f91906148ec565b612808565b80806112af90614b24565b915050611287565b5050565b60006112c683611a62565b8210611307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fe90614439565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611368612704565b73ffffffffffffffffffffffffffffffffffffffff16611386611c28565b73ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390614699565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60105481565b611416612704565b73ffffffffffffffffffffffffffffffffffffffff16611434611c28565b73ffffffffffffffffffffffffffffffffffffffff161461148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148190614699565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b6114be612704565b73ffffffffffffffffffffffffffffffffffffffff166114dc611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990614699565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561157d573d6000803e3d6000fd5b5050565b61159c83838360405180602001604052806000815250611e76565b505050565b606060006115ae83611a62565b905060008167ffffffffffffffff8111156115cc576115cb614cb7565b5b6040519080825280602002602001820160405280156115fa5781602001602082028036833780820191505090505b50905060005b828110156116445761161285826112bb565b82828151811061162557611624614c88565b5b602002602001018181525050808061163c90614b24565b915050611600565b508092505050919050565b600f60009054906101000a900460ff1661169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590614539565b60405180910390fd5b600a8111156116e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d990614599565b60405180910390fd5b600c54816116ee61118b565b6116f891906148ec565b1115611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090614519565b60405180910390fd5b348167013fbe85edc9000061174e9190614973565b111561178f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178690614639565b60405180910390fd5b60005b818110156117da57600060016117a661118b565b6117b091906148ec565b9050600c5481116117c6576117c53382612808565b5b5080806117d290614b24565b915050611792565b5050565b6103e881565b60006117ee61118b565b821061182f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182690614779565b60405180910390fd5b6008828154811061184357611842614c88565b5b90600052602060002001549050919050565b601360009054906101000a900460ff1681565b600c5481565b611876612704565b73ffffffffffffffffffffffffffffffffffffffff16611894611c28565b73ffffffffffffffffffffffffffffffffffffffff16146118ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e190614699565b60405180910390fd5b8060119080519060200190611900929190613784565b5050565b600f60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b7906145f9565b60405180910390fd5b80915050919050565b600e80546119d690614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0290614ac1565b8015611a4f5780601f10611a2457610100808354040283529160200191611a4f565b820191906000526020600020905b815481529060010190602001808311611a3257829003601f168201915b505050505081565b66f8b0a10e47000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca906145d9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b22612704565b73ffffffffffffffffffffffffffffffffffffffff16611b40611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90614699565b60405180910390fd5b611ba06000612b60565b565b611baa612704565b73ffffffffffffffffffffffffffffffffffffffff16611bc8611c28565b73ffffffffffffffffffffffffffffffffffffffff1614611c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1590614699565b60405180910390fd5b8060108190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611c6190614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c8d90614ac1565b8015611cda5780601f10611caf57610100808354040283529160200191611cda565b820191906000526020600020905b815481529060010190602001808311611cbd57829003601f168201915b5050505050905090565b67013fbe85edc9000081565b611cf8612704565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d906144f9565b60405180910390fd5b8060056000611d73612704565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e20612704565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e6591906143e1565b60405180910390a35050565b600381565b611e87611e81612704565b83612826565b611ec6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebd90614759565b60405180910390fd5b611ed284848484612c26565b50505050565b60128054611ee590614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1190614ac1565b8015611f5e5780601f10611f3357610100808354040283529160200191611f5e565b820191906000526020600020905b815481529060010190602001808311611f4157829003601f168201915b505050505081565b6060611f7182612698565b611fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa7906146f9565b60405180910390fd5b60001515601360009054906101000a900460ff161515141561205e5760148054611fd990614ac1565b80601f016020809104026020016040519081016040528092919081815260200182805461200590614ac1565b80156120525780601f1061202757610100808354040283529160200191612052565b820191906000526020600020905b81548152906001019060200180831161203557829003601f168201915b505050505090506120ba565b6000612068612c82565b9050600081511161208857604051806020016040528060008152506120b6565b8061209284612d14565b60126040516020016120a693929190614327565b6040516020818303038152906040525b9150505b919050565b6120c7612704565b73ffffffffffffffffffffffffffffffffffffffff166120e5611c28565b73ffffffffffffffffffffffffffffffffffffffff161461213b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213290614699565b60405180910390fd5b600d54811115612180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217790614619565b60405180910390fd5b80600c8190555050565b612192612704565b73ffffffffffffffffffffffffffffffffffffffff166121b0611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd90614699565b60405180910390fd5b806012908051906020019061221c929190613784565b5050565b600b6020528060005260406000206000915090505481565b600681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f60009054906101000a900460ff1681565b6122ec612704565b73ffffffffffffffffffffffffffffffffffffffff1661230a611c28565b73ffffffffffffffffffffffffffffffffffffffff1614612360576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235790614699565b60405180910390fd5b8060149080519060200190612376929190613784565b5050565b612382612704565b73ffffffffffffffffffffffffffffffffffffffff166123a0611c28565b73ffffffffffffffffffffffffffffffffffffffff16146123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614699565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245d90614499565b60405180910390fd5b61246f81612b60565b50565b600d5481565b612480612704565b73ffffffffffffffffffffffffffffffffffffffff1661249e611c28565b73ffffffffffffffffffffffffffffffffffffffff16146124f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124eb90614699565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b612528612704565b73ffffffffffffffffffffffffffffffffffffffff16612546611c28565b73ffffffffffffffffffffffffffffffffffffffff161461259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259390614699565b60405180910390fd5b80600e90805190602001906125b2929190613784565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061268157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612691575061269082612e75565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661277f83611917565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000826127d28584612edf565b1490509392505050565b600081836127ea91906148ec565b905092915050565b600081836128009190614973565b905092915050565b612822828260405180602001604052806000815250612f92565b5050565b600061283182612698565b612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286790614579565b60405180910390fd5b600061287b83611917565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806128ea57508373ffffffffffffffffffffffffffffffffffffffff166128d284610c00565b73ffffffffffffffffffffffffffffffffffffffff16145b806128fb57506128fa818561223d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661292482611917565b73ffffffffffffffffffffffffffffffffffffffff161461297a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612971906146d9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e1906144d9565b60405180910390fd5b6129f5838383612fed565b612a0060008261270c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5091906149cd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612aa791906148ec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c31848484612904565b612c3d84848484613101565b612c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7390614459565b60405180910390fd5b50505050565b606060118054612c9190614ac1565b80601f0160208091040260200160405190810160405280929190818152602001828054612cbd90614ac1565b8015612d0a5780601f10612cdf57610100808354040283529160200191612d0a565b820191906000526020600020905b815481529060010190602001808311612ced57829003601f168201915b5050505050905090565b60606000821415612d5c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e70565b600082905060005b60008214612d8e578080612d7790614b24565b915050600a82612d879190614942565b9150612d64565b60008167ffffffffffffffff811115612daa57612da9614cb7565b5b6040519080825280601f01601f191660200182016040528015612ddc5781602001600182028036833780820191505090505b5090505b60008514612e6957600182612df591906149cd565b9150600a85612e049190614b9b565b6030612e1091906148ec565b60f81b818381518110612e2657612e25614c88565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e629190614942565b9450612de0565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008082905060005b8451811015612f87576000858281518110612f0657612f05614c88565b5b60200260200101519050808311612f47578281604051602001612f2a9291906142fb565b604051602081830303815290604052805190602001209250612f73565b8083604051602001612f5a9291906142fb565b6040516020818303038152906040528051906020012092505b508080612f7f90614b24565b915050612ee8565b508091505092915050565b612f9c8383613298565b612fa96000848484613101565b612fe8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdf90614459565b60405180910390fd5b505050565b612ff8838383613466565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561303b576130368161346b565b61307a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130795761307883826134b4565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130bd576130b881613621565b6130fc565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146130fb576130fa82826136f2565b5b5b505050565b60006131228473ffffffffffffffffffffffffffffffffffffffff16613771565b1561328b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261314b612704565b8786866040518563ffffffff1660e01b815260040161316d9493929190614373565b602060405180830381600087803b15801561318757600080fd5b505af19250505080156131b857506040513d601f19601f820116820180604052508101906131b59190613bf8565b60015b61323b573d80600081146131e8576040519150601f19603f3d011682016040523d82523d6000602084013e6131ed565b606091505b50600081511415613233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322a90614459565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613290565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ff90614659565b60405180910390fd5b61331181612698565b15613351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613348906144b9565b60405180910390fd5b61335d60008383612fed565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133ad91906148ec565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016134c184611a62565b6134cb91906149cd565b90506000600760008481526020019081526020016000205490508181146135b0576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061363591906149cd565b905060006009600084815260200190815260200160002054905060006008838154811061366557613664614c88565b5b90600052602060002001549050806008838154811061368757613686614c88565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806136d6576136d5614c59565b5b6001900381819060005260206000200160009055905550505050565b60006136fd83611a62565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b82805461379090614ac1565b90600052602060002090601f0160209004810192826137b257600085556137f9565b82601f106137cb57805160ff19168380011785556137f9565b828001600101855582156137f9579182015b828111156137f85782518255916020019190600101906137dd565b5b509050613806919061380a565b5090565b5b8082111561382357600081600090555060010161380b565b5090565b600061383a613835846147f9565b6147d4565b90508281526020810184848401111561385657613855614cf5565b5b613861848285614a7f565b509392505050565b600061387c6138778461482a565b6147d4565b90508281526020810184848401111561389857613897614cf5565b5b6138a3848285614a7f565b509392505050565b6000813590506138ba816153fe565b92915050565b60008083601f8401126138d6576138d5614ceb565b5b8235905067ffffffffffffffff8111156138f3576138f2614ce6565b5b60208301915083602082028301111561390f5761390e614cf0565b5b9250929050565b60008135905061392581615415565b92915050565b60008135905061393a8161542c565b92915050565b60008135905061394f81615443565b92915050565b60008151905061396481615443565b92915050565b600082601f83011261397f5761397e614ceb565b5b813561398f848260208601613827565b91505092915050565b600082601f8301126139ad576139ac614ceb565b5b81356139bd848260208601613869565b91505092915050565b6000813590506139d58161545a565b92915050565b6000602082840312156139f1576139f0614cff565b5b60006139ff848285016138ab565b91505092915050565b60008060408385031215613a1f57613a1e614cff565b5b6000613a2d858286016138ab565b9250506020613a3e858286016138ab565b9150509250929050565b600080600060608486031215613a6157613a60614cff565b5b6000613a6f868287016138ab565b9350506020613a80868287016138ab565b9250506040613a91868287016139c6565b9150509250925092565b60008060008060808587031215613ab557613ab4614cff565b5b6000613ac3878288016138ab565b9450506020613ad4878288016138ab565b9350506040613ae5878288016139c6565b925050606085013567ffffffffffffffff811115613b0657613b05614cfa565b5b613b128782880161396a565b91505092959194509250565b60008060408385031215613b3557613b34614cff565b5b6000613b43858286016138ab565b9250506020613b5485828601613916565b9150509250929050565b60008060408385031215613b7557613b74614cff565b5b6000613b83858286016138ab565b9250506020613b94858286016139c6565b9150509250929050565b600060208284031215613bb457613bb3614cff565b5b6000613bc28482850161392b565b91505092915050565b600060208284031215613be157613be0614cff565b5b6000613bef84828501613940565b91505092915050565b600060208284031215613c0e57613c0d614cff565b5b6000613c1c84828501613955565b91505092915050565b600060208284031215613c3b57613c3a614cff565b5b600082013567ffffffffffffffff811115613c5957613c58614cfa565b5b613c6584828501613998565b91505092915050565b600060208284031215613c8457613c83614cff565b5b6000613c92848285016139c6565b91505092915050565b600080600060408486031215613cb457613cb3614cff565b5b6000613cc2868287016139c6565b935050602084013567ffffffffffffffff811115613ce357613ce2614cfa565b5b613cef868287016138c0565b92509250509250925092565b6000613d0783836142c2565b60208301905092915050565b613d1c81614a01565b82525050565b613d33613d2e82614a01565b614b6d565b82525050565b6000613d4482614880565b613d4e81856148ae565b9350613d598361485b565b8060005b83811015613d8a578151613d718882613cfb565b9750613d7c836148a1565b925050600181019050613d5d565b5085935050505092915050565b613da081614a13565b82525050565b613daf81614a1f565b82525050565b613dc6613dc182614a1f565b614b7f565b82525050565b6000613dd78261488b565b613de181856148bf565b9350613df1818560208601614a8e565b613dfa81614d04565b840191505092915050565b6000613e1082614896565b613e1a81856148d0565b9350613e2a818560208601614a8e565b613e3381614d04565b840191505092915050565b6000613e4982614896565b613e5381856148e1565b9350613e63818560208601614a8e565b80840191505092915050565b60008154613e7c81614ac1565b613e8681866148e1565b94506001821660008114613ea15760018114613eb257613ee5565b60ff19831686528186019350613ee5565b613ebb8561486b565b60005b83811015613edd57815481890152600182019150602081019050613ebe565b838801955050505b50505092915050565b6000613efb602b836148d0565b9150613f0682614d22565b604082019050919050565b6000613f1e6032836148d0565b9150613f2982614d71565b604082019050919050565b6000613f416028836148d0565b9150613f4c82614dc0565b604082019050919050565b6000613f646026836148d0565b9150613f6f82614e0f565b604082019050919050565b6000613f87601c836148d0565b9150613f9282614e5e565b602082019050919050565b6000613faa6024836148d0565b9150613fb582614e87565b604082019050919050565b6000613fcd6019836148d0565b9150613fd882614ed6565b602082019050919050565b6000613ff0601f836148d0565b9150613ffb82614eff565b602082019050919050565b60006140136012836148d0565b915061401e82614f28565b602082019050919050565b6000614036601f836148d0565b915061404182614f51565b602082019050919050565b6000614059602c836148d0565b915061406482614f7a565b604082019050919050565b600061407c6021836148d0565b915061408782614fc9565b604082019050919050565b600061409f6038836148d0565b91506140aa82615018565b604082019050919050565b60006140c2602a836148d0565b91506140cd82615067565b604082019050919050565b60006140e56029836148d0565b91506140f0826150b6565b604082019050919050565b60006141086012836148d0565b915061411382615105565b602082019050919050565b600061412b6011836148d0565b91506141368261512e565b602082019050919050565b600061414e6020836148d0565b915061415982615157565b602082019050919050565b6000614171602c836148d0565b915061417c82615180565b604082019050919050565b60006141946020836148d0565b915061419f826151cf565b602082019050919050565b60006141b76016836148d0565b91506141c2826151f8565b602082019050919050565b60006141da6029836148d0565b91506141e582615221565b604082019050919050565b60006141fd602f836148d0565b915061420882615270565b604082019050919050565b60006142206021836148d0565b915061422b826152bf565b604082019050919050565b6000614243601b836148d0565b915061424e8261530e565b602082019050919050565b60006142666031836148d0565b915061427182615337565b604082019050919050565b6000614289602c836148d0565b915061429482615386565b604082019050919050565b60006142ac600d836148d0565b91506142b7826153d5565b602082019050919050565b6142cb81614a75565b82525050565b6142da81614a75565b82525050565b60006142ec8284613d22565b60148201915081905092915050565b60006143078285613db5565b6020820191506143178284613db5565b6020820191508190509392505050565b60006143338286613e3e565b915061433f8285613e3e565b915061434b8284613e6f565b9150819050949350505050565b600060208201905061436d6000830184613d13565b92915050565b60006080820190506143886000830187613d13565b6143956020830186613d13565b6143a260408301856142d1565b81810360608301526143b48184613dcc565b905095945050505050565b600060208201905081810360008301526143d98184613d39565b905092915050565b60006020820190506143f66000830184613d97565b92915050565b60006020820190506144116000830184613da6565b92915050565b600060208201905081810360008301526144318184613e05565b905092915050565b6000602082019050818103600083015261445281613eee565b9050919050565b6000602082019050818103600083015261447281613f11565b9050919050565b6000602082019050818103600083015261449281613f34565b9050919050565b600060208201905081810360008301526144b281613f57565b9050919050565b600060208201905081810360008301526144d281613f7a565b9050919050565b600060208201905081810360008301526144f281613f9d565b9050919050565b6000602082019050818103600083015261451281613fc0565b9050919050565b6000602082019050818103600083015261453281613fe3565b9050919050565b6000602082019050818103600083015261455281614006565b9050919050565b6000602082019050818103600083015261457281614029565b9050919050565b600060208201905081810360008301526145928161404c565b9050919050565b600060208201905081810360008301526145b28161406f565b9050919050565b600060208201905081810360008301526145d281614092565b9050919050565b600060208201905081810360008301526145f2816140b5565b9050919050565b60006020820190508181036000830152614612816140d8565b9050919050565b60006020820190508181036000830152614632816140fb565b9050919050565b600060208201905081810360008301526146528161411e565b9050919050565b6000602082019050818103600083015261467281614141565b9050919050565b6000602082019050818103600083015261469281614164565b9050919050565b600060208201905081810360008301526146b281614187565b9050919050565b600060208201905081810360008301526146d2816141aa565b9050919050565b600060208201905081810360008301526146f2816141cd565b9050919050565b60006020820190508181036000830152614712816141f0565b9050919050565b6000602082019050818103600083015261473281614213565b9050919050565b6000602082019050818103600083015261475281614236565b9050919050565b6000602082019050818103600083015261477281614259565b9050919050565b600060208201905081810360008301526147928161427c565b9050919050565b600060208201905081810360008301526147b28161429f565b9050919050565b60006020820190506147ce60008301846142d1565b92915050565b60006147de6147ef565b90506147ea8282614af3565b919050565b6000604051905090565b600067ffffffffffffffff82111561481457614813614cb7565b5b61481d82614d04565b9050602081019050919050565b600067ffffffffffffffff82111561484557614844614cb7565b5b61484e82614d04565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148f782614a75565b915061490283614a75565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561493757614936614bcc565b5b828201905092915050565b600061494d82614a75565b915061495883614a75565b92508261496857614967614bfb565b5b828204905092915050565b600061497e82614a75565b915061498983614a75565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149c2576149c1614bcc565b5b828202905092915050565b60006149d882614a75565b91506149e383614a75565b9250828210156149f6576149f5614bcc565b5b828203905092915050565b6000614a0c82614a55565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614aac578082015181840152602081019050614a91565b83811115614abb576000848401525b50505050565b60006002820490506001821680614ad957607f821691505b60208210811415614aed57614aec614c2a565b5b50919050565b614afc82614d04565b810181811067ffffffffffffffff82111715614b1b57614b1a614cb7565b5b80604052505050565b6000614b2f82614a75565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b6257614b61614bcc565b5b600182019050919050565b6000614b7882614b89565b9050919050565b6000819050919050565b6000614b9482614d15565b9050919050565b6000614ba682614a75565b9150614bb183614a75565b925082614bc157614bc0614bfb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d61782070726573616c60008201527f6520746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43757272656e7420636f6d6d756e697479206c696d6974206578636565647300600082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d617820707572636861736520706572207472616e736665722065786365656460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d617820746f6b656e7320657863656564730000000000000000000000000000600082015250565b7f45746865722076616c75652077726f6e67000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f50726573616c65206d7573742062652061637469766500000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565646564206d617820746f6b656e2070757263686173650000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b61540781614a01565b811461541257600080fd5b50565b61541e81614a13565b811461542957600080fd5b50565b61543581614a1f565b811461544057600080fd5b50565b61544c81614a29565b811461545757600080fd5b50565b61546381614a75565b811461546e57600080fd5b5056fea26469706673582212200e85dafd88f0a3c740ac87da3ef04a7abecaf5ada798a5d2c2d60e21998faf3f64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000013546865556c74696d6174655375727669766f72000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003545553000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d5845647058377272364b714e34364a32683957486b4a486e6a4e4e61516157626f79707551756a4d785532452f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): TheUltimateSurvivor
Arg [1] : _symbol (string): TUS
Arg [2] : _initBaseURI (string):
Arg [3] : _initNotRevealedUri (string): ipfs://QmXEdpX7rr6KqN46J2h9WHkJHnjNNaQaWboypuQujMxU2E/hidden.json

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [5] : 546865556c74696d6174655375727669766f7200000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 5455530000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [10] : 697066733a2f2f516d5845647058377272364b714e34364a32683957486b4a48
Arg [11] : 6e6a4e4e61516157626f79707551756a4d785532452f68696464656e2e6a736f
Arg [12] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52075:5509:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34699:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22591:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24150:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52932:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23673:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52311:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54026:1058;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35339:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25040:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53378:215;;;;;;;;;;;;;:::i;:::-;;35007:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53599:89;;;;;;;;;;;;;:::i;:::-;;52780:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57143:74;;;;;;;;;;;;;:::i;:::-;;55679:128;;;;;;;;;;;;;:::i;:::-;;25450:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56270:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55088:589;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52360:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35529:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52899:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52474:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57351:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52738:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22285:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52665:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52550:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22015:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42488:94;;;;;;;;;;;;;:::i;:::-;;53918:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41837:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22760:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52606:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24443:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52261:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25706:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52855:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56624:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55811:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57455:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52204:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52404:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24809:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52701:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57225:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42737:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52511:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53696:98;;;;;;;;;;;;;:::i;:::-;;53802:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34699:224;34801:4;34840:35;34825:50;;;:11;:50;;;;:90;;;;34879:36;34903:11;34879:23;:36::i;:::-;34825:90;34818:97;;34699:224;;;:::o;22591:100::-;22645:13;22678:5;22671:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22591:100;:::o;24150:221::-;24226:7;24254:16;24262:7;24254;:16::i;:::-;24246:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24339:15;:24;24355:7;24339:24;;;;;;;;;;;;;;;;;;;;;24332:31;;24150:221;;;:::o;52932:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23673:411::-;23754:13;23770:23;23785:7;23770:14;:23::i;:::-;23754:39;;23818:5;23812:11;;:2;:11;;;;23804:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23912:5;23896:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23921:37;23938:5;23945:12;:10;:12::i;:::-;23921:16;:37::i;:::-;23896:62;23874:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24055:21;24064:2;24068:7;24055:8;:21::i;:::-;23743:341;23673:411;;:::o;52311:42::-;52351:2;52311:42;:::o;54026:1058::-;54135:15;;;;;;;;;;;54127:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54190:12;54232:10;54215:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;54205:39;;;;;;54190:54;;54263:48;54282:12;;54263:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54296:9;;54306:4;54263:18;:48::i;:::-;54255:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;54350:15;54368;:27;54384:10;54368:27;;;;;;;;;;;;;;;;54350:45;;52305:1;54416:27;54428:14;54416:7;:11;;:27;;;;:::i;:::-;:51;;54408:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;54557:29;52443:1;52395:4;54557:15;;:29;;;;:::i;:::-;54520:33;54538:14;54520:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:66;;54512:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;54690:9;54652:34;54671:14;52591:10;54652:18;;:34;;;;:::i;:::-;:47;;54644:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;54752:6;54748:227;54768:14;54764:1;:18;54748:227;;;54804:14;54837:1;54821:13;:11;:13::i;:::-;:17;;;;:::i;:::-;54804:34;;52443:1;52395:4;54869:26;;;;:::i;:::-;54856:9;:39;54853:111;;54916:32;54926:10;54938:9;54916;:32::i;:::-;54853:111;54789:186;54784:3;;;;;:::i;:::-;;;;54748:227;;;;55047:14;55017:15;:27;55033:10;55017:27;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;54987:15;:27;55003:10;54987:27;;;;;;;;;;;;;;;:74;;;;54116:968;;54026:1058;;;:::o;35339:113::-;35400:7;35427:10;:17;;;;35420:24;;35339:113;:::o;25040:339::-;25235:41;25254:12;:10;:12::i;:::-;25268:7;25235:18;:41::i;:::-;25227:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25343:28;25353:4;25359:2;25363:7;25343:9;:28::i;:::-;25040:339;;;:::o;53378:215::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53435:11:::1;53449:13;:11;:13::i;:::-;53435:27;;53473:6;53499:1;53495:5;;53490:96;52443:1;53502;:17;53490:96;;53541:33;53551:10;53572:1;53563:6;:10;;;;:::i;:::-;53541:9;:33::i;:::-;53521:3;;;;;:::i;:::-;;;;53490:96;;;53420:173;;53378:215::o:0;35007:256::-;35104:7;35140:23;35157:5;35140:16;:23::i;:::-;35132:5;:31;35124:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35229:12;:19;35242:5;35229:19;;;;;;;;;;;;;;;:26;35249:5;35229:26;;;;;;;;;;;;35222:33;;35007:256;;;;:::o;53599:89::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53668:12:::1;;;;;;;;;;;53667:13;53652:12;;:28;;;;;;;;;;;;;;;;;;53599:89::o:0;52780:24::-;;;;:::o;57143:74::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57203:8:::1;;;;;;;;;;;57202:9;57191:8;;:20;;;;;;;;;;;;;;;;;;57143:74::o:0;55679:128::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55723:12:::1;55738:21;55723:36;;55774:10;55766:28;;:37;55795:7;55766:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55716:91;55679:128::o:0;25450:185::-;25588:39;25605:4;25611:2;25615:7;25588:39;;;;;;;;;;;;:16;:39::i;:::-;25450:185;;;:::o;56270:348::-;56345:16;56373:23;56399:17;56409:6;56399:9;:17::i;:::-;56373:43;;56423:25;56465:15;56451:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56423:58;;56493:9;56488:103;56508:15;56504:1;:19;56488:103;;;56553:30;56573:6;56581:1;56553:19;:30::i;:::-;56539:8;56548:1;56539:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;56525:3;;;;;:::i;:::-;;;;56488:103;;;;56604:8;56597:15;;;;56270:348;;;:::o;55088:589::-;55161:12;;;;;;;;;;;55153:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;52351:2;55211:14;:34;;55203:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;55332:17;;55314:14;55298:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:51;;55290:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;55436:9;55418:14;52648:10;55400:32;;;;:::i;:::-;:45;;55392:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;55480:6;55476:198;55496:14;55492:1;:18;55476:198;;;55528:14;55561:1;55545:13;:11;:13::i;:::-;:17;;;;:::i;:::-;55528:34;;55589:17;;55576:9;:30;55573:94;;55623:32;55633:10;55645:9;55623;:32::i;:::-;55573:94;55517:157;55512:3;;;;;:::i;:::-;;;;55476:198;;;;55088:589;:::o;52360:39::-;52395:4;52360:39;:::o;35529:233::-;35604:7;35640:30;:28;:30::i;:::-;35632:5;:38;35624:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35737:10;35748:5;35737:17;;;;;;;;:::i;:::-;;;;;;;;;;35730:24;;35529:233;;;:::o;52899:28::-;;;;;;;;;;;;;:::o;52474:32::-;;;;:::o;57351:98::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57432:11:::1;57422:7;:21;;;;;;;;;;;;:::i;:::-;;57351:98:::0;:::o;52738:35::-;;;;;;;;;;;;;:::o;22285:239::-;22357:7;22377:13;22393:7;:16;22401:7;22393:16;;;;;;;;;;;;;;;;;;;;;22377:32;;22445:1;22428:19;;:5;:19;;;;22420:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22511:5;22504:12;;;22285:239;;;:::o;52665:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52550:51::-;52591:10;52550:51;:::o;22015:208::-;22087:7;22132:1;22115:19;;:5;:19;;;;22107:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22199:9;:16;22209:5;22199:16;;;;;;;;;;;;;;;;22192:23;;22015:208;;;:::o;42488:94::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42553:21:::1;42571:1;42553:9;:21::i;:::-;42488:94::o:0;53918:91::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53996:5:::1;53984:9;:17;;;;53918:91:::0;:::o;41837:87::-;41883:7;41910:6;;;;;;;;;;;41903:13;;41837:87;:::o;22760:104::-;22816:13;22849:7;22842:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22760:104;:::o;52606:52::-;52648:10;52606:52;:::o;24443:295::-;24558:12;:10;:12::i;:::-;24546:24;;:8;:24;;;;24538:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24658:8;24613:18;:32;24632:12;:10;:12::i;:::-;24613:32;;;;;;;;;;;;;;;:42;24646:8;24613:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24711:8;24682:48;;24697:12;:10;:12::i;:::-;24682:48;;;24721:8;24682:48;;;;;;:::i;:::-;;;;;;;;24443:295;;:::o;52261:45::-;52305:1;52261:45;:::o;25706:328::-;25881:41;25900:12;:10;:12::i;:::-;25914:7;25881:18;:41::i;:::-;25873:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25987:39;26001:4;26007:2;26011:7;26020:5;25987:13;:39::i;:::-;25706:328;;;;:::o;52855:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56624:497::-;56722:13;56763:16;56771:7;56763;:16::i;:::-;56747:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;56872:5;56860:17;;:8;;;;;;;;;;;:17;;;56857:62;;;56897:14;56890:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56857:62;56927:28;56958:10;:8;:10::i;:::-;56927:41;;57013:1;56988:14;56982:28;:32;:133;;;;;;;;;;;;;;;;;57050:14;57066:18;:7;:16;:18::i;:::-;57086:13;57033:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56982:133;56975:140;;;56624:497;;;;:::o;55811:151::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55894:10:::1;;55886:4;:18;;55878:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;55954:4;55934:17;:24;;;;55811:151:::0;:::o;57455:122::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57554:17:::1;57538:13;:33;;;;;;;;;;;;:::i;:::-;;57455:122:::0;:::o;52204:50::-;;;;;;;;;;;;;;;;;:::o;52404:40::-;52443:1;52404:40;:::o;24809:164::-;24906:4;24930:18;:25;24949:5;24930:25;;;;;;;;;;;;;;;:35;24956:8;24930:35;;;;;;;;;;;;;;;;;;;;;;;;;24923:42;;24809:164;;;;:::o;52701:32::-;;;;;;;;;;;;;:::o;57225:120::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57324:15:::1;57307:14;:32;;;;;;;;;;;;:::i;:::-;;57225:120:::0;:::o;42737:192::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42846:1:::1;42826:22;;:8;:22;;;;42818:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42902:19;42912:8;42902:9;:19::i;:::-;42737:192:::0;:::o;52511:32::-;;;;:::o;53696:98::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53771:15:::1;;;;;;;;;;;53770:16;53752:15;;:34;;;;;;;;;;;;;;;;;;53696:98::o:0;53802:108::-;42068:12;:10;:12::i;:::-;42057:23;;:7;:5;:7::i;:::-;:23;;;42049:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53892:10:::1;53879;:23;;;;;;;;;;;;:::i;:::-;;53802:108:::0;:::o;21646:305::-;21748:4;21800:25;21785:40;;;:11;:40;;;;:105;;;;21857:33;21842:48;;;:11;:48;;;;21785:105;:158;;;;21907:36;21931:11;21907:23;:36::i;:::-;21785:158;21765:178;;21646:305;;;:::o;27544:127::-;27609:4;27661:1;27633:30;;:7;:16;27641:7;27633:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27626:37;;27544:127;;;:::o;20120:98::-;20173:7;20200:10;20193:17;;20120:98;:::o;31526:174::-;31628:2;31601:15;:24;31617:7;31601:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31684:7;31680:2;31646:46;;31655:23;31670:7;31655:14;:23::i;:::-;31646:46;;;;;;;;;;;;31526:174;;:::o;43877:190::-;44002:4;44055;44026:25;44039:5;44046:4;44026:12;:25::i;:::-;:33;44019:40;;43877:190;;;;;:::o;47875:98::-;47933:7;47964:1;47960;:5;;;;:::i;:::-;47953:12;;47875:98;;;;:::o;48613:::-;48671:7;48702:1;48698;:5;;;;:::i;:::-;48691:12;;48613:98;;;;:::o;28528:110::-;28604:26;28614:2;28618:7;28604:26;;;;;;;;;;;;:9;:26::i;:::-;28528:110;;:::o;27838:348::-;27931:4;27956:16;27964:7;27956;:16::i;:::-;27948:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28032:13;28048:23;28063:7;28048:14;:23::i;:::-;28032:39;;28101:5;28090:16;;:7;:16;;;:51;;;;28134:7;28110:31;;:20;28122:7;28110:11;:20::i;:::-;:31;;;28090:51;:87;;;;28145:32;28162:5;28169:7;28145:16;:32::i;:::-;28090:87;28082:96;;;27838:348;;;;:::o;30830:578::-;30989:4;30962:31;;:23;30977:7;30962:14;:23::i;:::-;:31;;;30954:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31072:1;31058:16;;:2;:16;;;;31050:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31128:39;31149:4;31155:2;31159:7;31128:20;:39::i;:::-;31232:29;31249:1;31253:7;31232:8;:29::i;:::-;31293:1;31274:9;:15;31284:4;31274:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31322:1;31305:9;:13;31315:2;31305:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31353:2;31334:7;:16;31342:7;31334:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31392:7;31388:2;31373:27;;31382:4;31373:27;;;;;;;;;;;;30830:578;;;:::o;42937:173::-;42993:16;43012:6;;;;;;;;;;;42993:25;;43038:8;43029:6;;:17;;;;;;;;;;;;;;;;;;43093:8;43062:40;;43083:8;43062:40;;;;;;;;;;;;42982:128;42937:173;:::o;26916:315::-;27073:28;27083:4;27089:2;27093:7;27073:9;:28::i;:::-;27120:48;27143:4;27149:2;27153:7;27162:5;27120:22;:48::i;:::-;27112:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26916:315;;;;:::o;53268:102::-;53328:13;53357:7;53350:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53268:102;:::o;7952:723::-;8008:13;8238:1;8229:5;:10;8225:53;;;8256:10;;;;;;;;;;;;;;;;;;;;;8225:53;8288:12;8303:5;8288:20;;8319:14;8344:78;8359:1;8351:4;:9;8344:78;;8377:8;;;;;:::i;:::-;;;;8408:2;8400:10;;;;;:::i;:::-;;;8344:78;;;8432:19;8464:6;8454:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8432:39;;8482:154;8498:1;8489:5;:10;8482:154;;8526:1;8516:11;;;;;:::i;:::-;;;8593:2;8585:5;:10;;;;:::i;:::-;8572:2;:24;;;;:::i;:::-;8559:39;;8542:6;8549;8542:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8622:2;8613:11;;;;;:::i;:::-;;;8482:154;;;8660:6;8646:21;;;;;7952:723;;;;:::o;7477:157::-;7562:4;7601:25;7586:40;;;:11;:40;;;;7579:47;;7477:157;;;:::o;44429:701::-;44512:7;44532:20;44555:4;44532:27;;44575:9;44570:523;44594:5;:12;44590:1;:16;44570:523;;;44628:20;44651:5;44657:1;44651:8;;;;;;;;:::i;:::-;;;;;;;;44628:31;;44694:12;44678;:28;44674:408;;44848:12;44862;44831:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44821:55;;;;;;44806:70;;44674:408;;;45038:12;45052;45021:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45011:55;;;;;;44996:70;;44674:408;44613:480;44608:3;;;;;:::i;:::-;;;;44570:523;;;;45110:12;45103:19;;;44429:701;;;;:::o;28865:321::-;28995:18;29001:2;29005:7;28995:5;:18::i;:::-;29046:54;29077:1;29081:2;29085:7;29094:5;29046:22;:54::i;:::-;29024:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28865:321;;;:::o;36375:589::-;36519:45;36546:4;36552:2;36556:7;36519:26;:45::i;:::-;36597:1;36581:18;;:4;:18;;;36577:187;;;36616:40;36648:7;36616:31;:40::i;:::-;36577:187;;;36686:2;36678:10;;:4;:10;;;36674:90;;36705:47;36738:4;36744:7;36705:32;:47::i;:::-;36674:90;36577:187;36792:1;36778:16;;:2;:16;;;36774:183;;;36811:45;36848:7;36811:36;:45::i;:::-;36774:183;;;36884:4;36878:10;;:2;:10;;;36874:83;;36905:40;36933:2;36937:7;36905:27;:40::i;:::-;36874:83;36774:183;36375:589;;;:::o;32265:799::-;32420:4;32441:15;:2;:13;;;:15::i;:::-;32437:620;;;32493:2;32477:36;;;32514:12;:10;:12::i;:::-;32528:4;32534:7;32543:5;32477:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32473:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32736:1;32719:6;:13;:18;32715:272;;;32762:60;;;;;;;;;;:::i;:::-;;;;;;;;32715:272;32937:6;32931:13;32922:6;32918:2;32914:15;32907:38;32473:529;32610:41;;;32600:51;;;:6;:51;;;;32593:58;;;;;32437:620;33041:4;33034:11;;32265:799;;;;;;;:::o;29522:382::-;29616:1;29602:16;;:2;:16;;;;29594:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29675:16;29683:7;29675;:16::i;:::-;29674:17;29666:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29737:45;29766:1;29770:2;29774:7;29737:20;:45::i;:::-;29812:1;29795:9;:13;29805:2;29795:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29843:2;29824:7;:16;29832:7;29824:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29888:7;29884:2;29863:33;;29880:1;29863:33;;;;;;;;;;;;29522:382;;:::o;33636:126::-;;;;:::o;37687:164::-;37791:10;:17;;;;37764:15;:24;37780:7;37764:24;;;;;;;;;;;:44;;;;37819:10;37835:7;37819:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37687:164;:::o;38478:988::-;38744:22;38794:1;38769:22;38786:4;38769:16;:22::i;:::-;:26;;;;:::i;:::-;38744:51;;38806:18;38827:17;:26;38845:7;38827:26;;;;;;;;;;;;38806:47;;38974:14;38960:10;:28;38956:328;;39005:19;39027:12;:18;39040:4;39027:18;;;;;;;;;;;;;;;:34;39046:14;39027:34;;;;;;;;;;;;39005:56;;39111:11;39078:12;:18;39091:4;39078:18;;;;;;;;;;;;;;;:30;39097:10;39078:30;;;;;;;;;;;:44;;;;39228:10;39195:17;:30;39213:11;39195:30;;;;;;;;;;;:43;;;;38990:294;38956:328;39380:17;:26;39398:7;39380:26;;;;;;;;;;;39373:33;;;39424:12;:18;39437:4;39424:18;;;;;;;;;;;;;;;:34;39443:14;39424:34;;;;;;;;;;;39417:41;;;38559:907;;38478:988;;:::o;39761:1079::-;40014:22;40059:1;40039:10;:17;;;;:21;;;;:::i;:::-;40014:46;;40071:18;40092:15;:24;40108:7;40092:24;;;;;;;;;;;;40071:45;;40443:19;40465:10;40476:14;40465:26;;;;;;;;:::i;:::-;;;;;;;;;;40443:48;;40529:11;40504:10;40515;40504:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40640:10;40609:15;:28;40625:11;40609:28;;;;;;;;;;;:41;;;;40781:15;:24;40797:7;40781:24;;;;;;;;;;;40774:31;;;40816:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39832:1008;;;39761:1079;:::o;37265:221::-;37350:14;37367:20;37384:2;37367:16;:20::i;:::-;37350:37;;37425:7;37398:12;:16;37411:2;37398:16;;;;;;;;;;;;;;;:24;37415:6;37398:24;;;;;;;;;;;:34;;;;37472:6;37443:17;:26;37461:7;37443:26;;;;;;;;;;;:35;;;;37339:147;37265:221;;:::o;10477:387::-;10537:4;10745:12;10812:7;10800:20;10792:28;;10855:1;10848:4;:8;10841:15;;;10477:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:329::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:119;;;3127:79;;:::i;:::-;3089:119;3247:1;3272:53;3317:7;3308:6;3297:9;3293:22;3272:53;:::i;:::-;3262:63;;3218:117;3013:329;;;;:::o;3348:474::-;3416:6;3424;3473:2;3461:9;3452:7;3448:23;3444:32;3441:119;;;3479:79;;:::i;:::-;3441:119;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:53;3797:7;3788:6;3777:9;3773:22;3752:53;:::i;:::-;3742:63;;3697:118;3348:474;;;;;:::o;3828:619::-;3905:6;3913;3921;3970:2;3958:9;3949:7;3945:23;3941:32;3938:119;;;3976:79;;:::i;:::-;3938:119;4096:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;:::i;:::-;4111:63;;4067:117;4223:2;4249:53;4294:7;4285:6;4274:9;4270:22;4249:53;:::i;:::-;4239:63;;4194:118;4351:2;4377:53;4422:7;4413:6;4402:9;4398:22;4377:53;:::i;:::-;4367:63;;4322:118;3828:619;;;;;:::o;4453:943::-;4548:6;4556;4564;4572;4621:3;4609:9;4600:7;4596:23;4592:33;4589:120;;;4628:79;;:::i;:::-;4589:120;4748:1;4773:53;4818:7;4809:6;4798:9;4794:22;4773:53;:::i;:::-;4763:63;;4719:117;4875:2;4901:53;4946:7;4937:6;4926:9;4922:22;4901:53;:::i;:::-;4891:63;;4846:118;5003:2;5029:53;5074:7;5065:6;5054:9;5050:22;5029:53;:::i;:::-;5019:63;;4974:118;5159:2;5148:9;5144:18;5131:32;5190:18;5182:6;5179:30;5176:117;;;5212:79;;:::i;:::-;5176:117;5317:62;5371:7;5362:6;5351:9;5347:22;5317:62;:::i;:::-;5307:72;;5102:287;4453:943;;;;;;;:::o;5402:468::-;5467:6;5475;5524:2;5512:9;5503:7;5499:23;5495:32;5492:119;;;5530:79;;:::i;:::-;5492:119;5650:1;5675:53;5720:7;5711:6;5700:9;5696:22;5675:53;:::i;:::-;5665:63;;5621:117;5777:2;5803:50;5845:7;5836:6;5825:9;5821:22;5803:50;:::i;:::-;5793:60;;5748:115;5402:468;;;;;:::o;5876:474::-;5944:6;5952;6001:2;5989:9;5980:7;5976:23;5972:32;5969:119;;;6007:79;;:::i;:::-;5969:119;6127:1;6152:53;6197:7;6188:6;6177:9;6173:22;6152:53;:::i;:::-;6142:63;;6098:117;6254:2;6280:53;6325:7;6316:6;6305:9;6301:22;6280:53;:::i;:::-;6270:63;;6225:118;5876:474;;;;;:::o;6356:329::-;6415:6;6464:2;6452:9;6443:7;6439:23;6435:32;6432:119;;;6470:79;;:::i;:::-;6432:119;6590:1;6615:53;6660:7;6651:6;6640:9;6636:22;6615:53;:::i;:::-;6605:63;;6561:117;6356:329;;;;:::o;6691:327::-;6749:6;6798:2;6786:9;6777:7;6773:23;6769:32;6766:119;;;6804:79;;:::i;:::-;6766:119;6924:1;6949:52;6993:7;6984:6;6973:9;6969:22;6949:52;:::i;:::-;6939:62;;6895:116;6691:327;;;;:::o;7024:349::-;7093:6;7142:2;7130:9;7121:7;7117:23;7113:32;7110:119;;;7148:79;;:::i;:::-;7110:119;7268:1;7293:63;7348:7;7339:6;7328:9;7324:22;7293:63;:::i;:::-;7283:73;;7239:127;7024:349;;;;:::o;7379:509::-;7448:6;7497:2;7485:9;7476:7;7472:23;7468:32;7465:119;;;7503:79;;:::i;:::-;7465:119;7651:1;7640:9;7636:17;7623:31;7681:18;7673:6;7670:30;7667:117;;;7703:79;;:::i;:::-;7667:117;7808:63;7863:7;7854:6;7843:9;7839:22;7808:63;:::i;:::-;7798:73;;7594:287;7379:509;;;;:::o;7894:329::-;7953:6;8002:2;7990:9;7981:7;7977:23;7973:32;7970:119;;;8008:79;;:::i;:::-;7970:119;8128:1;8153:53;8198:7;8189:6;8178:9;8174:22;8153:53;:::i;:::-;8143:63;;8099:117;7894:329;;;;:::o;8229:704::-;8324:6;8332;8340;8389:2;8377:9;8368:7;8364:23;8360:32;8357:119;;;8395:79;;:::i;:::-;8357:119;8515:1;8540:53;8585:7;8576:6;8565:9;8561:22;8540:53;:::i;:::-;8530:63;;8486:117;8670:2;8659:9;8655:18;8642:32;8701:18;8693:6;8690:30;8687:117;;;8723:79;;:::i;:::-;8687:117;8836:80;8908:7;8899:6;8888:9;8884:22;8836:80;:::i;:::-;8818:98;;;;8613:313;8229:704;;;;;:::o;8939:179::-;9008:10;9029:46;9071:3;9063:6;9029:46;:::i;:::-;9107:4;9102:3;9098:14;9084:28;;8939:179;;;;:::o;9124:118::-;9211:24;9229:5;9211:24;:::i;:::-;9206:3;9199:37;9124:118;;:::o;9248:157::-;9353:45;9373:24;9391:5;9373:24;:::i;:::-;9353:45;:::i;:::-;9348:3;9341:58;9248:157;;:::o;9441:732::-;9560:3;9589:54;9637:5;9589:54;:::i;:::-;9659:86;9738:6;9733:3;9659:86;:::i;:::-;9652:93;;9769:56;9819:5;9769:56;:::i;:::-;9848:7;9879:1;9864:284;9889:6;9886:1;9883:13;9864:284;;;9965:6;9959:13;9992:63;10051:3;10036:13;9992:63;:::i;:::-;9985:70;;10078:60;10131:6;10078:60;:::i;:::-;10068:70;;9924:224;9911:1;9908;9904:9;9899:14;;9864:284;;;9868:14;10164:3;10157:10;;9565:608;;;9441:732;;;;:::o;10179:109::-;10260:21;10275:5;10260:21;:::i;:::-;10255:3;10248:34;10179:109;;:::o;10294:118::-;10381:24;10399:5;10381:24;:::i;:::-;10376:3;10369:37;10294:118;;:::o;10418:157::-;10523:45;10543:24;10561:5;10543:24;:::i;:::-;10523:45;:::i;:::-;10518:3;10511:58;10418:157;;:::o;10581:360::-;10667:3;10695:38;10727:5;10695:38;:::i;:::-;10749:70;10812:6;10807:3;10749:70;:::i;:::-;10742:77;;10828:52;10873:6;10868:3;10861:4;10854:5;10850:16;10828:52;:::i;:::-;10905:29;10927:6;10905:29;:::i;:::-;10900:3;10896:39;10889:46;;10671:270;10581:360;;;;:::o;10947:364::-;11035:3;11063:39;11096:5;11063:39;:::i;:::-;11118:71;11182:6;11177:3;11118:71;:::i;:::-;11111:78;;11198:52;11243:6;11238:3;11231:4;11224:5;11220:16;11198:52;:::i;:::-;11275:29;11297:6;11275:29;:::i;:::-;11270:3;11266:39;11259:46;;11039:272;10947:364;;;;:::o;11317:377::-;11423:3;11451:39;11484:5;11451:39;:::i;:::-;11506:89;11588:6;11583:3;11506:89;:::i;:::-;11499:96;;11604:52;11649:6;11644:3;11637:4;11630:5;11626:16;11604:52;:::i;:::-;11681:6;11676:3;11672:16;11665:23;;11427:267;11317:377;;;;:::o;11724:845::-;11827:3;11864:5;11858:12;11893:36;11919:9;11893:36;:::i;:::-;11945:89;12027:6;12022:3;11945:89;:::i;:::-;11938:96;;12065:1;12054:9;12050:17;12081:1;12076:137;;;;12227:1;12222:341;;;;12043:520;;12076:137;12160:4;12156:9;12145;12141:25;12136:3;12129:38;12196:6;12191:3;12187:16;12180:23;;12076:137;;12222:341;12289:38;12321:5;12289:38;:::i;:::-;12349:1;12363:154;12377:6;12374:1;12371:13;12363:154;;;12451:7;12445:14;12441:1;12436:3;12432:11;12425:35;12501:1;12492:7;12488:15;12477:26;;12399:4;12396:1;12392:12;12387:17;;12363:154;;;12546:6;12541:3;12537:16;12530:23;;12229:334;;12043:520;;11831:738;;11724:845;;;;:::o;12575:366::-;12717:3;12738:67;12802:2;12797:3;12738:67;:::i;:::-;12731:74;;12814:93;12903:3;12814:93;:::i;:::-;12932:2;12927:3;12923:12;12916:19;;12575:366;;;:::o;12947:::-;13089:3;13110:67;13174:2;13169:3;13110:67;:::i;:::-;13103:74;;13186:93;13275:3;13186:93;:::i;:::-;13304:2;13299:3;13295:12;13288:19;;12947:366;;;:::o;13319:::-;13461:3;13482:67;13546:2;13541:3;13482:67;:::i;:::-;13475:74;;13558:93;13647:3;13558:93;:::i;:::-;13676:2;13671:3;13667:12;13660:19;;13319:366;;;:::o;13691:::-;13833:3;13854:67;13918:2;13913:3;13854:67;:::i;:::-;13847:74;;13930:93;14019:3;13930:93;:::i;:::-;14048:2;14043:3;14039:12;14032:19;;13691:366;;;:::o;14063:::-;14205:3;14226:67;14290:2;14285:3;14226:67;:::i;:::-;14219:74;;14302:93;14391:3;14302:93;:::i;:::-;14420:2;14415:3;14411:12;14404:19;;14063:366;;;:::o;14435:::-;14577:3;14598:67;14662:2;14657:3;14598:67;:::i;:::-;14591:74;;14674:93;14763:3;14674:93;:::i;:::-;14792:2;14787:3;14783:12;14776:19;;14435:366;;;:::o;14807:::-;14949:3;14970:67;15034:2;15029:3;14970:67;:::i;:::-;14963:74;;15046:93;15135:3;15046:93;:::i;:::-;15164:2;15159:3;15155:12;15148:19;;14807:366;;;:::o;15179:::-;15321:3;15342:67;15406:2;15401:3;15342:67;:::i;:::-;15335:74;;15418:93;15507:3;15418:93;:::i;:::-;15536:2;15531:3;15527:12;15520:19;;15179:366;;;:::o;15551:::-;15693:3;15714:67;15778:2;15773:3;15714:67;:::i;:::-;15707:74;;15790:93;15879:3;15790:93;:::i;:::-;15908:2;15903:3;15899:12;15892:19;;15551:366;;;:::o;15923:::-;16065:3;16086:67;16150:2;16145:3;16086:67;:::i;:::-;16079:74;;16162:93;16251:3;16162:93;:::i;:::-;16280:2;16275:3;16271:12;16264:19;;15923:366;;;:::o;16295:::-;16437:3;16458:67;16522:2;16517:3;16458:67;:::i;:::-;16451:74;;16534:93;16623:3;16534:93;:::i;:::-;16652:2;16647:3;16643:12;16636:19;;16295:366;;;:::o;16667:::-;16809:3;16830:67;16894:2;16889:3;16830:67;:::i;:::-;16823:74;;16906:93;16995:3;16906:93;:::i;:::-;17024:2;17019:3;17015:12;17008:19;;16667:366;;;:::o;17039:::-;17181:3;17202:67;17266:2;17261:3;17202:67;:::i;:::-;17195:74;;17278:93;17367:3;17278:93;:::i;:::-;17396:2;17391:3;17387:12;17380:19;;17039:366;;;:::o;17411:::-;17553:3;17574:67;17638:2;17633:3;17574:67;:::i;:::-;17567:74;;17650:93;17739:3;17650:93;:::i;:::-;17768:2;17763:3;17759:12;17752:19;;17411:366;;;:::o;17783:::-;17925:3;17946:67;18010:2;18005:3;17946:67;:::i;:::-;17939:74;;18022:93;18111:3;18022:93;:::i;:::-;18140:2;18135:3;18131:12;18124:19;;17783:366;;;:::o;18155:::-;18297:3;18318:67;18382:2;18377:3;18318:67;:::i;:::-;18311:74;;18394:93;18483:3;18394:93;:::i;:::-;18512:2;18507:3;18503:12;18496:19;;18155:366;;;:::o;18527:::-;18669:3;18690:67;18754:2;18749:3;18690:67;:::i;:::-;18683:74;;18766:93;18855:3;18766:93;:::i;:::-;18884:2;18879:3;18875:12;18868:19;;18527:366;;;:::o;18899:::-;19041:3;19062:67;19126:2;19121:3;19062:67;:::i;:::-;19055:74;;19138:93;19227:3;19138:93;:::i;:::-;19256:2;19251:3;19247:12;19240:19;;18899:366;;;:::o;19271:::-;19413:3;19434:67;19498:2;19493:3;19434:67;:::i;:::-;19427:74;;19510:93;19599:3;19510:93;:::i;:::-;19628:2;19623:3;19619:12;19612:19;;19271:366;;;:::o;19643:::-;19785:3;19806:67;19870:2;19865:3;19806:67;:::i;:::-;19799:74;;19882:93;19971:3;19882:93;:::i;:::-;20000:2;19995:3;19991:12;19984:19;;19643:366;;;:::o;20015:::-;20157:3;20178:67;20242:2;20237:3;20178:67;:::i;:::-;20171:74;;20254:93;20343:3;20254:93;:::i;:::-;20372:2;20367:3;20363:12;20356:19;;20015:366;;;:::o;20387:::-;20529:3;20550:67;20614:2;20609:3;20550:67;:::i;:::-;20543:74;;20626:93;20715:3;20626:93;:::i;:::-;20744:2;20739:3;20735:12;20728:19;;20387:366;;;:::o;20759:::-;20901:3;20922:67;20986:2;20981:3;20922:67;:::i;:::-;20915:74;;20998:93;21087:3;20998:93;:::i;:::-;21116:2;21111:3;21107:12;21100:19;;20759:366;;;:::o;21131:::-;21273:3;21294:67;21358:2;21353:3;21294:67;:::i;:::-;21287:74;;21370:93;21459:3;21370:93;:::i;:::-;21488:2;21483:3;21479:12;21472:19;;21131:366;;;:::o;21503:::-;21645:3;21666:67;21730:2;21725:3;21666:67;:::i;:::-;21659:74;;21742:93;21831:3;21742:93;:::i;:::-;21860:2;21855:3;21851:12;21844:19;;21503:366;;;:::o;21875:::-;22017:3;22038:67;22102:2;22097:3;22038:67;:::i;:::-;22031:74;;22114:93;22203:3;22114:93;:::i;:::-;22232:2;22227:3;22223:12;22216:19;;21875:366;;;:::o;22247:::-;22389:3;22410:67;22474:2;22469:3;22410:67;:::i;:::-;22403:74;;22486:93;22575:3;22486:93;:::i;:::-;22604:2;22599:3;22595:12;22588:19;;22247:366;;;:::o;22619:::-;22761:3;22782:67;22846:2;22841:3;22782:67;:::i;:::-;22775:74;;22858:93;22947:3;22858:93;:::i;:::-;22976:2;22971:3;22967:12;22960:19;;22619:366;;;:::o;22991:108::-;23068:24;23086:5;23068:24;:::i;:::-;23063:3;23056:37;22991:108;;:::o;23105:118::-;23192:24;23210:5;23192:24;:::i;:::-;23187:3;23180:37;23105:118;;:::o;23229:256::-;23341:3;23356:75;23427:3;23418:6;23356:75;:::i;:::-;23456:2;23451:3;23447:12;23440:19;;23476:3;23469:10;;23229:256;;;;:::o;23491:397::-;23631:3;23646:75;23717:3;23708:6;23646:75;:::i;:::-;23746:2;23741:3;23737:12;23730:19;;23759:75;23830:3;23821:6;23759:75;:::i;:::-;23859:2;23854:3;23850:12;23843:19;;23879:3;23872:10;;23491:397;;;;;:::o;23894:589::-;24119:3;24141:95;24232:3;24223:6;24141:95;:::i;:::-;24134:102;;24253:95;24344:3;24335:6;24253:95;:::i;:::-;24246:102;;24365:92;24453:3;24444:6;24365:92;:::i;:::-;24358:99;;24474:3;24467:10;;23894:589;;;;;;:::o;24489:222::-;24582:4;24620:2;24609:9;24605:18;24597:26;;24633:71;24701:1;24690:9;24686:17;24677:6;24633:71;:::i;:::-;24489:222;;;;:::o;24717:640::-;24912:4;24950:3;24939:9;24935:19;24927:27;;24964:71;25032:1;25021:9;25017:17;25008:6;24964:71;:::i;:::-;25045:72;25113:2;25102:9;25098:18;25089:6;25045:72;:::i;:::-;25127;25195:2;25184:9;25180:18;25171:6;25127:72;:::i;:::-;25246:9;25240:4;25236:20;25231:2;25220:9;25216:18;25209:48;25274:76;25345:4;25336:6;25274:76;:::i;:::-;25266:84;;24717:640;;;;;;;:::o;25363:373::-;25506:4;25544:2;25533:9;25529:18;25521:26;;25593:9;25587:4;25583:20;25579:1;25568:9;25564:17;25557:47;25621:108;25724:4;25715:6;25621:108;:::i;:::-;25613:116;;25363:373;;;;:::o;25742:210::-;25829:4;25867:2;25856:9;25852:18;25844:26;;25880:65;25942:1;25931:9;25927:17;25918:6;25880:65;:::i;:::-;25742:210;;;;:::o;25958:222::-;26051:4;26089:2;26078:9;26074:18;26066:26;;26102:71;26170:1;26159:9;26155:17;26146:6;26102:71;:::i;:::-;25958:222;;;;:::o;26186:313::-;26299:4;26337:2;26326:9;26322:18;26314:26;;26386:9;26380:4;26376:20;26372:1;26361:9;26357:17;26350:47;26414:78;26487:4;26478:6;26414:78;:::i;:::-;26406:86;;26186:313;;;;:::o;26505:419::-;26671:4;26709:2;26698:9;26694:18;26686:26;;26758:9;26752:4;26748:20;26744:1;26733:9;26729:17;26722:47;26786:131;26912:4;26786:131;:::i;:::-;26778:139;;26505:419;;;:::o;26930:::-;27096:4;27134:2;27123:9;27119:18;27111:26;;27183:9;27177:4;27173:20;27169:1;27158:9;27154:17;27147:47;27211:131;27337:4;27211:131;:::i;:::-;27203:139;;26930:419;;;:::o;27355:::-;27521:4;27559:2;27548:9;27544:18;27536:26;;27608:9;27602:4;27598:20;27594:1;27583:9;27579:17;27572:47;27636:131;27762:4;27636:131;:::i;:::-;27628:139;;27355:419;;;:::o;27780:::-;27946:4;27984:2;27973:9;27969:18;27961:26;;28033:9;28027:4;28023:20;28019:1;28008:9;28004:17;27997:47;28061:131;28187:4;28061:131;:::i;:::-;28053:139;;27780:419;;;:::o;28205:::-;28371:4;28409:2;28398:9;28394:18;28386:26;;28458:9;28452:4;28448:20;28444:1;28433:9;28429:17;28422:47;28486:131;28612:4;28486:131;:::i;:::-;28478:139;;28205:419;;;:::o;28630:::-;28796:4;28834:2;28823:9;28819:18;28811:26;;28883:9;28877:4;28873:20;28869:1;28858:9;28854:17;28847:47;28911:131;29037:4;28911:131;:::i;:::-;28903:139;;28630:419;;;:::o;29055:::-;29221:4;29259:2;29248:9;29244:18;29236:26;;29308:9;29302:4;29298:20;29294:1;29283:9;29279:17;29272:47;29336:131;29462:4;29336:131;:::i;:::-;29328:139;;29055:419;;;:::o;29480:::-;29646:4;29684:2;29673:9;29669:18;29661:26;;29733:9;29727:4;29723:20;29719:1;29708:9;29704:17;29697:47;29761:131;29887:4;29761:131;:::i;:::-;29753:139;;29480:419;;;:::o;29905:::-;30071:4;30109:2;30098:9;30094:18;30086:26;;30158:9;30152:4;30148:20;30144:1;30133:9;30129:17;30122:47;30186:131;30312:4;30186:131;:::i;:::-;30178:139;;29905:419;;;:::o;30330:::-;30496:4;30534:2;30523:9;30519:18;30511:26;;30583:9;30577:4;30573:20;30569:1;30558:9;30554:17;30547:47;30611:131;30737:4;30611:131;:::i;:::-;30603:139;;30330:419;;;:::o;30755:::-;30921:4;30959:2;30948:9;30944:18;30936:26;;31008:9;31002:4;30998:20;30994:1;30983:9;30979:17;30972:47;31036:131;31162:4;31036:131;:::i;:::-;31028:139;;30755:419;;;:::o;31180:::-;31346:4;31384:2;31373:9;31369:18;31361:26;;31433:9;31427:4;31423:20;31419:1;31408:9;31404:17;31397:47;31461:131;31587:4;31461:131;:::i;:::-;31453:139;;31180:419;;;:::o;31605:::-;31771:4;31809:2;31798:9;31794:18;31786:26;;31858:9;31852:4;31848:20;31844:1;31833:9;31829:17;31822:47;31886:131;32012:4;31886:131;:::i;:::-;31878:139;;31605:419;;;:::o;32030:::-;32196:4;32234:2;32223:9;32219:18;32211:26;;32283:9;32277:4;32273:20;32269:1;32258:9;32254:17;32247:47;32311:131;32437:4;32311:131;:::i;:::-;32303:139;;32030:419;;;:::o;32455:::-;32621:4;32659:2;32648:9;32644:18;32636:26;;32708:9;32702:4;32698:20;32694:1;32683:9;32679:17;32672:47;32736:131;32862:4;32736:131;:::i;:::-;32728:139;;32455:419;;;:::o;32880:::-;33046:4;33084:2;33073:9;33069:18;33061:26;;33133:9;33127:4;33123:20;33119:1;33108:9;33104:17;33097:47;33161:131;33287:4;33161:131;:::i;:::-;33153:139;;32880:419;;;:::o;33305:::-;33471:4;33509:2;33498:9;33494:18;33486:26;;33558:9;33552:4;33548:20;33544:1;33533:9;33529:17;33522:47;33586:131;33712:4;33586:131;:::i;:::-;33578:139;;33305:419;;;:::o;33730:::-;33896:4;33934:2;33923:9;33919:18;33911:26;;33983:9;33977:4;33973:20;33969:1;33958:9;33954:17;33947:47;34011:131;34137:4;34011:131;:::i;:::-;34003:139;;33730:419;;;:::o;34155:::-;34321:4;34359:2;34348:9;34344:18;34336:26;;34408:9;34402:4;34398:20;34394:1;34383:9;34379:17;34372:47;34436:131;34562:4;34436:131;:::i;:::-;34428:139;;34155:419;;;:::o;34580:::-;34746:4;34784:2;34773:9;34769:18;34761:26;;34833:9;34827:4;34823:20;34819:1;34808:9;34804:17;34797:47;34861:131;34987:4;34861:131;:::i;:::-;34853:139;;34580:419;;;:::o;35005:::-;35171:4;35209:2;35198:9;35194:18;35186:26;;35258:9;35252:4;35248:20;35244:1;35233:9;35229:17;35222:47;35286:131;35412:4;35286:131;:::i;:::-;35278:139;;35005:419;;;:::o;35430:::-;35596:4;35634:2;35623:9;35619:18;35611:26;;35683:9;35677:4;35673:20;35669:1;35658:9;35654:17;35647:47;35711:131;35837:4;35711:131;:::i;:::-;35703:139;;35430:419;;;:::o;35855:::-;36021:4;36059:2;36048:9;36044:18;36036:26;;36108:9;36102:4;36098:20;36094:1;36083:9;36079:17;36072:47;36136:131;36262:4;36136:131;:::i;:::-;36128:139;;35855:419;;;:::o;36280:::-;36446:4;36484:2;36473:9;36469:18;36461:26;;36533:9;36527:4;36523:20;36519:1;36508:9;36504:17;36497:47;36561:131;36687:4;36561:131;:::i;:::-;36553:139;;36280:419;;;:::o;36705:::-;36871:4;36909:2;36898:9;36894:18;36886:26;;36958:9;36952:4;36948:20;36944:1;36933:9;36929:17;36922:47;36986:131;37112:4;36986:131;:::i;:::-;36978:139;;36705:419;;;:::o;37130:::-;37296:4;37334:2;37323:9;37319:18;37311:26;;37383:9;37377:4;37373:20;37369:1;37358:9;37354:17;37347:47;37411:131;37537:4;37411:131;:::i;:::-;37403:139;;37130:419;;;:::o;37555:::-;37721:4;37759:2;37748:9;37744:18;37736:26;;37808:9;37802:4;37798:20;37794:1;37783:9;37779:17;37772:47;37836:131;37962:4;37836:131;:::i;:::-;37828:139;;37555:419;;;:::o;37980:::-;38146:4;38184:2;38173:9;38169:18;38161:26;;38233:9;38227:4;38223:20;38219:1;38208:9;38204:17;38197:47;38261:131;38387:4;38261:131;:::i;:::-;38253:139;;37980:419;;;:::o;38405:222::-;38498:4;38536:2;38525:9;38521:18;38513:26;;38549:71;38617:1;38606:9;38602:17;38593:6;38549:71;:::i;:::-;38405:222;;;;:::o;38633:129::-;38667:6;38694:20;;:::i;:::-;38684:30;;38723:33;38751:4;38743:6;38723:33;:::i;:::-;38633:129;;;:::o;38768:75::-;38801:6;38834:2;38828:9;38818:19;;38768:75;:::o;38849:307::-;38910:4;39000:18;38992:6;38989:30;38986:56;;;39022:18;;:::i;:::-;38986:56;39060:29;39082:6;39060:29;:::i;:::-;39052:37;;39144:4;39138;39134:15;39126:23;;38849:307;;;:::o;39162:308::-;39224:4;39314:18;39306:6;39303:30;39300:56;;;39336:18;;:::i;:::-;39300:56;39374:29;39396:6;39374:29;:::i;:::-;39366:37;;39458:4;39452;39448:15;39440:23;;39162:308;;;:::o;39476:132::-;39543:4;39566:3;39558:11;;39596:4;39591:3;39587:14;39579:22;;39476:132;;;:::o;39614:141::-;39663:4;39686:3;39678:11;;39709:3;39706:1;39699:14;39743:4;39740:1;39730:18;39722:26;;39614:141;;;:::o;39761:114::-;39828:6;39862:5;39856:12;39846:22;;39761:114;;;:::o;39881:98::-;39932:6;39966:5;39960:12;39950:22;;39881:98;;;:::o;39985:99::-;40037:6;40071:5;40065:12;40055:22;;39985:99;;;:::o;40090:113::-;40160:4;40192;40187:3;40183:14;40175:22;;40090:113;;;:::o;40209:184::-;40308:11;40342:6;40337:3;40330:19;40382:4;40377:3;40373:14;40358:29;;40209:184;;;;:::o;40399:168::-;40482:11;40516:6;40511:3;40504:19;40556:4;40551:3;40547:14;40532:29;;40399:168;;;;:::o;40573:169::-;40657:11;40691:6;40686:3;40679:19;40731:4;40726:3;40722:14;40707:29;;40573:169;;;;:::o;40748:148::-;40850:11;40887:3;40872:18;;40748:148;;;;:::o;40902:305::-;40942:3;40961:20;40979:1;40961:20;:::i;:::-;40956:25;;40995:20;41013:1;40995:20;:::i;:::-;40990:25;;41149:1;41081:66;41077:74;41074:1;41071:81;41068:107;;;41155:18;;:::i;:::-;41068:107;41199:1;41196;41192:9;41185:16;;40902:305;;;;:::o;41213:185::-;41253:1;41270:20;41288:1;41270:20;:::i;:::-;41265:25;;41304:20;41322:1;41304:20;:::i;:::-;41299:25;;41343:1;41333:35;;41348:18;;:::i;:::-;41333:35;41390:1;41387;41383:9;41378:14;;41213:185;;;;:::o;41404:348::-;41444:7;41467:20;41485:1;41467:20;:::i;:::-;41462:25;;41501:20;41519:1;41501:20;:::i;:::-;41496:25;;41689:1;41621:66;41617:74;41614:1;41611:81;41606:1;41599:9;41592:17;41588:105;41585:131;;;41696:18;;:::i;:::-;41585:131;41744:1;41741;41737:9;41726:20;;41404:348;;;;:::o;41758:191::-;41798:4;41818:20;41836:1;41818:20;:::i;:::-;41813:25;;41852:20;41870:1;41852:20;:::i;:::-;41847:25;;41891:1;41888;41885:8;41882:34;;;41896:18;;:::i;:::-;41882:34;41941:1;41938;41934:9;41926:17;;41758:191;;;;:::o;41955:96::-;41992:7;42021:24;42039:5;42021:24;:::i;:::-;42010:35;;41955:96;;;:::o;42057:90::-;42091:7;42134:5;42127:13;42120:21;42109:32;;42057:90;;;:::o;42153:77::-;42190:7;42219:5;42208:16;;42153:77;;;:::o;42236:149::-;42272:7;42312:66;42305:5;42301:78;42290:89;;42236:149;;;:::o;42391:126::-;42428:7;42468:42;42461:5;42457:54;42446:65;;42391:126;;;:::o;42523:77::-;42560:7;42589:5;42578:16;;42523:77;;;:::o;42606:154::-;42690:6;42685:3;42680;42667:30;42752:1;42743:6;42738:3;42734:16;42727:27;42606:154;;;:::o;42766:307::-;42834:1;42844:113;42858:6;42855:1;42852:13;42844:113;;;42943:1;42938:3;42934:11;42928:18;42924:1;42919:3;42915:11;42908:39;42880:2;42877:1;42873:10;42868:15;;42844:113;;;42975:6;42972:1;42969:13;42966:101;;;43055:1;43046:6;43041:3;43037:16;43030:27;42966:101;42815:258;42766:307;;;:::o;43079:320::-;43123:6;43160:1;43154:4;43150:12;43140:22;;43207:1;43201:4;43197:12;43228:18;43218:81;;43284:4;43276:6;43272:17;43262:27;;43218:81;43346:2;43338:6;43335:14;43315:18;43312:38;43309:84;;;43365:18;;:::i;:::-;43309:84;43130:269;43079:320;;;:::o;43405:281::-;43488:27;43510:4;43488:27;:::i;:::-;43480:6;43476:40;43618:6;43606:10;43603:22;43582:18;43570:10;43567:34;43564:62;43561:88;;;43629:18;;:::i;:::-;43561:88;43669:10;43665:2;43658:22;43448:238;43405:281;;:::o;43692:233::-;43731:3;43754:24;43772:5;43754:24;:::i;:::-;43745:33;;43800:66;43793:5;43790:77;43787:103;;;43870:18;;:::i;:::-;43787:103;43917:1;43910:5;43906:13;43899:20;;43692:233;;;:::o;43931:100::-;43970:7;43999:26;44019:5;43999:26;:::i;:::-;43988:37;;43931:100;;;:::o;44037:79::-;44076:7;44105:5;44094:16;;44037:79;;;:::o;44122:94::-;44161:7;44190:20;44204:5;44190:20;:::i;:::-;44179:31;;44122:94;;;:::o;44222:176::-;44254:1;44271:20;44289:1;44271:20;:::i;:::-;44266:25;;44305:20;44323:1;44305:20;:::i;:::-;44300:25;;44344:1;44334:35;;44349:18;;:::i;:::-;44334:35;44390:1;44387;44383:9;44378:14;;44222:176;;;;:::o;44404:180::-;44452:77;44449:1;44442:88;44549:4;44546:1;44539:15;44573:4;44570:1;44563:15;44590:180;44638:77;44635:1;44628:88;44735:4;44732:1;44725:15;44759:4;44756:1;44749:15;44776:180;44824:77;44821:1;44814:88;44921:4;44918:1;44911:15;44945:4;44942:1;44935:15;44962:180;45010:77;45007:1;45000:88;45107:4;45104:1;45097:15;45131:4;45128:1;45121:15;45148:180;45196:77;45193:1;45186:88;45293:4;45290:1;45283:15;45317:4;45314:1;45307:15;45334:180;45382:77;45379:1;45372:88;45479:4;45476:1;45469:15;45503:4;45500:1;45493:15;45520:117;45629:1;45626;45619:12;45643:117;45752:1;45749;45742:12;45766:117;45875:1;45872;45865:12;45889:117;45998:1;45995;45988:12;46012:117;46121:1;46118;46111:12;46135:117;46244:1;46241;46234:12;46258:102;46299:6;46350:2;46346:7;46341:2;46334:5;46330:14;46326:28;46316:38;;46258:102;;;:::o;46366:94::-;46399:8;46447:5;46443:2;46439:14;46418:35;;46366:94;;;:::o;46466:230::-;46606:34;46602:1;46594:6;46590:14;46583:58;46675:13;46670:2;46662:6;46658:15;46651:38;46466:230;:::o;46702:237::-;46842:34;46838:1;46830:6;46826:14;46819:58;46911:20;46906:2;46898:6;46894:15;46887:45;46702:237;:::o;46945:227::-;47085:34;47081:1;47073:6;47069:14;47062:58;47154:10;47149:2;47141:6;47137:15;47130:35;46945:227;:::o;47178:225::-;47318:34;47314:1;47306:6;47302:14;47295:58;47387:8;47382:2;47374:6;47370:15;47363:33;47178:225;:::o;47409:178::-;47549:30;47545:1;47537:6;47533:14;47526:54;47409:178;:::o;47593:223::-;47733:34;47729:1;47721:6;47717:14;47710:58;47802:6;47797:2;47789:6;47785:15;47778:31;47593:223;:::o;47822:175::-;47962:27;47958:1;47950:6;47946:14;47939:51;47822:175;:::o;48003:181::-;48143:33;48139:1;48131:6;48127:14;48120:57;48003:181;:::o;48190:168::-;48330:20;48326:1;48318:6;48314:14;48307:44;48190:168;:::o;48364:181::-;48504:33;48500:1;48492:6;48488:14;48481:57;48364:181;:::o;48551:231::-;48691:34;48687:1;48679:6;48675:14;48668:58;48760:14;48755:2;48747:6;48743:15;48736:39;48551:231;:::o;48788:220::-;48928:34;48924:1;48916:6;48912:14;48905:58;48997:3;48992:2;48984:6;48980:15;48973:28;48788:220;:::o;49014:243::-;49154:34;49150:1;49142:6;49138:14;49131:58;49223:26;49218:2;49210:6;49206:15;49199:51;49014:243;:::o;49263:229::-;49403:34;49399:1;49391:6;49387:14;49380:58;49472:12;49467:2;49459:6;49455:15;49448:37;49263:229;:::o;49498:228::-;49638:34;49634:1;49626:6;49622:14;49615:58;49707:11;49702:2;49694:6;49690:15;49683:36;49498:228;:::o;49732:168::-;49872:20;49868:1;49860:6;49856:14;49849:44;49732:168;:::o;49906:167::-;50046:19;50042:1;50034:6;50030:14;50023:43;49906:167;:::o;50079:182::-;50219:34;50215:1;50207:6;50203:14;50196:58;50079:182;:::o;50267:231::-;50407:34;50403:1;50395:6;50391:14;50384:58;50476:14;50471:2;50463:6;50459:15;50452:39;50267:231;:::o;50504:182::-;50644:34;50640:1;50632:6;50628:14;50621:58;50504:182;:::o;50692:172::-;50832:24;50828:1;50820:6;50816:14;50809:48;50692:172;:::o;50870:228::-;51010:34;51006:1;50998:6;50994:14;50987:58;51079:11;51074:2;51066:6;51062:15;51055:36;50870:228;:::o;51104:234::-;51244:34;51240:1;51232:6;51228:14;51221:58;51313:17;51308:2;51300:6;51296:15;51289:42;51104:234;:::o;51344:220::-;51484:34;51480:1;51472:6;51468:14;51461:58;51553:3;51548:2;51540:6;51536:15;51529:28;51344:220;:::o;51570:177::-;51710:29;51706:1;51698:6;51694:14;51687:53;51570:177;:::o;51753:236::-;51893:34;51889:1;51881:6;51877:14;51870:58;51962:19;51957:2;51949:6;51945:15;51938:44;51753:236;:::o;51995:231::-;52135:34;52131:1;52123:6;52119:14;52112:58;52204:14;52199:2;52191:6;52187:15;52180:39;51995:231;:::o;52232:163::-;52372:15;52368:1;52360:6;52356:14;52349:39;52232:163;:::o;52401:122::-;52474:24;52492:5;52474:24;:::i;:::-;52467:5;52464:35;52454:63;;52513:1;52510;52503:12;52454:63;52401:122;:::o;52529:116::-;52599:21;52614:5;52599:21;:::i;:::-;52592:5;52589:32;52579:60;;52635:1;52632;52625:12;52579:60;52529:116;:::o;52651:122::-;52724:24;52742:5;52724:24;:::i;:::-;52717:5;52714:35;52704:63;;52763:1;52760;52753:12;52704:63;52651:122;:::o;52779:120::-;52851:23;52868:5;52851:23;:::i;:::-;52844:5;52841:34;52831:62;;52889:1;52886;52879:12;52831:62;52779:120;:::o;52905:122::-;52978:24;52996:5;52978:24;:::i;:::-;52971:5;52968:35;52958:63;;53017:1;53014;53007:12;52958:63;52905:122;:::o

Swarm Source

ipfs://0e85dafd88f0a3c740ac87da3ef04a7abecaf5ada798a5d2c2d60e21998faf3f
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.