ETH Price: $3,299.71 (-3.25%)
Gas: 15 Gwei

Token

Anthills ()
 

Overview

Max Total Supply

4,094 Anthills

Holders

1,371

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
fafage.eth
Balance
60 Anthills
0x7dbee5ff7de7feceb460fd7c53b256862b888888
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:
AntNest

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-29
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/AntNest.sol


pragma solidity ^0.8.0;










interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract ERC721A is Context, ERC165, IERC721A {
    using Address for address;
    using Strings for uint256;

    // 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)) private _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 override 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) if (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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public 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()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_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
    ) private {
        _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 {}
}

error InvalidQueryRange();

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId)
        public
        view
        returns (TokenOwnership memory)
    {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _currentIndex) {
            return ownership;
        }
        ownership = _ownerships[tokenId];
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds)
        external
        view
        returns (TokenOwnership[] memory)
    {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](
                tokenIdsLength
            );
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _currentIndex;
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, _currentIndex)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (
                uint256 i = start;
                i != stop && tokenIdsIdx != tokenIdsMaxLength;
                ++i
            ) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner)
        external
        view
        returns (uint256[] memory)
    {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (
                uint256 i = _startTokenId();
                tokenIdsIdx != tokenIdsLength;
                ++i
            ) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

interface IAuth {
    function verifyA(address _address,string memory _sign) external view returns (bool);
}

contract AntNest is  ERC721AQueryable,Ownable {
    using Strings for uint256;

    bool public active = true;
    bool public open = false;

    uint256 public openTime = 1664625600;
    uint256 public PublicTime = 1664643600;
    string baseURI; 
    string public baseExtension = ".json"; 

    string public NotRevealedUri = "https://cdn.antwars.xyz/meta/mh544853b692ca0061eb0d5526e7c/anthills.json";


    uint256 public constant MAX_SUPPLY = 7777; 
    uint256 public constant FREE_SUPPLY = 4000;   
    uint256 public per_costMint = 5 ; 
    uint256 public freeMint = 2 ; 
    uint256 public price = 0.012 ether; 

    IAuth private Auth;
    address AuthAddress = 0x0d8f9Ca3F884AC5D08928d37A1d8bcAA9fD6eCaD;


    uint256 public freeQuantity; 
    uint256 public costQuantity; 

    mapping(address => uint256) private _freeQuantity;
    mapping(uint256 => string) private _tokenURIs;

    address public OD = 0xE560AEB54B88B58d57D47fb8f3Cb4AF1646c86af;

    event CostLog(address indexed _from,uint256 indexed _amount, uint256 indexed _payment);

    constructor()
        ERC721A("Anthills", "")
    {
        Auth = IAuth(AuthAddress);
        setNotRevealedURI(NotRevealedUri);
    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        if (open == false) {
            return NotRevealedUri;
        }

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

       
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        
        return
            string(abi.encodePacked(base, tokenId.toString(), baseExtension));
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
    
    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        NotRevealedUri = _notRevealedURI;
    }

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

    function setAuth(address _address) external onlyOwner {
        Auth = IAuth(_address);
    }

    function flipOpen() public onlyOwner {
        open = !open;
    }

    function flipActive() public onlyOwner {
        active = !active;
    }

    function costMinting(uint256 _amount) external payable{
        require(active && block.timestamp >= openTime);
        require(_amount <= CostQuantity() && _amount <= per_costMint);
        require(_amount * price <= msg.value,"Not enough ether sent");

        costQuantity += _amount;

        _safeMint(msg.sender, _amount);
        emit CostLog(msg.sender, _amount, msg.value);
    }

    function freeMinting(uint256 _amount, string memory _sign) external {
        require(active);
        require((Auth.verifyA(msg.sender, _sign) == true  && block.timestamp >= openTime) || block.timestamp >= PublicTime,"Don't have permission to mint");
        require(_amount <= FreeQuantity() &&  _amount <= freeMint, "Insufficient quantity");

        _freeQuantity[msg.sender] += _amount;

        require(_freeQuantity[msg.sender] <= freeMint,"Exceeds max free mint");

        freeQuantity += _amount;

        _safeMint(msg.sender, _amount);    
    }

    function getTime() public view returns(uint256){
        return block.timestamp;
    }

    function setOpenTimes(uint256 _openTime) public onlyOwner {
        openTime = _openTime;
    }

    function setPublicTime(uint256 _publicTime) public onlyOwner {
        PublicTime = _publicTime;
    }

    function setFreeMint(uint256 _amount) public onlyOwner {
        freeMint = _amount;
    } 

    function setPrice(uint256 _amount) public onlyOwner {
        price = _amount;
    } 

    function setPerCostMint(uint256 _amount) public onlyOwner {
        per_costMint = _amount;
    }    

    function getFreeQuantity(address _to) public view returns(uint256){
        return _freeQuantity[_to];
    }
 
    function FreeQuantity() public view returns(uint256){
        return FREE_SUPPLY - freeQuantity;
    }

    function CostQuantity() public view returns(uint256){
        return MAX_SUPPLY - FREE_SUPPLY - costQuantity;
    }

    function setOD(address _address) public onlyOwner {
        OD = _address;
    } 

    function withdraw() public onlyOwner {
        (bool success, ) = payable(OD).call{value: address(this).balance}('');
        require(success);
    }

}

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":"InvalidQueryRange","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":"_from","type":"address"},{"indexed":true,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_payment","type":"uint256"}],"name":"CostLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CostQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FreeQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NotRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PublicTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"costMinting","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"costQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_sign","type":"string"}],"name":"freeMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"getFreeQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"per_costMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setOD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_openTime","type":"uint256"}],"name":"setOpenTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPerCostMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicTime","type":"uint256"}],"name":"setPublicTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526001600860146101000a81548160ff0219169083151502179055506000600860156101000a81548160ff0219169083151502179055506363382bc06009556363387210600a556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000979291906200050d565b506040518060800160405280604881526020016200521860489139600d9080519060200190620000c99291906200050d565b506005600e556002600f55662aa1efb94e0000601055730d8f9ca3f884ac5d08928d37a1d8bcaa9fd6ecad601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073e560aeb54b88b58d57d47fb8f3cb4af1646c86af601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200019657600080fd5b506040518060400160405280600881526020017f416e7468696c6c73000000000000000000000000000000000000000000000000815250604051806020016040528060008152508160029080519060200190620001f59291906200050d565b5080600390805190602001906200020e9291906200050d565b506200021f6200035360201b60201c565b6000819055505050620002476200023b6200035860201b60201c565b6200036060201b60201c565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200034d600d8054620002bd9062000617565b80601f0160208091040260200160405190810160405280929190818152602001828054620002eb9062000617565b80156200033c5780601f1062000310576101008083540402835291602001916200033c565b820191906000526020600020905b8154815290600101906020018083116200031e57829003601f168201915b50505050506200042660201b60201c565b620006a5565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004366200045260201b60201c565b80600d90805190602001906200044e9291906200050d565b5050565b620004626200035860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000488620004e360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004d890620005e4565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200051b9062000617565b90600052602060002090601f0160209004810192826200053f57600085556200058b565b82601f106200055a57805160ff19168380011785556200058b565b828001600101855582156200058b579182015b828111156200058a5782518255916020019190600101906200056d565b5b5090506200059a91906200059e565b5090565b5b80821115620005b95760008160009055506001016200059f565b5090565b6000620005cc60208362000606565b9150620005d9826200067c565b602082019050919050565b60006020820190508181036000830152620005ff81620005bd565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200063057607f821691505b602082108114156200064757620006466200064d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614b6380620006b56000396000f3fe6080604052600436106103355760003560e01c806379fa1eab116101ab578063b7b21f67116100f7578063da3ef23f11610095578063eecefa9b1161006f578063eecefa9b14610beb578063f2c4ce1e14610c14578063f2fde38b14610c3d578063fcfff16f14610c6657610335565b8063da3ef23f14610b5a578063dd8a2ff414610b83578063e985e9c514610bae57610335565b8063c6682862116100d1578063c668286214610a9c578063c87b56dd14610ac7578063cbf77bf114610b04578063d82f37bc14610b2f57610335565b8063b7b21f6714610a1a578063b88d4fde14610a36578063c23dc68f14610a5f57610335565b80639858cf1911610164578063a035b1fe1161013e578063a035b1fe14610970578063a22cb4651461099b578063a685e857146109c4578063b4256888146109ef57610335565b80639858cf19146108dd5780639858ea171461090857806399a2557a1461093357610335565b806379fa1eab146107df5780638462151c1461080a5780638da5cb5b1461084757806391b7f5ed1461087257806395d89b411461089b5780639752ecf7146108c657610335565b80633ada8b32116102855780635b70ea9f116102235780636352211e116101fd5780636352211e1461072557806370a082311461076257806370e093691461079f578063715018a6146107c857610335565b80635b70ea9f146106925780635bbb2177146106bd578063626c8f8e146106fa57610335565b8063434580f91161025f578063434580f9146105fc57806352d939e314610627578063557ed1ba1461063e57806355f804b31461066957610335565b80633ada8b32146105935780633ccfd60b146105bc57806342842e0e146105d357610335565b80630e18d2ab116102f257806323b872dd116102cc57806323b872dd146104ed57806328f8e904146105165780632b2e05c11461053f57806332cb6b0c1461056857610335565b80630e18d2ab1461045c578063150c5c261461049957806318160ddd146104c257610335565b806301ffc9a71461033a57806302fb0c5e1461037757806305dae7ac146103a257806306fdde03146103cb578063081812fc146103f6578063095ea7b314610433575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613c33565b610c91565b60405161036e91906142b7565b60405180910390f35b34801561038357600080fd5b5061038c610d73565b60405161039991906142b7565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190613cd6565b610d86565b005b3480156103d757600080fd5b506103e0610d98565b6040516103ed91906142d2565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190613cd6565b610e2a565b60405161042a91906141dc565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190613b2a565b610ea6565b005b34801561046857600080fd5b50610483600480360381019061047e91906139a7565b610fab565b60405161049091906143ef565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613cd6565b610ff4565b005b3480156104ce57600080fd5b506104d7611006565b6040516104e491906143ef565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613a14565b61101d565b005b34801561052257600080fd5b5061053d600480360381019061053891906139a7565b61102d565b005b34801561054b57600080fd5b50610566600480360381019061056191906139a7565b611079565b005b34801561057457600080fd5b5061057d6110c5565b60405161058a91906143ef565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613d03565b6110cb565b005b3480156105c857600080fd5b506105d161134b565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190613a14565b6113ee565b005b34801561060857600080fd5b5061061161140e565b60405161061e91906142d2565b60405180910390f35b34801561063357600080fd5b5061063c61149c565b005b34801561064a57600080fd5b506106536114d0565b60405161066091906143ef565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b9190613c8d565b6114d8565b005b34801561069e57600080fd5b506106a76114fa565b6040516106b491906143ef565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df9190613bbd565b611500565b6040516106f19190614273565b60405180910390f35b34801561070657600080fd5b5061070f6115c1565b60405161071c91906143ef565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190613cd6565b6115c7565b60405161075991906141dc565b60405180910390f35b34801561076e57600080fd5b50610789600480360381019061078491906139a7565b6115dd565b60405161079691906143ef565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613cd6565b6116ad565b005b3480156107d457600080fd5b506107dd6116bf565b005b3480156107eb57600080fd5b506107f46116d3565b60405161080191906141dc565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c91906139a7565b6116f9565b60405161083e9190614295565b60405180910390f35b34801561085357600080fd5b5061085c6118fb565b60405161086991906141dc565b60405180910390f35b34801561087e57600080fd5b5061089960048036038101906108949190613cd6565b611925565b005b3480156108a757600080fd5b506108b0611937565b6040516108bd91906142d2565b60405180910390f35b3480156108d257600080fd5b506108db6119c9565b005b3480156108e957600080fd5b506108f26119fd565b6040516108ff91906143ef565b60405180910390f35b34801561091457600080fd5b5061091d611a03565b60405161092a91906143ef565b60405180910390f35b34801561093f57600080fd5b5061095a60048036038101906109559190613b6a565b611a09565b6040516109679190614295565b60405180910390f35b34801561097c57600080fd5b50610985611cd0565b60405161099291906143ef565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd9190613aea565b611cd6565b005b3480156109d057600080fd5b506109d9611e4e565b6040516109e691906143ef565b60405180910390f35b3480156109fb57600080fd5b50610a04611e72565b604051610a1191906143ef565b60405180910390f35b610a346004803603810190610a2f9190613cd6565b611e78565b005b348015610a4257600080fd5b50610a5d6004803603810190610a589190613a67565b611f7c565b005b348015610a6b57600080fd5b50610a866004803603810190610a819190613cd6565b611ff4565b604051610a9391906143d4565b60405180910390f35b348015610aa857600080fd5b50610ab1612111565b604051610abe91906142d2565b60405180910390f35b348015610ad357600080fd5b50610aee6004803603810190610ae99190613cd6565b61219f565b604051610afb91906142d2565b60405180910390f35b348015610b1057600080fd5b50610b196123c3565b604051610b2691906143ef565b60405180910390f35b348015610b3b57600080fd5b50610b446123c9565b604051610b5191906143ef565b60405180910390f35b348015610b6657600080fd5b50610b816004803603810190610b7c9190613c8d565b6123e0565b005b348015610b8f57600080fd5b50610b98612402565b604051610ba591906143ef565b60405180910390f35b348015610bba57600080fd5b50610bd56004803603810190610bd091906139d4565b612408565b604051610be291906142b7565b60405180910390f35b348015610bf757600080fd5b50610c126004803603810190610c0d9190613cd6565b61249c565b005b348015610c2057600080fd5b50610c3b6004803603810190610c369190613c8d565b6124ae565b005b348015610c4957600080fd5b50610c646004803603810190610c5f91906139a7565b6124d0565b005b348015610c7257600080fd5b50610c7b612554565b604051610c8891906142b7565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d5c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d6c5750610d6b82612567565b5b9050919050565b600860149054906101000a900460ff1681565b610d8e6125d1565b8060098190555050565b606060028054610da790614771565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd390614771565b8015610e205780601f10610df557610100808354040283529160200191610e20565b820191906000526020600020905b815481529060010190602001808311610e0357829003601f168201915b5050505050905090565b6000610e358261264f565b610e6b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610eb1826115c7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f19576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f3861269d565b73ffffffffffffffffffffffffffffffffffffffff1614610f9b57610f6481610f5f61269d565b612408565b610f9a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610fa68383836126a5565b505050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ffc6125d1565b80600a8190555050565b6000611010612757565b6001546000540303905090565b61102883838361275c565b505050565b6110356125d1565b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110816125d1565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e6181565b600860149054906101000a900460ff166110e457600080fd5b60011515601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fcf3eeea33846040518363ffffffff1660e01b8152600401611145929190614243565b60206040518083038186803b15801561115d57600080fd5b505afa158015611171573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111959190613c06565b15151480156111a657506009544210155b806111b35750600a544210155b6111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e990614314565b60405180910390fd5b6111fa6123c9565b821115801561120b5750600f548211155b61124a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611241906143b4565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112999190614592565b92505081905550600f54601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90614374565b60405180910390fd5b81601360008282546113369190614592565b925050819055506113473383612c12565b5050565b6113536125d1565b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161139b906141c7565b60006040518083038185875af1925050503d80600081146113d8576040519150601f19603f3d011682016040523d82523d6000602084013e6113dd565b606091505b50509050806113eb57600080fd5b50565b61140983838360405180602001604052806000815250611f7c565b505050565b600d805461141b90614771565b80601f016020809104026020016040519081016040528092919081815260200182805461144790614771565b80156114945780601f1061146957610100808354040283529160200191611494565b820191906000526020600020905b81548152906001019060200180831161147757829003601f168201915b505050505081565b6114a46125d1565b600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b600042905090565b6114e06125d1565b80600b90805190602001906114f69291906136c5565b5050565b600f5481565b606060008251905060008167ffffffffffffffff8111156115245761152361490a565b5b60405190808252806020026020018201604052801561155d57816020015b61154a61374b565b8152602001906001900390816115425790505b50905060005b8281146115b65761158d8582815181106115805761157f6148db565b5b6020026020010151611ff4565b8282815181106115a05761159f6148db565b5b6020026020010181905250806001019050611563565b508092505050919050565b60135481565b60006115d282612c30565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611645576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116b56125d1565b80600f8190555050565b6116c76125d1565b6116d16000612ebb565b565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000806000611709856115dd565b905060008167ffffffffffffffff8111156117275761172661490a565b5b6040519080825280602002602001820160405280156117555781602001602082028036833780820191505090505b50905061176061374b565b600061176a612757565b90505b8386146118ed57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015115611846576118e2565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461188657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156118e157808387806001019850815181106118d4576118d36148db565b5b6020026020010181815250505b5b80600101905061176d565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61192d6125d1565b8060108190555050565b60606003805461194690614771565b80601f016020809104026020016040519081016040528092919081815260200182805461197290614771565b80156119bf5780601f10611994576101008083540402835291602001916119bf565b820191906000526020600020905b8154815290600101906020018083116119a257829003601f168201915b5050505050905090565b6119d16125d1565b600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b610fa081565b60145481565b6060818310611a44576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000549050611a54612757565b851015611a6657611a63612757565b94505b80841115611a72578093505b6000611a7d876115dd565b905084861015611aa0576000868603905081811015611a9a578091505b50611aa5565b600090505b60008167ffffffffffffffff811115611ac157611ac061490a565b5b604051908082528060200260200182016040528015611aef5781602001602082028036833780820191505090505b5090506000821415611b075780945050505050611cc9565b6000611b1288611ff4565b905060008160400151611b2757816000015190505b60008990505b888114158015611b3d5750848714155b15611cbb57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015115611c1457611cb0565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c5457826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611caf5780848880600101995081518110611ca257611ca16148db565b5b6020026020010181815250505b5b806001019050611b2d565b508583528296505050505050505b9392505050565b60105481565b611cde61269d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d43576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d5061269d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dfd61269d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e4291906142b7565b60405180910390a35050565b6000601454610fa0611e61611e639190614673565b611e6d9190614673565b905090565b60095481565b600860149054906101000a900460ff168015611e9657506009544210155b611e9f57600080fd5b611ea7611e4e565b8111158015611eb85750600e548111155b611ec157600080fd5b3460105482611ed09190614619565b1115611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614394565b60405180910390fd5b8060146000828254611f239190614592565b92505081905550611f343382612c12565b34813373ffffffffffffffffffffffffffffffffffffffff167f9f3488b493b562d1056a2765237072a15ae05e985908667781eddf46305e9bff60405160405180910390a450565b611f8784848461275c565b611fa68373ffffffffffffffffffffffffffffffffffffffff16612f81565b15611fee57611fb784848484612fa4565b611fed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611ffc61374b565b61200461374b565b61200c612757565b83108061201b57506000548310155b15612029578091505061210c565b600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156120ff578091505061210c565b61210883612c30565b9150505b919050565b600c805461211e90614771565b80601f016020809104026020016040519081016040528092919081815260200182805461214a90614771565b80156121975780601f1061216c57610100808354040283529160200191612197565b820191906000526020600020905b81548152906001019060200180831161217a57829003601f168201915b505050505081565b60606121aa8261264f565b6121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090614354565b60405180910390fd5b60001515600860159054906101000a900460ff161515141561229757600d805461221290614771565b80601f016020809104026020016040519081016040528092919081815260200182805461223e90614771565b801561228b5780601f106122605761010080835404028352916020019161228b565b820191906000526020600020905b81548152906001019060200180831161226e57829003601f168201915b505050505090506123be565b60006016600084815260200190815260200160002080546122b790614771565b80601f01602080910402602001604051908101604052809291908181526020018280546122e390614771565b80156123305780601f1061230557610100808354040283529160200191612330565b820191906000526020600020905b81548152906001019060200180831161231357829003601f168201915b505050505090506000612341613104565b90506000815114156123575781925050506123be565b60008251111561238c578082604051602001612374929190614172565b604051602081830303815290604052925050506123be565b8061239685613196565b600c6040516020016123aa93929190614196565b604051602081830303815290604052925050505b919050565b600a5481565b6000601354610fa06123db9190614673565b905090565b6123e86125d1565b80600c90805190602001906123fe9291906136c5565b5050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124a46125d1565b80600e8190555050565b6124b66125d1565b80600d90805190602001906124cc9291906136c5565b5050565b6124d86125d1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f906142f4565b60405180910390fd5b61255181612ebb565b50565b600860159054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125d961269d565b73ffffffffffffffffffffffffffffffffffffffff166125f76118fb565b73ffffffffffffffffffffffffffffffffffffffff161461264d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264490614334565b60405180910390fd5b565b60008161265a612757565b11158015612669575060005482105b8015612696575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061276782612c30565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127d2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127f361269d565b73ffffffffffffffffffffffffffffffffffffffff16148061282257506128218561281c61269d565b612408565b5b80612867575061283061269d565b73ffffffffffffffffffffffffffffffffffffffff1661284f84610e2a565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128a0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612907576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61291485858560016132f7565b612920600084876126a5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ba0576000548214612b9f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c0b85858560016132fd565b5050505050565b612c2c828260405180602001604052806000815250613303565b5050565b612c3861374b565b600082905080612c46612757565b11612e8457600054811015612e83576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e8157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d65578092505050612eb6565b5b600115612e8057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e7b578092505050612eb6565b612d66565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fca61269d565b8786866040518563ffffffff1660e01b8152600401612fec94939291906141f7565b602060405180830381600087803b15801561300657600080fd5b505af192505050801561303757506040513d601f19601f820116820180604052508101906130349190613c60565b60015b6130b1573d8060008114613067576040519150601f19603f3d011682016040523d82523d6000602084013e61306c565b606091505b506000815114156130a9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461311390614771565b80601f016020809104026020016040519081016040528092919081815260200182805461313f90614771565b801561318c5780601f106131615761010080835404028352916020019161318c565b820191906000526020600020905b81548152906001019060200180831161316f57829003601f168201915b5050505050905090565b606060008214156131de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132f2565b600082905060005b600082146132105780806131f9906147d4565b915050600a8261320991906145e8565b91506131e6565b60008167ffffffffffffffff81111561322c5761322b61490a565b5b6040519080825280601f01601f19166020018201604052801561325e5781602001600182028036833780820191505090505b5090505b600085146132eb576001826132779190614673565b9150600a85613286919061481d565b60306132929190614592565b60f81b8183815181106132a8576132a76148db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132e491906145e8565b9450613262565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613370576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156133ab576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133b860008583866132f7565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506135798673ffffffffffffffffffffffffffffffffffffffff16612f81565b1561363e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135ee6000878480600101955087612fa4565b613624576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061357f57826000541461363957600080fd5b6136a9565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061363f575b8160008190555050506136bf60008583866132fd565b50505050565b8280546136d190614771565b90600052602060002090601f0160209004810192826136f3576000855561373a565b82601f1061370c57805160ff191683800117855561373a565b8280016001018555821561373a579182015b8281111561373957825182559160200191906001019061371e565b5b509050613747919061378e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156137a757600081600090555060010161378f565b5090565b60006137be6137b98461442f565b61440a565b905080838252602082019050828560208602820111156137e1576137e061493e565b5b60005b8581101561381157816137f78882613992565b8452602084019350602083019250506001810190506137e4565b5050509392505050565b600061382e6138298461445b565b61440a565b90508281526020810184848401111561384a57613849614943565b5b61385584828561472f565b509392505050565b600061387061386b8461448c565b61440a565b90508281526020810184848401111561388c5761388b614943565b5b61389784828561472f565b509392505050565b6000813590506138ae81614ad1565b92915050565b600082601f8301126138c9576138c8614939565b5b81356138d98482602086016137ab565b91505092915050565b6000813590506138f181614ae8565b92915050565b60008151905061390681614ae8565b92915050565b60008135905061391b81614aff565b92915050565b60008151905061393081614aff565b92915050565b600082601f83011261394b5761394a614939565b5b813561395b84826020860161381b565b91505092915050565b600082601f83011261397957613978614939565b5b813561398984826020860161385d565b91505092915050565b6000813590506139a181614b16565b92915050565b6000602082840312156139bd576139bc61494d565b5b60006139cb8482850161389f565b91505092915050565b600080604083850312156139eb576139ea61494d565b5b60006139f98582860161389f565b9250506020613a0a8582860161389f565b9150509250929050565b600080600060608486031215613a2d57613a2c61494d565b5b6000613a3b8682870161389f565b9350506020613a4c8682870161389f565b9250506040613a5d86828701613992565b9150509250925092565b60008060008060808587031215613a8157613a8061494d565b5b6000613a8f8782880161389f565b9450506020613aa08782880161389f565b9350506040613ab187828801613992565b925050606085013567ffffffffffffffff811115613ad257613ad1614948565b5b613ade87828801613936565b91505092959194509250565b60008060408385031215613b0157613b0061494d565b5b6000613b0f8582860161389f565b9250506020613b20858286016138e2565b9150509250929050565b60008060408385031215613b4157613b4061494d565b5b6000613b4f8582860161389f565b9250506020613b6085828601613992565b9150509250929050565b600080600060608486031215613b8357613b8261494d565b5b6000613b918682870161389f565b9350506020613ba286828701613992565b9250506040613bb386828701613992565b9150509250925092565b600060208284031215613bd357613bd261494d565b5b600082013567ffffffffffffffff811115613bf157613bf0614948565b5b613bfd848285016138b4565b91505092915050565b600060208284031215613c1c57613c1b61494d565b5b6000613c2a848285016138f7565b91505092915050565b600060208284031215613c4957613c4861494d565b5b6000613c578482850161390c565b91505092915050565b600060208284031215613c7657613c7561494d565b5b6000613c8484828501613921565b91505092915050565b600060208284031215613ca357613ca261494d565b5b600082013567ffffffffffffffff811115613cc157613cc0614948565b5b613ccd84828501613964565b91505092915050565b600060208284031215613cec57613ceb61494d565b5b6000613cfa84828501613992565b91505092915050565b60008060408385031215613d1a57613d1961494d565b5b6000613d2885828601613992565b925050602083013567ffffffffffffffff811115613d4957613d48614948565b5b613d5585828601613964565b9150509250929050565b6000613d6b83836140c1565b60608301905092915050565b6000613d838383614145565b60208301905092915050565b613d98816146a7565b82525050565b613da7816146a7565b82525050565b6000613db8826144f2565b613dc28185614538565b9350613dcd836144bd565b8060005b83811015613dfe578151613de58882613d5f565b9750613df08361451e565b925050600181019050613dd1565b5085935050505092915050565b6000613e16826144fd565b613e208185614549565b9350613e2b836144cd565b8060005b83811015613e5c578151613e438882613d77565b9750613e4e8361452b565b925050600181019050613e2f565b5085935050505092915050565b613e72816146b9565b82525050565b613e81816146b9565b82525050565b6000613e9282614508565b613e9c818561455a565b9350613eac81856020860161473e565b613eb581614952565b840191505092915050565b6000613ecb82614513565b613ed58185614576565b9350613ee581856020860161473e565b613eee81614952565b840191505092915050565b6000613f0482614513565b613f0e8185614587565b9350613f1e81856020860161473e565b80840191505092915050565b60008154613f3781614771565b613f418186614587565b94506001821660008114613f5c5760018114613f6d57613fa0565b60ff19831686528186019350613fa0565b613f76856144dd565b60005b83811015613f9857815481890152600182019150602081019050613f79565b838801955050505b50505092915050565b6000613fb6602683614576565b9150613fc182614963565b604082019050919050565b6000613fd9601d83614576565b9150613fe4826149b2565b602082019050919050565b6000613ffc602083614576565b9150614007826149db565b602082019050919050565b600061401f602f83614576565b915061402a82614a04565b604082019050919050565b600061404260008361456b565b915061404d82614a53565b600082019050919050565b6000614065601583614576565b915061407082614a56565b602082019050919050565b6000614088601583614576565b915061409382614a7f565b602082019050919050565b60006140ab601583614576565b91506140b682614aa8565b602082019050919050565b6060820160008201516140d76000850182613d8f565b5060208201516140ea6020850182614163565b5060408201516140fd6040850182613e69565b50505050565b6060820160008201516141196000850182613d8f565b50602082015161412c6020850182614163565b50604082015161413f6040850182613e69565b50505050565b61414e81614711565b82525050565b61415d81614711565b82525050565b61416c8161471b565b82525050565b600061417e8285613ef9565b915061418a8284613ef9565b91508190509392505050565b60006141a28286613ef9565b91506141ae8285613ef9565b91506141ba8284613f2a565b9150819050949350505050565b60006141d282614035565b9150819050919050565b60006020820190506141f16000830184613d9e565b92915050565b600060808201905061420c6000830187613d9e565b6142196020830186613d9e565b6142266040830185614154565b81810360608301526142388184613e87565b905095945050505050565b60006040820190506142586000830185613d9e565b818103602083015261426a8184613ec0565b90509392505050565b6000602082019050818103600083015261428d8184613dad565b905092915050565b600060208201905081810360008301526142af8184613e0b565b905092915050565b60006020820190506142cc6000830184613e78565b92915050565b600060208201905081810360008301526142ec8184613ec0565b905092915050565b6000602082019050818103600083015261430d81613fa9565b9050919050565b6000602082019050818103600083015261432d81613fcc565b9050919050565b6000602082019050818103600083015261434d81613fef565b9050919050565b6000602082019050818103600083015261436d81614012565b9050919050565b6000602082019050818103600083015261438d81614058565b9050919050565b600060208201905081810360008301526143ad8161407b565b9050919050565b600060208201905081810360008301526143cd8161409e565b9050919050565b60006060820190506143e96000830184614103565b92915050565b60006020820190506144046000830184614154565b92915050565b6000614414614425565b905061442082826147a3565b919050565b6000604051905090565b600067ffffffffffffffff82111561444a5761444961490a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144765761447561490a565b5b61447f82614952565b9050602081019050919050565b600067ffffffffffffffff8211156144a7576144a661490a565b5b6144b082614952565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061459d82614711565b91506145a883614711565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145dd576145dc61484e565b5b828201905092915050565b60006145f382614711565b91506145fe83614711565b92508261460e5761460d61487d565b5b828204905092915050565b600061462482614711565b915061462f83614711565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146685761466761484e565b5b828202905092915050565b600061467e82614711565b915061468983614711565b92508282101561469c5761469b61484e565b5b828203905092915050565b60006146b2826146f1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561475c578082015181840152602081019050614741565b8381111561476b576000848401525b50505050565b6000600282049050600182168061478957607f821691505b6020821081141561479d5761479c6148ac565b5b50919050565b6147ac82614952565b810181811067ffffffffffffffff821117156147cb576147ca61490a565b5b80604052505050565b60006147df82614711565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148125761481161484e565b5b600182019050919050565b600061482882614711565b915061483383614711565b9250826148435761484261487d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f446f6e27742068617665207065726d697373696f6e20746f206d696e74000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f45786365656473206d61782066726565206d696e740000000000000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f496e73756666696369656e74207175616e746974790000000000000000000000600082015250565b614ada816146a7565b8114614ae557600080fd5b50565b614af1816146b9565b8114614afc57600080fd5b50565b614b08816146c5565b8114614b1357600080fd5b50565b614b1f81614711565b8114614b2a57600080fd5b5056fea264697066735822122040c3c27d9460f18a144d871f893e83d1ace8efed1c61a1c3296ce2f74cb5def864736f6c6343000807003368747470733a2f2f63646e2e616e74776172732e78797a2f6d6574612f6d683534343835336236393263613030363165623064353532366537632f616e7468696c6c732e6a736f6e

