ETH Price: $2,421.60 (+2.94%)

Token

Floaties (FLOATIES)
 

Overview

Max Total Supply

333 FLOATIES

Holders

1

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
Floaties

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

//SPDX-License-Identifier: Unlicense
// Sources flattened with hardhat v2.10.1 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// 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/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/token/ERC721/[email protected]

// 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/token/ERC721/extensions/[email protected]

// 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/[email protected]

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/utils/[email protected]

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]

// 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 contracts/ERC721A.sol

// Creator: Chiru Labs

pragma solidity ^0.8.4;

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @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 Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    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;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

    // The number of tokens burned.
    uint256 internal _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 _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

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

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

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

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * 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 See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].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 {
        _addressData[owner].aux = aux;
    }

    /**
     * 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)
    {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // 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.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual {}

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

    /**
     * @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.isContract() &&
            !_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 &&
            !_ownerships[tokenId].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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

            if (to.isContract()) {
                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 {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        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 Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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
            IERC721Receiver(to).onERC721Received(
                _msgSender(),
                from,
                tokenId,
                _data
            )
        returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert 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 {}
}

// File @openzeppelin/contracts/access/[email protected]

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File contracts/Floaties.sol

pragma solidity ^0.8.9;

contract Floaties is ERC721A, Ownable {
    string private _baseTokenURI;

    mapping(address => bool) public bannedExchanges;
    mapping(address => bool) public whitelist;

    bool public whitelistIsOpen = false;
    bool public saleIsActive = false;
    bool public whitelistSaleIsActive = false;

    uint256 public maxAmount = 3333;
    uint256 public maxPerMint = 30;
    uint256 public nftPrice = 0.07 ether;

    uint256 public maxWhitelist = 1000;
    uint256 public whitelistLength = 0;

    address private mktWallet = 0xd6544adA9811B74899EB7aAEE742a8B9f552C5Cf;
    address private lowIQWallet = 0xe4446D52e2bdB3E31470643Ab1753a4c2aEee3eA;
    address private devWallet = 0x5f55F579beB3beaD4163604a630731556B52a9f0;
    address private artWallet = 0xa64c09B57d311f0a9240b75f6Ead51f83D1732EA;
    address private copyWallet = 0xB09e818F51E054eB50b570ED476951aB0F974b14;
    address private ideaWallet = 0x9114B6E313A29fd8eCe8Ca8fE7A834024434DA18;

    constructor() ERC721A("Floaties", "FLOATIES") {}

    receive() external payable {}

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

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function flipWhitelistSaleState() public onlyOwner {
        whitelistSaleIsActive = !whitelistSaleIsActive;
    }

    function flipWhitelistOpen() public onlyOwner {
        whitelistIsOpen = !whitelistIsOpen;
    }

    function mintReserveTokens(uint256 numberOfTokens) public onlyOwner {
        _safeMint(msg.sender, numberOfTokens);
        require(totalSupply() <= maxAmount, "Limit reached");
    }

    function mintNFTWhitelist(uint256 numberOfTokens) public payable {
        require(whitelistSaleIsActive, "Whitelist sale is not active");
        require(
            numberOfTokens <= maxPerMint,
            "You can't mint that many at once"
        );
        require(
            nftPrice * numberOfTokens <= msg.value,
            "Ether value incorrect"
        );
        require(whitelist[msg.sender], "Not whitelisted");

        _safeMint(msg.sender, numberOfTokens);

        require(totalSupply() <= maxAmount, "Limit reached");
    }

    function mintNFT(uint256 numberOfTokens) public payable {
        require(saleIsActive, "Sale is not active");
        require(
            numberOfTokens <= maxPerMint,
            "You can't mint that many at once"
        );
        require(
            nftPrice * numberOfTokens <= msg.value,
            "Ether value sent is not correct"
        );

        _safeMint(msg.sender, numberOfTokens);

        require(totalSupply() <= maxAmount, "Limit reached");
    }

    function withdrawMoney() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function withdrawAll() public onlyOwner {
        uint256 dev = (address(this).balance * 1575) / 10000;
        uint256 art = (address(this).balance * 1575) / 10000;
        uint256 copy = (address(this).balance * 1575) / 10000;
        uint256 idea = (address(this).balance * 1575) / 10000;
        uint256 lowiq = (address(this).balance * 900) / 10000;
        uint256 mkt = (address(this).balance * 1800) / 10000;

        require(payable(devWallet).send(dev));
        require(payable(artWallet).send(art));
        require(payable(copyWallet).send(copy));
        require(payable(mktWallet).send(mkt));
        require(payable(ideaWallet).send(idea));
        require(payable(lowIQWallet).send(lowiq));
    }

    function addBannedExchange(address account) external onlyOwner {
        bannedExchanges[account] = true;
    }

    function removeBannedExchange(address account) external onlyOwner {
        bannedExchanges[account] = false;
    }

    function setWhitelistLimit(uint256 newMax) external onlyOwner {
        maxWhitelist = newMax;
    }

    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }
        require(!bannedExchanges[to], "This exchange is not allowed.");

        _approve(to, tokenId, owner);
    }

    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(!bannedExchanges[operator], "This exchange is not allowed.");

        if (operator == _msgSender()) revert ApproveToCaller();

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

    function addToWhitelist(address wallet) external onlyOwner {
        whitelistLength++;
        whitelist[wallet] = true;
    }

    function addSelfToWhitelist() external {
        require(whitelistIsOpen, "Whitelist not open");
        require(whitelistLength < maxWhitelist, "Whitelist is full");
        require(!whitelist[msg.sender], "You are already on the whitelist.");
        whitelistLength++;
        whitelist[msg.sender] = true;
    }

    function removeFromWhitelist(address wallet) external onlyOwner {
        require(whitelistLength > 0, "Whitelist is empty");
        whitelistLength--;
        whitelist[wallet] = false;
    }
}

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":[{"internalType":"address","name":"account","type":"address"}],"name":"addBannedExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addSelfToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bannedExchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintNFTWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintReserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBannedExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setWhitelistLimit","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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055506000600c60026101000a81548160ff021916908315150217905550610d05600d55601e600e5566f8b0a10e470000600f556103e8601055600060115573d6544ada9811b74899eb7aaee742a8b9f552c5cf601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e4446d52e2bdb3e31470643ab1753a4c2aeee3ea601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735f55f579beb3bead4163604a630731556b52a9f0601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073a64c09b57d311f0a9240b75f6ead51f83d1732ea601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b09e818f51e054eb50b570ed476951ab0f974b14601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739114b6e313a29fd8ece8ca8fe7a834024434da18601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200028157600080fd5b506040518060400160405280600881526020017f466c6f61746965730000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f464c4f415449455300000000000000000000000000000000000000000000000081525081600290805190602001906200030692919062000431565b5080600390805190602001906200031f92919062000431565b50620003306200035e60201b60201c565b6000819055505050620003586200034c6200036360201b60201c565b6200036b60201b60201c565b62000546565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200043f9062000510565b90600052602060002090601f016020900481019282620004635760008555620004af565b82601f106200047e57805160ff1916838001178555620004af565b82800160010185558215620004af579182015b82811115620004ae57825182559160200191906001019062000491565b5b509050620004be9190620004c2565b5090565b5b80821115620004dd576000816000905550600101620004c3565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200052957607f821691505b6020821081141562000540576200053f620004e1565b5b50919050565b6141c080620005566000396000f3fe6080604052600436106102555760003560e01c8063853828b611610139578063bf0d96c3116100b6578063da7eacb91161007a578063da7eacb91461082d578063e2e7bfb114610858578063e43252d714610881578063e985e9c5146108aa578063eb8d2444146108e7578063f2fde38b146109125761025c565b8063bf0d96c31461075c578063c534b74c14610787578063c87b56dd146107b0578063d1beca64146107ed578063d2521ae8146108045761025c565b80639b19251a116100fd5780639b19251a14610679578063a22cb465146106b6578063ac446002146106df578063b5c1847d146106f6578063b88d4fde146107335761025c565b8063853828b6146105c75780638ab1d681146105de5780638da5cb5b14610607578063926427441461063257806395d89b411461064e5761025c565b8063288bd8fd116101d257806355f804b31161019657806355f804b3146104b75780635f48f393146104e05780636352211e1461050b57806370a0823114610548578063715018a61461058557806378bb51641461059c5761025c565b8063288bd8fd1461040757806334918dfd1461043057806342842e0e146104475780634d1c916214610470578063507e094f1461048c5761025c565b80630d39fc81116102195780630d39fc811461034657806310b5454d1461037157806318160ddd1461039c5780631d1468d4146103c757806323b872dd146103de5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630c0e57961461032f5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613168565b61093b565b60405161029591906131b0565b60405180910390f35b3480156102aa57600080fd5b506102b3610a1d565b6040516102c09190613264565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb91906132bc565b610aaf565b6040516102fd919061332a565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613371565b610b2b565b005b34801561033b57600080fd5b50610344610cc3565b005b34801561035257600080fd5b5061035b610cf7565b60405161036891906133c0565b60405180910390f35b34801561037d57600080fd5b50610386610cfd565b60405161039391906131b0565b60405180910390f35b3480156103a857600080fd5b506103b1610d10565b6040516103be91906133c0565b60405180910390f35b3480156103d357600080fd5b506103dc610d27565b005b3480156103ea57600080fd5b50610405600480360381019061040091906133db565b610ebb565b005b34801561041357600080fd5b5061042e600480360381019061042991906132bc565b610ecb565b005b34801561043c57600080fd5b50610445610f2c565b005b34801561045357600080fd5b5061046e600480360381019061046991906133db565b610f60565b005b61048a600480360381019061048591906132bc565b610f80565b005b34801561049857600080fd5b506104a1611149565b6040516104ae91906133c0565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190613493565b61114f565b005b3480156104ec57600080fd5b506104f561116d565b60405161050291906133c0565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d91906132bc565b611173565b60405161053f919061332a565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a91906134e0565b611189565b60405161057c91906133c0565b60405180910390f35b34801561059157600080fd5b5061059a611259565b005b3480156105a857600080fd5b506105b161126d565b6040516105be91906133c0565b60405180910390f35b3480156105d357600080fd5b506105dc611273565b005b3480156105ea57600080fd5b50610605600480360381019061060091906134e0565b61157d565b005b34801561061357600080fd5b5061061c61163d565b604051610629919061332a565b60405180910390f35b61064c600480360381019061064791906132bc565b611667565b005b34801561065a57600080fd5b506106636117a4565b6040516106709190613264565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b91906134e0565b611836565b6040516106ad91906131b0565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d89190613539565b611856565b005b3480156106eb57600080fd5b506106f4611a5b565b005b34801561070257600080fd5b5061071d600480360381019061071891906134e0565b611aac565b60405161072a91906131b0565b60405180910390f35b34801561073f57600080fd5b5061075a600480360381019061075591906136a9565b611acc565b005b34801561076857600080fd5b50610771611b48565b60405161077e91906133c0565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a991906134e0565b611b4e565b005b3480156107bc57600080fd5b506107d760048036038101906107d291906132bc565b611bb1565b6040516107e49190613264565b60405180910390f35b3480156107f957600080fd5b50610802611c50565b005b34801561081057600080fd5b5061082b600480360381019061082691906132bc565b611c84565b005b34801561083957600080fd5b50610842611c96565b60405161084f91906131b0565b60405180910390f35b34801561086457600080fd5b5061087f600480360381019061087a91906134e0565b611ca9565b005b34801561088d57600080fd5b506108a860048036038101906108a391906134e0565b611d0c565b005b3480156108b657600080fd5b506108d160048036038101906108cc919061372c565b611d87565b6040516108de91906131b0565b60405180910390f35b3480156108f357600080fd5b506108fc611e1b565b60405161090991906131b0565b60405180910390f35b34801561091e57600080fd5b50610939600480360381019061093491906134e0565b611e2e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a165750610a1582611eb2565b5b9050919050565b606060028054610a2c9061379b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a589061379b565b8015610aa55780601f10610a7a57610100808354040283529160200191610aa5565b820191906000526020600020905b815481529060010190602001808311610a8857829003601f168201915b5050505050905090565b6000610aba82611f1c565b610af0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3682611173565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbd611f6a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bef5750610bed81610be8611f6a565b611d87565b155b15610c26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613819565b60405180910390fd5b610cbe838383611f72565b505050565b610ccb612024565b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b600f5481565b600c60029054906101000a900460ff1681565b6000610d1a6120a2565b6001546000540303905090565b600c60009054906101000a900460ff16610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90613885565b60405180910390fd5b60105460115410610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db3906138f1565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090613983565b60405180910390fd5b60116000815480929190610e5c906139d2565b91905055506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b610ec68383836120a7565b505050565b610ed3612024565b610edd338261255d565b600d54610ee8610d10565b1115610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090613a67565b60405180910390fd5b50565b610f34612024565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b610f7b83838360405180602001604052806000815250611acc565b505050565b600c60029054906101000a900460ff16610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc690613ad3565b60405180910390fd5b600e54811115611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90613b3f565b60405180910390fd5b3481600f546110239190613b5f565b1115611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90613c05565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e790613c71565b60405180910390fd5b6110fa338261255d565b600d54611105610d10565b1115611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90613a67565b60405180910390fd5b50565b600e5481565b611157612024565b818160099190611168929190613016565b505050565b600d5481565b600061117e8261257b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611261612024565b61126b600061280a565b565b60115481565b61127b612024565b60006127106106274761128e9190613b5f565b6112989190613cc0565b90506000612710610627476112ad9190613b5f565b6112b79190613cc0565b90506000612710610627476112cc9190613b5f565b6112d69190613cc0565b90506000612710610627476112eb9190613b5f565b6112f59190613cc0565b905060006127106103844761130a9190613b5f565b6113149190613cc0565b90506000612710610708476113299190613b5f565b6113339190613cc0565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f1935050505061139557600080fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050506113f557600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f1935050505061145557600080fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506114b557600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061151557600080fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505061157557600080fd5b505050505050565b611585612024565b6000601154116115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c190613d3d565b60405180910390fd5b601160008154809291906115dd90613d5d565b91905055506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60019054906101000a900460ff166116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90613dd3565b60405180910390fd5b600e548111156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613b3f565b60405180910390fd5b3481600f5461170a9190613b5f565b111561174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290613e3f565b60405180910390fd5b611755338261255d565b600d54611760610d10565b11156117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890613a67565b60405180910390fd5b50565b6060600380546117b39061379b565b80601f01602080910402602001604051908101604052809291908181526020018280546117df9061379b565b801561182c5780601f106118015761010080835404028352916020019161182c565b820191906000526020600020905b81548152906001019060200180831161180f57829003601f168201915b5050505050905090565b600b6020528060005260406000206000915054906101000a900460ff1681565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90613819565b60405180910390fd5b6118eb611f6a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611950576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061195d611f6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a0a611f6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a4f91906131b0565b60405180910390a35050565b611a63612024565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611aa9573d6000803e3d6000fd5b50565b600a6020528060005260406000206000915054906101000a900460ff1681565b611ad78484846120a7565b611af68373ffffffffffffffffffffffffffffffffffffffff166128d0565b8015611b0b5750611b09848484846128f3565b155b15611b42576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60105481565b611b56612024565b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060611bbc82611f1c565b611bf2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bfc612a53565b9050600081511415611c1d5760405180602001604052806000815250611c48565b80611c2784612ae5565b604051602001611c38929190613e9b565b6040516020818303038152906040525b915050919050565b611c58612024565b600c60029054906101000a900460ff1615600c60026101000a81548160ff021916908315150217905550565b611c8c612024565b8060108190555050565b600c60009054906101000a900460ff1681565b611cb1612024565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611d14612024565b60116000815480929190611d27906139d2565b91905055506001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60019054906101000a900460ff1681565b611e36612024565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d90613f31565b60405180910390fd5b611eaf8161280a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f276120a2565b11158015611f36575060005482105b8015611f63575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61202c611f6a565b73ffffffffffffffffffffffffffffffffffffffff1661204a61163d565b73ffffffffffffffffffffffffffffffffffffffff16146120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209790613f9d565b60405180910390fd5b565b600090565b60006120b28261257b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461211d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661213e611f6a565b73ffffffffffffffffffffffffffffffffffffffff16148061216d575061216c85612167611f6a565b611d87565b5b806121b2575061217b611f6a565b73ffffffffffffffffffffffffffffffffffffffff1661219a84610aaf565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806121eb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612252576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61225f8585856001612c46565b61226b60008487611f72565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124eb5760005482146124ea57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125568585856001612c4c565b5050505050565b612577828260405180602001604052806000815250612c52565b5050565b61258361309c565b6000829050806125916120a2565b111580156125a0575060005481105b156127d3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516127d157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126b5578092505050612805565b5b6001156127d057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127cb578092505050612805565b6126b6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612919611f6a565b8786866040518563ffffffff1660e01b815260040161293b9493929190614012565b602060405180830381600087803b15801561295557600080fd5b505af192505050801561298657506040513d601f19601f820116820180604052508101906129839190614073565b60015b612a00573d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b506000815114156129f8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612a629061379b565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8e9061379b565b8015612adb5780601f10612ab057610100808354040283529160200191612adb565b820191906000526020600020905b815481529060010190602001808311612abe57829003601f168201915b5050505050905090565b60606000821415612b2d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c41565b600082905060005b60008214612b5f578080612b48906139d2565b915050600a82612b589190613cc0565b9150612b35565b60008167ffffffffffffffff811115612b7b57612b7a61357e565b5b6040519080825280601f01601f191660200182016040528015612bad5781602001600182028036833780820191505090505b5090505b60008514612c3a57600182612bc691906140a0565b9150600a85612bd591906140d4565b6030612be19190614105565b60f81b818381518110612bf757612bf661415b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c339190613cc0565b9450612bb1565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612cbf576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612cfa576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d076000858386612c46565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612ec88673ffffffffffffffffffffffffffffffffffffffff166128d0565b15612f8e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f3d60008784806001019550876128f3565b612f73576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612ece578260005414612f8957600080fd5b612ffa565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612f8f575b8160008190555050506130106000858386612c4c565b50505050565b8280546130229061379b565b90600052602060002090601f016020900481019282613044576000855561308b565b82601f1061305d57803560ff191683800117855561308b565b8280016001018555821561308b579182015b8281111561308a57823582559160200191906001019061306f565b5b50905061309891906130df565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156130f85760008160009055506001016130e0565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61314581613110565b811461315057600080fd5b50565b6000813590506131628161313c565b92915050565b60006020828403121561317e5761317d613106565b5b600061318c84828501613153565b91505092915050565b60008115159050919050565b6131aa81613195565b82525050565b60006020820190506131c560008301846131a1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132055780820151818401526020810190506131ea565b83811115613214576000848401525b50505050565b6000601f19601f8301169050919050565b6000613236826131cb565b61324081856131d6565b93506132508185602086016131e7565b6132598161321a565b840191505092915050565b6000602082019050818103600083015261327e818461322b565b905092915050565b6000819050919050565b61329981613286565b81146132a457600080fd5b50565b6000813590506132b681613290565b92915050565b6000602082840312156132d2576132d1613106565b5b60006132e0848285016132a7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613314826132e9565b9050919050565b61332481613309565b82525050565b600060208201905061333f600083018461331b565b92915050565b61334e81613309565b811461335957600080fd5b50565b60008135905061336b81613345565b92915050565b6000806040838503121561338857613387613106565b5b60006133968582860161335c565b92505060206133a7858286016132a7565b9150509250929050565b6133ba81613286565b82525050565b60006020820190506133d560008301846133b1565b92915050565b6000806000606084860312156133f4576133f3613106565b5b60006134028682870161335c565b93505060206134138682870161335c565b9250506040613424868287016132a7565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126134535761345261342e565b5b8235905067ffffffffffffffff8111156134705761346f613433565b5b60208301915083600182028301111561348c5761348b613438565b5b9250929050565b600080602083850312156134aa576134a9613106565b5b600083013567ffffffffffffffff8111156134c8576134c761310b565b5b6134d48582860161343d565b92509250509250929050565b6000602082840312156134f6576134f5613106565b5b60006135048482850161335c565b91505092915050565b61351681613195565b811461352157600080fd5b50565b6000813590506135338161350d565b92915050565b600080604083850312156135505761354f613106565b5b600061355e8582860161335c565b925050602061356f85828601613524565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135b68261321a565b810181811067ffffffffffffffff821117156135d5576135d461357e565b5b80604052505050565b60006135e86130fc565b90506135f482826135ad565b919050565b600067ffffffffffffffff8211156136145761361361357e565b5b61361d8261321a565b9050602081019050919050565b82818337600083830152505050565b600061364c613647846135f9565b6135de565b90508281526020810184848401111561366857613667613579565b5b61367384828561362a565b509392505050565b600082601f8301126136905761368f61342e565b5b81356136a0848260208601613639565b91505092915050565b600080600080608085870312156136c3576136c2613106565b5b60006136d18782880161335c565b94505060206136e28782880161335c565b93505060406136f3878288016132a7565b925050606085013567ffffffffffffffff8111156137145761371361310b565b5b6137208782880161367b565b91505092959194509250565b6000806040838503121561374357613742613106565b5b60006137518582860161335c565b92505060206137628582860161335c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137b357607f821691505b602082108114156137c7576137c661376c565b5b50919050565b7f546869732065786368616e6765206973206e6f7420616c6c6f7765642e000000600082015250565b6000613803601d836131d6565b915061380e826137cd565b602082019050919050565b60006020820190508181036000830152613832816137f6565b9050919050565b7f57686974656c697374206e6f74206f70656e0000000000000000000000000000600082015250565b600061386f6012836131d6565b915061387a82613839565b602082019050919050565b6000602082019050818103600083015261389e81613862565b9050919050565b7f57686974656c6973742069732066756c6c000000000000000000000000000000600082015250565b60006138db6011836131d6565b91506138e6826138a5565b602082019050919050565b6000602082019050818103600083015261390a816138ce565b9050919050565b7f596f752061726520616c7265616479206f6e207468652077686974656c69737460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061396d6021836131d6565b915061397882613911565b604082019050919050565b6000602082019050818103600083015261399c81613960565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139dd82613286565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a1057613a0f6139a3565b5b600182019050919050565b7f4c696d6974207265616368656400000000000000000000000000000000000000600082015250565b6000613a51600d836131d6565b9150613a5c82613a1b565b602082019050919050565b60006020820190508181036000830152613a8081613a44565b9050919050565b7f57686974656c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000613abd601c836131d6565b9150613ac882613a87565b602082019050919050565b60006020820190508181036000830152613aec81613ab0565b9050919050565b7f596f752063616e2774206d696e742074686174206d616e79206174206f6e6365600082015250565b6000613b296020836131d6565b9150613b3482613af3565b602082019050919050565b60006020820190508181036000830152613b5881613b1c565b9050919050565b6000613b6a82613286565b9150613b7583613286565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bae57613bad6139a3565b5b828202905092915050565b7f45746865722076616c756520696e636f72726563740000000000000000000000600082015250565b6000613bef6015836131d6565b9150613bfa82613bb9565b602082019050919050565b60006020820190508181036000830152613c1e81613be2565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000613c5b600f836131d6565b9150613c6682613c25565b602082019050919050565b60006020820190508181036000830152613c8a81613c4e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ccb82613286565b9150613cd683613286565b925082613ce657613ce5613c91565b5b828204905092915050565b7f57686974656c69737420697320656d7074790000000000000000000000000000600082015250565b6000613d276012836131d6565b9150613d3282613cf1565b602082019050919050565b60006020820190508181036000830152613d5681613d1a565b9050919050565b6000613d6882613286565b91506000821415613d7c57613d7b6139a3565b5b600182039050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000613dbd6012836131d6565b9150613dc882613d87565b602082019050919050565b60006020820190508181036000830152613dec81613db0565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000613e29601f836131d6565b9150613e3482613df3565b602082019050919050565b60006020820190508181036000830152613e5881613e1c565b9050919050565b600081905092915050565b6000613e75826131cb565b613e7f8185613e5f565b9350613e8f8185602086016131e7565b80840191505092915050565b6000613ea78285613e6a565b9150613eb38284613e6a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f1b6026836131d6565b9150613f2682613ebf565b604082019050919050565b60006020820190508181036000830152613f4a81613f0e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f876020836131d6565b9150613f9282613f51565b602082019050919050565b60006020820190508181036000830152613fb681613f7a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613fe482613fbd565b613fee8185613fc8565b9350613ffe8185602086016131e7565b6140078161321a565b840191505092915050565b6000608082019050614027600083018761331b565b614034602083018661331b565b61404160408301856133b1565b81810360608301526140538184613fd9565b905095945050505050565b60008151905061406d8161313c565b92915050565b60006020828403121561408957614088613106565b5b60006140978482850161405e565b91505092915050565b60006140ab82613286565b91506140b683613286565b9250828210156140c9576140c86139a3565b5b828203905092915050565b60006140df82613286565b91506140ea83613286565b9250826140fa576140f9613c91565b5b828206905092915050565b600061411082613286565b915061411b83613286565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141505761414f6139a3565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220fd70d441629010afab11a95b0a3c9549e25d443808c025d02559616cf8a3041664736f6c63430008090033

Deployed Bytecode

0x6080604052600436106102555760003560e01c8063853828b611610139578063bf0d96c3116100b6578063da7eacb91161007a578063da7eacb91461082d578063e2e7bfb114610858578063e43252d714610881578063e985e9c5146108aa578063eb8d2444146108e7578063f2fde38b146109125761025c565b8063bf0d96c31461075c578063c534b74c14610787578063c87b56dd146107b0578063d1beca64146107ed578063d2521ae8146108045761025c565b80639b19251a116100fd5780639b19251a14610679578063a22cb465146106b6578063ac446002146106df578063b5c1847d146106f6578063b88d4fde146107335761025c565b8063853828b6146105c75780638ab1d681146105de5780638da5cb5b14610607578063926427441461063257806395d89b411461064e5761025c565b8063288bd8fd116101d257806355f804b31161019657806355f804b3146104b75780635f48f393146104e05780636352211e1461050b57806370a0823114610548578063715018a61461058557806378bb51641461059c5761025c565b8063288bd8fd1461040757806334918dfd1461043057806342842e0e146104475780634d1c916214610470578063507e094f1461048c5761025c565b80630d39fc81116102195780630d39fc811461034657806310b5454d1461037157806318160ddd1461039c5780631d1468d4146103c757806323b872dd146103de5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630c0e57961461032f5761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613168565b61093b565b60405161029591906131b0565b60405180910390f35b3480156102aa57600080fd5b506102b3610a1d565b6040516102c09190613264565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb91906132bc565b610aaf565b6040516102fd919061332a565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613371565b610b2b565b005b34801561033b57600080fd5b50610344610cc3565b005b34801561035257600080fd5b5061035b610cf7565b60405161036891906133c0565b60405180910390f35b34801561037d57600080fd5b50610386610cfd565b60405161039391906131b0565b60405180910390f35b3480156103a857600080fd5b506103b1610d10565b6040516103be91906133c0565b60405180910390f35b3480156103d357600080fd5b506103dc610d27565b005b3480156103ea57600080fd5b50610405600480360381019061040091906133db565b610ebb565b005b34801561041357600080fd5b5061042e600480360381019061042991906132bc565b610ecb565b005b34801561043c57600080fd5b50610445610f2c565b005b34801561045357600080fd5b5061046e600480360381019061046991906133db565b610f60565b005b61048a600480360381019061048591906132bc565b610f80565b005b34801561049857600080fd5b506104a1611149565b6040516104ae91906133c0565b60405180910390f35b3480156104c357600080fd5b506104de60048036038101906104d99190613493565b61114f565b005b3480156104ec57600080fd5b506104f561116d565b60405161050291906133c0565b60405180910390f35b34801561051757600080fd5b50610532600480360381019061052d91906132bc565b611173565b60405161053f919061332a565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a91906134e0565b611189565b60405161057c91906133c0565b60405180910390f35b34801561059157600080fd5b5061059a611259565b005b3480156105a857600080fd5b506105b161126d565b6040516105be91906133c0565b60405180910390f35b3480156105d357600080fd5b506105dc611273565b005b3480156105ea57600080fd5b50610605600480360381019061060091906134e0565b61157d565b005b34801561061357600080fd5b5061061c61163d565b604051610629919061332a565b60405180910390f35b61064c600480360381019061064791906132bc565b611667565b005b34801561065a57600080fd5b506106636117a4565b6040516106709190613264565b60405180910390f35b34801561068557600080fd5b506106a0600480360381019061069b91906134e0565b611836565b6040516106ad91906131b0565b60405180910390f35b3480156106c257600080fd5b506106dd60048036038101906106d89190613539565b611856565b005b3480156106eb57600080fd5b506106f4611a5b565b005b34801561070257600080fd5b5061071d600480360381019061071891906134e0565b611aac565b60405161072a91906131b0565b60405180910390f35b34801561073f57600080fd5b5061075a600480360381019061075591906136a9565b611acc565b005b34801561076857600080fd5b50610771611b48565b60405161077e91906133c0565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a991906134e0565b611b4e565b005b3480156107bc57600080fd5b506107d760048036038101906107d291906132bc565b611bb1565b6040516107e49190613264565b60405180910390f35b3480156107f957600080fd5b50610802611c50565b005b34801561081057600080fd5b5061082b600480360381019061082691906132bc565b611c84565b005b34801561083957600080fd5b50610842611c96565b60405161084f91906131b0565b60405180910390f35b34801561086457600080fd5b5061087f600480360381019061087a91906134e0565b611ca9565b005b34801561088d57600080fd5b506108a860048036038101906108a391906134e0565b611d0c565b005b3480156108b657600080fd5b506108d160048036038101906108cc919061372c565b611d87565b6040516108de91906131b0565b60405180910390f35b3480156108f357600080fd5b506108fc611e1b565b60405161090991906131b0565b60405180910390f35b34801561091e57600080fd5b50610939600480360381019061093491906134e0565b611e2e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a165750610a1582611eb2565b5b9050919050565b606060028054610a2c9061379b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a589061379b565b8015610aa55780601f10610a7a57610100808354040283529160200191610aa5565b820191906000526020600020905b815481529060010190602001808311610a8857829003601f168201915b5050505050905090565b6000610aba82611f1c565b610af0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3682611173565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b9e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bbd611f6a565b73ffffffffffffffffffffffffffffffffffffffff1614158015610bef5750610bed81610be8611f6a565b611d87565b155b15610c26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caa90613819565b60405180910390fd5b610cbe838383611f72565b505050565b610ccb612024565b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b600f5481565b600c60029054906101000a900460ff1681565b6000610d1a6120a2565b6001546000540303905090565b600c60009054906101000a900460ff16610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d90613885565b60405180910390fd5b60105460115410610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db3906138f1565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090613983565b60405180910390fd5b60116000815480929190610e5c906139d2565b91905055506001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b610ec68383836120a7565b505050565b610ed3612024565b610edd338261255d565b600d54610ee8610d10565b1115610f29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2090613a67565b60405180910390fd5b50565b610f34612024565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b610f7b83838360405180602001604052806000815250611acc565b505050565b600c60029054906101000a900460ff16610fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc690613ad3565b60405180910390fd5b600e54811115611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b90613b3f565b60405180910390fd5b3481600f546110239190613b5f565b1115611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90613c05565b60405180910390fd5b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e790613c71565b60405180910390fd5b6110fa338261255d565b600d54611105610d10565b1115611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90613a67565b60405180910390fd5b50565b600e5481565b611157612024565b818160099190611168929190613016565b505050565b600d5481565b600061117e8261257b565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611261612024565b61126b600061280a565b565b60115481565b61127b612024565b60006127106106274761128e9190613b5f565b6112989190613cc0565b90506000612710610627476112ad9190613b5f565b6112b79190613cc0565b90506000612710610627476112cc9190613b5f565b6112d69190613cc0565b90506000612710610627476112eb9190613b5f565b6112f59190613cc0565b905060006127106103844761130a9190613b5f565b6113149190613cc0565b90506000612710610708476113299190613b5f565b6113339190613cc0565b9050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f1935050505061139557600080fd5b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f193505050506113f557600080fd5b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f1935050505061145557600080fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506114b557600080fd5b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061151557600080fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505061157557600080fd5b505050505050565b611585612024565b6000601154116115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c190613d3d565b60405180910390fd5b601160008154809291906115dd90613d5d565b91905055506000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60019054906101000a900460ff166116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90613dd3565b60405180910390fd5b600e548111156116fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f290613b3f565b60405180910390fd5b3481600f5461170a9190613b5f565b111561174b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174290613e3f565b60405180910390fd5b611755338261255d565b600d54611760610d10565b11156117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890613a67565b60405180910390fd5b50565b6060600380546117b39061379b565b80601f01602080910402602001604051908101604052809291908181526020018280546117df9061379b565b801561182c5780601f106118015761010080835404028352916020019161182c565b820191906000526020600020905b81548152906001019060200180831161180f57829003601f168201915b5050505050905090565b600b6020528060005260406000206000915054906101000a900460ff1681565b600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118da90613819565b60405180910390fd5b6118eb611f6a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611950576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061195d611f6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a0a611f6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a4f91906131b0565b60405180910390a35050565b611a63612024565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611aa9573d6000803e3d6000fd5b50565b600a6020528060005260406000206000915054906101000a900460ff1681565b611ad78484846120a7565b611af68373ffffffffffffffffffffffffffffffffffffffff166128d0565b8015611b0b5750611b09848484846128f3565b155b15611b42576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60105481565b611b56612024565b6001600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060611bbc82611f1c565b611bf2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bfc612a53565b9050600081511415611c1d5760405180602001604052806000815250611c48565b80611c2784612ae5565b604051602001611c38929190613e9b565b6040516020818303038152906040525b915050919050565b611c58612024565b600c60029054906101000a900460ff1615600c60026101000a81548160ff021916908315150217905550565b611c8c612024565b8060108190555050565b600c60009054906101000a900460ff1681565b611cb1612024565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611d14612024565b60116000815480929190611d27906139d2565b91905055506001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60019054906101000a900460ff1681565b611e36612024565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9d90613f31565b60405180910390fd5b611eaf8161280a565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611f276120a2565b11158015611f36575060005482105b8015611f63575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61202c611f6a565b73ffffffffffffffffffffffffffffffffffffffff1661204a61163d565b73ffffffffffffffffffffffffffffffffffffffff16146120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209790613f9d565b60405180910390fd5b565b600090565b60006120b28261257b565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461211d576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661213e611f6a565b73ffffffffffffffffffffffffffffffffffffffff16148061216d575061216c85612167611f6a565b611d87565b5b806121b2575061217b611f6a565b73ffffffffffffffffffffffffffffffffffffffff1661219a84610aaf565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806121eb576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612252576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61225f8585856001612c46565b61226b60008487611f72565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124eb5760005482146124ea57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125568585856001612c4c565b5050505050565b612577828260405180602001604052806000815250612c52565b5050565b61258361309c565b6000829050806125916120a2565b111580156125a0575060005481105b156127d3576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516127d157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146126b5578092505050612805565b5b6001156127d057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127cb578092505050612805565b6126b6565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612919611f6a565b8786866040518563ffffffff1660e01b815260040161293b9493929190614012565b602060405180830381600087803b15801561295557600080fd5b505af192505050801561298657506040513d601f19601f820116820180604052508101906129839190614073565b60015b612a00573d80600081146129b6576040519150601f19603f3d011682016040523d82523d6000602084013e6129bb565b606091505b506000815114156129f8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054612a629061379b565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8e9061379b565b8015612adb5780601f10612ab057610100808354040283529160200191612adb565b820191906000526020600020905b815481529060010190602001808311612abe57829003601f168201915b5050505050905090565b60606000821415612b2d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c41565b600082905060005b60008214612b5f578080612b48906139d2565b915050600a82612b589190613cc0565b9150612b35565b60008167ffffffffffffffff811115612b7b57612b7a61357e565b5b6040519080825280601f01601f191660200182016040528015612bad5781602001600182028036833780820191505090505b5090505b60008514612c3a57600182612bc691906140a0565b9150600a85612bd591906140d4565b6030612be19190614105565b60f81b818381518110612bf757612bf661415b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c339190613cc0565b9450612bb1565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612cbf576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612cfa576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d076000858386612c46565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612ec88673ffffffffffffffffffffffffffffffffffffffff166128d0565b15612f8e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f3d60008784806001019550876128f3565b612f73576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612ece578260005414612f8957600080fd5b612ffa565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612f8f575b8160008190555050506130106000858386612c4c565b50505050565b8280546130229061379b565b90600052602060002090601f016020900481019282613044576000855561308b565b82601f1061305d57803560ff191683800117855561308b565b8280016001018555821561308b579182015b8281111561308a57823582559160200191906001019061306f565b5b50905061309891906130df565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156130f85760008160009055506001016130e0565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61314581613110565b811461315057600080fd5b50565b6000813590506131628161313c565b92915050565b60006020828403121561317e5761317d613106565b5b600061318c84828501613153565b91505092915050565b60008115159050919050565b6131aa81613195565b82525050565b60006020820190506131c560008301846131a1565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132055780820151818401526020810190506131ea565b83811115613214576000848401525b50505050565b6000601f19601f8301169050919050565b6000613236826131cb565b61324081856131d6565b93506132508185602086016131e7565b6132598161321a565b840191505092915050565b6000602082019050818103600083015261327e818461322b565b905092915050565b6000819050919050565b61329981613286565b81146132a457600080fd5b50565b6000813590506132b681613290565b92915050565b6000602082840312156132d2576132d1613106565b5b60006132e0848285016132a7565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613314826132e9565b9050919050565b61332481613309565b82525050565b600060208201905061333f600083018461331b565b92915050565b61334e81613309565b811461335957600080fd5b50565b60008135905061336b81613345565b92915050565b6000806040838503121561338857613387613106565b5b60006133968582860161335c565b92505060206133a7858286016132a7565b9150509250929050565b6133ba81613286565b82525050565b60006020820190506133d560008301846133b1565b92915050565b6000806000606084860312156133f4576133f3613106565b5b60006134028682870161335c565b93505060206134138682870161335c565b9250506040613424868287016132a7565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126134535761345261342e565b5b8235905067ffffffffffffffff8111156134705761346f613433565b5b60208301915083600182028301111561348c5761348b613438565b5b9250929050565b600080602083850312156134aa576134a9613106565b5b600083013567ffffffffffffffff8111156134c8576134c761310b565b5b6134d48582860161343d565b92509250509250929050565b6000602082840312156134f6576134f5613106565b5b60006135048482850161335c565b91505092915050565b61351681613195565b811461352157600080fd5b50565b6000813590506135338161350d565b92915050565b600080604083850312156135505761354f613106565b5b600061355e8582860161335c565b925050602061356f85828601613524565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135b68261321a565b810181811067ffffffffffffffff821117156135d5576135d461357e565b5b80604052505050565b60006135e86130fc565b90506135f482826135ad565b919050565b600067ffffffffffffffff8211156136145761361361357e565b5b61361d8261321a565b9050602081019050919050565b82818337600083830152505050565b600061364c613647846135f9565b6135de565b90508281526020810184848401111561366857613667613579565b5b61367384828561362a565b509392505050565b600082601f8301126136905761368f61342e565b5b81356136a0848260208601613639565b91505092915050565b600080600080608085870312156136c3576136c2613106565b5b60006136d18782880161335c565b94505060206136e28782880161335c565b93505060406136f3878288016132a7565b925050606085013567ffffffffffffffff8111156137145761371361310b565b5b6137208782880161367b565b91505092959194509250565b6000806040838503121561374357613742613106565b5b60006137518582860161335c565b92505060206137628582860161335c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806137b357607f821691505b602082108114156137c7576137c661376c565b5b50919050565b7f546869732065786368616e6765206973206e6f7420616c6c6f7765642e000000600082015250565b6000613803601d836131d6565b915061380e826137cd565b602082019050919050565b60006020820190508181036000830152613832816137f6565b9050919050565b7f57686974656c697374206e6f74206f70656e0000000000000000000000000000600082015250565b600061386f6012836131d6565b915061387a82613839565b602082019050919050565b6000602082019050818103600083015261389e81613862565b9050919050565b7f57686974656c6973742069732066756c6c000000000000000000000000000000600082015250565b60006138db6011836131d6565b91506138e6826138a5565b602082019050919050565b6000602082019050818103600083015261390a816138ce565b9050919050565b7f596f752061726520616c7265616479206f6e207468652077686974656c69737460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b600061396d6021836131d6565b915061397882613911565b604082019050919050565b6000602082019050818103600083015261399c81613960565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139dd82613286565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a1057613a0f6139a3565b5b600182019050919050565b7f4c696d6974207265616368656400000000000000000000000000000000000000600082015250565b6000613a51600d836131d6565b9150613a5c82613a1b565b602082019050919050565b60006020820190508181036000830152613a8081613a44565b9050919050565b7f57686974656c6973742073616c65206973206e6f742061637469766500000000600082015250565b6000613abd601c836131d6565b9150613ac882613a87565b602082019050919050565b60006020820190508181036000830152613aec81613ab0565b9050919050565b7f596f752063616e2774206d696e742074686174206d616e79206174206f6e6365600082015250565b6000613b296020836131d6565b9150613b3482613af3565b602082019050919050565b60006020820190508181036000830152613b5881613b1c565b9050919050565b6000613b6a82613286565b9150613b7583613286565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bae57613bad6139a3565b5b828202905092915050565b7f45746865722076616c756520696e636f72726563740000000000000000000000600082015250565b6000613bef6015836131d6565b9150613bfa82613bb9565b602082019050919050565b60006020820190508181036000830152613c1e81613be2565b9050919050565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b6000613c5b600f836131d6565b9150613c6682613c25565b602082019050919050565b60006020820190508181036000830152613c8a81613c4e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ccb82613286565b9150613cd683613286565b925082613ce657613ce5613c91565b5b828204905092915050565b7f57686974656c69737420697320656d7074790000000000000000000000000000600082015250565b6000613d276012836131d6565b9150613d3282613cf1565b602082019050919050565b60006020820190508181036000830152613d5681613d1a565b9050919050565b6000613d6882613286565b91506000821415613d7c57613d7b6139a3565b5b600182039050919050565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b6000613dbd6012836131d6565b9150613dc882613d87565b602082019050919050565b60006020820190508181036000830152613dec81613db0565b9050919050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b6000613e29601f836131d6565b9150613e3482613df3565b602082019050919050565b60006020820190508181036000830152613e5881613e1c565b9050919050565b600081905092915050565b6000613e75826131cb565b613e7f8185613e5f565b9350613e8f8185602086016131e7565b80840191505092915050565b6000613ea78285613e6a565b9150613eb38284613e6a565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f1b6026836131d6565b9150613f2682613ebf565b604082019050919050565b60006020820190508181036000830152613f4a81613f0e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613f876020836131d6565b9150613f9282613f51565b602082019050919050565b60006020820190508181036000830152613fb681613f7a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613fe482613fbd565b613fee8185613fc8565b9350613ffe8185602086016131e7565b6140078161321a565b840191505092915050565b6000608082019050614027600083018761331b565b614034602083018661331b565b61404160408301856133b1565b81810360608301526140538184613fd9565b905095945050505050565b60008151905061406d8161313c565b92915050565b60006020828403121561408957614088613106565b5b60006140978482850161405e565b91505092915050565b60006140ab82613286565b91506140b683613286565b9250828210156140c9576140c86139a3565b5b828203905092915050565b60006140df82613286565b91506140ea83613286565b9250826140fa576140f9613c91565b5b828206905092915050565b600061411082613286565b915061411b83613286565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141505761414f6139a3565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220fd70d441629010afab11a95b0a3c9549e25d443808c025d02559616cf8a3041664736f6c63430008090033

Deployed Bytecode Sourcemap

47496:5626:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25710:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28905:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30197:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51612:444;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49035:99;;;;;;;;;;;;;:::i;:::-;;47888:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47763:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24959:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52593:321;;;;;;;;;;;;;:::i;:::-;;30966:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49142:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48814:89;;;;;;;;;;;;;:::i;:::-;;31207:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49337:562;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47851:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48700:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47813:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28713:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26129:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46581:103;;;;;;;;;;;;;:::i;:::-;;47974:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50521:727;;;;;;;;;;;;;:::i;:::-;;52922:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45933:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49907:484;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29074:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47632:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52064:383;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50399:114;;;;;;;;;;;;;:::i;:::-;;47578:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31463:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47933:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51256:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29249:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48911:116;;;;;;;;;;;;;:::i;:::-;;51502:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47682:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51377:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52455:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30685:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47724:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46839:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25710:355;25857:4;25914:25;25899:40;;;:11;:40;;;;:105;;;;25971:33;25956:48;;;:11;:48;;;;25899:105;:158;;;;26021:36;26045:11;26021:23;:36::i;:::-;25899:158;25879:178;;25710:355;;;:::o;28905:100::-;28959:13;28992:5;28985:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28905:100;:::o;30197:245::-;30301:7;30331:16;30339:7;30331;:16::i;:::-;30326:64;;30356:34;;;;;;;;;;;;;;30326:64;30410:15;:24;30426:7;30410:24;;;;;;;;;;;;;;;;;;;;;30403:31;;30197:245;;;:::o;51612:444::-;51685:13;51701:24;51717:7;51701:15;:24::i;:::-;51685:40;;51746:5;51740:11;;:2;:11;;;51736:48;;;51760:24;;;;;;;;;;;;;;51736:48;51817:5;51801:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;51827:37;51844:5;51851:12;:10;:12::i;:::-;51827:16;:37::i;:::-;51826:38;51801:63;51797:138;;;51888:35;;;;;;;;;;;;;;51797:138;51954:15;:19;51970:2;51954:19;;;;;;;;;;;;;;;;;;;;;;;;;51953:20;51945:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52020:28;52029:2;52033:7;52042:5;52020:8;:28::i;:::-;51674:382;51612:444;;:::o;49035:99::-;45819:13;:11;:13::i;:::-;49111:15:::1;;;;;;;;;;;49110:16;49092:15;;:34;;;;;;;;;;;;;;;;;;49035:99::o:0;47888:36::-;;;;:::o;47763:41::-;;;;;;;;;;;;;:::o;24959:303::-;25003:7;25228:15;:13;:15::i;:::-;25213:12;;25197:13;;:28;:46;25190:53;;24959:303;:::o;52593:321::-;52651:15;;;;;;;;;;;52643:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;52726:12;;52708:15;;:30;52700:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;52780:9;:21;52790:10;52780:21;;;;;;;;;;;;;;;;;;;;;;;;;52779:22;52771:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52850:15;;:17;;;;;;;;;:::i;:::-;;;;;;52902:4;52878:9;:21;52888:10;52878:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;52593:321::o;30966:170::-;31100:28;31110:4;31116:2;31120:7;31100:9;:28::i;:::-;30966:170;;;:::o;49142:187::-;45819:13;:11;:13::i;:::-;49221:37:::1;49231:10;49243:14;49221:9;:37::i;:::-;49294:9;;49277:13;:11;:13::i;:::-;:26;;49269:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;49142:187:::0;:::o;48814:89::-;45819:13;:11;:13::i;:::-;48883:12:::1;;;;;;;;;;;48882:13;48867:12;;:28;;;;;;;;;;;;;;;;;;48814:89::o:0;31207:185::-;31345:39;31362:4;31368:2;31372:7;31345:39;;;;;;;;;;;;:16;:39::i;:::-;31207:185;;;:::o;49337:562::-;49421:21;;;;;;;;;;;49413:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49526:10;;49508:14;:28;;49486:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49658:9;49640:14;49629:8;;:25;;;;:::i;:::-;:38;;49607:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;49735:9;:21;49745:10;49735:21;;;;;;;;;;;;;;;;;;;;;;;;;49727:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;49789:37;49799:10;49811:14;49789:9;:37::i;:::-;49864:9;;49847:13;:11;:13::i;:::-;:26;;49839:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;49337:562;:::o;47851:30::-;;;;:::o;48700:106::-;45819:13;:11;:13::i;:::-;48791:7:::1;;48775:13;:23;;;;;;;:::i;:::-;;48700:106:::0;;:::o;47813:31::-;;;;:::o;28713:125::-;28777:7;28804:21;28817:7;28804:12;:21::i;:::-;:26;;;28797:33;;28713:125;;;:::o;26129:206::-;26193:7;26234:1;26217:19;;:5;:19;;;26213:60;;;26245:28;;;;;;;;;;;;;;26213:60;26299:12;:19;26312:5;26299:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26291:36;;26284:43;;26129:206;;;:::o;46581:103::-;45819:13;:11;:13::i;:::-;46646:30:::1;46673:1;46646:18;:30::i;:::-;46581:103::o:0;47974:34::-;;;;:::o;50521:727::-;45819:13;:11;:13::i;:::-;50572:11:::1;50619:5;50611:4;50587:21;:28;;;;:::i;:::-;50586:38;;;;:::i;:::-;50572:52;;50635:11;50682:5;50674:4;50650:21;:28;;;;:::i;:::-;50649:38;;;;:::i;:::-;50635:52;;50698:12;50746:5;50738:4;50714:21;:28;;;;:::i;:::-;50713:38;;;;:::i;:::-;50698:53;;50762:12;50810:5;50802:4;50778:21;:28;;;;:::i;:::-;50777:38;;;;:::i;:::-;50762:53;;50826:13;50874:5;50867:3;50843:21;:27;;;;:::i;:::-;50842:37;;;;:::i;:::-;50826:53;;50890:11;50937:5;50929:4;50905:21;:28;;;;:::i;:::-;50904:38;;;;:::i;:::-;50890:52;;50971:9;;;;;;;;;;;50963:23;;:28;50987:3;50963:28;;;;;;;;;;;;;;;;;;;;;;;50955:37;;;::::0;::::1;;51019:9;;;;;;;;;;;51011:23;;:28;51035:3;51011:28;;;;;;;;;;;;;;;;;;;;;;;51003:37;;;::::0;::::1;;51067:10;;;;;;;;;;;51059:24;;:30;51084:4;51059:30;;;;;;;;;;;;;;;;;;;;;;;51051:39;;;::::0;::::1;;51117:9;;;;;;;;;;;51109:23;;:28;51133:3;51109:28;;;;;;;;;;;;;;;;;;;;;;;51101:37;;;::::0;::::1;;51165:10;;;;;;;;;;;51157:24;;:30;51182:4;51157:30;;;;;;;;;;;;;;;;;;;;;;;51149:39;;;::::0;::::1;;51215:11;;;;;;;;;;;51207:25;;:32;51233:5;51207:32;;;;;;;;;;;;;;;;;;;;;;;51199:41;;;::::0;::::1;;50561:687;;;;;;50521:727::o:0;52922:197::-;45819:13;:11;:13::i;:::-;53023:1:::1;53005:15;;:19;52997:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;53058:15;;:17;;;;;;;;;:::i;:::-;;;;;;53106:5;53086:9;:17;53096:6;53086:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;52922:197:::0;:::o;45933:87::-;45979:7;46006:6;;;;;;;;;;;45999:13;;45933:87;:::o;49907:484::-;49982:12;;;;;;;;;;;49974:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;50068:10;;50050:14;:28;;50028:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50200:9;50182:14;50171:8;;:25;;;;:::i;:::-;:38;;50149:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;50281:37;50291:10;50303:14;50281:9;:37::i;:::-;50356:9;;50339:13;:11;:13::i;:::-;:26;;50331:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;49907:484;:::o;29074:104::-;29130:13;29163:7;29156:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29074:104;:::o;47632:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;52064:383::-;52183:15;:25;52199:8;52183:25;;;;;;;;;;;;;;;;;;;;;;;;;52182:26;52174:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52271:12;:10;:12::i;:::-;52259:24;;:8;:24;;;52255:54;;;52292:17;;;;;;;;;;;;;;52255:54;52367:8;52322:18;:32;52341:12;:10;:12::i;:::-;52322:32;;;;;;;;;;;;;;;:42;52355:8;52322:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;52420:8;52391:48;;52406:12;:10;:12::i;:::-;52391:48;;;52430:8;52391:48;;;;;;:::i;:::-;;;;;;;;52064:383;;:::o;50399:114::-;45819:13;:11;:13::i;:::-;50462:10:::1;50454:28;;:51;50483:21;50454:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50399:114::o:0;47578:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;31463:406::-;31630:28;31640:4;31646:2;31650:7;31630:9;:28::i;:::-;31687:15;:2;:13;;;:15::i;:::-;:89;;;;;31720:56;31751:4;31757:2;31761:7;31770:5;31720:30;:56::i;:::-;31719:57;31687:89;31669:193;;;31810:40;;;;;;;;;;;;;;31669:193;31463:406;;;;:::o;47933:34::-;;;;:::o;51256:113::-;45819:13;:11;:13::i;:::-;51357:4:::1;51330:15;:24;51346:7;51330:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;51256:113:::0;:::o;29249:415::-;29367:13;29403:16;29411:7;29403;:16::i;:::-;29398:59;;29428:29;;;;;;;;;;;;;;29398:59;29470:21;29494:10;:8;:10::i;:::-;29470:34;;29560:1;29541:7;29535:21;:26;;:121;;;;;;;;;;;;;;;;;29605:7;29614:18;:7;:16;:18::i;:::-;29588:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29535:121;29515:141;;;29249:415;;;:::o;48911:116::-;45819:13;:11;:13::i;:::-;48998:21:::1;;;;;;;;;;;48997:22;48973:21;;:46;;;;;;;;;;;;;;;;;;48911:116::o:0;51502:102::-;45819:13;:11;:13::i;:::-;51590:6:::1;51575:12;:21;;;;51502:102:::0;:::o;47682:35::-;;;;;;;;;;;;;:::o;51377:117::-;45819:13;:11;:13::i;:::-;51481:5:::1;51454:15;:24;51470:7;51454:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;51377:117:::0;:::o;52455:130::-;45819:13;:11;:13::i;:::-;52525:15:::1;;:17;;;;;;;;;:::i;:::-;;;;;;52573:4;52553:9;:17;52563:6;52553:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;52455:130:::0;:::o;30685:214::-;30827:4;30856:18;:25;30875:5;30856:25;;;;;;;;;;;;;;;:35;30882:8;30856:35;;;;;;;;;;;;;;;;;;;;;;;;;30849:42;;30685:214;;;;:::o;47724:32::-;;;;;;;;;;;;;:::o;46839:238::-;45819:13;:11;:13::i;:::-;46962:1:::1;46942:22;;:8;:22;;;;46920:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;47041:28;47060:8;47041:18;:28::i;:::-;46839:238:::0;:::o;21250:207::-;21380:4;21424:25;21409:40;;;:11;:40;;;;21402:47;;21250:207;;;:::o;32124:213::-;32181:4;32237:7;32218:15;:13;:15::i;:::-;:26;;:66;;;;;32271:13;;32261:7;:23;32218:66;:111;;;;;32302:11;:20;32314:7;32302:20;;;;;;;;;;;:27;;;;;;;;;;;;32301:28;32218:111;32198:131;;32124:213;;;:::o;17636:98::-;17689:7;17716:10;17709:17;;17636:98;:::o;41579:197::-;41722:2;41695:15;:24;41711:7;41695:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41760:7;41756:2;41740:28;;41749:5;41740:28;;;;;;;;;;;;41579:197;;;:::o;46098:132::-;46173:12;:10;:12::i;:::-;46162:23;;:7;:5;:7::i;:::-;:23;;;46154:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46098:132::o;24733:92::-;24789:7;24733:92;:::o;36527:2130::-;36642:35;36680:21;36693:7;36680:12;:21::i;:::-;36642:59;;36740:4;36718:26;;:13;:18;;;:26;;;36714:67;;36753:28;;;;;;;;;;;;;;36714:67;36794:22;36836:4;36820:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;36857:36;36874:4;36880:12;:10;:12::i;:::-;36857:16;:36::i;:::-;36820:73;:126;;;;36934:12;:10;:12::i;:::-;36910:36;;:20;36922:7;36910:11;:20::i;:::-;:36;;;36820:126;36794:153;;36965:17;36960:66;;36991:35;;;;;;;;;;;;;;36960:66;37055:1;37041:16;;:2;:16;;;37037:52;;;37066:23;;;;;;;;;;;;;;37037:52;37102:43;37124:4;37130:2;37134:7;37143:1;37102:21;:43::i;:::-;37210:35;37227:1;37231:7;37240:4;37210:8;:35::i;:::-;37571:1;37541:12;:18;37554:4;37541:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37615:1;37587:12;:16;37600:2;37587:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37633:31;37667:11;:20;37679:7;37667:20;;;;;;;;;;;37633:54;;37718:2;37702:8;:13;;;:18;;;;;;;;;;;;;;;;;;37768:15;37735:8;:23;;;:49;;;;;;;;;;;;;;;;;;38036:19;38068:1;38058:7;:11;38036:33;;38084:31;38118:11;:24;38130:11;38118:24;;;;;;;;;;;38084:58;;38186:1;38161:27;;:8;:13;;;;;;;;;;;;:27;;;38157:384;;;38371:13;;38356:11;:28;38352:174;;38425:4;38409:8;:13;;;:20;;;;;;;;;;;;;;;;;;38478:13;:28;;;38452:8;:23;;;:54;;;;;;;;;;;;;;;;;;38352:174;38157:384;37516:1036;;;38588:7;38584:2;38569:27;;38578:4;38569:27;;;;;;;;;;;;38607:42;38628:4;38634:2;38638:7;38647:1;38607:20;:42::i;:::-;36631:2026;;36527:2130;;;:::o;32421:104::-;32490:27;32500:2;32504:8;32490:27;;;;;;;;;;;;:9;:27::i;:::-;32421:104;;:::o;27510:1141::-;27599:21;;:::i;:::-;27638:12;27653:7;27638:22;;27721:4;27702:15;:13;:15::i;:::-;:23;;:47;;;;;27736:13;;27729:4;:20;27702:47;27698:886;;;27770:31;27804:11;:17;27816:4;27804:17;;;;;;;;;;;27770:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27845:9;:16;;;27840:729;;27916:1;27890:28;;:9;:14;;;:28;;;27886:101;;27954:9;27947:16;;;;;;27886:101;28289:261;28296:4;28289:261;;;28329:6;;;;;;;;28374:11;:17;28386:4;28374:17;;;;;;;;;;;28362:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28448:1;28422:28;;:9;:14;;;:28;;;28418:109;;28490:9;28483:16;;;;;;28418:109;28289:261;;;27840:729;27751:833;27698:886;28612:31;;;;;;;;;;;;;;27510:1141;;;;:::o;47237:191::-;47311:16;47330:6;;;;;;;;;;;47311:25;;47356:8;47347:6;;:17;;;;;;;;;;;;;;;;;;47411:8;47380:40;;47401:8;47380:40;;;;;;;;;;;;47300:128;47237:191;:::o;9166:326::-;9226:4;9483:1;9461:7;:19;;;:23;9454:30;;9166:326;;;:::o;42268:772::-;42431:4;42481:2;42465:36;;;42520:12;:10;:12::i;:::-;42551:4;42574:7;42600:5;42465:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42448:585;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42808:1;42791:6;:13;:18;42787:235;;;42837:40;;;;;;;;;;;;;;42787:235;42980:6;42974:13;42965:6;42961:2;42957:15;42950:38;42448:585;42686:45;;;42676:55;;;:6;:55;;;;42669:62;;;42268:772;;;;;;:::o;48578:114::-;48638:13;48671;48664:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48578:114;:::o;18284:723::-;18340:13;18570:1;18561:5;:10;18557:53;;;18588:10;;;;;;;;;;;;;;;;;;;;;18557:53;18620:12;18635:5;18620:20;;18651:14;18676:78;18691:1;18683:4;:9;18676:78;;18709:8;;;;;:::i;:::-;;;;18740:2;18732:10;;;;;:::i;:::-;;;18676:78;;;18764:19;18796:6;18786:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18764:39;;18814:154;18830:1;18821:5;:10;18814:154;;18858:1;18848:11;;;;;:::i;:::-;;;18925:2;18917:5;:10;;;;:::i;:::-;18904:2;:24;;;;:::i;:::-;18891:39;;18874:6;18881;18874:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18954:2;18945:11;;;;;:::i;:::-;;;18814:154;;;18992:6;18978:21;;;;;18284:723;;;;:::o;43688:159::-;;;;;:::o;44506:158::-;;;;;:::o;32898:1942::-;33021:20;33044:13;;33021:36;;33086:1;33072:16;;:2;:16;;;33068:48;;;33097:19;;;;;;;;;;;;;;33068:48;33143:1;33131:8;:13;33127:44;;;33153:18;;;;;;;;;;;;;;33127:44;33184:61;33214:1;33218:2;33222:12;33236:8;33184:21;:61::i;:::-;33557:8;33522:12;:16;33535:2;33522:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33621:8;33581:12;:16;33594:2;33581:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33680:2;33647:11;:25;33659:12;33647:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33747:15;33697:11;:25;33709:12;33697:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33780:20;33803:12;33780:35;;33830:11;33859:8;33844:12;:23;33830:37;;33888:15;:2;:13;;;:15::i;:::-;33884:824;;;33924:505;33980:12;33976:2;33955:38;;33972:1;33955:38;;;;;;;;;;;;34047:212;34116:1;34149:2;34182:14;;;;;;34227:5;34047:30;:212::i;:::-;34016:365;;34317:40;;;;;;;;;;;;;;34016:365;34424:3;34408:12;:19;;33924:505;;34510:12;34493:13;;:29;34489:43;;34524:8;;;34489:43;33884:824;;;34573:120;34629:14;;;;;;34625:2;34604:40;;34621:1;34604:40;;;;;;;;;;;;34688:3;34672:12;:19;;34573:120;;33884:824;34738:12;34722:13;:28;;;;33497:1265;;34772:60;34801:1;34805:2;34809:12;34823:8;34772:20;:60::i;:::-;33010:1830;32898:1942;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6298:553;6356:8;6366:6;6416:3;6409:4;6401:6;6397:17;6393:27;6383:122;;6424:79;;:::i;:::-;6383:122;6537:6;6524:20;6514:30;;6567:18;6559:6;6556:30;6553:117;;;6589:79;;:::i;:::-;6553:117;6703:4;6695:6;6691:17;6679:29;;6757:3;6749:4;6741:6;6737:17;6727:8;6723:32;6720:41;6717:128;;;6764:79;;:::i;:::-;6717:128;6298:553;;;;;:::o;6857:529::-;6928:6;6936;6985:2;6973:9;6964:7;6960:23;6956:32;6953:119;;;6991:79;;:::i;:::-;6953:119;7139:1;7128:9;7124:17;7111:31;7169:18;7161:6;7158:30;7155:117;;;7191:79;;:::i;:::-;7155:117;7304:65;7361:7;7352:6;7341:9;7337:22;7304:65;:::i;:::-;7286:83;;;;7082:297;6857:529;;;;;:::o;7392:329::-;7451:6;7500:2;7488:9;7479:7;7475:23;7471:32;7468:119;;;7506:79;;:::i;:::-;7468:119;7626:1;7651:53;7696:7;7687:6;7676:9;7672:22;7651:53;:::i;:::-;7641:63;;7597:117;7392:329;;;;:::o;7727:116::-;7797:21;7812:5;7797:21;:::i;:::-;7790:5;7787:32;7777:60;;7833:1;7830;7823:12;7777:60;7727:116;:::o;7849:133::-;7892:5;7930:6;7917:20;7908:29;;7946:30;7970:5;7946:30;:::i;:::-;7849:133;;;;:::o;7988:468::-;8053:6;8061;8110:2;8098:9;8089:7;8085:23;8081:32;8078:119;;;8116:79;;:::i;:::-;8078:119;8236:1;8261:53;8306:7;8297:6;8286:9;8282:22;8261:53;:::i;:::-;8251:63;;8207:117;8363:2;8389:50;8431:7;8422:6;8411:9;8407:22;8389:50;:::i;:::-;8379:60;;8334:115;7988:468;;;;;:::o;8462:117::-;8571:1;8568;8561:12;8585:180;8633:77;8630:1;8623:88;8730:4;8727:1;8720:15;8754:4;8751:1;8744:15;8771:281;8854:27;8876:4;8854:27;:::i;:::-;8846:6;8842:40;8984:6;8972:10;8969:22;8948:18;8936:10;8933:34;8930:62;8927:88;;;8995:18;;:::i;:::-;8927:88;9035:10;9031:2;9024:22;8814:238;8771:281;;:::o;9058:129::-;9092:6;9119:20;;:::i;:::-;9109:30;;9148:33;9176:4;9168:6;9148:33;:::i;:::-;9058:129;;;:::o;9193:307::-;9254:4;9344:18;9336:6;9333:30;9330:56;;;9366:18;;:::i;:::-;9330:56;9404:29;9426:6;9404:29;:::i;:::-;9396:37;;9488:4;9482;9478:15;9470:23;;9193:307;;;:::o;9506:154::-;9590:6;9585:3;9580;9567:30;9652:1;9643:6;9638:3;9634:16;9627:27;9506:154;;;:::o;9666:410::-;9743:5;9768:65;9784:48;9825:6;9784:48;:::i;:::-;9768:65;:::i;:::-;9759:74;;9856:6;9849:5;9842:21;9894:4;9887:5;9883:16;9932:3;9923:6;9918:3;9914:16;9911:25;9908:112;;;9939:79;;:::i;:::-;9908:112;10029:41;10063:6;10058:3;10053;10029:41;:::i;:::-;9749:327;9666:410;;;;;:::o;10095:338::-;10150:5;10199:3;10192:4;10184:6;10180:17;10176:27;10166:122;;10207:79;;:::i;:::-;10166:122;10324:6;10311:20;10349:78;10423:3;10415:6;10408:4;10400:6;10396:17;10349:78;:::i;:::-;10340:87;;10156:277;10095:338;;;;:::o;10439:943::-;10534:6;10542;10550;10558;10607:3;10595:9;10586:7;10582:23;10578:33;10575:120;;;10614:79;;:::i;:::-;10575:120;10734:1;10759:53;10804:7;10795:6;10784:9;10780:22;10759:53;:::i;:::-;10749:63;;10705:117;10861:2;10887:53;10932:7;10923:6;10912:9;10908:22;10887:53;:::i;:::-;10877:63;;10832:118;10989:2;11015:53;11060:7;11051:6;11040:9;11036:22;11015:53;:::i;:::-;11005:63;;10960:118;11145:2;11134:9;11130:18;11117:32;11176:18;11168:6;11165:30;11162:117;;;11198:79;;:::i;:::-;11162:117;11303:62;11357:7;11348:6;11337:9;11333:22;11303:62;:::i;:::-;11293:72;;11088:287;10439:943;;;;;;;:::o;11388:474::-;11456:6;11464;11513:2;11501:9;11492:7;11488:23;11484:32;11481:119;;;11519:79;;:::i;:::-;11481:119;11639:1;11664:53;11709:7;11700:6;11689:9;11685:22;11664:53;:::i;:::-;11654:63;;11610:117;11766:2;11792:53;11837:7;11828:6;11817:9;11813:22;11792:53;:::i;:::-;11782:63;;11737:118;11388:474;;;;;:::o;11868:180::-;11916:77;11913:1;11906:88;12013:4;12010:1;12003:15;12037:4;12034:1;12027:15;12054:320;12098:6;12135:1;12129:4;12125:12;12115:22;;12182:1;12176:4;12172:12;12203:18;12193:81;;12259:4;12251:6;12247:17;12237:27;;12193:81;12321:2;12313:6;12310:14;12290:18;12287:38;12284:84;;;12340:18;;:::i;:::-;12284:84;12105:269;12054:320;;;:::o;12380:179::-;12520:31;12516:1;12508:6;12504:14;12497:55;12380:179;:::o;12565:366::-;12707:3;12728:67;12792:2;12787:3;12728:67;:::i;:::-;12721:74;;12804:93;12893:3;12804:93;:::i;:::-;12922:2;12917:3;12913:12;12906:19;;12565:366;;;:::o;12937:419::-;13103:4;13141:2;13130:9;13126:18;13118:26;;13190:9;13184:4;13180:20;13176:1;13165:9;13161:17;13154:47;13218:131;13344:4;13218:131;:::i;:::-;13210:139;;12937:419;;;:::o;13362:168::-;13502:20;13498:1;13490:6;13486:14;13479:44;13362:168;:::o;13536:366::-;13678:3;13699:67;13763:2;13758:3;13699:67;:::i;:::-;13692:74;;13775:93;13864:3;13775:93;:::i;:::-;13893:2;13888:3;13884:12;13877:19;;13536:366;;;:::o;13908:419::-;14074:4;14112:2;14101:9;14097:18;14089:26;;14161:9;14155:4;14151:20;14147:1;14136:9;14132:17;14125:47;14189:131;14315:4;14189:131;:::i;:::-;14181:139;;13908:419;;;:::o;14333:167::-;14473:19;14469:1;14461:6;14457:14;14450:43;14333:167;:::o;14506:366::-;14648:3;14669:67;14733:2;14728:3;14669:67;:::i;:::-;14662:74;;14745:93;14834:3;14745:93;:::i;:::-;14863:2;14858:3;14854:12;14847:19;;14506:366;;;:::o;14878:419::-;15044:4;15082:2;15071:9;15067:18;15059:26;;15131:9;15125:4;15121:20;15117:1;15106:9;15102:17;15095:47;15159:131;15285:4;15159:131;:::i;:::-;15151:139;;14878:419;;;:::o;15303:220::-;15443:34;15439:1;15431:6;15427:14;15420:58;15512:3;15507:2;15499:6;15495:15;15488:28;15303:220;:::o;15529:366::-;15671:3;15692:67;15756:2;15751:3;15692:67;:::i;:::-;15685:74;;15768:93;15857:3;15768:93;:::i;:::-;15886:2;15881:3;15877:12;15870:19;;15529:366;;;:::o;15901:419::-;16067:4;16105:2;16094:9;16090:18;16082:26;;16154:9;16148:4;16144:20;16140:1;16129:9;16125:17;16118:47;16182:131;16308:4;16182:131;:::i;:::-;16174:139;;15901:419;;;:::o;16326:180::-;16374:77;16371:1;16364:88;16471:4;16468:1;16461:15;16495:4;16492:1;16485:15;16512:233;16551:3;16574:24;16592:5;16574:24;:::i;:::-;16565:33;;16620:66;16613:5;16610:77;16607:103;;;16690:18;;:::i;:::-;16607:103;16737:1;16730:5;16726:13;16719:20;;16512:233;;;:::o;16751:163::-;16891:15;16887:1;16879:6;16875:14;16868:39;16751:163;:::o;16920:366::-;17062:3;17083:67;17147:2;17142:3;17083:67;:::i;:::-;17076:74;;17159:93;17248:3;17159:93;:::i;:::-;17277:2;17272:3;17268:12;17261:19;;16920:366;;;:::o;17292:419::-;17458:4;17496:2;17485:9;17481:18;17473:26;;17545:9;17539:4;17535:20;17531:1;17520:9;17516:17;17509:47;17573:131;17699:4;17573:131;:::i;:::-;17565:139;;17292:419;;;:::o;17717:178::-;17857:30;17853:1;17845:6;17841:14;17834:54;17717:178;:::o;17901:366::-;18043:3;18064:67;18128:2;18123:3;18064:67;:::i;:::-;18057:74;;18140:93;18229:3;18140:93;:::i;:::-;18258:2;18253:3;18249:12;18242:19;;17901:366;;;:::o;18273:419::-;18439:4;18477:2;18466:9;18462:18;18454:26;;18526:9;18520:4;18516:20;18512:1;18501:9;18497:17;18490:47;18554:131;18680:4;18554:131;:::i;:::-;18546:139;;18273:419;;;:::o;18698:182::-;18838:34;18834:1;18826:6;18822:14;18815:58;18698:182;:::o;18886:366::-;19028:3;19049:67;19113:2;19108:3;19049:67;:::i;:::-;19042:74;;19125:93;19214:3;19125:93;:::i;:::-;19243:2;19238:3;19234:12;19227:19;;18886:366;;;:::o;19258:419::-;19424:4;19462:2;19451:9;19447:18;19439:26;;19511:9;19505:4;19501:20;19497:1;19486:9;19482:17;19475:47;19539:131;19665:4;19539:131;:::i;:::-;19531:139;;19258:419;;;:::o;19683:348::-;19723:7;19746:20;19764:1;19746:20;:::i;:::-;19741:25;;19780:20;19798:1;19780:20;:::i;:::-;19775:25;;19968:1;19900:66;19896:74;19893:1;19890:81;19885:1;19878:9;19871:17;19867:105;19864:131;;;19975:18;;:::i;:::-;19864:131;20023:1;20020;20016:9;20005:20;;19683:348;;;;:::o;20037:171::-;20177:23;20173:1;20165:6;20161:14;20154:47;20037:171;:::o;20214:366::-;20356:3;20377:67;20441:2;20436:3;20377:67;:::i;:::-;20370:74;;20453:93;20542:3;20453:93;:::i;:::-;20571:2;20566:3;20562:12;20555:19;;20214:366;;;:::o;20586:419::-;20752:4;20790:2;20779:9;20775:18;20767:26;;20839:9;20833:4;20829:20;20825:1;20814:9;20810:17;20803:47;20867:131;20993:4;20867:131;:::i;:::-;20859:139;;20586:419;;;:::o;21011:165::-;21151:17;21147:1;21139:6;21135:14;21128:41;21011:165;:::o;21182:366::-;21324:3;21345:67;21409:2;21404:3;21345:67;:::i;:::-;21338:74;;21421:93;21510:3;21421:93;:::i;:::-;21539:2;21534:3;21530:12;21523:19;;21182:366;;;:::o;21554:419::-;21720:4;21758:2;21747:9;21743:18;21735:26;;21807:9;21801:4;21797:20;21793:1;21782:9;21778:17;21771:47;21835:131;21961:4;21835:131;:::i;:::-;21827:139;;21554:419;;;:::o;21979:180::-;22027:77;22024:1;22017:88;22124:4;22121:1;22114:15;22148:4;22145:1;22138:15;22165:185;22205:1;22222:20;22240:1;22222:20;:::i;:::-;22217:25;;22256:20;22274:1;22256:20;:::i;:::-;22251:25;;22295:1;22285:35;;22300:18;;:::i;:::-;22285:35;22342:1;22339;22335:9;22330:14;;22165:185;;;;:::o;22356:168::-;22496:20;22492:1;22484:6;22480:14;22473:44;22356:168;:::o;22530:366::-;22672:3;22693:67;22757:2;22752:3;22693:67;:::i;:::-;22686:74;;22769:93;22858:3;22769:93;:::i;:::-;22887:2;22882:3;22878:12;22871:19;;22530:366;;;:::o;22902:419::-;23068:4;23106:2;23095:9;23091:18;23083:26;;23155:9;23149:4;23145:20;23141:1;23130:9;23126:17;23119:47;23183:131;23309:4;23183:131;:::i;:::-;23175:139;;22902:419;;;:::o;23327:171::-;23366:3;23389:24;23407:5;23389:24;:::i;:::-;23380:33;;23435:4;23428:5;23425:15;23422:41;;;23443:18;;:::i;:::-;23422:41;23490:1;23483:5;23479:13;23472:20;;23327:171;;;:::o;23504:168::-;23644:20;23640:1;23632:6;23628:14;23621:44;23504:168;:::o;23678:366::-;23820:3;23841:67;23905:2;23900:3;23841:67;:::i;:::-;23834:74;;23917:93;24006:3;23917:93;:::i;:::-;24035:2;24030:3;24026:12;24019:19;;23678:366;;;:::o;24050:419::-;24216:4;24254:2;24243:9;24239:18;24231:26;;24303:9;24297:4;24293:20;24289:1;24278:9;24274:17;24267:47;24331:131;24457:4;24331:131;:::i;:::-;24323:139;;24050:419;;;:::o;24475:181::-;24615:33;24611:1;24603:6;24599:14;24592:57;24475:181;:::o;24662:366::-;24804:3;24825:67;24889:2;24884:3;24825:67;:::i;:::-;24818:74;;24901:93;24990:3;24901:93;:::i;:::-;25019:2;25014:3;25010:12;25003:19;;24662:366;;;:::o;25034:419::-;25200:4;25238:2;25227:9;25223:18;25215:26;;25287:9;25281:4;25277:20;25273:1;25262:9;25258:17;25251:47;25315:131;25441:4;25315:131;:::i;:::-;25307:139;;25034:419;;;:::o;25459:148::-;25561:11;25598:3;25583:18;;25459:148;;;;:::o;25613:377::-;25719:3;25747:39;25780:5;25747:39;:::i;:::-;25802:89;25884:6;25879:3;25802:89;:::i;:::-;25795:96;;25900:52;25945:6;25940:3;25933:4;25926:5;25922:16;25900:52;:::i;:::-;25977:6;25972:3;25968:16;25961:23;;25723:267;25613:377;;;;:::o;25996:435::-;26176:3;26198:95;26289:3;26280:6;26198:95;:::i;:::-;26191:102;;26310:95;26401:3;26392:6;26310:95;:::i;:::-;26303:102;;26422:3;26415:10;;25996:435;;;;;:::o;26437:225::-;26577:34;26573:1;26565:6;26561:14;26554:58;26646:8;26641:2;26633:6;26629:15;26622:33;26437:225;:::o;26668:366::-;26810:3;26831:67;26895:2;26890:3;26831:67;:::i;:::-;26824:74;;26907:93;26996:3;26907:93;:::i;:::-;27025:2;27020:3;27016:12;27009:19;;26668:366;;;:::o;27040:419::-;27206:4;27244:2;27233:9;27229:18;27221:26;;27293:9;27287:4;27283:20;27279:1;27268:9;27264:17;27257:47;27321:131;27447:4;27321:131;:::i;:::-;27313:139;;27040:419;;;:::o;27465:182::-;27605:34;27601:1;27593:6;27589:14;27582:58;27465:182;:::o;27653:366::-;27795:3;27816:67;27880:2;27875:3;27816:67;:::i;:::-;27809:74;;27892:93;27981:3;27892:93;:::i;:::-;28010:2;28005:3;28001:12;27994:19;;27653:366;;;:::o;28025:419::-;28191:4;28229:2;28218:9;28214:18;28206:26;;28278:9;28272:4;28268:20;28264:1;28253:9;28249:17;28242:47;28306:131;28432:4;28306:131;:::i;:::-;28298:139;;28025:419;;;:::o;28450:98::-;28501:6;28535:5;28529:12;28519:22;;28450:98;;;:::o;28554:168::-;28637:11;28671:6;28666:3;28659:19;28711:4;28706:3;28702:14;28687:29;;28554:168;;;;:::o;28728:360::-;28814:3;28842:38;28874:5;28842:38;:::i;:::-;28896:70;28959:6;28954:3;28896:70;:::i;:::-;28889:77;;28975:52;29020:6;29015:3;29008:4;29001:5;28997:16;28975:52;:::i;:::-;29052:29;29074:6;29052:29;:::i;:::-;29047:3;29043:39;29036:46;;28818:270;28728:360;;;;:::o;29094:640::-;29289:4;29327:3;29316:9;29312:19;29304:27;;29341:71;29409:1;29398:9;29394:17;29385:6;29341:71;:::i;:::-;29422:72;29490:2;29479:9;29475:18;29466:6;29422:72;:::i;:::-;29504;29572:2;29561:9;29557:18;29548:6;29504:72;:::i;:::-;29623:9;29617:4;29613:20;29608:2;29597:9;29593:18;29586:48;29651:76;29722:4;29713:6;29651:76;:::i;:::-;29643:84;;29094:640;;;;;;;:::o;29740:141::-;29796:5;29827:6;29821:13;29812:22;;29843:32;29869:5;29843:32;:::i;:::-;29740:141;;;;:::o;29887:349::-;29956:6;30005:2;29993:9;29984:7;29980:23;29976:32;29973:119;;;30011:79;;:::i;:::-;29973:119;30131:1;30156:63;30211:7;30202:6;30191:9;30187:22;30156:63;:::i;:::-;30146:73;;30102:127;29887:349;;;;:::o;30242:191::-;30282:4;30302:20;30320:1;30302:20;:::i;:::-;30297:25;;30336:20;30354:1;30336:20;:::i;:::-;30331:25;;30375:1;30372;30369:8;30366:34;;;30380:18;;:::i;:::-;30366:34;30425:1;30422;30418:9;30410:17;;30242:191;;;;:::o;30439:176::-;30471:1;30488:20;30506:1;30488:20;:::i;:::-;30483:25;;30522:20;30540:1;30522:20;:::i;:::-;30517:25;;30561:1;30551:35;;30566:18;;:::i;:::-;30551:35;30607:1;30604;30600:9;30595:14;;30439:176;;;;:::o;30621:305::-;30661:3;30680:20;30698:1;30680:20;:::i;:::-;30675:25;;30714:20;30732:1;30714:20;:::i;:::-;30709:25;;30868:1;30800:66;30796:74;30793:1;30790:81;30787:107;;;30874:18;;:::i;:::-;30787:107;30918:1;30915;30911:9;30904:16;;30621:305;;;;:::o;30932:180::-;30980:77;30977:1;30970:88;31077:4;31074:1;31067:15;31101:4;31098:1;31091:15

Swarm Source

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