ETH Price: $3,485.23 (+2.27%)
Gas: 9 Gwei

Token

MetaNightClub (MNC)
 

Overview

Max Total Supply

3,781 MNC

Holders

486

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mdrfkr.eth
Balance
1 MNC
0x60314c86b99a2a108e5097fc2688aa1e3c30be30
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:
MetaNightClub

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

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

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

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

  /**
   * @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 ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

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

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

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

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

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

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

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

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

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

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

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

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

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

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

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

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

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

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

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

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

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

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

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

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

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

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


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


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;

contract MetaNightClub is ERC721A, Ownable {

    uint public MAX_TOKENS = 6969;
    uint public MAX_VIP_TOKENS = 696;
    uint public MAX_OG_TOKENS = 2100;


    uint public vipSupply;
    uint public ogSupply;

    string private _baseURIextended;
    bool public publicSaleIsActive = false;
    bool public preSaleIsActive = false;
    bool public privateSaleIsActive = true;
    bool public merkleWhitelist = true;

    bytes32 public PRESALE_MERKLE_ROOT = "";

    uint256 public publicSalePrice = 200000000000000000; //0.2
    uint256 public preSalePrice = 100000000000000000; //0.1
    uint256 public privateSalePrice = 69000000000000000; //0.069
    
    constructor() ERC721A("MetaNightClub", "MNC", 50, 6969) {

    }

    function publicSaleMint(uint numberOfTokens) public payable {
        require(publicSaleIsActive, "Public sale must be active to mint NFTs");
        require(totalSupply() + numberOfTokens <= MAX_TOKENS);
        require(publicSalePrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        _safeMint(msg.sender, numberOfTokens);
    }

    function ogSaleMint(bytes32[] calldata _merkleProof, uint numberOfTokens) public payable {
        require(preSaleIsActive, "Presale sale must be active to mint NFTs");
        require(preSalePrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        require(ogSupply + numberOfTokens <= MAX_OG_TOKENS, "Purchase would exceed OG Supply");
        if (merkleWhitelist) {
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(_merkleProof, PRESALE_MERKLE_ROOT, leaf), "Invalid Proof");
        }
        ogSupply = ogSupply + numberOfTokens;
        _safeMint(msg.sender, numberOfTokens);
    }

    function vipSaleMint(uint numberOfTokens) public payable {
        require(privateSaleIsActive, "Private sale must be active to mint NFTs");
        require(privateSalePrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        require(vipSupply + numberOfTokens <= MAX_VIP_TOKENS, "Purchase would exceed VIP Supply");
        vipSupply = vipSupply + numberOfTokens;
        _safeMint(msg.sender, numberOfTokens);
    }

    function airdropNft(address userAddress, uint numberOfTokens) public onlyOwner {
        require(totalSupply() + numberOfTokens <= MAX_TOKENS);
         _safeMint(userAddress, numberOfTokens);
    }

    function setBaseURI(string memory baseURI_) public onlyOwner() {
        _baseURIextended = baseURI_;
    }

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

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

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

    function flipPrivateMintState() public onlyOwner {
        privateSaleIsActive = !privateSaleIsActive;
    }

    // in case ethereum makes a surprise
    function changePublicPrice(uint256 newPrice) public onlyOwner {
        publicSalePrice = newPrice;
    }

    function changePresaleMerkleRoot(bytes32 presaleMerkleRoot) public onlyOwner {
        PRESALE_MERKLE_ROOT = presaleMerkleRoot;
    }

    function flipMerkleState() public onlyOwner {
        merkleWhitelist = !merkleWhitelist;
    }

    function getHolderTokens(address _owner) public view virtual returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);
        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }

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

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":"MAX_OG_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VIP_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_MERKLE_ROOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"airdropNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"presaleMerkleRoot","type":"bytes32"}],"name":"changePresaleMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changePublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMerkleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPrivateMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getHolderTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"merkleWhitelist","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":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"ogSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ogSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"vipSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"vipSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600080556000600755611b396009556102b8600a55610834600b556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506001600f60026101000a81548160ff0219169083151502179055506001600f60036101000a81548160ff02191690831515021790555060006010556702c68af0bb14000060115567016345785d8a000060125566f5232269808000601355348015620000c057600080fd5b506040518060400160405280600d81526020017f4d6574614e69676874436c7562000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d4e4300000000000000000000000000000000000000000000000000000000008152506032611b396000811162000178576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200016f906200049a565b60405180910390fd5b60008211620001be576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b59062000478565b60405180910390fd5b8360019080519060200190620001d6929190620002f8565b508260029080519060200190620001ef929190620002f8565b508160a0818152505080608081815250505050505062000224620002186200022a60201b60201c565b6200023260201b60201c565b62000532565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200030690620004cd565b90600052602060002090601f0160209004810192826200032a576000855562000376565b82601f106200034557805160ff191683800117855562000376565b8280016001018555821562000376579182015b828111156200037557825182559160200191906001019062000358565b5b50905062000385919062000389565b5090565b5b80821115620003a45760008160009055506001016200038a565b5090565b6000620003b7602783620004bc565b91507f455243373231413a206d61782062617463682073697a65206d7573742062652060008301527f6e6f6e7a65726f000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006200041f602e83620004bc565b91507f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008301527f6e6f6e7a65726f20737570706c790000000000000000000000000000000000006020830152604082019050919050565b600060208201905081810360008301526200049381620003a8565b9050919050565b60006020820190508181036000830152620004b58162000410565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004e657607f821691505b60208210811415620004fd57620004fc62000503565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05161507062000563600039600081816128b0015281816128d90152612ffd0152600050506150706000f3fe60806040526004361061027d5760003560e01c806394813a541161014f578063b88d4fde116100c1578063e757c17d1161007a578063e757c17d14610927578063e985e9c514610952578063f2fde38b1461098f578063f47c84c5146109b8578063f560d415146109e3578063f931a4c214610a0e5761027d565b8063b88d4fde14610821578063be0591db1461084a578063c87b56dd14610866578063d7224ba0146108a3578063e13ce875146108ce578063e547e693146108ea5761027d565b80639d7e8d5f116101135780639d7e8d5f14610746578063a051ead41461076f578063a22cb4651461079a578063a68aa967146107c3578063ae5b7a7d146107da578063b3ab66b0146108055761027d565b806394813a541461068557806395d89b41146106ae57806399c89e81146106d95780639b2573ee146106f05780639b6860c81461071b5761027d565b80633ccfd60b116101f3578063702f2a07116101ac578063702f2a071461059b57806370a08231146105b2578063715018a6146105ef5780638116b28314610606578063853d2eea146106315780638da5cb5b1461065a5761027d565b80633ccfd60b1461048d57806342842e0e146104a45780634f6ccce7146104cd57806355f804b31461050a578063611c4c81146105335780636352211e1461055e5761027d565b8063095ea7b311610245578063095ea7b31461037d5780630fcf2e75146103a657806318160ddd146103d15780631f0234d8146103fc57806323b872dd146104275780632f745c59146104505761027d565b806301ffc9a71461028257806304737a01146102bf57806306fdde03146102ea57806307ce489714610315578063081812fc14610340575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906139a4565b610a25565b6040516102b6919061469e565b60405180910390f35b3480156102cb57600080fd5b506102d4610b6f565b6040516102e1919061469e565b60405180910390f35b3480156102f657600080fd5b506102ff610b82565b60405161030c91906146d4565b60405180910390f35b34801561032157600080fd5b5061032a610c14565b604051610337919061469e565b60405180910390f35b34801561034c57600080fd5b5061036760048036038101906103629190613a37565b610c27565b6040516103749190614615565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906138e7565b610cac565b005b3480156103b257600080fd5b506103bb610dc5565b6040516103c8919061469e565b60405180910390f35b3480156103dd57600080fd5b506103e6610dd8565b6040516103f39190614a56565b60405180910390f35b34801561040857600080fd5b50610411610de1565b60405161041e919061469e565b60405180910390f35b34801561043357600080fd5b5061044e600480360381019061044991906137e1565b610df4565b005b34801561045c57600080fd5b50610477600480360381019061047291906138e7565b610e04565b6040516104849190614a56565b60405180910390f35b34801561049957600080fd5b506104a2611002565b005b3480156104b057600080fd5b506104cb60048036038101906104c691906137e1565b6110c7565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613a37565b6110e7565b6040516105019190614a56565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906139f6565b61113a565b005b34801561053f57600080fd5b506105486111d0565b6040516105559190614a56565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190613a37565b6111d6565b6040516105929190614615565b60405180910390f35b3480156105a757600080fd5b506105b06111ec565b005b3480156105be57600080fd5b506105d960048036038101906105d4919061377c565b611294565b6040516105e69190614a56565b60405180910390f35b3480156105fb57600080fd5b5061060461137d565b005b34801561061257600080fd5b5061061b611405565b6040516106289190614a56565b60405180910390f35b34801561063d57600080fd5b506106586004803603810190610653919061397b565b61140b565b005b34801561066657600080fd5b5061066f611491565b60405161067c9190614615565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a791906138e7565b6114bb565b005b3480156106ba57600080fd5b506106c3611566565b6040516106d091906146d4565b60405180910390f35b3480156106e557600080fd5b506106ee6115f8565b005b3480156106fc57600080fd5b506107056116a0565b6040516107129190614a56565b60405180910390f35b34801561072757600080fd5b506107306116a6565b60405161073d9190614a56565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613a37565b6116ac565b005b34801561077b57600080fd5b50610784611732565b60405161079191906146b9565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc91906138ab565b611738565b005b3480156107cf57600080fd5b506107d86118b9565b005b3480156107e657600080fd5b506107ef611961565b6040516107fc9190614a56565b60405180910390f35b61081f600480360381019061081a9190613a37565b611967565b005b34801561082d57600080fd5b5061084860048036038101906108439190613830565b611a34565b005b610864600480360381019061085f9190613923565b611a90565b005b34801561087257600080fd5b5061088d60048036038101906108889190613a37565b611c73565b60405161089a91906146d4565b60405180910390f35b3480156108af57600080fd5b506108b8611d1a565b6040516108c59190614a56565b60405180910390f35b6108e860048036038101906108e39190613a37565b611d20565b005b3480156108f657600080fd5b50610911600480360381019061090c919061377c565b611e32565b60405161091e919061467c565b60405180910390f35b34801561093357600080fd5b5061093c611f2c565b6040516109499190614a56565b60405180910390f35b34801561095e57600080fd5b50610979600480360381019061097491906137a5565b611f32565b604051610986919061469e565b60405180910390f35b34801561099b57600080fd5b506109b660048036038101906109b1919061377c565b611fc6565b005b3480156109c457600080fd5b506109cd6120be565b6040516109da9190614a56565b60405180910390f35b3480156109ef57600080fd5b506109f86120c4565b604051610a059190614a56565b60405180910390f35b348015610a1a57600080fd5b50610a236120ca565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b685750610b6782612172565b5b9050919050565b600f60029054906101000a900460ff1681565b606060018054610b9190614e13565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90614e13565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050905090565b600f60039054906101000a900460ff1681565b6000610c32826121dc565b610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6890614a16565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cb7826111d6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90614936565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d476121e9565b73ffffffffffffffffffffffffffffffffffffffff161480610d765750610d7581610d706121e9565b611f32565b5b610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac906147f6565b60405180910390fd5b610dc08383836121f1565b505050565b600f60009054906101000a900460ff1681565b60008054905090565b600f60019054906101000a900460ff1681565b610dff8383836122a3565b505050565b6000610e0f83611294565b8210610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e47906146f6565b60405180910390fd5b6000610e5a610dd8565b905060008060005b83811015610fc0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f5457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fac5786841415610f9d578195505050505050610ffc565b8380610fa890614e45565b9450505b508080610fb890614e45565b915050610e62565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff3906149d6565b60405180910390fd5b92915050565b61100a6121e9565b73ffffffffffffffffffffffffffffffffffffffff16611028611491565b73ffffffffffffffffffffffffffffffffffffffff161461107e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107590614856565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156110c4573d6000803e3d6000fd5b50565b6110e283838360405180602001604052806000815250611a34565b505050565b60006110f1610dd8565b8210611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614796565b60405180910390fd5b819050919050565b6111426121e9565b73ffffffffffffffffffffffffffffffffffffffff16611160611491565b73ffffffffffffffffffffffffffffffffffffffff16146111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90614856565b60405180910390fd5b80600e90805190602001906111cc929190613507565b5050565b600b5481565b60006111e18261285c565b600001519050919050565b6111f46121e9565b73ffffffffffffffffffffffffffffffffffffffff16611212611491565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90614856565b60405180910390fd5b600f60039054906101000a900460ff1615600f60036101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc90614816565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6113856121e9565b73ffffffffffffffffffffffffffffffffffffffff166113a3611491565b73ffffffffffffffffffffffffffffffffffffffff16146113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f090614856565b60405180910390fd5b6114036000612a5f565b565b600a5481565b6114136121e9565b73ffffffffffffffffffffffffffffffffffffffff16611431611491565b73ffffffffffffffffffffffffffffffffffffffff1614611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e90614856565b60405180910390fd5b8060108190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114c36121e9565b73ffffffffffffffffffffffffffffffffffffffff166114e1611491565b73ffffffffffffffffffffffffffffffffffffffff1614611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90614856565b60405180910390fd5b60095481611543610dd8565b61154d9190614bc4565b111561155857600080fd5b6115628282612b25565b5050565b60606002805461157590614e13565b80601f01602080910402602001604051908101604052809291908181526020018280546115a190614e13565b80156115ee5780601f106115c3576101008083540402835291602001916115ee565b820191906000526020600020905b8154815290600101906020018083116115d157829003601f168201915b5050505050905090565b6116006121e9565b73ffffffffffffffffffffffffffffffffffffffff1661161e611491565b73ffffffffffffffffffffffffffffffffffffffff1614611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90614856565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c5481565b60115481565b6116b46121e9565b73ffffffffffffffffffffffffffffffffffffffff166116d2611491565b73ffffffffffffffffffffffffffffffffffffffff1614611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f90614856565b60405180910390fd5b8060118190555050565b60105481565b6117406121e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a5906148d6565b60405180910390fd5b80600660006117bb6121e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118686121e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118ad919061469e565b60405180910390a35050565b6118c16121e9565b73ffffffffffffffffffffffffffffffffffffffff166118df611491565b73ffffffffffffffffffffffffffffffffffffffff1614611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c90614856565b60405180910390fd5b600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b600d5481565b600f60009054906101000a900460ff166119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90614716565b60405180910390fd5b600954816119c2610dd8565b6119cc9190614bc4565b11156119d757600080fd5b34816011546119e69190614c4b565b1115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e906147d6565b60405180910390fd5b611a313382612b25565b50565b611a3f8484846122a3565b611a4b84848484612b43565b611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190614956565b60405180910390fd5b50505050565b600f60019054906101000a900460ff16611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad6906148b6565b60405180910390fd5b3481601254611aee9190614c4b565b1115611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b26906147d6565b60405180910390fd5b600b5481600d54611b409190614bc4565b1115611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890614876565b60405180910390fd5b600f60039054906101000a900460ff1615611c5057600033604051602001611ba991906145aa565b604051602081830303815290604052805190602001209050611c0f848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612cda565b611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c45906149b6565b60405180910390fd5b505b80600d54611c5e9190614bc4565b600d81905550611c6e3382612b25565b505050565b6060611c7e826121dc565b611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb490614896565b60405180910390fd5b6000611cc7612cf1565b90506000815111611ce75760405180602001604052806000815250611d12565b80611cf184612d83565b604051602001611d029291906145f1565b6040516020818303038152906040525b915050919050565b60075481565b600f60029054906101000a900460ff16611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6690614736565b60405180910390fd5b3481601354611d7e9190614c4b565b1115611dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db6906147d6565b60405180910390fd5b600a5481600c54611dd09190614bc4565b1115611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0890614916565b60405180910390fd5b80600c54611e1f9190614bc4565b600c81905550611e2f3382612b25565b50565b60606000611e3f83611294565b905060008167ffffffffffffffff811115611e83577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611eb15781602001602082028036833780820191505090505b50905060005b82811015611f2157611ec98582610e04565b828281518110611f02577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611f1990614e45565b915050611eb7565b508092505050919050565b60125481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fce6121e9565b73ffffffffffffffffffffffffffffffffffffffff16611fec611491565b73ffffffffffffffffffffffffffffffffffffffff1614612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203990614856565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614756565b60405180910390fd5b6120bb81612a5f565b50565b60095481565b60135481565b6120d26121e9565b73ffffffffffffffffffffffffffffffffffffffff166120f0611491565b73ffffffffffffffffffffffffffffffffffffffff1614612146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213d90614856565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006122ae8261285c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166122d56121e9565b73ffffffffffffffffffffffffffffffffffffffff16148061233157506122fa6121e9565b73ffffffffffffffffffffffffffffffffffffffff1661231984610c27565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234d575061234c82600001516123476121e9565b611f32565b5b90508061238f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612386906148f6565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f890614836565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612468906147b6565b60405180910390fd5b61247e8585856001612f30565b61248e60008484600001516121f1565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166124fc9190614ca5565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166125a09190614b7e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846126a69190614bc4565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156127ec5761271c816121dc565b156127eb576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128548686866001612f36565b505050505050565b61286461358d565b61286d826121dc565b6128ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a390614776565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106129105760017f0000000000000000000000000000000000000000000000000000000000000000846129039190614cd9565b61290d9190614bc4565b90505b60008390505b818110612a1e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a0a57809350505050612a5a565b508080612a1690614de9565b915050612916565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a51906149f6565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b3f828260405180602001604052806000815250612f3c565b5050565b6000612b648473ffffffffffffffffffffffffffffffffffffffff1661341b565b15612ccd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b8d6121e9565b8786866040518563ffffffff1660e01b8152600401612baf9493929190614630565b602060405180830381600087803b158015612bc957600080fd5b505af1925050508015612bfa57506040513d601f19601f82011682018060405250810190612bf791906139cd565b60015b612c7d573d8060008114612c2a576040519150601f19603f3d011682016040523d82523d6000602084013e612c2f565b606091505b50600081511415612c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6c90614956565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cd2565b600190505b949350505050565b600082612ce7858461342e565b1490509392505050565b6060600e8054612d0090614e13565b80601f0160208091040260200160405190810160405280929190818152602001828054612d2c90614e13565b8015612d795780601f10612d4e57610100808354040283529160200191612d79565b820191906000526020600020905b815481529060010190602001808311612d5c57829003601f168201915b5050505050905090565b60606000821415612dcb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f2b565b600082905060005b60008214612dfd578080612de690614e45565b915050600a82612df69190614c1a565b9150612dd3565b60008167ffffffffffffffff811115612e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e715781602001600182028036833780820191505090505b5090505b60008514612f2457600182612e8a9190614cd9565b9150600a85612e999190614ebc565b6030612ea59190614bc4565b60f81b818381518110612ee1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f1d9190614c1a565b9450612e75565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa990614996565b60405180910390fd5b612fbb816121dc565b15612ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff290614976565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083111561305e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305590614a36565b60405180910390fd5b61306b6000858386612f30565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516131689190614b7e565b6fffffffffffffffffffffffffffffffff16815260200185836020015161318f9190614b7e565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156133fe57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461339e6000888488612b43565b6133dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d490614956565b60405180910390fd5b81806133e890614e45565b92505080806133f690614e45565b91505061332d565b50806000819055506134136000878588612f36565b505050505050565b600080823b905060008111915050919050565b60008082905060005b84518110156134fc57600085828151811061347b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116134bc57828160405160200161349f9291906145c5565b6040516020818303038152906040528051906020012092506134e8565b80836040516020016134cf9291906145c5565b6040516020818303038152906040528051906020012092505b5080806134f490614e45565b915050613437565b508091505092915050565b82805461351390614e13565b90600052602060002090601f016020900481019282613535576000855561357c565b82601f1061354e57805160ff191683800117855561357c565b8280016001018555821561357c579182015b8281111561357b578251825591602001919060010190613560565b5b50905061358991906135c7565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156135e05760008160009055506001016135c8565b5090565b60006135f76135f284614aa2565b614a71565b90508281526020810184848401111561360f57600080fd5b61361a848285614da7565b509392505050565b600061363561363084614ad2565b614a71565b90508281526020810184848401111561364d57600080fd5b613658848285614da7565b509392505050565b60008135905061366f81614fc7565b92915050565b60008083601f84011261368757600080fd5b8235905067ffffffffffffffff8111156136a057600080fd5b6020830191508360208202830111156136b857600080fd5b9250929050565b6000813590506136ce81614fde565b92915050565b6000813590506136e381614ff5565b92915050565b6000813590506136f88161500c565b92915050565b60008151905061370d8161500c565b92915050565b600082601f83011261372457600080fd5b81356137348482602086016135e4565b91505092915050565b600082601f83011261374e57600080fd5b813561375e848260208601613622565b91505092915050565b60008135905061377681615023565b92915050565b60006020828403121561378e57600080fd5b600061379c84828501613660565b91505092915050565b600080604083850312156137b857600080fd5b60006137c685828601613660565b92505060206137d785828601613660565b9150509250929050565b6000806000606084860312156137f657600080fd5b600061380486828701613660565b935050602061381586828701613660565b925050604061382686828701613767565b9150509250925092565b6000806000806080858703121561384657600080fd5b600061385487828801613660565b945050602061386587828801613660565b935050604061387687828801613767565b925050606085013567ffffffffffffffff81111561389357600080fd5b61389f87828801613713565b91505092959194509250565b600080604083850312156138be57600080fd5b60006138cc85828601613660565b92505060206138dd858286016136bf565b9150509250929050565b600080604083850312156138fa57600080fd5b600061390885828601613660565b925050602061391985828601613767565b9150509250929050565b60008060006040848603121561393857600080fd5b600084013567ffffffffffffffff81111561395257600080fd5b61395e86828701613675565b9350935050602061397186828701613767565b9150509250925092565b60006020828403121561398d57600080fd5b600061399b848285016136d4565b91505092915050565b6000602082840312156139b657600080fd5b60006139c4848285016136e9565b91505092915050565b6000602082840312156139df57600080fd5b60006139ed848285016136fe565b91505092915050565b600060208284031215613a0857600080fd5b600082013567ffffffffffffffff811115613a2257600080fd5b613a2e8482850161373d565b91505092915050565b600060208284031215613a4957600080fd5b6000613a5784828501613767565b91505092915050565b6000613a6c838361458c565b60208301905092915050565b613a8181614d0d565b82525050565b613a98613a9382614d0d565b614e8e565b82525050565b6000613aa982614b12565b613ab38185614b40565b9350613abe83614b02565b8060005b83811015613aef578151613ad68882613a60565b9750613ae183614b33565b925050600181019050613ac2565b5085935050505092915050565b613b0581614d1f565b82525050565b613b1481614d2b565b82525050565b613b2b613b2682614d2b565b614ea0565b82525050565b6000613b3c82614b1d565b613b468185614b51565b9350613b56818560208601614db6565b613b5f81614fa9565b840191505092915050565b6000613b7582614b28565b613b7f8185614b62565b9350613b8f818560208601614db6565b613b9881614fa9565b840191505092915050565b6000613bae82614b28565b613bb88185614b73565b9350613bc8818560208601614db6565b80840191505092915050565b6000613be1602283614b62565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c47602783614b62565b91507f5075626c69632073616c65206d7573742062652061637469766520746f206d6960008301527f6e74204e465473000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cad602883614b62565b91507f507269766174652073616c65206d7573742062652061637469766520746f206d60008301527f696e74204e4654730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d13602683614b62565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d79602a83614b62565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ddf602383614b62565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e45602583614b62565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613eab601f83614b62565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613eeb603983614b62565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613f51602b83614b62565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb7602683614b62565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061401d602083614b62565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061405d601f83614b62565b91507f507572636861736520776f756c6420657863656564204f4720537570706c79006000830152602082019050919050565b600061409d602f83614b62565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614103602883614b62565b91507f50726573616c652073616c65206d7573742062652061637469766520746f206d60008301527f696e74204e4654730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614169601a83614b62565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006141a9603283614b62565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061420f602083614b62565b91507f507572636861736520776f756c64206578636565642056495020537570706c796000830152602082019050919050565b600061424f602283614b62565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142b5603383614b62565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b600061431b601d83614b62565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b600061435b602183614b62565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143c1600d83614b62565b91507f496e76616c69642050726f6f66000000000000000000000000000000000000006000830152602082019050919050565b6000614401602e83614b62565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000614467602f83614b62565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006144cd602d83614b62565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614533602283614b62565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61459581614d9d565b82525050565b6145a481614d9d565b82525050565b60006145b68284613a87565b60148201915081905092915050565b60006145d18285613b1a565b6020820191506145e18284613b1a565b6020820191508190509392505050565b60006145fd8285613ba3565b91506146098284613ba3565b91508190509392505050565b600060208201905061462a6000830184613a78565b92915050565b60006080820190506146456000830187613a78565b6146526020830186613a78565b61465f604083018561459b565b81810360608301526146718184613b31565b905095945050505050565b600060208201905081810360008301526146968184613a9e565b905092915050565b60006020820190506146b36000830184613afc565b92915050565b60006020820190506146ce6000830184613b0b565b92915050565b600060208201905081810360008301526146ee8184613b6a565b905092915050565b6000602082019050818103600083015261470f81613bd4565b9050919050565b6000602082019050818103600083015261472f81613c3a565b9050919050565b6000602082019050818103600083015261474f81613ca0565b9050919050565b6000602082019050818103600083015261476f81613d06565b9050919050565b6000602082019050818103600083015261478f81613d6c565b9050919050565b600060208201905081810360008301526147af81613dd2565b9050919050565b600060208201905081810360008301526147cf81613e38565b9050919050565b600060208201905081810360008301526147ef81613e9e565b9050919050565b6000602082019050818103600083015261480f81613ede565b9050919050565b6000602082019050818103600083015261482f81613f44565b9050919050565b6000602082019050818103600083015261484f81613faa565b9050919050565b6000602082019050818103600083015261486f81614010565b9050919050565b6000602082019050818103600083015261488f81614050565b9050919050565b600060208201905081810360008301526148af81614090565b9050919050565b600060208201905081810360008301526148cf816140f6565b9050919050565b600060208201905081810360008301526148ef8161415c565b9050919050565b6000602082019050818103600083015261490f8161419c565b9050919050565b6000602082019050818103600083015261492f81614202565b9050919050565b6000602082019050818103600083015261494f81614242565b9050919050565b6000602082019050818103600083015261496f816142a8565b9050919050565b6000602082019050818103600083015261498f8161430e565b9050919050565b600060208201905081810360008301526149af8161434e565b9050919050565b600060208201905081810360008301526149cf816143b4565b9050919050565b600060208201905081810360008301526149ef816143f4565b9050919050565b60006020820190508181036000830152614a0f8161445a565b9050919050565b60006020820190508181036000830152614a2f816144c0565b9050919050565b60006020820190508181036000830152614a4f81614526565b9050919050565b6000602082019050614a6b600083018461459b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a9857614a97614f7a565b5b8060405250919050565b600067ffffffffffffffff821115614abd57614abc614f7a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614aed57614aec614f7a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b8982614d61565b9150614b9483614d61565b9250826fffffffffffffffffffffffffffffffff03821115614bb957614bb8614eed565b5b828201905092915050565b6000614bcf82614d9d565b9150614bda83614d9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c0f57614c0e614eed565b5b828201905092915050565b6000614c2582614d9d565b9150614c3083614d9d565b925082614c4057614c3f614f1c565b5b828204905092915050565b6000614c5682614d9d565b9150614c6183614d9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c9a57614c99614eed565b5b828202905092915050565b6000614cb082614d61565b9150614cbb83614d61565b925082821015614cce57614ccd614eed565b5b828203905092915050565b6000614ce482614d9d565b9150614cef83614d9d565b925082821015614d0257614d01614eed565b5b828203905092915050565b6000614d1882614d7d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614dd4578082015181840152602081019050614db9565b83811115614de3576000848401525b50505050565b6000614df482614d9d565b91506000821415614e0857614e07614eed565b5b600182039050919050565b60006002820490506001821680614e2b57607f821691505b60208210811415614e3f57614e3e614f4b565b5b50919050565b6000614e5082614d9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e8357614e82614eed565b5b600182019050919050565b6000614e9982614eaa565b9050919050565b6000819050919050565b6000614eb582614fba565b9050919050565b6000614ec782614d9d565b9150614ed283614d9d565b925082614ee257614ee1614f1c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614fd081614d0d565b8114614fdb57600080fd5b50565b614fe781614d1f565b8114614ff257600080fd5b50565b614ffe81614d2b565b811461500957600080fd5b50565b61501581614d35565b811461502057600080fd5b50565b61502c81614d9d565b811461503757600080fd5b5056fea2646970667358221220d897851fdfe670b4405bb16faccb7ffe6453fe1b2a742a2c46bd75779d9e400564736f6c63430008000033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c806394813a541161014f578063b88d4fde116100c1578063e757c17d1161007a578063e757c17d14610927578063e985e9c514610952578063f2fde38b1461098f578063f47c84c5146109b8578063f560d415146109e3578063f931a4c214610a0e5761027d565b8063b88d4fde14610821578063be0591db1461084a578063c87b56dd14610866578063d7224ba0146108a3578063e13ce875146108ce578063e547e693146108ea5761027d565b80639d7e8d5f116101135780639d7e8d5f14610746578063a051ead41461076f578063a22cb4651461079a578063a68aa967146107c3578063ae5b7a7d146107da578063b3ab66b0146108055761027d565b806394813a541461068557806395d89b41146106ae57806399c89e81146106d95780639b2573ee146106f05780639b6860c81461071b5761027d565b80633ccfd60b116101f3578063702f2a07116101ac578063702f2a071461059b57806370a08231146105b2578063715018a6146105ef5780638116b28314610606578063853d2eea146106315780638da5cb5b1461065a5761027d565b80633ccfd60b1461048d57806342842e0e146104a45780634f6ccce7146104cd57806355f804b31461050a578063611c4c81146105335780636352211e1461055e5761027d565b8063095ea7b311610245578063095ea7b31461037d5780630fcf2e75146103a657806318160ddd146103d15780631f0234d8146103fc57806323b872dd146104275780632f745c59146104505761027d565b806301ffc9a71461028257806304737a01146102bf57806306fdde03146102ea57806307ce489714610315578063081812fc14610340575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906139a4565b610a25565b6040516102b6919061469e565b60405180910390f35b3480156102cb57600080fd5b506102d4610b6f565b6040516102e1919061469e565b60405180910390f35b3480156102f657600080fd5b506102ff610b82565b60405161030c91906146d4565b60405180910390f35b34801561032157600080fd5b5061032a610c14565b604051610337919061469e565b60405180910390f35b34801561034c57600080fd5b5061036760048036038101906103629190613a37565b610c27565b6040516103749190614615565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f91906138e7565b610cac565b005b3480156103b257600080fd5b506103bb610dc5565b6040516103c8919061469e565b60405180910390f35b3480156103dd57600080fd5b506103e6610dd8565b6040516103f39190614a56565b60405180910390f35b34801561040857600080fd5b50610411610de1565b60405161041e919061469e565b60405180910390f35b34801561043357600080fd5b5061044e600480360381019061044991906137e1565b610df4565b005b34801561045c57600080fd5b50610477600480360381019061047291906138e7565b610e04565b6040516104849190614a56565b60405180910390f35b34801561049957600080fd5b506104a2611002565b005b3480156104b057600080fd5b506104cb60048036038101906104c691906137e1565b6110c7565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613a37565b6110e7565b6040516105019190614a56565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906139f6565b61113a565b005b34801561053f57600080fd5b506105486111d0565b6040516105559190614a56565b60405180910390f35b34801561056a57600080fd5b5061058560048036038101906105809190613a37565b6111d6565b6040516105929190614615565b60405180910390f35b3480156105a757600080fd5b506105b06111ec565b005b3480156105be57600080fd5b506105d960048036038101906105d4919061377c565b611294565b6040516105e69190614a56565b60405180910390f35b3480156105fb57600080fd5b5061060461137d565b005b34801561061257600080fd5b5061061b611405565b6040516106289190614a56565b60405180910390f35b34801561063d57600080fd5b506106586004803603810190610653919061397b565b61140b565b005b34801561066657600080fd5b5061066f611491565b60405161067c9190614615565b60405180910390f35b34801561069157600080fd5b506106ac60048036038101906106a791906138e7565b6114bb565b005b3480156106ba57600080fd5b506106c3611566565b6040516106d091906146d4565b60405180910390f35b3480156106e557600080fd5b506106ee6115f8565b005b3480156106fc57600080fd5b506107056116a0565b6040516107129190614a56565b60405180910390f35b34801561072757600080fd5b506107306116a6565b60405161073d9190614a56565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613a37565b6116ac565b005b34801561077b57600080fd5b50610784611732565b60405161079191906146b9565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc91906138ab565b611738565b005b3480156107cf57600080fd5b506107d86118b9565b005b3480156107e657600080fd5b506107ef611961565b6040516107fc9190614a56565b60405180910390f35b61081f600480360381019061081a9190613a37565b611967565b005b34801561082d57600080fd5b5061084860048036038101906108439190613830565b611a34565b005b610864600480360381019061085f9190613923565b611a90565b005b34801561087257600080fd5b5061088d60048036038101906108889190613a37565b611c73565b60405161089a91906146d4565b60405180910390f35b3480156108af57600080fd5b506108b8611d1a565b6040516108c59190614a56565b60405180910390f35b6108e860048036038101906108e39190613a37565b611d20565b005b3480156108f657600080fd5b50610911600480360381019061090c919061377c565b611e32565b60405161091e919061467c565b60405180910390f35b34801561093357600080fd5b5061093c611f2c565b6040516109499190614a56565b60405180910390f35b34801561095e57600080fd5b50610979600480360381019061097491906137a5565b611f32565b604051610986919061469e565b60405180910390f35b34801561099b57600080fd5b506109b660048036038101906109b1919061377c565b611fc6565b005b3480156109c457600080fd5b506109cd6120be565b6040516109da9190614a56565b60405180910390f35b3480156109ef57600080fd5b506109f86120c4565b604051610a059190614a56565b60405180910390f35b348015610a1a57600080fd5b50610a236120ca565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610af057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b5857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b685750610b6782612172565b5b9050919050565b600f60029054906101000a900460ff1681565b606060018054610b9190614e13565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbd90614e13565b8015610c0a5780601f10610bdf57610100808354040283529160200191610c0a565b820191906000526020600020905b815481529060010190602001808311610bed57829003601f168201915b5050505050905090565b600f60039054906101000a900460ff1681565b6000610c32826121dc565b610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6890614a16565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cb7826111d6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f90614936565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d476121e9565b73ffffffffffffffffffffffffffffffffffffffff161480610d765750610d7581610d706121e9565b611f32565b5b610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac906147f6565b60405180910390fd5b610dc08383836121f1565b505050565b600f60009054906101000a900460ff1681565b60008054905090565b600f60019054906101000a900460ff1681565b610dff8383836122a3565b505050565b6000610e0f83611294565b8210610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e47906146f6565b60405180910390fd5b6000610e5a610dd8565b905060008060005b83811015610fc0576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f5457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fac5786841415610f9d578195505050505050610ffc565b8380610fa890614e45565b9450505b508080610fb890614e45565b915050610e62565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff3906149d6565b60405180910390fd5b92915050565b61100a6121e9565b73ffffffffffffffffffffffffffffffffffffffff16611028611491565b73ffffffffffffffffffffffffffffffffffffffff161461107e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107590614856565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156110c4573d6000803e3d6000fd5b50565b6110e283838360405180602001604052806000815250611a34565b505050565b60006110f1610dd8565b8210611132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112990614796565b60405180910390fd5b819050919050565b6111426121e9565b73ffffffffffffffffffffffffffffffffffffffff16611160611491565b73ffffffffffffffffffffffffffffffffffffffff16146111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90614856565b60405180910390fd5b80600e90805190602001906111cc929190613507565b5050565b600b5481565b60006111e18261285c565b600001519050919050565b6111f46121e9565b73ffffffffffffffffffffffffffffffffffffffff16611212611491565b73ffffffffffffffffffffffffffffffffffffffff1614611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90614856565b60405180910390fd5b600f60039054906101000a900460ff1615600f60036101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc90614816565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6113856121e9565b73ffffffffffffffffffffffffffffffffffffffff166113a3611491565b73ffffffffffffffffffffffffffffffffffffffff16146113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f090614856565b60405180910390fd5b6114036000612a5f565b565b600a5481565b6114136121e9565b73ffffffffffffffffffffffffffffffffffffffff16611431611491565b73ffffffffffffffffffffffffffffffffffffffff1614611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147e90614856565b60405180910390fd5b8060108190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6114c36121e9565b73ffffffffffffffffffffffffffffffffffffffff166114e1611491565b73ffffffffffffffffffffffffffffffffffffffff1614611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90614856565b60405180910390fd5b60095481611543610dd8565b61154d9190614bc4565b111561155857600080fd5b6115628282612b25565b5050565b60606002805461157590614e13565b80601f01602080910402602001604051908101604052809291908181526020018280546115a190614e13565b80156115ee5780601f106115c3576101008083540402835291602001916115ee565b820191906000526020600020905b8154815290600101906020018083116115d157829003601f168201915b5050505050905090565b6116006121e9565b73ffffffffffffffffffffffffffffffffffffffff1661161e611491565b73ffffffffffffffffffffffffffffffffffffffff1614611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166b90614856565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c5481565b60115481565b6116b46121e9565b73ffffffffffffffffffffffffffffffffffffffff166116d2611491565b73ffffffffffffffffffffffffffffffffffffffff1614611728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171f90614856565b60405180910390fd5b8060118190555050565b60105481565b6117406121e9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a5906148d6565b60405180910390fd5b80600660006117bb6121e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118686121e9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118ad919061469e565b60405180910390a35050565b6118c16121e9565b73ffffffffffffffffffffffffffffffffffffffff166118df611491565b73ffffffffffffffffffffffffffffffffffffffff1614611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c90614856565b60405180910390fd5b600f60029054906101000a900460ff1615600f60026101000a81548160ff021916908315150217905550565b600d5481565b600f60009054906101000a900460ff166119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90614716565b60405180910390fd5b600954816119c2610dd8565b6119cc9190614bc4565b11156119d757600080fd5b34816011546119e69190614c4b565b1115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e906147d6565b60405180910390fd5b611a313382612b25565b50565b611a3f8484846122a3565b611a4b84848484612b43565b611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190614956565b60405180910390fd5b50505050565b600f60019054906101000a900460ff16611adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad6906148b6565b60405180910390fd5b3481601254611aee9190614c4b565b1115611b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b26906147d6565b60405180910390fd5b600b5481600d54611b409190614bc4565b1115611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890614876565b60405180910390fd5b600f60039054906101000a900460ff1615611c5057600033604051602001611ba991906145aa565b604051602081830303815290604052805190602001209050611c0f848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060105483612cda565b611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c45906149b6565b60405180910390fd5b505b80600d54611c5e9190614bc4565b600d81905550611c6e3382612b25565b505050565b6060611c7e826121dc565b611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb490614896565b60405180910390fd5b6000611cc7612cf1565b90506000815111611ce75760405180602001604052806000815250611d12565b80611cf184612d83565b604051602001611d029291906145f1565b6040516020818303038152906040525b915050919050565b60075481565b600f60029054906101000a900460ff16611d6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6690614736565b60405180910390fd5b3481601354611d7e9190614c4b565b1115611dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db6906147d6565b60405180910390fd5b600a5481600c54611dd09190614bc4565b1115611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0890614916565b60405180910390fd5b80600c54611e1f9190614bc4565b600c81905550611e2f3382612b25565b50565b60606000611e3f83611294565b905060008167ffffffffffffffff811115611e83577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611eb15781602001602082028036833780820191505090505b50905060005b82811015611f2157611ec98582610e04565b828281518110611f02577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611f1990614e45565b915050611eb7565b508092505050919050565b60125481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611fce6121e9565b73ffffffffffffffffffffffffffffffffffffffff16611fec611491565b73ffffffffffffffffffffffffffffffffffffffff1614612042576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203990614856565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614756565b60405180910390fd5b6120bb81612a5f565b50565b60095481565b60135481565b6120d26121e9565b73ffffffffffffffffffffffffffffffffffffffff166120f0611491565b73ffffffffffffffffffffffffffffffffffffffff1614612146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213d90614856565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006122ae8261285c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166122d56121e9565b73ffffffffffffffffffffffffffffffffffffffff16148061233157506122fa6121e9565b73ffffffffffffffffffffffffffffffffffffffff1661231984610c27565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234d575061234c82600001516123476121e9565b611f32565b5b90508061238f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612386906148f6565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f890614836565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612468906147b6565b60405180910390fd5b61247e8585856001612f30565b61248e60008484600001516121f1565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166124fc9190614ca5565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166125a09190614b7e565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846126a69190614bc4565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156127ec5761271c816121dc565b156127eb576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128548686866001612f36565b505050505050565b61286461358d565b61286d826121dc565b6128ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a390614776565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000003283106129105760017f0000000000000000000000000000000000000000000000000000000000000032846129039190614cd9565b61290d9190614bc4565b90505b60008390505b818110612a1e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a0a57809350505050612a5a565b508080612a1690614de9565b915050612916565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a51906149f6565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b3f828260405180602001604052806000815250612f3c565b5050565b6000612b648473ffffffffffffffffffffffffffffffffffffffff1661341b565b15612ccd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b8d6121e9565b8786866040518563ffffffff1660e01b8152600401612baf9493929190614630565b602060405180830381600087803b158015612bc957600080fd5b505af1925050508015612bfa57506040513d601f19601f82011682018060405250810190612bf791906139cd565b60015b612c7d573d8060008114612c2a576040519150601f19603f3d011682016040523d82523d6000602084013e612c2f565b606091505b50600081511415612c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6c90614956565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612cd2565b600190505b949350505050565b600082612ce7858461342e565b1490509392505050565b6060600e8054612d0090614e13565b80601f0160208091040260200160405190810160405280929190818152602001828054612d2c90614e13565b8015612d795780601f10612d4e57610100808354040283529160200191612d79565b820191906000526020600020905b815481529060010190602001808311612d5c57829003601f168201915b5050505050905090565b60606000821415612dcb576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f2b565b600082905060005b60008214612dfd578080612de690614e45565b915050600a82612df69190614c1a565b9150612dd3565b60008167ffffffffffffffff811115612e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e715781602001600182028036833780820191505090505b5090505b60008514612f2457600182612e8a9190614cd9565b9150600a85612e999190614ebc565b6030612ea59190614bc4565b60f81b818381518110612ee1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f1d9190614c1a565b9450612e75565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa990614996565b60405180910390fd5b612fbb816121dc565b15612ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff290614976565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000003283111561305e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305590614a36565b60405180910390fd5b61306b6000858386612f30565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516131689190614b7e565b6fffffffffffffffffffffffffffffffff16815260200185836020015161318f9190614b7e565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156133fe57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461339e6000888488612b43565b6133dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d490614956565b60405180910390fd5b81806133e890614e45565b92505080806133f690614e45565b91505061332d565b50806000819055506134136000878588612f36565b505050505050565b600080823b905060008111915050919050565b60008082905060005b84518110156134fc57600085828151811061347b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116134bc57828160405160200161349f9291906145c5565b6040516020818303038152906040528051906020012092506134e8565b80836040516020016134cf9291906145c5565b6040516020818303038152906040528051906020012092505b5080806134f490614e45565b915050613437565b508091505092915050565b82805461351390614e13565b90600052602060002090601f016020900481019282613535576000855561357c565b82601f1061354e57805160ff191683800117855561357c565b8280016001018555821561357c579182015b8281111561357b578251825591602001919060010190613560565b5b50905061358991906135c7565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156135e05760008160009055506001016135c8565b5090565b60006135f76135f284614aa2565b614a71565b90508281526020810184848401111561360f57600080fd5b61361a848285614da7565b509392505050565b600061363561363084614ad2565b614a71565b90508281526020810184848401111561364d57600080fd5b613658848285614da7565b509392505050565b60008135905061366f81614fc7565b92915050565b60008083601f84011261368757600080fd5b8235905067ffffffffffffffff8111156136a057600080fd5b6020830191508360208202830111156136b857600080fd5b9250929050565b6000813590506136ce81614fde565b92915050565b6000813590506136e381614ff5565b92915050565b6000813590506136f88161500c565b92915050565b60008151905061370d8161500c565b92915050565b600082601f83011261372457600080fd5b81356137348482602086016135e4565b91505092915050565b600082601f83011261374e57600080fd5b813561375e848260208601613622565b91505092915050565b60008135905061377681615023565b92915050565b60006020828403121561378e57600080fd5b600061379c84828501613660565b91505092915050565b600080604083850312156137b857600080fd5b60006137c685828601613660565b92505060206137d785828601613660565b9150509250929050565b6000806000606084860312156137f657600080fd5b600061380486828701613660565b935050602061381586828701613660565b925050604061382686828701613767565b9150509250925092565b6000806000806080858703121561384657600080fd5b600061385487828801613660565b945050602061386587828801613660565b935050604061387687828801613767565b925050606085013567ffffffffffffffff81111561389357600080fd5b61389f87828801613713565b91505092959194509250565b600080604083850312156138be57600080fd5b60006138cc85828601613660565b92505060206138dd858286016136bf565b9150509250929050565b600080604083850312156138fa57600080fd5b600061390885828601613660565b925050602061391985828601613767565b9150509250929050565b60008060006040848603121561393857600080fd5b600084013567ffffffffffffffff81111561395257600080fd5b61395e86828701613675565b9350935050602061397186828701613767565b9150509250925092565b60006020828403121561398d57600080fd5b600061399b848285016136d4565b91505092915050565b6000602082840312156139b657600080fd5b60006139c4848285016136e9565b91505092915050565b6000602082840312156139df57600080fd5b60006139ed848285016136fe565b91505092915050565b600060208284031215613a0857600080fd5b600082013567ffffffffffffffff811115613a2257600080fd5b613a2e8482850161373d565b91505092915050565b600060208284031215613a4957600080fd5b6000613a5784828501613767565b91505092915050565b6000613a6c838361458c565b60208301905092915050565b613a8181614d0d565b82525050565b613a98613a9382614d0d565b614e8e565b82525050565b6000613aa982614b12565b613ab38185614b40565b9350613abe83614b02565b8060005b83811015613aef578151613ad68882613a60565b9750613ae183614b33565b925050600181019050613ac2565b5085935050505092915050565b613b0581614d1f565b82525050565b613b1481614d2b565b82525050565b613b2b613b2682614d2b565b614ea0565b82525050565b6000613b3c82614b1d565b613b468185614b51565b9350613b56818560208601614db6565b613b5f81614fa9565b840191505092915050565b6000613b7582614b28565b613b7f8185614b62565b9350613b8f818560208601614db6565b613b9881614fa9565b840191505092915050565b6000613bae82614b28565b613bb88185614b73565b9350613bc8818560208601614db6565b80840191505092915050565b6000613be1602283614b62565b91507f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c47602783614b62565b91507f5075626c69632073616c65206d7573742062652061637469766520746f206d6960008301527f6e74204e465473000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cad602883614b62565b91507f507269766174652073616c65206d7573742062652061637469766520746f206d60008301527f696e74204e4654730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d13602683614b62565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d79602a83614b62565b91507f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008301527f74656e7420746f6b656e000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ddf602383614b62565b91507f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008301527f6e647300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e45602583614b62565b91507f455243373231413a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613eab601f83614b62565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000613eeb603983614b62565b91507f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006020830152604082019050919050565b6000613f51602b83614b62565b91507f455243373231413a2062616c616e636520717565727920666f7220746865207a60008301527f65726f20616464726573730000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb7602683614b62565b91507f455243373231413a207472616e736665722066726f6d20696e636f727265637460008301527f206f776e657200000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061401d602083614b62565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061405d601f83614b62565b91507f507572636861736520776f756c6420657863656564204f4720537570706c79006000830152602082019050919050565b600061409d602f83614b62565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614103602883614b62565b91507f50726573616c652073616c65206d7573742062652061637469766520746f206d60008301527f696e74204e4654730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614169601a83614b62565b91507f455243373231413a20617070726f766520746f2063616c6c65720000000000006000830152602082019050919050565b60006141a9603283614b62565b91507f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008301527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006020830152604082019050919050565b600061420f602083614b62565b91507f507572636861736520776f756c64206578636565642056495020537570706c796000830152602082019050919050565b600061424f602283614b62565b91507f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008301527f65720000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142b5603383614b62565b91507f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008301527f6563656976657220696d706c656d656e746572000000000000000000000000006020830152604082019050919050565b600061431b601d83614b62565b91507f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006000830152602082019050919050565b600061435b602183614b62565b91507f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143c1600d83614b62565b91507f496e76616c69642050726f6f66000000000000000000000000000000000000006000830152602082019050919050565b6000614401602e83614b62565b91507f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008301527f6f776e657220627920696e6465780000000000000000000000000000000000006020830152604082019050919050565b6000614467602f83614b62565b91507f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008301527f206f776e6572206f6620746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006144cd602d83614b62565b91507f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008301527f78697374656e7420746f6b656e000000000000000000000000000000000000006020830152604082019050919050565b6000614533602283614b62565b91507f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008301527f67680000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61459581614d9d565b82525050565b6145a481614d9d565b82525050565b60006145b68284613a87565b60148201915081905092915050565b60006145d18285613b1a565b6020820191506145e18284613b1a565b6020820191508190509392505050565b60006145fd8285613ba3565b91506146098284613ba3565b91508190509392505050565b600060208201905061462a6000830184613a78565b92915050565b60006080820190506146456000830187613a78565b6146526020830186613a78565b61465f604083018561459b565b81810360608301526146718184613b31565b905095945050505050565b600060208201905081810360008301526146968184613a9e565b905092915050565b60006020820190506146b36000830184613afc565b92915050565b60006020820190506146ce6000830184613b0b565b92915050565b600060208201905081810360008301526146ee8184613b6a565b905092915050565b6000602082019050818103600083015261470f81613bd4565b9050919050565b6000602082019050818103600083015261472f81613c3a565b9050919050565b6000602082019050818103600083015261474f81613ca0565b9050919050565b6000602082019050818103600083015261476f81613d06565b9050919050565b6000602082019050818103600083015261478f81613d6c565b9050919050565b600060208201905081810360008301526147af81613dd2565b9050919050565b600060208201905081810360008301526147cf81613e38565b9050919050565b600060208201905081810360008301526147ef81613e9e565b9050919050565b6000602082019050818103600083015261480f81613ede565b9050919050565b6000602082019050818103600083015261482f81613f44565b9050919050565b6000602082019050818103600083015261484f81613faa565b9050919050565b6000602082019050818103600083015261486f81614010565b9050919050565b6000602082019050818103600083015261488f81614050565b9050919050565b600060208201905081810360008301526148af81614090565b9050919050565b600060208201905081810360008301526148cf816140f6565b9050919050565b600060208201905081810360008301526148ef8161415c565b9050919050565b6000602082019050818103600083015261490f8161419c565b9050919050565b6000602082019050818103600083015261492f81614202565b9050919050565b6000602082019050818103600083015261494f81614242565b9050919050565b6000602082019050818103600083015261496f816142a8565b9050919050565b6000602082019050818103600083015261498f8161430e565b9050919050565b600060208201905081810360008301526149af8161434e565b9050919050565b600060208201905081810360008301526149cf816143b4565b9050919050565b600060208201905081810360008301526149ef816143f4565b9050919050565b60006020820190508181036000830152614a0f8161445a565b9050919050565b60006020820190508181036000830152614a2f816144c0565b9050919050565b60006020820190508181036000830152614a4f81614526565b9050919050565b6000602082019050614a6b600083018461459b565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a9857614a97614f7a565b5b8060405250919050565b600067ffffffffffffffff821115614abd57614abc614f7a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614aed57614aec614f7a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b8982614d61565b9150614b9483614d61565b9250826fffffffffffffffffffffffffffffffff03821115614bb957614bb8614eed565b5b828201905092915050565b6000614bcf82614d9d565b9150614bda83614d9d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c0f57614c0e614eed565b5b828201905092915050565b6000614c2582614d9d565b9150614c3083614d9d565b925082614c4057614c3f614f1c565b5b828204905092915050565b6000614c5682614d9d565b9150614c6183614d9d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c9a57614c99614eed565b5b828202905092915050565b6000614cb082614d61565b9150614cbb83614d61565b925082821015614cce57614ccd614eed565b5b828203905092915050565b6000614ce482614d9d565b9150614cef83614d9d565b925082821015614d0257614d01614eed565b5b828203905092915050565b6000614d1882614d7d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614dd4578082015181840152602081019050614db9565b83811115614de3576000848401525b50505050565b6000614df482614d9d565b91506000821415614e0857614e07614eed565b5b600182039050919050565b60006002820490506001821680614e2b57607f821691505b60208210811415614e3f57614e3e614f4b565b5b50919050565b6000614e5082614d9d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614e8357614e82614eed565b5b600182019050919050565b6000614e9982614eaa565b9050919050565b6000819050919050565b6000614eb582614fba565b9050919050565b6000614ec782614d9d565b9150614ed283614d9d565b925082614ee257614ee1614f1c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614fd081614d0d565b8114614fdb57600080fd5b50565b614fe781614d1f565b8114614ff257600080fd5b50565b614ffe81614d2b565b811461500957600080fd5b50565b61501581614d35565b811461502057600080fd5b50565b61502c81614d9d565b811461503757600080fd5b5056fea2646970667358221220d897851fdfe670b4405bb16faccb7ffe6453fe1b2a742a2c46bd75779d9e400564736f6c63430008000033

Deployed Bytecode Sourcemap

62720:3935:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48217:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63072:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49943:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63117:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51468:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51031:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62985:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46778:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63030:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52318:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47409:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66545:107;;;;;;;;;;;;;:::i;:::-;;52523:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46941:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65196:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62847:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49766:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66081:97;;;;;;;;;;;;;:::i;:::-;;48643:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43699:103;;;;;;;;;;;;;:::i;:::-;;62808:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65938:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43048:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64987:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50098:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65438:107;;;;;;;;;;;;;:::i;:::-;;62890:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63208:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65823:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63160:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51736:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65663:110;;;;;;;;;;;;;:::i;:::-;;62918:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63479:361;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52743:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63848:677;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50259:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57158:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64533:446;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66186:351;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63272:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52073:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43957:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62772:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63333:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65553:102;;;;;;;;;;;;;:::i;:::-;;48217:370;48344:4;48389:25;48374:40;;;:11;:40;;;;:99;;;;48440:33;48425:48;;;:11;:48;;;;48374:99;:160;;;;48499:35;48484:50;;;:11;:50;;;;48374:160;:207;;;;48545:36;48569:11;48545:23;:36::i;:::-;48374:207;48360:221;;48217:370;;;:::o;63072:38::-;;;;;;;;;;;;;:::o;49943:94::-;49997:13;50026:5;50019:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49943:94;:::o;63117:34::-;;;;;;;;;;;;;:::o;51468:204::-;51536:7;51560:16;51568:7;51560;:16::i;:::-;51552:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;51642:15;:24;51658:7;51642:24;;;;;;;;;;;;;;;;;;;;;51635:31;;51468:204;;;:::o;51031:379::-;51100:13;51116:24;51132:7;51116:15;:24::i;:::-;51100:40;;51161:5;51155:11;;:2;:11;;;;51147:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51246:5;51230:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;51255:37;51272:5;51279:12;:10;:12::i;:::-;51255:16;:37::i;:::-;51230:62;51214:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;51376:28;51385:2;51389:7;51398:5;51376:8;:28::i;:::-;51031:379;;;:::o;62985:38::-;;;;;;;;;;;;;:::o;46778:94::-;46831:7;46854:12;;46847:19;;46778:94;:::o;63030:35::-;;;;;;;;;;;;;:::o;52318:142::-;52426:28;52436:4;52442:2;52446:7;52426:9;:28::i;:::-;52318:142;;;:::o;47409:744::-;47518:7;47553:16;47563:5;47553:9;:16::i;:::-;47545:5;:24;47537:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;47615:22;47640:13;:11;:13::i;:::-;47615:38;;47660:19;47690:25;47740:9;47735:350;47759:14;47755:1;:18;47735:350;;;47789:31;47823:11;:14;47835:1;47823:14;;;;;;;;;;;47789:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47876:1;47850:28;;:9;:14;;;:28;;;47846:89;;47911:9;:14;;;47891:34;;47846:89;47968:5;47947:26;;:17;:26;;;47943:135;;;48005:5;47990:11;:20;47986:59;;;48032:1;48025:8;;;;;;;;;47986:59;48055:13;;;;;:::i;:::-;;;;47943:135;47735:350;47775:3;;;;;:::i;:::-;;;;47735:350;;;;48091:56;;;;;;;;;;:::i;:::-;;;;;;;;47409:744;;;;;:::o;66545:107::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66601:10:::1;66593:28;;:51;66622:21;66593:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66545:107::o:0;52523:157::-;52635:39;52652:4;52658:2;52662:7;52635:39;;;;;;;;;;;;:16;:39::i;:::-;52523:157;;;:::o;46941:177::-;47008:7;47040:13;:11;:13::i;:::-;47032:5;:21;47024:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;47107:5;47100:12;;46941:177;;;:::o;65196:109::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65289:8:::1;65270:16;:27;;;;;;;;;;;;:::i;:::-;;65196:109:::0;:::o;62847:32::-;;;;:::o;49766:118::-;49830:7;49853:20;49865:7;49853:11;:20::i;:::-;:25;;;49846:32;;49766:118;;;:::o;66081:97::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66155:15:::1;;;;;;;;;;;66154:16;66136:15;;:34;;;;;;;;;;;;;;;;;;66081:97::o:0;48643:211::-;48707:7;48748:1;48731:19;;:5;:19;;;;48723:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;48820:12;:19;48833:5;48820:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;48812:36;;48805:43;;48643:211;;;:::o;43699:103::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43764:30:::1;43791:1;43764:18;:30::i;:::-;43699:103::o:0;62808:32::-;;;;:::o;65938:135::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66048:17:::1;66026:19;:39;;;;65938:135:::0;:::o;43048:87::-;43094:7;43121:6;;;;;;;;;;;43114:13;;43048:87;:::o;64987:201::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65119:10:::1;;65101:14;65085:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;65077:53;;;::::0;::::1;;65142:38;65152:11;65165:14;65142:9;:38::i;:::-;64987:201:::0;;:::o;50098:98::-;50154:13;50183:7;50176:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50098:98;:::o;65438:107::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65519:18:::1;;;;;;;;;;;65518:19;65497:18;;:40;;;;;;;;;;;;;;;;;;65438:107::o:0;62890:21::-;;;;:::o;63208:51::-;;;;:::o;65823:107::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65914:8:::1;65896:15;:26;;;;65823:107:::0;:::o;63160:39::-;;;;:::o;51736:274::-;51839:12;:10;:12::i;:::-;51827:24;;:8;:24;;;;51819:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;51936:8;51891:18;:32;51910:12;:10;:12::i;:::-;51891:32;;;;;;;;;;;;;;;:42;51924:8;51891:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51985:8;51956:48;;51971:12;:10;:12::i;:::-;51956:48;;;51995:8;51956:48;;;;;;:::i;:::-;;;;;;;;51736:274;;:::o;65663:110::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65746:19:::1;;;;;;;;;;;65745:20;65723:19;;:42;;;;;;;;;;;;;;;;;;65663:110::o:0;62918:20::-;;;;:::o;63479:361::-;63558:18;;;;;;;;;;;63550:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;63673:10;;63655:14;63639:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;63631:53;;;;;;63739:9;63721:14;63703:15;;:32;;;;:::i;:::-;:45;;63695:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;63795:37;63805:10;63817:14;63795:9;:37::i;:::-;63479:361;:::o;52743:311::-;52880:28;52890:4;52896:2;52900:7;52880:9;:28::i;:::-;52931:48;52954:4;52960:2;52964:7;52973:5;52931:22;:48::i;:::-;52915:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;52743:311;;;;:::o;63848:677::-;63956:15;;;;;;;;;;;63948:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64068:9;64050:14;64035:12;;:29;;;;:::i;:::-;:42;;64027:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;64161:13;;64143:14;64132:8;;:25;;;;:::i;:::-;:42;;64124:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;64225:15;;;;;;;;;;;64221:202;;;64257:12;64299:10;64282:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;64272:39;;;;;;64257:54;;64334:59;64353:12;;64334:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64367:19;;64388:4;64334:18;:59::i;:::-;64326:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;64221:202;;64455:14;64444:8;;:25;;;;:::i;:::-;64433:8;:36;;;;64480:37;64490:10;64502:14;64480:9;:37::i;:::-;63848:677;;;:::o;50259:394::-;50357:13;50398:16;50406:7;50398;:16::i;:::-;50382:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;50488:21;50512:10;:8;:10::i;:::-;50488:34;;50567:1;50549:7;50543:21;:25;:104;;;;;;;;;;;;;;;;;50604:7;50613:18;:7;:16;:18::i;:::-;50587:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50543:104;50529:118;;;50259:394;;;:::o;57158:43::-;;;;:::o;64533:446::-;64609:19;;;;;;;;;;;64601:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;64729:9;64711:14;64692:16;;:33;;;;:::i;:::-;:46;;64684:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;64823:14;;64805;64793:9;;:26;;;;:::i;:::-;:44;;64785:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;64909:14;64897:9;;:26;;;;:::i;:::-;64885:9;:38;;;;64934:37;64944:10;64956:14;64934:9;:37::i;:::-;64533:446;:::o;66186:351::-;66256:16;66285:18;66306:17;66316:6;66306:9;:17::i;:::-;66285:38;;66334:25;66376:10;66362:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66334:53;;66402:9;66398:106;66417:10;66413:1;:14;66398:106;;;66462:30;66482:6;66490:1;66462:19;:30::i;:::-;66448:8;66457:1;66448:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;66429:3;;;;;:::i;:::-;;;;66398:106;;;;66521:8;66514:15;;;;66186:351;;;:::o;63272:48::-;;;;:::o;52073:186::-;52195:4;52218:18;:25;52237:5;52218:25;;;;;;;;;;;;;;;:35;52244:8;52218:35;;;;;;;;;;;;;;;;;;;;;;;;;52211:42;;52073:186;;;;:::o;43957:201::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44066:1:::1;44046:22;;:8;:22;;;;44038:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44122:28;44141:8;44122:18;:28::i;:::-;43957:201:::0;:::o;62772:29::-;;;;:::o;63333:51::-;;;;:::o;65553:102::-;43279:12;:10;:12::i;:::-;43268:23;;:7;:5;:7::i;:::-;:23;;;43260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65632:15:::1;;;;;;;;;;;65631:16;65613:15;;:34;;;;;;;;;;;;;;;;;;65553:102::o:0;19758:157::-;19843:4;19882:25;19867:40;;;:11;:40;;;;19860:47;;19758:157;;;:::o;53293:105::-;53350:4;53380:12;;53370:7;:22;53363:29;;53293:105;;;:::o;16555:98::-;16608:7;16635:10;16628:17;;16555:98;:::o;56980:172::-;57104:2;57077:15;:24;57093:7;57077:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;57138:7;57134:2;57118:28;;57127:5;57118:28;;;;;;;;;;;;56980:172;;;:::o;55345:1529::-;55442:35;55480:20;55492:7;55480:11;:20::i;:::-;55442:58;;55509:22;55551:13;:18;;;55535:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;55604:12;:10;:12::i;:::-;55580:36;;:20;55592:7;55580:11;:20::i;:::-;:36;;;55535:81;:142;;;;55627:50;55644:13;:18;;;55664:12;:10;:12::i;:::-;55627:16;:50::i;:::-;55535:142;55509:169;;55703:17;55687:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;55835:4;55813:26;;:13;:18;;;:26;;;55797:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;55924:1;55910:16;;:2;:16;;;;55902:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;55977:43;55999:4;56005:2;56009:7;56018:1;55977:21;:43::i;:::-;56077:49;56094:1;56098:7;56107:13;:18;;;56077:8;:49::i;:::-;56165:1;56135:12;:18;56148:4;56135:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56201:1;56173:12;:16;56186:2;56173:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56232:43;;;;;;;;56247:2;56232:43;;;;;;56258:15;56232:43;;;;;56209:11;:20;56221:7;56209:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56503:19;56535:1;56525:7;:11;;;;:::i;:::-;56503:33;;56588:1;56547:43;;:11;:24;56559:11;56547:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;56543:236;;;56605:20;56613:11;56605:7;:20::i;:::-;56601:171;;;56665:97;;;;;;;;56692:13;:18;;;56665:97;;;;;;56723:13;:28;;;56665:97;;;;;56638:11;:24;56650:11;56638:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56601:171;56543:236;56811:7;56807:2;56792:27;;56801:4;56792:27;;;;;;;;;;;;56826:42;56847:4;56853:2;56857:7;56866:1;56826:20;:42::i;:::-;55345:1529;;;;;;:::o;49106:606::-;49182:21;;:::i;:::-;49223:16;49231:7;49223;:16::i;:::-;49215:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;49295:26;49343:12;49332:7;:23;49328:93;;49412:1;49397:12;49387:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;49366:47;;49328:93;49434:12;49449:7;49434:22;;49429:212;49466:18;49458:4;:26;49429:212;;49503:31;49537:11;:17;49549:4;49537:17;;;;;;;;;;;49503:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49593:1;49567:28;;:9;:14;;;:28;;;49563:71;;49615:9;49608:16;;;;;;;49563:71;49429:212;49486:6;;;;;:::i;:::-;;;;49429:212;;;;49649:57;;;;;;;;;;:::i;:::-;;;;;;;;49106:606;;;;:::o;44318:191::-;44392:16;44411:6;;;;;;;;;;;44392:25;;44437:8;44428:6;;:17;;;;;;;;;;;;;;;;;;44492:8;44461:40;;44482:8;44461:40;;;;;;;;;;;;44318:191;;:::o;53404:98::-;53469:27;53479:2;53483:8;53469:27;;;;;;;;;;;;:9;:27::i;:::-;53404:98;;:::o;58695:690::-;58832:4;58849:15;:2;:13;;;:15::i;:::-;58845:535;;;58904:2;58888:36;;;58925:12;:10;:12::i;:::-;58939:4;58945:7;58954:5;58888:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58875:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59136:1;59119:6;:13;:18;59115:215;;;59152:61;;;;;;;;;;:::i;:::-;;;;;;;;59115:215;59298:6;59292:13;59283:6;59279:2;59275:15;59268:38;58875:464;59020:45;;;59010:55;;;:6;:55;;;;59003:62;;;;;58845:535;59368:4;59361:11;;58695:690;;;;;;;:::o;61431:190::-;61556:4;61609;61580:25;61593:5;61600:4;61580:12;:25::i;:::-;:33;61573:40;;61431:190;;;;;:::o;65313:117::-;65373:13;65406:16;65399:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65313:117;:::o;17134:723::-;17190:13;17420:1;17411:5;:10;17407:53;;;17438:10;;;;;;;;;;;;;;;;;;;;;17407:53;17470:12;17485:5;17470:20;;17501:14;17526:78;17541:1;17533:4;:9;17526:78;;17559:8;;;;;:::i;:::-;;;;17590:2;17582:10;;;;;:::i;:::-;;;17526:78;;;17614:19;17646:6;17636:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17614:39;;17664:154;17680:1;17671:5;:10;17664:154;;17708:1;17698:11;;;;;:::i;:::-;;;17775:2;17767:5;:10;;;;:::i;:::-;17754:2;:24;;;;:::i;:::-;17741:39;;17724:6;17731;17724:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17804:2;17795:11;;;;;:::i;:::-;;;17664:154;;;17842:6;17828:21;;;;;17134:723;;;;:::o;59847:141::-;;;;;:::o;60374:140::-;;;;;:::o;53841:1272::-;53946:20;53969:12;;53946:35;;54010:1;53996:16;;:2;:16;;;;53988:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54187:21;54195:12;54187:7;:21::i;:::-;54186:22;54178:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54269:12;54257:8;:24;;54249:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54329:61;54359:1;54363:2;54367:12;54381:8;54329:21;:61::i;:::-;54399:30;54432:12;:16;54445:2;54432:16;;;;;;;;;;;;;;;54399:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54474:119;;;;;;;;54524:8;54494:11;:19;;;:39;;;;:::i;:::-;54474:119;;;;;;54577:8;54542:11;:24;;;:44;;;;:::i;:::-;54474:119;;;;;54455:12;:16;54468:2;54455:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54628:43;;;;;;;;54643:2;54628:43;;;;;;54654:15;54628:43;;;;;54600:11;:25;54612:12;54600:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54680:20;54703:12;54680:35;;54729:9;54724:281;54748:8;54744:1;:12;54724:281;;;54802:12;54798:2;54777:38;;54794:1;54777:38;;;;;;;;;;;;54842:59;54873:1;54877:2;54881:12;54895:5;54842:22;:59::i;:::-;54824:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;54983:14;;;;;:::i;:::-;;;;54758:3;;;;;:::i;:::-;;;;54724:281;;;;55028:12;55013;:27;;;;55047:60;55076:1;55080:2;55084:12;55098:8;55047:20;:60::i;:::-;53841:1272;;;;;;:::o;8545:387::-;8605:4;8813:12;8880:7;8868:20;8860:28;;8923:1;8916:4;:8;8909:15;;;8545:387;;;:::o;61983:701::-;62066:7;62086:20;62109:4;62086:27;;62129:9;62124:523;62148:5;:12;62144:1;:16;62124:523;;;62182:20;62205:5;62211:1;62205:8;;;;;;;;;;;;;;;;;;;;;;62182:31;;62248:12;62232;:28;62228:408;;62402:12;62416;62385:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62375:55;;;;;;62360:70;;62228:408;;;62592:12;62606;62575:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62565:55;;;;;;62550:70;;62228:408;62124:523;62162:3;;;;;:::i;:::-;;;;62124:523;;;;62664:12;62657:19;;;61983:701;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:139::-;;1463:6;1450:20;1441:29;;1479:33;1506:5;1479:33;:::i;:::-;1431:87;;;;:::o;1524:137::-;;1607:6;1594:20;1585:29;;1623:32;1649:5;1623:32;:::i;:::-;1575:86;;;;:::o;1667:141::-;;1754:6;1748:13;1739:22;;1770:32;1796:5;1770:32;:::i;:::-;1729:79;;;;:::o;1827:271::-;;1931:3;1924:4;1916:6;1912:17;1908:27;1898:2;;1949:1;1946;1939:12;1898:2;1989:6;1976:20;2014:78;2088:3;2080:6;2073:4;2065:6;2061:17;2014:78;:::i;:::-;2005:87;;1888:210;;;;;:::o;2118:273::-;;2223:3;2216:4;2208:6;2204:17;2200:27;2190:2;;2241:1;2238;2231:12;2190:2;2281:6;2268:20;2306:79;2381:3;2373:6;2366:4;2358:6;2354:17;2306:79;:::i;:::-;2297:88;;2180:211;;;;;:::o;2397:139::-;;2481:6;2468:20;2459:29;;2497:33;2524:5;2497:33;:::i;:::-;2449:87;;;;:::o;2542:262::-;;2650:2;2638:9;2629:7;2625:23;2621:32;2618:2;;;2666:1;2663;2656:12;2618:2;2709:1;2734:53;2779:7;2770:6;2759:9;2755:22;2734:53;:::i;:::-;2724:63;;2680:117;2608:196;;;;:::o;2810:407::-;;;2935:2;2923:9;2914:7;2910:23;2906:32;2903:2;;;2951:1;2948;2941:12;2903:2;2994:1;3019:53;3064:7;3055:6;3044:9;3040:22;3019:53;:::i;:::-;3009:63;;2965:117;3121:2;3147:53;3192:7;3183:6;3172:9;3168:22;3147:53;:::i;:::-;3137:63;;3092:118;2893:324;;;;;:::o;3223:552::-;;;;3365:2;3353:9;3344:7;3340:23;3336:32;3333:2;;;3381:1;3378;3371:12;3333:2;3424:1;3449:53;3494:7;3485:6;3474:9;3470:22;3449:53;:::i;:::-;3439:63;;3395:117;3551:2;3577:53;3622:7;3613:6;3602:9;3598:22;3577:53;:::i;:::-;3567:63;;3522:118;3679:2;3705:53;3750:7;3741:6;3730:9;3726:22;3705:53;:::i;:::-;3695:63;;3650:118;3323:452;;;;;:::o;3781:809::-;;;;;3949:3;3937:9;3928:7;3924:23;3920:33;3917:2;;;3966:1;3963;3956:12;3917:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;4264:2;4290:53;4335:7;4326:6;4315:9;4311:22;4290:53;:::i;:::-;4280:63;;4235:118;4420:2;4409:9;4405:18;4392:32;4451:18;4443:6;4440:30;4437:2;;;4483:1;4480;4473:12;4437:2;4511:62;4565:7;4556:6;4545:9;4541:22;4511:62;:::i;:::-;4501:72;;4363:220;3907:683;;;;;;;:::o;4596:401::-;;;4718:2;4706:9;4697:7;4693:23;4689:32;4686:2;;;4734:1;4731;4724:12;4686:2;4777:1;4802:53;4847:7;4838:6;4827:9;4823:22;4802:53;:::i;:::-;4792:63;;4748:117;4904:2;4930:50;4972:7;4963:6;4952:9;4948:22;4930:50;:::i;:::-;4920:60;;4875:115;4676:321;;;;;:::o;5003:407::-;;;5128:2;5116:9;5107:7;5103:23;5099:32;5096:2;;;5144:1;5141;5134:12;5096:2;5187:1;5212:53;5257:7;5248:6;5237:9;5233:22;5212:53;:::i;:::-;5202:63;;5158:117;5314:2;5340:53;5385:7;5376:6;5365:9;5361:22;5340:53;:::i;:::-;5330:63;;5285:118;5086:324;;;;;:::o;5416:570::-;;;;5576:2;5564:9;5555:7;5551:23;5547:32;5544:2;;;5592:1;5589;5582:12;5544:2;5663:1;5652:9;5648:17;5635:31;5693:18;5685:6;5682:30;5679:2;;;5725:1;5722;5715:12;5679:2;5761:80;5833:7;5824:6;5813:9;5809:22;5761:80;:::i;:::-;5743:98;;;;5606:245;5890:2;5916:53;5961:7;5952:6;5941:9;5937:22;5916:53;:::i;:::-;5906:63;;5861:118;5534:452;;;;;:::o;5992:262::-;;6100:2;6088:9;6079:7;6075:23;6071:32;6068:2;;;6116:1;6113;6106:12;6068:2;6159:1;6184:53;6229:7;6220:6;6209:9;6205:22;6184:53;:::i;:::-;6174:63;;6130:117;6058:196;;;;:::o;6260:260::-;;6367:2;6355:9;6346:7;6342:23;6338:32;6335:2;;;6383:1;6380;6373:12;6335:2;6426:1;6451:52;6495:7;6486:6;6475:9;6471:22;6451:52;:::i;:::-;6441:62;;6397:116;6325:195;;;;:::o;6526:282::-;;6644:2;6632:9;6623:7;6619:23;6615:32;6612:2;;;6660:1;6657;6650:12;6612:2;6703:1;6728:63;6783:7;6774:6;6763:9;6759:22;6728:63;:::i;:::-;6718:73;;6674:127;6602:206;;;;:::o;6814:375::-;;6932:2;6920:9;6911:7;6907:23;6903:32;6900:2;;;6948:1;6945;6938:12;6900:2;7019:1;7008:9;7004:17;6991:31;7049:18;7041:6;7038:30;7035:2;;;7081:1;7078;7071:12;7035:2;7109:63;7164:7;7155:6;7144:9;7140:22;7109:63;:::i;:::-;7099:73;;6962:220;6890:299;;;;:::o;7195:262::-;;7303:2;7291:9;7282:7;7278:23;7274:32;7271:2;;;7319:1;7316;7309:12;7271:2;7362:1;7387:53;7432:7;7423:6;7412:9;7408:22;7387:53;:::i;:::-;7377:63;;7333:117;7261:196;;;;:::o;7463:179::-;;7553:46;7595:3;7587:6;7553:46;:::i;:::-;7631:4;7626:3;7622:14;7608:28;;7543:99;;;;:::o;7648:118::-;7735:24;7753:5;7735:24;:::i;:::-;7730:3;7723:37;7713:53;;:::o;7772:157::-;7877:45;7897:24;7915:5;7897:24;:::i;:::-;7877:45;:::i;:::-;7872:3;7865:58;7855:74;;:::o;7965:732::-;;8113:54;8161:5;8113:54;:::i;:::-;8183:86;8262:6;8257:3;8183:86;:::i;:::-;8176:93;;8293:56;8343:5;8293:56;:::i;:::-;8372:7;8403:1;8388:284;8413:6;8410:1;8407:13;8388:284;;;8489:6;8483:13;8516:63;8575:3;8560:13;8516:63;:::i;:::-;8509:70;;8602:60;8655:6;8602:60;:::i;:::-;8592:70;;8448:224;8435:1;8432;8428:9;8423:14;;8388:284;;;8392:14;8688:3;8681:10;;8089:608;;;;;;;:::o;8703:109::-;8784:21;8799:5;8784:21;:::i;:::-;8779:3;8772:34;8762:50;;:::o;8818:118::-;8905:24;8923:5;8905:24;:::i;:::-;8900:3;8893:37;8883:53;;:::o;8942:157::-;9047:45;9067:24;9085:5;9067:24;:::i;:::-;9047:45;:::i;:::-;9042:3;9035:58;9025:74;;:::o;9105:360::-;;9219:38;9251:5;9219:38;:::i;:::-;9273:70;9336:6;9331:3;9273:70;:::i;:::-;9266:77;;9352:52;9397:6;9392:3;9385:4;9378:5;9374:16;9352:52;:::i;:::-;9429:29;9451:6;9429:29;:::i;:::-;9424:3;9420:39;9413:46;;9195:270;;;;;:::o;9471:364::-;;9587:39;9620:5;9587:39;:::i;:::-;9642:71;9706:6;9701:3;9642:71;:::i;:::-;9635:78;;9722:52;9767:6;9762:3;9755:4;9748:5;9744:16;9722:52;:::i;:::-;9799:29;9821:6;9799:29;:::i;:::-;9794:3;9790:39;9783:46;;9563:272;;;;;:::o;9841:377::-;;9975:39;10008:5;9975:39;:::i;:::-;10030:89;10112:6;10107:3;10030:89;:::i;:::-;10023:96;;10128:52;10173:6;10168:3;10161:4;10154:5;10150:16;10128:52;:::i;:::-;10205:6;10200:3;10196:16;10189:23;;9951:267;;;;;:::o;10224:366::-;;10387:67;10451:2;10446:3;10387:67;:::i;:::-;10380:74;;10484:34;10480:1;10475:3;10471:11;10464:55;10550:4;10545:2;10540:3;10536:12;10529:26;10581:2;10576:3;10572:12;10565:19;;10370:220;;;:::o;10596:371::-;;10759:67;10823:2;10818:3;10759:67;:::i;:::-;10752:74;;10856:34;10852:1;10847:3;10843:11;10836:55;10922:9;10917:2;10912:3;10908:12;10901:31;10958:2;10953:3;10949:12;10942:19;;10742:225;;;:::o;10973:372::-;;11136:67;11200:2;11195:3;11136:67;:::i;:::-;11129:74;;11233:34;11229:1;11224:3;11220:11;11213:55;11299:10;11294:2;11289:3;11285:12;11278:32;11336:2;11331:3;11327:12;11320:19;;11119:226;;;:::o;11351:370::-;;11514:67;11578:2;11573:3;11514:67;:::i;:::-;11507:74;;11611:34;11607:1;11602:3;11598:11;11591:55;11677:8;11672:2;11667:3;11663:12;11656:30;11712:2;11707:3;11703:12;11696:19;;11497:224;;;:::o;11727:374::-;;11890:67;11954:2;11949:3;11890:67;:::i;:::-;11883:74;;11987:34;11983:1;11978:3;11974:11;11967:55;12053:12;12048:2;12043:3;12039:12;12032:34;12092:2;12087:3;12083:12;12076:19;;11873:228;;;:::o;12107:367::-;;12270:67;12334:2;12329:3;12270:67;:::i;:::-;12263:74;;12367:34;12363:1;12358:3;12354:11;12347:55;12433:5;12428:2;12423:3;12419:12;12412:27;12465:2;12460:3;12456:12;12449:19;;12253:221;;;:::o;12480:369::-;;12643:67;12707:2;12702:3;12643:67;:::i;:::-;12636:74;;12740:34;12736:1;12731:3;12727:11;12720:55;12806:7;12801:2;12796:3;12792:12;12785:29;12840:2;12835:3;12831:12;12824:19;;12626:223;;;:::o;12855:329::-;;13018:67;13082:2;13077:3;13018:67;:::i;:::-;13011:74;;13115:33;13111:1;13106:3;13102:11;13095:54;13175:2;13170:3;13166:12;13159:19;;13001:183;;;:::o;13190:389::-;;13353:67;13417:2;13412:3;13353:67;:::i;:::-;13346:74;;13450:34;13446:1;13441:3;13437:11;13430:55;13516:27;13511:2;13506:3;13502:12;13495:49;13570:2;13565:3;13561:12;13554:19;;13336:243;;;:::o;13585:375::-;;13748:67;13812:2;13807:3;13748:67;:::i;:::-;13741:74;;13845:34;13841:1;13836:3;13832:11;13825:55;13911:13;13906:2;13901:3;13897:12;13890:35;13951:2;13946:3;13942:12;13935:19;;13731:229;;;:::o;13966:370::-;;14129:67;14193:2;14188:3;14129:67;:::i;:::-;14122:74;;14226:34;14222:1;14217:3;14213:11;14206:55;14292:8;14287:2;14282:3;14278:12;14271:30;14327:2;14322:3;14318:12;14311:19;;14112:224;;;:::o;14342:330::-;;14505:67;14569:2;14564:3;14505:67;:::i;:::-;14498:74;;14602:34;14598:1;14593:3;14589:11;14582:55;14663:2;14658:3;14654:12;14647:19;;14488:184;;;:::o;14678:329::-;;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14938:33;14934:1;14929:3;14925:11;14918:54;14998:2;14993:3;14989:12;14982:19;;14824:183;;;:::o;15013:379::-;;15176:67;15240:2;15235:3;15176:67;:::i;:::-;15169:74;;15273:34;15269:1;15264:3;15260:11;15253:55;15339:17;15334:2;15329:3;15325:12;15318:39;15383:2;15378:3;15374:12;15367:19;;15159:233;;;:::o;15398:372::-;;15561:67;15625:2;15620:3;15561:67;:::i;:::-;15554:74;;15658:34;15654:1;15649:3;15645:11;15638:55;15724:10;15719:2;15714:3;15710:12;15703:32;15761:2;15756:3;15752:12;15745:19;;15544:226;;;:::o;15776:324::-;;15939:67;16003:2;15998:3;15939:67;:::i;:::-;15932:74;;16036:28;16032:1;16027:3;16023:11;16016:49;16091:2;16086:3;16082:12;16075:19;;15922:178;;;:::o;16106:382::-;;16269:67;16333:2;16328:3;16269:67;:::i;:::-;16262:74;;16366:34;16362:1;16357:3;16353:11;16346:55;16432:20;16427:2;16422:3;16418:12;16411:42;16479:2;16474:3;16470:12;16463:19;;16252:236;;;:::o;16494:330::-;;16657:67;16721:2;16716:3;16657:67;:::i;:::-;16650:74;;16754:34;16750:1;16745:3;16741:11;16734:55;16815:2;16810:3;16806:12;16799:19;;16640:184;;;:::o;16830:366::-;;16993:67;17057:2;17052:3;16993:67;:::i;:::-;16986:74;;17090:34;17086:1;17081:3;17077:11;17070:55;17156:4;17151:2;17146:3;17142:12;17135:26;17187:2;17182:3;17178:12;17171:19;;16976:220;;;:::o;17202:383::-;;17365:67;17429:2;17424:3;17365:67;:::i;:::-;17358:74;;17462:34;17458:1;17453:3;17449:11;17442:55;17528:21;17523:2;17518:3;17514:12;17507:43;17576:2;17571:3;17567:12;17560:19;;17348:237;;;:::o;17591:327::-;;17754:67;17818:2;17813:3;17754:67;:::i;:::-;17747:74;;17851:31;17847:1;17842:3;17838:11;17831:52;17909:2;17904:3;17900:12;17893:19;;17737:181;;;:::o;17924:365::-;;18087:67;18151:2;18146:3;18087:67;:::i;:::-;18080:74;;18184:34;18180:1;18175:3;18171:11;18164:55;18250:3;18245:2;18240:3;18236:12;18229:25;18280:2;18275:3;18271:12;18264:19;;18070:219;;;:::o;18295:311::-;;18458:67;18522:2;18517:3;18458:67;:::i;:::-;18451:74;;18555:15;18551:1;18546:3;18542:11;18535:36;18597:2;18592:3;18588:12;18581:19;;18441:165;;;:::o;18612:378::-;;18775:67;18839:2;18834:3;18775:67;:::i;:::-;18768:74;;18872:34;18868:1;18863:3;18859:11;18852:55;18938:16;18933:2;18928:3;18924:12;18917:38;18981:2;18976:3;18972:12;18965:19;;18758:232;;;:::o;18996:379::-;;19159:67;19223:2;19218:3;19159:67;:::i;:::-;19152:74;;19256:34;19252:1;19247:3;19243:11;19236:55;19322:17;19317:2;19312:3;19308:12;19301:39;19366:2;19361:3;19357:12;19350:19;;19142:233;;;:::o;19381:377::-;;19544:67;19608:2;19603:3;19544:67;:::i;:::-;19537:74;;19641:34;19637:1;19632:3;19628:11;19621:55;19707:15;19702:2;19697:3;19693:12;19686:37;19749:2;19744:3;19740:12;19733:19;;19527:231;;;:::o;19764:366::-;;19927:67;19991:2;19986:3;19927:67;:::i;:::-;19920:74;;20024:34;20020:1;20015:3;20011:11;20004:55;20090:4;20085:2;20080:3;20076:12;20069:26;20121:2;20116:3;20112:12;20105:19;;19910:220;;;:::o;20136:108::-;20213:24;20231:5;20213:24;:::i;:::-;20208:3;20201:37;20191:53;;:::o;20250:118::-;20337:24;20355:5;20337:24;:::i;:::-;20332:3;20325:37;20315:53;;:::o;20374:256::-;;20501:75;20572:3;20563:6;20501:75;:::i;:::-;20601:2;20596:3;20592:12;20585:19;;20621:3;20614:10;;20490:140;;;;:::o;20636:397::-;;20791:75;20862:3;20853:6;20791:75;:::i;:::-;20891:2;20886:3;20882:12;20875:19;;20904:75;20975:3;20966:6;20904:75;:::i;:::-;21004:2;20999:3;20995:12;20988:19;;21024:3;21017:10;;20780:253;;;;;:::o;21039:435::-;;21241:95;21332:3;21323:6;21241:95;:::i;:::-;21234:102;;21353:95;21444:3;21435:6;21353:95;:::i;:::-;21346:102;;21465:3;21458:10;;21223:251;;;;;:::o;21480:222::-;;21611:2;21600:9;21596:18;21588:26;;21624:71;21692:1;21681:9;21677:17;21668:6;21624:71;:::i;:::-;21578:124;;;;:::o;21708:640::-;;21941:3;21930:9;21926:19;21918:27;;21955:71;22023:1;22012:9;22008:17;21999:6;21955:71;:::i;:::-;22036:72;22104:2;22093:9;22089:18;22080:6;22036:72;:::i;:::-;22118;22186:2;22175:9;22171:18;22162:6;22118:72;:::i;:::-;22237:9;22231:4;22227:20;22222:2;22211:9;22207:18;22200:48;22265:76;22336:4;22327:6;22265:76;:::i;:::-;22257:84;;21908:440;;;;;;;:::o;22354:373::-;;22535:2;22524:9;22520:18;22512:26;;22584:9;22578:4;22574:20;22570:1;22559:9;22555:17;22548:47;22612:108;22715:4;22706:6;22612:108;:::i;:::-;22604:116;;22502:225;;;;:::o;22733:210::-;;22858:2;22847:9;22843:18;22835:26;;22871:65;22933:1;22922:9;22918:17;22909:6;22871:65;:::i;:::-;22825:118;;;;:::o;22949:222::-;;23080:2;23069:9;23065:18;23057:26;;23093:71;23161:1;23150:9;23146:17;23137:6;23093:71;:::i;:::-;23047:124;;;;:::o;23177:313::-;;23328:2;23317:9;23313:18;23305:26;;23377:9;23371:4;23367:20;23363:1;23352:9;23348:17;23341:47;23405:78;23478:4;23469:6;23405:78;:::i;:::-;23397:86;;23295:195;;;;:::o;23496:419::-;;23700:2;23689:9;23685:18;23677:26;;23749:9;23743:4;23739:20;23735:1;23724:9;23720:17;23713:47;23777:131;23903:4;23777:131;:::i;:::-;23769:139;;23667:248;;;:::o;23921:419::-;;24125:2;24114:9;24110:18;24102:26;;24174:9;24168:4;24164:20;24160:1;24149:9;24145:17;24138:47;24202:131;24328:4;24202:131;:::i;:::-;24194:139;;24092:248;;;:::o;24346:419::-;;24550:2;24539:9;24535:18;24527:26;;24599:9;24593:4;24589:20;24585:1;24574:9;24570:17;24563:47;24627:131;24753:4;24627:131;:::i;:::-;24619:139;;24517:248;;;:::o;24771:419::-;;24975:2;24964:9;24960:18;24952:26;;25024:9;25018:4;25014:20;25010:1;24999:9;24995:17;24988:47;25052:131;25178:4;25052:131;:::i;:::-;25044:139;;24942:248;;;:::o;25196:419::-;;25400:2;25389:9;25385:18;25377:26;;25449:9;25443:4;25439:20;25435:1;25424:9;25420:17;25413:47;25477:131;25603:4;25477:131;:::i;:::-;25469:139;;25367:248;;;:::o;25621:419::-;;25825:2;25814:9;25810:18;25802:26;;25874:9;25868:4;25864:20;25860:1;25849:9;25845:17;25838:47;25902:131;26028:4;25902:131;:::i;:::-;25894:139;;25792:248;;;:::o;26046:419::-;;26250:2;26239:9;26235:18;26227:26;;26299:9;26293:4;26289:20;26285:1;26274:9;26270:17;26263:47;26327:131;26453:4;26327:131;:::i;:::-;26319:139;;26217:248;;;:::o;26471:419::-;;26675:2;26664:9;26660:18;26652:26;;26724:9;26718:4;26714:20;26710:1;26699:9;26695:17;26688:47;26752:131;26878:4;26752:131;:::i;:::-;26744:139;;26642:248;;;:::o;26896:419::-;;27100:2;27089:9;27085:18;27077:26;;27149:9;27143:4;27139:20;27135:1;27124:9;27120:17;27113:47;27177:131;27303:4;27177:131;:::i;:::-;27169:139;;27067:248;;;:::o;27321:419::-;;27525:2;27514:9;27510:18;27502:26;;27574:9;27568:4;27564:20;27560:1;27549:9;27545:17;27538:47;27602:131;27728:4;27602:131;:::i;:::-;27594:139;;27492:248;;;:::o;27746:419::-;;27950:2;27939:9;27935:18;27927:26;;27999:9;27993:4;27989:20;27985:1;27974:9;27970:17;27963:47;28027:131;28153:4;28027:131;:::i;:::-;28019:139;;27917:248;;;:::o;28171:419::-;;28375:2;28364:9;28360:18;28352:26;;28424:9;28418:4;28414:20;28410:1;28399:9;28395:17;28388:47;28452:131;28578:4;28452:131;:::i;:::-;28444:139;;28342:248;;;:::o;28596:419::-;;28800:2;28789:9;28785:18;28777:26;;28849:9;28843:4;28839:20;28835:1;28824:9;28820:17;28813:47;28877:131;29003:4;28877:131;:::i;:::-;28869:139;;28767:248;;;:::o;29021:419::-;;29225:2;29214:9;29210:18;29202:26;;29274:9;29268:4;29264:20;29260:1;29249:9;29245:17;29238:47;29302:131;29428:4;29302:131;:::i;:::-;29294:139;;29192:248;;;:::o;29446:419::-;;29650:2;29639:9;29635:18;29627:26;;29699:9;29693:4;29689:20;29685:1;29674:9;29670:17;29663:47;29727:131;29853:4;29727:131;:::i;:::-;29719:139;;29617:248;;;:::o;29871:419::-;;30075:2;30064:9;30060:18;30052:26;;30124:9;30118:4;30114:20;30110:1;30099:9;30095:17;30088:47;30152:131;30278:4;30152:131;:::i;:::-;30144:139;;30042:248;;;:::o;30296:419::-;;30500:2;30489:9;30485:18;30477:26;;30549:9;30543:4;30539:20;30535:1;30524:9;30520:17;30513:47;30577:131;30703:4;30577:131;:::i;:::-;30569:139;;30467:248;;;:::o;30721:419::-;;30925:2;30914:9;30910:18;30902:26;;30974:9;30968:4;30964:20;30960:1;30949:9;30945:17;30938:47;31002:131;31128:4;31002:131;:::i;:::-;30994:139;;30892:248;;;:::o;31146:419::-;;31350:2;31339:9;31335:18;31327:26;;31399:9;31393:4;31389:20;31385:1;31374:9;31370:17;31363:47;31427:131;31553:4;31427:131;:::i;:::-;31419:139;;31317:248;;;:::o;31571:419::-;;31775:2;31764:9;31760:18;31752:26;;31824:9;31818:4;31814:20;31810:1;31799:9;31795:17;31788:47;31852:131;31978:4;31852:131;:::i;:::-;31844:139;;31742:248;;;:::o;31996:419::-;;32200:2;32189:9;32185:18;32177:26;;32249:9;32243:4;32239:20;32235:1;32224:9;32220:17;32213:47;32277:131;32403:4;32277:131;:::i;:::-;32269:139;;32167:248;;;:::o;32421:419::-;;32625:2;32614:9;32610:18;32602:26;;32674:9;32668:4;32664:20;32660:1;32649:9;32645:17;32638:47;32702:131;32828:4;32702:131;:::i;:::-;32694:139;;32592:248;;;:::o;32846:419::-;;33050:2;33039:9;33035:18;33027:26;;33099:9;33093:4;33089:20;33085:1;33074:9;33070:17;33063:47;33127:131;33253:4;33127:131;:::i;:::-;33119:139;;33017:248;;;:::o;33271:419::-;;33475:2;33464:9;33460:18;33452:26;;33524:9;33518:4;33514:20;33510:1;33499:9;33495:17;33488:47;33552:131;33678:4;33552:131;:::i;:::-;33544:139;;33442:248;;;:::o;33696:419::-;;33900:2;33889:9;33885:18;33877:26;;33949:9;33943:4;33939:20;33935:1;33924:9;33920:17;33913:47;33977:131;34103:4;33977:131;:::i;:::-;33969:139;;33867:248;;;:::o;34121:419::-;;34325:2;34314:9;34310:18;34302:26;;34374:9;34368:4;34364:20;34360:1;34349:9;34345:17;34338:47;34402:131;34528:4;34402:131;:::i;:::-;34394:139;;34292:248;;;:::o;34546:419::-;;34750:2;34739:9;34735:18;34727:26;;34799:9;34793:4;34789:20;34785:1;34774:9;34770:17;34763:47;34827:131;34953:4;34827:131;:::i;:::-;34819:139;;34717:248;;;:::o;34971:222::-;;35102:2;35091:9;35087:18;35079:26;;35115:71;35183:1;35172:9;35168:17;35159:6;35115:71;:::i;:::-;35069:124;;;;:::o;35199:283::-;;35265:2;35259:9;35249:19;;35307:4;35299:6;35295:17;35414:6;35402:10;35399:22;35378:18;35366:10;35363:34;35360:62;35357:2;;;35425:18;;:::i;:::-;35357:2;35465:10;35461:2;35454:22;35239:243;;;;:::o;35488:331::-;;35639:18;35631:6;35628:30;35625:2;;;35661:18;;:::i;:::-;35625:2;35746:4;35742:9;35735:4;35727:6;35723:17;35719:33;35711:41;;35807:4;35801;35797:15;35789:23;;35554:265;;;:::o;35825:332::-;;35977:18;35969:6;35966:30;35963:2;;;35999:18;;:::i;:::-;35963:2;36084:4;36080:9;36073:4;36065:6;36061:17;36057:33;36049:41;;36145:4;36139;36135:15;36127:23;;35892:265;;;:::o;36163:132::-;;36253:3;36245:11;;36283:4;36278:3;36274:14;36266:22;;36235:60;;;:::o;36301:114::-;;36402:5;36396:12;36386:22;;36375:40;;;:::o;36421:98::-;;36506:5;36500:12;36490:22;;36479:40;;;:::o;36525:99::-;;36611:5;36605:12;36595:22;;36584:40;;;:::o;36630:113::-;;36732:4;36727:3;36723:14;36715:22;;36705:38;;;:::o;36749:184::-;;36882:6;36877:3;36870:19;36922:4;36917:3;36913:14;36898:29;;36860:73;;;;:::o;36939:168::-;;37056:6;37051:3;37044:19;37096:4;37091:3;37087:14;37072:29;;37034:73;;;;:::o;37113:169::-;;37231:6;37226:3;37219:19;37271:4;37266:3;37262:14;37247:29;;37209:73;;;;:::o;37288:148::-;;37427:3;37412:18;;37402:34;;;;:::o;37442:273::-;;37501:20;37519:1;37501:20;:::i;:::-;37496:25;;37535:20;37553:1;37535:20;:::i;:::-;37530:25;;37657:1;37621:34;37617:42;37614:1;37611:49;37608:2;;;37663:18;;:::i;:::-;37608:2;37707:1;37704;37700:9;37693:16;;37486:229;;;;:::o;37721:305::-;;37780:20;37798:1;37780:20;:::i;:::-;37775:25;;37814:20;37832:1;37814:20;:::i;:::-;37809:25;;37968:1;37900:66;37896:74;37893:1;37890:81;37887:2;;;37974:18;;:::i;:::-;37887:2;38018:1;38015;38011:9;38004:16;;37765:261;;;;:::o;38032:185::-;;38089:20;38107:1;38089:20;:::i;:::-;38084:25;;38123:20;38141:1;38123:20;:::i;:::-;38118:25;;38162:1;38152:2;;38167:18;;:::i;:::-;38152:2;38209:1;38206;38202:9;38197:14;;38074:143;;;;:::o;38223:348::-;;38286:20;38304:1;38286:20;:::i;:::-;38281:25;;38320:20;38338:1;38320:20;:::i;:::-;38315:25;;38508:1;38440:66;38436:74;38433:1;38430:81;38425:1;38418:9;38411:17;38407:105;38404:2;;;38515:18;;:::i;:::-;38404:2;38563:1;38560;38556:9;38545:20;;38271:300;;;;:::o;38577:191::-;;38637:20;38655:1;38637:20;:::i;:::-;38632:25;;38671:20;38689:1;38671:20;:::i;:::-;38666:25;;38710:1;38707;38704:8;38701:2;;;38715:18;;:::i;:::-;38701:2;38760:1;38757;38753:9;38745:17;;38622:146;;;;:::o;38774:191::-;;38834:20;38852:1;38834:20;:::i;:::-;38829:25;;38868:20;38886:1;38868:20;:::i;:::-;38863:25;;38907:1;38904;38901:8;38898:2;;;38912:18;;:::i;:::-;38898:2;38957:1;38954;38950:9;38942:17;;38819:146;;;;:::o;38971:96::-;;39037:24;39055:5;39037:24;:::i;:::-;39026:35;;39016:51;;;:::o;39073:90::-;;39150:5;39143:13;39136:21;39125:32;;39115:48;;;:::o;39169:77::-;;39235:5;39224:16;;39214:32;;;:::o;39252:149::-;;39328:66;39321:5;39317:78;39306:89;;39296:105;;;:::o;39407:118::-;;39484:34;39477:5;39473:46;39462:57;;39452:73;;;:::o;39531:126::-;;39608:42;39601:5;39597:54;39586:65;;39576:81;;;:::o;39663:77::-;;39729:5;39718:16;;39708:32;;;:::o;39746:154::-;39830:6;39825:3;39820;39807:30;39892:1;39883:6;39878:3;39874:16;39867:27;39797:103;;;:::o;39906:307::-;39974:1;39984:113;39998:6;39995:1;39992:13;39984:113;;;40083:1;40078:3;40074:11;40068:18;40064:1;40059:3;40055:11;40048:39;40020:2;40017:1;40013:10;40008:15;;39984:113;;;40115:6;40112:1;40109:13;40106:2;;;40195:1;40186:6;40181:3;40177:16;40170:27;40106:2;39955:258;;;;:::o;40219:171::-;;40281:24;40299:5;40281:24;:::i;:::-;40272:33;;40327:4;40320:5;40317:15;40314:2;;;40335:18;;:::i;:::-;40314:2;40382:1;40375:5;40371:13;40364:20;;40262:128;;;:::o;40396:320::-;;40477:1;40471:4;40467:12;40457:22;;40524:1;40518:4;40514:12;40545:18;40535:2;;40601:4;40593:6;40589:17;40579:27;;40535:2;40663;40655:6;40652:14;40632:18;40629:38;40626:2;;;40682:18;;:::i;:::-;40626:2;40447:269;;;;:::o;40722:233::-;;40784:24;40802:5;40784:24;:::i;:::-;40775:33;;40830:66;40823:5;40820:77;40817:2;;;40900:18;;:::i;:::-;40817:2;40947:1;40940:5;40936:13;40929:20;;40765:190;;;:::o;40961:100::-;;41029:26;41049:5;41029:26;:::i;:::-;41018:37;;41008:53;;;:::o;41067:79::-;;41135:5;41124:16;;41114:32;;;:::o;41152:94::-;;41220:20;41234:5;41220:20;:::i;:::-;41209:31;;41199:47;;;:::o;41252:176::-;;41301:20;41319:1;41301:20;:::i;:::-;41296:25;;41335:20;41353:1;41335:20;:::i;:::-;41330:25;;41374:1;41364:2;;41379:18;;:::i;:::-;41364:2;41420:1;41417;41413:9;41408:14;;41286:142;;;;:::o;41434:180::-;41482:77;41479:1;41472:88;41579:4;41576:1;41569:15;41603:4;41600:1;41593:15;41620:180;41668:77;41665:1;41658:88;41765:4;41762:1;41755:15;41789:4;41786:1;41779:15;41806:180;41854:77;41851:1;41844:88;41951:4;41948:1;41941:15;41975:4;41972:1;41965:15;41992:180;42040:77;42037:1;42030:88;42137:4;42134:1;42127:15;42161:4;42158:1;42151:15;42178:102;;42270:2;42266:7;42261:2;42254:5;42250:14;42246:28;42236:38;;42226:54;;;:::o;42286:94::-;;42367:5;42363:2;42359:14;42338:35;;42328:52;;;:::o;42386:122::-;42459:24;42477:5;42459:24;:::i;:::-;42452:5;42449:35;42439:2;;42498:1;42495;42488:12;42439:2;42429:79;:::o;42514:116::-;42584:21;42599:5;42584:21;:::i;:::-;42577:5;42574:32;42564:2;;42620:1;42617;42610:12;42564:2;42554:76;:::o;42636:122::-;42709:24;42727:5;42709:24;:::i;:::-;42702:5;42699:35;42689:2;;42748:1;42745;42738:12;42689:2;42679:79;:::o;42764:120::-;42836:23;42853:5;42836:23;:::i;:::-;42829:5;42826:34;42816:2;;42874:1;42871;42864:12;42816:2;42806:78;:::o;42890:122::-;42963:24;42981:5;42963:24;:::i;:::-;42956:5;42953:35;42943:2;;43002:1;42999;42992:12;42943:2;42933:79;:::o

Swarm Source

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