Deployed Bytecode

0x6080604052600436106103355760003560e01c806379fa1eab116101ab578063b7b21f67116100f7578063da3ef23f11610095578063eecefa9b1161006f578063eecefa9b14610beb578063f2c4ce1e14610c14578063f2fde38b14610c3d578063fcfff16f14610c6657610335565b8063da3ef23f14610b5a578063dd8a2ff414610b83578063e985e9c514610bae57610335565b8063c6682862116100d1578063c668286214610a9c578063c87b56dd14610ac7578063cbf77bf114610b04578063d82f37bc14610b2f57610335565b8063b7b21f6714610a1a578063b88d4fde14610a36578063c23dc68f14610a5f57610335565b80639858cf1911610164578063a035b1fe1161013e578063a035b1fe14610970578063a22cb4651461099b578063a685e857146109c4578063b4256888146109ef57610335565b80639858cf19146108dd5780639858ea171461090857806399a2557a1461093357610335565b806379fa1eab146107df5780638462151c1461080a5780638da5cb5b1461084757806391b7f5ed1461087257806395d89b411461089b5780639752ecf7146108c657610335565b80633ada8b32116102855780635b70ea9f116102235780636352211e116101fd5780636352211e1461072557806370a082311461076257806370e093691461079f578063715018a6146107c857610335565b80635b70ea9f146106925780635bbb2177146106bd578063626c8f8e146106fa57610335565b8063434580f91161025f578063434580f9146105fc57806352d939e314610627578063557ed1ba1461063e57806355f804b31461066957610335565b80633ada8b32146105935780633ccfd60b146105bc57806342842e0e146105d357610335565b80630e18d2ab116102f257806323b872dd116102cc57806323b872dd146104ed57806328f8e904146105165780632b2e05c11461053f57806332cb6b0c1461056857610335565b80630e18d2ab1461045c578063150c5c261461049957806318160ddd146104c257610335565b806301ffc9a71461033a57806302fb0c5e1461037757806305dae7ac146103a257806306fdde03146103cb578063081812fc146103f6578063095ea7b314610433575b600080fd5b34801561034657600080fd5b50610361600480360381019061035c9190613c33565b610c91565b60405161036e91906142b7565b60405180910390f35b34801561038357600080fd5b5061038c610d73565b60405161039991906142b7565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c49190613cd6565b610d86565b005b3480156103d757600080fd5b506103e0610d98565b6040516103ed91906142d2565b60405180910390f35b34801561040257600080fd5b5061041d60048036038101906104189190613cd6565b610e2a565b60405161042a91906141dc565b60405180910390f35b34801561043f57600080fd5b5061045a60048036038101906104559190613b2a565b610ea6565b005b34801561046857600080fd5b50610483600480360381019061047e91906139a7565b610fab565b60405161049091906143ef565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613cd6565b610ff4565b005b3480156104ce57600080fd5b506104d7611006565b6040516104e491906143ef565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613a14565b61101d565b005b34801561052257600080fd5b5061053d600480360381019061053891906139a7565b61102d565b005b34801561054b57600080fd5b50610566600480360381019061056191906139a7565b611079565b005b34801561057457600080fd5b5061057d6110c5565b60405161058a91906143ef565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b59190613d03565b6110cb565b005b3480156105c857600080fd5b506105d161134b565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190613a14565b6113ee565b005b34801561060857600080fd5b5061061161140e565b60405161061e91906142d2565b60405180910390f35b34801561063357600080fd5b5061063c61149c565b005b34801561064a57600080fd5b506106536114d0565b60405161066091906143ef565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b9190613c8d565b6114d8565b005b34801561069e57600080fd5b506106a76114fa565b6040516106b491906143ef565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df9190613bbd565b611500565b6040516106f19190614273565b60405180910390f35b34801561070657600080fd5b5061070f6115c1565b60405161071c91906143ef565b60405180910390f35b34801561073157600080fd5b5061074c60048036038101906107479190613cd6565b6115c7565b60405161075991906141dc565b60405180910390f35b34801561076e57600080fd5b50610789600480360381019061078491906139a7565b6115dd565b60405161079691906143ef565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c19190613cd6565b6116ad565b005b3480156107d457600080fd5b506107dd6116bf565b005b3480156107eb57600080fd5b506107f46116d3565b60405161080191906141dc565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c91906139a7565b6116f9565b60405161083e9190614295565b60405180910390f35b34801561085357600080fd5b5061085c6118fb565b60405161086991906141dc565b60405180910390f35b34801561087e57600080fd5b5061089960048036038101906108949190613cd6565b611925565b005b3480156108a757600080fd5b506108b0611937565b6040516108bd91906142d2565b60405180910390f35b3480156108d257600080fd5b506108db6119c9565b005b3480156108e957600080fd5b506108f26119fd565b6040516108ff91906143ef565b60405180910390f35b34801561091457600080fd5b5061091d611a03565b60405161092a91906143ef565b60405180910390f35b34801561093f57600080fd5b5061095a60048036038101906109559190613b6a565b611a09565b6040516109679190614295565b60405180910390f35b34801561097c57600080fd5b50610985611cd0565b60405161099291906143ef565b60405180910390f35b3480156109a757600080fd5b506109c260048036038101906109bd9190613aea565b611cd6565b005b3480156109d057600080fd5b506109d9611e4e565b6040516109e691906143ef565b60405180910390f35b3480156109fb57600080fd5b50610a04611e72565b604051610a1191906143ef565b60405180910390f35b610a346004803603810190610a2f9190613cd6565b611e78565b005b348015610a4257600080fd5b50610a5d6004803603810190610a589190613a67565b611f7c565b005b348015610a6b57600080fd5b50610a866004803603810190610a819190613cd6565b611ff4565b604051610a9391906143d4565b60405180910390f35b348015610aa857600080fd5b50610ab1612111565b604051610abe91906142d2565b60405180910390f35b348015610ad357600080fd5b50610aee6004803603810190610ae99190613cd6565b61219f565b604051610afb91906142d2565b60405180910390f35b348015610b1057600080fd5b50610b196123c3565b604051610b2691906143ef565b60405180910390f35b348015610b3b57600080fd5b50610b446123c9565b604051610b5191906143ef565b60405180910390f35b348015610b6657600080fd5b50610b816004803603810190610b7c9190613c8d565b6123e0565b005b348015610b8f57600080fd5b50610b98612402565b604051610ba591906143ef565b60405180910390f35b348015610bba57600080fd5b50610bd56004803603810190610bd091906139d4565b612408565b604051610be291906142b7565b60405180910390f35b348015610bf757600080fd5b50610c126004803603810190610c0d9190613cd6565b61249c565b005b348015610c2057600080fd5b50610c3b6004803603810190610c369190613c8d565b6124ae565b005b348015610c4957600080fd5b50610c646004803603810190610c5f91906139a7565b6124d0565b005b348015610c7257600080fd5b50610c7b612554565b604051610c8891906142b7565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d5c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d6c5750610d6b82612567565b5b9050919050565b600860149054906101000a900460ff1681565b610d8e6125d1565b8060098190555050565b606060028054610da790614771565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd390614771565b8015610e205780601f10610df557610100808354040283529160200191610e20565b820191906000526020600020905b815481529060010190602001808311610e0357829003601f168201915b5050505050905090565b6000610e358261264f565b610e6b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610eb1826115c7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f19576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f3861269d565b73ffffffffffffffffffffffffffffffffffffffff1614610f9b57610f6481610f5f61269d565b612408565b610f9a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610fa68383836126a5565b505050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ffc6125d1565b80600a8190555050565b6000611010612757565b6001546000540303905090565b61102883838361275c565b505050565b6110356125d1565b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6110816125d1565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e6181565b600860149054906101000a900460ff166110e457600080fd5b60011515601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fcf3eeea33846040518363ffffffff1660e01b8152600401611145929190614243565b60206040518083038186803b15801561115d57600080fd5b505afa158015611171573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111959190613c06565b15151480156111a657506009544210155b806111b35750600a544210155b6111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e990614314565b60405180910390fd5b6111fa6123c9565b821115801561120b5750600f548211155b61124a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611241906143b4565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112999190614592565b92505081905550600f54601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90614374565b60405180910390fd5b81601360008282546113369190614592565b925050819055506113473383612c12565b5050565b6113536125d1565b6000601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161139b906141c7565b60006040518083038185875af1925050503d80600081146113d8576040519150601f19603f3d011682016040523d82523d6000602084013e6113dd565b606091505b50509050806113eb57600080fd5b50565b61140983838360405180602001604052806000815250611f7c565b505050565b600d805461141b90614771565b80601f016020809104026020016040519081016040528092919081815260200182805461144790614771565b80156114945780601f1061146957610100808354040283529160200191611494565b820191906000526020600020905b81548152906001019060200180831161147757829003601f168201915b505050505081565b6114a46125d1565b600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b600042905090565b6114e06125d1565b80600b90805190602001906114f69291906136c5565b5050565b600f5481565b606060008251905060008167ffffffffffffffff8111156115245761152361490a565b5b60405190808252806020026020018201604052801561155d57816020015b61154a61374b565b8152602001906001900390816115425790505b50905060005b8281146115b65761158d8582815181106115805761157f6148db565b5b6020026020010151611ff4565b8282815181106115a05761159f6148db565b5b6020026020010181905250806001019050611563565b508092505050919050565b60135481565b60006115d282612c30565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611645576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116b56125d1565b80600f8190555050565b6116c76125d1565b6116d16000612ebb565b565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000806000611709856115dd565b905060008167ffffffffffffffff8111156117275761172661490a565b5b6040519080825280602002602001820160405280156117555781602001602082028036833780820191505090505b50905061176061374b565b600061176a612757565b90505b8386146118ed57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015115611846576118e2565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461188657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156118e157808387806001019850815181106118d4576118d36148db565b5b6020026020010181815250505b5b80600101905061176d565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61192d6125d1565b8060108190555050565b60606003805461194690614771565b80601f016020809104026020016040519081016040528092919081815260200182805461197290614771565b80156119bf5780601f10611994576101008083540402835291602001916119bf565b820191906000526020600020905b8154815290600101906020018083116119a257829003601f168201915b5050505050905090565b6119d16125d1565b600860159054906101000a900460ff1615600860156101000a81548160ff021916908315150217905550565b610fa081565b60145481565b6060818310611a44576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000549050611a54612757565b851015611a6657611a63612757565b94505b80841115611a72578093505b6000611a7d876115dd565b905084861015611aa0576000868603905081811015611a9a578091505b50611aa5565b600090505b60008167ffffffffffffffff811115611ac157611ac061490a565b5b604051908082528060200260200182016040528015611aef5781602001602082028036833780820191505090505b5090506000821415611b075780945050505050611cc9565b6000611b1288611ff4565b905060008160400151611b2757816000015190505b60008990505b888114158015611b3d5750848714155b15611cbb57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509250826040015115611c1457611cb0565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c5457826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611caf5780848880600101995081518110611ca257611ca16148db565b5b6020026020010181815250505b5b806001019050611b2d565b508583528296505050505050505b9392505050565b60105481565b611cde61269d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d43576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d5061269d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dfd61269d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e4291906142b7565b60405180910390a35050565b6000601454610fa0611e61611e639190614673565b611e6d9190614673565b905090565b60095481565b600860149054906101000a900460ff168015611e9657506009544210155b611e9f57600080fd5b611ea7611e4e565b8111158015611eb85750600e548111155b611ec157600080fd5b3460105482611ed09190614619565b1115611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614394565b60405180910390fd5b8060146000828254611f239190614592565b92505081905550611f343382612c12565b34813373ffffffffffffffffffffffffffffffffffffffff167f9f3488b493b562d1056a2765237072a15ae05e985908667781eddf46305e9bff60405160405180910390a450565b611f8784848461275c565b611fa68373ffffffffffffffffffffffffffffffffffffffff16612f81565b15611fee57611fb784848484612fa4565b611fed576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611ffc61374b565b61200461374b565b61200c612757565b83108061201b57506000548310155b15612029578091505061210c565b600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156120ff578091505061210c565b61210883612c30565b9150505b919050565b600c805461211e90614771565b80601f016020809104026020016040519081016040528092919081815260200182805461214a90614771565b80156121975780601f1061216c57610100808354040283529160200191612197565b820191906000526020600020905b81548152906001019060200180831161217a57829003601f168201915b505050505081565b60606121aa8261264f565b6121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090614354565b60405180910390fd5b60001515600860159054906101000a900460ff161515141561229757600d805461221290614771565b80601f016020809104026020016040519081016040528092919081815260200182805461223e90614771565b801561228b5780601f106122605761010080835404028352916020019161228b565b820191906000526020600020905b81548152906001019060200180831161226e57829003601f168201915b505050505090506123be565b60006016600084815260200190815260200160002080546122b790614771565b80601f01602080910402602001604051908101604052809291908181526020018280546122e390614771565b80156123305780601f1061230557610100808354040283529160200191612330565b820191906000526020600020905b81548152906001019060200180831161231357829003601f168201915b505050505090506000612341613104565b90506000815114156123575781925050506123be565b60008251111561238c578082604051602001612374929190614172565b604051602081830303815290604052925050506123be565b8061239685613196565b600c6040516020016123aa93929190614196565b604051602081830303815290604052925050505b919050565b600a5481565b6000601354610fa06123db9190614673565b905090565b6123e86125d1565b80600c90805190602001906123fe9291906136c5565b5050565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6124a46125d1565b80600e8190555050565b6124b66125d1565b80600d90805190602001906124cc9291906136c5565b5050565b6124d86125d1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f906142f4565b60405180910390fd5b61255181612ebb565b50565b600860159054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6125d961269d565b73ffffffffffffffffffffffffffffffffffffffff166125f76118fb565b73ffffffffffffffffffffffffffffffffffffffff161461264d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161264490614334565b60405180910390fd5b565b60008161265a612757565b11158015612669575060005482105b8015612696575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061276782612c30565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146127d2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127f361269d565b73ffffffffffffffffffffffffffffffffffffffff16148061282257506128218561281c61269d565b612408565b5b80612867575061283061269d565b73ffffffffffffffffffffffffffffffffffffffff1661284f84610e2a565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806128a0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612907576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61291485858560016132f7565b612920600084876126a5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612ba0576000548214612b9f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c0b85858560016132fd565b5050505050565b612c2c828260405180602001604052806000815250613303565b5050565b612c3861374b565b600082905080612c46612757565b11612e8457600054811015612e83576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612e8157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d65578092505050612eb6565b5b600115612e8057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e7b578092505050612eb6565b612d66565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fca61269d565b8786866040518563ffffffff1660e01b8152600401612fec94939291906141f7565b602060405180830381600087803b15801561300657600080fd5b505af192505050801561303757506040513d601f19601f820116820180604052508101906130349190613c60565b60015b6130b1573d8060008114613067576040519150601f19603f3d011682016040523d82523d6000602084013e61306c565b606091505b506000815114156130a9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461311390614771565b80601f016020809104026020016040519081016040528092919081815260200182805461313f90614771565b801561318c5780601f106131615761010080835404028352916020019161318c565b820191906000526020600020905b81548152906001019060200180831161316f57829003601f168201915b5050505050905090565b606060008214156131de576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132f2565b600082905060005b600082146132105780806131f9906147d4565b915050600a8261320991906145e8565b91506131e6565b60008167ffffffffffffffff81111561322c5761322b61490a565b5b6040519080825280601f01601f19166020018201604052801561325e5781602001600182028036833780820191505090505b5090505b600085146132eb576001826132779190614673565b9150600a85613286919061481d565b60306132929190614592565b60f81b8183815181106132a8576132a76148db565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132e491906145e8565b9450613262565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613370576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156133ab576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133b860008583866132f7565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600084820190506135798673ffffffffffffffffffffffffffffffffffffffff16612f81565b1561363e575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135ee6000878480600101955087612fa4565b613624576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061357f57826000541461363957600080fd5b6136a9565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061363f575b8160008190555050506136bf60008583866132fd565b50505050565b8280546136d190614771565b90600052602060002090601f0160209004810192826136f3576000855561373a565b82601f1061370c57805160ff191683800117855561373a565b8280016001018555821561373a579182015b8281111561373957825182559160200191906001019061371e565b5b509050613747919061378e565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156137a757600081600090555060010161378f565b5090565b60006137be6137b98461442f565b61440a565b905080838252602082019050828560208602820111156137e1576137e061493e565b5b60005b8581101561381157816137f78882613992565b8452602084019350602083019250506001810190506137e4565b5050509392505050565b600061382e6138298461445b565b61440a565b90508281526020810184848401111561384a57613849614943565b5b61385584828561472f565b509392505050565b600061387061386b8461448c565b61440a565b90508281526020810184848401111561388c5761388b614943565b5b61389784828561472f565b509392505050565b6000813590506138ae81614ad1565b92915050565b600082601f8301126138c9576138c8614939565b5b81356138d98482602086016137ab565b91505092915050565b6000813590506138f181614ae8565b92915050565b60008151905061390681614ae8565b92915050565b60008135905061391b81614aff565b92915050565b60008151905061393081614aff565b92915050565b600082601f83011261394b5761394a614939565b5b813561395b84826020860161381b565b91505092915050565b600082601f83011261397957613978614939565b5b813561398984826020860161385d565b91505092915050565b6000813590506139a181614b16565b92915050565b6000602082840312156139bd576139bc61494d565b5b60006139cb8482850161389f565b91505092915050565b600080604083850312156139eb576139ea61494d565b5b60006139f98582860161389f565b9250506020613a0a8582860161389f565b9150509250929050565b600080600060608486031215613a2d57613a2c61494d565b5b6000613a3b8682870161389f565b9350506020613a4c8682870161389f565b9250506040613a5d86828701613992565b9150509250925092565b60008060008060808587031215613a8157613a8061494d565b5b6000613a8f8782880161389f565b9450506020613aa08782880161389f565b9350506040613ab187828801613992565b925050606085013567ffffffffffffffff811115613ad257613ad1614948565b5b613ade87828801613936565b91505092959194509250565b60008060408385031215613b0157613b0061494d565b5b6000613b0f8582860161389f565b9250506020613b20858286016138e2565b9150509250929050565b60008060408385031215613b4157613b4061494d565b5b6000613b4f8582860161389f565b9250506020613b6085828601613992565b9150509250929050565b600080600060608486031215613b8357613b8261494d565b5b6000613b918682870161389f565b9350506020613ba286828701613992565b9250506040613bb386828701613992565b9150509250925092565b600060208284031215613bd357613bd261494d565b5b600082013567ffffffffffffffff811115613bf157613bf0614948565b5b613bfd848285016138b4565b91505092915050565b600060208284031215613c1c57613c1b61494d565b5b6000613c2a848285016138f7565b91505092915050565b600060208284031215613c4957613c4861494d565b5b6000613c578482850161390c565b91505092915050565b600060208284031215613c7657613c7561494d565b5b6000613c8484828501613921565b91505092915050565b600060208284031215613ca357613ca261494d565b5b600082013567ffffffffffffffff811115613cc157613cc0614948565b5b613ccd84828501613964565b91505092915050565b600060208284031215613cec57613ceb61494d565b5b6000613cfa84828501613992565b91505092915050565b60008060408385031215613d1a57613d1961494d565b5b6000613d2885828601613992565b925050602083013567ffffffffffffffff811115613d4957613d48614948565b5b613d5585828601613964565b9150509250929050565b6000613d6b83836140c1565b60608301905092915050565b6000613d838383614145565b60208301905092915050565b613d98816146a7565b82525050565b613da7816146a7565b82525050565b6000613db8826144f2565b613dc28185614538565b9350613dcd836144bd565b8060005b83811015613dfe578151613de58882613d5f565b9750613df08361451e565b925050600181019050613dd1565b5085935050505092915050565b6000613e16826144fd565b613e208185614549565b9350613e2b836144cd565b8060005b83811015613e5c578151613e438882613d77565b9750613e4e8361452b565b925050600181019050613e2f565b5085935050505092915050565b613e72816146b9565b82525050565b613e81816146b9565b82525050565b6000613e9282614508565b613e9c818561455a565b9350613eac81856020860161473e565b613eb581614952565b840191505092915050565b6000613ecb82614513565b613ed58185614576565b9350613ee581856020860161473e565b613eee81614952565b840191505092915050565b6000613f0482614513565b613f0e8185614587565b9350613f1e81856020860161473e565b80840191505092915050565b60008154613f3781614771565b613f418186614587565b94506001821660008114613f5c5760018114613f6d57613fa0565b60ff19831686528186019350613fa0565b613f76856144dd565b60005b83811015613f9857815481890152600182019150602081019050613f79565b838801955050505b50505092915050565b6000613fb6602683614576565b9150613fc182614963565b604082019050919050565b6000613fd9601d83614576565b9150613fe4826149b2565b602082019050919050565b6000613ffc602083614576565b9150614007826149db565b602082019050919050565b600061401f602f83614576565b915061402a82614a04565b604082019050919050565b600061404260008361456b565b915061404d82614a53565b600082019050919050565b6000614065601583614576565b915061407082614a56565b602082019050919050565b6000614088601583614576565b915061409382614a7f565b602082019050919050565b60006140ab601583614576565b91506140b682614aa8565b602082019050919050565b6060820160008201516140d76000850182613d8f565b5060208201516140ea6020850182614163565b5060408201516140fd6040850182613e69565b50505050565b6060820160008201516141196000850182613d8f565b50602082015161412c6020850182614163565b50604082015161413f6040850182613e69565b50505050565b61414e81614711565b82525050565b61415d81614711565b82525050565b61416c8161471b565b82525050565b600061417e8285613ef9565b915061418a8284613ef9565b91508190509392505050565b60006141a28286613ef9565b91506141ae8285613ef9565b91506141ba8284613f2a565b9150819050949350505050565b60006141d282614035565b9150819050919050565b60006020820190506141f16000830184613d9e565b92915050565b600060808201905061420c6000830187613d9e565b6142196020830186613d9e565b6142266040830185614154565b81810360608301526142388184613e87565b905095945050505050565b60006040820190506142586000830185613d9e565b818103602083015261426a8184613ec0565b90509392505050565b6000602082019050818103600083015261428d8184613dad565b905092915050565b600060208201905081810360008301526142af8184613e0b565b905092915050565b60006020820190506142cc6000830184613e78565b92915050565b600060208201905081810360008301526142ec8184613ec0565b905092915050565b6000602082019050818103600083015261430d81613fa9565b9050919050565b6000602082019050818103600083015261432d81613fcc565b9050919050565b6000602082019050818103600083015261434d81613fef565b9050919050565b6000602082019050818103600083015261436d81614012565b9050919050565b6000602082019050818103600083015261438d81614058565b9050919050565b600060208201905081810360008301526143ad8161407b565b9050919050565b600060208201905081810360008301526143cd8161409e565b9050919050565b60006060820190506143e96000830184614103565b92915050565b60006020820190506144046000830184614154565b92915050565b6000614414614425565b905061442082826147a3565b919050565b6000604051905090565b600067ffffffffffffffff82111561444a5761444961490a565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144765761447561490a565b5b61447f82614952565b9050602081019050919050565b600067ffffffffffffffff8211156144a7576144a661490a565b5b6144b082614952565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061459d82614711565b91506145a883614711565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145dd576145dc61484e565b5b828201905092915050565b60006145f382614711565b91506145fe83614711565b92508261460e5761460d61487d565b5b828204905092915050565b600061462482614711565b915061462f83614711565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146685761466761484e565b5b828202905092915050565b600061467e82614711565b915061468983614711565b92508282101561469c5761469b61484e565b5b828203905092915050565b60006146b2826146f1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b8381101561475c578082015181840152602081019050614741565b8381111561476b576000848401525b50505050565b6000600282049050600182168061478957607f821691505b6020821081141561479d5761479c6148ac565b5b50919050565b6147ac82614952565b810181811067ffffffffffffffff821117156147cb576147ca61490a565b5b80604052505050565b60006147df82614711565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148125761481161484e565b5b600182019050919050565b600061482882614711565b915061483383614711565b9250826148435761484261487d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f446f6e27742068617665207065726d697373696f6e20746f206d696e74000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f45786365656473206d61782066726565206d696e740000000000000000000000600082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f496e73756666696369656e74207175616e746974790000000000000000000000600082015250565b614ada816146a7565b8114614ae557600080fd5b50565b614af1816146b9565b8114614afc57600080fd5b50565b614b08816146c5565b8114614b1357600080fd5b50565b614b1f81614711565b8114614b2a57600080fd5b5056fea264697066735822122040c3c27d9460f18a144d871f893e83d1ace8efed1c61a1c3296ce2f74cb5def864736f6c63430008070033

