ETH Price: $2,682.26 (+2.43%)

Token

Metabows (MBW)
 

Overview

Max Total Supply

2,222 MBW

Holders

1,106

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 MBW
0xb2a708cb3d06ff79c9ac8a16ac061b38f5ba71e2
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:
Metabows

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-16
*/

// SPDX-License-Identifier: GPL-3.0

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

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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // 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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID. 
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @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 Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * 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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * 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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}


// File: contracts/Metabows.sol

pragma solidity >=0.8.0 <0.9.0;

contract Metabows is ERC721A, Ownable, ReentrancyGuard {

    using Strings for uint256;

    mapping(address => uint256) public addressMintedBalance;

    string public baseURI;
    string public notRevealedUri;
    string public uriSuffix = ".json";
  
    uint256 public cost = 0.005 ether;
    uint256 public maxSupply = 2222;
    uint256 public maxFreeSupply = 500;
    uint256 public MaxperTx = 2;
    uint256 public nftPerAddressLimit = 6;
    uint256 public nftPerAddressLimitFree = 2;

    bool public paused = false;
    bool public revealed = true;

    constructor() ERC721A("Metabows", "MBW") {
      setBaseURI("ipfs://QmR3KzoKHSDTsT8QH6p9AHHbPV2LmLpwgA9EuFMMAsmErn/");
      setNotRevealedUri("ipfs:///");
    }

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

    function _startTokenId() internal view virtual override returns (uint256) {
      return 1;
    }

    // Mint
    function mint(uint256 _amount) external payable {

      address _caller = _msgSender();
      uint256 ownerMintedCount = addressMintedBalance[msg.sender];

      require(!paused, "Contract is paused.");
      require(_amount > 0, "Need to mint at least 1 NFT.");
      require(totalSupply() + _amount <= maxSupply, "Max supply exceeded.");
      require(tx.origin == _caller, "Caller can't be another contract");

      if (ownerMintedCount < nftPerAddressLimitFree) {
        require(addressMintedBalance[msg.sender] + _amount <= nftPerAddressLimitFree, "Excess max free per wallet address");
        require(_amount <= MaxperTx, "Excess max per free tx");
      } 

      else if (ownerMintedCount >= nftPerAddressLimitFree) {
        require(addressMintedBalance[msg.sender] + _amount <= nftPerAddressLimit, "Excess max paid per wallet address");
        require(_amount <= MaxperTx, "Excess max per paid tx");
        require(_amount * cost <= msg.value, "Invalid funds provided");
      }

    addressMintedBalance[msg.sender] += _amount;
    _safeMint(_caller, _amount);
    }

    // Only owner mint, used to mint tokens for other wallets
    function mintForAddress(address _to, uint256 _mintAmount) public onlyOwner {
      uint256 supply = totalSupply();
      require(_mintAmount > 0);
      require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded.");

      for (uint256 i = 1; i <= _mintAmount; i++) {
        _safeMint(_to, supply);
        }
    }

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

      string memory currentBaseURI = _baseURI();
      return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
      uint256 ownerTokenCount = balanceOf(_owner);
      uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
      uint256 currentTokenId = 1;
      uint256 ownedTokenIndex = 0;

      while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
        address currentTokenOwner = ownerOf(currentTokenId);

        if (currentTokenOwner == _owner) {
            ownedTokenIds[ownedTokenIndex] = currentTokenId;

            ownedTokenIndex++;
        }
        currentTokenId++;
      }
      return ownedTokenIds;
    }
    
    // Sets the max amount of mints per transaction
    function setMaxperTx(uint256 _maxperTx) public onlyOwner {
      MaxperTx = _maxperTx;
    }

    // Sets the max amount of mints
    function setMaxMint(uint256 _maxMint) public onlyOwner {
      MaxperTx = _maxMint;
    }

    // Returns the baseURI for metadata
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
      baseURI = _newBaseURI;
    }

    // Internal function to set the hidden IPFS metadata
    function setNotRevealedUri(string memory _notRevealedUri) public onlyOwner {
      notRevealedUri = _notRevealedUri;
    }

    // UriSuffix should match the end of the metadata link, example = ".json"
    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
      uriSuffix = _uriSuffix;
    }
    
    // Internal function to change contract pause, true = paused
    function setPaused(bool _state) public onlyOwner {
      paused = _state;
    }

    // Do not remove this function or you will not be able to withdraw funds
    function withdraw() public onlyOwner nonReentrant {
      (bool os, ) = payable(owner()).call{value: address(this).balance}("");
      require(os);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"MaxperTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimitFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxperTx","type":"uint256"}],"name":"setMaxperTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedUri","type":"string"}],"name":"setNotRevealedUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005192919062000467565b506611c37937e08000600e556108ae600f556101f46010556002601155600660125560026013556000601460006101000a81548160ff0219169083151502179055506001601460016101000a81548160ff021916908315150217905550348015620000bb57600080fd5b506040518060400160405280600881526020017f4d657461626f77730000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d4257000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200014092919062000467565b5080600390805190602001906200015992919062000467565b506200016a6200021060201b60201c565b600081905550505062000192620001866200021960201b60201c565b6200022160201b60201c565b6001600981905550620001c46040518060600160405280603681526020016200463860369139620002e760201b60201c565b6200020a6040518060400160405280600881526020017f697066733a2f2f2f0000000000000000000000000000000000000000000000008152506200039260201b60201c565b620005ff565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002f76200021960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200031d6200043d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000376576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036d906200053e565b60405180910390fd5b80600b90805190602001906200038e92919062000467565b5050565b620003a26200021960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003c86200043d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000418906200053e565b60405180910390fd5b80600c90805190602001906200043992919062000467565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004759062000571565b90600052602060002090601f016020900481019282620004995760008555620004e5565b82601f10620004b457805160ff1916838001178555620004e5565b82800160010185558215620004e5579182015b82811115620004e4578251825591602001919060010190620004c7565b5b509050620004f49190620004f8565b5090565b5b8082111562000513576000816000905550600101620004f9565b5090565b60006200052660208362000560565b91506200053382620005d6565b602082019050919050565b60006020820190508181036000830152620005598162000517565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200058a57607f821691505b60208210811415620005a157620005a0620005a7565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614029806200060f6000396000f3fe6080604052600436106102305760003560e01c806355f804b31161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461081c578063e985e9c514610847578063f254933d14610884578063f2fde38b146108ad578063ff645691146108d657610230565b8063a22cb46514610739578063b88d4fde14610762578063ba7d2c761461078b578063c17ecd12146107b6578063c87b56dd146107df57610230565b806370a08231116100f257806370a0823114610673578063715018a6146106b05780638da5cb5b146106c757806395d89b41146106f2578063a0712d681461071d57610230565b806355f804b31461058e5780635c975abb146105b75780635ef9ff37146105e25780636352211e1461060b5780636c0360eb1461064857610230565b806318160ddd116101bc578063438b630011610180578063438b6300146104a757806347513334146104e4578063518302271461050f578063547520fe1461053a5780635503a0e81461056357610230565b806318160ddd146103d657806318cae2691461040157806323b872dd1461043e5780633ccfd60b1461046757806342842e0e1461047e57610230565b8063095ea7b311610203578063095ea7b3146103055780630e1afe3f1461032e57806313faede61461035957806316ba10e01461038457806316c38b3c146103ad57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063081c8c44146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061304b565b610901565b60405161026991906135cb565b60405180910390f35b34801561027e57600080fd5b50610287610993565b60405161029491906135e6565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906130ee565b610a25565b6040516102d19190613542565b60405180910390f35b3480156102e657600080fd5b506102ef610aa1565b6040516102fc91906135e6565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190612fde565b610b2f565b005b34801561033a57600080fd5b50610343610cd6565b60405161035091906137c8565b60405180910390f35b34801561036557600080fd5b5061036e610cdc565b60405161037b91906137c8565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a691906130a5565b610ce2565b005b3480156103b957600080fd5b506103d460048036038101906103cf919061301e565b610d78565b005b3480156103e257600080fd5b506103eb610e11565b6040516103f891906137c8565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612e5b565b610e28565b60405161043591906137c8565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190612ec8565b610e40565b005b34801561047357600080fd5b5061047c610e50565b005b34801561048a57600080fd5b506104a560048036038101906104a09190612ec8565b610fa2565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190612e5b565b610fc2565b6040516104db91906135a9565b60405180910390f35b3480156104f057600080fd5b506104f96110cd565b60405161050691906137c8565b60405180910390f35b34801561051b57600080fd5b506105246110d3565b60405161053191906135cb565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c91906130ee565b6110e6565b005b34801561056f57600080fd5b5061057861116c565b60405161058591906135e6565b60405180910390f35b34801561059a57600080fd5b506105b560048036038101906105b091906130a5565b6111fa565b005b3480156105c357600080fd5b506105cc611290565b6040516105d991906135cb565b60405180910390f35b3480156105ee57600080fd5b50610609600480360381019061060491906130ee565b6112a3565b005b34801561061757600080fd5b50610632600480360381019061062d91906130ee565b611329565b60405161063f9190613542565b60405180910390f35b34801561065457600080fd5b5061065d61133b565b60405161066a91906135e6565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612e5b565b6113c9565b6040516106a791906137c8565b60405180910390f35b3480156106bc57600080fd5b506106c5611482565b005b3480156106d357600080fd5b506106dc61150a565b6040516106e99190613542565b60405180910390f35b3480156106fe57600080fd5b50610707611534565b60405161071491906135e6565b60405180910390f35b610737600480360381019061073291906130ee565b6115c6565b005b34801561074557600080fd5b50610760600480360381019061075b9190612f9e565b6119e5565b005b34801561076e57600080fd5b5061078960048036038101906107849190612f1b565b611b5d565b005b34801561079757600080fd5b506107a0611bd0565b6040516107ad91906137c8565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d891906130a5565b611bd6565b005b3480156107eb57600080fd5b50610806600480360381019061080191906130ee565b611c6c565b60405161081391906135e6565b60405180910390f35b34801561082857600080fd5b50610831611dc5565b60405161083e91906137c8565b60405180910390f35b34801561085357600080fd5b5061086e60048036038101906108699190612e88565b611dcb565b60405161087b91906135cb565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a69190612fde565b611e5f565b005b3480156108b957600080fd5b506108d460048036038101906108cf9190612e5b565b611f75565b005b3480156108e257600080fd5b506108eb61206d565b6040516108f891906137c8565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061095c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061098c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109a290613ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546109ce90613ad1565b8015610a1b5780601f106109f057610100808354040283529160200191610a1b565b820191906000526020600020905b8154815290600101906020018083116109fe57829003601f168201915b5050505050905090565b6000610a3082612073565b610a66576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610aae90613ad1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ada90613ad1565b8015610b275780601f10610afc57610100808354040283529160200191610b27565b820191906000526020600020905b815481529060010190602001808311610b0a57829003601f168201915b505050505081565b6000610b3a826120d2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc16121a0565b73ffffffffffffffffffffffffffffffffffffffff1614610c2457610bed81610be86121a0565b611dcb565b610c23576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60135481565b600e5481565b610cea6121a8565b73ffffffffffffffffffffffffffffffffffffffff16610d0861150a565b73ffffffffffffffffffffffffffffffffffffffff1614610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d55906136e8565b60405180910390fd5b80600d9080519060200190610d74929190612c6f565b5050565b610d806121a8565b73ffffffffffffffffffffffffffffffffffffffff16610d9e61150a565b73ffffffffffffffffffffffffffffffffffffffff1614610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb906136e8565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b6000610e1b6121b0565b6001546000540303905090565b600a6020528060005260406000206000915090505481565b610e4b8383836121b9565b505050565b610e586121a8565b73ffffffffffffffffffffffffffffffffffffffff16610e7661150a565b73ffffffffffffffffffffffffffffffffffffffff1614610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec3906136e8565b60405180910390fd5b60026009541415610f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0990613768565b60405180910390fd5b60026009819055506000610f2461150a565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f479061352d565b60006040518083038185875af1925050503d8060008114610f84576040519150601f19603f3d011682016040523d82523d6000602084013e610f89565b606091505b5050905080610f9757600080fd5b506001600981905550565b610fbd83838360405180602001604052806000815250611b5d565b505050565b60606000610fcf836113c9565b905060008167ffffffffffffffff811115610fed57610fec613c6a565b5b60405190808252806020026020018201604052801561101b5781602001602082028036833780820191505090505b50905060006001905060005b83811080156110385750600f548211155b156110c157600061104883611329565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ad578284838151811061109257611091613c3b565b5b60200260200101818152505081806110a990613b34565b9250505b82806110b890613b34565b93505050611027565b82945050505050919050565b60105481565b601460019054906101000a900460ff1681565b6110ee6121a8565b73ffffffffffffffffffffffffffffffffffffffff1661110c61150a565b73ffffffffffffffffffffffffffffffffffffffff1614611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906136e8565b60405180910390fd5b8060118190555050565b600d805461117990613ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546111a590613ad1565b80156111f25780601f106111c7576101008083540402835291602001916111f2565b820191906000526020600020905b8154815290600101906020018083116111d557829003601f168201915b505050505081565b6112026121a8565b73ffffffffffffffffffffffffffffffffffffffff1661122061150a565b73ffffffffffffffffffffffffffffffffffffffff1614611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906136e8565b60405180910390fd5b80600b908051906020019061128c929190612c6f565b5050565b601460009054906101000a900460ff1681565b6112ab6121a8565b73ffffffffffffffffffffffffffffffffffffffff166112c961150a565b73ffffffffffffffffffffffffffffffffffffffff161461131f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611316906136e8565b60405180910390fd5b8060118190555050565b6000611334826120d2565b9050919050565b600b805461134890613ad1565b80601f016020809104026020016040519081016040528092919081815260200182805461137490613ad1565b80156113c15780601f10611396576101008083540402835291602001916113c1565b820191906000526020600020905b8154815290600101906020018083116113a457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611431576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61148a6121a8565b73ffffffffffffffffffffffffffffffffffffffff166114a861150a565b73ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906136e8565b60405180910390fd5b6115086000612563565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461154390613ad1565b80601f016020809104026020016040519081016040528092919081815260200182805461156f90613ad1565b80156115bc5780601f10611591576101008083540402835291602001916115bc565b820191906000526020600020905b81548152906001019060200180831161159f57829003601f168201915b5050505050905090565b60006115d06121a8565b90506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601460009054906101000a900460ff1615611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165d90613748565b60405180910390fd5b600083116116a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a090613628565b60405180910390fd5b600f54836116b5610e11565b6116bf9190613906565b1115611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f7906137a8565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590613708565b60405180910390fd5b6013548110156118515760135483600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117c69190613906565b1115611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe90613688565b60405180910390fd5b60115483111561184c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611843906136a8565b60405180910390fd5b611980565b601354811061197f5760125483600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118a89190613906565b11156118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e0906136c8565b60405180910390fd5b60115483111561192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590613668565b60405180910390fd5b34600e548461193d919061398d565b111561197e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197590613728565b60405180910390fd5b5b5b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119cf9190613906565b925050819055506119e08284612629565b505050565b6119ed6121a0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a5f6121a0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b0c6121a0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b5191906135cb565b60405180910390a35050565b611b688484846121b9565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bca57611b9384848484612647565b611bc9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60125481565b611bde6121a8565b73ffffffffffffffffffffffffffffffffffffffff16611bfc61150a565b73ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c49906136e8565b60405180910390fd5b80600c9080519060200190611c68929190612c6f565b5050565b6060611c7782612073565b611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad90613788565b60405180910390fd5b60001515601460019054906101000a900460ff1615151415611d6457600c8054611cdf90613ad1565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0b90613ad1565b8015611d585780601f10611d2d57610100808354040283529160200191611d58565b820191906000526020600020905b815481529060010190602001808311611d3b57829003601f168201915b50505050509050611dc0565b6000611d6e6127a7565b90506000815111611d8e5760405180602001604052806000815250611dbc565b80611d9884612839565b600d604051602001611dac939291906134fc565b6040516020818303038152906040525b9150505b919050565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e676121a8565b73ffffffffffffffffffffffffffffffffffffffff16611e8561150a565b73ffffffffffffffffffffffffffffffffffffffff1614611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed2906136e8565b60405180910390fd5b6000611ee5610e11565b905060008211611ef457600080fd5b600f548282611f039190613906565b1115611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90613608565b60405180910390fd5b6000600190505b828111611f6f57611f5c8483612629565b8080611f6790613b34565b915050611f4b565b50505050565b611f7d6121a8565b73ffffffffffffffffffffffffffffffffffffffff16611f9b61150a565b73ffffffffffffffffffffffffffffffffffffffff1614611ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe8906136e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890613648565b60405180910390fd5b61206a81612563565b50565b60115481565b60008161207e6121b0565b1115801561208d575060005482105b80156120cb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806120e16121b0565b11612169576000548110156121685760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612166575b600081141561215c576004600083600190039350838152602001908152602001600020549050612131565b809250505061219b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b60006121c4826120d2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461222b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661224c6121a0565b73ffffffffffffffffffffffffffffffffffffffff16148061227b575061227a856122756121a0565b611dcb565b5b806122c057506122896121a0565b73ffffffffffffffffffffffffffffffffffffffff166122a884610a25565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122f9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612360576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61236d858585600161299a565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61246a866129a0565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156124f45760006001840190506000600460008381526020019081526020016000205414156124f25760005481146124f1578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461255c85858560016129aa565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126438282604051806020016040528060008152506129b0565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261266d6121a0565b8786866040518563ffffffff1660e01b815260040161268f949392919061355d565b602060405180830381600087803b1580156126a957600080fd5b505af19250505080156126da57506040513d601f19601f820116820180604052508101906126d79190613078565b60015b612754573d806000811461270a576040519150601f19603f3d011682016040523d82523d6000602084013e61270f565b606091505b5060008151141561274c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b80546127b690613ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546127e290613ad1565b801561282f5780601f106128045761010080835404028352916020019161282f565b820191906000526020600020905b81548152906001019060200180831161281257829003601f168201915b5050505050905090565b60606000821415612881576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612995565b600082905060005b600082146128b357808061289c90613b34565b915050600a826128ac919061395c565b9150612889565b60008167ffffffffffffffff8111156128cf576128ce613c6a565b5b6040519080825280601f01601f1916602001820160405280156129015781602001600182028036833780820191505090505b5090505b6000851461298e5760018261291a91906139e7565b9150600a856129299190613b7d565b60306129359190613906565b60f81b81838151811061294b5761294a613c3b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612987919061395c565b9450612905565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a1d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612a58576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a65600085838661299a565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612aca60018514612c65565b901b60a042901b612ada866129a0565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612bde575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b8e6000878480600101955087612647565b612bc4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612b1f578260005414612bd957600080fd5b612c49565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612bdf575b816000819055505050612c5f60008583866129aa565b50505050565b6000819050919050565b828054612c7b90613ad1565b90600052602060002090601f016020900481019282612c9d5760008555612ce4565b82601f10612cb657805160ff1916838001178555612ce4565b82800160010185558215612ce4579182015b82811115612ce3578251825591602001919060010190612cc8565b5b509050612cf19190612cf5565b5090565b5b80821115612d0e576000816000905550600101612cf6565b5090565b6000612d25612d2084613808565b6137e3565b905082815260208101848484011115612d4157612d40613c9e565b5b612d4c848285613a8f565b509392505050565b6000612d67612d6284613839565b6137e3565b905082815260208101848484011115612d8357612d82613c9e565b5b612d8e848285613a8f565b509392505050565b600081359050612da581613f97565b92915050565b600081359050612dba81613fae565b92915050565b600081359050612dcf81613fc5565b92915050565b600081519050612de481613fc5565b92915050565b600082601f830112612dff57612dfe613c99565b5b8135612e0f848260208601612d12565b91505092915050565b600082601f830112612e2d57612e2c613c99565b5b8135612e3d848260208601612d54565b91505092915050565b600081359050612e5581613fdc565b92915050565b600060208284031215612e7157612e70613ca8565b5b6000612e7f84828501612d96565b91505092915050565b60008060408385031215612e9f57612e9e613ca8565b5b6000612ead85828601612d96565b9250506020612ebe85828601612d96565b9150509250929050565b600080600060608486031215612ee157612ee0613ca8565b5b6000612eef86828701612d96565b9350506020612f0086828701612d96565b9250506040612f1186828701612e46565b9150509250925092565b60008060008060808587031215612f3557612f34613ca8565b5b6000612f4387828801612d96565b9450506020612f5487828801612d96565b9350506040612f6587828801612e46565b925050606085013567ffffffffffffffff811115612f8657612f85613ca3565b5b612f9287828801612dea565b91505092959194509250565b60008060408385031215612fb557612fb4613ca8565b5b6000612fc385828601612d96565b9250506020612fd485828601612dab565b9150509250929050565b60008060408385031215612ff557612ff4613ca8565b5b600061300385828601612d96565b925050602061301485828601612e46565b9150509250929050565b60006020828403121561303457613033613ca8565b5b600061304284828501612dab565b91505092915050565b60006020828403121561306157613060613ca8565b5b600061306f84828501612dc0565b91505092915050565b60006020828403121561308e5761308d613ca8565b5b600061309c84828501612dd5565b91505092915050565b6000602082840312156130bb576130ba613ca8565b5b600082013567ffffffffffffffff8111156130d9576130d8613ca3565b5b6130e584828501612e18565b91505092915050565b60006020828403121561310457613103613ca8565b5b600061311284828501612e46565b91505092915050565b600061312783836134de565b60208301905092915050565b61313c81613a1b565b82525050565b600061314d8261388f565b61315781856138bd565b93506131628361386a565b8060005b8381101561319357815161317a888261311b565b9750613185836138b0565b925050600181019050613166565b5085935050505092915050565b6131a981613a2d565b82525050565b60006131ba8261389a565b6131c481856138ce565b93506131d4818560208601613a9e565b6131dd81613cad565b840191505092915050565b60006131f3826138a5565b6131fd81856138ea565b935061320d818560208601613a9e565b61321681613cad565b840191505092915050565b600061322c826138a5565b61323681856138fb565b9350613246818560208601613a9e565b80840191505092915050565b6000815461325f81613ad1565b61326981866138fb565b945060018216600081146132845760018114613295576132c8565b60ff198316865281860193506132c8565b61329e8561387a565b60005b838110156132c0578154818901526001820191506020810190506132a1565b838801955050505b50505092915050565b60006132de6017836138ea565b91506132e982613cbe565b602082019050919050565b6000613301601c836138ea565b915061330c82613ce7565b602082019050919050565b60006133246026836138ea565b915061332f82613d10565b604082019050919050565b60006133476016836138ea565b915061335282613d5f565b602082019050919050565b600061336a6022836138ea565b915061337582613d88565b604082019050919050565b600061338d6016836138ea565b915061339882613dd7565b602082019050919050565b60006133b06022836138ea565b91506133bb82613e00565b604082019050919050565b60006133d36020836138ea565b91506133de82613e4f565b602082019050919050565b60006133f66020836138ea565b915061340182613e78565b602082019050919050565b60006134196016836138ea565b915061342482613ea1565b602082019050919050565b600061343c6000836138df565b915061344782613eca565b600082019050919050565b600061345f6013836138ea565b915061346a82613ecd565b602082019050919050565b6000613482601f836138ea565b915061348d82613ef6565b602082019050919050565b60006134a56030836138ea565b91506134b082613f1f565b604082019050919050565b60006134c86014836138ea565b91506134d382613f6e565b602082019050919050565b6134e781613a85565b82525050565b6134f681613a85565b82525050565b60006135088286613221565b91506135148285613221565b91506135208284613252565b9150819050949350505050565b60006135388261342f565b9150819050919050565b60006020820190506135576000830184613133565b92915050565b60006080820190506135726000830187613133565b61357f6020830186613133565b61358c60408301856134ed565b818103606083015261359e81846131af565b905095945050505050565b600060208201905081810360008301526135c38184613142565b905092915050565b60006020820190506135e060008301846131a0565b92915050565b6000602082019050818103600083015261360081846131e8565b905092915050565b60006020820190508181036000830152613621816132d1565b9050919050565b60006020820190508181036000830152613641816132f4565b9050919050565b6000602082019050818103600083015261366181613317565b9050919050565b600060208201905081810360008301526136818161333a565b9050919050565b600060208201905081810360008301526136a18161335d565b9050919050565b600060208201905081810360008301526136c181613380565b9050919050565b600060208201905081810360008301526136e1816133a3565b9050919050565b60006020820190508181036000830152613701816133c6565b9050919050565b60006020820190508181036000830152613721816133e9565b9050919050565b600060208201905081810360008301526137418161340c565b9050919050565b6000602082019050818103600083015261376181613452565b9050919050565b6000602082019050818103600083015261378181613475565b9050919050565b600060208201905081810360008301526137a181613498565b9050919050565b600060208201905081810360008301526137c1816134bb565b9050919050565b60006020820190506137dd60008301846134ed565b92915050565b60006137ed6137fe565b90506137f98282613b03565b919050565b6000604051905090565b600067ffffffffffffffff82111561382357613822613c6a565b5b61382c82613cad565b9050602081019050919050565b600067ffffffffffffffff82111561385457613853613c6a565b5b61385d82613cad565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061391182613a85565b915061391c83613a85565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561395157613950613bae565b5b828201905092915050565b600061396782613a85565b915061397283613a85565b92508261398257613981613bdd565b5b828204905092915050565b600061399882613a85565b91506139a383613a85565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139dc576139db613bae565b5b828202905092915050565b60006139f282613a85565b91506139fd83613a85565b925082821015613a1057613a0f613bae565b5b828203905092915050565b6000613a2682613a65565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613abc578082015181840152602081019050613aa1565b83811115613acb576000848401525b50505050565b60006002820490506001821680613ae957607f821691505b60208210811415613afd57613afc613c0c565b5b50919050565b613b0c82613cad565b810181811067ffffffffffffffff82111715613b2b57613b2a613c6a565b5b80604052505050565b6000613b3f82613a85565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b7257613b71613bae565b5b600182019050919050565b6000613b8882613a85565b9150613b9383613a85565b925082613ba357613ba2613bdd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6d6178204e4654206c696d69742065786365656465642e000000000000000000600082015250565b7f4e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863657373206d617820706572207061696420747800000000000000000000600082015250565b7f457863657373206d61782066726565207065722077616c6c657420616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f457863657373206d617820706572206672656520747800000000000000000000600082015250565b7f457863657373206d61782070616964207065722077616c6c657420616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616c6c65722063616e277420626520616e6f7468657220636f6e7472616374600082015250565b7f496e76616c69642066756e64732070726f766964656400000000000000000000600082015250565b50565b7f436f6e7472616374206973207061757365642e00000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b7f4d617820737570706c792065786365656465642e000000000000000000000000600082015250565b613fa081613a1b565b8114613fab57600080fd5b50565b613fb781613a2d565b8114613fc257600080fd5b50565b613fce81613a39565b8114613fd957600080fd5b50565b613fe581613a85565b8114613ff057600080fd5b5056fea2646970667358221220d90e2a3a785c0b6b08279735b416579983251ac760e165624b3e1d26a4ae069d64736f6c63430008070033697066733a2f2f516d52334b7a6f4b485344547354385148367039414848625056324c6d4c70776741394575464d4d41736d45726e2f

