ETH Price: $3,878.00 (-1.25%)

Token

TrillioHeirs (TRH)
 

Overview

Max Total Supply

0 TRH

Holders

264

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 TRH
0x259331c2188f2fde46d382d23fed9a4e08fd4183
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:
TrillioHeirs

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-15
*/

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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 {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

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

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

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;
        }
    }
}

// File: contracts/NFT.sol



pragma solidity 0.8.12;





contract TrillioHeirs is ERC721, Ownable {
    using SafeMath for uint256;

    bool public paused = false;
    bool public presale = true;
    string public baseURI;

    uint256 public mintedAmount_1 = 0;
    uint256 public mintedAmount_2 = 0;
    uint256 public mintedAmount_3 = 0;
    uint256 public mintedAmount_4 = 0;

    uint256 public maxMint_presale = 3000;
    uint256 public maxMint_1 = 7000;
    uint256 public maxMint_2 = 1500;
    uint256 public maxMint_3 = 370;
    uint256 public maxMint_4 = 18;

    uint256 public presalePrice = 0.15 ether;
    uint256 public publicsalePrice = 0.18 ether;

    uint256 public presaleMaxMint = 10;
    uint256 public publicsaleMaxMint = 5;

    bytes32 private merkleTreeRoot_1;
    bytes32 private merkleTreeRoot_2;
    bytes32 private merkleTreeRoot_3;

    mapping(address => bool) presaleAttenders;

    uint256 public ownerMintTotal = 206;
    uint256 ownerMint_1 = 0;
    uint256 ownerMint_2 = 0;
    uint256 ownerMint_3 = 0;
    uint256 ownerMint_4 = 0;

    struct SpecialWallet {
        uint256 level;
        uint256 maxMintAmount;
    }
    mapping(address => SpecialWallet) specialListInfo;

    constructor(string memory name, string memory symbol, string memory baseUrl) ERC721(name, symbol) {
        setBaseURI(baseUrl);
    }

    receive() external payable {}

    function withdrawAll() external onlyOwner {
        uint256 amount = address(this).balance;
        payable(owner()).transfer(amount);
    }

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

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

    function setPresale(bool s_) public onlyOwner {
        require(presale == true, "TrillioHeirs: presale can be set only once");
        presale = s_;
    }

    modifier isPresale {
        require(presale, "TrillioHeirs: presale finished");
        _;
    }

    modifier isPublicsale {
        require(!presale, "TrillioHeirs: public sale not started");
        _;
    }

    function setPaused(bool s_) public onlyOwner {
        paused = s_;
    }

    modifier emergencyPause {
        require(!paused);
        _;
    }

    function _getRemainingForLvl(uint256 lvl) private view returns(uint256) {
        if (lvl == 1)
            return maxMint_1 - mintedAmount_1;
        else if (lvl == 2)
            return maxMint_2 - mintedAmount_2;
        else if (lvl == 3)
            return maxMint_3 - mintedAmount_3;
        else 
            return 0;
    }

    function addToSpecialList(address[] memory addresses, uint256[] memory levels, uint256[] memory maxMintCounts) public onlyOwner {
        require(addresses.length == levels.length && levels.length == maxMintCounts.length, "TrillioHeirs: arrays has different length");

        for (uint256 i = 0; i < addresses.length; i++) {
            require(levels[i] > 0 && levels[i] < 4, "TrillioHeirs: The level of special wallet can not be greater than 4");
            SpecialWallet memory item = SpecialWallet(levels[i], maxMintCounts[i]);
            specialListInfo[addresses[i]] = item;
        }
    }

    function _getPresoldAmount() private view returns(uint256) {
        return mintedAmount_1 + mintedAmount_2 + mintedAmount_3;
    }

    function _getPresaleCost(uint256 amount) private view returns(uint256) {
        return presalePrice.mul(amount);
    }

    function setMerkleTree(bytes32 root_, uint256 lvl) public onlyOwner {
        if (lvl == 1)
            merkleTreeRoot_1 = root_;
        else if (lvl == 2)
            merkleTreeRoot_2 = root_;
        else 
            merkleTreeRoot_3 = root_;
    }

    function _verifyWhitelist(bytes32[] memory proof, uint256 lvl) private view returns(bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        if(lvl == 1)
            return MerkleProof.verify(proof, merkleTreeRoot_1, leaf);
        else if (lvl == 2)
            return MerkleProof.verify(proof, merkleTreeRoot_2, leaf);
        else 
            return MerkleProof.verify(proof, merkleTreeRoot_3, leaf);
    }

    function presaleMint(uint256 amount, uint256 lvl, bytes32[] memory proof) public payable emergencyPause isPresale {
        uint256 estimatedAmount = balanceOf(msg.sender).add(amount);
        require(estimatedAmount <= presaleMaxMint, "TrillioHeirs: You have already minted max NFTs or you are going to mint too many NFTs now");
        require(_verifyWhitelist(proof, lvl), "TrillioHeirs: Only whitelisted wallet can attend in presale");
        require(_getPresoldAmount() < maxMint_presale, "TrillioHeirs: In presale, Only 3000 NFTs can be mint");
        require(_getRemainingForLvl(lvl) >= amount, "TrillioHeirs: Mint amount can not be greater than remaining NFT amount in each level");
        require(msg.value == _getPresaleCost(amount), "TrillioHeirs: Msg.value is less than the real value");
        if (lvl == 1) {
            for(uint256 i = 1 ; i <= amount ; i++)
                _safeMint(msg.sender, mintedAmount_1 + i);
            mintedAmount_1 += amount;
        } else if (lvl == 2) {
            for(uint256 i = 1 ; i <= amount ; i++)
                _safeMint(msg.sender, (mintedAmount_2 + maxMint_1 + i));
            mintedAmount_2 += amount;
        } else {
            for(uint256 i = 1 ; i <= amount ; i++)
                _safeMint(msg.sender, (mintedAmount_3 + maxMint_1 + maxMint_2 + i));
            mintedAmount_3 += amount;
        }
        presaleAttenders[msg.sender] = true;
    }

    function _getRandomLevel() private view returns(uint256) {
        uint256 remain = _getRemainingForLvl(1).add(_getRemainingForLvl(2)).add(_getRemainingForLvl(3)).sub(_getRemainingOwnerMintAmount());
        require(remain >= 1, "TrillioHeirs: Remaining NFT is not enough");
        uint256 random = uint256(keccak256(abi.encodePacked(block.difficulty, block.timestamp, msg.sender, mintedAmount_1, mintedAmount_2, mintedAmount_3)));
        uint256 lvl = random.mod(3).add(1);
        uint256 count = 0;
        while (_getRemainingForLvl(lvl) < 1) {
            lvl = lvl.mod(3).add(1);
            if (count == 2)
                return 0;
            count++;
        }
        return lvl;
    }

    function _getPublicsaleCost(uint256 amount) private view returns(uint256) {
        return amount.mul(publicsalePrice);
    }

    function publicsaleMint(uint256 amount) public payable emergencyPause isPublicsale {
        uint256 estimatedAmount = balanceOf(msg.sender).add(amount);
        if(presaleAttenders[msg.sender])
            require(estimatedAmount <= (publicsaleMaxMint + presaleMaxMint), "TrillioHeirs: You have already minted max NFTs or you are going to mint too many NFTs now");
        else
            require(estimatedAmount <= publicsaleMaxMint, "TrillioHeirs: You have already minted max NFTs or you are going to mint too many NFTs now");
        require(msg.value == _getPublicsaleCost(amount), "TrillioHeirs: Msg.value is not enough");
        for (uint256 i = 1; i <= amount ; i++) {
            uint256 randomLvl = _getRandomLevel();
            require(randomLvl > 0, "TrillioHeirs: Amount of remaining NFT for each level is not enough");

            if (randomLvl == 1) {
                _safeMint(msg.sender, mintedAmount_1 + 1);
                mintedAmount_1 += 1;
            } else if (randomLvl == 2) {
                _safeMint(msg.sender, (mintedAmount_2 + maxMint_1 + 1));
                mintedAmount_2 += 1;
            } else {
                _safeMint(msg.sender, (mintedAmount_3 + maxMint_1 + maxMint_2 + 1));
                mintedAmount_3 += 1;
            }
        }
    }

    function specialMint(uint256 amount) public emergencyPause isPublicsale {
        uint256 estimatedAmount = balanceOf(msg.sender).add(amount);
        uint256 remain = _getRemainingForLvl(1).add(_getRemainingForLvl(2)).add(_getRemainingForLvl(3));
        require(amount <= remain, "TrilloHeirs: Remaining NFT is not enough");
        uint256 maxMintAmount = specialListInfo[msg.sender].maxMintAmount;
        if(presaleAttenders[msg.sender])
            require(estimatedAmount <= (maxMintAmount + presaleMaxMint), "Trillioheirs: Amount can not be greater than max mint amount");
        else
            require(estimatedAmount <= maxMintAmount, "Trillioheirs: Amount can not be greater than max mint amount");
        uint256 lvl = specialListInfo[msg.sender].level;
        require(amount <= _getRemainingForLvl(lvl), "Trillioheirs: Remaining NFT for level is not enough");

        if (lvl == 1) {
            for(uint256 i = 1 ; i <= amount ; i++)
                _safeMint(msg.sender, mintedAmount_1 + i);
            mintedAmount_1 += amount;
        } else if (lvl == 2) {
            for(uint256 i = 1 ; i <= amount ; i++)
                _safeMint(msg.sender, (mintedAmount_2 + maxMint_1 + i));
            mintedAmount_2 += amount;
        } else {
            for(uint256 i = 1 ; i <= amount ; i++)
                _safeMint(msg.sender, (mintedAmount_3 + maxMint_1 + maxMint_2 + i));
            mintedAmount_3 += amount;
        }
    }

    function _getRemainingOwnerMintAmount() private view returns(uint256) {
        return (ownerMintTotal.sub(maxMint_4)).sub(ownerMint_1.add(ownerMint_2).add(ownerMint_3));
    }

    function ownerLvl4Mint() public onlyOwner {
        uint256 remaining = maxMint_4.sub(mintedAmount_4);
        require(remaining > 0, "TrillioHeirs: level 4 already minted");
        for(uint256 i = 1 ; i <= remaining ; i++)
            _safeMint(msg.sender, (mintedAmount_4 + maxMint_1 + maxMint_2 + maxMint_3 + i));
        mintedAmount_4 += remaining;
        ownerMint_4 += remaining;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseUrl","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"levels","type":"uint256[]"},{"internalType":"uint256[]","name":"maxMintCounts","type":"uint256[]"}],"name":"addToSpecialList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint_2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint_3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint_4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint_presale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmount_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmount_2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmount_3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmount_4","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerLvl4Mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerMintTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsaleMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicsaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicsalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root_","type":"bytes32"},{"internalType":"uint256","name":"lvl","type":"uint256"}],"name":"setMerkleTree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"s_","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"s_","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"specialMint","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600660146101000a81548160ff0219169083151502179055506001600660156101000a81548160ff021916908315150217905550600060085560006009556000600a556000600b55610bb8600c55611b58600d556105dc600e55610172600f556012601055670214e8348c4f000060115567027f7d0bdb920000601255600a601355600560145560ce6019556000601a556000601b556000601c556000601d55348015620000b357600080fd5b50604051620060e7380380620060e78339818101604052810190620000d9919062000539565b82828160009080519060200190620000f3929190620002ec565b5080600190805190602001906200010c929190620002ec565b5050506200012f620001236200014960201b60201c565b6200015160201b60201c565b62000140816200021760201b60201c565b505050620006da565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002276200014960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200024d620002c260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029d9062000653565b60405180910390fd5b8060079080519060200190620002be929190620002ec565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002fa90620006a4565b90600052602060002090601f0160209004810192826200031e57600085556200036a565b82601f106200033957805160ff19168380011785556200036a565b828001600101855582156200036a579182015b82811115620003695782518255916020019190600101906200034c565b5b5090506200037991906200037d565b5090565b5b80821115620003985760008160009055506001016200037e565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200040582620003ba565b810181811067ffffffffffffffff82111715620004275762000426620003cb565b5b80604052505050565b60006200043c6200039c565b90506200044a8282620003fa565b919050565b600067ffffffffffffffff8211156200046d576200046c620003cb565b5b6200047882620003ba565b9050602081019050919050565b60005b83811015620004a557808201518184015260208101905062000488565b83811115620004b5576000848401525b50505050565b6000620004d2620004cc846200044f565b62000430565b905082815260208101848484011115620004f157620004f0620003b5565b5b620004fe84828562000485565b509392505050565b600082601f8301126200051e576200051d620003b0565b5b815162000530848260208601620004bb565b91505092915050565b600080600060608486031215620005555762000554620003a6565b5b600084015167ffffffffffffffff811115620005765762000575620003ab565b5b620005848682870162000506565b935050602084015167ffffffffffffffff811115620005a857620005a7620003ab565b5b620005b68682870162000506565b925050604084015167ffffffffffffffff811115620005da57620005d9620003ab565b5b620005e88682870162000506565b9150509250925092565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200063b602083620005f2565b9150620006488262000603565b602082019050919050565b600060208201905081810360008301526200066e816200062c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620006bd57607f821691505b60208210811415620006d457620006d362000675565b5b50919050565b6159fd80620006ea6000396000f3fe60806040526004361061025f5760003560e01c8063715018a611610144578063b88d4fde116100b6578063ce5c623b1161007a578063ce5c623b146108a0578063d0fab318146108cb578063e985e9c5146108e2578063f2fde38b1461091f578063fc33efa714610948578063fdea8e0b1461097357610266565b8063b88d4fde146107bb578063bdf8850a146107e4578063c54e73e31461080f578063c87b56dd14610838578063c898d91a1461087557610266565b8063922fd46811610108578063922fd468146106bd578063946ef42a146106e857806395d89b41146107135780639c52560a1461073e578063a22cb46514610769578063adcb719b1461079257610266565b8063715018a61461060e578063743d39c5146106255780637eff4b6714610650578063853828b61461067b5780638da5cb5b1461069257610266565b806333fdc427116101dd5780635c975abb116101a15780635c975abb146104ea5780636209c789146105155780636301c83c1461053e5780636352211e146105695780636c0360eb146105a657806370a08231146105d157610266565b806333fdc4271461041957806342842e0e1461044457806352ce46281461046d57806355f804b31461049857806357510492146104c157610266565b8063095ea7b311610224578063095ea7b31461036657806316c38b3c1461038f5780631b59169d146103b85780631ee81293146103d457806323b872dd146103f057610266565b80620e7fa81461026b57806301ffc9a714610296578063058af3a3146102d357806306fdde03146102fe578063081812fc1461032957610266565b3661026657005b600080fd5b34801561027757600080fd5b5061028061099e565b60405161028d91906137cc565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190613853565b6109a4565b6040516102ca919061389b565b60405180910390f35b3480156102df57600080fd5b506102e8610a86565b6040516102f591906137cc565b60405180910390f35b34801561030a57600080fd5b50610313610a8c565b604051610320919061394f565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b919061399d565b610b1e565b60405161035d9190613a0b565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613a52565b610ba3565b005b34801561039b57600080fd5b506103b660048036038101906103b19190613abe565b610cbb565b005b6103d260048036038101906103cd9190613c69565b610d54565b005b6103ee60048036038101906103e9919061399d565b6110e3565b005b3480156103fc57600080fd5b5061041760048036038101906104129190613cd8565b6113f6565b005b34801561042557600080fd5b5061042e611456565b60405161043b91906137cc565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613cd8565b61145c565b005b34801561047957600080fd5b5061048261147c565b60405161048f91906137cc565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba9190613de0565b611482565b005b3480156104cd57600080fd5b506104e860048036038101906104e3919061399d565b611518565b005b3480156104f657600080fd5b506104ff61192e565b60405161050c919061389b565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190613faf565b611941565b005b34801561054a57600080fd5b50610553611b75565b60405161056091906137cc565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b919061399d565b611b7b565b60405161059d9190613a0b565b60405180910390f35b3480156105b257600080fd5b506105bb611c2d565b6040516105c8919061394f565b60405180910390f35b3480156105dd57600080fd5b506105f860048036038101906105f39190614056565b611cbb565b60405161060591906137cc565b60405180910390f35b34801561061a57600080fd5b50610623611d73565b005b34801561063157600080fd5b5061063a611dfb565b60405161064791906137cc565b60405180910390f35b34801561065c57600080fd5b50610665611e01565b60405161067291906137cc565b60405180910390f35b34801561068757600080fd5b50610690611e07565b005b34801561069e57600080fd5b506106a7611ed9565b6040516106b49190613a0b565b60405180910390f35b3480156106c957600080fd5b506106d2611f03565b6040516106df91906137cc565b60405180910390f35b3480156106f457600080fd5b506106fd611f09565b60405161070a91906137cc565b60405180910390f35b34801561071f57600080fd5b50610728611f0f565b604051610735919061394f565b60405180910390f35b34801561074a57600080fd5b50610753611fa1565b60405161076091906137cc565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190614083565b611fa7565b005b34801561079e57600080fd5b506107b960048036038101906107b491906140c3565b611fbd565b005b3480156107c757600080fd5b506107e260048036038101906107dd91906141a4565b612070565b005b3480156107f057600080fd5b506107f96120d2565b60405161080691906137cc565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190613abe565b6120d8565b005b34801561084457600080fd5b5061085f600480360381019061085a919061399d565b6121c7565b60405161086c919061394f565b60405180910390f35b34801561088157600080fd5b5061088a61226e565b60405161089791906137cc565b60405180910390f35b3480156108ac57600080fd5b506108b5612274565b6040516108c291906137cc565b60405180910390f35b3480156108d757600080fd5b506108e061227a565b005b3480156108ee57600080fd5b5061090960048036038101906109049190614227565b6123e9565b604051610916919061389b565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190614056565b61247d565b005b34801561095457600080fd5b5061095d612575565b60405161096a91906137cc565b60405180910390f35b34801561097f57600080fd5b5061098861257b565b604051610995919061389b565b60405180910390f35b60115481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7f5750610a7e8261258e565b5b9050919050565b600d5481565b606060008054610a9b90614296565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac790614296565b8015610b145780601f10610ae957610100808354040283529160200191610b14565b820191906000526020600020905b815481529060010190602001808311610af757829003601f168201915b5050505050905090565b6000610b29826125f8565b610b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5f9061433a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bae82611b7b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906143cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3e612664565b73ffffffffffffffffffffffffffffffffffffffff161480610c6d5750610c6c81610c67612664565b6123e9565b5b610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca39061445e565b60405180910390fd5b610cb6838361266c565b505050565b610cc3612664565b73ffffffffffffffffffffffffffffffffffffffff16610ce1611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e906144ca565b60405180910390fd5b80600660146101000a81548160ff02191690831515021790555050565b600660149054906101000a900460ff1615610d6e57600080fd5b600660159054906101000a900460ff16610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db490614536565b60405180910390fd5b6000610dda84610dcc33611cbb565b61272590919063ffffffff16565b9050601354811115610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e18906145ee565b60405180910390fd5b610e2b828461273b565b610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6190614680565b60405180910390fd5b600c54610e756127ba565b10610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90614712565b60405180910390fd5b83610ebf846127de565b1015610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef7906147ca565b60405180910390fd5b610f098461284a565b3414610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f419061485c565b60405180910390fd5b6001831415610faa576000600190505b848111610f8b57610f783382600854610f7391906148ab565b612868565b8080610f8390614901565b915050610f5a565b508360086000828254610f9e91906148ab565b92505081905550611085565b6002831415611017576000600190505b848111610ff857610fe53382600d54600954610fd691906148ab565b610fe091906148ab565b612868565b8080610ff090614901565b915050610fba565b50836009600082825461100b91906148ab565b92505081905550611084565b6000600190505b848111611069576110563382600e54600d54600a5461103d91906148ab565b61104791906148ab565b61105191906148ab565b612868565b808061106190614901565b91505061101e565b5083600a600082825461107c91906148ab565b925050819055505b5b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b600660149054906101000a900460ff16156110fd57600080fd5b600660159054906101000a900460ff161561114d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611144906149bc565b60405180910390fd5b600061116a8261115c33611cbb565b61272590919063ffffffff16565b9050601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611215576013546014546111ce91906148ab565b811115611210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611207906145ee565b60405180910390fd5b61125b565b60145481111561125a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611251906145ee565b60405180910390fd5b5b61126482612886565b34146112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90614a4e565b60405180910390fd5b6000600190505b8281116113f15760006112bd6128a4565b905060008111611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f990614b06565b60405180910390fd5b60018114156113425761132333600160085461131e91906148ab565b612868565b60016008600082825461133691906148ab565b925050819055506113dd565b600281141561138f57611370336001600d5460095461136191906148ab565b61136b91906148ab565b612868565b60016009600082825461138391906148ab565b925050819055506113dc565b6113c1336001600e54600d54600a546113a891906148ab565b6113b291906148ab565b6113bc91906148ab565b612868565b6001600a60008282546113d491906148ab565b925050819055505b5b5080806113e990614901565b9150506112ac565b505050565b611407611401612664565b82612a20565b611446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143d90614b98565b60405180910390fd5b611451838383612afe565b505050565b60145481565b61147783838360405180602001604052806000815250612070565b505050565b600e5481565b61148a612664565b73ffffffffffffffffffffffffffffffffffffffff166114a8611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906144ca565b60405180910390fd5b8060079080519060200190611514929190613710565b5050565b600660149054906101000a900460ff161561153257600080fd5b600660159054906101000a900460ff1615611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906149bc565b60405180910390fd5b600061159f8261159133611cbb565b61272590919063ffffffff16565b905060006115e36115b060036127de565b6115d56115bd60026127de565b6115c760016127de565b61272590919063ffffffff16565b61272590919063ffffffff16565b905080831115611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90614c2a565b60405180910390fd5b6000601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561171657601354816116cf91906148ab565b831115611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170890614cbc565b60405180910390fd5b61175a565b80831115611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090614cbc565b60405180910390fd5b5b6000601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506117aa816127de565b8511156117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e390614d4e565b60405180910390fd5b600181141561184c576000600190505b85811161182d5761181a338260085461181591906148ab565b612868565b808061182590614901565b9150506117fc565b50846008600082825461184091906148ab565b92505081905550611927565b60028114156118b9576000600190505b85811161189a576118873382600d5460095461187891906148ab565b61188291906148ab565b612868565b808061189290614901565b91505061185c565b5084600960008282546118ad91906148ab565b92505081905550611926565b6000600190505b85811161190b576118f83382600e54600d54600a546118df91906148ab565b6118e991906148ab565b6118f391906148ab565b612868565b808061190390614901565b9150506118c0565b5084600a600082825461191e91906148ab565b925050819055505b5b5050505050565b600660149054906101000a900460ff1681565b611949612664565b73ffffffffffffffffffffffffffffffffffffffff16611967611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906144ca565b60405180910390fd5b815183511480156119cf575080518251145b611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590614de0565b60405180910390fd5b60005b8351811015611b6f576000838281518110611a2f57611a2e614e00565b5b6020026020010151118015611a5e57506004838281518110611a5457611a53614e00565b5b6020026020010151105b611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490614ec7565b60405180910390fd5b60006040518060400160405280858481518110611abd57611abc614e00565b5b60200260200101518152602001848481518110611add57611adc614e00565b5b6020026020010151815250905080601e6000878581518110611b0257611b01614e00565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155905050508080611b6790614901565b915050611a11565b50505050565b600b5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b90614f59565b60405180910390fd5b80915050919050565b60078054611c3a90614296565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614296565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614feb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d7b612664565b73ffffffffffffffffffffffffffffffffffffffff16611d99611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de6906144ca565b60405180910390fd5b611df96000612d65565b565b60105481565b60125481565b611e0f612664565b73ffffffffffffffffffffffffffffffffffffffff16611e2d611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a906144ca565b60405180910390fd5b6000479050611e90611ed9565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611ed5573d6000803e3d6000fd5b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b60135481565b606060018054611f1e90614296565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4a90614296565b8015611f975780601f10611f6c57610100808354040283529160200191611f97565b820191906000526020600020905b815481529060010190602001808311611f7a57829003601f168201915b5050505050905090565b600c5481565b611fb9611fb2612664565b8383612e2b565b5050565b611fc5612664565b73ffffffffffffffffffffffffffffffffffffffff16611fe3611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612039576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612030906144ca565b60405180910390fd5b600181141561204e578160158190555061206c565b6002811415612063578160168190555061206b565b816017819055505b5b5050565b61208161207b612664565b83612a20565b6120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790614b98565b60405180910390fd5b6120cc84848484612f98565b50505050565b60095481565b6120e0612664565b73ffffffffffffffffffffffffffffffffffffffff166120fe611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b906144ca565b60405180910390fd5b60011515600660159054906101000a900460ff161515146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a19061507d565b60405180910390fd5b80600660156101000a81548160ff02191690831515021790555050565b60606121d2826125f8565b612211576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122089061510f565b60405180910390fd5b600061221b612ff4565b9050600081511161223b5760405180602001604052806000815250612266565b8061224584613086565b60405160200161225692919061516b565b6040516020818303038152906040525b915050919050565b600f5481565b60195481565b612282612664565b73ffffffffffffffffffffffffffffffffffffffff166122a0611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146122f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ed906144ca565b60405180910390fd5b600061230f600b546010546131e790919063ffffffff16565b905060008111612354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234b90615201565b60405180910390fd5b6000600190505b8181116123b3576123a03382600f54600e54600d54600b5461237d91906148ab565b61238791906148ab565b61239191906148ab565b61239b91906148ab565b612868565b80806123ab90614901565b91505061235b565b5080600b60008282546123c691906148ab565b9250508190555080601d60008282546123df91906148ab565b9250508190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612485612664565b73ffffffffffffffffffffffffffffffffffffffff166124a3611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f0906144ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256090615293565b60405180910390fd5b61257281612d65565b50565b60085481565b600660159054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126df83611b7b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818361273391906148ab565b905092915050565b6000803360405160200161274f91906152fb565b60405160208183030381529060405280519060200120905060018314156127855761277d84601554836131fd565b9150506127b4565b60028314156127a35761279b84601654836131fd565b9150506127b4565b6127b084601754836131fd565b9150505b92915050565b6000600a546009546008546127cf91906148ab565b6127d991906148ab565b905090565b6000600182141561280057600854600d546127f99190615316565b9050612845565b600282141561282057600954600e546128199190615316565b9050612845565b600382141561284057600a54600f546128399190615316565b9050612845565b600090505b919050565b60006128618260115461321490919063ffffffff16565b9050919050565b61288282826040518060200160405280600081525061322a565b5050565b600061289d6012548361321490919063ffffffff16565b9050919050565b6000806129006128b2613285565b6128f26128bf60036127de565b6128e46128cc60026127de565b6128d660016127de565b61272590919063ffffffff16565b61272590919063ffffffff16565b6131e790919063ffffffff16565b90506001811015612946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293d906153bc565b60405180910390fd5b6000444233600854600954600a54604051602001612969969594939291906153fd565b6040516020818303038152906040528051906020012060001c905060006129ad600161299f6003856132df90919063ffffffff16565b61272590919063ffffffff16565b905060005b60016129bd836127de565b1015612a15576129ea60016129dc6003856132df90919063ffffffff16565b61272590919063ffffffff16565b91506002811415612a02576000945050505050612a1d565b8080612a0d90614901565b9150506129b2565b819450505050505b90565b6000612a2b826125f8565b612a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a61906154df565b60405180910390fd5b6000612a7583611b7b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ae457508373ffffffffffffffffffffffffffffffffffffffff16612acc84610b1e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612af55750612af481856123e9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b1e82611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90615571565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdb90615603565b60405180910390fd5b612bef8383836132f5565b612bfa60008261266c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c4a9190615316565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca191906148ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d608383836132fa565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e919061566f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f8b919061389b565b60405180910390a3505050565b612fa3848484612afe565b612faf848484846132ff565b612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590615701565b60405180910390fd5b50505050565b60606007805461300390614296565b80601f016020809104026020016040519081016040528092919081815260200182805461302f90614296565b801561307c5780601f106130515761010080835404028352916020019161307c565b820191906000526020600020905b81548152906001019060200180831161305f57829003601f168201915b5050505050905090565b606060008214156130ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131e2565b600082905060005b600082146131005780806130e990614901565b915050600a826130f99190615750565b91506130d6565b60008167ffffffffffffffff81111561311c5761311b613af0565b5b6040519080825280601f01601f19166020018201604052801561314e5781602001600182028036833780820191505090505b5090505b600085146131db576001826131679190615316565b9150600a856131769190615781565b603061318291906148ab565b60f81b81838151811061319857613197614e00565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131d49190615750565b9450613152565b8093505050505b919050565b600081836131f59190615316565b905092915050565b60008261320a8584613487565b1490509392505050565b6000818361322291906157b2565b905092915050565b61323483836134fc565b61324160008484846132ff565b613280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327790615701565b60405180910390fd5b505050565b60006132da6132b5601c546132a7601b54601a5461272590919063ffffffff16565b61272590919063ffffffff16565b6132cc6010546019546131e790919063ffffffff16565b6131e790919063ffffffff16565b905090565b600081836132ed9190615781565b905092915050565b505050565b505050565b60006133208473ffffffffffffffffffffffffffffffffffffffff166136d6565b1561347a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613349612664565b8786866040518563ffffffff1660e01b815260040161336b9493929190615861565b6020604051808303816000875af19250505080156133a757506040513d601f19601f820116820180604052508101906133a491906158c2565b60015b61342a573d80600081146133d7576040519150601f19603f3d011682016040523d82523d6000602084013e6133dc565b606091505b50600081511415613422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341990615701565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061347f565b600190505b949350505050565b60008082905060005b84518110156134f15760008582815181106134ae576134ad614e00565b5b602002602001015190508083116134d0576134c983826136f9565b92506134dd565b6134da81846136f9565b92505b5080806134e990614901565b915050613490565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561356c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135639061593b565b60405180910390fd5b613575816125f8565b156135b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ac906159a7565b60405180910390fd5b6135c1600083836132f5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461361191906148ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136d2600083836132fa565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b82805461371c90614296565b90600052602060002090601f01602090048101928261373e5760008555613785565b82601f1061375757805160ff1916838001178555613785565b82800160010185558215613785579182015b82811115613784578251825591602001919060010190613769565b5b5090506137929190613796565b5090565b5b808211156137af576000816000905550600101613797565b5090565b6000819050919050565b6137c6816137b3565b82525050565b60006020820190506137e160008301846137bd565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613830816137fb565b811461383b57600080fd5b50565b60008135905061384d81613827565b92915050565b600060208284031215613869576138686137f1565b5b60006138778482850161383e565b91505092915050565b60008115159050919050565b61389581613880565b82525050565b60006020820190506138b0600083018461388c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138f05780820151818401526020810190506138d5565b838111156138ff576000848401525b50505050565b6000601f19601f8301169050919050565b6000613921826138b6565b61392b81856138c1565b935061393b8185602086016138d2565b61394481613905565b840191505092915050565b600060208201905081810360008301526139698184613916565b905092915050565b61397a816137b3565b811461398557600080fd5b50565b60008135905061399781613971565b92915050565b6000602082840312156139b3576139b26137f1565b5b60006139c184828501613988565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139f5826139ca565b9050919050565b613a05816139ea565b82525050565b6000602082019050613a2060008301846139fc565b92915050565b613a2f816139ea565b8114613a3a57600080fd5b50565b600081359050613a4c81613a26565b92915050565b60008060408385031215613a6957613a686137f1565b5b6000613a7785828601613a3d565b9250506020613a8885828601613988565b9150509250929050565b613a9b81613880565b8114613aa657600080fd5b50565b600081359050613ab881613a92565b92915050565b600060208284031215613ad457613ad36137f1565b5b6000613ae284828501613aa9565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b2882613905565b810181811067ffffffffffffffff82111715613b4757613b46613af0565b5b80604052505050565b6000613b5a6137e7565b9050613b668282613b1f565b919050565b600067ffffffffffffffff821115613b8657613b85613af0565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613baf81613b9c565b8114613bba57600080fd5b50565b600081359050613bcc81613ba6565b92915050565b6000613be5613be084613b6b565b613b50565b90508083825260208201905060208402830185811115613c0857613c07613b97565b5b835b81811015613c315780613c1d8882613bbd565b845260208401935050602081019050613c0a565b5050509392505050565b600082601f830112613c5057613c4f613aeb565b5b8135613c60848260208601613bd2565b91505092915050565b600080600060608486031215613c8257613c816137f1565b5b6000613c9086828701613988565b9350506020613ca186828701613988565b925050604084013567ffffffffffffffff811115613cc257613cc16137f6565b5b613cce86828701613c3b565b9150509250925092565b600080600060608486031215613cf157613cf06137f1565b5b6000613cff86828701613a3d565b9350506020613d1086828701613a3d565b9250506040613d2186828701613988565b9150509250925092565b600080fd5b600067ffffffffffffffff821115613d4b57613d4a613af0565b5b613d5482613905565b9050602081019050919050565b82818337600083830152505050565b6000613d83613d7e84613d30565b613b50565b905082815260208101848484011115613d9f57613d9e613d2b565b5b613daa848285613d61565b509392505050565b600082601f830112613dc757613dc6613aeb565b5b8135613dd7848260208601613d70565b91505092915050565b600060208284031215613df657613df56137f1565b5b600082013567ffffffffffffffff811115613e1457613e136137f6565b5b613e2084828501613db2565b91505092915050565b600067ffffffffffffffff821115613e4457613e43613af0565b5b602082029050602081019050919050565b6000613e68613e6384613e29565b613b50565b90508083825260208201905060208402830185811115613e8b57613e8a613b97565b5b835b81811015613eb45780613ea08882613a3d565b845260208401935050602081019050613e8d565b5050509392505050565b600082601f830112613ed357613ed2613aeb565b5b8135613ee3848260208601613e55565b91505092915050565b600067ffffffffffffffff821115613f0757613f06613af0565b5b602082029050602081019050919050565b6000613f2b613f2684613eec565b613b50565b90508083825260208201905060208402830185811115613f4e57613f4d613b97565b5b835b81811015613f775780613f638882613988565b845260208401935050602081019050613f50565b5050509392505050565b600082601f830112613f9657613f95613aeb565b5b8135613fa6848260208601613f18565b91505092915050565b600080600060608486031215613fc857613fc76137f1565b5b600084013567ffffffffffffffff811115613fe657613fe56137f6565b5b613ff286828701613ebe565b935050602084013567ffffffffffffffff811115614013576140126137f6565b5b61401f86828701613f81565b925050604084013567ffffffffffffffff8111156140405761403f6137f6565b5b61404c86828701613f81565b9150509250925092565b60006020828403121561406c5761406b6137f1565b5b600061407a84828501613a3d565b91505092915050565b6000806040838503121561409a576140996137f1565b5b60006140a885828601613a3d565b92505060206140b985828601613aa9565b9150509250929050565b600080604083850312156140da576140d96137f1565b5b60006140e885828601613bbd565b92505060206140f985828601613988565b9150509250929050565b600067ffffffffffffffff82111561411e5761411d613af0565b5b61412782613905565b9050602081019050919050565b600061414761414284614103565b613b50565b90508281526020810184848401111561416357614162613d2b565b5b61416e848285613d61565b509392505050565b600082601f83011261418b5761418a613aeb565b5b813561419b848260208601614134565b91505092915050565b600080600080608085870312156141be576141bd6137f1565b5b60006141cc87828801613a3d565b94505060206141dd87828801613a3d565b93505060406141ee87828801613988565b925050606085013567ffffffffffffffff81111561420f5761420e6137f6565b5b61421b87828801614176565b91505092959194509250565b6000806040838503121561423e5761423d6137f1565b5b600061424c85828601613a3d565b925050602061425d85828601613a3d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142ae57607f821691505b602082108114156142c2576142c1614267565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614324602c836138c1565b915061432f826142c8565b604082019050919050565b6000602082019050818103600083015261435381614317565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006143b66021836138c1565b91506143c18261435a565b604082019050919050565b600060208201905081810360008301526143e5816143a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006144486038836138c1565b9150614453826143ec565b604082019050919050565b600060208201905081810360008301526144778161443b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144b46020836138c1565b91506144bf8261447e565b602082019050919050565b600060208201905081810360008301526144e3816144a7565b9050919050565b7f5472696c6c696f48656972733a2070726573616c652066696e69736865640000600082015250565b6000614520601e836138c1565b915061452b826144ea565b602082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b7f5472696c6c696f48656972733a20596f75206861766520616c7265616479206d60008201527f696e746564206d6178204e465473206f7220796f752061726520676f696e672060208201527f746f206d696e7420746f6f206d616e79204e465473206e6f7700000000000000604082015250565b60006145d86059836138c1565b91506145e382614556565b606082019050919050565b60006020820190508181036000830152614607816145cb565b9050919050565b7f5472696c6c696f48656972733a204f6e6c792077686974656c6973746564207760008201527f616c6c65742063616e20617474656e6420696e2070726573616c650000000000602082015250565b600061466a603b836138c1565b91506146758261460e565b604082019050919050565b600060208201905081810360008301526146998161465d565b9050919050565b7f5472696c6c696f48656972733a20496e2070726573616c652c204f6e6c79203360008201527f303030204e4654732063616e206265206d696e74000000000000000000000000602082015250565b60006146fc6034836138c1565b9150614707826146a0565b604082019050919050565b6000602082019050818103600083015261472b816146ef565b9050919050565b7f5472696c6c696f48656972733a204d696e7420616d6f756e742063616e206e6f60008201527f742062652067726561746572207468616e2072656d61696e696e67204e46542060208201527f616d6f756e7420696e2065616368206c6576656c000000000000000000000000604082015250565b60006147b46054836138c1565b91506147bf82614732565b606082019050919050565b600060208201905081810360008301526147e3816147a7565b9050919050565b7f5472696c6c696f48656972733a204d73672e76616c7565206973206c6573732060008201527f7468616e20746865207265616c2076616c756500000000000000000000000000602082015250565b60006148466033836138c1565b9150614851826147ea565b604082019050919050565b6000602082019050818103600083015261487581614839565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148b6826137b3565b91506148c1836137b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148f6576148f561487c565b5b828201905092915050565b600061490c826137b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561493f5761493e61487c565b5b600182019050919050565b7f5472696c6c696f48656972733a207075626c69632073616c65206e6f7420737460008201527f6172746564000000000000000000000000000000000000000000000000000000602082015250565b60006149a66025836138c1565b91506149b18261494a565b604082019050919050565b600060208201905081810360008301526149d581614999565b9050919050565b7f5472696c6c696f48656972733a204d73672e76616c7565206973206e6f74206560008201527f6e6f756768000000000000000000000000000000000000000000000000000000602082015250565b6000614a386025836138c1565b9150614a43826149dc565b604082019050919050565b60006020820190508181036000830152614a6781614a2b565b9050919050565b7f5472696c6c696f48656972733a20416d6f756e74206f662072656d61696e696e60008201527f67204e465420666f722065616368206c6576656c206973206e6f7420656e6f7560208201527f6768000000000000000000000000000000000000000000000000000000000000604082015250565b6000614af06042836138c1565b9150614afb82614a6e565b606082019050919050565b60006020820190508181036000830152614b1f81614ae3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614b826031836138c1565b9150614b8d82614b26565b604082019050919050565b60006020820190508181036000830152614bb181614b75565b9050919050565b7f5472696c6c6f48656972733a2052656d61696e696e67204e4654206973206e6f60008201527f7420656e6f756768000000000000000000000000000000000000000000000000602082015250565b6000614c146028836138c1565b9150614c1f82614bb8565b604082019050919050565b60006020820190508181036000830152614c4381614c07565b9050919050565b7f5472696c6c696f68656972733a20416d6f756e742063616e206e6f742062652060008201527f67726561746572207468616e206d6178206d696e7420616d6f756e7400000000602082015250565b6000614ca6603c836138c1565b9150614cb182614c4a565b604082019050919050565b60006020820190508181036000830152614cd581614c99565b9050919050565b7f5472696c6c696f68656972733a2052656d61696e696e67204e465420666f722060008201527f6c6576656c206973206e6f7420656e6f75676800000000000000000000000000602082015250565b6000614d386033836138c1565b9150614d4382614cdc565b604082019050919050565b60006020820190508181036000830152614d6781614d2b565b9050919050565b7f5472696c6c696f48656972733a2061727261797320686173206469666665726560008201527f6e74206c656e6774680000000000000000000000000000000000000000000000602082015250565b6000614dca6029836138c1565b9150614dd582614d6e565b604082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5472696c6c696f48656972733a20546865206c6576656c206f6620737065636960008201527f616c2077616c6c65742063616e206e6f7420626520677265617465722074686160208201527f6e20340000000000000000000000000000000000000000000000000000000000604082015250565b6000614eb16043836138c1565b9150614ebc82614e2f565b606082019050919050565b60006020820190508181036000830152614ee081614ea4565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614f436029836138c1565b9150614f4e82614ee7565b604082019050919050565b60006020820190508181036000830152614f7281614f36565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614fd5602a836138c1565b9150614fe082614f79565b604082019050919050565b6000602082019050818103600083015261500481614fc8565b9050919050565b7f5472696c6c696f48656972733a2070726573616c652063616e2062652073657460008201527f206f6e6c79206f6e636500000000000000000000000000000000000000000000602082015250565b6000615067602a836138c1565b91506150728261500b565b604082019050919050565b600060208201905081810360008301526150968161505a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006150f9602f836138c1565b91506151048261509d565b604082019050919050565b60006020820190508181036000830152615128816150ec565b9050919050565b600081905092915050565b6000615145826138b6565b61514f818561512f565b935061515f8185602086016138d2565b80840191505092915050565b6000615177828561513a565b9150615183828461513a565b91508190509392505050565b7f5472696c6c696f48656972733a206c6576656c203420616c7265616479206d6960008201527f6e74656400000000000000000000000000000000000000000000000000000000602082015250565b60006151eb6024836138c1565b91506151f68261518f565b604082019050919050565b6000602082019050818103600083015261521a816151de565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061527d6026836138c1565b915061528882615221565b604082019050919050565b600060208201905081810360008301526152ac81615270565b9050919050565b60008160601b9050919050565b60006152cb826152b3565b9050919050565b60006152dd826152c0565b9050919050565b6152f56152f0826139ea565b6152d2565b82525050565b600061530782846152e4565b60148201915081905092915050565b6000615321826137b3565b915061532c836137b3565b92508282101561533f5761533e61487c565b5b828203905092915050565b7f5472696c6c696f48656972733a2052656d61696e696e67204e4654206973206e60008201527f6f7420656e6f7567680000000000000000000000000000000000000000000000602082015250565b60006153a66029836138c1565b91506153b18261534a565b604082019050919050565b600060208201905081810360008301526153d581615399565b9050919050565b6000819050919050565b6153f76153f2826137b3565b6153dc565b82525050565b600061540982896153e6565b60208201915061541982886153e6565b60208201915061542982876152e4565b60148201915061543982866153e6565b60208201915061544982856153e6565b60208201915061545982846153e6565b602082019150819050979650505050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006154c9602c836138c1565b91506154d48261546d565b604082019050919050565b600060208201905081810360008301526154f8816154bc565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061555b6025836138c1565b9150615566826154ff565b604082019050919050565b6000602082019050818103600083015261558a8161554e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155ed6024836138c1565b91506155f882615591565b604082019050919050565b6000602082019050818103600083015261561c816155e0565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006156596019836138c1565b915061566482615623565b602082019050919050565b600060208201905081810360008301526156888161564c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006156eb6032836138c1565b91506156f68261568f565b604082019050919050565b6000602082019050818103600083015261571a816156de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061575b826137b3565b9150615766836137b3565b92508261577657615775615721565b5b828204905092915050565b600061578c826137b3565b9150615797836137b3565b9250826157a7576157a6615721565b5b828206905092915050565b60006157bd826137b3565b91506157c8836137b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158015761580061487c565b5b828202905092915050565b600081519050919050565b600082825260208201905092915050565b60006158338261580c565b61583d8185615817565b935061584d8185602086016138d2565b61585681613905565b840191505092915050565b600060808201905061587660008301876139fc565b61588360208301866139fc565b61589060408301856137bd565b81810360608301526158a28184615828565b905095945050505050565b6000815190506158bc81613827565b92915050565b6000602082840312156158d8576158d76137f1565b5b60006158e6848285016158ad565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159256020836138c1565b9150615930826158ef565b602082019050919050565b6000602082019050818103600083015261595481615918565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615991601c836138c1565b915061599c8261595b565b602082019050919050565b600060208201905081810360008301526159c081615984565b905091905056fea264697066735822122042e6883daa5f03a382449f35f7161a36a471485ac75b99e08bb405b71089de9764736f6c634300080c0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c5472696c6c696f4865697273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035452480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f676174657761792e697066732e696f2f697066732f516d567972317465646a4862365876325142775555656744785232453669514a614e54516e7a71795273636370352f0000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025f5760003560e01c8063715018a611610144578063b88d4fde116100b6578063ce5c623b1161007a578063ce5c623b146108a0578063d0fab318146108cb578063e985e9c5146108e2578063f2fde38b1461091f578063fc33efa714610948578063fdea8e0b1461097357610266565b8063b88d4fde146107bb578063bdf8850a146107e4578063c54e73e31461080f578063c87b56dd14610838578063c898d91a1461087557610266565b8063922fd46811610108578063922fd468146106bd578063946ef42a146106e857806395d89b41146107135780639c52560a1461073e578063a22cb46514610769578063adcb719b1461079257610266565b8063715018a61461060e578063743d39c5146106255780637eff4b6714610650578063853828b61461067b5780638da5cb5b1461069257610266565b806333fdc427116101dd5780635c975abb116101a15780635c975abb146104ea5780636209c789146105155780636301c83c1461053e5780636352211e146105695780636c0360eb146105a657806370a08231146105d157610266565b806333fdc4271461041957806342842e0e1461044457806352ce46281461046d57806355f804b31461049857806357510492146104c157610266565b8063095ea7b311610224578063095ea7b31461036657806316c38b3c1461038f5780631b59169d146103b85780631ee81293146103d457806323b872dd146103f057610266565b80620e7fa81461026b57806301ffc9a714610296578063058af3a3146102d357806306fdde03146102fe578063081812fc1461032957610266565b3661026657005b600080fd5b34801561027757600080fd5b5061028061099e565b60405161028d91906137cc565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190613853565b6109a4565b6040516102ca919061389b565b60405180910390f35b3480156102df57600080fd5b506102e8610a86565b6040516102f591906137cc565b60405180910390f35b34801561030a57600080fd5b50610313610a8c565b604051610320919061394f565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b919061399d565b610b1e565b60405161035d9190613a0b565b60405180910390f35b34801561037257600080fd5b5061038d60048036038101906103889190613a52565b610ba3565b005b34801561039b57600080fd5b506103b660048036038101906103b19190613abe565b610cbb565b005b6103d260048036038101906103cd9190613c69565b610d54565b005b6103ee60048036038101906103e9919061399d565b6110e3565b005b3480156103fc57600080fd5b5061041760048036038101906104129190613cd8565b6113f6565b005b34801561042557600080fd5b5061042e611456565b60405161043b91906137cc565b60405180910390f35b34801561045057600080fd5b5061046b60048036038101906104669190613cd8565b61145c565b005b34801561047957600080fd5b5061048261147c565b60405161048f91906137cc565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba9190613de0565b611482565b005b3480156104cd57600080fd5b506104e860048036038101906104e3919061399d565b611518565b005b3480156104f657600080fd5b506104ff61192e565b60405161050c919061389b565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190613faf565b611941565b005b34801561054a57600080fd5b50610553611b75565b60405161056091906137cc565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b919061399d565b611b7b565b60405161059d9190613a0b565b60405180910390f35b3480156105b257600080fd5b506105bb611c2d565b6040516105c8919061394f565b60405180910390f35b3480156105dd57600080fd5b506105f860048036038101906105f39190614056565b611cbb565b60405161060591906137cc565b60405180910390f35b34801561061a57600080fd5b50610623611d73565b005b34801561063157600080fd5b5061063a611dfb565b60405161064791906137cc565b60405180910390f35b34801561065c57600080fd5b50610665611e01565b60405161067291906137cc565b60405180910390f35b34801561068757600080fd5b50610690611e07565b005b34801561069e57600080fd5b506106a7611ed9565b6040516106b49190613a0b565b60405180910390f35b3480156106c957600080fd5b506106d2611f03565b6040516106df91906137cc565b60405180910390f35b3480156106f457600080fd5b506106fd611f09565b60405161070a91906137cc565b60405180910390f35b34801561071f57600080fd5b50610728611f0f565b604051610735919061394f565b60405180910390f35b34801561074a57600080fd5b50610753611fa1565b60405161076091906137cc565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190614083565b611fa7565b005b34801561079e57600080fd5b506107b960048036038101906107b491906140c3565b611fbd565b005b3480156107c757600080fd5b506107e260048036038101906107dd91906141a4565b612070565b005b3480156107f057600080fd5b506107f96120d2565b60405161080691906137cc565b60405180910390f35b34801561081b57600080fd5b5061083660048036038101906108319190613abe565b6120d8565b005b34801561084457600080fd5b5061085f600480360381019061085a919061399d565b6121c7565b60405161086c919061394f565b60405180910390f35b34801561088157600080fd5b5061088a61226e565b60405161089791906137cc565b60405180910390f35b3480156108ac57600080fd5b506108b5612274565b6040516108c291906137cc565b60405180910390f35b3480156108d757600080fd5b506108e061227a565b005b3480156108ee57600080fd5b5061090960048036038101906109049190614227565b6123e9565b604051610916919061389b565b60405180910390f35b34801561092b57600080fd5b5061094660048036038101906109419190614056565b61247d565b005b34801561095457600080fd5b5061095d612575565b60405161096a91906137cc565b60405180910390f35b34801561097f57600080fd5b5061098861257b565b604051610995919061389b565b60405180910390f35b60115481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a7f5750610a7e8261258e565b5b9050919050565b600d5481565b606060008054610a9b90614296565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac790614296565b8015610b145780601f10610ae957610100808354040283529160200191610b14565b820191906000526020600020905b815481529060010190602001808311610af757829003601f168201915b5050505050905090565b6000610b29826125f8565b610b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5f9061433a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bae82611b7b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c16906143cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3e612664565b73ffffffffffffffffffffffffffffffffffffffff161480610c6d5750610c6c81610c67612664565b6123e9565b5b610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca39061445e565b60405180910390fd5b610cb6838361266c565b505050565b610cc3612664565b73ffffffffffffffffffffffffffffffffffffffff16610ce1611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e906144ca565b60405180910390fd5b80600660146101000a81548160ff02191690831515021790555050565b600660149054906101000a900460ff1615610d6e57600080fd5b600660159054906101000a900460ff16610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db490614536565b60405180910390fd5b6000610dda84610dcc33611cbb565b61272590919063ffffffff16565b9050601354811115610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e18906145ee565b60405180910390fd5b610e2b828461273b565b610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6190614680565b60405180910390fd5b600c54610e756127ba565b10610eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eac90614712565b60405180910390fd5b83610ebf846127de565b1015610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef7906147ca565b60405180910390fd5b610f098461284a565b3414610f4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f419061485c565b60405180910390fd5b6001831415610faa576000600190505b848111610f8b57610f783382600854610f7391906148ab565b612868565b8080610f8390614901565b915050610f5a565b508360086000828254610f9e91906148ab565b92505081905550611085565b6002831415611017576000600190505b848111610ff857610fe53382600d54600954610fd691906148ab565b610fe091906148ab565b612868565b8080610ff090614901565b915050610fba565b50836009600082825461100b91906148ab565b92505081905550611084565b6000600190505b848111611069576110563382600e54600d54600a5461103d91906148ab565b61104791906148ab565b61105191906148ab565b612868565b808061106190614901565b91505061101e565b5083600a600082825461107c91906148ab565b925050819055505b5b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505050565b600660149054906101000a900460ff16156110fd57600080fd5b600660159054906101000a900460ff161561114d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611144906149bc565b60405180910390fd5b600061116a8261115c33611cbb565b61272590919063ffffffff16565b9050601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611215576013546014546111ce91906148ab565b811115611210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611207906145ee565b60405180910390fd5b61125b565b60145481111561125a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611251906145ee565b60405180910390fd5b5b61126482612886565b34146112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90614a4e565b60405180910390fd5b6000600190505b8281116113f15760006112bd6128a4565b905060008111611302576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f990614b06565b60405180910390fd5b60018114156113425761132333600160085461131e91906148ab565b612868565b60016008600082825461133691906148ab565b925050819055506113dd565b600281141561138f57611370336001600d5460095461136191906148ab565b61136b91906148ab565b612868565b60016009600082825461138391906148ab565b925050819055506113dc565b6113c1336001600e54600d54600a546113a891906148ab565b6113b291906148ab565b6113bc91906148ab565b612868565b6001600a60008282546113d491906148ab565b925050819055505b5b5080806113e990614901565b9150506112ac565b505050565b611407611401612664565b82612a20565b611446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143d90614b98565b60405180910390fd5b611451838383612afe565b505050565b60145481565b61147783838360405180602001604052806000815250612070565b505050565b600e5481565b61148a612664565b73ffffffffffffffffffffffffffffffffffffffff166114a8611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906144ca565b60405180910390fd5b8060079080519060200190611514929190613710565b5050565b600660149054906101000a900460ff161561153257600080fd5b600660159054906101000a900460ff1615611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906149bc565b60405180910390fd5b600061159f8261159133611cbb565b61272590919063ffffffff16565b905060006115e36115b060036127de565b6115d56115bd60026127de565b6115c760016127de565b61272590919063ffffffff16565b61272590919063ffffffff16565b905080831115611628576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161f90614c2a565b60405180910390fd5b6000601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561171657601354816116cf91906148ab565b831115611711576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170890614cbc565b60405180910390fd5b61175a565b80831115611759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175090614cbc565b60405180910390fd5b5b6000601e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506117aa816127de565b8511156117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e390614d4e565b60405180910390fd5b600181141561184c576000600190505b85811161182d5761181a338260085461181591906148ab565b612868565b808061182590614901565b9150506117fc565b50846008600082825461184091906148ab565b92505081905550611927565b60028114156118b9576000600190505b85811161189a576118873382600d5460095461187891906148ab565b61188291906148ab565b612868565b808061189290614901565b91505061185c565b5084600960008282546118ad91906148ab565b92505081905550611926565b6000600190505b85811161190b576118f83382600e54600d54600a546118df91906148ab565b6118e991906148ab565b6118f391906148ab565b612868565b808061190390614901565b9150506118c0565b5084600a600082825461191e91906148ab565b925050819055505b5b5050505050565b600660149054906101000a900460ff1681565b611949612664565b73ffffffffffffffffffffffffffffffffffffffff16611967611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b4906144ca565b60405180910390fd5b815183511480156119cf575080518251145b611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0590614de0565b60405180910390fd5b60005b8351811015611b6f576000838281518110611a2f57611a2e614e00565b5b6020026020010151118015611a5e57506004838281518110611a5457611a53614e00565b5b6020026020010151105b611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490614ec7565b60405180910390fd5b60006040518060400160405280858481518110611abd57611abc614e00565b5b60200260200101518152602001848481518110611add57611adc614e00565b5b6020026020010151815250905080601e6000878581518110611b0257611b01614e00565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155905050508080611b6790614901565b915050611a11565b50505050565b600b5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b90614f59565b60405180910390fd5b80915050919050565b60078054611c3a90614296565b80601f0160208091040260200160405190810160405280929190818152602001828054611c6690614296565b8015611cb35780601f10611c8857610100808354040283529160200191611cb3565b820191906000526020600020905b815481529060010190602001808311611c9657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614feb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611d7b612664565b73ffffffffffffffffffffffffffffffffffffffff16611d99611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de6906144ca565b60405180910390fd5b611df96000612d65565b565b60105481565b60125481565b611e0f612664565b73ffffffffffffffffffffffffffffffffffffffff16611e2d611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a906144ca565b60405180910390fd5b6000479050611e90611ed9565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611ed5573d6000803e3d6000fd5b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a5481565b60135481565b606060018054611f1e90614296565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4a90614296565b8015611f975780601f10611f6c57610100808354040283529160200191611f97565b820191906000526020600020905b815481529060010190602001808311611f7a57829003601f168201915b5050505050905090565b600c5481565b611fb9611fb2612664565b8383612e2b565b5050565b611fc5612664565b73ffffffffffffffffffffffffffffffffffffffff16611fe3611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612039576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612030906144ca565b60405180910390fd5b600181141561204e578160158190555061206c565b6002811415612063578160168190555061206b565b816017819055505b5b5050565b61208161207b612664565b83612a20565b6120c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b790614b98565b60405180910390fd5b6120cc84848484612f98565b50505050565b60095481565b6120e0612664565b73ffffffffffffffffffffffffffffffffffffffff166120fe611ed9565b73ffffffffffffffffffffffffffffffffffffffff1614612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b906144ca565b60405180910390fd5b60011515600660159054906101000a900460ff161515146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a19061507d565b60405180910390fd5b80600660156101000a81548160ff02191690831515021790555050565b60606121d2826125f8565b612211576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122089061510f565b60405180910390fd5b600061221b612ff4565b9050600081511161223b5760405180602001604052806000815250612266565b8061224584613086565b60405160200161225692919061516b565b6040516020818303038152906040525b915050919050565b600f5481565b60195481565b612282612664565b73ffffffffffffffffffffffffffffffffffffffff166122a0611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146122f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ed906144ca565b60405180910390fd5b600061230f600b546010546131e790919063ffffffff16565b905060008111612354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234b90615201565b60405180910390fd5b6000600190505b8181116123b3576123a03382600f54600e54600d54600b5461237d91906148ab565b61238791906148ab565b61239191906148ab565b61239b91906148ab565b612868565b80806123ab90614901565b91505061235b565b5080600b60008282546123c691906148ab565b9250508190555080601d60008282546123df91906148ab565b9250508190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612485612664565b73ffffffffffffffffffffffffffffffffffffffff166124a3611ed9565b73ffffffffffffffffffffffffffffffffffffffff16146124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f0906144ca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256090615293565b60405180910390fd5b61257281612d65565b50565b60085481565b600660159054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126df83611b7b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818361273391906148ab565b905092915050565b6000803360405160200161274f91906152fb565b60405160208183030381529060405280519060200120905060018314156127855761277d84601554836131fd565b9150506127b4565b60028314156127a35761279b84601654836131fd565b9150506127b4565b6127b084601754836131fd565b9150505b92915050565b6000600a546009546008546127cf91906148ab565b6127d991906148ab565b905090565b6000600182141561280057600854600d546127f99190615316565b9050612845565b600282141561282057600954600e546128199190615316565b9050612845565b600382141561284057600a54600f546128399190615316565b9050612845565b600090505b919050565b60006128618260115461321490919063ffffffff16565b9050919050565b61288282826040518060200160405280600081525061322a565b5050565b600061289d6012548361321490919063ffffffff16565b9050919050565b6000806129006128b2613285565b6128f26128bf60036127de565b6128e46128cc60026127de565b6128d660016127de565b61272590919063ffffffff16565b61272590919063ffffffff16565b6131e790919063ffffffff16565b90506001811015612946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293d906153bc565b60405180910390fd5b6000444233600854600954600a54604051602001612969969594939291906153fd565b6040516020818303038152906040528051906020012060001c905060006129ad600161299f6003856132df90919063ffffffff16565b61272590919063ffffffff16565b905060005b60016129bd836127de565b1015612a15576129ea60016129dc6003856132df90919063ffffffff16565b61272590919063ffffffff16565b91506002811415612a02576000945050505050612a1d565b8080612a0d90614901565b9150506129b2565b819450505050505b90565b6000612a2b826125f8565b612a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a61906154df565b60405180910390fd5b6000612a7583611b7b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ae457508373ffffffffffffffffffffffffffffffffffffffff16612acc84610b1e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612af55750612af481856123e9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b1e82611b7b565b73ffffffffffffffffffffffffffffffffffffffff1614612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90615571565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bdb90615603565b60405180910390fd5b612bef8383836132f5565b612bfa60008261266c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c4a9190615316565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca191906148ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d608383836132fa565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e919061566f565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f8b919061389b565b60405180910390a3505050565b612fa3848484612afe565b612faf848484846132ff565b612fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fe590615701565b60405180910390fd5b50505050565b60606007805461300390614296565b80601f016020809104026020016040519081016040528092919081815260200182805461302f90614296565b801561307c5780601f106130515761010080835404028352916020019161307c565b820191906000526020600020905b81548152906001019060200180831161305f57829003601f168201915b5050505050905090565b606060008214156130ce576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506131e2565b600082905060005b600082146131005780806130e990614901565b915050600a826130f99190615750565b91506130d6565b60008167ffffffffffffffff81111561311c5761311b613af0565b5b6040519080825280601f01601f19166020018201604052801561314e5781602001600182028036833780820191505090505b5090505b600085146131db576001826131679190615316565b9150600a856131769190615781565b603061318291906148ab565b60f81b81838151811061319857613197614e00565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131d49190615750565b9450613152565b8093505050505b919050565b600081836131f59190615316565b905092915050565b60008261320a8584613487565b1490509392505050565b6000818361322291906157b2565b905092915050565b61323483836134fc565b61324160008484846132ff565b613280576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327790615701565b60405180910390fd5b505050565b60006132da6132b5601c546132a7601b54601a5461272590919063ffffffff16565b61272590919063ffffffff16565b6132cc6010546019546131e790919063ffffffff16565b6131e790919063ffffffff16565b905090565b600081836132ed9190615781565b905092915050565b505050565b505050565b60006133208473ffffffffffffffffffffffffffffffffffffffff166136d6565b1561347a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613349612664565b8786866040518563ffffffff1660e01b815260040161336b9493929190615861565b6020604051808303816000875af19250505080156133a757506040513d601f19601f820116820180604052508101906133a491906158c2565b60015b61342a573d80600081146133d7576040519150601f19603f3d011682016040523d82523d6000602084013e6133dc565b606091505b50600081511415613422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341990615701565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061347f565b600190505b949350505050565b60008082905060005b84518110156134f15760008582815181106134ae576134ad614e00565b5b602002602001015190508083116134d0576134c983826136f9565b92506134dd565b6134da81846136f9565b92505b5080806134e990614901565b915050613490565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561356c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135639061593b565b60405180910390fd5b613575816125f8565b156135b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ac906159a7565b60405180910390fd5b6135c1600083836132f5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461361191906148ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136d2600083836132fa565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b82805461371c90614296565b90600052602060002090601f01602090048101928261373e5760008555613785565b82601f1061375757805160ff1916838001178555613785565b82800160010185558215613785579182015b82811115613784578251825591602001919060010190613769565b5b5090506137929190613796565b5090565b5b808211156137af576000816000905550600101613797565b5090565b6000819050919050565b6137c6816137b3565b82525050565b60006020820190506137e160008301846137bd565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613830816137fb565b811461383b57600080fd5b50565b60008135905061384d81613827565b92915050565b600060208284031215613869576138686137f1565b5b60006138778482850161383e565b91505092915050565b60008115159050919050565b61389581613880565b82525050565b60006020820190506138b0600083018461388c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138f05780820151818401526020810190506138d5565b838111156138ff576000848401525b50505050565b6000601f19601f8301169050919050565b6000613921826138b6565b61392b81856138c1565b935061393b8185602086016138d2565b61394481613905565b840191505092915050565b600060208201905081810360008301526139698184613916565b905092915050565b61397a816137b3565b811461398557600080fd5b50565b60008135905061399781613971565b92915050565b6000602082840312156139b3576139b26137f1565b5b60006139c184828501613988565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139f5826139ca565b9050919050565b613a05816139ea565b82525050565b6000602082019050613a2060008301846139fc565b92915050565b613a2f816139ea565b8114613a3a57600080fd5b50565b600081359050613a4c81613a26565b92915050565b60008060408385031215613a6957613a686137f1565b5b6000613a7785828601613a3d565b9250506020613a8885828601613988565b9150509250929050565b613a9b81613880565b8114613aa657600080fd5b50565b600081359050613ab881613a92565b92915050565b600060208284031215613ad457613ad36137f1565b5b6000613ae284828501613aa9565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613b2882613905565b810181811067ffffffffffffffff82111715613b4757613b46613af0565b5b80604052505050565b6000613b5a6137e7565b9050613b668282613b1f565b919050565b600067ffffffffffffffff821115613b8657613b85613af0565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613baf81613b9c565b8114613bba57600080fd5b50565b600081359050613bcc81613ba6565b92915050565b6000613be5613be084613b6b565b613b50565b90508083825260208201905060208402830185811115613c0857613c07613b97565b5b835b81811015613c315780613c1d8882613bbd565b845260208401935050602081019050613c0a565b5050509392505050565b600082601f830112613c5057613c4f613aeb565b5b8135613c60848260208601613bd2565b91505092915050565b600080600060608486031215613c8257613c816137f1565b5b6000613c9086828701613988565b9350506020613ca186828701613988565b925050604084013567ffffffffffffffff811115613cc257613cc16137f6565b5b613cce86828701613c3b565b9150509250925092565b600080600060608486031215613cf157613cf06137f1565b5b6000613cff86828701613a3d565b9350506020613d1086828701613a3d565b9250506040613d2186828701613988565b9150509250925092565b600080fd5b600067ffffffffffffffff821115613d4b57613d4a613af0565b5b613d5482613905565b9050602081019050919050565b82818337600083830152505050565b6000613d83613d7e84613d30565b613b50565b905082815260208101848484011115613d9f57613d9e613d2b565b5b613daa848285613d61565b509392505050565b600082601f830112613dc757613dc6613aeb565b5b8135613dd7848260208601613d70565b91505092915050565b600060208284031215613df657613df56137f1565b5b600082013567ffffffffffffffff811115613e1457613e136137f6565b5b613e2084828501613db2565b91505092915050565b600067ffffffffffffffff821115613e4457613e43613af0565b5b602082029050602081019050919050565b6000613e68613e6384613e29565b613b50565b90508083825260208201905060208402830185811115613e8b57613e8a613b97565b5b835b81811015613eb45780613ea08882613a3d565b845260208401935050602081019050613e8d565b5050509392505050565b600082601f830112613ed357613ed2613aeb565b5b8135613ee3848260208601613e55565b91505092915050565b600067ffffffffffffffff821115613f0757613f06613af0565b5b602082029050602081019050919050565b6000613f2b613f2684613eec565b613b50565b90508083825260208201905060208402830185811115613f4e57613f4d613b97565b5b835b81811015613f775780613f638882613988565b845260208401935050602081019050613f50565b5050509392505050565b600082601f830112613f9657613f95613aeb565b5b8135613fa6848260208601613f18565b91505092915050565b600080600060608486031215613fc857613fc76137f1565b5b600084013567ffffffffffffffff811115613fe657613fe56137f6565b5b613ff286828701613ebe565b935050602084013567ffffffffffffffff811115614013576140126137f6565b5b61401f86828701613f81565b925050604084013567ffffffffffffffff8111156140405761403f6137f6565b5b61404c86828701613f81565b9150509250925092565b60006020828403121561406c5761406b6137f1565b5b600061407a84828501613a3d565b91505092915050565b6000806040838503121561409a576140996137f1565b5b60006140a885828601613a3d565b92505060206140b985828601613aa9565b9150509250929050565b600080604083850312156140da576140d96137f1565b5b60006140e885828601613bbd565b92505060206140f985828601613988565b9150509250929050565b600067ffffffffffffffff82111561411e5761411d613af0565b5b61412782613905565b9050602081019050919050565b600061414761414284614103565b613b50565b90508281526020810184848401111561416357614162613d2b565b5b61416e848285613d61565b509392505050565b600082601f83011261418b5761418a613aeb565b5b813561419b848260208601614134565b91505092915050565b600080600080608085870312156141be576141bd6137f1565b5b60006141cc87828801613a3d565b94505060206141dd87828801613a3d565b93505060406141ee87828801613988565b925050606085013567ffffffffffffffff81111561420f5761420e6137f6565b5b61421b87828801614176565b91505092959194509250565b6000806040838503121561423e5761423d6137f1565b5b600061424c85828601613a3d565b925050602061425d85828601613a3d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142ae57607f821691505b602082108114156142c2576142c1614267565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614324602c836138c1565b915061432f826142c8565b604082019050919050565b6000602082019050818103600083015261435381614317565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006143b66021836138c1565b91506143c18261435a565b604082019050919050565b600060208201905081810360008301526143e5816143a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006144486038836138c1565b9150614453826143ec565b604082019050919050565b600060208201905081810360008301526144778161443b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144b46020836138c1565b91506144bf8261447e565b602082019050919050565b600060208201905081810360008301526144e3816144a7565b9050919050565b7f5472696c6c696f48656972733a2070726573616c652066696e69736865640000600082015250565b6000614520601e836138c1565b915061452b826144ea565b602082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b7f5472696c6c696f48656972733a20596f75206861766520616c7265616479206d60008201527f696e746564206d6178204e465473206f7220796f752061726520676f696e672060208201527f746f206d696e7420746f6f206d616e79204e465473206e6f7700000000000000604082015250565b60006145d86059836138c1565b91506145e382614556565b606082019050919050565b60006020820190508181036000830152614607816145cb565b9050919050565b7f5472696c6c696f48656972733a204f6e6c792077686974656c6973746564207760008201527f616c6c65742063616e20617474656e6420696e2070726573616c650000000000602082015250565b600061466a603b836138c1565b91506146758261460e565b604082019050919050565b600060208201905081810360008301526146998161465d565b9050919050565b7f5472696c6c696f48656972733a20496e2070726573616c652c204f6e6c79203360008201527f303030204e4654732063616e206265206d696e74000000000000000000000000602082015250565b60006146fc6034836138c1565b9150614707826146a0565b604082019050919050565b6000602082019050818103600083015261472b816146ef565b9050919050565b7f5472696c6c696f48656972733a204d696e7420616d6f756e742063616e206e6f60008201527f742062652067726561746572207468616e2072656d61696e696e67204e46542060208201527f616d6f756e7420696e2065616368206c6576656c000000000000000000000000604082015250565b60006147b46054836138c1565b91506147bf82614732565b606082019050919050565b600060208201905081810360008301526147e3816147a7565b9050919050565b7f5472696c6c696f48656972733a204d73672e76616c7565206973206c6573732060008201527f7468616e20746865207265616c2076616c756500000000000000000000000000602082015250565b60006148466033836138c1565b9150614851826147ea565b604082019050919050565b6000602082019050818103600083015261487581614839565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148b6826137b3565b91506148c1836137b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148f6576148f561487c565b5b828201905092915050565b600061490c826137b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561493f5761493e61487c565b5b600182019050919050565b7f5472696c6c696f48656972733a207075626c69632073616c65206e6f7420737460008201527f6172746564000000000000000000000000000000000000000000000000000000602082015250565b60006149a66025836138c1565b91506149b18261494a565b604082019050919050565b600060208201905081810360008301526149d581614999565b9050919050565b7f5472696c6c696f48656972733a204d73672e76616c7565206973206e6f74206560008201527f6e6f756768000000000000000000000000000000000000000000000000000000602082015250565b6000614a386025836138c1565b9150614a43826149dc565b604082019050919050565b60006020820190508181036000830152614a6781614a2b565b9050919050565b7f5472696c6c696f48656972733a20416d6f756e74206f662072656d61696e696e60008201527f67204e465420666f722065616368206c6576656c206973206e6f7420656e6f7560208201527f6768000000000000000000000000000000000000000000000000000000000000604082015250565b6000614af06042836138c1565b9150614afb82614a6e565b606082019050919050565b60006020820190508181036000830152614b1f81614ae3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614b826031836138c1565b9150614b8d82614b26565b604082019050919050565b60006020820190508181036000830152614bb181614b75565b9050919050565b7f5472696c6c6f48656972733a2052656d61696e696e67204e4654206973206e6f60008201527f7420656e6f756768000000000000000000000000000000000000000000000000602082015250565b6000614c146028836138c1565b9150614c1f82614bb8565b604082019050919050565b60006020820190508181036000830152614c4381614c07565b9050919050565b7f5472696c6c696f68656972733a20416d6f756e742063616e206e6f742062652060008201527f67726561746572207468616e206d6178206d696e7420616d6f756e7400000000602082015250565b6000614ca6603c836138c1565b9150614cb182614c4a565b604082019050919050565b60006020820190508181036000830152614cd581614c99565b9050919050565b7f5472696c6c696f68656972733a2052656d61696e696e67204e465420666f722060008201527f6c6576656c206973206e6f7420656e6f75676800000000000000000000000000602082015250565b6000614d386033836138c1565b9150614d4382614cdc565b604082019050919050565b60006020820190508181036000830152614d6781614d2b565b9050919050565b7f5472696c6c696f48656972733a2061727261797320686173206469666665726560008201527f6e74206c656e6774680000000000000000000000000000000000000000000000602082015250565b6000614dca6029836138c1565b9150614dd582614d6e565b604082019050919050565b60006020820190508181036000830152614df981614dbd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5472696c6c696f48656972733a20546865206c6576656c206f6620737065636960008201527f616c2077616c6c65742063616e206e6f7420626520677265617465722074686160208201527f6e20340000000000000000000000000000000000000000000000000000000000604082015250565b6000614eb16043836138c1565b9150614ebc82614e2f565b606082019050919050565b60006020820190508181036000830152614ee081614ea4565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614f436029836138c1565b9150614f4e82614ee7565b604082019050919050565b60006020820190508181036000830152614f7281614f36565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614fd5602a836138c1565b9150614fe082614f79565b604082019050919050565b6000602082019050818103600083015261500481614fc8565b9050919050565b7f5472696c6c696f48656972733a2070726573616c652063616e2062652073657460008201527f206f6e6c79206f6e636500000000000000000000000000000000000000000000602082015250565b6000615067602a836138c1565b91506150728261500b565b604082019050919050565b600060208201905081810360008301526150968161505a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006150f9602f836138c1565b91506151048261509d565b604082019050919050565b60006020820190508181036000830152615128816150ec565b9050919050565b600081905092915050565b6000615145826138b6565b61514f818561512f565b935061515f8185602086016138d2565b80840191505092915050565b6000615177828561513a565b9150615183828461513a565b91508190509392505050565b7f5472696c6c696f48656972733a206c6576656c203420616c7265616479206d6960008201527f6e74656400000000000000000000000000000000000000000000000000000000602082015250565b60006151eb6024836138c1565b91506151f68261518f565b604082019050919050565b6000602082019050818103600083015261521a816151de565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061527d6026836138c1565b915061528882615221565b604082019050919050565b600060208201905081810360008301526152ac81615270565b9050919050565b60008160601b9050919050565b60006152cb826152b3565b9050919050565b60006152dd826152c0565b9050919050565b6152f56152f0826139ea565b6152d2565b82525050565b600061530782846152e4565b60148201915081905092915050565b6000615321826137b3565b915061532c836137b3565b92508282101561533f5761533e61487c565b5b828203905092915050565b7f5472696c6c696f48656972733a2052656d61696e696e67204e4654206973206e60008201527f6f7420656e6f7567680000000000000000000000000000000000000000000000602082015250565b60006153a66029836138c1565b91506153b18261534a565b604082019050919050565b600060208201905081810360008301526153d581615399565b9050919050565b6000819050919050565b6153f76153f2826137b3565b6153dc565b82525050565b600061540982896153e6565b60208201915061541982886153e6565b60208201915061542982876152e4565b60148201915061543982866153e6565b60208201915061544982856153e6565b60208201915061545982846153e6565b602082019150819050979650505050505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006154c9602c836138c1565b91506154d48261546d565b604082019050919050565b600060208201905081810360008301526154f8816154bc565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061555b6025836138c1565b9150615566826154ff565b604082019050919050565b6000602082019050818103600083015261558a8161554e565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155ed6024836138c1565b91506155f882615591565b604082019050919050565b6000602082019050818103600083015261561c816155e0565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006156596019836138c1565b915061566482615623565b602082019050919050565b600060208201905081810360008301526156888161564c565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006156eb6032836138c1565b91506156f68261568f565b604082019050919050565b6000602082019050818103600083015261571a816156de565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061575b826137b3565b9150615766836137b3565b92508261577657615775615721565b5b828204905092915050565b600061578c826137b3565b9150615797836137b3565b9250826157a7576157a6615721565b5b828206905092915050565b60006157bd826137b3565b91506157c8836137b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156158015761580061487c565b5b828202905092915050565b600081519050919050565b600082825260208201905092915050565b60006158338261580c565b61583d8185615817565b935061584d8185602086016138d2565b61585681613905565b840191505092915050565b600060808201905061587660008301876139fc565b61588360208301866139fc565b61589060408301856137bd565b81810360608301526158a28184615828565b905095945050505050565b6000815190506158bc81613827565b92915050565b6000602082840312156158d8576158d76137f1565b5b60006158e6848285016158ad565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006159256020836138c1565b9150615930826158ef565b602082019050919050565b6000602082019050818103600083015261595481615918565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615991601c836138c1565b915061599c8261595b565b602082019050919050565b600060208201905081810360008301526159c081615984565b905091905056fea264697066735822122042e6883daa5f03a382449f35f7161a36a471485ac75b99e08bb405b71089de9764736f6c634300080c0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000c5472696c6c696f4865697273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035452480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f676174657761792e697066732e696f2f697066732f516d567972317465646a4862365876325142775555656744785232453669514a614e54516e7a71795273636370352f0000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): TrillioHeirs
