ETH Price: $2,909.78 (-10.22%)
Gas: 24 Gwei

Token

mferverse Chainfaces (MFCF)
 

Overview

Max Total Supply

120 MFCF

Holders

88

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 MFCF
0x454908004F88436F46eFAC5578b4984fE1375206
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:
MferverseChainfaces

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-13
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// 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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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/Address.sol


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

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

// 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/IERC721.sol


// OpenZeppelin Contracts (last updated v4.7.0) (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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev 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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/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/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.7.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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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 an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: SmartContractMetadata.sol



pragma solidity ^0.8.15;




interface IMetadataContract
{
    function tokenURI(uint token) external view returns(string memory);
}

abstract contract SmartContractMetadata is ERC721Enumerable, Ownable
{
    string public TokenURIPrefix;
    string public TokenURIPostfix;

    address public MetadataContractAddress;
    IMetadataContract _metadataContract;

    constructor(string memory tokenName, string memory tokenSymbol) ERC721(tokenName, tokenSymbol) Ownable()
    {
    }

    function setTokenURIParams(string memory prefix, string memory postfix) public onlyOwner
    {
        TokenURIPrefix = prefix;
        TokenURIPostfix = postfix;
    }

    function setMetadataContractAddress(address contractAddress) public onlyOwner
    {
        MetadataContractAddress = contractAddress;
        _metadataContract = IMetadataContract(MetadataContractAddress);
    }

    function externalTokenURI(uint token) public view returns(string memory)
    {
        return _metadataContract.tokenURI(token);
    }

    function tokenURI(uint token) public view override(ERC721) returns(string memory)
    {
        if (MetadataContractAddress == address(0x0))
        {
            return string(abi.encodePacked(TokenURIPrefix, Strings.toString(token), TokenURIPostfix));
        }
        else
        {
            return _metadataContract.tokenURI(token);
        }
    }
}
// File: Chainfaces.sol



pragma solidity ^0.8.15;