Deployed Bytecode

0x6080604052600436106102305760003560e01c806355f804b31161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461081c578063e985e9c514610847578063f254933d14610884578063f2fde38b146108ad578063ff645691146108d657610230565b8063a22cb46514610739578063b88d4fde14610762578063ba7d2c761461078b578063c17ecd12146107b6578063c87b56dd146107df57610230565b806370a08231116100f257806370a0823114610673578063715018a6146106b05780638da5cb5b146106c757806395d89b41146106f2578063a0712d681461071d57610230565b806355f804b31461058e5780635c975abb146105b75780635ef9ff37146105e25780636352211e1461060b5780636c0360eb1461064857610230565b806318160ddd116101bc578063438b630011610180578063438b6300146104a757806347513334146104e4578063518302271461050f578063547520fe1461053a5780635503a0e81461056357610230565b806318160ddd146103d657806318cae2691461040157806323b872dd1461043e5780633ccfd60b1461046757806342842e0e1461047e57610230565b8063095ea7b311610203578063095ea7b3146103055780630e1afe3f1461032e57806313faede61461035957806316ba10e01461038457806316c38b3c146103ad57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063081c8c44146102da575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061304b565b610901565b60405161026991906135cb565b60405180910390f35b34801561027e57600080fd5b50610287610993565b60405161029491906135e6565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf91906130ee565b610a25565b6040516102d19190613542565b60405180910390f35b3480156102e657600080fd5b506102ef610aa1565b6040516102fc91906135e6565b60405180910390f35b34801561031157600080fd5b5061032c60048036038101906103279190612fde565b610b2f565b005b34801561033a57600080fd5b50610343610cd6565b60405161035091906137c8565b60405180910390f35b34801561036557600080fd5b5061036e610cdc565b60405161037b91906137c8565b60405180910390f35b34801561039057600080fd5b506103ab60048036038101906103a691906130a5565b610ce2565b005b3480156103b957600080fd5b506103d460048036038101906103cf919061301e565b610d78565b005b3480156103e257600080fd5b506103eb610e11565b6040516103f891906137c8565b60405180910390f35b34801561040d57600080fd5b5061042860048036038101906104239190612e5b565b610e28565b60405161043591906137c8565b60405180910390f35b34801561044a57600080fd5b5061046560048036038101906104609190612ec8565b610e40565b005b34801561047357600080fd5b5061047c610e50565b005b34801561048a57600080fd5b506104a560048036038101906104a09190612ec8565b610fa2565b005b3480156104b357600080fd5b506104ce60048036038101906104c99190612e5b565b610fc2565b6040516104db91906135a9565b60405180910390f35b3480156104f057600080fd5b506104f96110cd565b60405161050691906137c8565b60405180910390f35b34801561051b57600080fd5b506105246110d3565b60405161053191906135cb565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c91906130ee565b6110e6565b005b34801561056f57600080fd5b5061057861116c565b60405161058591906135e6565b60405180910390f35b34801561059a57600080fd5b506105b560048036038101906105b091906130a5565b6111fa565b005b3480156105c357600080fd5b506105cc611290565b6040516105d991906135cb565b60405180910390f35b3480156105ee57600080fd5b50610609600480360381019061060491906130ee565b6112a3565b005b34801561061757600080fd5b50610632600480360381019061062d91906130ee565b611329565b60405161063f9190613542565b60405180910390f35b34801561065457600080fd5b5061065d61133b565b60405161066a91906135e6565b60405180910390f35b34801561067f57600080fd5b5061069a60048036038101906106959190612e5b565b6113c9565b6040516106a791906137c8565b60405180910390f35b3480156106bc57600080fd5b506106c5611482565b005b3480156106d357600080fd5b506106dc61150a565b6040516106e99190613542565b60405180910390f35b3480156106fe57600080fd5b50610707611534565b60405161071491906135e6565b60405180910390f35b610737600480360381019061073291906130ee565b6115c6565b005b34801561074557600080fd5b50610760600480360381019061075b9190612f9e565b6119e5565b005b34801561076e57600080fd5b5061078960048036038101906107849190612f1b565b611b5d565b005b34801561079757600080fd5b506107a0611bd0565b6040516107ad91906137c8565b60405180910390f35b3480156107c257600080fd5b506107dd60048036038101906107d891906130a5565b611bd6565b005b3480156107eb57600080fd5b50610806600480360381019061080191906130ee565b611c6c565b60405161081391906135e6565b60405180910390f35b34801561082857600080fd5b50610831611dc5565b60405161083e91906137c8565b60405180910390f35b34801561085357600080fd5b5061086e60048036038101906108699190612e88565b611dcb565b60405161087b91906135cb565b60405180910390f35b34801561089057600080fd5b506108ab60048036038101906108a69190612fde565b611e5f565b005b3480156108b957600080fd5b506108d460048036038101906108cf9190612e5b565b611f75565b005b3480156108e257600080fd5b506108eb61206d565b6040516108f891906137c8565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061095c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061098c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109a290613ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546109ce90613ad1565b8015610a1b5780601f106109f057610100808354040283529160200191610a1b565b820191906000526020600020905b8154815290600101906020018083116109fe57829003601f168201915b5050505050905090565b6000610a3082612073565b610a66576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610aae90613ad1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ada90613ad1565b8015610b275780601f10610afc57610100808354040283529160200191610b27565b820191906000526020600020905b815481529060010190602001808311610b0a57829003601f168201915b505050505081565b6000610b3a826120d2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc16121a0565b73ffffffffffffffffffffffffffffffffffffffff1614610c2457610bed81610be86121a0565b611dcb565b610c23576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60135481565b600e5481565b610cea6121a8565b73ffffffffffffffffffffffffffffffffffffffff16610d0861150a565b73ffffffffffffffffffffffffffffffffffffffff1614610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d55906136e8565b60405180910390fd5b80600d9080519060200190610d74929190612c6f565b5050565b610d806121a8565b73ffffffffffffffffffffffffffffffffffffffff16610d9e61150a565b73ffffffffffffffffffffffffffffffffffffffff1614610df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610deb906136e8565b60405180910390fd5b80601460006101000a81548160ff02191690831515021790555050565b6000610e1b6121b0565b6001546000540303905090565b600a6020528060005260406000206000915090505481565b610e4b8383836121b9565b505050565b610e586121a8565b73ffffffffffffffffffffffffffffffffffffffff16610e7661150a565b73ffffffffffffffffffffffffffffffffffffffff1614610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec3906136e8565b60405180910390fd5b60026009541415610f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0990613768565b60405180910390fd5b60026009819055506000610f2461150a565b73ffffffffffffffffffffffffffffffffffffffff1647604051610f479061352d565b60006040518083038185875af1925050503d8060008114610f84576040519150601f19603f3d011682016040523d82523d6000602084013e610f89565b606091505b5050905080610f9757600080fd5b506001600981905550565b610fbd83838360405180602001604052806000815250611b5d565b505050565b60606000610fcf836113c9565b905060008167ffffffffffffffff811115610fed57610fec613c6a565b5b60405190808252806020026020018201604052801561101b5781602001602082028036833780820191505090505b50905060006001905060005b83811080156110385750600f548211155b156110c157600061104883611329565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ad578284838151811061109257611091613c3b565b5b60200260200101818152505081806110a990613b34565b9250505b82806110b890613b34565b93505050611027565b82945050505050919050565b60105481565b601460019054906101000a900460ff1681565b6110ee6121a8565b73ffffffffffffffffffffffffffffffffffffffff1661110c61150a565b73ffffffffffffffffffffffffffffffffffffffff1614611162576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611159906136e8565b60405180910390fd5b8060118190555050565b600d805461117990613ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546111a590613ad1565b80156111f25780601f106111c7576101008083540402835291602001916111f2565b820191906000526020600020905b8154815290600101906020018083116111d557829003601f168201915b505050505081565b6112026121a8565b73ffffffffffffffffffffffffffffffffffffffff1661122061150a565b73ffffffffffffffffffffffffffffffffffffffff1614611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d906136e8565b60405180910390fd5b80600b908051906020019061128c929190612c6f565b5050565b601460009054906101000a900460ff1681565b6112ab6121a8565b73ffffffffffffffffffffffffffffffffffffffff166112c961150a565b73ffffffffffffffffffffffffffffffffffffffff161461131f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611316906136e8565b60405180910390fd5b8060118190555050565b6000611334826120d2565b9050919050565b600b805461134890613ad1565b80601f016020809104026020016040519081016040528092919081815260200182805461137490613ad1565b80156113c15780601f10611396576101008083540402835291602001916113c1565b820191906000526020600020905b8154815290600101906020018083116113a457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611431576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61148a6121a8565b73ffffffffffffffffffffffffffffffffffffffff166114a861150a565b73ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906136e8565b60405180910390fd5b6115086000612563565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461154390613ad1565b80601f016020809104026020016040519081016040528092919081815260200182805461156f90613ad1565b80156115bc5780601f10611591576101008083540402835291602001916115bc565b820191906000526020600020905b81548152906001019060200180831161159f57829003601f168201915b5050505050905090565b60006115d06121a8565b90506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601460009054906101000a900460ff1615611666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165d90613748565b60405180910390fd5b600083116116a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a090613628565b60405180910390fd5b600f54836116b5610e11565b6116bf9190613906565b1115611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f7906137a8565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590613708565b60405180910390fd5b6013548110156118515760135483600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546117c69190613906565b1115611807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fe90613688565b60405180910390fd5b60115483111561184c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611843906136a8565b60405180910390fd5b611980565b601354811061197f5760125483600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546118a89190613906565b11156118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e0906136c8565b60405180910390fd5b60115483111561192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590613668565b60405180910390fd5b34600e548461193d919061398d565b111561197e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197590613728565b60405180910390fd5b5b5b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119cf9190613906565b925050819055506119e08284612629565b505050565b6119ed6121a0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611a5f6121a0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b0c6121a0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b5191906135cb565b60405180910390a35050565b611b688484846121b9565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611bca57611b9384848484612647565b611bc9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60125481565b611bde6121a8565b73ffffffffffffffffffffffffffffffffffffffff16611bfc61150a565b73ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c49906136e8565b60405180910390fd5b80600c9080519060200190611c68929190612c6f565b5050565b6060611c7782612073565b611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad90613788565b60405180910390fd5b60001515601460019054906101000a900460ff1615151415611d6457600c8054611cdf90613ad1565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0b90613ad1565b8015611d585780601f10611d2d57610100808354040283529160200191611d58565b820191906000526020600020905b815481529060010190602001808311611d3b57829003601f168201915b50505050509050611dc0565b6000611d6e6127a7565b90506000815111611d8e5760405180602001604052806000815250611dbc565b80611d9884612839565b600d604051602001611dac939291906134fc565b6040516020818303038152906040525b9150505b919050565b600f5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e676121a8565b73ffffffffffffffffffffffffffffffffffffffff16611e8561150a565b73ffffffffffffffffffffffffffffffffffffffff1614611edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed2906136e8565b60405180910390fd5b6000611ee5610e11565b905060008211611ef457600080fd5b600f548282611f039190613906565b1115611f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3b90613608565b60405180910390fd5b6000600190505b828111611f6f57611f5c8483612629565b8080611f6790613b34565b915050611f4b565b50505050565b611f7d6121a8565b73ffffffffffffffffffffffffffffffffffffffff16611f9b61150a565b73ffffffffffffffffffffffffffffffffffffffff1614611ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe8906136e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205890613648565b60405180910390fd5b61206a81612563565b50565b60115481565b60008161207e6121b0565b1115801561208d575060005482105b80156120cb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600080829050806120e16121b0565b11612169576000548110156121685760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612166575b600081141561215c576004600083600190039350838152602001908152602001600020549050612131565b809250505061219b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b60006121c4826120d2565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461222b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661224c6121a0565b73ffffffffffffffffffffffffffffffffffffffff16148061227b575061227a856122756121a0565b611dcb565b5b806122c057506122896121a0565b73ffffffffffffffffffffffffffffffffffffffff166122a884610a25565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806122f9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612360576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61236d858585600161299a565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61246a866129a0565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831614156124f45760006001840190506000600460008381526020019081526020016000205414156124f25760005481146124f1578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461255c85858560016129aa565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126438282604051806020016040528060008152506129b0565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261266d6121a0565b8786866040518563ffffffff1660e01b815260040161268f949392919061355d565b602060405180830381600087803b1580156126a957600080fd5b505af19250505080156126da57506040513d601f19601f820116820180604052508101906126d79190613078565b60015b612754573d806000811461270a576040519150601f19603f3d011682016040523d82523d6000602084013e61270f565b606091505b5060008151141561274c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b80546127b690613ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546127e290613ad1565b801561282f5780601f106128045761010080835404028352916020019161282f565b820191906000526020600020905b81548152906001019060200180831161281257829003601f168201915b5050505050905090565b60606000821415612881576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612995565b600082905060005b600082146128b357808061289c90613b34565b915050600a826128ac919061395c565b9150612889565b60008167ffffffffffffffff8111156128cf576128ce613c6a565b5b6040519080825280601f01601f1916602001820160405280156129015781602001600182028036833780820191505090505b5090505b6000851461298e5760018261291a91906139e7565b9150600a856129299190613b7d565b60306129359190613906565b60f81b81838151811061294b5761294a613c3b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612987919061395c565b9450612905565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a1d576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612a58576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a65600085838661299a565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612aca60018514612c65565b901b60a042901b612ada866129a0565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612bde575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b8e6000878480600101955087612647565b612bc4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612b1f578260005414612bd957600080fd5b612c49565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612bdf575b816000819055505050612c5f60008583866129aa565b50505050565b6000819050919050565b828054612c7b90613ad1565b90600052602060002090601f016020900481019282612c9d5760008555612ce4565b82601f10612cb657805160ff1916838001178555612ce4565b82800160010185558215612ce4579182015b82811115612ce3578251825591602001919060010190612cc8565b5b509050612cf19190612cf5565b5090565b5b80821115612d0e576000816000905550600101612cf6565b5090565b6000612d25612d2084613808565b6137e3565b905082815260208101848484011115612d4157612d40613c9e565b5b612d4c848285613a8f565b509392505050565b6000612d67612d6284613839565b6137e3565b905082815260208101848484011115612d8357612d82613c9e565b5b612d8e848285613a8f565b509392505050565b600081359050612da581613f97565b92915050565b600081359050612dba81613fae565b92915050565b600081359050612dcf81613fc5565b92915050565b600081519050612de481613fc5565b92915050565b600082601f830112612dff57612dfe613c99565b5b8135612e0f848260208601612d12565b91505092915050565b600082601f830112612e2d57612e2c613c99565b5b8135612e3d848260208601612d54565b91505092915050565b600081359050612e5581613fdc565b92915050565b600060208284031215612e7157612e70613ca8565b5b6000612e7f84828501612d96565b91505092915050565b60008060408385031215612e9f57612e9e613ca8565b5b6000612ead85828601612d96565b9250506020612ebe85828601612d96565b9150509250929050565b600080600060608486031215612ee157612ee0613ca8565b5b6000612eef86828701612d96565b9350506020612f0086828701612d96565b9250506040612f1186828701612e46565b9150509250925092565b60008060008060808587031215612f3557612f34613ca8565b5b6000612f4387828801612d96565b9450506020612f5487828801612d96565b9350506040612f6587828801612e46565b925050606085013567ffffffffffffffff811115612f8657612f85613ca3565b5b612f9287828801612dea565b91505092959194509250565b60008060408385031215612fb557612fb4613ca8565b5b6000612fc385828601612d96565b9250506020612fd485828601612dab565b9150509250929050565b60008060408385031215612ff557612ff4613ca8565b5b600061300385828601612d96565b925050602061301485828601612e46565b9150509250929050565b60006020828403121561303457613033613ca8565b5b600061304284828501612dab565b91505092915050565b60006020828403121561306157613060613ca8565b5b600061306f84828501612dc0565b91505092915050565b60006020828403121561308e5761308d613ca8565b5b600061309c84828501612dd5565b91505092915050565b6000602082840312156130bb576130ba613ca8565b5b600082013567ffffffffffffffff8111156130d9576130d8613ca3565b5b6130e584828501612e18565b91505092915050565b60006020828403121561310457613103613ca8565b5b600061311284828501612e46565b91505092915050565b600061312783836134de565b60208301905092915050565b61313c81613a1b565b82525050565b600061314d8261388f565b61315781856138bd565b93506131628361386a565b8060005b8381101561319357815161317a888261311b565b9750613185836138b0565b925050600181019050613166565b5085935050505092915050565b6131a981613a2d565b82525050565b60006131ba8261389a565b6131c481856138ce565b93506131d4818560208601613a9e565b6131dd81613cad565b840191505092915050565b60006131f3826138a5565b6131fd81856138ea565b935061320d818560208601613a9e565b61321681613cad565b840191505092915050565b600061322c826138a5565b61323681856138fb565b9350613246818560208601613a9e565b80840191505092915050565b6000815461325f81613ad1565b61326981866138fb565b945060018216600081146132845760018114613295576132c8565b60ff198316865281860193506132c8565b61329e8561387a565b60005b838110156132c0578154818901526001820191506020810190506132a1565b838801955050505b50505092915050565b60006132de6017836138ea565b91506132e982613cbe565b602082019050919050565b6000613301601c836138ea565b915061330c82613ce7565b602082019050919050565b60006133246026836138ea565b915061332f82613d10565b604082019050919050565b60006133476016836138ea565b915061335282613d5f565b602082019050919050565b600061336a6022836138ea565b915061337582613d88565b604082019050919050565b600061338d6016836138ea565b915061339882613dd7565b602082019050919050565b60006133b06022836138ea565b91506133bb82613e00565b604082019050919050565b60006133d36020836138ea565b91506133de82613e4f565b602082019050919050565b60006133f66020836138ea565b915061340182613e78565b602082019050919050565b60006134196016836138ea565b915061342482613ea1565b602082019050919050565b600061343c6000836138df565b915061344782613eca565b600082019050919050565b600061345f6013836138ea565b915061346a82613ecd565b602082019050919050565b6000613482601f836138ea565b915061348d82613ef6565b602082019050919050565b60006134a56030836138ea565b91506134b082613f1f565b604082019050919050565b60006134c86014836138ea565b91506134d382613f6e565b602082019050919050565b6134e781613a85565b82525050565b6134f681613a85565b82525050565b60006135088286613221565b91506135148285613221565b91506135208284613252565b9150819050949350505050565b60006135388261342f565b9150819050919050565b60006020820190506135576000830184613133565b92915050565b60006080820190506135726000830187613133565b61357f6020830186613133565b61358c60408301856134ed565b818103606083015261359e81846131af565b905095945050505050565b600060208201905081810360008301526135c38184613142565b905092915050565b60006020820190506135e060008301846131a0565b92915050565b6000602082019050818103600083015261360081846131e8565b905092915050565b60006020820190508181036000830152613621816132d1565b9050919050565b60006020820190508181036000830152613641816132f4565b9050919050565b6000602082019050818103600083015261366181613317565b9050919050565b600060208201905081810360008301526136818161333a565b9050919050565b600060208201905081810360008301526136a18161335d565b9050919050565b600060208201905081810360008301526136c181613380565b9050919050565b600060208201905081810360008301526136e1816133a3565b9050919050565b60006020820190508181036000830152613701816133c6565b9050919050565b60006020820190508181036000830152613721816133e9565b9050919050565b600060208201905081810360008301526137418161340c565b9050919050565b6000602082019050818103600083015261376181613452565b9050919050565b6000602082019050818103600083015261378181613475565b9050919050565b600060208201905081810360008301526137a181613498565b9050919050565b600060208201905081810360008301526137c1816134bb565b9050919050565b60006020820190506137dd60008301846134ed565b92915050565b60006137ed6137fe565b90506137f98282613b03565b919050565b6000604051905090565b600067ffffffffffffffff82111561382357613822613c6a565b5b61382c82613cad565b9050602081019050919050565b600067ffffffffffffffff82111561385457613853613c6a565b5b61385d82613cad565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061391182613a85565b915061391c83613a85565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561395157613950613bae565b5b828201905092915050565b600061396782613a85565b915061397283613a85565b92508261398257613981613bdd565b5b828204905092915050565b600061399882613a85565b91506139a383613a85565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139dc576139db613bae565b5b828202905092915050565b60006139f282613a85565b91506139fd83613a85565b925082821015613a1057613a0f613bae565b5b828203905092915050565b6000613a2682613a65565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613abc578082015181840152602081019050613aa1565b83811115613acb576000848401525b50505050565b60006002820490506001821680613ae957607f821691505b60208210811415613afd57613afc613c0c565b5b50919050565b613b0c82613cad565b810181811067ffffffffffffffff82111715613b2b57613b2a613c6a565b5b80604052505050565b6000613b3f82613a85565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b7257613b71613bae565b5b600182019050919050565b6000613b8882613a85565b9150613b9383613a85565b925082613ba357613ba2613bdd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6d6178204e4654206c696d69742065786365656465642e000000000000000000600082015250565b7f4e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f457863657373206d617820706572207061696420747800000000000000000000600082015250565b7f457863657373206d61782066726565207065722077616c6c657420616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f457863657373206d617820706572206672656520747800000000000000000000600082015250565b7f457863657373206d61782070616964207065722077616c6c657420616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f43616c6c65722063616e277420626520616e6f7468657220636f6e7472616374600082015250565b7f496e76616c69642066756e64732070726f766964656400000000000000000000600082015250565b50565b7f436f6e7472616374206973207061757365642e00000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b7f4d617820737570706c792065786365656465642e000000000000000000000000600082015250565b613fa081613a1b565b8114613fab57600080fd5b50565b613fb781613a2d565b8114613fc257600080fd5b50565b613fce81613a39565b8114613fd957600080fd5b50565b613fe581613a85565b8114613ff057600080fd5b5056fea2646970667358221220d90e2a3a785c0b6b08279735b416579983251ac760e165624b3e1d26a4ae069d64736f6c63430008070033