Deployed Bytecode Sourcemap

53504:5978:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28259:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53591:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58354:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31374:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32878:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32440:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58878:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58459:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27499:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33743:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59234:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57015:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53929:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57681:569;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59325:152;;;;;;;;;;;;;:::i;:::-;;33984:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53813:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57194:74;;;;;;;;;;;;;:::i;:::-;;58258:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56758:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54070:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48477:523;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54250:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31182:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28628:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58571:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13836:103;;;;;;;;;;;;;:::i;:::-;;54432:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52403:980;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13188:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58672:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31543:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57118:68;;;;;;;;;;;;;:::i;:::-;;53978:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54285:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49390:2564;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54106:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33154:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59109:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53656:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57276:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34240:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47877:441;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53766:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55761:729;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53699:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58997:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56874:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54030:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33512:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58767:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56618:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14094:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53623:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28259:305;28361:4;28413:25;28398:40;;;:11;:40;;;;:105;;;;28470:33;28455:48;;;:11;:48;;;;28398:105;:158;;;;28520:36;28544:11;28520:23;:36::i;:::-;28398:158;28378:178;;28259:305;;;:::o;53591:25::-;;;;;;;;;;;;;:::o;58354:97::-;13074:13;:11;:13::i;:::-;58434:9:::1;58423:8;:20;;;;58354:97:::0;:::o;31374:100::-;31428:13;31461:5;31454:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31374:100;:::o;32878:204::-;32946:7;32971:16;32979:7;32971;:16::i;:::-;32966:64;;32996:34;;;;;;;;;;;;;;32966:64;33050:15;:24;33066:7;33050:24;;;;;;;;;;;;;;;;;;;;;33043:31;;32878:204;;;:::o;32440:372::-;32513:13;32529:24;32545:7;32529:15;:24::i;:::-;32513:40;;32574:5;32568:11;;:2;:11;;;32564:48;;;32588:24;;;;;;;;;;;;;;32564:48;32645:5;32629:21;;:12;:10;:12::i;:::-;:21;;;32625:139;;32656:37;32673:5;32680:12;:10;:12::i;:::-;32656:16;:37::i;:::-;32652:112;;32717:35;;;;;;;;;;;;;;32652:112;32625:139;32776:28;32785:2;32789:7;32798:5;32776:8;:28::i;:::-;32502:310;32440:372;;:::o;58878:110::-;58936:7;58962:13;:18;58976:3;58962:18;;;;;;;;;;;;;;;;58955:25;;58878:110;;;:::o;58459:104::-;13074:13;:11;:13::i;:::-;58544:11:::1;58531:10;:24;;;;58459:104:::0;:::o;27499:312::-;27552:7;27777:15;:13;:15::i;:::-;27762:12;;27746:13;;:28;:46;27739:53;;27499:312;:::o;33743:170::-;33877:28;33887:4;33893:2;33897:7;33877:9;:28::i;:::-;33743:170;;;:::o;59234:82::-;13074:13;:11;:13::i;:::-;59300:8:::1;59295:2;;:13;;;;;;;;;;;;;;;;;;59234:82:::0;:::o;57015:95::-;13074:13;:11;:13::i;:::-;57093:8:::1;57080:4;;:22;;;;;;;;;;;;;;;;;;57015:95:::0;:::o;53929:41::-;53966:4;53929:41;:::o;57681:569::-;57768:6;;;;;;;;;;;57760:15;;;;;;57830:4;57795:39;;:4;;;;;;;;;;;:12;;;57808:10;57820:5;57795:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;;:71;;;;;57858:8;;57839:15;:27;;57795:71;57794:106;;;;57890:10;;57871:15;:29;;57794:106;57786:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;57963:14;:12;:14::i;:::-;57952:7;:25;;:49;;;;;57993:8;;57982:7;:19;;57952:49;57944:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;58069:7;58040:13;:25;58054:10;58040:25;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;58126:8;;58097:13;:25;58111:10;58097:25;;;;;;;;;;;;;;;;:37;;58089:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58188:7;58172:12;;:23;;;;;;;:::i;:::-;;;;;;;;58208:30;58218:10;58230:7;58208:9;:30::i;:::-;57681:569;;:::o;59325:152::-;13074:13;:11;:13::i;:::-;59374:12:::1;59400:2;;;;;;;;;;;59392:16;;59416:21;59392:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59373:69;;;59461:7;59453:16;;;::::0;::::1;;59362:115;59325:152::o:0;33984:185::-;34122:39;34139:4;34145:2;34149:7;34122:39;;;;;;;;;;;;:16;:39::i;:::-;33984:185;;;:::o;53813:105::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57194:74::-;13074:13;:11;:13::i;:::-;57254:6:::1;;;;;;;;;;;57253:7;57244:6;;:16;;;;;;;;;;;;;;;;;;57194:74::o:0;58258:88::-;58297:7;58323:15;58316:22;;58258:88;:::o;56758:104::-;13074:13;:11;:13::i;:::-;56843:11:::1;56833:7;:21;;;;;;;;;;;;:::i;:::-;;56758:104:::0;:::o;54070:27::-;;;;:::o;48477:523::-;48584:23;48650:22;48675:8;:15;48650:40;;48705:34;48781:14;48742:68;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;48705:105;;48830:9;48825:125;48846:14;48841:1;:19;48825:125;;48902:32;48922:8;48931:1;48922:11;;;;;;;;:::i;:::-;;;;;;;;48902:19;:32::i;:::-;48886:10;48897:1;48886:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;48862:3;;;;;48825:125;;;;48971:10;48964:17;;;;48477:523;;;:::o;54250:27::-;;;;:::o;31182:125::-;31246:7;31273:21;31286:7;31273:12;:21::i;:::-;:26;;;31266:33;;31182:125;;;:::o;28628:206::-;28692:7;28733:1;28716:19;;:5;:19;;;28712:60;;;28744:28;;;;;;;;;;;;;;28712:60;28798:12;:19;28811:5;28798:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28790:36;;28783:43;;28628:206;;;:::o;58571:92::-;13074:13;:11;:13::i;:::-;58648:7:::1;58637:8;:18;;;;58571:92:::0;:::o;13836:103::-;13074:13;:11;:13::i;:::-;13901:30:::1;13928:1;13901:18;:30::i;:::-;13836:103::o:0;54432:62::-;;;;;;;;;;;;;:::o;52403:980::-;52491:16;52550:19;52584:25;52624:22;52649:16;52659:5;52649:9;:16::i;:::-;52624:41;;52680:25;52722:14;52708:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52680:57;;52752:31;;:::i;:::-;52821:9;52833:15;:13;:15::i;:::-;52821:27;;52798:537;52882:14;52867:11;:29;52798:537;;52965:11;:14;52977:1;52965:14;;;;;;;;;;;52953:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53002:9;:16;;;52998:73;;;53043:8;;52998:73;53119:1;53093:28;;:9;:14;;;:28;;;53089:111;;53166:9;:14;;;53146:34;;53089:111;53243:5;53222:26;;:17;:26;;;53218:102;;;53299:1;53273:8;53282:13;;;;;;53273:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;53218:102;52798:537;52915:3;;;;;52798:537;;;;53356:8;53349:15;;;;;;;52403:980;;;:::o;13188:87::-;13234:7;13261:6;;;;;;;;;;;13254:13;;13188:87;:::o;58672:86::-;13074:13;:11;:13::i;:::-;58743:7:::1;58735:5;:15;;;;58672:86:::0;:::o;31543:104::-;31599:13;31632:7;31625:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31543:104;:::o;57118:68::-;13074:13;:11;:13::i;:::-;57174:4:::1;;;;;;;;;;;57173:5;57166:4;;:12;;;;;;;;;;;;;;;;;;57118:68::o:0;53978:42::-;54016:4;53978:42;:::o;54285:27::-;;;;:::o;49390:2564::-;49516:16;49583:4;49574:5;:13;49570:45;;49596:19;;;;;;;;;;;;;;49570:45;49630:19;49664:17;49684:13;;49664:33;;49783:15;:13;:15::i;:::-;49775:5;:23;49771:87;;;49827:15;:13;:15::i;:::-;49819:23;;49771:87;49938:9;49931:4;:16;49927:73;;;49975:9;49968:16;;49927:73;50014:25;50042:16;50052:5;50042:9;:16::i;:::-;50014:44;;50236:4;50228:5;:12;50224:278;;;50261:19;50290:5;50283:4;:12;50261:34;;50332:17;50318:11;:31;50314:111;;;50394:11;50374:31;;50314:111;50242:198;50224:278;;;50485:1;50465:21;;50224:278;50516:25;50558:17;50544:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50516:60;;50616:1;50595:17;:22;50591:78;;;50645:8;50638:15;;;;;;;;50591:78;50813:31;50847:26;50867:5;50847:19;:26::i;:::-;50813:60;;50888:25;51133:9;:16;;;51128:92;;51190:9;:14;;;51170:34;;51128:92;51257:9;51269:5;51257:17;;51234:543;51298:4;51293:1;:9;;:45;;;;;51321:17;51306:11;:32;;51293:45;51234:543;;;51407:11;:14;51419:1;51407:14;;;;;;;;;;;51395:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51444:9;:16;;;51440:73;;;51485:8;;51440:73;51561:1;51535:28;;:9;:14;;;:28;;;51531:111;;51608:9;:14;;;51588:34;;51531:111;51685:5;51664:26;;:17;:26;;;51660:102;;;51741:1;51715:8;51724:13;;;;;;51715:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;51660:102;51234:543;51357:3;;;;;51234:543;;;;51879:11;51869:8;51862:29;51927:8;51920:15;;;;;;;;49390:2564;;;;;;:::o;54106:34::-;;;;:::o;33154:287::-;33265:12;:10;:12::i;:::-;33253:24;;:8;:24;;;33249:54;;;33286:17;;;;;;;;;;;;;;33249:54;33361:8;33316:18;:32;33335:12;:10;:12::i;:::-;33316:32;;;;;;;;;;;;;;;:42;33349:8;33316:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33414:8;33385:48;;33400:12;:10;:12::i;:::-;33385:48;;;33424:8;33385:48;;;;;;:::i;:::-;;;;;;;;33154:287;;:::o;59109:117::-;59153:7;59206:12;;54016:4;53966;59179:24;;;;:::i;:::-;:39;;;;:::i;:::-;59172:46;;59109:117;:::o;53656:36::-;;;;:::o;57276:397::-;57349:6;;;;;;;;;;;:37;;;;;57378:8;;57359:15;:27;;57349:37;57341:46;;;;;;57417:14;:12;:14::i;:::-;57406:7;:25;;:52;;;;;57446:12;;57435:7;:23;;57406:52;57398:61;;;;;;57497:9;57488:5;;57478:7;:15;;;;:::i;:::-;:28;;57470:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57560:7;57544:12;;:23;;;;;;;:::i;:::-;;;;;;;;57580:30;57590:10;57602:7;57580:9;:30::i;:::-;57655:9;57646:7;57634:10;57626:39;;;;;;;;;;;;57276:397;:::o;34240:370::-;34407:28;34417:4;34423:2;34427:7;34407:9;:28::i;:::-;34450:15;:2;:13;;;:15::i;:::-;34446:157;;;34471:56;34502:4;34508:2;34512:7;34521:5;34471:30;:56::i;:::-;34467:136;;34551:40;;;;;;;;;;;;;;34467:136;34446:157;34240:370;;;;:::o;47877:441::-;47971:21;;:::i;:::-;48010:31;;:::i;:::-;48066:15;:13;:15::i;:::-;48056:7;:25;:53;;;;48096:13;;48085:7;:24;;48056:53;48052:102;;;48133:9;48126:16;;;;;48052:102;48176:11;:20;48188:7;48176:20;;;;;;;;;;;48164:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48211:9;:16;;;48207:65;;;48251:9;48244:16;;;;;48207:65;48289:21;48302:7;48289:12;:21::i;:::-;48282:28;;;47877:441;;;;:::o;53766:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55761:729::-;55834:13;55887:16;55895:7;55887;:16::i;:::-;55865:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;56001:5;55993:13;;:4;;;;;;;;;;;:13;;;55989:67;;;56030:14;56023:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55989:67;56068:23;56094:10;:19;56105:7;56094:19;;;;;;;;;;;56068:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56124:18;56145:10;:8;:10::i;:::-;56124:31;;56203:1;56187:4;56181:18;:23;56177:72;;;56228:9;56221:16;;;;;;56177:72;56299:1;56279:9;56273:23;:27;56269:108;;;56348:4;56354:9;56331:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56317:48;;;;;;56269:108;56441:4;56447:18;:7;:16;:18::i;:::-;56467:13;56424:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56397:85;;;;55761:729;;;;:::o;53699:38::-;;;;:::o;58997:104::-;59041:7;59081:12;;54016:4;59067:26;;;;:::i;:::-;59060:33;;58997:104;:::o;56874:133::-;13074:13;:11;:13::i;:::-;56982:17:::1;56966:13;:33;;;;;;;;;;;;:::i;:::-;;56874:133:::0;:::o;54030:31::-;;;;:::o;33512:164::-;33609:4;33633:18;:25;33652:5;33633:25;;;;;;;;;;;;;;;:35;33659:8;33633:35;;;;;;;;;;;;;;;;;;;;;;;;;33626:42;;33512:164;;;;:::o;58767:99::-;13074:13;:11;:13::i;:::-;58851:7:::1;58836:12;:22;;;;58767:99:::0;:::o;56618:126::-;13074:13;:11;:13::i;:::-;56721:15:::1;56704:14;:32;;;;;;;;;;;;:::i;:::-;;56618:126:::0;:::o;14094:201::-;13074:13;:11;:13::i;:::-;14203:1:::1;14183:22;;:8;:22;;;;14175:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14259:28;14278:8;14259:18;:28::i;:::-;14094:201:::0;:::o;53623:24::-;;;;;;;;;;;;;:::o;2712:157::-;2797:4;2836:25;2821:40;;;:11;:40;;;;2814:47;;2712:157;;;:::o;13353:132::-;13428:12;:10;:12::i;:::-;13417:23;;:7;:5;:7::i;:::-;:23;;;13409:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13353:132::o;34865:174::-;34922:4;34965:7;34946:15;:13;:15::i;:::-;:26;;:53;;;;;34986:13;;34976:7;:23;34946:53;:85;;;;;35004:11;:20;35016:7;35004:20;;;;;;;;;;;:27;;;;;;;;;;;;35003:28;34946:85;34939:92;;34865:174;;;:::o;11739:98::-;11792:7;11819:10;11812:17;;11739:98;:::o;44087:196::-;44229:2;44202:15;:24;44218:7;44202:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44267:7;44263:2;44247:28;;44256:5;44247:28;;;;;;;;;;;;44087:196;;;:::o;27273:92::-;27329:7;27273:92;:::o;39035:2130::-;39150:35;39188:21;39201:7;39188:12;:21::i;:::-;39150:59;;39248:4;39226:26;;:13;:18;;;:26;;;39222:67;;39261:28;;;;;;;;;;;;;;39222:67;39302:22;39344:4;39328:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;39365:36;39382:4;39388:12;:10;:12::i;:::-;39365:16;:36::i;:::-;39328:73;:126;;;;39442:12;:10;:12::i;:::-;39418:36;;:20;39430:7;39418:11;:20::i;:::-;:36;;;39328:126;39302:153;;39473:17;39468:66;;39499:35;;;;;;;;;;;;;;39468:66;39563:1;39549:16;;:2;:16;;;39545:52;;;39574:23;;;;;;;;;;;;;;39545:52;39610:43;39632:4;39638:2;39642:7;39651:1;39610:21;:43::i;:::-;39718:35;39735:1;39739:7;39748:4;39718:8;:35::i;:::-;40079:1;40049:12;:18;40062:4;40049:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40123:1;40095:12;:16;40108:2;40095:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40141:31;40175:11;:20;40187:7;40175:20;;;;;;;;;;;40141:54;;40226:2;40210:8;:13;;;:18;;;;;;;;;;;;;;;;;;40276:15;40243:8;:23;;;:49;;;;;;;;;;;;;;;;;;40544:19;40576:1;40566:7;:11;40544:33;;40592:31;40626:11;:24;40638:11;40626:24;;;;;;;;;;;40592:58;;40694:1;40669:27;;:8;:13;;;;;;;;;;;;:27;;;40665:384;;;40879:13;;40864:11;:28;40860:174;;40933:4;40917:8;:13;;;:20;;;;;;;;;;;;;;;;;;40986:13;:28;;;40960:8;:23;;;:54;;;;;;;;;;;;;;;;;;40860:174;40665:384;40024:1036;;;41096:7;41092:2;41077:27;;41086:4;41077:27;;;;;;;;;;;;41115:42;41136:4;41142:2;41146:7;41155:1;41115:20;:42::i;:::-;39139:2026;;39035:2130;;;:::o;35123:104::-;35192:27;35202:2;35206:8;35192:27;;;;;;;;;;;;:9;:27::i;:::-;35123:104;;:::o;30009:1111::-;30071:21;;:::i;:::-;30105:12;30120:7;30105:22;;30188:4;30169:15;:13;:15::i;:::-;:23;30165:888;;30205:13;;30198:4;:20;30194:859;;;30239:31;30273:11;:17;30285:4;30273:17;;;;;;;;;;;30239:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30314:9;:16;;;30309:729;;30385:1;30359:28;;:9;:14;;;:28;;;30355:101;;30423:9;30416:16;;;;;;30355:101;30758:261;30765:4;30758:261;;;30798:6;;;;;;;;30843:11;:17;30855:4;30843:17;;;;;;;;;;;30831:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30917:1;30891:28;;:9;:14;;;:28;;;30887:109;;30959:9;30952:16;;;;;;30887:109;30758:261;;;30309:729;30220:833;30194:859;30165:888;31081:31;;;;;;;;;;;;;;30009:1111;;;;:::o;14455:191::-;14529:16;14548:6;;;;;;;;;;;14529:25;;14574:8;14565:6;;:17;;;;;;;;;;;;;;;;;;14629:8;14598:40;;14619:8;14598:40;;;;;;;;;;;;14518:128;14455:191;:::o;15886:326::-;15946:4;16203:1;16181:7;:19;;;:23;16174:30;;15886:326;;;:::o;44775:667::-;44938:4;44975:2;44959:36;;;44996:12;:10;:12::i;:::-;45010:4;45016:7;45025:5;44959:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44955:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45210:1;45193:6;:13;:18;45189:235;;;45239:40;;;;;;;;;;;;;;45189:235;45382:6;45376:13;45367:6;45363:2;45359:15;45352:38;44955:480;45088:45;;;45078:55;;;:6;:55;;;;45071:62;;;44775:667;;;;;;:::o;56498:108::-;56558:13;56591:7;56584:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56498:108;:::o;8993:723::-;9049:13;9279:1;9270:5;:10;9266:53;;;9297:10;;;;;;;;;;;;;;;;;;;;;9266:53;9329:12;9344:5;9329:20;;9360:14;9385:78;9400:1;9392:4;:9;9385:78;;9418:8;;;;;:::i;:::-;;;;9449:2;9441:10;;;;;:::i;:::-;;;9385:78;;;9473:19;9505:6;9495:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9473:39;;9523:154;9539:1;9530:5;:10;9523:154;;9567:1;9557:11;;;;;:::i;:::-;;;9634:2;9626:5;:10;;;;:::i;:::-;9613:2;:24;;;;:::i;:::-;9600:39;;9583:6;9590;9583:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9663:2;9654:11;;;;;:::i;:::-;;;9523:154;;;9701:6;9687:21;;;;;8993:723;;;;:::o;46090:159::-;;;;;:::o;46908:158::-;;;;;:::o;35600:1749::-;35723:20;35746:13;;35723:36;;35788:1;35774:16;;:2;:16;;;35770:48;;;35799:19;;;;;;;;;;;;;;35770:48;35845:1;35833:8;:13;35829:44;;;35855:18;;;;;;;;;;;;;;35829:44;35886:61;35916:1;35920:2;35924:12;35938:8;35886:21;:61::i;:::-;36259:8;36224:12;:16;36237:2;36224:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36323:8;36283:12;:16;36296:2;36283:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36382:2;36349:11;:25;36361:12;36349:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;36449:15;36399:11;:25;36411:12;36399:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;36482:20;36505:12;36482:35;;36532:11;36561:8;36546:12;:23;36532:37;;36590:15;:2;:13;;;:15::i;:::-;36586:631;;;36626:313;36682:12;36678:2;36657:38;;36674:1;36657:38;;;;;;;;;;;;36723:69;36762:1;36766:2;36770:14;;;;;;36786:5;36723:30;:69::i;:::-;36718:174;;36828:40;;;;;;;;;;;;;;36718:174;36934:3;36919:12;:18;36626:313;;37020:12;37003:13;;:29;36999:43;;37034:8;;;36999:43;36586:631;;;37083:119;37139:14;;;;;;37135:2;37114:40;;37131:1;37114:40;;;;;;;;;;;;37197:3;37182:12;:18;37083:119;;36586:631;37247:12;37231:13;:28;;;;36199:1072;;37281:60;37310:1;37314:2;37318:12;37332:8;37281:20;:60::i;:::-;35712:1637;35600:1749;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2317:5;2348:6;2342:13;2333:22;;2364:30;2388:5;2364:30;:::i;:::-;2263:137;;;;:::o;2406:::-;2451:5;2489:6;2476:20;2467:29;;2505:32;2531:5;2505:32;:::i;:::-;2406:137;;;;:::o;2549:141::-;2605:5;2636:6;2630:13;2621:22;;2652:32;2678:5;2652:32;:::i;:::-;2549:141;;;;:::o;2709:338::-;2764:5;2813:3;2806:4;2798:6;2794:17;2790:27;2780:122;;2821:79;;:::i;:::-;2780:122;2938:6;2925:20;2963:78;3037:3;3029:6;3022:4;3014:6;3010:17;2963:78;:::i;:::-;2954:87;;2770:277;2709:338;;;;:::o;3067:340::-;3123:5;3172:3;3165:4;3157:6;3153:17;3149:27;3139:122;;3180:79;;:::i;:::-;3139:122;3297:6;3284:20;3322:79;3397:3;3389:6;3382:4;3374:6;3370:17;3322:79;:::i;:::-;3313:88;;3129:278;3067:340;;;;:::o;3413:139::-;3459:5;3497:6;3484:20;3475:29;;3513:33;3540:5;3513:33;:::i;:::-;3413:139;;;;:::o;3558:329::-;3617:6;3666:2;3654:9;3645:7;3641:23;3637:32;3634:119;;;3672:79;;:::i;:::-;3634:119;3792:1;3817:53;3862:7;3853:6;3842:9;3838:22;3817:53;:::i;:::-;3807:63;;3763:117;3558:329;;;;:::o;3893:474::-;3961:6;3969;4018:2;4006:9;3997:7;3993:23;3989:32;3986:119;;;4024:79;;:::i;:::-;3986:119;4144:1;4169:53;4214:7;4205:6;4194:9;4190:22;4169:53;:::i;:::-;4159:63;;4115:117;4271:2;4297:53;4342:7;4333:6;4322:9;4318:22;4297:53;:::i;:::-;4287:63;;4242:118;3893:474;;;;;:::o;4373:619::-;4450:6;4458;4466;4515:2;4503:9;4494:7;4490:23;4486:32;4483:119;;;4521:79;;:::i;:::-;4483:119;4641:1;4666:53;4711:7;4702:6;4691:9;4687:22;4666:53;:::i;:::-;4656:63;;4612:117;4768:2;4794:53;4839:7;4830:6;4819:9;4815:22;4794:53;:::i;:::-;4784:63;;4739:118;4896:2;4922:53;4967:7;4958:6;4947:9;4943:22;4922:53;:::i;:::-;4912:63;;4867:118;4373:619;;;;;:::o;4998:943::-;5093:6;5101;5109;5117;5166:3;5154:9;5145:7;5141:23;5137:33;5134:120;;;5173:79;;:::i;:::-;5134:120;5293:1;5318:53;5363:7;5354:6;5343:9;5339:22;5318:53;:::i;:::-;5308:63;;5264:117;5420:2;5446:53;5491:7;5482:6;5471:9;5467:22;5446:53;:::i;:::-;5436:63;;5391:118;5548:2;5574:53;5619:7;5610:6;5599:9;5595:22;5574:53;:::i;:::-;5564:63;;5519:118;5704:2;5693:9;5689:18;5676:32;5735:18;5727:6;5724:30;5721:117;;;5757:79;;:::i;:::-;5721:117;5862:62;5916:7;5907:6;5896:9;5892:22;5862:62;:::i;:::-;5852:72;;5647:287;4998:943;;;;;;;:::o;5947:468::-;6012:6;6020;6069:2;6057:9;6048:7;6044:23;6040:32;6037:119;;;6075:79;;:::i;:::-;6037:119;6195:1;6220:53;6265:7;6256:6;6245:9;6241:22;6220:53;:::i;:::-;6210:63;;6166:117;6322:2;6348:50;6390:7;6381:6;6370:9;6366:22;6348:50;:::i;:::-;6338:60;;6293:115;5947:468;;;;;:::o;6421:474::-;6489:6;6497;6546:2;6534:9;6525:7;6521:23;6517:32;6514:119;;;6552:79;;:::i;:::-;6514:119;6672:1;6697:53;6742:7;6733:6;6722:9;6718:22;6697:53;:::i;:::-;6687:63;;6643:117;6799:2;6825:53;6870:7;6861:6;6850:9;6846:22;6825:53;:::i;:::-;6815:63;;6770:118;6421:474;;;;;:::o;6901:619::-;6978:6;6986;6994;7043:2;7031:9;7022:7;7018:23;7014:32;7011:119;;;7049:79;;:::i;:::-;7011:119;7169:1;7194:53;7239:7;7230:6;7219:9;7215:22;7194:53;:::i;:::-;7184:63;;7140:117;7296:2;7322:53;7367:7;7358:6;7347:9;7343:22;7322:53;:::i;:::-;7312:63;;7267:118;7424:2;7450:53;7495:7;7486:6;7475:9;7471:22;7450:53;:::i;:::-;7440:63;;7395:118;6901:619;;;;;:::o;7526:539::-;7610:6;7659:2;7647:9;7638:7;7634:23;7630:32;7627:119;;;7665:79;;:::i;:::-;7627:119;7813:1;7802:9;7798:17;7785:31;7843:18;7835:6;7832:30;7829:117;;;7865:79;;:::i;:::-;7829:117;7970:78;8040:7;8031:6;8020:9;8016:22;7970:78;:::i;:::-;7960:88;;7756:302;7526:539;;;;:::o;8071:345::-;8138:6;8187:2;8175:9;8166:7;8162:23;8158:32;8155:119;;;8193:79;;:::i;:::-;8155:119;8313:1;8338:61;8391:7;8382:6;8371:9;8367:22;8338:61;:::i;:::-;8328:71;;8284:125;8071:345;;;;:::o;8422:327::-;8480:6;8529:2;8517:9;8508:7;8504:23;8500:32;8497:119;;;8535:79;;:::i;:::-;8497:119;8655:1;8680:52;8724:7;8715:6;8704:9;8700:22;8680:52;:::i;:::-;8670:62;;8626:116;8422:327;;;;:::o;8755:349::-;8824:6;8873:2;8861:9;8852:7;8848:23;8844:32;8841:119;;;8879:79;;:::i;:::-;8841:119;8999:1;9024:63;9079:7;9070:6;9059:9;9055:22;9024:63;:::i;:::-;9014:73;;8970:127;8755:349;;;;:::o;9110:509::-;9179:6;9228:2;9216:9;9207:7;9203:23;9199:32;9196:119;;;9234:79;;:::i;:::-;9196:119;9382:1;9371:9;9367:17;9354:31;9412:18;9404:6;9401:30;9398:117;;;9434:79;;:::i;:::-;9398:117;9539:63;9594:7;9585:6;9574:9;9570:22;9539:63;:::i;:::-;9529:73;;9325:287;9110:509;;;;:::o;9625:329::-;9684:6;9733:2;9721:9;9712:7;9708:23;9704:32;9701:119;;;9739:79;;:::i;:::-;9701:119;9859:1;9884:53;9929:7;9920:6;9909:9;9905:22;9884:53;:::i;:::-;9874:63;;9830:117;9625:329;;;;:::o;9960:654::-;10038:6;10046;10095:2;10083:9;10074:7;10070:23;10066:32;10063:119;;;10101:79;;:::i;:::-;10063:119;10221:1;10246:53;10291:7;10282:6;10271:9;10267:22;10246:53;:::i;:::-;10236:63;;10192:117;10376:2;10365:9;10361:18;10348:32;10407:18;10399:6;10396:30;10393:117;;;10429:79;;:::i;:::-;10393:117;10534:63;10589:7;10580:6;10569:9;10565:22;10534:63;:::i;:::-;10524:73;;10319:288;9960:654;;;;;:::o;10620:303::-;10751:10;10772:108;10876:3;10868:6;10772:108;:::i;:::-;10912:4;10907:3;10903:14;10889:28;;10620:303;;;;:::o;10929:179::-;10998:10;11019:46;11061:3;11053:6;11019:46;:::i;:::-;11097:4;11092:3;11088:14;11074:28;;10929:179;;;;:::o;11114:108::-;11191:24;11209:5;11191:24;:::i;:::-;11186:3;11179:37;11114:108;;:::o;11228:118::-;11315:24;11333:5;11315:24;:::i;:::-;11310:3;11303:37;11228:118;;:::o;11428:980::-;11609:3;11638:85;11717:5;11638:85;:::i;:::-;11739:117;11849:6;11844:3;11739:117;:::i;:::-;11732:124;;11880:87;11961:5;11880:87;:::i;:::-;11990:7;12021:1;12006:377;12031:6;12028:1;12025:13;12006:377;;;12107:6;12101:13;12134:125;12255:3;12240:13;12134:125;:::i;:::-;12127:132;;12282:91;12366:6;12282:91;:::i;:::-;12272:101;;12066:317;12053:1;12050;12046:9;12041:14;;12006:377;;;12010:14;12399:3;12392:10;;11614:794;;;11428:980;;;;:::o;12444:732::-;12563:3;12592:54;12640:5;12592:54;:::i;:::-;12662:86;12741:6;12736:3;12662:86;:::i;:::-;12655:93;;12772:56;12822:5;12772:56;:::i;:::-;12851:7;12882:1;12867:284;12892:6;12889:1;12886:13;12867:284;;;12968:6;12962:13;12995:63;13054:3;13039:13;12995:63;:::i;:::-;12988:70;;13081:60;13134:6;13081:60;:::i;:::-;13071:70;;12927:224;12914:1;12911;12907:9;12902:14;;12867:284;;;12871:14;13167:3;13160:10;;12568:608;;;12444:732;;;;:::o;13182:99::-;13253:21;13268:5;13253:21;:::i;:::-;13248:3;13241:34;13182:99;;:::o;13287:109::-;13368:21;13383:5;13368:21;:::i;:::-;13363:3;13356:34;13287:109;;:::o;13402:360::-;13488:3;13516:38;13548:5;13516:38;:::i;:::-;13570:70;13633:6;13628:3;13570:70;:::i;:::-;13563:77;;13649:52;13694:6;13689:3;13682:4;13675:5;13671:16;13649:52;:::i;:::-;13726:29;13748:6;13726:29;:::i;:::-;13721:3;13717:39;13710:46;;13492:270;13402:360;;;;:::o;13768:364::-;13856:3;13884:39;13917:5;13884:39;:::i;:::-;13939:71;14003:6;13998:3;13939:71;:::i;:::-;13932:78;;14019:52;14064:6;14059:3;14052:4;14045:5;14041:16;14019:52;:::i;:::-;14096:29;14118:6;14096:29;:::i;:::-;14091:3;14087:39;14080:46;;13860:272;13768:364;;;;:::o;14138:377::-;14244:3;14272:39;14305:5;14272:39;:::i;:::-;14327:89;14409:6;14404:3;14327:89;:::i;:::-;14320:96;;14425:52;14470:6;14465:3;14458:4;14451:5;14447:16;14425:52;:::i;:::-;14502:6;14497:3;14493:16;14486:23;;14248:267;14138:377;;;;:::o;14545:845::-;14648:3;14685:5;14679:12;14714:36;14740:9;14714:36;:::i;:::-;14766:89;14848:6;14843:3;14766:89;:::i;:::-;14759:96;;14886:1;14875:9;14871:17;14902:1;14897:137;;;;15048:1;15043:341;;;;14864:520;;14897:137;14981:4;14977:9;14966;14962:25;14957:3;14950:38;15017:6;15012:3;15008:16;15001:23;;14897:137;;15043:341;15110:38;15142:5;15110:38;:::i;:::-;15170:1;15184:154;15198:6;15195:1;15192:13;15184:154;;;15272:7;15266:14;15262:1;15257:3;15253:11;15246:35;15322:1;15313:7;15309:15;15298:26;;15220:4;15217:1;15213:12;15208:17;;15184:154;;;15367:6;15362:3;15358:16;15351:23;;15050:334;;14864:520;;14652:738;;14545:845;;;;:::o;15396:366::-;15538:3;15559:67;15623:2;15618:3;15559:67;:::i;:::-;15552:74;;15635:93;15724:3;15635:93;:::i;:::-;15753:2;15748:3;15744:12;15737:19;;15396:366;;;:::o;15768:::-;15910:3;15931:67;15995:2;15990:3;15931:67;:::i;:::-;15924:74;;16007:93;16096:3;16007:93;:::i;:::-;16125:2;16120:3;16116:12;16109:19;;15768:366;;;:::o;16140:::-;16282:3;16303:67;16367:2;16362:3;16303:67;:::i;:::-;16296:74;;16379:93;16468:3;16379:93;:::i;:::-;16497:2;16492:3;16488:12;16481:19;;16140:366;;;:::o;16512:::-;16654:3;16675:67;16739:2;16734:3;16675:67;:::i;:::-;16668:74;;16751:93;16840:3;16751:93;:::i;:::-;16869:2;16864:3;16860:12;16853:19;;16512:366;;;:::o;16884:398::-;17043:3;17064:83;17145:1;17140:3;17064:83;:::i;:::-;17057:90;;17156:93;17245:3;17156:93;:::i;:::-;17274:1;17269:3;17265:11;17258:18;;16884:398;;;:::o;17288:366::-;17430:3;17451:67;17515:2;17510:3;17451:67;:::i;:::-;17444:74;;17527:93;17616:3;17527:93;:::i;:::-;17645:2;17640:3;17636:12;17629:19;;17288:366;;;:::o;17660:::-;17802:3;17823:67;17887:2;17882:3;17823:67;:::i;:::-;17816:74;;17899:93;17988:3;17899:93;:::i;:::-;18017:2;18012:3;18008:12;18001:19;;17660:366;;;:::o;18032:::-;18174:3;18195:67;18259:2;18254:3;18195:67;:::i;:::-;18188:74;;18271:93;18360:3;18271:93;:::i;:::-;18389:2;18384:3;18380:12;18373:19;;18032:366;;;:::o;18476:687::-;18625:4;18620:3;18616:14;18712:4;18705:5;18701:16;18695:23;18731:63;18788:4;18783:3;18779:14;18765:12;18731:63;:::i;:::-;18640:164;18896:4;18889:5;18885:16;18879:23;18915:61;18970:4;18965:3;18961:14;18947:12;18915:61;:::i;:::-;18814:172;19070:4;19063:5;19059:16;19053:23;19089:57;19140:4;19135:3;19131:14;19117:12;19089:57;:::i;:::-;18996:160;18594:569;18476:687;;:::o;19241:697::-;19400:4;19395:3;19391:14;19487:4;19480:5;19476:16;19470:23;19506:63;19563:4;19558:3;19554:14;19540:12;19506:63;:::i;:::-;19415:164;19671:4;19664:5;19660:16;19654:23;19690:61;19745:4;19740:3;19736:14;19722:12;19690:61;:::i;:::-;19589:172;19845:4;19838:5;19834:16;19828:23;19864:57;19915:4;19910:3;19906:14;19892:12;19864:57;:::i;:::-;19771:160;19369:569;19241:697;;:::o;19944:108::-;20021:24;20039:5;20021:24;:::i;:::-;20016:3;20009:37;19944:108;;:::o;20058:118::-;20145:24;20163:5;20145:24;:::i;:::-;20140:3;20133:37;20058:118;;:::o;20182:105::-;20257:23;20274:5;20257:23;:::i;:::-;20252:3;20245:36;20182:105;;:::o;20293:435::-;20473:3;20495:95;20586:3;20577:6;20495:95;:::i;:::-;20488:102;;20607:95;20698:3;20689:6;20607:95;:::i;:::-;20600:102;;20719:3;20712:10;;20293:435;;;;;:::o;20734:589::-;20959:3;20981:95;21072:3;21063:6;20981:95;:::i;:::-;20974:102;;21093:95;21184:3;21175:6;21093:95;:::i;:::-;21086:102;;21205:92;21293:3;21284:6;21205:92;:::i;:::-;21198:99;;21314:3;21307:10;;20734:589;;;;;;:::o;21329:379::-;21513:3;21535:147;21678:3;21535:147;:::i;:::-;21528:154;;21699:3;21692:10;;21329:379;;;:::o;21714:222::-;21807:4;21845:2;21834:9;21830:18;21822:26;;21858:71;21926:1;21915:9;21911:17;21902:6;21858:71;:::i;:::-;21714:222;;;;:::o;21942:640::-;22137:4;22175:3;22164:9;22160:19;22152:27;;22189:71;22257:1;22246:9;22242:17;22233:6;22189:71;:::i;:::-;22270:72;22338:2;22327:9;22323:18;22314:6;22270:72;:::i;:::-;22352;22420:2;22409:9;22405:18;22396:6;22352:72;:::i;:::-;22471:9;22465:4;22461:20;22456:2;22445:9;22441:18;22434:48;22499:76;22570:4;22561:6;22499:76;:::i;:::-;22491:84;;21942:640;;;;;;;:::o;22588:423::-;22729:4;22767:2;22756:9;22752:18;22744:26;;22780:71;22848:1;22837:9;22833:17;22824:6;22780:71;:::i;:::-;22898:9;22892:4;22888:20;22883:2;22872:9;22868:18;22861:48;22926:78;22999:4;22990:6;22926:78;:::i;:::-;22918:86;;22588:423;;;;;:::o;23017:497::-;23222:4;23260:2;23249:9;23245:18;23237:26;;23309:9;23303:4;23299:20;23295:1;23284:9;23280:17;23273:47;23337:170;23502:4;23493:6;23337:170;:::i;:::-;23329:178;;23017:497;;;;:::o;23520:373::-;23663:4;23701:2;23690:9;23686:18;23678:26;;23750:9;23744:4;23740:20;23736:1;23725:9;23721:17;23714:47;23778:108;23881:4;23872:6;23778:108;:::i;:::-;23770:116;;23520:373;;;;:::o;23899:210::-;23986:4;24024:2;24013:9;24009:18;24001:26;;24037:65;24099:1;24088:9;24084:17;24075:6;24037:65;:::i;:::-;23899:210;;;;:::o;24115:313::-;24228:4;24266:2;24255:9;24251:18;24243:26;;24315:9;24309:4;24305:20;24301:1;24290:9;24286:17;24279:47;24343:78;24416:4;24407:6;24343:78;:::i;:::-;24335:86;;24115:313;;;;:::o;24434:419::-;24600:4;24638:2;24627:9;24623:18;24615:26;;24687:9;24681:4;24677:20;24673:1;24662:9;24658:17;24651:47;24715:131;24841:4;24715:131;:::i;:::-;24707:139;;24434:419;;;:::o;24859:::-;25025:4;25063:2;25052:9;25048:18;25040:26;;25112:9;25106:4;25102:20;25098:1;25087:9;25083:17;25076:47;25140:131;25266:4;25140:131;:::i;:::-;25132:139;;24859:419;;;:::o;25284:::-;25450:4;25488:2;25477:9;25473:18;25465:26;;25537:9;25531:4;25527:20;25523:1;25512:9;25508:17;25501:47;25565:131;25691:4;25565:131;:::i;:::-;25557:139;;25284:419;;;:::o;25709:::-;25875:4;25913:2;25902:9;25898:18;25890:26;;25962:9;25956:4;25952:20;25948:1;25937:9;25933:17;25926:47;25990:131;26116:4;25990:131;:::i;:::-;25982:139;;25709:419;;;:::o;26134:::-;26300:4;26338:2;26327:9;26323:18;26315:26;;26387:9;26381:4;26377:20;26373:1;26362:9;26358:17;26351:47;26415:131;26541:4;26415:131;:::i;:::-;26407:139;;26134:419;;;:::o;26559:::-;26725:4;26763:2;26752:9;26748:18;26740:26;;26812:9;26806:4;26802:20;26798:1;26787:9;26783:17;26776:47;26840:131;26966:4;26840:131;:::i;:::-;26832:139;;26559:419;;;:::o;26984:::-;27150:4;27188:2;27177:9;27173:18;27165:26;;27237:9;27231:4;27227:20;27223:1;27212:9;27208:17;27201:47;27265:131;27391:4;27265:131;:::i;:::-;27257:139;;26984:419;;;:::o;27409:346::-;27564:4;27602:2;27591:9;27587:18;27579:26;;27615:133;27745:1;27734:9;27730:17;27721:6;27615:133;:::i;:::-;27409:346;;;;:::o;27761:222::-;27854:4;27892:2;27881:9;27877:18;27869:26;;27905:71;27973:1;27962:9;27958:17;27949:6;27905:71;:::i;:::-;27761:222;;;;:::o;27989:129::-;28023:6;28050:20;;:::i;:::-;28040:30;;28079:33;28107:4;28099:6;28079:33;:::i;:::-;27989:129;;;:::o;28124:75::-;28157:6;28190:2;28184:9;28174:19;;28124:75;:::o;28205:311::-;28282:4;28372:18;28364:6;28361:30;28358:56;;;28394:18;;:::i;:::-;28358:56;28444:4;28436:6;28432:17;28424:25;;28504:4;28498;28494:15;28486:23;;28205:311;;;:::o;28522:307::-;28583:4;28673:18;28665:6;28662:30;28659:56;;;28695:18;;:::i;:::-;28659:56;28733:29;28755:6;28733:29;:::i;:::-;28725:37;;28817:4;28811;28807:15;28799:23;;28522:307;;;:::o;28835:308::-;28897:4;28987:18;28979:6;28976:30;28973:56;;;29009:18;;:::i;:::-;28973:56;29047:29;29069:6;29047:29;:::i;:::-;29039:37;;29131:4;29125;29121:15;29113:23;;28835:308;;;:::o;29149:163::-;29247:4;29270:3;29262:11;;29300:4;29295:3;29291:14;29283:22;;29149:163;;;:::o;29318:132::-;29385:4;29408:3;29400:11;;29438:4;29433:3;29429:14;29421:22;;29318:132;;;:::o;29456:141::-;29505:4;29528:3;29520:11;;29551:3;29548:1;29541:14;29585:4;29582:1;29572:18;29564:26;;29456:141;;;:::o;29603:145::-;29701:6;29735:5;29729:12;29719:22;;29603:145;;;:::o;29754:114::-;29821:6;29855:5;29849:12;29839:22;;29754:114;;;:::o;29874:98::-;29925:6;29959:5;29953:12;29943:22;;29874:98;;;:::o;29978:99::-;30030:6;30064:5;30058:12;30048:22;;29978:99;;;:::o;30083:144::-;30184:4;30216;30211:3;30207:14;30199:22;;30083:144;;;:::o;30233:113::-;30303:4;30335;30330:3;30326:14;30318:22;;30233:113;;;:::o;30352:215::-;30482:11;30516:6;30511:3;30504:19;30556:4;30551:3;30547:14;30532:29;;30352:215;;;;:::o;30573:184::-;30672:11;30706:6;30701:3;30694:19;30746:4;30741:3;30737:14;30722:29;;30573:184;;;;:::o;30763:168::-;30846:11;30880:6;30875:3;30868:19;30920:4;30915:3;30911:14;30896:29;;30763:168;;;;:::o;30937:147::-;31038:11;31075:3;31060:18;;30937:147;;;;:::o;31090:169::-;31174:11;31208:6;31203:3;31196:19;31248:4;31243:3;31239:14;31224:29;;31090:169;;;;:::o;31265:148::-;31367:11;31404:3;31389:18;;31265:148;;;;:::o;31419:305::-;31459:3;31478:20;31496:1;31478:20;:::i;:::-;31473:25;;31512:20;31530:1;31512:20;:::i;:::-;31507:25;;31666:1;31598:66;31594:74;31591:1;31588:81;31585:107;;;31672:18;;:::i;:::-;31585:107;31716:1;31713;31709:9;31702:16;;31419:305;;;;:::o;31730:185::-;31770:1;31787:20;31805:1;31787:20;:::i;:::-;31782:25;;31821:20;31839:1;31821:20;:::i;:::-;31816:25;;31860:1;31850:35;;31865:18;;:::i;:::-;31850:35;31907:1;31904;31900:9;31895:14;;31730:185;;;;:::o;31921:348::-;31961:7;31984:20;32002:1;31984:20;:::i;:::-;31979:25;;32018:20;32036:1;32018:20;:::i;:::-;32013:25;;32206:1;32138:66;32134:74;32131:1;32128:81;32123:1;32116:9;32109:17;32105:105;32102:131;;;32213:18;;:::i;:::-;32102:131;32261:1;32258;32254:9;32243:20;;31921:348;;;;:::o;32275:191::-;32315:4;32335:20;32353:1;32335:20;:::i;:::-;32330:25;;32369:20;32387:1;32369:20;:::i;:::-;32364:25;;32408:1;32405;32402:8;32399:34;;;32413:18;;:::i;:::-;32399:34;32458:1;32455;32451:9;32443:17;;32275:191;;;;:::o;32472:96::-;32509:7;32538:24;32556:5;32538:24;:::i;:::-;32527:35;;32472:96;;;:::o;32574:90::-;32608:7;32651:5;32644:13;32637:21;32626:32;;32574:90;;;:::o;32670:149::-;32706:7;32746:66;32739:5;32735:78;32724:89;;32670:149;;;:::o;32825:126::-;32862:7;32902:42;32895:5;32891:54;32880:65;;32825:126;;;:::o;32957:77::-;32994:7;33023:5;33012:16;;32957:77;;;:::o;33040:101::-;33076:7;33116:18;33109:5;33105:30;33094:41;;33040:101;;;:::o;33147:154::-;33231:6;33226:3;33221;33208:30;33293:1;33284:6;33279:3;33275:16;33268:27;33147:154;;;:::o;33307:307::-;33375:1;33385:113;33399:6;33396:1;33393:13;33385:113;;;33484:1;33479:3;33475:11;33469:18;33465:1;33460:3;33456:11;33449:39;33421:2;33418:1;33414:10;33409:15;;33385:113;;;33516:6;33513:1;33510:13;33507:101;;;33596:1;33587:6;33582:3;33578:16;33571:27;33507:101;33356:258;33307:307;;;:::o;33620:320::-;33664:6;33701:1;33695:4;33691:12;33681:22;;33748:1;33742:4;33738:12;33769:18;33759:81;;33825:4;33817:6;33813:17;33803:27;;33759:81;33887:2;33879:6;33876:14;33856:18;33853:38;33850:84;;;33906:18;;:::i;:::-;33850:84;33671:269;33620:320;;;:::o;33946:281::-;34029:27;34051:4;34029:27;:::i;:::-;34021:6;34017:40;34159:6;34147:10;34144:22;34123:18;34111:10;34108:34;34105:62;34102:88;;;34170:18;;:::i;:::-;34102:88;34210:10;34206:2;34199:22;33989:238;33946:281;;:::o;34233:233::-;34272:3;34295:24;34313:5;34295:24;:::i;:::-;34286:33;;34341:66;34334:5;34331:77;34328:103;;;34411:18;;:::i;:::-;34328:103;34458:1;34451:5;34447:13;34440:20;;34233:233;;;:::o;34472:176::-;34504:1;34521:20;34539:1;34521:20;:::i;:::-;34516:25;;34555:20;34573:1;34555:20;:::i;:::-;34550:25;;34594:1;34584:35;;34599:18;;:::i;:::-;34584:35;34640:1;34637;34633:9;34628:14;;34472:176;;;;:::o;34654:180::-;34702:77;34699:1;34692:88;34799:4;34796:1;34789:15;34823:4;34820:1;34813:15;34840:180;34888:77;34885:1;34878:88;34985:4;34982:1;34975:15;35009:4;35006:1;34999:15;35026:180;35074:77;35071:1;35064:88;35171:4;35168:1;35161:15;35195:4;35192:1;35185:15;35212:180;35260:77;35257:1;35250:88;35357:4;35354:1;35347:15;35381:4;35378:1;35371:15;35398:180;35446:77;35443:1;35436:88;35543:4;35540:1;35533:15;35567:4;35564:1;35557:15;35584:117;35693:1;35690;35683:12;35707:117;35816:1;35813;35806:12;35830:117;35939:1;35936;35929:12;35953:117;36062:1;36059;36052:12;36076:117;36185:1;36182;36175:12;36199:102;36240:6;36291:2;36287:7;36282:2;36275:5;36271:14;36267:28;36257:38;;36199:102;;;:::o;36307:225::-;36447:34;36443:1;36435:6;36431:14;36424:58;36516:8;36511:2;36503:6;36499:15;36492:33;36307:225;:::o;36538:179::-;36678:31;36674:1;36666:6;36662:14;36655:55;36538:179;:::o;36723:182::-;36863:34;36859:1;36851:6;36847:14;36840:58;36723:182;:::o;36911:234::-;37051:34;37047:1;37039:6;37035:14;37028:58;37120:17;37115:2;37107:6;37103:15;37096:42;36911:234;:::o;37151:114::-;;:::o;37271:171::-;37411:23;37407:1;37399:6;37395:14;37388:47;37271:171;:::o;37448:::-;37588:23;37584:1;37576:6;37572:14;37565:47;37448:171;:::o;37625:::-;37765:23;37761:1;37753:6;37749:14;37742:47;37625:171;:::o;37802:122::-;37875:24;37893:5;37875:24;:::i;:::-;37868:5;37865:35;37855:63;;37914:1;37911;37904:12;37855:63;37802:122;:::o;37930:116::-;38000:21;38015:5;38000:21;:::i;:::-;37993:5;37990:32;37980:60;;38036:1;38033;38026:12;37980:60;37930:116;:::o;38052:120::-;38124:23;38141:5;38124:23;:::i;:::-;38117:5;38114:34;38104:62;;38162:1;38159;38152:12;38104:62;38052:120;:::o;38178:122::-;38251:24;38269:5;38251:24;:::i;:::-;38244:5;38241:35;38231:63;;38290:1;38287;38280:12;38231:63;38178:122;:::o

Swarm Source

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