Arg [1] : symbol (string): TRH
Arg [2] : baseUrl (string): https://gateway.ipfs.io/ipfs/QmVyr1tedjHb6Xv2QBwUUegDxR2E6iQJaNTQnzqyRsccp5/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 5472696c6c696f48656972730000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 5452480000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [8] : 68747470733a2f2f676174657761792e697066732e696f2f697066732f516d56
Arg [9] : 7972317465646a4862365876325142775555656744785232453669514a614e54
Arg [10] : 516e7a71795273636370352f0000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

46739:9963:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47275:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21610:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47124:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22555:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24114:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23637:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48895:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51007:1440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53309:1312;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24864:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47415:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25274:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47162:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48390:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54629:1475;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46822:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49406:607;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47038:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22249:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46888:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21979:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36437:103;;;;;;;;;;;;;:::i;:::-;;47237:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47322:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48123:143;;;;;;;;;;;;;:::i;:::-;;35786:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46998:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47374:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22724:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47080:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24407:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50291:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25530:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46958:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48502:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22899:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47200:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47629:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56298:401;;;;;;;;;;;;;:::i;:::-;;24633:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36695:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46918:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46855:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47275:40;;;;:::o;21610:305::-;21712:4;21764:25;21749:40;;;:11;:40;;;;:105;;;;21821:33;21806:48;;;:11;:48;;;;21749:105;:158;;;;21871:36;21895:11;21871:23;:36::i;:::-;21749:158;21729:178;;21610:305;;;:::o;47124:31::-;;;;:::o;22555:100::-;22609:13;22642:5;22635:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22555:100;:::o;24114:221::-;24190:7;24218:16;24226:7;24218;:16::i;:::-;24210:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24303:15;:24;24319:7;24303:24;;;;;;;;;;;;;;;;;;;;;24296:31;;24114:221;;;:::o;23637:411::-;23718:13;23734:23;23749:7;23734:14;:23::i;:::-;23718:39;;23782:5;23776:11;;:2;:11;;;;23768:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23876:5;23860:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23885:37;23902:5;23909:12;:10;:12::i;:::-;23885:16;:37::i;:::-;23860:62;23838:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24019:21;24028:2;24032:7;24019:8;:21::i;:::-;23707:341;23637:411;;:::o;48895:75::-;36017:12;:10;:12::i;:::-;36006:23;;:7;:5;:7::i;:::-;:23;;;35998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48960:2:::1;48951:6;;:11;;;;;;;;;;;;;;;;;;48895:75:::0;:::o;51007:1440::-;49022:6;;;;;;;;;;;49021:7;49013:16;;;;;;48706:7:::1;;;;;;;;;;;48698:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;51132:23:::2;51158:33;51184:6;51158:21;51168:10;51158:9;:21::i;:::-;:25;;:33;;;;:::i;:::-;51132:59;;51229:14;;51210:15;:33;;51202:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;51356:28;51373:5;51380:3;51356:16;:28::i;:::-;51348:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;51489:15;;51467:19;:17;:19::i;:::-;:37;51459:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;51608:6;51580:24;51600:3;51580:19;:24::i;:::-;:34;;51572:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;51735:23;51751:6;51735:15;:23::i;:::-;51722:9;:36;51714:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;51836:1;51829:3;:8;51825:569;;;51858:9;51870:1;51858:13;;51854:97;51879:6;51874:1;:11;51854:97;;51910:41;51920:10;51949:1;51932:14;;:18;;;;:::i;:::-;51910:9;:41::i;:::-;51888:3;;;;;:::i;:::-;;;;51854:97;;;;51984:6;51966:14;;:24;;;;;;;:::i;:::-;;;;;;;;51825:569;;;52019:1;52012:3;:8;52008:386;;;52041:9;52053:1;52041:13;;52037:111;52062:6;52057:1;:11;52037:111;;52093:55;52103:10;52145:1;52133:9;;52116:14;;:26;;;;:::i;:::-;:30;;;;:::i;:::-;52093:9;:55::i;:::-;52071:3;;;;;:::i;:::-;;;;52037:111;;;;52181:6;52163:14;;:24;;;;;;;:::i;:::-;;;;;;;;52008:386;;;52224:9;52236:1;52224:13;;52220:123;52245:6;52240:1;:11;52220:123;;52276:67;52286:10;52340:1;52328:9;;52316;;52299:14;;:26;;;;:::i;:::-;:38;;;;:::i;:::-;:42;;;;:::i;:::-;52276:9;:67::i;:::-;52254:3;;;;;:::i;:::-;;;;52220:123;;;;52376:6;52358:14;;:24;;;;;;;:::i;:::-;;;;;;;;52008:386;51825:569;52435:4;52404:16;:28;52421:10;52404:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;51121:1326;51007:1440:::0;;;:::o;53309:1312::-;49022:6;;;;;;;;;;;49021:7;49013:16;;;;;;48818:7:::1;;;;;;;;;;;48817:8;48809:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53403:23:::2;53429:33;53455:6;53429:21;53439:10;53429:9;:21::i;:::-;:25;;:33;;;;:::i;:::-;53403:59;;53476:16;:28;53493:10;53476:28;;;;;;;;;;;;;;;;;;;;;;;;;53473:370;;;53567:14;;53547:17;;:34;;;;:::i;:::-;53527:15;:55;;53519:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;53473:370;;;53732:17;;53713:15;:36;;53705:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;53473:370;53875:26;53894:6;53875:18;:26::i;:::-;53862:9;:39;53854:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;53959:9;53971:1;53959:13;;53954:660;53979:6;53974:1;:11;53954:660;;54008:17;54028;:15;:17::i;:::-;54008:37;;54080:1;54068:9;:13;54060:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;54186:1;54173:9;:14;54169:434;;;54208:41;54218:10;54247:1;54230:14;;:18;;;;:::i;:::-;54208:9;:41::i;:::-;54286:1;54268:14;;:19;;;;;;;:::i;:::-;;;;;;;;54169:434;;;54326:1;54313:9;:14;54309:294;;;54348:55;54358:10;54400:1;54388:9;;54371:14;;:26;;;;:::i;:::-;:30;;;;:::i;:::-;54348:9;:55::i;:::-;54440:1;54422:14;;:19;;;;;;;:::i;:::-;;;;;;;;54309:294;;;54482:67;54492:10;54546:1;54534:9;;54522;;54505:14;;:26;;;;:::i;:::-;:38;;;;:::i;:::-;:42;;;;:::i;:::-;54482:9;:67::i;:::-;54586:1;54568:14;;:19;;;;;;;:::i;:::-;;;;;;;;54309:294;54169:434;53993:621;53988:3;;;;;:::i;:::-;;;;53954:660;;;;53392:1229;53309:1312:::0;:::o;24864:339::-;25059:41;25078:12;:10;:12::i;:::-;25092:7;25059:18;:41::i;:::-;25051:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25167:28;25177:4;25183:2;25187:7;25167:9;:28::i;:::-;24864:339;;;:::o;47415:36::-;;;;:::o;25274:185::-;25412:39;25429:4;25435:2;25439:7;25412:39;;;;;;;;;;;;:16;:39::i;:::-;25274:185;;;:::o;47162:31::-;;;;:::o;48390:104::-;36017:12;:10;:12::i;:::-;36006:23;;:7;:5;:7::i;:::-;:23;;;35998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48475:11:::1;48465:7;:21;;;;;;;;;;;;:::i;:::-;;48390:104:::0;:::o;54629:1475::-;49022:6;;;;;;;;;;;49021:7;49013:16;;;;;;48818:7:::1;;;;;;;;;;;48817:8;48809:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54712:23:::2;54738:33;54764:6;54738:21;54748:10;54738:9;:21::i;:::-;:25;;:33;;;;:::i;:::-;54712:59;;54782:14;54799:78;54854:22;54874:1;54854:19;:22::i;:::-;54799:50;54826:22;54846:1;54826:19;:22::i;:::-;54799;54819:1;54799:19;:22::i;:::-;:26;;:50;;;;:::i;:::-;:54;;:78;;;;:::i;:::-;54782:95;;54906:6;54896;:16;;54888:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54968:21;54992:15;:27;55008:10;54992:27;;;;;;;;;;;;;;;:41;;;54968:65;;55047:16;:28;55064:10;55047:28;;;;;;;;;;;;;;;;;;;;;;;;;55044:304;;;55134:14;;55118:13;:30;;;;:::i;:::-;55098:15;:51;;55090:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;55044:304;;;55270:13;55251:15;:32;;55243:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;55044:304;55359:11;55373:15;:27;55389:10;55373:27;;;;;;;;;;;;;;;:33;;;55359:47;;55435:24;55455:3;55435:19;:24::i;:::-;55425:6;:34;;55417:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;55539:1;55532:3;:8;55528:569;;;55561:9;55573:1;55561:13;;55557:97;55582:6;55577:1;:11;55557:97;;55613:41;55623:10;55652:1;55635:14;;:18;;;;:::i;:::-;55613:9;:41::i;:::-;55591:3;;;;;:::i;:::-;;;;55557:97;;;;55687:6;55669:14;;:24;;;;;;;:::i;:::-;;;;;;;;55528:569;;;55722:1;55715:3;:8;55711:386;;;55744:9;55756:1;55744:13;;55740:111;55765:6;55760:1;:11;55740:111;;55796:55;55806:10;55848:1;55836:9;;55819:14;;:26;;;;:::i;:::-;:30;;;;:::i;:::-;55796:9;:55::i;:::-;55774:3;;;;;:::i;:::-;;;;55740:111;;;;55884:6;55866:14;;:24;;;;;;;:::i;:::-;;;;;;;;55711:386;;;55927:9;55939:1;55927:13;;55923:123;55948:6;55943:1;:11;55923:123;;55979:67;55989:10;56043:1;56031:9;;56019;;56002:14;;:26;;;;:::i;:::-;:38;;;;:::i;:::-;:42;;;;:::i;:::-;55979:9;:67::i;:::-;55957:3;;;;;:::i;:::-;;;;55923:123;;;;56079:6;56061:14;;:24;;;;;;;:::i;:::-;;;;;;;;55711:386;55528:569;54701:1403;;;;54629:1475:::0;:::o;46822:26::-;;;;;;;;;;;;;:::o;49406:607::-;36017:12;:10;:12::i;:::-;36006:23;;:7;:5;:7::i;:::-;:23;;;35998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49573:6:::1;:13;49553:9;:16;:33;:74;;;;;49607:13;:20;49590:6;:13;:37;49553:74;49545:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;49691:9;49686:320;49710:9;:16;49706:1;:20;49686:320;;;49768:1;49756:6;49763:1;49756:9;;;;;;;;:::i;:::-;;;;;;;;:13;:30;;;;;49785:1;49773:6;49780:1;49773:9;;;;;;;;:::i;:::-;;;;;;;;:13;49756:30;49748:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49873:25;49901:42;;;;;;;;49915:6;49922:1;49915:9;;;;;;;;:::i;:::-;;;;;;;;49901:42;;;;49926:13;49940:1;49926:16;;;;;;;;:::i;:::-;;;;;;;;49901:42;;::::0;49873:70:::1;;49990:4;49958:15;:29;49974:9;49984:1;49974:12;;;;;;;;:::i;:::-;;;;;;;;49958:29;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;;49733:273;49728:3;;;;;:::i;:::-;;;;49686:320;;;;49406:607:::0;;;:::o;47038:33::-;;;;:::o;22249:239::-;22321:7;22341:13;22357:7;:16;22365:7;22357:16;;;;;;;;;;;;;;;;;;;;;22341:32;;22409:1;22392:19;;:5;:19;;;;22384:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22475:5;22468:12;;;22249:239;;;:::o;46888:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21979:208::-;22051:7;22096:1;22079:19;;:5;:19;;;;22071:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22163:9;:16;22173:5;22163:16;;;;;;;;;;;;;;;;22156:23;;21979:208;;;:::o;36437:103::-;36017:12;:10;:12::i;:::-;36006:23;;:7;:5;:7::i;:::-;:23;;;35998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36502:30:::1;36529:1;36502:18;:30::i;:::-;36437:103::o:0;47237:29::-;;;;:::o;47322:43::-;;;;:::o;48123:143::-;36017:12;:10;:12::i;:::-;36006:23;;:7;:5;:7::i;:::-;:23;;;35998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48176:14:::1;48193:21;48176:38;;48233:7;:5;:7::i;:::-;48225:25;;:33;48251:6;48225:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;48165:101;48123:143::o:0;35786:87::-;35832:7;35859:6;;;;;;;;;;;35852:13;;35786:87;:::o;46998:33::-;;;;:::o;47374:34::-;;;;:::o;22724:104::-;22780:13;22813:7;22806:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22724:104;:::o;47080:37::-;;;;:::o;24407:155::-;24502:52;24521:12;:10;:12::i;:::-;24535:8;24545;24502:18;:52::i;:::-;24407:155;;:::o;50291:259::-;36017:12;:10;:12::i;:::-;36006:23;;:7;:5;:7::i;:::-;:23;;;35998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50381:1:::1;50374:3;:8;50370:172;;;50416:5;50397:16;:24;;;;50370:172;;;50448:1;50441:3;:8;50437:105;;;50483:5;50464:16;:24;;;;50437:105;;;50537:5;50518:16;:24;;;;50437:105;50370:172;50291:259:::0;;:::o;25530:328::-;25705:41;25724:12;:10;:12::i;:::-;25738:7;25705:18;:41::i;:::-;25697:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25811:39;25825:4;25831:2;25835:7;25844:5;25811:13;:39::i;:::-;25530:328;;;;:::o;46958:33::-;;;;:::o;48502:158::-;36017:12;:10;:12::i;:::-;36006:23;;:7;:5;:7::i;:::-;:23;;;35998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48578:4:::1;48567:15;;:7;;;;;;;;;;;:15;;;48559:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48650:2;48640:7;;:12;;;;;;;;;;;;;;;;;;48502:158:::0;:::o;22899:334::-;22972:13;23006:16;23014:7;23006;:16::i;:::-;22998:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23087:21;23111:10;:8;:10::i;:::-;23087:34;;23163:1;23145:7;23139:21;:25;:86;;;;;;;;;;;;;;;;;23191:7;23200:18;:7;:16;:18::i;:::-;23174:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23139:86;23132:93;;;22899:334;;;:::o;47200:30::-;;;;:::o;47629:35::-;;;;:::o;56298:401::-;36017:12;:10;:12::i;:::-;36006:23;;:7;:5;:7::i;:::-;:23;;;35998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56351:17:::1;56371:29;56385:14;;56371:9;;:13;;:29;;;;:::i;:::-;56351:49;;56431:1;56419:9;:13;56411:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56488:9;56500:1;56488:13;;56484:134;56509:9;56504:1;:14;56484:134;;56539:79;56549:10;56615:1;56603:9;;56591;;56579;;56562:14;;:26;;;;:::i;:::-;:38;;;;:::i;:::-;:50;;;;:::i;:::-;:54;;;;:::i;:::-;56539:9;:79::i;:::-;56521:3;;;;;:::i;:::-;;;;56484:134;;;;56647:9;56629:14;;:27;;;;;;;:::i;:::-;;;;;;;;56682:9;56667:11;;:24;;;;;;;:::i;:::-;;;;;;;;56340:359;56298:401::o:0;24633:164::-;24730:4;24754:18;:25;24773:5;24754:25;;;;;;;;;;;;;;;:35;24780:8;24754:35;;;;;;;;;;;;;;;;;;;;;;;;;24747:42;;24633:164;;;;:::o;36695:201::-;36017:12;:10;:12::i;:::-;36006:23;;:7;:5;:7::i;:::-;:23;;;35998:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36804:1:::1;36784:22;;:8;:22;;;;36776:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36860:28;36879:8;36860:18;:28::i;:::-;36695:201:::0;:::o;46918:33::-;;;;:::o;46855:26::-;;;;;;;;;;;;;:::o;20039:157::-;20124:4;20163:25;20148:40;;;:11;:40;;;;20141:47;;20039:157;;;:::o;27368:127::-;27433:4;27485:1;27457:30;;:7;:16;27465:7;27457:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27450:37;;27368:127;;;:::o;16836:98::-;16889:7;16916:10;16909:17;;16836:98;:::o;31514:174::-;31616:2;31589:15;:24;31605:7;31589:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31672:7;31668:2;31634:46;;31643:23;31658:7;31643:14;:23::i;:::-;31634:46;;;;;;;;;;;;31514:174;;:::o;42505:98::-;42563:7;42594:1;42590;:5;;;;:::i;:::-;42583:12;;42505:98;;;;:::o;50558:441::-;50642:4;50659:12;50701:10;50684:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;50674:39;;;;;;50659:54;;50734:1;50727:3;:8;50724:267;;;50757:49;50776:5;50783:16;;50801:4;50757:18;:49::i;:::-;50750:56;;;;;50724:267;50833:1;50826:3;:8;50822:169;;;50856:49;50875:5;50882:16;;50900:4;50856:18;:49::i;:::-;50849:56;;;;;50822:169;50942:49;50961:5;50968:16;;50986:4;50942:18;:49::i;:::-;50935:56;;;50558:441;;;;;:::o;50021:133::-;50071:7;50132:14;;50115;;50098;;:31;;;;:::i;:::-;:48;;;;:::i;:::-;50091:55;;50021:133;:::o;49057:341::-;49120:7;49151:1;49144:3;:8;49140:250;;;49186:14;;49174:9;;:26;;;;:::i;:::-;49167:33;;;;49140:250;49227:1;49220:3;:8;49216:174;;;49262:14;;49250:9;;:26;;;;:::i;:::-;49243:33;;;;49216:174;49303:1;49296:3;:8;49292:98;;;49338:14;;49326:9;;:26;;;;:::i;:::-;49319:33;;;;49292:98;49389:1;49382:8;;49057:341;;;;:::o;50162:121::-;50224:7;50251:24;50268:6;50251:12;;:16;;:24;;;;:::i;:::-;50244:31;;50162:121;;;:::o;28352:110::-;28428:26;28438:2;28442:7;28428:26;;;;;;;;;;;;:9;:26::i;:::-;28352:110;;:::o;53174:127::-;53239:7;53266:27;53277:15;;53266:6;:10;;:27;;;;:::i;:::-;53259:34;;53174:127;;;:::o;52455:711::-;52503:7;52523:14;52540:114;52623:30;:28;:30::i;:::-;52540:78;52595:22;52615:1;52595:19;:22::i;:::-;52540:50;52567:22;52587:1;52567:19;:22::i;:::-;52540;52560:1;52540:19;:22::i;:::-;:26;;:50;;;;:::i;:::-;:54;;:78;;;;:::i;:::-;:82;;:114;;;;:::i;:::-;52523:131;;52683:1;52673:6;:11;;52665:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52741:14;52793:16;52811:15;52828:10;52840:14;;52856;;52872;;52776:111;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52766:122;;;;;;52758:131;;52741:148;;52900:11;52914:20;52932:1;52914:13;52925:1;52914:6;:10;;:13;;;;:::i;:::-;:17;;:20;;;;:::i;:::-;52900:34;;52945:13;52973:165;53007:1;52980:24;53000:3;52980:19;:24::i;:::-;:28;52973:165;;;53031:17;53046:1;53031:10;53039:1;53031:3;:7;;:10;;;;:::i;:::-;:14;;:17;;;;:::i;:::-;53025:23;;53076:1;53067:5;:10;53063:41;;;53103:1;53096:8;;;;;;;;53063:41;53119:7;;;;;:::i;:::-;;;;52973:165;;;53155:3;53148:10;;;;;;52455:711;;:::o;27662:348::-;27755:4;27780:16;27788:7;27780;:16::i;:::-;27772:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27856:13;27872:23;27887:7;27872:14;:23::i;:::-;27856:39;;27925:5;27914:16;;:7;:16;;;:51;;;;27958:7;27934:31;;:20;27946:7;27934:11;:20::i;:::-;:31;;;27914:51;:87;;;;27969:32;27986:5;27993:7;27969:16;:32::i;:::-;27914:87;27906:96;;;27662:348;;;;:::o;30771:625::-;30930:4;30903:31;;:23;30918:7;30903:14;:23::i;:::-;:31;;;30895:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31009:1;30995:16;;:2;:16;;;;30987:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31065:39;31086:4;31092:2;31096:7;31065:20;:39::i;:::-;31169:29;31186:1;31190:7;31169:8;:29::i;:::-;31230:1;31211:9;:15;31221:4;31211:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31259:1;31242:9;:13;31252:2;31242:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31290:2;31271:7;:16;31279:7;31271:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31329:7;31325:2;31310:27;;31319:4;31310:27;;;;;;;;;;;;31350:38;31370:4;31376:2;31380:7;31350:19;:38::i;:::-;30771:625;;;:::o;37056:191::-;37130:16;37149:6;;;;;;;;;;;37130:25;;37175:8;37166:6;;:17;;;;;;;;;;;;;;;;;;37230:8;37199:40;;37220:8;37199:40;;;;;;;;;;;;37119:128;37056:191;:::o;31830:315::-;31985:8;31976:17;;:5;:17;;;;31968:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32072:8;32034:18;:25;32053:5;32034:25;;;;;;;;;;;;;;;:35;32060:8;32034:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32118:8;32096:41;;32111:5;32096:41;;;32128:8;32096:41;;;;;;:::i;:::-;;;;;;;;31830:315;;;:::o;26740:::-;26897:28;26907:4;26913:2;26917:7;26897:9;:28::i;:::-;26944:48;26967:4;26973:2;26977:7;26986:5;26944:22;:48::i;:::-;26936:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26740:315;;;;:::o;48274:108::-;48334:13;48367:7;48360:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48274:108;:::o;17415:723::-;17471:13;17701:1;17692:5;:10;17688:53;;;17719:10;;;;;;;;;;;;;;;;;;;;;17688:53;17751:12;17766:5;17751:20;;17782:14;17807:78;17822:1;17814:4;:9;17807:78;;17840:8;;;;;:::i;:::-;;;;17871:2;17863:10;;;;;:::i;:::-;;;17807:78;;;17895:19;17927:6;17917:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17895:39;;17945:154;17961:1;17952:5;:10;17945:154;;17989:1;17979:11;;;;;:::i;:::-;;;18056:2;18048:5;:10;;;;:::i;:::-;18035:2;:24;;;;:::i;:::-;18022:39;;18005:6;18012;18005:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18085:2;18076:11;;;;;:::i;:::-;;;17945:154;;;18123:6;18109:21;;;;;17415:723;;;;:::o;42886:98::-;42944:7;42975:1;42971;:5;;;;:::i;:::-;42964:12;;42886:98;;;;:::o;38177:190::-;38302:4;38355;38326:25;38339:5;38346:4;38326:12;:25::i;:::-;:33;38319:40;;38177:190;;;;;:::o;43243:98::-;43301:7;43332:1;43328;:5;;;;:::i;:::-;43321:12;;43243:98;;;;:::o;28689:321::-;28819:18;28825:2;28829:7;28819:5;:18::i;:::-;28870:54;28901:1;28905:2;28909:7;28918:5;28870:22;:54::i;:::-;28848:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28689:321;;;:::o;56112:178::-;56173:7;56200:82;56236:45;56269:11;;56236:28;56252:11;;56236;;:15;;:28;;;;:::i;:::-;:32;;:45;;;;:::i;:::-;56201:29;56220:9;;56201:14;;:18;;:29;;;;:::i;:::-;56200:35;;:82;;;;:::i;:::-;56193:89;;56112:178;:::o;44207:98::-;44265:7;44296:1;44292;:5;;;;:::i;:::-;44285:12;;44207:98;;;;:::o;34081:126::-;;;;:::o;34592:125::-;;;;:::o;32710:799::-;32865:4;32886:15;:2;:13;;;:15::i;:::-;32882:620;;;32938:2;32922:36;;;32959:12;:10;:12::i;:::-;32973:4;32979:7;32988:5;32922:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32918:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33181:1;33164:6;:13;:18;33160:272;;;33207:60;;;;;;;;;;:::i;:::-;;;;;;;;33160:272;33382:6;33376:13;33367:6;33363:2;33359:15;33352:38;32918:529;33055:41;;;33045:51;;;:6;:51;;;;33038:58;;;;;32882:620;33486:4;33479:11;;32710:799;;;;;;;:::o;38729:675::-;38812:7;38832:20;38855:4;38832:27;;38875:9;38870:497;38894:5;:12;38890:1;:16;38870:497;;;38928:20;38951:5;38957:1;38951:8;;;;;;;;:::i;:::-;;;;;;;;38928:31;;38994:12;38978;:28;38974:382;;39121:42;39136:12;39150;39121:14;:42::i;:::-;39106:57;;38974:382;;;39298:42;39313:12;39327;39298:14;:42::i;:::-;39283:57;;38974:382;38913:454;38908:3;;;;;:::i;:::-;;;;38870:497;;;;39384:12;39377:19;;;38729:675;;;;:::o;29346:439::-;29440:1;29426:16;;:2;:16;;;;29418:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29499:16;29507:7;29499;:16::i;:::-;29498:17;29490:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29561:45;29590:1;29594:2;29598:7;29561:20;:45::i;:::-;29636:1;29619:9;:13;29629:2;29619:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29667:2;29648:7;:16;29656:7;29648:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29712:7;29708:2;29687:33;;29704:1;29687:33;;;;;;;;;;;;29733:44;29761:1;29765:2;29769:7;29733:19;:44::i;:::-;29346:439;;:::o;8887:326::-;8947:4;9204:1;9182:7;:19;;;:23;9175:30;;8887:326;;;:::o;39412:224::-;39480:13;39543:1;39537:4;39530:15;39572:1;39566:4;39559:15;39613:4;39607;39597:21;39588:30;;39412:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:116::-;5360:21;5375:5;5360:21;:::i;:::-;5353:5;5350:32;5340:60;;5396:1;5393;5386:12;5340:60;5290:116;:::o;5412:133::-;5455:5;5493:6;5480:20;5471:29;;5509:30;5533:5;5509:30;:::i;:::-;5412:133;;;;:::o;5551:323::-;5607:6;5656:2;5644:9;5635:7;5631:23;5627:32;5624:119;;;5662:79;;:::i;:::-;5624:119;5782:1;5807:50;5849:7;5840:6;5829:9;5825:22;5807:50;:::i;:::-;5797:60;;5753:114;5551:323;;;;:::o;5880:117::-;5989:1;5986;5979:12;6003:180;6051:77;6048:1;6041:88;6148:4;6145:1;6138:15;6172:4;6169:1;6162:15;6189:281;6272:27;6294:4;6272:27;:::i;:::-;6264:6;6260:40;6402:6;6390:10;6387:22;6366:18;6354:10;6351:34;6348:62;6345:88;;;6413:18;;:::i;:::-;6345:88;6453:10;6449:2;6442:22;6232:238;6189:281;;:::o;6476:129::-;6510:6;6537:20;;:::i;:::-;6527:30;;6566:33;6594:4;6586:6;6566:33;:::i;:::-;6476:129;;;:::o;6611:311::-;6688:4;6778:18;6770:6;6767:30;6764:56;;;6800:18;;:::i;:::-;6764:56;6850:4;6842:6;6838:17;6830:25;;6910:4;6904;6900:15;6892:23;;6611:311;;;:::o;6928:117::-;7037:1;7034;7027:12;7051:77;7088:7;7117:5;7106:16;;7051:77;;;:::o;7134:122::-;7207:24;7225:5;7207:24;:::i;:::-;7200:5;7197:35;7187:63;;7246:1;7243;7236:12;7187:63;7134:122;:::o;7262:139::-;7308:5;7346:6;7333:20;7324:29;;7362:33;7389:5;7362:33;:::i;:::-;7262:139;;;;:::o;7424:710::-;7520:5;7545:81;7561:64;7618:6;7561:64;:::i;:::-;7545:81;:::i;:::-;7536:90;;7646:5;7675:6;7668:5;7661:21;7709:4;7702:5;7698:16;7691:23;;7762:4;7754:6;7750:17;7742:6;7738:30;7791:3;7783:6;7780:15;7777:122;;;7810:79;;:::i;:::-;7777:122;7925:6;7908:220;7942:6;7937:3;7934:15;7908:220;;;8017:3;8046:37;8079:3;8067:10;8046:37;:::i;:::-;8041:3;8034:50;8113:4;8108:3;8104:14;8097:21;;7984:144;7968:4;7963:3;7959:14;7952:21;;7908:220;;;7912:21;7526:608;;7424:710;;;;;:::o;8157:370::-;8228:5;8277:3;8270:4;8262:6;8258:17;8254:27;8244:122;;8285:79;;:::i;:::-;8244:122;8402:6;8389:20;8427:94;8517:3;8509:6;8502:4;8494:6;8490:17;8427:94;:::i;:::-;8418:103;;8234:293;8157:370;;;;:::o;8533:829::-;8635:6;8643;8651;8700:2;8688:9;8679:7;8675:23;8671:32;8668:119;;;8706:79;;:::i;:::-;8668:119;8826:1;8851:53;8896:7;8887:6;8876:9;8872:22;8851:53;:::i;:::-;8841:63;;8797:117;8953:2;8979:53;9024:7;9015:6;9004:9;9000:22;8979:53;:::i;:::-;8969:63;;8924:118;9109:2;9098:9;9094:18;9081:32;9140:18;9132:6;9129:30;9126:117;;;9162:79;;:::i;:::-;9126:117;9267:78;9337:7;9328:6;9317:9;9313:22;9267:78;:::i;:::-;9257:88;;9052:303;8533:829;;;;;:::o;9368:619::-;9445:6;9453;9461;9510:2;9498:9;9489:7;9485:23;9481:32;9478:119;;;9516:79;;:::i;:::-;9478:119;9636:1;9661:53;9706:7;9697:6;9686:9;9682:22;9661:53;:::i;:::-;9651:63;;9607:117;9763:2;9789:53;9834:7;9825:6;9814:9;9810:22;9789:53;:::i;:::-;9779:63;;9734:118;9891:2;9917:53;9962:7;9953:6;9942:9;9938:22;9917:53;:::i;:::-;9907:63;;9862:118;9368:619;;;;;:::o;9993:117::-;10102:1;10099;10092:12;10116:308;10178:4;10268:18;10260:6;10257:30;10254:56;;;10290:18;;:::i;:::-;10254:56;10328:29;10350:6;10328:29;:::i;:::-;10320:37;;10412:4;10406;10402:15;10394:23;;10116:308;;;:::o;10430:154::-;10514:6;10509:3;10504;10491:30;10576:1;10567:6;10562:3;10558:16;10551:27;10430:154;;;:::o;10590:412::-;10668:5;10693:66;10709:49;10751:6;10709:49;:::i;:::-;10693:66;:::i;:::-;10684:75;;10782:6;10775:5;10768:21;10820:4;10813:5;10809:16;10858:3;10849:6;10844:3;10840:16;10837:25;10834:112;;;10865:79;;:::i;:::-;10834:112;10955:41;10989:6;10984:3;10979;10955:41;:::i;:::-;10674:328;10590:412;;;;;:::o;11022:340::-;11078:5;11127:3;11120:4;11112:6;11108:17;11104:27;11094:122;;11135:79;;:::i;:::-;11094:122;11252:6;11239:20;11277:79;11352:3;11344:6;11337:4;11329:6;11325:17;11277:79;:::i;:::-;11268:88;;11084:278;11022:340;;;;:::o;11368:509::-;11437:6;11486:2;11474:9;11465:7;11461:23;11457:32;11454:119;;;11492:79;;:::i;:::-;11454:119;11640:1;11629:9;11625:17;11612:31;11670:18;11662:6;11659:30;11656:117;;;11692:79;;:::i;:::-;11656:117;11797:63;11852:7;11843:6;11832:9;11828:22;11797:63;:::i;:::-;11787:73;;11583:287;11368:509;;;;:::o;11883:311::-;11960:4;12050:18;12042:6;12039:30;12036:56;;;12072:18;;:::i;:::-;12036:56;12122:4;12114:6;12110:17;12102:25;;12182:4;12176;12172:15;12164:23;;11883:311;;;:::o;12217:710::-;12313:5;12338:81;12354:64;12411:6;12354:64;:::i;:::-;12338:81;:::i;:::-;12329:90;;12439:5;12468:6;12461:5;12454:21;12502:4;12495:5;12491:16;12484:23;;12555:4;12547:6;12543:17;12535:6;12531:30;12584:3;12576:6;12573:15;12570:122;;;12603:79;;:::i;:::-;12570:122;12718:6;12701:220;12735:6;12730:3;12727:15;12701:220;;;12810:3;12839:37;12872:3;12860:10;12839:37;:::i;:::-;12834:3;12827:50;12906:4;12901:3;12897:14;12890:21;;12777:144;12761:4;12756:3;12752:14;12745:21;;12701:220;;;12705:21;12319:608;;12217:710;;;;;:::o;12950:370::-;13021:5;13070:3;13063:4;13055:6;13051:17;13047:27;13037:122;;13078:79;;:::i;:::-;13037:122;13195:6;13182:20;13220:94;13310:3;13302:6;13295:4;13287:6;13283:17;13220:94;:::i;:::-;13211:103;;13027:293;12950:370;;;;:::o;13326:311::-;13403:4;13493:18;13485:6;13482:30;13479:56;;;13515:18;;:::i;:::-;13479:56;13565:4;13557:6;13553:17;13545:25;;13625:4;13619;13615:15;13607:23;;13326:311;;;:::o;13660:710::-;13756:5;13781:81;13797:64;13854:6;13797:64;:::i;:::-;13781:81;:::i;:::-;13772:90;;13882:5;13911:6;13904:5;13897:21;13945:4;13938:5;13934:16;13927:23;;13998:4;13990:6;13986:17;13978:6;13974:30;14027:3;14019:6;14016:15;14013:122;;;14046:79;;:::i;:::-;14013:122;14161:6;14144:220;14178:6;14173:3;14170:15;14144:220;;;14253:3;14282:37;14315:3;14303:10;14282:37;:::i;:::-;14277:3;14270:50;14349:4;14344:3;14340:14;14333:21;;14220:144;14204:4;14199:3;14195:14;14188:21;;14144:220;;;14148:21;13762:608;;13660:710;;;;;:::o;14393:370::-;14464:5;14513:3;14506:4;14498:6;14494:17;14490:27;14480:122;;14521:79;;:::i;:::-;14480:122;14638:6;14625:20;14663:94;14753:3;14745:6;14738:4;14730:6;14726:17;14663:94;:::i;:::-;14654:103;;14470:293;14393:370;;;;:::o;14769:1249::-;14921:6;14929;14937;14986:2;14974:9;14965:7;14961:23;14957:32;14954:119;;;14992:79;;:::i;:::-;14954:119;15140:1;15129:9;15125:17;15112:31;15170:18;15162:6;15159:30;15156:117;;;15192:79;;:::i;:::-;15156:117;15297:78;15367:7;15358:6;15347:9;15343:22;15297:78;:::i;:::-;15287:88;;15083:302;15452:2;15441:9;15437:18;15424:32;15483:18;15475:6;15472:30;15469:117;;;15505:79;;:::i;:::-;15469:117;15610:78;15680:7;15671:6;15660:9;15656:22;15610:78;:::i;:::-;15600:88;;15395:303;15765:2;15754:9;15750:18;15737:32;15796:18;15788:6;15785:30;15782:117;;;15818:79;;:::i;:::-;15782:117;15923:78;15993:7;15984:6;15973:9;15969:22;15923:78;:::i;:::-;15913:88;;15708:303;14769:1249;;;;;:::o;16024:329::-;16083:6;16132:2;16120:9;16111:7;16107:23;16103:32;16100:119;;;16138:79;;:::i;:::-;16100:119;16258:1;16283:53;16328:7;16319:6;16308:9;16304:22;16283:53;:::i;:::-;16273:63;;16229:117;16024:329;;;;:::o;16359:468::-;16424:6;16432;16481:2;16469:9;16460:7;16456:23;16452:32;16449:119;;;16487:79;;:::i;:::-;16449:119;16607:1;16632:53;16677:7;16668:6;16657:9;16653:22;16632:53;:::i;:::-;16622:63;;16578:117;16734:2;16760:50;16802:7;16793:6;16782:9;16778:22;16760:50;:::i;:::-;16750:60;;16705:115;16359:468;;;;;:::o;16833:474::-;16901:6;16909;16958:2;16946:9;16937:7;16933:23;16929:32;16926:119;;;16964:79;;:::i;:::-;16926:119;17084:1;17109:53;17154:7;17145:6;17134:9;17130:22;17109:53;:::i;:::-;17099:63;;17055:117;17211:2;17237:53;17282:7;17273:6;17262:9;17258:22;17237:53;:::i;:::-;17227:63;;17182:118;16833:474;;;;;:::o;17313:307::-;17374:4;17464:18;17456:6;17453:30;17450:56;;;17486:18;;:::i;:::-;17450:56;17524:29;17546:6;17524:29;:::i;:::-;17516:37;;17608:4;17602;17598:15;17590:23;;17313:307;;;:::o;17626:410::-;17703:5;17728:65;17744:48;17785:6;17744:48;:::i;:::-;17728:65;:::i;:::-;17719:74;;17816:6;17809:5;17802:21;17854:4;17847:5;17843:16;17892:3;17883:6;17878:3;17874:16;17871:25;17868:112;;;17899:79;;:::i;:::-;17868:112;17989:41;18023:6;18018:3;18013;17989:41;:::i;:::-;17709:327;17626:410;;;;;:::o;18055:338::-;18110:5;18159:3;18152:4;18144:6;18140:17;18136:27;18126:122;;18167:79;;:::i;:::-;18126:122;18284:6;18271:20;18309:78;18383:3;18375:6;18368:4;18360:6;18356:17;18309:78;:::i;:::-;18300:87;;18116:277;18055:338;;;;:::o;18399:943::-;18494:6;18502;18510;18518;18567:3;18555:9;18546:7;18542:23;18538:33;18535:120;;;18574:79;;:::i;:::-;18535:120;18694:1;18719:53;18764:7;18755:6;18744:9;18740:22;18719:53;:::i;:::-;18709:63;;18665:117;18821:2;18847:53;18892:7;18883:6;18872:9;18868:22;18847:53;:::i;:::-;18837:63;;18792:118;18949:2;18975:53;19020:7;19011:6;19000:9;18996:22;18975:53;:::i;:::-;18965:63;;18920:118;19105:2;19094:9;19090:18;19077:32;19136:18;19128:6;19125:30;19122:117;;;19158:79;;:::i;:::-;19122:117;19263:62;19317:7;19308:6;19297:9;19293:22;19263:62;:::i;:::-;19253:72;;19048:287;18399:943;;;;;;;:::o;19348:474::-;19416:6;19424;19473:2;19461:9;19452:7;19448:23;19444:32;19441:119;;;19479:79;;:::i;:::-;19441:119;19599:1;19624:53;19669:7;19660:6;19649:9;19645:22;19624:53;:::i;:::-;19614:63;;19570:117;19726:2;19752:53;19797:7;19788:6;19777:9;19773:22;19752:53;:::i;:::-;19742:63;;19697:118;19348:474;;;;;:::o;19828:180::-;19876:77;19873:1;19866:88;19973:4;19970:1;19963:15;19997:4;19994:1;19987:15;20014:320;20058:6;20095:1;20089:4;20085:12;20075:22;;20142:1;20136:4;20132:12;20163:18;20153:81;;20219:4;20211:6;20207:17;20197:27;;20153:81;20281:2;20273:6;20270:14;20250:18;20247:38;20244:84;;;20300:18;;:::i;:::-;20244:84;20065:269;20014:320;;;:::o;20340:231::-;20480:34;20476:1;20468:6;20464:14;20457:58;20549:14;20544:2;20536:6;20532:15;20525:39;20340:231;:::o;20577:366::-;20719:3;20740:67;20804:2;20799:3;20740:67;:::i;:::-;20733:74;;20816:93;20905:3;20816:93;:::i;:::-;20934:2;20929:3;20925:12;20918:19;;20577:366;;;:::o;20949:419::-;21115:4;21153:2;21142:9;21138:18;21130:26;;21202:9;21196:4;21192:20;21188:1;21177:9;21173:17;21166:47;21230:131;21356:4;21230:131;:::i;:::-;21222:139;;20949:419;;;:::o;21374:220::-;21514:34;21510:1;21502:6;21498:14;21491:58;21583:3;21578:2;21570:6;21566:15;21559:28;21374:220;:::o;21600:366::-;21742:3;21763:67;21827:2;21822:3;21763:67;:::i;:::-;21756:74;;21839:93;21928:3;21839:93;:::i;:::-;21957:2;21952:3;21948:12;21941:19;;21600:366;;;:::o;21972:419::-;22138:4;22176:2;22165:9;22161:18;22153:26;;22225:9;22219:4;22215:20;22211:1;22200:9;22196:17;22189:47;22253:131;22379:4;22253:131;:::i;:::-;22245:139;;21972:419;;;:::o;22397:243::-;22537:34;22533:1;22525:6;22521:14;22514:58;22606:26;22601:2;22593:6;22589:15;22582:51;22397:243;:::o;22646:366::-;22788:3;22809:67;22873:2;22868:3;22809:67;:::i;:::-;22802:74;;22885:93;22974:3;22885:93;:::i;:::-;23003:2;22998:3;22994:12;22987:19;;22646:366;;;:::o;23018:419::-;23184:4;23222:2;23211:9;23207:18;23199:26;;23271:9;23265:4;23261:20;23257:1;23246:9;23242:17;23235:47;23299:131;23425:4;23299:131;:::i;:::-;23291:139;;23018:419;;;:::o;23443:182::-;23583:34;23579:1;23571:6;23567:14;23560:58;23443:182;:::o;23631:366::-;23773:3;23794:67;23858:2;23853:3;23794:67;:::i;:::-;23787:74;;23870:93;23959:3;23870:93;:::i;:::-;23988:2;23983:3;23979:12;23972:19;;23631:366;;;:::o;24003:419::-;24169:4;24207:2;24196:9;24192:18;24184:26;;24256:9;24250:4;24246:20;24242:1;24231:9;24227:17;24220:47;24284:131;24410:4;24284:131;:::i;:::-;24276:139;;24003:419;;;:::o;24428:180::-;24568:32;24564:1;24556:6;24552:14;24545:56;24428:180;:::o;24614:366::-;24756:3;24777:67;24841:2;24836:3;24777:67;:::i;:::-;24770:74;;24853:93;24942:3;24853:93;:::i;:::-;24971:2;24966:3;24962:12;24955:19;;24614:366;;;:::o;24986:419::-;25152:4;25190:2;25179:9;25175:18;25167:26;;25239:9;25233:4;25229:20;25225:1;25214:9;25210:17;25203:47;25267:131;25393:4;25267:131;:::i;:::-;25259:139;;24986:419;;;:::o;25411:313::-;25551:34;25547:1;25539:6;25535:14;25528:58;25620:34;25615:2;25607:6;25603:15;25596:59;25689:27;25684:2;25676:6;25672:15;25665:52;25411:313;:::o;25730:366::-;25872:3;25893:67;25957:2;25952:3;25893:67;:::i;:::-;25886:74;;25969:93;26058:3;25969:93;:::i;:::-;26087:2;26082:3;26078:12;26071:19;;25730:366;;;:::o;26102:419::-;26268:4;26306:2;26295:9;26291:18;26283:26;;26355:9;26349:4;26345:20;26341:1;26330:9;26326:17;26319:47;26383:131;26509:4;26383:131;:::i;:::-;26375:139;;26102:419;;;:::o;26527:246::-;26667:34;26663:1;26655:6;26651:14;26644:58;26736:29;26731:2;26723:6;26719:15;26712:54;26527:246;:::o;26779:366::-;26921:3;26942:67;27006:2;27001:3;26942:67;:::i;:::-;26935:74;;27018:93;27107:3;27018:93;:::i;:::-;27136:2;27131:3;27127:12;27120:19;;26779:366;;;:::o;27151:419::-;27317:4;27355:2;27344:9;27340:18;27332:26;;27404:9;27398:4;27394:20;27390:1;27379:9;27375:17;27368:47;27432:131;27558:4;27432:131;:::i;:::-;27424:139;;27151:419;;;:::o;27576:239::-;27716:34;27712:1;27704:6;27700:14;27693:58;27785:22;27780:2;27772:6;27768:15;27761:47;27576:239;:::o;27821:366::-;27963:3;27984:67;28048:2;28043:3;27984:67;:::i;:::-;27977:74;;28060:93;28149:3;28060:93;:::i;:::-;28178:2;28173:3;28169:12;28162:19;;27821:366;;;:::o;28193:419::-;28359:4;28397:2;28386:9;28382:18;28374:26;;28446:9;28440:4;28436:20;28432:1;28421:9;28417:17;28410:47;28474:131;28600:4;28474:131;:::i;:::-;28466:139;;28193:419;;;:::o;28618:308::-;28758:34;28754:1;28746:6;28742:14;28735:58;28827:34;28822:2;28814:6;28810:15;28803:59;28896:22;28891:2;28883:6;28879:15;28872:47;28618:308;:::o;28932:366::-;29074:3;29095:67;29159:2;29154:3;29095:67;:::i;:::-;29088:74;;29171:93;29260:3;29171:93;:::i;:::-;29289:2;29284:3;29280:12;29273:19;;28932:366;;;:::o;29304:419::-;29470:4;29508:2;29497:9;29493:18;29485:26;;29557:9;29551:4;29547:20;29543:1;29532:9;29528:17;29521:47;29585:131;29711:4;29585:131;:::i;:::-;29577:139;;29304:419;;;:::o;29729:238::-;29869:34;29865:1;29857:6;29853:14;29846:58;29938:21;29933:2;29925:6;29921:15;29914:46;29729:238;:::o;29973:366::-;30115:3;30136:67;30200:2;30195:3;30136:67;:::i;:::-;30129:74;;30212:93;30301:3;30212:93;:::i;:::-;30330:2;30325:3;30321:12;30314:19;;29973:366;;;:::o;30345:419::-;30511:4;30549:2;30538:9;30534:18;30526:26;;30598:9;30592:4;30588:20;30584:1;30573:9;30569:17;30562:47;30626:131;30752:4;30626:131;:::i;:::-;30618:139;;30345:419;;;:::o;30770:180::-;30818:77;30815:1;30808:88;30915:4;30912:1;30905:15;30939:4;30936:1;30929:15;30956:305;30996:3;31015:20;31033:1;31015:20;:::i;:::-;31010:25;;31049:20;31067:1;31049:20;:::i;:::-;31044:25;;31203:1;31135:66;31131:74;31128:1;31125:81;31122:107;;;31209:18;;:::i;:::-;31122:107;31253:1;31250;31246:9;31239:16;;30956:305;;;;:::o;31267:233::-;31306:3;31329:24;31347:5;31329:24;:::i;:::-;31320:33;;31375:66;31368:5;31365:77;31362:103;;;31445:18;;:::i;:::-;31362:103;31492:1;31485:5;31481:13;31474:20;;31267:233;;;:::o;31506:224::-;31646:34;31642:1;31634:6;31630:14;31623:58;31715:7;31710:2;31702:6;31698:15;31691:32;31506:224;:::o;31736:366::-;31878:3;31899:67;31963:2;31958:3;31899:67;:::i;:::-;31892:74;;31975:93;32064:3;31975:93;:::i;:::-;32093:2;32088:3;32084:12;32077:19;;31736:366;;;:::o;32108:419::-;32274:4;32312:2;32301:9;32297:18;32289:26;;32361:9;32355:4;32351:20;32347:1;32336:9;32332:17;32325:47;32389:131;32515:4;32389:131;:::i;:::-;32381:139;;32108:419;;;:::o;32533:224::-;32673:34;32669:1;32661:6;32657:14;32650:58;32742:7;32737:2;32729:6;32725:15;32718:32;32533:224;:::o;32763:366::-;32905:3;32926:67;32990:2;32985:3;32926:67;:::i;:::-;32919:74;;33002:93;33091:3;33002:93;:::i;:::-;33120:2;33115:3;33111:12;33104:19;;32763:366;;;:::o;33135:419::-;33301:4;33339:2;33328:9;33324:18;33316:26;;33388:9;33382:4;33378:20;33374:1;33363:9;33359:17;33352:47;33416:131;33542:4;33416:131;:::i;:::-;33408:139;;33135:419;;;:::o;33560:290::-;33700:34;33696:1;33688:6;33684:14;33677:58;33769:34;33764:2;33756:6;33752:15;33745:59;33838:4;33833:2;33825:6;33821:15;33814:29;33560:290;:::o;33856:366::-;33998:3;34019:67;34083:2;34078:3;34019:67;:::i;:::-;34012:74;;34095:93;34184:3;34095:93;:::i;:::-;34213:2;34208:3;34204:12;34197:19;;33856:366;;;:::o;34228:419::-;34394:4;34432:2;34421:9;34417:18;34409:26;;34481:9;34475:4;34471:20;34467:1;34456:9;34452:17;34445:47;34509:131;34635:4;34509:131;:::i;:::-;34501:139;;34228:419;;;:::o;34653:236::-;34793:34;34789:1;34781:6;34777:14;34770:58;34862:19;34857:2;34849:6;34845:15;34838:44;34653:236;:::o;34895:366::-;35037:3;35058:67;35122:2;35117:3;35058:67;:::i;:::-;35051:74;;35134:93;35223:3;35134:93;:::i;:::-;35252:2;35247:3;35243:12;35236:19;;34895:366;;;:::o;35267:419::-;35433:4;35471:2;35460:9;35456:18;35448:26;;35520:9;35514:4;35510:20;35506:1;35495:9;35491:17;35484:47;35548:131;35674:4;35548:131;:::i;:::-;35540:139;;35267:419;;;:::o;35692:227::-;35832:34;35828:1;35820:6;35816:14;35809:58;35901:10;35896:2;35888:6;35884:15;35877:35;35692:227;:::o;35925:366::-;36067:3;36088:67;36152:2;36147:3;36088:67;:::i;:::-;36081:74;;36164:93;36253:3;36164:93;:::i;:::-;36282:2;36277:3;36273:12;36266:19;;35925:366;;;:::o;36297:419::-;36463:4;36501:2;36490:9;36486:18;36478:26;;36550:9;36544:4;36540:20;36536:1;36525:9;36521:17;36514:47;36578:131;36704:4;36578:131;:::i;:::-;36570:139;;36297:419;;;:::o;36722:247::-;36862:34;36858:1;36850:6;36846:14;36839:58;36931:30;36926:2;36918:6;36914:15;36907:55;36722:247;:::o;36975:366::-;37117:3;37138:67;37202:2;37197:3;37138:67;:::i;:::-;37131:74;;37214:93;37303:3;37214:93;:::i;:::-;37332:2;37327:3;37323:12;37316:19;;36975:366;;;:::o;37347:419::-;37513:4;37551:2;37540:9;37536:18;37528:26;;37600:9;37594:4;37590:20;37586:1;37575:9;37571:17;37564:47;37628:131;37754:4;37628:131;:::i;:::-;37620:139;;37347:419;;;:::o;37772:238::-;37912:34;37908:1;37900:6;37896:14;37889:58;37981:21;37976:2;37968:6;37964:15;37957:46;37772:238;:::o;38016:366::-;38158:3;38179:67;38243:2;38238:3;38179:67;:::i;:::-;38172:74;;38255:93;38344:3;38255:93;:::i;:::-;38373:2;38368:3;38364:12;38357:19;;38016:366;;;:::o;38388:419::-;38554:4;38592:2;38581:9;38577:18;38569:26;;38641:9;38635:4;38631:20;38627:1;38616:9;38612:17;38605:47;38669:131;38795:4;38669:131;:::i;:::-;38661:139;;38388:419;;;:::o;38813:228::-;38953:34;38949:1;38941:6;38937:14;38930:58;39022:11;39017:2;39009:6;39005:15;38998:36;38813:228;:::o;39047:366::-;39189:3;39210:67;39274:2;39269:3;39210:67;:::i;:::-;39203:74;;39286:93;39375:3;39286:93;:::i;:::-;39404:2;39399:3;39395:12;39388:19;;39047:366;;;:::o;39419:419::-;39585:4;39623:2;39612:9;39608:18;39600:26;;39672:9;39666:4;39662:20;39658:1;39647:9;39643:17;39636:47;39700:131;39826:4;39700:131;:::i;:::-;39692:139;;39419:419;;;:::o;39844:180::-;39892:77;39889:1;39882:88;39989:4;39986:1;39979:15;40013:4;40010:1;40003:15;40030:291;40170:34;40166:1;40158:6;40154:14;40147:58;40239:34;40234:2;40226:6;40222:15;40215:59;40308:5;40303:2;40295:6;40291:15;40284:30;40030:291;:::o;40327:366::-;40469:3;40490:67;40554:2;40549:3;40490:67;:::i;:::-;40483:74;;40566:93;40655:3;40566:93;:::i;:::-;40684:2;40679:3;40675:12;40668:19;;40327:366;;;:::o;40699:419::-;40865:4;40903:2;40892:9;40888:18;40880:26;;40952:9;40946:4;40942:20;40938:1;40927:9;40923:17;40916:47;40980:131;41106:4;40980:131;:::i;:::-;40972:139;;40699:419;;;:::o;41124:228::-;41264:34;41260:1;41252:6;41248:14;41241:58;41333:11;41328:2;41320:6;41316:15;41309:36;41124:228;:::o;41358:366::-;41500:3;41521:67;41585:2;41580:3;41521:67;:::i;:::-;41514:74;;41597:93;41686:3;41597:93;:::i;:::-;41715:2;41710:3;41706:12;41699:19;;41358:366;;;:::o;41730:419::-;41896:4;41934:2;41923:9;41919:18;41911:26;;41983:9;41977:4;41973:20;41969:1;41958:9;41954:17;41947:47;42011:131;42137:4;42011:131;:::i;:::-;42003:139;;41730:419;;;:::o;42155:229::-;42295:34;42291:1;42283:6;42279:14;42272:58;42364:12;42359:2;42351:6;42347:15;42340:37;42155:229;:::o;42390:366::-;42532:3;42553:67;42617:2;42612:3;42553:67;:::i;:::-;42546:74;;42629:93;42718:3;42629:93;:::i;:::-;42747:2;42742:3;42738:12;42731:19;;42390:366;;;:::o;42762:419::-;42928:4;42966:2;42955:9;42951:18;42943:26;;43015:9;43009:4;43005:20;43001:1;42990:9;42986:17;42979:47;43043:131;43169:4;43043:131;:::i;:::-;43035:139;;42762:419;;;:::o;43187:229::-;43327:34;43323:1;43315:6;43311:14;43304:58;43396:12;43391:2;43383:6;43379:15;43372:37;43187:229;:::o;43422:366::-;43564:3;43585:67;43649:2;43644:3;43585:67;:::i;:::-;43578:74;;43661:93;43750:3;43661:93;:::i;:::-;43779:2;43774:3;43770:12;43763:19;;43422:366;;;:::o;43794:419::-;43960:4;43998:2;43987:9;43983:18;43975:26;;44047:9;44041:4;44037:20;44033:1;44022:9;44018:17;44011:47;44075:131;44201:4;44075:131;:::i;:::-;44067:139;;43794:419;;;:::o;44219:234::-;44359:34;44355:1;44347:6;44343:14;44336:58;44428:17;44423:2;44415:6;44411:15;44404:42;44219:234;:::o;44459:366::-;44601:3;44622:67;44686:2;44681:3;44622:67;:::i;:::-;44615:74;;44698:93;44787:3;44698:93;:::i;:::-;44816:2;44811:3;44807:12;44800:19;;44459:366;;;:::o;44831:419::-;44997:4;45035:2;45024:9;45020:18;45012:26;;45084:9;45078:4;45074:20;45070:1;45059:9;45055:17;45048:47;45112:131;45238:4;45112:131;:::i;:::-;45104:139;;44831:419;;;:::o;45256:148::-;45358:11;45395:3;45380:18;;45256:148;;;;:::o;45410:377::-;45516:3;45544:39;45577:5;45544:39;:::i;:::-;45599:89;45681:6;45676:3;45599:89;:::i;:::-;45592:96;;45697:52;45742:6;45737:3;45730:4;45723:5;45719:16;45697:52;:::i;:::-;45774:6;45769:3;45765:16;45758:23;;45520:267;45410:377;;;;:::o;45793:435::-;45973:3;45995:95;46086:3;46077:6;45995:95;:::i;:::-;45988:102;;46107:95;46198:3;46189:6;46107:95;:::i;:::-;46100:102;;46219:3;46212:10;;45793:435;;;;;:::o;46234:223::-;46374:34;46370:1;46362:6;46358:14;46351:58;46443:6;46438:2;46430:6;46426:15;46419:31;46234:223;:::o;46463:366::-;46605:3;46626:67;46690:2;46685:3;46626:67;:::i;:::-;46619:74;;46702:93;46791:3;46702:93;:::i;:::-;46820:2;46815:3;46811:12;46804:19;;46463:366;;;:::o;46835:419::-;47001:4;47039:2;47028:9;47024:18;47016:26;;47088:9;47082:4;47078:20;47074:1;47063:9;47059:17;47052:47;47116:131;47242:4;47116:131;:::i;:::-;47108:139;;46835:419;;;:::o;47260:225::-;47400:34;47396:1;47388:6;47384:14;47377:58;47469:8;47464:2;47456:6;47452:15;47445:33;47260:225;:::o;47491:366::-;47633:3;47654:67;47718:2;47713:3;47654:67;:::i;:::-;47647:74;;47730:93;47819:3;47730:93;:::i;:::-;47848:2;47843:3;47839:12;47832:19;;47491:366;;;:::o;47863:419::-;48029:4;48067:2;48056:9;48052:18;48044:26;;48116:9;48110:4;48106:20;48102:1;48091:9;48087:17;48080:47;48144:131;48270:4;48144:131;:::i;:::-;48136:139;;47863:419;;;:::o;48288:94::-;48321:8;48369:5;48365:2;48361:14;48340:35;;48288:94;;;:::o;48388:::-;48427:7;48456:20;48470:5;48456:20;:::i;:::-;48445:31;;48388:94;;;:::o;48488:100::-;48527:7;48556:26;48576:5;48556:26;:::i;:::-;48545:37;;48488:100;;;:::o;48594:157::-;48699:45;48719:24;48737:5;48719:24;:::i;:::-;48699:45;:::i;:::-;48694:3;48687:58;48594:157;;:::o;48757:256::-;48869:3;48884:75;48955:3;48946:6;48884:75;:::i;:::-;48984:2;48979:3;48975:12;48968:19;;49004:3;48997:10;;48757:256;;;;:::o;49019:191::-;49059:4;49079:20;49097:1;49079:20;:::i;:::-;49074:25;;49113:20;49131:1;49113:20;:::i;:::-;49108:25;;49152:1;49149;49146:8;49143:34;;;49157:18;;:::i;:::-;49143:34;49202:1;49199;49195:9;49187:17;;49019:191;;;;:::o;49216:228::-;49356:34;49352:1;49344:6;49340:14;49333:58;49425:11;49420:2;49412:6;49408:15;49401:36;49216:228;:::o;49450:366::-;49592:3;49613:67;49677:2;49672:3;49613:67;:::i;:::-;49606:74;;49689:93;49778:3;49689:93;:::i;:::-;49807:2;49802:3;49798:12;49791:19;;49450:366;;;:::o;49822:419::-;49988:4;50026:2;50015:9;50011:18;50003:26;;50075:9;50069:4;50065:20;50061:1;50050:9;50046:17;50039:47;50103:131;50229:4;50103:131;:::i;:::-;50095:139;;49822:419;;;:::o;50247:79::-;50286:7;50315:5;50304:16;;50247:79;;;:::o;50332:157::-;50437:45;50457:24;50475:5;50457:24;:::i;:::-;50437:45;:::i;:::-;50432:3;50425:58;50332:157;;:::o;50495:961::-;50747:3;50762:75;50833:3;50824:6;50762:75;:::i;:::-;50862:2;50857:3;50853:12;50846:19;;50875:75;50946:3;50937:6;50875:75;:::i;:::-;50975:2;50970:3;50966:12;50959:19;;50988:75;51059:3;51050:6;50988:75;:::i;:::-;51088:2;51083:3;51079:12;51072:19;;51101:75;51172:3;51163:6;51101:75;:::i;:::-;51201:2;51196:3;51192:12;51185:19;;51214:75;51285:3;51276:6;51214:75;:::i;:::-;51314:2;51309:3;51305:12;51298:19;;51327:75;51398:3;51389:6;51327:75;:::i;:::-;51427:2;51422:3;51418:12;51411:19;;51447:3;51440:10;;50495:961;;;;;;;;;:::o;51462:231::-;51602:34;51598:1;51590:6;51586:14;51579:58;51671:14;51666:2;51658:6;51654:15;51647:39;51462:231;:::o;51699:366::-;51841:3;51862:67;51926:2;51921:3;51862:67;:::i;:::-;51855:74;;51938:93;52027:3;51938:93;:::i;:::-;52056:2;52051:3;52047:12;52040:19;;51699:366;;;:::o;52071:419::-;52237:4;52275:2;52264:9;52260:18;52252:26;;52324:9;52318:4;52314:20;52310:1;52299:9;52295:17;52288:47;52352:131;52478:4;52352:131;:::i;:::-;52344:139;;52071:419;;;:::o;52496:224::-;52636:34;52632:1;52624:6;52620:14;52613:58;52705:7;52700:2;52692:6;52688:15;52681:32;52496:224;:::o;52726:366::-;52868:3;52889:67;52953:2;52948:3;52889:67;:::i;:::-;52882:74;;52965:93;53054:3;52965:93;:::i;:::-;53083:2;53078:3;53074:12;53067:19;;52726:366;;;:::o;53098:419::-;53264:4;53302:2;53291:9;53287:18;53279:26;;53351:9;53345:4;53341:20;53337:1;53326:9;53322:17;53315:47;53379:131;53505:4;53379:131;:::i;:::-;53371:139;;53098:419;;;:::o;53523:223::-;53663:34;53659:1;53651:6;53647:14;53640:58;53732:6;53727:2;53719:6;53715:15;53708:31;53523:223;:::o;53752:366::-;53894:3;53915:67;53979:2;53974:3;53915:67;:::i;:::-;53908:74;;53991:93;54080:3;53991:93;:::i;:::-;54109:2;54104:3;54100:12;54093:19;;53752:366;;;:::o;54124:419::-;54290:4;54328:2;54317:9;54313:18;54305:26;;54377:9;54371:4;54367:20;54363:1;54352:9;54348:17;54341:47;54405:131;54531:4;54405:131;:::i;:::-;54397:139;;54124:419;;;:::o;54549:175::-;54689:27;54685:1;54677:6;54673:14;54666:51;54549:175;:::o;54730:366::-;54872:3;54893:67;54957:2;54952:3;54893:67;:::i;:::-;54886:74;;54969:93;55058:3;54969:93;:::i;:::-;55087:2;55082:3;55078:12;55071:19;;54730:366;;;:::o;55102:419::-;55268:4;55306:2;55295:9;55291:18;55283:26;;55355:9;55349:4;55345:20;55341:1;55330:9;55326:17;55319:47;55383:131;55509:4;55383:131;:::i;:::-;55375:139;;55102:419;;;:::o;55527:237::-;55667:34;55663:1;55655:6;55651:14;55644:58;55736:20;55731:2;55723:6;55719:15;55712:45;55527:237;:::o;55770:366::-;55912:3;55933:67;55997:2;55992:3;55933:67;:::i;:::-;55926:74;;56009:93;56098:3;56009:93;:::i;:::-;56127:2;56122:3;56118:12;56111:19;;55770:366;;;:::o;56142:419::-;56308:4;56346:2;56335:9;56331:18;56323:26;;56395:9;56389:4;56385:20;56381:1;56370:9;56366:17;56359:47;56423:131;56549:4;56423:131;:::i;:::-;56415:139;;56142:419;;;:::o;56567:180::-;56615:77;56612:1;56605:88;56712:4;56709:1;56702:15;56736:4;56733:1;56726:15;56753:185;56793:1;56810:20;56828:1;56810:20;:::i;:::-;56805:25;;56844:20;56862:1;56844:20;:::i;:::-;56839:25;;56883:1;56873:35;;56888:18;;:::i;:::-;56873:35;56930:1;56927;56923:9;56918:14;;56753:185;;;;:::o;56944:176::-;56976:1;56993:20;57011:1;56993:20;:::i;:::-;56988:25;;57027:20;57045:1;57027:20;:::i;:::-;57022:25;;57066:1;57056:35;;57071:18;;:::i;:::-;57056:35;57112:1;57109;57105:9;57100:14;;56944:176;;;;:::o;57126:348::-;57166:7;57189:20;57207:1;57189:20;:::i;:::-;57184:25;;57223:20;57241:1;57223:20;:::i;:::-;57218:25;;57411:1;57343:66;57339:74;57336:1;57333:81;57328:1;57321:9;57314:17;57310:105;57307:131;;;57418:18;;:::i;:::-;57307:131;57466:1;57463;57459:9;57448:20;;57126:348;;;;:::o;57480:98::-;57531:6;57565:5;57559:12;57549:22;;57480:98;;;:::o;57584:168::-;57667:11;57701:6;57696:3;57689:19;57741:4;57736:3;57732:14;57717:29;;57584:168;;;;:::o;57758:360::-;57844:3;57872:38;57904:5;57872:38;:::i;:::-;57926:70;57989:6;57984:3;57926:70;:::i;:::-;57919:77;;58005:52;58050:6;58045:3;58038:4;58031:5;58027:16;58005:52;:::i;:::-;58082:29;58104:6;58082:29;:::i;:::-;58077:3;58073:39;58066:46;;57848:270;57758:360;;;;:::o;58124:640::-;58319:4;58357:3;58346:9;58342:19;58334:27;;58371:71;58439:1;58428:9;58424:17;58415:6;58371:71;:::i;:::-;58452:72;58520:2;58509:9;58505:18;58496:6;58452:72;:::i;:::-;58534;58602:2;58591:9;58587:18;58578:6;58534:72;:::i;:::-;58653:9;58647:4;58643:20;58638:2;58627:9;58623:18;58616:48;58681:76;58752:4;58743:6;58681:76;:::i;:::-;58673:84;;58124:640;;;;;;;:::o;58770:141::-;58826:5;58857:6;58851:13;58842:22;;58873:32;58899:5;58873:32;:::i;:::-;58770:141;;;;:::o;58917:349::-;58986:6;59035:2;59023:9;59014:7;59010:23;59006:32;59003:119;;;59041:79;;:::i;:::-;59003:119;59161:1;59186:63;59241:7;59232:6;59221:9;59217:22;59186:63;:::i;:::-;59176:73;;59132:127;58917:349;;;;:::o;59272:182::-;59412:34;59408:1;59400:6;59396:14;59389:58;59272:182;:::o;59460:366::-;59602:3;59623:67;59687:2;59682:3;59623:67;:::i;:::-;59616:74;;59699:93;59788:3;59699:93;:::i;:::-;59817:2;59812:3;59808:12;59801:19;;59460:366;;;:::o;59832:419::-;59998:4;60036:2;60025:9;60021:18;60013:26;;60085:9;60079:4;60075:20;60071:1;60060:9;60056:17;60049:47;60113:131;60239:4;60113:131;:::i;:::-;60105:139;;59832:419;;;:::o;60257:178::-;60397:30;60393:1;60385:6;60381:14;60374:54;60257:178;:::o;60441:366::-;60583:3;60604:67;60668:2;60663:3;60604:67;:::i;:::-;60597:74;;60680:93;60769:3;60680:93;:::i;:::-;60798:2;60793:3;60789:12;60782:19;;60441:366;;;:::o;60813:419::-;60979:4;61017:2;61006:9;61002:18;60994:26;;61066:9;61060:4;61056:20;61052:1;61041:9;61037:17;61030:47;61094:131;61220:4;61094:131;:::i;:::-;61086:139;;60813:419;;;:::o

Swarm Source

ipfs://42e6883daa5f03a382449f35f7161a36a471485ac75b99e08bb405b71089de97
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.