Deployed Bytecode Sourcemap

63955:4891:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38609:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43622:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45690:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64145:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45150:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64421:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64224:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68338:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68520:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37663:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64053:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46576:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68687:156;;;;;;;;;;;;;:::i;:::-;;46817:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66970:645;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64302:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64504:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67819:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64180:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67959:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64471:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67680:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43411:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64117:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39288:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24719:103;;;;;;;;;;;;;:::i;:::-;;24068:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43791:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64963:1106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45966:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47073:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64377:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68127:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66502:460;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64264:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46345:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66140:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24977:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64343:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38609:615;38694:4;39009:10;38994:25;;:11;:25;;;;:102;;;;39086:10;39071:25;;:11;:25;;;;38994:102;:179;;;;39163:10;39148:25;;:11;:25;;;;38994:179;38974:199;;38609:615;;;:::o;43622:100::-;43676:13;43709:5;43702:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43622:100;:::o;45690:204::-;45758:7;45783:16;45791:7;45783;:16::i;:::-;45778:64;;45808:34;;;;;;;;;;;;;;45778:64;45862:15;:24;45878:7;45862:24;;;;;;;;;;;;;;;;;;;;;45855:31;;45690:204;;;:::o;64145:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45150:474::-;45223:13;45255:27;45274:7;45255:18;:27::i;:::-;45223:61;;45305:5;45299:11;;:2;:11;;;45295:48;;;45319:24;;;;;;;;;;;;;;45295:48;45383:5;45360:28;;:19;:17;:19::i;:::-;:28;;;45356:175;;45408:44;45425:5;45432:19;:17;:19::i;:::-;45408:16;:44::i;:::-;45403:128;;45480:35;;;;;;;;;;;;;;45403:128;45356:175;45570:2;45543:15;:24;45559:7;45543:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45608:7;45604:2;45588:28;;45597:5;45588:28;;;;;;;;;;;;45212:412;45150:474;;:::o;64421:41::-;;;;:::o;64224:33::-;;;;:::o;68338:104::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68424:10:::1;68412:9;:22;;;;;;;;;;;;:::i;:::-;;68338:104:::0;:::o;68520:81::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68587:6:::1;68578;;:15;;;;;;;;;;;;;;;;;;68520:81:::0;:::o;37663:315::-;37716:7;37944:15;:13;:15::i;:::-;37929:12;;37913:13;;:28;:46;37906:53;;37663:315;:::o;64053:55::-;;;;;;;;;;;;;;;;;:::o;46576:170::-;46710:28;46720:4;46726:2;46730:7;46710:9;:28::i;:::-;46576:170;;;:::o;68687:156::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19042:1:::1;19640:7;;:19;;19632:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;19042:1;19773:7;:18;;;;68747:7:::2;68768;:5;:7::i;:::-;68760:21;;68789;68760:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68746:69;;;68832:2;68824:11;;;::::0;::::2;;68737:106;18998:1:::1;19952:7;:22;;;;68687:156::o:0;46817:185::-;46955:39;46972:4;46978:2;46982:7;46955:39;;;;;;;;;;;;:16;:39::i;:::-;46817:185;;;:::o;66970:645::-;67030:16;67057:23;67083:17;67093:6;67083:9;:17::i;:::-;67057:43;;67109:30;67156:15;67142:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67109:63;;67181:22;67206:1;67181:26;;67216:23;67254:325;67279:15;67261;:33;:64;;;;;67316:9;;67298:14;:27;;67261:64;67254:325;;;67338:25;67366:23;67374:14;67366:7;:23::i;:::-;67338:51;;67427:6;67406:27;;:17;:27;;;67402:141;;;67483:14;67450:13;67464:15;67450:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;67514:17;;;;;:::i;:::-;;;;67402:141;67553:16;;;;;:::i;:::-;;;;67327:252;67254:325;;;67594:13;67587:20;;;;;;66970:645;;;:::o;64302:34::-;;;;:::o;64504:27::-;;;;;;;;;;;;;:::o;67819:91::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67894:8:::1;67883;:19;;;;67819:91:::0;:::o;64180:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67959:102::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68042:11:::1;68032:7;:21;;;;;;;;;;;;:::i;:::-;;67959:102:::0;:::o;64471:26::-;;;;;;;;;;;;;:::o;67680:94::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67757:9:::1;67746:8;:20;;;;67680:94:::0;:::o;43411:144::-;43475:7;43518:27;43537:7;43518:18;:27::i;:::-;43495:52;;43411:144;;;:::o;64117:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39288:224::-;39352:7;39393:1;39376:19;;:5;:19;;;39372:60;;;39404:28;;;;;;;;;;;;;;39372:60;34627:13;39450:18;:25;39469:5;39450:25;;;;;;;;;;;;;;;;:54;39443:61;;39288:224;;;:::o;24719:103::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24784:30:::1;24811:1;24784:18;:30::i;:::-;24719:103::o:0;24068:87::-;24114:7;24141:6;;;;;;;;;;;24134:13;;24068:87;:::o;43791:104::-;43847:13;43880:7;43873:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43791:104;:::o;64963:1106::-;65022:15;65040:12;:10;:12::i;:::-;65022:30;;65061:24;65088:20;:32;65109:10;65088:32;;;;;;;;;;;;;;;;65061:59;;65140:6;;;;;;;;;;;65139:7;65131:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;65197:1;65187:7;:11;65179:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;65275:9;;65264:7;65248:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;65240:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;65339:7;65326:20;;:9;:20;;;65318:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;65417:22;;65398:16;:41;65394:582;;;65506:22;;65495:7;65460:20;:32;65481:10;65460:32;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:68;;65452:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;65597:8;;65586:7;:19;;65578:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;65394:582;;;65682:22;;65662:16;:42;65658:318;;65771:18;;65760:7;65725:20;:32;65746:10;65725:32;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;:64;;65717:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;65858:8;;65847:7;:19;;65839:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;65930:9;65922:4;;65912:7;:14;;;;:::i;:::-;:27;;65904:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;65658:318;65394:582;66020:7;65984:20;:32;66005:10;65984:32;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;66034:27;66044:7;66053;66034:9;:27::i;:::-;65011:1058;;64963:1106;:::o;45966:308::-;46077:19;:17;:19::i;:::-;46065:31;;:8;:31;;;46061:61;;;46105:17;;;;;;;;;;;;;;46061:61;46187:8;46135:18;:39;46154:19;:17;:19::i;:::-;46135:39;;;;;;;;;;;;;;;:49;46175:8;46135:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;46247:8;46211:55;;46226:19;:17;:19::i;:::-;46211:55;;;46257:8;46211:55;;;;;;:::i;:::-;;;;;;;;45966:308;;:::o;47073:396::-;47240:28;47250:4;47256:2;47260:7;47240:9;:28::i;:::-;47301:1;47283:2;:14;;;:19;47279:183;;47322:56;47353:4;47359:2;47363:7;47372:5;47322:30;:56::i;:::-;47317:145;;47406:40;;;;;;;;;;;;;;47317:145;47279:183;47073:396;;;;:::o;64377:37::-;;;;:::o;68127:124::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68228:15:::1;68211:14;:32;;;;;;;;;;;;:::i;:::-;;68127:124:::0;:::o;66502:460::-;66576:13;66608:17;66616:8;66608:7;:17::i;:::-;66600:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;66708:5;66696:17;;:8;;;;;;;;;;;:17;;;66692:65;;;66733:14;66726:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66692:65;66767:28;66798:10;:8;:10::i;:::-;66767:41;;66855:1;66830:14;66824:28;:32;:130;;;;;;;;;;;;;;;;;66892:14;66908:19;:8;:17;:19::i;:::-;66929:9;66875:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66824:130;66817:137;;;66502:460;;;;:::o;64264:31::-;;;;:::o;46345:164::-;46442:4;46466:18;:25;46485:5;46466:25;;;;;;;;;;;;;;;:35;46492:8;46466:35;;;;;;;;;;;;;;;;;;;;;;;;;46459:42;;46345:164;;;;:::o;66140:331::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66224:14:::1;66241:13;:11;:13::i;:::-;66224:30;;66285:1;66271:11;:15;66263:24;;;::::0;::::1;;66328:9;;66313:11;66304:6;:20;;;;:::i;:::-;:33;;66296:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;66381:9;66393:1;66381:13;;66376:88;66401:11;66396:1;:16;66376:88;;66430:22;66440:3;66445:6;66430:9;:22::i;:::-;66414:3;;;;;:::i;:::-;;;;66376:88;;;;66215:256;66140:331:::0;;:::o;24977:201::-;24299:12;:10;:12::i;:::-;24288:23;;:7;:5;:7::i;:::-;:23;;;24280:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25086:1:::1;25066:22;;:8;:22;;;;25058:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25142:28;25161:8;25142:18;:28::i;:::-;24977:201:::0;:::o;64343:27::-;;;;:::o;47724:273::-;47781:4;47837:7;47818:15;:13;:15::i;:::-;:26;;:66;;;;;47871:13;;47861:7;:23;47818:66;:152;;;;;47969:1;35397:8;47922:17;:26;47940:7;47922:26;;;;;;;;;;;;:43;:48;47818:152;47798:172;;47724:273;;;:::o;40926:1129::-;40993:7;41013:12;41028:7;41013:22;;41096:4;41077:15;:13;:15::i;:::-;:23;41073:915;;41130:13;;41123:4;:20;41119:869;;;41168:14;41185:17;:23;41203:4;41185:23;;;;;;;;;;;;41168:40;;41301:1;35397:8;41274:6;:23;:28;41270:699;;;41793:113;41810:1;41800:6;:11;41793:113;;;41853:17;:25;41871:6;;;;;;;41853:25;;;;;;;;;;;;41844:34;;41793:113;;;41939:6;41932:13;;;;;;41270:699;41145:843;41119:869;41073:915;42016:31;;;;;;;;;;;;;;40926:1129;;;;:::o;61706:105::-;61766:7;61793:10;61786:17;;61706:105;:::o;22792:98::-;22845:7;22872:10;22865:17;;22792:98;:::o;64843:99::-;64908:7;64933:1;64926:8;;64843:99;:::o;52963:2515::-;53078:27;53108;53127:7;53108:18;:27::i;:::-;53078:57;;53193:4;53152:45;;53168:19;53152:45;;;53148:86;;53206:28;;;;;;;;;;;;;;53148:86;53247:22;53296:4;53273:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;53317:43;53334:4;53340:19;:17;:19::i;:::-;53317:16;:43::i;:::-;53273:87;:147;;;;53401:19;:17;:19::i;:::-;53377:43;;:20;53389:7;53377:11;:20::i;:::-;:43;;;53273:147;53247:174;;53439:17;53434:66;;53465:35;;;;;;;;;;;;;;53434:66;53529:1;53515:16;;:2;:16;;;53511:52;;;53540:23;;;;;;;;;;;;;;53511:52;53576:43;53598:4;53604:2;53608:7;53617:1;53576:21;:43::i;:::-;53692:15;:24;53708:7;53692:24;;;;;;;;;;;;53685:31;;;;;;;;;;;54084:18;:24;54103:4;54084:24;;;;;;;;;;;;;;;;54082:26;;;;;;;;;;;;54153:18;:22;54172:2;54153:22;;;;;;;;;;;;;;;;54151:24;;;;;;;;;;;35679:8;35281:3;54534:15;:41;;54492:21;54510:2;54492:17;:21::i;:::-;:84;:128;54446:17;:26;54464:7;54446:26;;;;;;;;;;;:174;;;;54790:1;35679:8;54740:19;:46;:51;54736:626;;;54812:19;54844:1;54834:7;:11;54812:33;;55001:1;54967:17;:30;54985:11;54967:30;;;;;;;;;;;;:35;54963:384;;;55105:13;;55090:11;:28;55086:242;;55285:19;55252:17;:30;55270:11;55252:30;;;;;;;;;;;:52;;;;55086:242;54963:384;54793:569;54736:626;55409:7;55405:2;55390:27;;55399:4;55390:27;;;;;;;;;;;;55428:42;55449:4;55455:2;55459:7;55468:1;55428:20;:42::i;:::-;53067:2411;;52963:2515;;;:::o;25338:191::-;25412:16;25431:6;;;;;;;;;;;25412:25;;25457:8;25448:6;;:17;;;;;;;;;;;;;;;;;;25512:8;25481:40;;25502:8;25481:40;;;;;;;;;;;;25401:128;25338:191;:::o;48081:104::-;48150:27;48160:2;48164:8;48150:27;;;;;;;;;;;;:9;:27::i;:::-;48081:104;;:::o;59175:716::-;59338:4;59384:2;59359:45;;;59405:19;:17;:19::i;:::-;59426:4;59432:7;59441:5;59359:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59355:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59659:1;59642:6;:13;:18;59638:235;;;59688:40;;;;;;;;;;;;;;59638:235;59831:6;59825:13;59816:6;59812:2;59808:15;59801:38;59355:529;59528:54;;;59518:64;;;:6;:64;;;;59511:71;;;59175:716;;;;;;:::o;64729:106::-;64789:13;64820:7;64813:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64729:106;:::o;20354:723::-;20410:13;20640:1;20631:5;:10;20627:53;;;20658:10;;;;;;;;;;;;;;;;;;;;;20627:53;20690:12;20705:5;20690:20;;20721:14;20746:78;20761:1;20753:4;:9;20746:78;;20779:8;;;;;:::i;:::-;;;;20810:2;20802:10;;;;;:::i;:::-;;;20746:78;;;20834:19;20866:6;20856:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20834:39;;20884:154;20900:1;20891:5;:10;20884:154;;20928:1;20918:11;;;;;:::i;:::-;;;20995:2;20987:5;:10;;;;:::i;:::-;20974:2;:24;;;;:::i;:::-;20961:39;;20944:6;20951;20944:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21024:2;21015:11;;;;;:::i;:::-;;;20884:154;;;21062:6;21048:21;;;;;20354:723;;;;:::o;60539:159::-;;;;;:::o;44711:148::-;44775:14;44836:5;44826:15;;44711:148;;;:::o;61357:158::-;;;;;:::o;48558:2236::-;48681:20;48704:13;;48681:36;;48746:1;48732:16;;:2;:16;;;48728:48;;;48757:19;;;;;;;;;;;;;;48728:48;48803:1;48791:8;:13;48787:44;;;48813:18;;;;;;;;;;;;;;48787:44;48844:61;48874:1;48878:2;48882:12;48896:8;48844:21;:61::i;:::-;49448:1;34764:2;49419:1;:25;;49418:31;49406:8;:44;49380:18;:22;49399:2;49380:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;35544:3;49849:29;49876:1;49864:8;:13;49849:14;:29::i;:::-;:56;;35281:3;49786:15;:41;;49744:21;49762:2;49744:17;:21::i;:::-;:84;:162;49693:17;:31;49711:12;49693:31;;;;;;;;;;;:213;;;;49923:20;49946:12;49923:35;;49973:11;50002:8;49987:12;:23;49973:37;;50049:1;50031:2;:14;;;:19;50027:635;;50071:313;50127:12;50123:2;50102:38;;50119:1;50102:38;;;;;;;;;;;;50168:69;50207:1;50211:2;50215:14;;;;;;50231:5;50168:30;:69::i;:::-;50163:174;;50273:40;;;;;;;;;;;;;;50163:174;50379:3;50364:12;:18;50071:313;;50465:12;50448:13;;:29;50444:43;;50479:8;;;50444:43;50027:635;;;50528:119;50584:14;;;;;;50580:2;50559:40;;50576:1;50559:40;;;;;;;;;;;;50642:3;50627:12;:18;50528:119;;50027:635;50692:12;50676:13;:28;;;;49157:1559;;50726:60;50755:1;50759:2;50763:12;50777:8;50726:20;:60::i;:::-;48670:2124;48558:2236;;;:::o;44946:142::-;45004:14;45065:5;45055:15;;44946:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:179::-;7556:10;7577:46;7619:3;7611:6;7577:46;:::i;:::-;7655:4;7650:3;7646:14;7632:28;;7487:179;;;;:::o;7672:118::-;7759:24;7777:5;7759:24;:::i;:::-;7754:3;7747:37;7672:118;;:::o;7826:732::-;7945:3;7974:54;8022:5;7974:54;:::i;:::-;8044:86;8123:6;8118:3;8044:86;:::i;:::-;8037:93;;8154:56;8204:5;8154:56;:::i;:::-;8233:7;8264:1;8249:284;8274:6;8271:1;8268:13;8249:284;;;8350:6;8344:13;8377:63;8436:3;8421:13;8377:63;:::i;:::-;8370:70;;8463:60;8516:6;8463:60;:::i;:::-;8453:70;;8309:224;8296:1;8293;8289:9;8284:14;;8249:284;;;8253:14;8549:3;8542:10;;7950:608;;;7826:732;;;;:::o;8564:109::-;8645:21;8660:5;8645:21;:::i;:::-;8640:3;8633:34;8564:109;;:::o;8679:360::-;8765:3;8793:38;8825:5;8793:38;:::i;:::-;8847:70;8910:6;8905:3;8847:70;:::i;:::-;8840:77;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:29;9025:6;9003:29;:::i;:::-;8998:3;8994:39;8987:46;;8769:270;8679:360;;;;:::o;9045:364::-;9133:3;9161:39;9194:5;9161:39;:::i;:::-;9216:71;9280:6;9275:3;9216:71;:::i;:::-;9209:78;;9296:52;9341:6;9336:3;9329:4;9322:5;9318:16;9296:52;:::i;:::-;9373:29;9395:6;9373:29;:::i;:::-;9368:3;9364:39;9357:46;;9137:272;9045:364;;;;:::o;9415:377::-;9521:3;9549:39;9582:5;9549:39;:::i;:::-;9604:89;9686:6;9681:3;9604:89;:::i;:::-;9597:96;;9702:52;9747:6;9742:3;9735:4;9728:5;9724:16;9702:52;:::i;:::-;9779:6;9774:3;9770:16;9763:23;;9525:267;9415:377;;;;:::o;9822:845::-;9925:3;9962:5;9956:12;9991:36;10017:9;9991:36;:::i;:::-;10043:89;10125:6;10120:3;10043:89;:::i;:::-;10036:96;;10163:1;10152:9;10148:17;10179:1;10174:137;;;;10325:1;10320:341;;;;10141:520;;10174:137;10258:4;10254:9;10243;10239:25;10234:3;10227:38;10294:6;10289:3;10285:16;10278:23;;10174:137;;10320:341;10387:38;10419:5;10387:38;:::i;:::-;10447:1;10461:154;10475:6;10472:1;10469:13;10461:154;;;10549:7;10543:14;10539:1;10534:3;10530:11;10523:35;10599:1;10590:7;10586:15;10575:26;;10497:4;10494:1;10490:12;10485:17;;10461:154;;;10644:6;10639:3;10635:16;10628:23;;10327:334;;10141:520;;9929:738;;9822:845;;;;:::o;10673:366::-;10815:3;10836:67;10900:2;10895:3;10836:67;:::i;:::-;10829:74;;10912:93;11001:3;10912:93;:::i;:::-;11030:2;11025:3;11021:12;11014:19;;10673:366;;;:::o;11045:::-;11187:3;11208:67;11272:2;11267:3;11208:67;:::i;:::-;11201:74;;11284:93;11373:3;11284:93;:::i;:::-;11402:2;11397:3;11393:12;11386:19;;11045:366;;;:::o;11417:::-;11559:3;11580:67;11644:2;11639:3;11580:67;:::i;:::-;11573:74;;11656:93;11745:3;11656:93;:::i;:::-;11774:2;11769:3;11765:12;11758:19;;11417:366;;;:::o;11789:::-;11931:3;11952:67;12016:2;12011:3;11952:67;:::i;:::-;11945:74;;12028:93;12117:3;12028:93;:::i;:::-;12146:2;12141:3;12137:12;12130:19;;11789:366;;;:::o;12161:::-;12303:3;12324:67;12388:2;12383:3;12324:67;:::i;:::-;12317:74;;12400:93;12489:3;12400:93;:::i;:::-;12518:2;12513:3;12509:12;12502:19;;12161:366;;;:::o;12533:::-;12675:3;12696:67;12760:2;12755:3;12696:67;:::i;:::-;12689:74;;12772:93;12861:3;12772:93;:::i;:::-;12890:2;12885:3;12881:12;12874:19;;12533:366;;;:::o;12905:::-;13047:3;13068:67;13132:2;13127:3;13068:67;:::i;:::-;13061:74;;13144:93;13233:3;13144:93;:::i;:::-;13262:2;13257:3;13253:12;13246:19;;12905:366;;;:::o;13277:::-;13419:3;13440:67;13504:2;13499:3;13440:67;:::i;:::-;13433:74;;13516:93;13605:3;13516:93;:::i;:::-;13634:2;13629:3;13625:12;13618:19;;13277:366;;;:::o;13649:::-;13791:3;13812:67;13876:2;13871:3;13812:67;:::i;:::-;13805:74;;13888:93;13977:3;13888:93;:::i;:::-;14006:2;14001:3;13997:12;13990:19;;13649:366;;;:::o;14021:::-;14163:3;14184:67;14248:2;14243:3;14184:67;:::i;:::-;14177:74;;14260:93;14349:3;14260:93;:::i;:::-;14378:2;14373:3;14369:12;14362:19;;14021:366;;;:::o;14393:398::-;14552:3;14573:83;14654:1;14649:3;14573:83;:::i;:::-;14566:90;;14665:93;14754:3;14665:93;:::i;:::-;14783:1;14778:3;14774:11;14767:18;;14393:398;;;:::o;14797:366::-;14939:3;14960:67;15024:2;15019:3;14960:67;:::i;:::-;14953:74;;15036:93;15125:3;15036:93;:::i;:::-;15154:2;15149:3;15145:12;15138:19;;14797:366;;;:::o;15169:::-;15311:3;15332:67;15396:2;15391:3;15332:67;:::i;:::-;15325:74;;15408:93;15497:3;15408:93;:::i;:::-;15526:2;15521:3;15517:12;15510:19;;15169:366;;;:::o;15541:::-;15683:3;15704:67;15768:2;15763:3;15704:67;:::i;:::-;15697:74;;15780:93;15869:3;15780:93;:::i;:::-;15898:2;15893:3;15889:12;15882:19;;15541:366;;;:::o;15913:::-;16055:3;16076:67;16140:2;16135:3;16076:67;:::i;:::-;16069:74;;16152:93;16241:3;16152:93;:::i;:::-;16270:2;16265:3;16261:12;16254:19;;15913:366;;;:::o;16285:108::-;16362:24;16380:5;16362:24;:::i;:::-;16357:3;16350:37;16285:108;;:::o;16399:118::-;16486:24;16504:5;16486:24;:::i;:::-;16481:3;16474:37;16399:118;;:::o;16523:589::-;16748:3;16770:95;16861:3;16852:6;16770:95;:::i;:::-;16763:102;;16882:95;16973:3;16964:6;16882:95;:::i;:::-;16875:102;;16994:92;17082:3;17073:6;16994:92;:::i;:::-;16987:99;;17103:3;17096:10;;16523:589;;;;;;:::o;17118:379::-;17302:3;17324:147;17467:3;17324:147;:::i;:::-;17317:154;;17488:3;17481:10;;17118:379;;;:::o;17503:222::-;17596:4;17634:2;17623:9;17619:18;17611:26;;17647:71;17715:1;17704:9;17700:17;17691:6;17647:71;:::i;:::-;17503:222;;;;:::o;17731:640::-;17926:4;17964:3;17953:9;17949:19;17941:27;;17978:71;18046:1;18035:9;18031:17;18022:6;17978:71;:::i;:::-;18059:72;18127:2;18116:9;18112:18;18103:6;18059:72;:::i;:::-;18141;18209:2;18198:9;18194:18;18185:6;18141:72;:::i;:::-;18260:9;18254:4;18250:20;18245:2;18234:9;18230:18;18223:48;18288:76;18359:4;18350:6;18288:76;:::i;:::-;18280:84;;17731:640;;;;;;;:::o;18377:373::-;18520:4;18558:2;18547:9;18543:18;18535:26;;18607:9;18601:4;18597:20;18593:1;18582:9;18578:17;18571:47;18635:108;18738:4;18729:6;18635:108;:::i;:::-;18627:116;;18377:373;;;;:::o;18756:210::-;18843:4;18881:2;18870:9;18866:18;18858:26;;18894:65;18956:1;18945:9;18941:17;18932:6;18894:65;:::i;:::-;18756:210;;;;:::o;18972:313::-;19085:4;19123:2;19112:9;19108:18;19100:26;;19172:9;19166:4;19162:20;19158:1;19147:9;19143:17;19136:47;19200:78;19273:4;19264:6;19200:78;:::i;:::-;19192:86;;18972:313;;;;:::o;19291:419::-;19457:4;19495:2;19484:9;19480:18;19472:26;;19544:9;19538:4;19534:20;19530:1;19519:9;19515:17;19508:47;19572:131;19698:4;19572:131;:::i;:::-;19564:139;;19291:419;;;:::o;19716:::-;19882:4;19920:2;19909:9;19905:18;19897:26;;19969:9;19963:4;19959:20;19955:1;19944:9;19940:17;19933:47;19997:131;20123:4;19997:131;:::i;:::-;19989:139;;19716:419;;;:::o;20141:::-;20307:4;20345:2;20334:9;20330:18;20322:26;;20394:9;20388:4;20384:20;20380:1;20369:9;20365:17;20358:47;20422:131;20548:4;20422:131;:::i;:::-;20414:139;;20141:419;;;:::o;20566:::-;20732:4;20770:2;20759:9;20755:18;20747:26;;20819:9;20813:4;20809:20;20805:1;20794:9;20790:17;20783:47;20847:131;20973:4;20847:131;:::i;:::-;20839:139;;20566:419;;;:::o;20991:::-;21157:4;21195:2;21184:9;21180:18;21172:26;;21244:9;21238:4;21234:20;21230:1;21219:9;21215:17;21208:47;21272:131;21398:4;21272:131;:::i;:::-;21264:139;;20991:419;;;:::o;21416:::-;21582:4;21620:2;21609:9;21605:18;21597:26;;21669:9;21663:4;21659:20;21655:1;21644:9;21640:17;21633:47;21697:131;21823:4;21697:131;:::i;:::-;21689:139;;21416:419;;;:::o;21841:::-;22007:4;22045:2;22034:9;22030:18;22022:26;;22094:9;22088:4;22084:20;22080:1;22069:9;22065:17;22058:47;22122:131;22248:4;22122:131;:::i;:::-;22114:139;;21841:419;;;:::o;22266:::-;22432:4;22470:2;22459:9;22455:18;22447:26;;22519:9;22513:4;22509:20;22505:1;22494:9;22490:17;22483:47;22547:131;22673:4;22547:131;:::i;:::-;22539:139;;22266:419;;;:::o;22691:::-;22857:4;22895:2;22884:9;22880:18;22872:26;;22944:9;22938:4;22934:20;22930:1;22919:9;22915:17;22908:47;22972:131;23098:4;22972:131;:::i;:::-;22964:139;;22691:419;;;:::o;23116:::-;23282:4;23320:2;23309:9;23305:18;23297:26;;23369:9;23363:4;23359:20;23355:1;23344:9;23340:17;23333:47;23397:131;23523:4;23397:131;:::i;:::-;23389:139;;23116:419;;;:::o;23541:::-;23707:4;23745:2;23734:9;23730:18;23722:26;;23794:9;23788:4;23784:20;23780:1;23769:9;23765:17;23758:47;23822:131;23948:4;23822:131;:::i;:::-;23814:139;;23541:419;;;:::o;23966:::-;24132:4;24170:2;24159:9;24155:18;24147:26;;24219:9;24213:4;24209:20;24205:1;24194:9;24190:17;24183:47;24247:131;24373:4;24247:131;:::i;:::-;24239:139;;23966:419;;;:::o;24391:::-;24557:4;24595:2;24584:9;24580:18;24572:26;;24644:9;24638:4;24634:20;24630:1;24619:9;24615:17;24608:47;24672:131;24798:4;24672:131;:::i;:::-;24664:139;;24391:419;;;:::o;24816:::-;24982:4;25020:2;25009:9;25005:18;24997:26;;25069:9;25063:4;25059:20;25055:1;25044:9;25040:17;25033:47;25097:131;25223:4;25097:131;:::i;:::-;25089:139;;24816:419;;;:::o;25241:222::-;25334:4;25372:2;25361:9;25357:18;25349:26;;25385:71;25453:1;25442:9;25438:17;25429:6;25385:71;:::i;:::-;25241:222;;;;:::o;25469:129::-;25503:6;25530:20;;:::i;:::-;25520:30;;25559:33;25587:4;25579:6;25559:33;:::i;:::-;25469:129;;;:::o;25604:75::-;25637:6;25670:2;25664:9;25654:19;;25604:75;:::o;25685:307::-;25746:4;25836:18;25828:6;25825:30;25822:56;;;25858:18;;:::i;:::-;25822:56;25896:29;25918:6;25896:29;:::i;:::-;25888:37;;25980:4;25974;25970:15;25962:23;;25685:307;;;:::o;25998:308::-;26060:4;26150:18;26142:6;26139:30;26136:56;;;26172:18;;:::i;:::-;26136:56;26210:29;26232:6;26210:29;:::i;:::-;26202:37;;26294:4;26288;26284:15;26276:23;;25998:308;;;:::o;26312:132::-;26379:4;26402:3;26394:11;;26432:4;26427:3;26423:14;26415:22;;26312:132;;;:::o;26450:141::-;26499:4;26522:3;26514:11;;26545:3;26542:1;26535:14;26579:4;26576:1;26566:18;26558:26;;26450:141;;;:::o;26597:114::-;26664:6;26698:5;26692:12;26682:22;;26597:114;;;:::o;26717:98::-;26768:6;26802:5;26796:12;26786:22;;26717:98;;;:::o;26821:99::-;26873:6;26907:5;26901:12;26891:22;;26821:99;;;:::o;26926:113::-;26996:4;27028;27023:3;27019:14;27011:22;;26926:113;;;:::o;27045:184::-;27144:11;27178:6;27173:3;27166:19;27218:4;27213:3;27209:14;27194:29;;27045:184;;;;:::o;27235:168::-;27318:11;27352:6;27347:3;27340:19;27392:4;27387:3;27383:14;27368:29;;27235:168;;;;:::o;27409:147::-;27510:11;27547:3;27532:18;;27409:147;;;;:::o;27562:169::-;27646:11;27680:6;27675:3;27668:19;27720:4;27715:3;27711:14;27696:29;;27562:169;;;;:::o;27737:148::-;27839:11;27876:3;27861:18;;27737:148;;;;:::o;27891:305::-;27931:3;27950:20;27968:1;27950:20;:::i;:::-;27945:25;;27984:20;28002:1;27984:20;:::i;:::-;27979:25;;28138:1;28070:66;28066:74;28063:1;28060:81;28057:107;;;28144:18;;:::i;:::-;28057:107;28188:1;28185;28181:9;28174:16;;27891:305;;;;:::o;28202:185::-;28242:1;28259:20;28277:1;28259:20;:::i;:::-;28254:25;;28293:20;28311:1;28293:20;:::i;:::-;28288:25;;28332:1;28322:35;;28337:18;;:::i;:::-;28322:35;28379:1;28376;28372:9;28367:14;;28202:185;;;;:::o;28393:348::-;28433:7;28456:20;28474:1;28456:20;:::i;:::-;28451:25;;28490:20;28508:1;28490:20;:::i;:::-;28485:25;;28678:1;28610:66;28606:74;28603:1;28600:81;28595:1;28588:9;28581:17;28577:105;28574:131;;;28685:18;;:::i;:::-;28574:131;28733:1;28730;28726:9;28715:20;;28393:348;;;;:::o;28747:191::-;28787:4;28807:20;28825:1;28807:20;:::i;:::-;28802:25;;28841:20;28859:1;28841:20;:::i;:::-;28836:25;;28880:1;28877;28874:8;28871:34;;;28885:18;;:::i;:::-;28871:34;28930:1;28927;28923:9;28915:17;;28747:191;;;;:::o;28944:96::-;28981:7;29010:24;29028:5;29010:24;:::i;:::-;28999:35;;28944:96;;;:::o;29046:90::-;29080:7;29123:5;29116:13;29109:21;29098:32;;29046:90;;;:::o;29142:149::-;29178:7;29218:66;29211:5;29207:78;29196:89;;29142:149;;;:::o;29297:126::-;29334:7;29374:42;29367:5;29363:54;29352:65;;29297:126;;;:::o;29429:77::-;29466:7;29495:5;29484:16;;29429:77;;;:::o;29512:154::-;29596:6;29591:3;29586;29573:30;29658:1;29649:6;29644:3;29640:16;29633:27;29512:154;;;:::o;29672:307::-;29740:1;29750:113;29764:6;29761:1;29758:13;29750:113;;;29849:1;29844:3;29840:11;29834:18;29830:1;29825:3;29821:11;29814:39;29786:2;29783:1;29779:10;29774:15;;29750:113;;;29881:6;29878:1;29875:13;29872:101;;;29961:1;29952:6;29947:3;29943:16;29936:27;29872:101;29721:258;29672:307;;;:::o;29985:320::-;30029:6;30066:1;30060:4;30056:12;30046:22;;30113:1;30107:4;30103:12;30134:18;30124:81;;30190:4;30182:6;30178:17;30168:27;;30124:81;30252:2;30244:6;30241:14;30221:18;30218:38;30215:84;;;30271:18;;:::i;:::-;30215:84;30036:269;29985:320;;;:::o;30311:281::-;30394:27;30416:4;30394:27;:::i;:::-;30386:6;30382:40;30524:6;30512:10;30509:22;30488:18;30476:10;30473:34;30470:62;30467:88;;;30535:18;;:::i;:::-;30467:88;30575:10;30571:2;30564:22;30354:238;30311:281;;:::o;30598:233::-;30637:3;30660:24;30678:5;30660:24;:::i;:::-;30651:33;;30706:66;30699:5;30696:77;30693:103;;;30776:18;;:::i;:::-;30693:103;30823:1;30816:5;30812:13;30805:20;;30598:233;;;:::o;30837:176::-;30869:1;30886:20;30904:1;30886:20;:::i;:::-;30881:25;;30920:20;30938:1;30920:20;:::i;:::-;30915:25;;30959:1;30949:35;;30964:18;;:::i;:::-;30949:35;31005:1;31002;30998:9;30993:14;;30837:176;;;;:::o;31019:180::-;31067:77;31064:1;31057:88;31164:4;31161:1;31154:15;31188:4;31185:1;31178:15;31205:180;31253:77;31250:1;31243:88;31350:4;31347:1;31340:15;31374:4;31371:1;31364:15;31391:180;31439:77;31436:1;31429:88;31536:4;31533:1;31526:15;31560:4;31557:1;31550:15;31577:180;31625:77;31622:1;31615:88;31722:4;31719:1;31712:15;31746:4;31743:1;31736:15;31763:180;31811:77;31808:1;31801:88;31908:4;31905:1;31898:15;31932:4;31929:1;31922:15;31949:117;32058:1;32055;32048:12;32072:117;32181:1;32178;32171:12;32195:117;32304:1;32301;32294:12;32318:117;32427:1;32424;32417:12;32441:102;32482:6;32533:2;32529:7;32524:2;32517:5;32513:14;32509:28;32499:38;;32441:102;;;:::o;32549:173::-;32689:25;32685:1;32677:6;32673:14;32666:49;32549:173;:::o;32728:178::-;32868:30;32864:1;32856:6;32852:14;32845:54;32728:178;:::o;32912:225::-;33052:34;33048:1;33040:6;33036:14;33029:58;33121:8;33116:2;33108:6;33104:15;33097:33;32912:225;:::o;33143:172::-;33283:24;33279:1;33271:6;33267:14;33260:48;33143:172;:::o;33321:221::-;33461:34;33457:1;33449:6;33445:14;33438:58;33530:4;33525:2;33517:6;33513:15;33506:29;33321:221;:::o;33548:172::-;33688:24;33684:1;33676:6;33672:14;33665:48;33548:172;:::o;33726:221::-;33866:34;33862:1;33854:6;33850:14;33843:58;33935:4;33930:2;33922:6;33918:15;33911:29;33726:221;:::o;33953:182::-;34093:34;34089:1;34081:6;34077:14;34070:58;33953:182;:::o;34141:::-;34281:34;34277:1;34269:6;34265:14;34258:58;34141:182;:::o;34329:172::-;34469:24;34465:1;34457:6;34453:14;34446:48;34329:172;:::o;34507:114::-;;:::o;34627:169::-;34767:21;34763:1;34755:6;34751:14;34744:45;34627:169;:::o;34802:181::-;34942:33;34938:1;34930:6;34926:14;34919:57;34802:181;:::o;34989:235::-;35129:34;35125:1;35117:6;35113:14;35106:58;35198:18;35193:2;35185:6;35181:15;35174:43;34989:235;:::o;35230:170::-;35370:22;35366:1;35358:6;35354:14;35347:46;35230:170;:::o;35406:122::-;35479:24;35497:5;35479:24;:::i;:::-;35472:5;35469:35;35459:63;;35518:1;35515;35508:12;35459:63;35406:122;:::o;35534:116::-;35604:21;35619:5;35604:21;:::i;:::-;35597:5;35594:32;35584:60;;35640:1;35637;35630:12;35584:60;35534:116;:::o;35656:120::-;35728:23;35745:5;35728:23;:::i;:::-;35721:5;35718:34;35708:62;;35766:1;35763;35756:12;35708:62;35656:120;:::o;35782:122::-;35855:24;35873:5;35855:24;:::i;:::-;35848:5;35845:35;35835:63;;35894:1;35891;35884:12;35835:63;35782:122;:::o

Swarm Source

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