contract MferverseChainfaces is SmartContractMetadata
{
    uint public MaxTotalSupply = 10000;

    uint public MintPrice = 0.08 ether;
    uint public MaxPublicMintAmount = 20;
    uint public MaxPrivateMintAmount = 3;

    mapping(address => bool) ApprovedForPrivateSale;

    bool public PublicSaleOn;
    bool public PrivateSaleOn;

    modifier limitedSupply(uint amount)
    {
        require(amount > 0, "Should be minting at least one");
        require(totalSupply() + amount <= MaxTotalSupply, "Can't mint more than the collection size");
        _;
    }

    modifier costs(uint amount)
    {
        require(msg.value == amount*MintPrice, "Invalid eth amount");
        _;
    }

    constructor() SmartContractMetadata("mferverse Chainfaces", "MFCF")
    {
        setTokenURIParams("https://chainfaces-token-metadata.mferverse.com/", "");

        for (uint i = 0; i < 100;)
        {
            unchecked { ++i; }
            _mint(msg.sender, totalSupply() + 1);
        }
    }

    function setMintPrice(uint price) 
        public
        onlyOwner
    {
        MintPrice = price;
    }

    function setApprovedContract(address contractAddress, bool status) 
        public 
        onlyOwner
    {
        ApprovedForPrivateSale[contractAddress] = status;
    }

    function setPrivateSaleStatus(bool status) 
        public 
        onlyOwner
    {
        PrivateSaleOn = status;
    }

    function setPublicSaleStatus(bool status) 
        public 
        onlyOwner
    {
        PublicSaleOn = status;
    }

    function ownerMint(uint amount) 
        public 
        onlyOwner 
        limitedSupply(amount)
    {
        for (uint8 i = 0; i < amount;)
        {
            unchecked { ++i; }
            _mint(msg.sender, totalSupply() + 1);
        }
    }

    function publicMint(uint amount) 
        public 
        payable 
        limitedSupply(amount) 
        costs(amount)
    {
        require(PublicSaleOn, "Public Sale is not active");
        require(amount <= MaxPublicMintAmount, "Can't mint that many");
        
        for (uint8 i = 0; i < amount;)
        {
            unchecked { ++i; }
            _mint(msg.sender, totalSupply() + 1);
        }
    }

    function privateMint(address contractAddress, uint amount) 
        public 
        payable 
        limitedSupply(amount) 
        costs(amount)
    {
        require(ApprovedForPrivateSale[contractAddress], "Contract is not approved for private sale");
        require(IERC721(contractAddress).balanceOf(msg.sender) > 0, "Should be a holder");
        require(PrivateSaleOn, "Private Sale is not active");
        require(amount <= MaxPrivateMintAmount, "Can't mint that many");
        
        for (uint8 i = 0; i < amount;)
        {
            unchecked { ++i; }
            _mint(msg.sender, totalSupply() + 1);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MaxPrivateMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxPublicMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MetadataContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PrivateSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TokenURIPostfix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TokenURIPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"externalTokenURI","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":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":"address","name":"contractAddress","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setApprovedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setMetadataContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPrivateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"},{"internalType":"string","name":"postfix","type":"string"}],"name":"setTokenURIParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"token","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600f5567011c37937e080000601055601460115560036012553480156200002d57600080fd5b506040518060400160405280601481526020017f6d666572766572736520436861696e66616365730000000000000000000000008152506040518060400160405280600481526020017f4d4643460000000000000000000000000000000000000000000000000000000081525081818160009081620000ad919062000d51565b508060019081620000bf919062000d51565b505050620000e2620000d66200016d60201b60201c565b6200017560201b60201c565b50506200011e6040518060600160405280603081526020016200593960309139604051806020016040528060008152506200023b60201b60201c565b60005b6064811015620001665780600101905062000160336001620001486200027360201b60201c565b62000154919062000e67565b6200028060201b60201c565b62000121565b506200115c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200024b6200047960201b60201c565b81600b90816200025c919062000d51565b5080600c90816200026e919062000d51565b505050565b6000600880549050905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620002f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e99062000f25565b60405180910390fd5b62000303816200050a60201b60201c565b1562000346576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200033d9062000f97565b60405180910390fd5b6200035a600083836200057660201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620003ac919062000e67565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200047560008383620006bb60201b60201c565b5050565b620004896200016d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004af620006c060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000508576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ff9062001009565b60405180910390fd5b565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6200058e838383620006ea60201b62001b4c1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620005da57620005d481620006ef60201b60201c565b62000622565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000621576200062083826200073860201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200066e576200066881620008b560201b60201c565b620006b6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620006b557620006b482826200099160201b60201c565b5b5b505050565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001620007528462000a1d60201b620011451760201c565b6200075e91906200102b565b905060006007600084815260200190815260200160002054905081811462000844576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050620008cb91906200102b565b9050600060096000848152602001908152602001600020549050600060088381548110620008fe57620008fd62001066565b5b90600052602060002001549050806008838154811062000923576200092262001066565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000975576200097462001095565b5b6001900381819060005260206000200160009055905550505050565b6000620009a98362000a1d60201b620011451760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a87906200113a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b5957607f821691505b60208210810362000b6f5762000b6e62000b11565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000bd97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b9a565b62000be5868362000b9a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000c3262000c2c62000c268462000bfd565b62000c07565b62000bfd565b9050919050565b6000819050919050565b62000c4e8362000c11565b62000c6662000c5d8262000c39565b84845462000ba7565b825550505050565b600090565b62000c7d62000c6e565b62000c8a81848462000c43565b505050565b5b8181101562000cb25762000ca660008262000c73565b60018101905062000c90565b5050565b601f82111562000d015762000ccb8162000b75565b62000cd68462000b8a565b8101602085101562000ce6578190505b62000cfe62000cf58562000b8a565b83018262000c8f565b50505b505050565b600082821c905092915050565b600062000d266000198460080262000d06565b1980831691505092915050565b600062000d41838362000d13565b9150826002028217905092915050565b62000d5c8262000ad7565b67ffffffffffffffff81111562000d785762000d7762000ae2565b5b62000d84825462000b40565b62000d9182828562000cb6565b600060209050601f83116001811462000dc9576000841562000db4578287015190505b62000dc0858262000d33565b86555062000e30565b601f19841662000dd98662000b75565b60005b8281101562000e035784890151825560018201915060208501945060208101905062000ddc565b8683101562000e23578489015162000e1f601f89168262000d13565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000e748262000bfd565b915062000e818362000bfd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000eb95762000eb862000e38565b5b828201905092915050565b600082825260208201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600062000f0d60208362000ec4565b915062000f1a8262000ed5565b602082019050919050565b6000602082019050818103600083015262000f408162000efe565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062000f7f601c8362000ec4565b915062000f8c8262000f47565b602082019050919050565b6000602082019050818103600083015262000fb28162000f70565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000ff160208362000ec4565b915062000ffe8262000fb9565b602082019050919050565b60006020820190508181036000830152620010248162000fe2565b9050919050565b6000620010388262000bfd565b9150620010458362000bfd565b9250828210156200105b576200105a62000e38565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006200112260298362000ec4565b91506200112f82620010c4565b604082019050919050565b60006020820190508181036000830152620011558162001113565b9050919050565b6147cd806200116c6000396000f3fe6080604052600436106102255760003560e01c806395d89b4111610123578063c87b56dd116100ab578063eee029391161006f578063eee02939146107ff578063f19e75d41461083c578063f2fde38b14610865578063f4a0a5281461088e578063fdbf9ef2146108b757610225565b8063c87b56dd14610704578063d261585214610741578063da0f039d1461076c578063da1feb5d14610797578063e985e9c5146107c257610225565b8063ad7db94c116100f2578063ad7db94c14610640578063b423fe671461066b578063b88d4fde14610694578063be62b3c1146106bd578063c010ef48146106d957610225565b806395d89b41146105985780639d49393b146105c3578063a22cb465146105ee578063a80b06fd1461061757610225565b80632db11544116101b15780635ffd993b116101755780635ffd993b146104b35780636352211e146104dc57806370a0823114610519578063715018a6146105565780638da5cb5b1461056d57610225565b80632db11544146103cb5780632f745c59146103e757806342842e0e146104245780634d74d3b41461044d5780634f6ccce71461047657610225565b80631711862d116101f85780631711862d146102f857806318160ddd146103235780631b622aab1461034e57806323b872dd14610379578063287b038b146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612d88565b6108e2565b60405161025e9190612dd0565b60405180910390f35b34801561027357600080fd5b5061027c61095c565b6040516102899190612e84565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612edc565b6109ee565b6040516102c69190612f4a565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612f91565b610a34565b005b34801561030457600080fd5b5061030d610b4b565b60405161031a9190612f4a565b60405180910390f35b34801561032f57600080fd5b50610338610b71565b6040516103459190612fe0565b60405180910390f35b34801561035a57600080fd5b50610363610b7e565b6040516103709190612e84565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190612ffb565b610c0c565b005b3480156103ae57600080fd5b506103c960048036038101906103c4919061307a565b610c6c565b005b6103e560048036038101906103e09190612edc565b610c91565b005b3480156103f357600080fd5b5061040e60048036038101906104099190612f91565b610e4c565b60405161041b9190612fe0565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190612ffb565b610ef1565b005b34801561045957600080fd5b50610474600480360381019061046f91906130a7565b610f11565b005b34801561048257600080fd5b5061049d60048036038101906104989190612edc565b610fc0565b6040516104aa9190612fe0565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d591906130d4565b611031565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190612edc565b611094565b6040516105109190612f4a565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b91906130a7565b611145565b60405161054d9190612fe0565b60405180910390f35b34801561056257600080fd5b5061056b6111fc565b005b34801561057957600080fd5b50610582611210565b60405161058f9190612f4a565b60405180910390f35b3480156105a457600080fd5b506105ad61123a565b6040516105ba9190612e84565b60405180910390f35b3480156105cf57600080fd5b506105d86112cc565b6040516105e59190612e84565b60405180910390f35b3480156105fa57600080fd5b50610615600480360381019061061091906130d4565b61135a565b005b34801561062357600080fd5b5061063e60048036038101906106399190613249565b611370565b005b34801561064c57600080fd5b5061065561139c565b6040516106629190612fe0565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d919061307a565b6113a2565b005b3480156106a057600080fd5b506106bb60048036038101906106b69190613362565b6113c7565b005b6106d760048036038101906106d29190612f91565b611429565b005b3480156106e557600080fd5b506106ee61172d565b6040516106fb9190612dd0565b60405180910390f35b34801561071057600080fd5b5061072b60048036038101906107269190612edc565b611740565b6040516107389190612e84565b60405180910390f35b34801561074d57600080fd5b50610756611876565b6040516107639190612fe0565b60405180910390f35b34801561077857600080fd5b5061078161187c565b60405161078e9190612fe0565b60405180910390f35b3480156107a357600080fd5b506107ac611882565b6040516107b99190612dd0565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e491906133e5565b611895565b6040516107f69190612dd0565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190612edc565b611929565b6040516108339190612e84565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190612edc565b6119d3565b005b34801561087157600080fd5b5061088c600480360381019061088791906130a7565b611ab1565b005b34801561089a57600080fd5b506108b560048036038101906108b09190612edc565b611b34565b005b3480156108c357600080fd5b506108cc611b46565b6040516108d99190612fe0565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610955575061095482611b51565b5b9050919050565b60606000805461096b90613454565b80601f016020809104026020016040519081016040528092919081815260200182805461099790613454565b80156109e45780601f106109b9576101008083540402835291602001916109e4565b820191906000526020600020905b8154815290600101906020018083116109c757829003601f168201915b5050505050905090565b60006109f982611c33565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3f82611094565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa6906134f7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ace611c7e565b73ffffffffffffffffffffffffffffffffffffffff161480610afd5750610afc81610af7611c7e565b611895565b5b610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613589565b60405180910390fd5b610b468383611c86565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b600c8054610b8b90613454565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb790613454565b8015610c045780601f10610bd957610100808354040283529160200191610c04565b820191906000526020600020905b815481529060010190602001808311610be757829003601f168201915b505050505081565b610c1d610c17611c7e565b82611d3f565b610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c539061361b565b60405180910390fd5b610c67838383611dd4565b505050565b610c7461203a565b80601460016101000a81548160ff02191690831515021790555050565b8060008111610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90613687565b60405180910390fd5b600f5481610ce1610b71565b610ceb91906136d6565b1115610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d239061379e565b60405180910390fd5b8160105481610d3b91906137be565b3414610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7390613864565b60405180910390fd5b601460009054906101000a900460ff16610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc2906138d0565b60405180910390fd5b601154831115610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e079061393c565b60405180910390fd5b60005b838160ff161015610e4657806001019050610e41336001610e32610b71565b610e3c91906136d6565b6120b8565b610e13565b50505050565b6000610e5783611145565b8210610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f906139ce565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f0c838383604051806020016040528060008152506113c7565b505050565b610f1961203a565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610fca610b71565b821061100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290613a60565b60405180910390fd5b6008828154811061101f5761101e613a80565b5b90600052602060002001549050919050565b61103961203a565b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390613afb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90613b8d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61120461203a565b61120e6000612291565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461124990613454565b80601f016020809104026020016040519081016040528092919081815260200182805461127590613454565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b600b80546112d990613454565b80601f016020809104026020016040519081016040528092919081815260200182805461130590613454565b80156113525780601f1061132757610100808354040283529160200191611352565b820191906000526020600020905b81548152906001019060200180831161133557829003601f168201915b505050505081565b61136c611365611c7e565b8383612357565b5050565b61137861203a565b81600b90816113879190613d59565b5080600c90816113979190613d59565b505050565b60115481565b6113aa61203a565b80601460006101000a81548160ff02191690831515021790555050565b6113d86113d2611c7e565b83611d3f565b611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e9061361b565b60405180910390fd5b611423848484846124c3565b50505050565b806000811161146d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146490613687565b60405180910390fd5b600f5481611479610b71565b61148391906136d6565b11156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb9061379e565b60405180910390fd5b81601054816114d391906137be565b3414611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b90613864565b60405180910390fd5b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790613e9d565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016115db9190612f4a565b602060405180830381865afa1580156115f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161c9190613ed2565b1161165c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165390613f4b565b60405180910390fd5b601460019054906101000a900460ff166116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290613fb7565b60405180910390fd5b6012548311156116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e79061393c565b60405180910390fd5b60005b838160ff16101561172657806001019050611721336001611712610b71565b61171c91906136d6565b6120b8565b6116f3565b5050505050565b601460009054906101000a900460ff1681565b6060600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036117cd57600b6117a38361251f565b600c6040516020016117b793929190614096565b6040516020818303038152906040529050611871565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016118289190612fe0565b600060405180830381865afa158015611845573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061186e9190614137565b90505b919050565b60125481565b600f5481565b601460019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016119869190612fe0565b600060405180830381865afa1580156119a3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119cc9190614137565b9050919050565b6119db61203a565b8060008111611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1690613687565b60405180910390fd5b600f5481611a2b610b71565b611a3591906136d6565b1115611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d9061379e565b60405180910390fd5b60005b828160ff161015611aac57806001019050611aa7336001611a98610b71565b611aa291906136d6565b6120b8565b611a79565b505050565b611ab961203a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1f906141f2565b60405180910390fd5b611b3181612291565b50565b611b3c61203a565b8060108190555050565b60105481565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c1c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c2c5750611c2b8261267f565b5b9050919050565b611c3c816126e9565b611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290613afb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cf983611094565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611d4b83611094565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d8d5750611d8c8185611895565b5b80611dcb57508373ffffffffffffffffffffffffffffffffffffffff16611db3846109ee565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611df482611094565b73ffffffffffffffffffffffffffffffffffffffff1614611e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4190614284565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090614316565b60405180910390fd5b611ec4838383612755565b611ecf600082611c86565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f1f9190614336565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f7691906136d6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612035838383612867565b505050565b612042611c7e565b73ffffffffffffffffffffffffffffffffffffffff16612060611210565b73ffffffffffffffffffffffffffffffffffffffff16146120b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ad906143b6565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e90614422565b60405180910390fd5b612130816126e9565b15612170576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121679061448e565b60405180910390fd5b61217c60008383612755565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121cc91906136d6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461228d60008383612867565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc906144fa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124b69190612dd0565b60405180910390a3505050565b6124ce848484611dd4565b6124da8484848461286c565b612519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125109061458c565b60405180910390fd5b50505050565b606060008203612566576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061267a565b600082905060005b60008214612598578080612581906145ac565b915050600a826125919190614623565b915061256e565b60008167ffffffffffffffff8111156125b4576125b361311e565b5b6040519080825280601f01601f1916602001820160405280156125e65781602001600182028036833780820191505090505b5090505b60008514612673576001826125ff9190614336565b9150600a8561260e9190614654565b603061261a91906136d6565b60f81b8183815181106126305761262f613a80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561266c9190614623565b94506125ea565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612760838383611b4c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127a25761279d816129f3565b6127e1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146127e0576127df8382612a3c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128235761281e81612ba9565b612862565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612861576128608282612c7a565b5b5b505050565b505050565b600061288d8473ffffffffffffffffffffffffffffffffffffffff16612cf9565b156129e6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128b6611c7e565b8786866040518563ffffffff1660e01b81526004016128d894939291906146da565b6020604051808303816000875af192505050801561291457506040513d601f19601f82011682018060405250810190612911919061473b565b60015b612996573d8060008114612944576040519150601f19603f3d011682016040523d82523d6000602084013e612949565b606091505b50600081510361298e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129859061458c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129eb565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a4984611145565b612a539190614336565b9050600060076000848152602001908152602001600020549050818114612b38576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bbd9190614336565b9050600060096000848152602001908152602001600020549050600060088381548110612bed57612bec613a80565b5b906000526020600020015490508060088381548110612c0f57612c0e613a80565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c5e57612c5d614768565b5b6001900381819060005260206000200160009055905550505050565b6000612c8583611145565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d6581612d30565b8114612d7057600080fd5b50565b600081359050612d8281612d5c565b92915050565b600060208284031215612d9e57612d9d612d26565b5b6000612dac84828501612d73565b91505092915050565b60008115159050919050565b612dca81612db5565b82525050565b6000602082019050612de56000830184612dc1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e25578082015181840152602081019050612e0a565b83811115612e34576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e5682612deb565b612e608185612df6565b9350612e70818560208601612e07565b612e7981612e3a565b840191505092915050565b60006020820190508181036000830152612e9e8184612e4b565b905092915050565b6000819050919050565b612eb981612ea6565b8114612ec457600080fd5b50565b600081359050612ed681612eb0565b92915050565b600060208284031215612ef257612ef1612d26565b5b6000612f0084828501612ec7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f3482612f09565b9050919050565b612f4481612f29565b82525050565b6000602082019050612f5f6000830184612f3b565b92915050565b612f6e81612f29565b8114612f7957600080fd5b50565b600081359050612f8b81612f65565b92915050565b60008060408385031215612fa857612fa7612d26565b5b6000612fb685828601612f7c565b9250506020612fc785828601612ec7565b9150509250929050565b612fda81612ea6565b82525050565b6000602082019050612ff56000830184612fd1565b92915050565b60008060006060848603121561301457613013612d26565b5b600061302286828701612f7c565b935050602061303386828701612f7c565b925050604061304486828701612ec7565b9150509250925092565b61305781612db5565b811461306257600080fd5b50565b6000813590506130748161304e565b92915050565b6000602082840312156130905761308f612d26565b5b600061309e84828501613065565b91505092915050565b6000602082840312156130bd576130bc612d26565b5b60006130cb84828501612f7c565b91505092915050565b600080604083850312156130eb576130ea612d26565b5b60006130f985828601612f7c565b925050602061310a85828601613065565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61315682612e3a565b810181811067ffffffffffffffff821117156131755761317461311e565b5b80604052505050565b6000613188612d1c565b9050613194828261314d565b919050565b600067ffffffffffffffff8211156131b4576131b361311e565b5b6131bd82612e3a565b9050602081019050919050565b82818337600083830152505050565b60006131ec6131e784613199565b61317e565b90508281526020810184848401111561320857613207613119565b5b6132138482856131ca565b509392505050565b600082601f8301126132305761322f613114565b5b81356132408482602086016131d9565b91505092915050565b600080604083850312156132605761325f612d26565b5b600083013567ffffffffffffffff81111561327e5761327d612d2b565b5b61328a8582860161321b565b925050602083013567ffffffffffffffff8111156132ab576132aa612d2b565b5b6132b78582860161321b565b9150509250929050565b600067ffffffffffffffff8211156132dc576132db61311e565b5b6132e582612e3a565b9050602081019050919050565b6000613305613300846132c1565b61317e565b90508281526020810184848401111561332157613320613119565b5b61332c8482856131ca565b509392505050565b600082601f83011261334957613348613114565b5b81356133598482602086016132f2565b91505092915050565b6000806000806080858703121561337c5761337b612d26565b5b600061338a87828801612f7c565b945050602061339b87828801612f7c565b93505060406133ac87828801612ec7565b925050606085013567ffffffffffffffff8111156133cd576133cc612d2b565b5b6133d987828801613334565b91505092959194509250565b600080604083850312156133fc576133fb612d26565b5b600061340a85828601612f7c565b925050602061341b85828601612f7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061346c57607f821691505b60208210810361347f5761347e613425565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134e1602183612df6565b91506134ec82613485565b604082019050919050565b60006020820190508181036000830152613510816134d4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613573603e83612df6565b915061357e82613517565b604082019050919050565b600060208201905081810360008301526135a281613566565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613605602e83612df6565b9150613610826135a9565b604082019050919050565b60006020820190508181036000830152613634816135f8565b9050919050565b7f53686f756c64206265206d696e74696e67206174206c65617374206f6e650000600082015250565b6000613671601e83612df6565b915061367c8261363b565b602082019050919050565b600060208201905081810360008301526136a081613664565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136e182612ea6565b91506136ec83612ea6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613721576137206136a7565b5b828201905092915050565b7f43616e2774206d696e74206d6f7265207468616e2074686520636f6c6c65637460008201527f696f6e2073697a65000000000000000000000000000000000000000000000000602082015250565b6000613788602883612df6565b91506137938261372c565b604082019050919050565b600060208201905081810360008301526137b78161377b565b9050919050565b60006137c982612ea6565b91506137d483612ea6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561380d5761380c6136a7565b5b828202905092915050565b7f496e76616c69642065746820616d6f756e740000000000000000000000000000600082015250565b600061384e601283612df6565b915061385982613818565b602082019050919050565b6000602082019050818103600083015261387d81613841565b9050919050565b7f5075626c69632053616c65206973206e6f742061637469766500000000000000600082015250565b60006138ba601983612df6565b91506138c582613884565b602082019050919050565b600060208201905081810360008301526138e9816138ad565b9050919050565b7f43616e2774206d696e742074686174206d616e79000000000000000000000000600082015250565b6000613926601483612df6565b9150613931826138f0565b602082019050919050565b6000602082019050818103600083015261395581613919565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006139b8602b83612df6565b91506139c38261395c565b604082019050919050565b600060208201905081810360008301526139e7816139ab565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613a4a602c83612df6565b9150613a55826139ee565b604082019050919050565b60006020820190508181036000830152613a7981613a3d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ae5601883612df6565b9150613af082613aaf565b602082019050919050565b60006020820190508181036000830152613b1481613ad8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b77602983612df6565b9150613b8282613b1b565b604082019050919050565b60006020820190508181036000830152613ba681613b6a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613c0f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613bd2565b613c198683613bd2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c56613c51613c4c84612ea6565b613c31565b612ea6565b9050919050565b6000819050919050565b613c7083613c3b565b613c84613c7c82613c5d565b848454613bdf565b825550505050565b600090565b613c99613c8c565b613ca4818484613c67565b505050565b5b81811015613cc857613cbd600082613c91565b600181019050613caa565b5050565b601f821115613d0d57613cde81613bad565b613ce784613bc2565b81016020851015613cf6578190505b613d0a613d0285613bc2565b830182613ca9565b50505b505050565b600082821c905092915050565b6000613d3060001984600802613d12565b1980831691505092915050565b6000613d498383613d1f565b9150826002028217905092915050565b613d6282612deb565b67ffffffffffffffff811115613d7b57613d7a61311e565b5b613d858254613454565b613d90828285613ccc565b600060209050601f831160018114613dc35760008415613db1578287015190505b613dbb8582613d3d565b865550613e23565b601f198416613dd186613bad565b60005b82811015613df957848901518255600182019150602085019450602081019050613dd4565b86831015613e165784890151613e12601f891682613d1f565b8355505b6001600288020188555050505b505050505050565b7f436f6e7472616374206973206e6f7420617070726f76656420666f722070726960008201527f766174652073616c650000000000000000000000000000000000000000000000602082015250565b6000613e87602983612df6565b9150613e9282613e2b565b604082019050919050565b60006020820190508181036000830152613eb681613e7a565b9050919050565b600081519050613ecc81612eb0565b92915050565b600060208284031215613ee857613ee7612d26565b5b6000613ef684828501613ebd565b91505092915050565b7f53686f756c64206265206120686f6c6465720000000000000000000000000000600082015250565b6000613f35601283612df6565b9150613f4082613eff565b602082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f507269766174652053616c65206973206e6f7420616374697665000000000000600082015250565b6000613fa1601a83612df6565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b600081905092915050565b60008154613fef81613454565b613ff98186613fd7565b9450600182166000811461401457600181146140295761405c565b60ff198316865281151582028601935061405c565b61403285613bad565b60005b8381101561405457815481890152600182019150602081019050614035565b838801955050505b50505092915050565b600061407082612deb565b61407a8185613fd7565b935061408a818560208601612e07565b80840191505092915050565b60006140a28286613fe2565b91506140ae8285614065565b91506140ba8284613fe2565b9150819050949350505050565b60006140da6140d584613199565b61317e565b9050828152602081018484840111156140f6576140f5613119565b5b614101848285612e07565b509392505050565b600082601f83011261411e5761411d613114565b5b815161412e8482602086016140c7565b91505092915050565b60006020828403121561414d5761414c612d26565b5b600082015167ffffffffffffffff81111561416b5761416a612d2b565b5b61417784828501614109565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141dc602683612df6565b91506141e782614180565b604082019050919050565b6000602082019050818103600083015261420b816141cf565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061426e602583612df6565b915061427982614212565b604082019050919050565b6000602082019050818103600083015261429d81614261565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614300602483612df6565b915061430b826142a4565b604082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b600061434182612ea6565b915061434c83612ea6565b92508282101561435f5761435e6136a7565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143a0602083612df6565b91506143ab8261436a565b602082019050919050565b600060208201905081810360008301526143cf81614393565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061440c602083612df6565b9150614417826143d6565b602082019050919050565b6000602082019050818103600083015261443b816143ff565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614478601c83612df6565b915061448382614442565b602082019050919050565b600060208201905081810360008301526144a78161446b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006144e4601983612df6565b91506144ef826144ae565b602082019050919050565b60006020820190508181036000830152614513816144d7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614576603283612df6565b91506145818261451a565b604082019050919050565b600060208201905081810360008301526145a581614569565b9050919050565b60006145b782612ea6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145e9576145e86136a7565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061462e82612ea6565b915061463983612ea6565b925082614649576146486145f4565b5b828204905092915050565b600061465f82612ea6565b915061466a83612ea6565b92508261467a576146796145f4565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006146ac82614685565b6146b68185614690565b93506146c6818560208601612e07565b6146cf81612e3a565b840191505092915050565b60006080820190506146ef6000830187612f3b565b6146fc6020830186612f3b565b6147096040830185612fd1565b818103606083015261471b81846146a1565b905095945050505050565b60008151905061473581612d5c565b92915050565b60006020828403121561475157614750612d26565b5b600061475f84828501614726565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212200309dea27eb8fb725ecf1f8fc21222207c84a90a6148bb5c63b2590538663a3164736f6c634300080f003368747470733a2f2f636861696e66616365732d746f6b656e2d6d657461646174612e6d66657276657273652e636f6d2f

Deployed Bytecode

0x6080604052600436106102255760003560e01c806395d89b4111610123578063c87b56dd116100ab578063eee029391161006f578063eee02939146107ff578063f19e75d41461083c578063f2fde38b14610865578063f4a0a5281461088e578063fdbf9ef2146108b757610225565b8063c87b56dd14610704578063d261585214610741578063da0f039d1461076c578063da1feb5d14610797578063e985e9c5146107c257610225565b8063ad7db94c116100f2578063ad7db94c14610640578063b423fe671461066b578063b88d4fde14610694578063be62b3c1146106bd578063c010ef48146106d957610225565b806395d89b41146105985780639d49393b146105c3578063a22cb465146105ee578063a80b06fd1461061757610225565b80632db11544116101b15780635ffd993b116101755780635ffd993b146104b35780636352211e146104dc57806370a0823114610519578063715018a6146105565780638da5cb5b1461056d57610225565b80632db11544146103cb5780632f745c59146103e757806342842e0e146104245780634d74d3b41461044d5780634f6ccce71461047657610225565b80631711862d116101f85780631711862d146102f857806318160ddd146103235780631b622aab1461034e57806323b872dd14610379578063287b038b146103a257610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612d88565b6108e2565b60405161025e9190612dd0565b60405180910390f35b34801561027357600080fd5b5061027c61095c565b6040516102899190612e84565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612edc565b6109ee565b6040516102c69190612f4a565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612f91565b610a34565b005b34801561030457600080fd5b5061030d610b4b565b60405161031a9190612f4a565b60405180910390f35b34801561032f57600080fd5b50610338610b71565b6040516103459190612fe0565b60405180910390f35b34801561035a57600080fd5b50610363610b7e565b6040516103709190612e84565b60405180910390f35b34801561038557600080fd5b506103a0600480360381019061039b9190612ffb565b610c0c565b005b3480156103ae57600080fd5b506103c960048036038101906103c4919061307a565b610c6c565b005b6103e560048036038101906103e09190612edc565b610c91565b005b3480156103f357600080fd5b5061040e60048036038101906104099190612f91565b610e4c565b60405161041b9190612fe0565b60405180910390f35b34801561043057600080fd5b5061044b60048036038101906104469190612ffb565b610ef1565b005b34801561045957600080fd5b50610474600480360381019061046f91906130a7565b610f11565b005b34801561048257600080fd5b5061049d60048036038101906104989190612edc565b610fc0565b6040516104aa9190612fe0565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d591906130d4565b611031565b005b3480156104e857600080fd5b5061050360048036038101906104fe9190612edc565b611094565b6040516105109190612f4a565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b91906130a7565b611145565b60405161054d9190612fe0565b60405180910390f35b34801561056257600080fd5b5061056b6111fc565b005b34801561057957600080fd5b50610582611210565b60405161058f9190612f4a565b60405180910390f35b3480156105a457600080fd5b506105ad61123a565b6040516105ba9190612e84565b60405180910390f35b3480156105cf57600080fd5b506105d86112cc565b6040516105e59190612e84565b60405180910390f35b3480156105fa57600080fd5b50610615600480360381019061061091906130d4565b61135a565b005b34801561062357600080fd5b5061063e60048036038101906106399190613249565b611370565b005b34801561064c57600080fd5b5061065561139c565b6040516106629190612fe0565b60405180910390f35b34801561067757600080fd5b50610692600480360381019061068d919061307a565b6113a2565b005b3480156106a057600080fd5b506106bb60048036038101906106b69190613362565b6113c7565b005b6106d760048036038101906106d29190612f91565b611429565b005b3480156106e557600080fd5b506106ee61172d565b6040516106fb9190612dd0565b60405180910390f35b34801561071057600080fd5b5061072b60048036038101906107269190612edc565b611740565b6040516107389190612e84565b60405180910390f35b34801561074d57600080fd5b50610756611876565b6040516107639190612fe0565b60405180910390f35b34801561077857600080fd5b5061078161187c565b60405161078e9190612fe0565b60405180910390f35b3480156107a357600080fd5b506107ac611882565b6040516107b99190612dd0565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e491906133e5565b611895565b6040516107f69190612dd0565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190612edc565b611929565b6040516108339190612e84565b60405180910390f35b34801561084857600080fd5b50610863600480360381019061085e9190612edc565b6119d3565b005b34801561087157600080fd5b5061088c600480360381019061088791906130a7565b611ab1565b005b34801561089a57600080fd5b506108b560048036038101906108b09190612edc565b611b34565b005b3480156108c357600080fd5b506108cc611b46565b6040516108d99190612fe0565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610955575061095482611b51565b5b9050919050565b60606000805461096b90613454565b80601f016020809104026020016040519081016040528092919081815260200182805461099790613454565b80156109e45780601f106109b9576101008083540402835291602001916109e4565b820191906000526020600020905b8154815290600101906020018083116109c757829003601f168201915b5050505050905090565b60006109f982611c33565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3f82611094565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa6906134f7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ace611c7e565b73ffffffffffffffffffffffffffffffffffffffff161480610afd5750610afc81610af7611c7e565b611895565b5b610b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3390613589565b60405180910390fd5b610b468383611c86565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600880549050905090565b600c8054610b8b90613454565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb790613454565b8015610c045780601f10610bd957610100808354040283529160200191610c04565b820191906000526020600020905b815481529060010190602001808311610be757829003601f168201915b505050505081565b610c1d610c17611c7e565b82611d3f565b610c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c539061361b565b60405180910390fd5b610c67838383611dd4565b505050565b610c7461203a565b80601460016101000a81548160ff02191690831515021790555050565b8060008111610cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccc90613687565b60405180910390fd5b600f5481610ce1610b71565b610ceb91906136d6565b1115610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d239061379e565b60405180910390fd5b8160105481610d3b91906137be565b3414610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7390613864565b60405180910390fd5b601460009054906101000a900460ff16610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc2906138d0565b60405180910390fd5b601154831115610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e079061393c565b60405180910390fd5b60005b838160ff161015610e4657806001019050610e41336001610e32610b71565b610e3c91906136d6565b6120b8565b610e13565b50505050565b6000610e5783611145565b8210610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f906139ce565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f0c838383604051806020016040528060008152506113c7565b505050565b610f1961203a565b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610fca610b71565b821061100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290613a60565b60405180910390fd5b6008828154811061101f5761101e613a80565b5b90600052602060002001549050919050565b61103961203a565b80601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390613afb565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ac90613b8d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61120461203a565b61120e6000612291565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461124990613454565b80601f016020809104026020016040519081016040528092919081815260200182805461127590613454565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b600b80546112d990613454565b80601f016020809104026020016040519081016040528092919081815260200182805461130590613454565b80156113525780601f1061132757610100808354040283529160200191611352565b820191906000526020600020905b81548152906001019060200180831161133557829003601f168201915b505050505081565b61136c611365611c7e565b8383612357565b5050565b61137861203a565b81600b90816113879190613d59565b5080600c90816113979190613d59565b505050565b60115481565b6113aa61203a565b80601460006101000a81548160ff02191690831515021790555050565b6113d86113d2611c7e565b83611d3f565b611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e9061361b565b60405180910390fd5b611423848484846124c3565b50505050565b806000811161146d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146490613687565b60405180910390fd5b600f5481611479610b71565b61148391906136d6565b11156114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bb9061379e565b60405180910390fd5b81601054816114d391906137be565b3414611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b90613864565b60405180910390fd5b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159790613e9d565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016115db9190612f4a565b602060405180830381865afa1580156115f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161c9190613ed2565b1161165c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165390613f4b565b60405180910390fd5b601460019054906101000a900460ff166116ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a290613fb7565b60405180910390fd5b6012548311156116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e79061393c565b60405180910390fd5b60005b838160ff16101561172657806001019050611721336001611712610b71565b61171c91906136d6565b6120b8565b6116f3565b5050505050565b601460009054906101000a900460ff1681565b6060600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036117cd57600b6117a38361251f565b600c6040516020016117b793929190614096565b6040516020818303038152906040529050611871565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016118289190612fe0565b600060405180830381865afa158015611845573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061186e9190614137565b90505b919050565b60125481565b600f5481565b601460019054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016119869190612fe0565b600060405180830381865afa1580156119a3573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906119cc9190614137565b9050919050565b6119db61203a565b8060008111611a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1690613687565b60405180910390fd5b600f5481611a2b610b71565b611a3591906136d6565b1115611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d9061379e565b60405180910390fd5b60005b828160ff161015611aac57806001019050611aa7336001611a98610b71565b611aa291906136d6565b6120b8565b611a79565b505050565b611ab961203a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1f906141f2565b60405180910390fd5b611b3181612291565b50565b611b3c61203a565b8060108190555050565b60105481565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c1c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c2c5750611c2b8261267f565b5b9050919050565b611c3c816126e9565b611c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7290613afb565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611cf983611094565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611d4b83611094565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d8d5750611d8c8185611895565b5b80611dcb57508373ffffffffffffffffffffffffffffffffffffffff16611db3846109ee565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611df482611094565b73ffffffffffffffffffffffffffffffffffffffff1614611e4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4190614284565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb090614316565b60405180910390fd5b611ec4838383612755565b611ecf600082611c86565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f1f9190614336565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f7691906136d6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612035838383612867565b505050565b612042611c7e565b73ffffffffffffffffffffffffffffffffffffffff16612060611210565b73ffffffffffffffffffffffffffffffffffffffff16146120b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ad906143b6565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e90614422565b60405180910390fd5b612130816126e9565b15612170576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121679061448e565b60405180910390fd5b61217c60008383612755565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121cc91906136d6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461228d60008383612867565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bc906144fa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124b69190612dd0565b60405180910390a3505050565b6124ce848484611dd4565b6124da8484848461286c565b612519576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125109061458c565b60405180910390fd5b50505050565b606060008203612566576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061267a565b600082905060005b60008214612598578080612581906145ac565b915050600a826125919190614623565b915061256e565b60008167ffffffffffffffff8111156125b4576125b361311e565b5b6040519080825280601f01601f1916602001820160405280156125e65781602001600182028036833780820191505090505b5090505b60008514612673576001826125ff9190614336565b9150600a8561260e9190614654565b603061261a91906136d6565b60f81b8183815181106126305761262f613a80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561266c9190614623565b94506125ea565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612760838383611b4c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127a25761279d816129f3565b6127e1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146127e0576127df8382612a3c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036128235761281e81612ba9565b612862565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612861576128608282612c7a565b5b5b505050565b505050565b600061288d8473ffffffffffffffffffffffffffffffffffffffff16612cf9565b156129e6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128b6611c7e565b8786866040518563ffffffff1660e01b81526004016128d894939291906146da565b6020604051808303816000875af192505050801561291457506040513d601f19601f82011682018060405250810190612911919061473b565b60015b612996573d8060008114612944576040519150601f19603f3d011682016040523d82523d6000602084013e612949565b606091505b50600081510361298e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129859061458c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129eb565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a4984611145565b612a539190614336565b9050600060076000848152602001908152602001600020549050818114612b38576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bbd9190614336565b9050600060096000848152602001908152602001600020549050600060088381548110612bed57612bec613a80565b5b906000526020600020015490508060088381548110612c0f57612c0e613a80565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c5e57612c5d614768565b5b6001900381819060005260206000200160009055905550505050565b6000612c8583611145565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d6581612d30565b8114612d7057600080fd5b50565b600081359050612d8281612d5c565b92915050565b600060208284031215612d9e57612d9d612d26565b5b6000612dac84828501612d73565b91505092915050565b60008115159050919050565b612dca81612db5565b82525050565b6000602082019050612de56000830184612dc1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e25578082015181840152602081019050612e0a565b83811115612e34576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e5682612deb565b612e608185612df6565b9350612e70818560208601612e07565b612e7981612e3a565b840191505092915050565b60006020820190508181036000830152612e9e8184612e4b565b905092915050565b6000819050919050565b612eb981612ea6565b8114612ec457600080fd5b50565b600081359050612ed681612eb0565b92915050565b600060208284031215612ef257612ef1612d26565b5b6000612f0084828501612ec7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f3482612f09565b9050919050565b612f4481612f29565b82525050565b6000602082019050612f5f6000830184612f3b565b92915050565b612f6e81612f29565b8114612f7957600080fd5b50565b600081359050612f8b81612f65565b92915050565b60008060408385031215612fa857612fa7612d26565b5b6000612fb685828601612f7c565b9250506020612fc785828601612ec7565b9150509250929050565b612fda81612ea6565b82525050565b6000602082019050612ff56000830184612fd1565b92915050565b60008060006060848603121561301457613013612d26565b5b600061302286828701612f7c565b935050602061303386828701612f7c565b925050604061304486828701612ec7565b9150509250925092565b61305781612db5565b811461306257600080fd5b50565b6000813590506130748161304e565b92915050565b6000602082840312156130905761308f612d26565b5b600061309e84828501613065565b91505092915050565b6000602082840312156130bd576130bc612d26565b5b60006130cb84828501612f7c565b91505092915050565b600080604083850312156130eb576130ea612d26565b5b60006130f985828601612f7c565b925050602061310a85828601613065565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61315682612e3a565b810181811067ffffffffffffffff821117156131755761317461311e565b5b80604052505050565b6000613188612d1c565b9050613194828261314d565b919050565b600067ffffffffffffffff8211156131b4576131b361311e565b5b6131bd82612e3a565b9050602081019050919050565b82818337600083830152505050565b60006131ec6131e784613199565b61317e565b90508281526020810184848401111561320857613207613119565b5b6132138482856131ca565b509392505050565b600082601f8301126132305761322f613114565b5b81356132408482602086016131d9565b91505092915050565b600080604083850312156132605761325f612d26565b5b600083013567ffffffffffffffff81111561327e5761327d612d2b565b5b61328a8582860161321b565b925050602083013567ffffffffffffffff8111156132ab576132aa612d2b565b5b6132b78582860161321b565b9150509250929050565b600067ffffffffffffffff8211156132dc576132db61311e565b5b6132e582612e3a565b9050602081019050919050565b6000613305613300846132c1565b61317e565b90508281526020810184848401111561332157613320613119565b5b61332c8482856131ca565b509392505050565b600082601f83011261334957613348613114565b5b81356133598482602086016132f2565b91505092915050565b6000806000806080858703121561337c5761337b612d26565b5b600061338a87828801612f7c565b945050602061339b87828801612f7c565b93505060406133ac87828801612ec7565b925050606085013567ffffffffffffffff8111156133cd576133cc612d2b565b5b6133d987828801613334565b91505092959194509250565b600080604083850312156133fc576133fb612d26565b5b600061340a85828601612f7c565b925050602061341b85828601612f7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061346c57607f821691505b60208210810361347f5761347e613425565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006134e1602183612df6565b91506134ec82613485565b604082019050919050565b60006020820190508181036000830152613510816134d4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613573603e83612df6565b915061357e82613517565b604082019050919050565b600060208201905081810360008301526135a281613566565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613605602e83612df6565b9150613610826135a9565b604082019050919050565b60006020820190508181036000830152613634816135f8565b9050919050565b7f53686f756c64206265206d696e74696e67206174206c65617374206f6e650000600082015250565b6000613671601e83612df6565b915061367c8261363b565b602082019050919050565b600060208201905081810360008301526136a081613664565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136e182612ea6565b91506136ec83612ea6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613721576137206136a7565b5b828201905092915050565b7f43616e2774206d696e74206d6f7265207468616e2074686520636f6c6c65637460008201527f696f6e2073697a65000000000000000000000000000000000000000000000000602082015250565b6000613788602883612df6565b91506137938261372c565b604082019050919050565b600060208201905081810360008301526137b78161377b565b9050919050565b60006137c982612ea6565b91506137d483612ea6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561380d5761380c6136a7565b5b828202905092915050565b7f496e76616c69642065746820616d6f756e740000000000000000000000000000600082015250565b600061384e601283612df6565b915061385982613818565b602082019050919050565b6000602082019050818103600083015261387d81613841565b9050919050565b7f5075626c69632053616c65206973206e6f742061637469766500000000000000600082015250565b60006138ba601983612df6565b91506138c582613884565b602082019050919050565b600060208201905081810360008301526138e9816138ad565b9050919050565b7f43616e2774206d696e742074686174206d616e79000000000000000000000000600082015250565b6000613926601483612df6565b9150613931826138f0565b602082019050919050565b6000602082019050818103600083015261395581613919565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006139b8602b83612df6565b91506139c38261395c565b604082019050919050565b600060208201905081810360008301526139e7816139ab565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613a4a602c83612df6565b9150613a55826139ee565b604082019050919050565b60006020820190508181036000830152613a7981613a3d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ae5601883612df6565b9150613af082613aaf565b602082019050919050565b60006020820190508181036000830152613b1481613ad8565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b77602983612df6565b9150613b8282613b1b565b604082019050919050565b60006020820190508181036000830152613ba681613b6a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613c0f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613bd2565b613c198683613bd2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613c56613c51613c4c84612ea6565b613c31565b612ea6565b9050919050565b6000819050919050565b613c7083613c3b565b613c84613c7c82613c5d565b848454613bdf565b825550505050565b600090565b613c99613c8c565b613ca4818484613c67565b505050565b5b81811015613cc857613cbd600082613c91565b600181019050613caa565b5050565b601f821115613d0d57613cde81613bad565b613ce784613bc2565b81016020851015613cf6578190505b613d0a613d0285613bc2565b830182613ca9565b50505b505050565b600082821c905092915050565b6000613d3060001984600802613d12565b1980831691505092915050565b6000613d498383613d1f565b9150826002028217905092915050565b613d6282612deb565b67ffffffffffffffff811115613d7b57613d7a61311e565b5b613d858254613454565b613d90828285613ccc565b600060209050601f831160018114613dc35760008415613db1578287015190505b613dbb8582613d3d565b865550613e23565b601f198416613dd186613bad565b60005b82811015613df957848901518255600182019150602085019450602081019050613dd4565b86831015613e165784890151613e12601f891682613d1f565b8355505b6001600288020188555050505b505050505050565b7f436f6e7472616374206973206e6f7420617070726f76656420666f722070726960008201527f766174652073616c650000000000000000000000000000000000000000000000602082015250565b6000613e87602983612df6565b9150613e9282613e2b565b604082019050919050565b60006020820190508181036000830152613eb681613e7a565b9050919050565b600081519050613ecc81612eb0565b92915050565b600060208284031215613ee857613ee7612d26565b5b6000613ef684828501613ebd565b91505092915050565b7f53686f756c64206265206120686f6c6465720000000000000000000000000000600082015250565b6000613f35601283612df6565b9150613f4082613eff565b602082019050919050565b60006020820190508181036000830152613f6481613f28565b9050919050565b7f507269766174652053616c65206973206e6f7420616374697665000000000000600082015250565b6000613fa1601a83612df6565b9150613fac82613f6b565b602082019050919050565b60006020820190508181036000830152613fd081613f94565b9050919050565b600081905092915050565b60008154613fef81613454565b613ff98186613fd7565b9450600182166000811461401457600181146140295761405c565b60ff198316865281151582028601935061405c565b61403285613bad565b60005b8381101561405457815481890152600182019150602081019050614035565b838801955050505b50505092915050565b600061407082612deb565b61407a8185613fd7565b935061408a818560208601612e07565b80840191505092915050565b60006140a28286613fe2565b91506140ae8285614065565b91506140ba8284613fe2565b9150819050949350505050565b60006140da6140d584613199565b61317e565b9050828152602081018484840111156140f6576140f5613119565b5b614101848285612e07565b509392505050565b600082601f83011261411e5761411d613114565b5b815161412e8482602086016140c7565b91505092915050565b60006020828403121561414d5761414c612d26565b5b600082015167ffffffffffffffff81111561416b5761416a612d2b565b5b61417784828501614109565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141dc602683612df6565b91506141e782614180565b604082019050919050565b6000602082019050818103600083015261420b816141cf565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061426e602583612df6565b915061427982614212565b604082019050919050565b6000602082019050818103600083015261429d81614261565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614300602483612df6565b915061430b826142a4565b604082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b600061434182612ea6565b915061434c83612ea6565b92508282101561435f5761435e6136a7565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143a0602083612df6565b91506143ab8261436a565b602082019050919050565b600060208201905081810360008301526143cf81614393565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061440c602083612df6565b9150614417826143d6565b602082019050919050565b6000602082019050818103600083015261443b816143ff565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614478601c83612df6565b915061448382614442565b602082019050919050565b600060208201905081810360008301526144a78161446b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006144e4601983612df6565b91506144ef826144ae565b602082019050919050565b60006020820190508181036000830152614513816144d7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614576603283612df6565b91506145818261451a565b604082019050919050565b600060208201905081810360008301526145a581614569565b9050919050565b60006145b782612ea6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145e9576145e86136a7565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061462e82612ea6565b915061463983612ea6565b925082614649576146486145f4565b5b828204905092915050565b600061465f82612ea6565b915061466a83612ea6565b92508261467a576146796145f4565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006146ac82614685565b6146b68185614690565b93506146c6818560208601612e07565b6146cf81612e3a565b840191505092915050565b60006080820190506146ef6000830187612f3b565b6146fc6020830186612f3b565b6147096040830185612fd1565b818103606083015261471b81846146a1565b905095945050505050565b60008151905061473581612d5c565b92915050565b60006020828403121561475157614750612d26565b5b600061475f84828501614726565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212200309dea27eb8fb725ecf1f8fc21222207c84a90a6148bb5c63b2590538663a3164736f6c634300080f0033

Deployed Bytecode Sourcemap

47692:2964:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40010:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26744:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28257:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27774:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46494:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40650:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46456:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28957:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49035:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49568:426;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40318:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29364:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46889:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40840:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48851:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26455:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26186:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;;;;;;;;;;;:::i;:::-;;4625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26913:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46421:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28500:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46709:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47838:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49169:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29620:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50002:651;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47982:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47258:366;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47881:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47754:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48013:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28726:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47113:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49301:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48732:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47797:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40010:224;40112:4;40151:35;40136:50;;;:11;:50;;;;:90;;;;40190:36;40214:11;40190:23;:36::i;:::-;40136:90;40129:97;;40010:224;;;:::o;26744:100::-;26798:13;26831:5;26824:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26744:100;:::o;28257:171::-;28333:7;28353:23;28368:7;28353:14;:23::i;:::-;28396:15;:24;28412:7;28396:24;;;;;;;;;;;;;;;;;;;;;28389:31;;28257:171;;;:::o;27774:417::-;27855:13;27871:23;27886:7;27871:14;:23::i;:::-;27855:39;;27919:5;27913:11;;:2;:11;;;27905:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28013:5;27997:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28022:37;28039:5;28046:12;:10;:12::i;:::-;28022:16;:37::i;:::-;27997:62;27975:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28162:21;28171:2;28175:7;28162:8;:21::i;:::-;27844:347;27774:417;;:::o;46494:38::-;;;;;;;;;;;;;:::o;40650:113::-;40711:7;40738:10;:17;;;;40731:24;;40650:113;:::o;46456:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28957:336::-;29152:41;29171:12;:10;:12::i;:::-;29185:7;29152:18;:41::i;:::-;29144:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29257:28;29267:4;29273:2;29277:7;29257:9;:28::i;:::-;28957:336;;;:::o;49035:126::-;4511:13;:11;:13::i;:::-;49147:6:::1;49131:13;;:22;;;;;;;;;;;;;;;;;;49035:126:::0;:::o;49568:426::-;49660:6;48116:1;48107:6;:10;48099:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48197:14;;48187:6;48171:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;48163:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;49684:6:::1;48356:9;;48349:6;:16;;;;:::i;:::-;48336:9;:29;48328:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;49716:12:::2;;;;;;;;;;;49708:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;49787:19;;49777:6;:29;;49769:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49857:7;49852:135;49874:6;49870:1;:10;;;49852:135;;;49919:3;;;;;49939:36;49945:10;49973:1;49957:13;:11;:13::i;:::-;:17;;;;:::i;:::-;49939:5;:36::i;:::-;49852:135;;;;48267:1:::1;49568:426:::0;;:::o;40318:256::-;40415:7;40451:23;40468:5;40451:16;:23::i;:::-;40443:5;:31;40435:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40540:12;:19;40553:5;40540:19;;;;;;;;;;;;;;;:26;40560:5;40540:26;;;;;;;;;;;;40533:33;;40318:256;;;;:::o;29364:185::-;29502:39;29519:4;29525:2;29529:7;29502:39;;;;;;;;;;;;:16;:39::i;:::-;29364:185;;;:::o;46889:216::-;4511:13;:11;:13::i;:::-;47009:15:::1;46983:23;;:41;;;;;;;;;;;;;;;;;;47073:23;;;;;;;;;;;47035:17;;:62;;;;;;;;;;;;;;;;;;46889:216:::0;:::o;40840:233::-;40915:7;40951:30;:28;:30::i;:::-;40943:5;:38;40935:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41048:10;41059:5;41048:17;;;;;;;;:::i;:::-;;;;;;;;;;41041:24;;40840:233;;;:::o;48851:176::-;4511:13;:11;:13::i;:::-;49013:6:::1;48971:22;:39;48994:15;48971:39;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;48851:176:::0;;:::o;26455:222::-;26527:7;26547:13;26563:7;:16;26571:7;26563:16;;;;;;;;;;;;;;;;;;;;;26547:32;;26615:1;26598:19;;:5;:19;;;26590:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;26664:5;26657:12;;;26455:222;;;:::o;26186:207::-;26258:7;26303:1;26286:19;;:5;:19;;;26278:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26369:9;:16;26379:5;26369:16;;;;;;;;;;;;;;;;26362:23;;26186:207;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;4625:87::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;26913:104::-;26969:13;27002:7;26995:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26913:104;:::o;46421:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28500:155::-;28595:52;28614:12;:10;:12::i;:::-;28628:8;28638;28595:18;:52::i;:::-;28500:155;;:::o;46709:172::-;4511:13;:11;:13::i;:::-;46831:6:::1;46814:14;:23;;;;;;:::i;:::-;;46866:7;46848:15;:25;;;;;;:::i;:::-;;46709:172:::0;;:::o;47838:36::-;;;;:::o;49169:124::-;4511:13;:11;:13::i;:::-;49279:6:::1;49264:12;;:21;;;;;;;;;;;;;;;;;;49169:124:::0;:::o;29620:323::-;29794:41;29813:12;:10;:12::i;:::-;29827:7;29794:18;:41::i;:::-;29786:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29897:38;29911:4;29917:2;29921:7;29930:4;29897:13;:38::i;:::-;29620:323;;;;:::o;50002:651::-;50120:6;48116:1;48107:6;:10;48099:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48197:14;;48187:6;48171:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;48163:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;50144:6:::1;48356:9;;48349:6;:16;;;;:::i;:::-;48336:9;:29;48328:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;50176:22:::2;:39;50199:15;50176:39;;;;;;;;;;;;;;;;;;;;;;;;;50168:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;50329:1;50288:15;50280:34;;;50315:10;50280:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;50272:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50372:13;;;;;;;;;;;50364:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;50445:20;;50435:6;:30;;50427:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50516:7;50511:135;50533:6;50529:1;:10;;;50511:135;;;50578:3;;;;;50598:36;50604:10;50632:1;50616:13;:11;:13::i;:::-;:17;;;;:::i;:::-;50598:5;:36::i;:::-;50511:135;;;;48267:1:::1;50002:651:::0;;;:::o;47982:24::-;;;;;;;;;;;;;:::o;47258:366::-;47325:13;47395:3;47360:39;;:23;;;;;;;;;;;:39;;;47356:261;;47456:14;47472:23;47489:5;47472:16;:23::i;:::-;47497:15;47439:74;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47425:89;;;;47356:261;47572:17;;;;;;;;;;;:26;;;47599:5;47572:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47565:40;;47258:366;;;;:::o;47881:36::-;;;;:::o;47754:34::-;;;;:::o;48013:25::-;;;;;;;;;;;;;:::o;28726:164::-;28823:4;28847:18;:25;28866:5;28847:25;;;;;;;;;;;;;;;:35;28873:8;28847:35;;;;;;;;;;;;;;;;;;;;;;;;;28840:42;;28726:164;;;;:::o;47113:137::-;47171:13;47209:17;;;;;;;;;;;:26;;;47236:5;47209:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47202:40;;47113:137;;;:::o;49301:259::-;4511:13;:11;:13::i;:::-;49394:6:::1;48116:1;48107:6;:10;48099:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48197:14;;48187:6;48171:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;48163:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;49423:7:::2;49418:135;49440:6;49436:1;:10;;;49418:135;;;49485:3;;;;;49505:36;49511:10;49539:1;49523:13;:11;:13::i;:::-;:17;;;;:::i;:::-;49505:5;:36::i;:::-;49418:135;;;;4535:1:::1;49301:259:::0;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;::::0;5612:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;48732:111::-;4511:13;:11;:13::i;:::-;48830:5:::1;48818:9;:17;;;;48732:111:::0;:::o;47797:34::-;;;;:::o;38356:126::-;;;;:::o;25817:305::-;25919:4;25971:25;25956:40;;;:11;:40;;;;:105;;;;26028:33;26013:48;;;:11;:48;;;;25956:105;:158;;;;26078:36;26102:11;26078:23;:36::i;:::-;25956:158;25936:178;;25817:305;;;:::o;36232:135::-;36314:16;36322:7;36314;:16::i;:::-;36306:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36232:135;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;35511:174::-;35613:2;35586:15;:24;35602:7;35586:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35669:7;35665:2;35631:46;;35640:23;35655:7;35640:14;:23::i;:::-;35631:46;;;;;;;;;;;;35511:174;;:::o;31744:264::-;31837:4;31854:13;31870:23;31885:7;31870:14;:23::i;:::-;31854:39;;31923:5;31912:16;;:7;:16;;;:52;;;;31932:32;31949:5;31956:7;31932:16;:32::i;:::-;31912:52;:87;;;;31992:7;31968:31;;:20;31980:7;31968:11;:20::i;:::-;:31;;;31912:87;31904:96;;;31744:264;;;;:::o;34767:625::-;34926:4;34899:31;;:23;34914:7;34899:14;:23::i;:::-;:31;;;34891:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35005:1;34991:16;;:2;:16;;;34983:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35061:39;35082:4;35088:2;35092:7;35061:20;:39::i;:::-;35165:29;35182:1;35186:7;35165:8;:29::i;:::-;35226:1;35207:9;:15;35217:4;35207:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35255:1;35238:9;:13;35248:2;35238:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35286:2;35267:7;:16;35275:7;35267:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35325:7;35321:2;35306:27;;35315:4;35306:27;;;;;;;;;;;;35346:38;35366:4;35372:2;35376:7;35346:19;:38::i;:::-;34767:625;;;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;33342:439::-;33436:1;33422:16;;:2;:16;;;33414:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33495:16;33503:7;33495;:16::i;:::-;33494:17;33486:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33557:45;33586:1;33590:2;33594:7;33557:20;:45::i;:::-;33632:1;33615:9;:13;33625:2;33615:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33663:2;33644:7;:16;33652:7;33644:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33708:7;33704:2;33683:33;;33700:1;33683:33;;;;;;;;;;;;33729:44;33757:1;33761:2;33765:7;33729:19;:44::i;:::-;33342:439;;:::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5955:128;5892:191;:::o;35828:315::-;35983:8;35974:17;;:5;:17;;;35966:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36070:8;36032:18;:25;36051:5;36032:25;;;;;;;;;;;;;;;:35;36058:8;36032:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36116:8;36094:41;;36109:5;36094:41;;;36126:8;36094:41;;;;;;:::i;:::-;;;;;;;;35828:315;;;:::o;30824:313::-;30980:28;30990:4;30996:2;31000:7;30980:9;:28::i;:::-;31027:47;31050:4;31056:2;31060:7;31069:4;31027:22;:47::i;:::-;31019:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30824:313;;;;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;17479:157::-;17564:4;17603:25;17588:40;;;:11;:40;;;;17581:47;;17479:157;;;:::o;31450:127::-;31515:4;31567:1;31539:30;;:7;:16;31547:7;31539:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31532:37;;31450:127;;;:::o;41686:589::-;41830:45;41857:4;41863:2;41867:7;41830:26;:45::i;:::-;41908:1;41892:18;;:4;:18;;;41888:187;;41927:40;41959:7;41927:31;:40::i;:::-;41888:187;;;41997:2;41989:10;;:4;:10;;;41985:90;;42016:47;42049:4;42055:7;42016:32;:47::i;:::-;41985:90;41888:187;42103:1;42089:16;;:2;:16;;;42085:183;;42122:45;42159:7;42122:36;:45::i;:::-;42085:183;;;42195:4;42189:10;;:2;:10;;;42185:83;;42216:40;42244:2;42248:7;42216:27;:40::i;:::-;42185:83;42085:183;41686:589;;;:::o;38867:125::-;;;;:::o;36931:853::-;37085:4;37106:15;:2;:13;;;:15::i;:::-;37102:675;;;37158:2;37142:36;;;37179:12;:10;:12::i;:::-;37193:4;37199:7;37208:4;37142:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37138:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37400:1;37383:6;:13;:18;37379:328;;37426:60;;;;;;;;;;:::i;:::-;;;;;;;;37379:328;37657:6;37651:13;37642:6;37638:2;37634:15;37627:38;37138:584;37274:41;;;37264:51;;;:6;:51;;;;37257:58;;;;;37102:675;37761:4;37754:11;;36931:853;;;;;;;:::o;42998:164::-;43102:10;:17;;;;43075:15;:24;43091:7;43075:24;;;;;;;;;;;:44;;;;43130:10;43146:7;43130:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42998:164;:::o;43789:988::-;44055:22;44105:1;44080:22;44097:4;44080:16;:22::i;:::-;:26;;;;:::i;:::-;44055:51;;44117:18;44138:17;:26;44156:7;44138:26;;;;;;;;;;;;44117:47;;44285:14;44271:10;:28;44267:328;;44316:19;44338:12;:18;44351:4;44338:18;;;;;;;;;;;;;;;:34;44357:14;44338:34;;;;;;;;;;;;44316:56;;44422:11;44389:12;:18;44402:4;44389:18;;;;;;;;;;;;;;;:30;44408:10;44389:30;;;;;;;;;;;:44;;;;44539:10;44506:17;:30;44524:11;44506:30;;;;;;;;;;;:43;;;;44301:294;44267:328;44691:17;:26;44709:7;44691:26;;;;;;;;;;;44684:33;;;44735:12;:18;44748:4;44735:18;;;;;;;;;;;;;;;:34;44754:14;44735:34;;;;;;;;;;;44728:41;;;43870:907;;43789:988;;:::o;45072:1079::-;45325:22;45370:1;45350:10;:17;;;;:21;;;;:::i;:::-;45325:46;;45382:18;45403:15;:24;45419:7;45403:24;;;;;;;;;;;;45382:45;;45754:19;45776:10;45787:14;45776:26;;;;;;;;:::i;:::-;;;;;;;;;;45754:48;;45840:11;45815:10;45826;45815:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45951:10;45920:15;:28;45936:11;45920:28;;;;;;;;;;;:41;;;;46092:15;:24;46108:7;46092:24;;;;;;;;;;;46085:31;;;46127:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45143:1008;;;45072:1079;:::o;42576:221::-;42661:14;42678:20;42695:2;42678:16;:20::i;:::-;42661:37;;42736:7;42709:12;:16;42722:2;42709:16;;;;;;;;;;;;;;;:24;42726:6;42709:24;;;;;;;;;;;:34;;;;42783:6;42754:17;:26;42772:7;42754:26;;;;;;;;;;;:35;;;;42650:147;42576:221;;:::o;7323:326::-;7383:4;7640:1;7618:7;:19;;;:23;7611:30;;7323:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:116::-;5985:21;6000:5;5985:21;:::i;:::-;5978:5;5975:32;5965:60;;6021:1;6018;6011:12;5965:60;5915:116;:::o;6037:133::-;6080:5;6118:6;6105:20;6096:29;;6134:30;6158:5;6134:30;:::i;:::-;6037:133;;;;:::o;6176:323::-;6232:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:119;;;6287:79;;:::i;:::-;6249:119;6407:1;6432:50;6474:7;6465:6;6454:9;6450:22;6432:50;:::i;:::-;6422:60;;6378:114;6176:323;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:468::-;6905:6;6913;6962:2;6950:9;6941:7;6937:23;6933:32;6930:119;;;6968:79;;:::i;:::-;6930:119;7088:1;7113:53;7158:7;7149:6;7138:9;7134:22;7113:53;:::i;:::-;7103:63;;7059:117;7215:2;7241:50;7283:7;7274:6;7263:9;7259:22;7241:50;:::i;:::-;7231:60;;7186:115;6840:468;;;;;:::o;7314:117::-;7423:1;7420;7413:12;7437:117;7546:1;7543;7536:12;7560:180;7608:77;7605:1;7598:88;7705:4;7702:1;7695:15;7729:4;7726:1;7719:15;7746:281;7829:27;7851:4;7829:27;:::i;:::-;7821:6;7817:40;7959:6;7947:10;7944:22;7923:18;7911:10;7908:34;7905:62;7902:88;;;7970:18;;:::i;:::-;7902:88;8010:10;8006:2;7999:22;7789:238;7746:281;;:::o;8033:129::-;8067:6;8094:20;;:::i;:::-;8084:30;;8123:33;8151:4;8143:6;8123:33;:::i;:::-;8033:129;;;:::o;8168:308::-;8230:4;8320:18;8312:6;8309:30;8306:56;;;8342:18;;:::i;:::-;8306:56;8380:29;8402:6;8380:29;:::i;:::-;8372:37;;8464:4;8458;8454:15;8446:23;;8168:308;;;:::o;8482:154::-;8566:6;8561:3;8556;8543:30;8628:1;8619:6;8614:3;8610:16;8603:27;8482:154;;;:::o;8642:412::-;8720:5;8745:66;8761:49;8803:6;8761:49;:::i;:::-;8745:66;:::i;:::-;8736:75;;8834:6;8827:5;8820:21;8872:4;8865:5;8861:16;8910:3;8901:6;8896:3;8892:16;8889:25;8886:112;;;8917:79;;:::i;:::-;8886:112;9007:41;9041:6;9036:3;9031;9007:41;:::i;:::-;8726:328;8642:412;;;;;:::o;9074:340::-;9130:5;9179:3;9172:4;9164:6;9160:17;9156:27;9146:122;;9187:79;;:::i;:::-;9146:122;9304:6;9291:20;9329:79;9404:3;9396:6;9389:4;9381:6;9377:17;9329:79;:::i;:::-;9320:88;;9136:278;9074:340;;;;:::o;9420:834::-;9508:6;9516;9565:2;9553:9;9544:7;9540:23;9536:32;9533:119;;;9571:79;;:::i;:::-;9533:119;9719:1;9708:9;9704:17;9691:31;9749:18;9741:6;9738:30;9735:117;;;9771:79;;:::i;:::-;9735:117;9876:63;9931:7;9922:6;9911:9;9907:22;9876:63;:::i;:::-;9866:73;;9662:287;10016:2;10005:9;10001:18;9988:32;10047:18;10039:6;10036:30;10033:117;;;10069:79;;:::i;:::-;10033:117;10174:63;10229:7;10220:6;10209:9;10205:22;10174:63;:::i;:::-;10164:73;;9959:288;9420:834;;;;;:::o;10260:307::-;10321:4;10411:18;10403:6;10400:30;10397:56;;;10433:18;;:::i;:::-;10397:56;10471:29;10493:6;10471:29;:::i;:::-;10463:37;;10555:4;10549;10545:15;10537:23;;10260:307;;;:::o;10573:410::-;10650:5;10675:65;10691:48;10732:6;10691:48;:::i;:::-;10675:65;:::i;:::-;10666:74;;10763:6;10756:5;10749:21;10801:4;10794:5;10790:16;10839:3;10830:6;10825:3;10821:16;10818:25;10815:112;;;10846:79;;:::i;:::-;10815:112;10936:41;10970:6;10965:3;10960;10936:41;:::i;:::-;10656:327;10573:410;;;;;:::o;11002:338::-;11057:5;11106:3;11099:4;11091:6;11087:17;11083:27;11073:122;;11114:79;;:::i;:::-;11073:122;11231:6;11218:20;11256:78;11330:3;11322:6;11315:4;11307:6;11303:17;11256:78;:::i;:::-;11247:87;;11063:277;11002:338;;;;:::o;11346:943::-;11441:6;11449;11457;11465;11514:3;11502:9;11493:7;11489:23;11485:33;11482:120;;;11521:79;;:::i;:::-;11482:120;11641:1;11666:53;11711:7;11702:6;11691:9;11687:22;11666:53;:::i;:::-;11656:63;;11612:117;11768:2;11794:53;11839:7;11830:6;11819:9;11815:22;11794:53;:::i;:::-;11784:63;;11739:118;11896:2;11922:53;11967:7;11958:6;11947:9;11943:22;11922:53;:::i;:::-;11912:63;;11867:118;12052:2;12041:9;12037:18;12024:32;12083:18;12075:6;12072:30;12069:117;;;12105:79;;:::i;:::-;12069:117;12210:62;12264:7;12255:6;12244:9;12240:22;12210:62;:::i;:::-;12200:72;;11995:287;11346:943;;;;;;;:::o;12295:474::-;12363:6;12371;12420:2;12408:9;12399:7;12395:23;12391:32;12388:119;;;12426:79;;:::i;:::-;12388:119;12546:1;12571:53;12616:7;12607:6;12596:9;12592:22;12571:53;:::i;:::-;12561:63;;12517:117;12673:2;12699:53;12744:7;12735:6;12724:9;12720:22;12699:53;:::i;:::-;12689:63;;12644:118;12295:474;;;;;:::o;12775:180::-;12823:77;12820:1;12813:88;12920:4;12917:1;12910:15;12944:4;12941:1;12934:15;12961:320;13005:6;13042:1;13036:4;13032:12;13022:22;;13089:1;13083:4;13079:12;13110:18;13100:81;;13166:4;13158:6;13154:17;13144:27;;13100:81;13228:2;13220:6;13217:14;13197:18;13194:38;13191:84;;13247:18;;:::i;:::-;13191:84;13012:269;12961:320;;;:::o;13287:220::-;13427:34;13423:1;13415:6;13411:14;13404:58;13496:3;13491:2;13483:6;13479:15;13472:28;13287:220;:::o;13513:366::-;13655:3;13676:67;13740:2;13735:3;13676:67;:::i;:::-;13669:74;;13752:93;13841:3;13752:93;:::i;:::-;13870:2;13865:3;13861:12;13854:19;;13513:366;;;:::o;13885:419::-;14051:4;14089:2;14078:9;14074:18;14066:26;;14138:9;14132:4;14128:20;14124:1;14113:9;14109:17;14102:47;14166:131;14292:4;14166:131;:::i;:::-;14158:139;;13885:419;;;:::o;14310:249::-;14450:34;14446:1;14438:6;14434:14;14427:58;14519:32;14514:2;14506:6;14502:15;14495:57;14310:249;:::o;14565:366::-;14707:3;14728:67;14792:2;14787:3;14728:67;:::i;:::-;14721:74;;14804:93;14893:3;14804:93;:::i;:::-;14922:2;14917:3;14913:12;14906:19;;14565:366;;;:::o;14937:419::-;15103:4;15141:2;15130:9;15126:18;15118:26;;15190:9;15184:4;15180:20;15176:1;15165:9;15161:17;15154:47;15218:131;15344:4;15218:131;:::i;:::-;15210:139;;14937:419;;;:::o;15362:233::-;15502:34;15498:1;15490:6;15486:14;15479:58;15571:16;15566:2;15558:6;15554:15;15547:41;15362:233;:::o;15601:366::-;15743:3;15764:67;15828:2;15823:3;15764:67;:::i;:::-;15757:74;;15840:93;15929:3;15840:93;:::i;:::-;15958:2;15953:3;15949:12;15942:19;;15601:366;;;:::o;15973:419::-;16139:4;16177:2;16166:9;16162:18;16154:26;;16226:9;16220:4;16216:20;16212:1;16201:9;16197:17;16190:47;16254:131;16380:4;16254:131;:::i;:::-;16246:139;;15973:419;;;:::o;16398:180::-;16538:32;16534:1;16526:6;16522:14;16515:56;16398:180;:::o;16584:366::-;16726:3;16747:67;16811:2;16806:3;16747:67;:::i;:::-;16740:74;;16823:93;16912:3;16823:93;:::i;:::-;16941:2;16936:3;16932:12;16925:19;;16584:366;;;:::o;16956:419::-;17122:4;17160:2;17149:9;17145:18;17137:26;;17209:9;17203:4;17199:20;17195:1;17184:9;17180:17;17173:47;17237:131;17363:4;17237:131;:::i;:::-;17229:139;;16956:419;;;:::o;17381:180::-;17429:77;17426:1;17419:88;17526:4;17523:1;17516:15;17550:4;17547:1;17540:15;17567:305;17607:3;17626:20;17644:1;17626:20;:::i;:::-;17621:25;;17660:20;17678:1;17660:20;:::i;:::-;17655:25;;17814:1;17746:66;17742:74;17739:1;17736:81;17733:107;;;17820:18;;:::i;:::-;17733:107;17864:1;17861;17857:9;17850:16;;17567:305;;;;:::o;17878:227::-;18018:34;18014:1;18006:6;18002:14;17995:58;18087:10;18082:2;18074:6;18070:15;18063:35;17878:227;:::o;18111:366::-;18253:3;18274:67;18338:2;18333:3;18274:67;:::i;:::-;18267:74;;18350:93;18439:3;18350:93;:::i;:::-;18468:2;18463:3;18459:12;18452:19;;18111:366;;;:::o;18483:419::-;18649:4;18687:2;18676:9;18672:18;18664:26;;18736:9;18730:4;18726:20;18722:1;18711:9;18707:17;18700:47;18764:131;18890:4;18764:131;:::i;:::-;18756:139;;18483:419;;;:::o;18908:348::-;18948:7;18971:20;18989:1;18971:20;:::i;:::-;18966:25;;19005:20;19023:1;19005:20;:::i;:::-;19000:25;;19193:1;19125:66;19121:74;19118:1;19115:81;19110:1;19103:9;19096:17;19092:105;19089:131;;;19200:18;;:::i;:::-;19089:131;19248:1;19245;19241:9;19230:20;;18908:348;;;;:::o;19262:168::-;19402:20;19398:1;19390:6;19386:14;19379:44;19262:168;:::o;19436:366::-;19578:3;19599:67;19663:2;19658:3;19599:67;:::i;:::-;19592:74;;19675:93;19764:3;19675:93;:::i;:::-;19793:2;19788:3;19784:12;19777:19;;19436:366;;;:::o;19808:419::-;19974:4;20012:2;20001:9;19997:18;19989:26;;20061:9;20055:4;20051:20;20047:1;20036:9;20032:17;20025:47;20089:131;20215:4;20089:131;:::i;:::-;20081:139;;19808:419;;;:::o;20233:175::-;20373:27;20369:1;20361:6;20357:14;20350:51;20233:175;:::o;20414:366::-;20556:3;20577:67;20641:2;20636:3;20577:67;:::i;:::-;20570:74;;20653:93;20742:3;20653:93;:::i;:::-;20771:2;20766:3;20762:12;20755:19;;20414:366;;;:::o;20786:419::-;20952:4;20990:2;20979:9;20975:18;20967:26;;21039:9;21033:4;21029:20;21025:1;21014:9;21010:17;21003:47;21067:131;21193:4;21067:131;:::i;:::-;21059:139;;20786:419;;;:::o;21211:170::-;21351:22;21347:1;21339:6;21335:14;21328:46;21211:170;:::o;21387:366::-;21529:3;21550:67;21614:2;21609:3;21550:67;:::i;:::-;21543:74;;21626:93;21715:3;21626:93;:::i;:::-;21744:2;21739:3;21735:12;21728:19;;21387:366;;;:::o;21759:419::-;21925:4;21963:2;21952:9;21948:18;21940:26;;22012:9;22006:4;22002:20;21998:1;21987:9;21983:17;21976:47;22040:131;22166:4;22040:131;:::i;:::-;22032:139;;21759:419;;;:::o;22184:230::-;22324:34;22320:1;22312:6;22308:14;22301:58;22393:13;22388:2;22380:6;22376:15;22369:38;22184:230;:::o;22420:366::-;22562:3;22583:67;22647:2;22642:3;22583:67;:::i;:::-;22576:74;;22659:93;22748:3;22659:93;:::i;:::-;22777:2;22772:3;22768:12;22761:19;;22420:366;;;:::o;22792:419::-;22958:4;22996:2;22985:9;22981:18;22973:26;;23045:9;23039:4;23035:20;23031:1;23020:9;23016:17;23009:47;23073:131;23199:4;23073:131;:::i;:::-;23065:139;;22792:419;;;:::o;23217:231::-;23357:34;23353:1;23345:6;23341:14;23334:58;23426:14;23421:2;23413:6;23409:15;23402:39;23217:231;:::o;23454:366::-;23596:3;23617:67;23681:2;23676:3;23617:67;:::i;:::-;23610:74;;23693:93;23782:3;23693:93;:::i;:::-;23811:2;23806:3;23802:12;23795:19;;23454:366;;;:::o;23826:419::-;23992:4;24030:2;24019:9;24015:18;24007:26;;24079:9;24073:4;24069:20;24065:1;24054:9;24050:17;24043:47;24107:131;24233:4;24107:131;:::i;:::-;24099:139;;23826:419;;;:::o;24251:180::-;24299:77;24296:1;24289:88;24396:4;24393:1;24386:15;24420:4;24417:1;24410:15;24437:174;24577:26;24573:1;24565:6;24561:14;24554:50;24437:174;:::o;24617:366::-;24759:3;24780:67;24844:2;24839:3;24780:67;:::i;:::-;24773:74;;24856:93;24945:3;24856:93;:::i;:::-;24974:2;24969:3;24965:12;24958:19;;24617:366;;;:::o;24989:419::-;25155:4;25193:2;25182:9;25178:18;25170:26;;25242:9;25236:4;25232:20;25228:1;25217:9;25213:17;25206:47;25270:131;25396:4;25270:131;:::i;:::-;25262:139;;24989:419;;;:::o;25414:228::-;25554:34;25550:1;25542:6;25538:14;25531:58;25623:11;25618:2;25610:6;25606:15;25599:36;25414:228;:::o;25648:366::-;25790:3;25811:67;25875:2;25870:3;25811:67;:::i;:::-;25804:74;;25887:93;25976:3;25887:93;:::i;:::-;26005:2;26000:3;25996:12;25989:19;;25648:366;;;:::o;26020:419::-;26186:4;26224:2;26213:9;26209:18;26201:26;;26273:9;26267:4;26263:20;26259:1;26248:9;26244:17;26237:47;26301:131;26427:4;26301:131;:::i;:::-;26293:139;;26020:419;;;:::o;26445:141::-;26494:4;26517:3;26509:11;;26540:3;26537:1;26530:14;26574:4;26571:1;26561:18;26553:26;;26445:141;;;:::o;26592:93::-;26629:6;26676:2;26671;26664:5;26660:14;26656:23;26646:33;;26592:93;;;:::o;26691:107::-;26735:8;26785:5;26779:4;26775:16;26754:37;;26691:107;;;;:::o;26804:393::-;26873:6;26923:1;26911:10;26907:18;26946:97;26976:66;26965:9;26946:97;:::i;:::-;27064:39;27094:8;27083:9;27064:39;:::i;:::-;27052:51;;27136:4;27132:9;27125:5;27121:21;27112:30;;27185:4;27175:8;27171:19;27164:5;27161:30;27151:40;;26880:317;;26804:393;;;;;:::o;27203:60::-;27231:3;27252:5;27245:12;;27203:60;;;:::o;27269:142::-;27319:9;27352:53;27370:34;27379:24;27397:5;27379:24;:::i;:::-;27370:34;:::i;:::-;27352:53;:::i;:::-;27339:66;;27269:142;;;:::o;27417:75::-;27460:3;27481:5;27474:12;;27417:75;;;:::o;27498:269::-;27608:39;27639:7;27608:39;:::i;:::-;27669:91;27718:41;27742:16;27718:41;:::i;:::-;27710:6;27703:4;27697:11;27669:91;:::i;:::-;27663:4;27656:105;27574:193;27498:269;;;:::o;27773:73::-;27818:3;27773:73;:::o;27852:189::-;27929:32;;:::i;:::-;27970:65;28028:6;28020;28014:4;27970:65;:::i;:::-;27905:136;27852:189;;:::o;28047:186::-;28107:120;28124:3;28117:5;28114:14;28107:120;;;28178:39;28215:1;28208:5;28178:39;:::i;:::-;28151:1;28144:5;28140:13;28131:22;;28107:120;;;28047:186;;:::o;28239:543::-;28340:2;28335:3;28332:11;28329:446;;;28374:38;28406:5;28374:38;:::i;:::-;28458:29;28476:10;28458:29;:::i;:::-;28448:8;28444:44;28641:2;28629:10;28626:18;28623:49;;;28662:8;28647:23;;28623:49;28685:80;28741:22;28759:3;28741:22;:::i;:::-;28731:8;28727:37;28714:11;28685:80;:::i;:::-;28344:431;;28329:446;28239:543;;;:::o;28788:117::-;28842:8;28892:5;28886:4;28882:16;28861:37;;28788:117;;;;:::o;28911:169::-;28955:6;28988:51;29036:1;29032:6;29024:5;29021:1;29017:13;28988:51;:::i;:::-;28984:56;29069:4;29063;29059:15;29049:25;;28962:118;28911:169;;;;:::o;29085:295::-;29161:4;29307:29;29332:3;29326:4;29307:29;:::i;:::-;29299:37;;29369:3;29366:1;29362:11;29356:4;29353:21;29345:29;;29085:295;;;;:::o;29385:1395::-;29502:37;29535:3;29502:37;:::i;:::-;29604:18;29596:6;29593:30;29590:56;;;29626:18;;:::i;:::-;29590:56;29670:38;29702:4;29696:11;29670:38;:::i;:::-;29755:67;29815:6;29807;29801:4;29755:67;:::i;:::-;29849:1;29873:4;29860:17;;29905:2;29897:6;29894:14;29922:1;29917:618;;;;30579:1;30596:6;30593:77;;;30645:9;30640:3;30636:19;30630:26;30621:35;;30593:77;30696:67;30756:6;30749:5;30696:67;:::i;:::-;30690:4;30683:81;30552:222;29887:887;;29917:618;29969:4;29965:9;29957:6;29953:22;30003:37;30035:4;30003:37;:::i;:::-;30062:1;30076:208;30090:7;30087:1;30084:14;30076:208;;;30169:9;30164:3;30160:19;30154:26;30146:6;30139:42;30220:1;30212:6;30208:14;30198:24;;30267:2;30256:9;30252:18;30239:31;;30113:4;30110:1;30106:12;30101:17;;30076:208;;;30312:6;30303:7;30300:19;30297:179;;;30370:9;30365:3;30361:19;30355:26;30413:48;30455:4;30447:6;30443:17;30432:9;30413:48;:::i;:::-;30405:6;30398:64;30320:156;30297:179;30522:1;30518;30510:6;30506:14;30502:22;30496:4;30489:36;29924:611;;;29887:887;;29477:1303;;;29385:1395;;:::o;30786:228::-;30926:34;30922:1;30914:6;30910:14;30903:58;30995:11;30990:2;30982:6;30978:15;30971:36;30786:228;:::o;31020:366::-;31162:3;31183:67;31247:2;31242:3;31183:67;:::i;:::-;31176:74;;31259:93;31348:3;31259:93;:::i;:::-;31377:2;31372:3;31368:12;31361:19;;31020:366;;;:::o;31392:419::-;31558:4;31596:2;31585:9;31581:18;31573:26;;31645:9;31639:4;31635:20;31631:1;31620:9;31616:17;31609:47;31673:131;31799:4;31673:131;:::i;:::-;31665:139;;31392:419;;;:::o;31817:143::-;31874:5;31905:6;31899:13;31890:22;;31921:33;31948:5;31921:33;:::i;:::-;31817:143;;;;:::o;31966:351::-;32036:6;32085:2;32073:9;32064:7;32060:23;32056:32;32053:119;;;32091:79;;:::i;:::-;32053:119;32211:1;32236:64;32292:7;32283:6;32272:9;32268:22;32236:64;:::i;:::-;32226:74;;32182:128;31966:351;;;;:::o;32323:168::-;32463:20;32459:1;32451:6;32447:14;32440:44;32323:168;:::o;32497:366::-;32639:3;32660:67;32724:2;32719:3;32660:67;:::i;:::-;32653:74;;32736:93;32825:3;32736:93;:::i;:::-;32854:2;32849:3;32845:12;32838:19;;32497:366;;;:::o;32869:419::-;33035:4;33073:2;33062:9;33058:18;33050:26;;33122:9;33116:4;33112:20;33108:1;33097:9;33093:17;33086:47;33150:131;33276:4;33150:131;:::i;:::-;33142:139;;32869:419;;;:::o;33294:176::-;33434:28;33430:1;33422:6;33418:14;33411:52;33294:176;:::o;33476:366::-;33618:3;33639:67;33703:2;33698:3;33639:67;:::i;:::-;33632:74;;33715:93;33804:3;33715:93;:::i;:::-;33833:2;33828:3;33824:12;33817:19;;33476:366;;;:::o;33848:419::-;34014:4;34052:2;34041:9;34037:18;34029:26;;34101:9;34095:4;34091:20;34087:1;34076:9;34072:17;34065:47;34129:131;34255:4;34129:131;:::i;:::-;34121:139;;33848:419;;;:::o;34273:148::-;34375:11;34412:3;34397:18;;34273:148;;;;:::o;34451:874::-;34554:3;34591:5;34585:12;34620:36;34646:9;34620:36;:::i;:::-;34672:89;34754:6;34749:3;34672:89;:::i;:::-;34665:96;;34792:1;34781:9;34777:17;34808:1;34803:166;;;;34983:1;34978:341;;;;34770:549;;34803:166;34887:4;34883:9;34872;34868:25;34863:3;34856:38;34949:6;34942:14;34935:22;34927:6;34923:35;34918:3;34914:45;34907:52;;34803:166;;34978:341;35045:38;35077:5;35045:38;:::i;:::-;35105:1;35119:154;35133:6;35130:1;35127:13;35119:154;;;35207:7;35201:14;35197:1;35192:3;35188:11;35181:35;35257:1;35248:7;35244:15;35233:26;;35155:4;35152:1;35148:12;35143:17;;35119:154;;;35302:6;35297:3;35293:16;35286:23;;34985:334;;34770:549;;34558:767;;34451:874;;;;:::o;35331:377::-;35437:3;35465:39;35498:5;35465:39;:::i;:::-;35520:89;35602:6;35597:3;35520:89;:::i;:::-;35513:96;;35618:52;35663:6;35658:3;35651:4;35644:5;35640:16;35618:52;:::i;:::-;35695:6;35690:3;35686:16;35679:23;;35441:267;35331:377;;;;:::o;35714:583::-;35936:3;35958:92;36046:3;36037:6;35958:92;:::i;:::-;35951:99;;36067:95;36158:3;36149:6;36067:95;:::i;:::-;36060:102;;36179:92;36267:3;36258:6;36179:92;:::i;:::-;36172:99;;36288:3;36281:10;;35714:583;;;;;;:::o;36303:421::-;36392:5;36417:66;36433:49;36475:6;36433:49;:::i;:::-;36417:66;:::i;:::-;36408:75;;36506:6;36499:5;36492:21;36544:4;36537:5;36533:16;36582:3;36573:6;36568:3;36564:16;36561:25;36558:112;;;36589:79;;:::i;:::-;36558:112;36679:39;36711:6;36706:3;36701;36679:39;:::i;:::-;36398:326;36303:421;;;;;:::o;36744:355::-;36811:5;36860:3;36853:4;36845:6;36841:17;36837:27;36827:122;;36868:79;;:::i;:::-;36827:122;36978:6;36972:13;37003:90;37089:3;37081:6;37074:4;37066:6;37062:17;37003:90;:::i;:::-;36994:99;;36817:282;36744:355;;;;:::o;37105:524::-;37185:6;37234:2;37222:9;37213:7;37209:23;37205:32;37202:119;;;37240:79;;:::i;:::-;37202:119;37381:1;37370:9;37366:17;37360:24;37411:18;37403:6;37400:30;37397:117;;;37433:79;;:::i;:::-;37397:117;37538:74;37604:7;37595:6;37584:9;37580:22;37538:74;:::i;:::-;37528:84;;37331:291;37105:524;;;;:::o;37635:225::-;37775:34;37771:1;37763:6;37759:14;37752:58;37844:8;37839:2;37831:6;37827:15;37820:33;37635:225;:::o;37866:366::-;38008:3;38029:67;38093:2;38088:3;38029:67;:::i;:::-;38022:74;;38105:93;38194:3;38105:93;:::i;:::-;38223:2;38218:3;38214:12;38207:19;;37866:366;;;:::o;38238:419::-;38404:4;38442:2;38431:9;38427:18;38419:26;;38491:9;38485:4;38481:20;38477:1;38466:9;38462:17;38455:47;38519:131;38645:4;38519:131;:::i;:::-;38511:139;;38238:419;;;:::o;38663:224::-;38803:34;38799:1;38791:6;38787:14;38780:58;38872:7;38867:2;38859:6;38855:15;38848:32;38663:224;:::o;38893:366::-;39035:3;39056:67;39120:2;39115:3;39056:67;:::i;:::-;39049:74;;39132:93;39221:3;39132:93;:::i;:::-;39250:2;39245:3;39241:12;39234:19;;38893:366;;;:::o;39265:419::-;39431:4;39469:2;39458:9;39454:18;39446:26;;39518:9;39512:4;39508:20;39504:1;39493:9;39489:17;39482:47;39546:131;39672:4;39546:131;:::i;:::-;39538:139;;39265:419;;;:::o;39690:223::-;39830:34;39826:1;39818:6;39814:14;39807:58;39899:6;39894:2;39886:6;39882:15;39875:31;39690:223;:::o;39919:366::-;40061:3;40082:67;40146:2;40141:3;40082:67;:::i;:::-;40075:74;;40158:93;40247:3;40158:93;:::i;:::-;40276:2;40271:3;40267:12;40260:19;;39919:366;;;:::o;40291:419::-;40457:4;40495:2;40484:9;40480:18;40472:26;;40544:9;40538:4;40534:20;40530:1;40519:9;40515:17;40508:47;40572:131;40698:4;40572:131;:::i;:::-;40564:139;;40291:419;;;:::o;40716:191::-;40756:4;40776:20;40794:1;40776:20;:::i;:::-;40771:25;;40810:20;40828:1;40810:20;:::i;:::-;40805:25;;40849:1;40846;40843:8;40840:34;;;40854:18;;:::i;:::-;40840:34;40899:1;40896;40892:9;40884:17;;40716:191;;;;:::o;40913:182::-;41053:34;41049:1;41041:6;41037:14;41030:58;40913:182;:::o;41101:366::-;41243:3;41264:67;41328:2;41323:3;41264:67;:::i;:::-;41257:74;;41340:93;41429:3;41340:93;:::i;:::-;41458:2;41453:3;41449:12;41442:19;;41101:366;;;:::o;41473:419::-;41639:4;41677:2;41666:9;41662:18;41654:26;;41726:9;41720:4;41716:20;41712:1;41701:9;41697:17;41690:47;41754:131;41880:4;41754:131;:::i;:::-;41746:139;;41473:419;;;:::o;41898:182::-;42038:34;42034:1;42026:6;42022:14;42015:58;41898:182;:::o;42086:366::-;42228:3;42249:67;42313:2;42308:3;42249:67;:::i;:::-;42242:74;;42325:93;42414:3;42325:93;:::i;:::-;42443:2;42438:3;42434:12;42427:19;;42086:366;;;:::o;42458:419::-;42624:4;42662:2;42651:9;42647:18;42639:26;;42711:9;42705:4;42701:20;42697:1;42686:9;42682:17;42675:47;42739:131;42865:4;42739:131;:::i;:::-;42731:139;;42458:419;;;:::o;42883:178::-;43023:30;43019:1;43011:6;43007:14;43000:54;42883:178;:::o;43067:366::-;43209:3;43230:67;43294:2;43289:3;43230:67;:::i;:::-;43223:74;;43306:93;43395:3;43306:93;:::i;:::-;43424:2;43419:3;43415:12;43408:19;;43067:366;;;:::o;43439:419::-;43605:4;43643:2;43632:9;43628:18;43620:26;;43692:9;43686:4;43682:20;43678:1;43667:9;43663:17;43656:47;43720:131;43846:4;43720:131;:::i;:::-;43712:139;;43439:419;;;:::o;43864:175::-;44004:27;44000:1;43992:6;43988:14;43981:51;43864:175;:::o;44045:366::-;44187:3;44208:67;44272:2;44267:3;44208:67;:::i;:::-;44201:74;;44284:93;44373:3;44284:93;:::i;:::-;44402:2;44397:3;44393:12;44386:19;;44045:366;;;:::o;44417:419::-;44583:4;44621:2;44610:9;44606:18;44598:26;;44670:9;44664:4;44660:20;44656:1;44645:9;44641:17;44634:47;44698:131;44824:4;44698:131;:::i;:::-;44690:139;;44417:419;;;:::o;44842:237::-;44982:34;44978:1;44970:6;44966:14;44959:58;45051:20;45046:2;45038:6;45034:15;45027:45;44842:237;:::o;45085:366::-;45227:3;45248:67;45312:2;45307:3;45248:67;:::i;:::-;45241:74;;45324:93;45413:3;45324:93;:::i;:::-;45442:2;45437:3;45433:12;45426:19;;45085:366;;;:::o;45457:419::-;45623:4;45661:2;45650:9;45646:18;45638:26;;45710:9;45704:4;45700:20;45696:1;45685:9;45681:17;45674:47;45738:131;45864:4;45738:131;:::i;:::-;45730:139;;45457:419;;;:::o;45882:233::-;45921:3;45944:24;45962:5;45944:24;:::i;:::-;45935:33;;45990:66;45983:5;45980:77;45977:103;;46060:18;;:::i;:::-;45977:103;46107:1;46100:5;46096:13;46089:20;;45882:233;;;:::o;46121:180::-;46169:77;46166:1;46159:88;46266:4;46263:1;46256:15;46290:4;46287:1;46280:15;46307:185;46347:1;46364:20;46382:1;46364:20;:::i;:::-;46359:25;;46398:20;46416:1;46398:20;:::i;:::-;46393:25;;46437:1;46427:35;;46442:18;;:::i;:::-;46427:35;46484:1;46481;46477:9;46472:14;;46307:185;;;;:::o;46498:176::-;46530:1;46547:20;46565:1;46547:20;:::i;:::-;46542:25;;46581:20;46599:1;46581:20;:::i;:::-;46576:25;;46620:1;46610:35;;46625:18;;:::i;:::-;46610:35;46666:1;46663;46659:9;46654:14;;46498:176;;;;:::o;46680:98::-;46731:6;46765:5;46759:12;46749:22;;46680:98;;;:::o;46784:168::-;46867:11;46901:6;46896:3;46889:19;46941:4;46936:3;46932:14;46917:29;;46784:168;;;;:::o;46958:360::-;47044:3;47072:38;47104:5;47072:38;:::i;:::-;47126:70;47189:6;47184:3;47126:70;:::i;:::-;47119:77;;47205:52;47250:6;47245:3;47238:4;47231:5;47227:16;47205:52;:::i;:::-;47282:29;47304:6;47282:29;:::i;:::-;47277:3;47273:39;47266:46;;47048:270;46958:360;;;;:::o;47324:640::-;47519:4;47557:3;47546:9;47542:19;47534:27;;47571:71;47639:1;47628:9;47624:17;47615:6;47571:71;:::i;:::-;47652:72;47720:2;47709:9;47705:18;47696:6;47652:72;:::i;:::-;47734;47802:2;47791:9;47787:18;47778:6;47734:72;:::i;:::-;47853:9;47847:4;47843:20;47838:2;47827:9;47823:18;47816:48;47881:76;47952:4;47943:6;47881:76;:::i;:::-;47873:84;;47324:640;;;;;;;:::o;47970:141::-;48026:5;48057:6;48051:13;48042:22;;48073:32;48099:5;48073:32;:::i;:::-;47970:141;;;;:::o;48117:349::-;48186:6;48235:2;48223:9;48214:7;48210:23;48206:32;48203:119;;;48241:79;;:::i;:::-;48203:119;48361:1;48386:63;48441:7;48432:6;48421:9;48417:22;48386:63;:::i;:::-;48376:73;;48332:127;48117:349;;;;:::o;48472:180::-;48520:77;48517:1;48510:88;48617:4;48614:1;48607:15;48641:4;48638:1;48631:15

Swarm Source

ipfs://0309dea27eb8fb725ecf1f8fc21222207c84a90a6148bb5c63b2590538663a31
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.