ETH Price: $3,445.08 (-1.12%)

Token

Pandies (P)
 

Overview

Max Total Supply

10,000 P

Holders

6,121

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
*0️⃣-3️⃣-0️⃣.eth
Balance
1 P
0xbab6defc57704da6797ca735a89ef6614cae6d93
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:
Pandies

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-07-04
*/

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

/*
░░░░░░░░▄██▄░░░░░░▄▄░░
░░░░░░░▐███▀░░░░░▄███▌
░░▄▀░░▄█▀▀░░░░░░░░▀██░
░█░░░██░░░░░░░░░░░░░░░
█▌░░▐██░░▄██▌░░▄▄▄░░░▄
██░░▐██▄░▀█▀░░░▀██░░▐▌
██▄░▐███▄▄░░▄▄▄░▀▀░▄██
▐███▄██████▄░▀░▄█████▌
▐████████████▀▀██████░
░▐████▀██████░░█████░░
░░░▀▀▀░░█████▌░████▀░░
░░░░░░░░░▀▀███░▀▀▀░░░░ 

*/



pragma solidity ^0.8.0;




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



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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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



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

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

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

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

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

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

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

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


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

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) 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() override public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

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



    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) override external view returns (uint256) {
        uint256 currCount = 0;
        uint256 currSupply = _currentIndex;
        bool counting = false; 
        TokenOwnership memory ownership; 
        unchecked {
            for (uint256 i = _startTokenId(); i < currSupply; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if(ownership.addr == owner) {
                    counting = true; 
                    currCount++;
                } else if(ownership.addr == address(0)) {
                    if(counting) currCount++;
                } else {
                    counting = false; 
                }
                if(counting && index == (currCount - 1)) {
                    return i; 
                }
            }
        }
        revert OwnerIndexOutOfBounds();
    }

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


    /**
     * @dev Returns the tokenIds of the address. O(totalSupply) in complexity.
     */
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        uint256 holdingAmount = balanceOf(owner);
        uint256 currSupply = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        uint256[] memory list = new uint256[](holdingAmount);

        unchecked {
            for (uint256 i = _startTokenId(); i < currSupply; ++i) {
                TokenOwnership memory ownership = _ownerships[i];

                if (ownership.burned) {
                    continue;
                }

                // Find out who owns this sequence
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }

                // Append tokens the last found owner owns in the sequence
                if (currOwnershipAddr == owner) {
                    list[tokenIdsIdx++] = i;
                }

                // All tokens have been found, we don't need to keep searching
                if (tokenIdsIdx == holdingAmount) {
                    break;
                }
            }
        }

        return list;
    }



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

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

        if (_msgSender() != owner && !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() && !_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;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) 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 (safe && 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 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 This is 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 {}
}


abstract contract PixieJars {
    function balanceOf(address owner) public view virtual returns (uint256);
}

contract Pandies is ERC721A, Ownable {

    // Minting Variables
    uint256 public maxPerWalletNonHolder = 1;
    uint256 public maxPerWalletHolder = 2;
    uint256 public holderReserve = 3500;
    uint256 constant public maxSupply = 10000;
    PixieJars pjContract = PixieJars(0xeA508034fCC8eefF24bF43effe42621008359A2E);

    mapping(address => uint256) public mintedPerWallet;

    // Sale Status
    bool public saleIsActive = false;

    // Metadata
    string _baseTokenURI = "";
    string _prerevealTokenURI = "";
    string _contractURI = "";
    bool public locked = false;
    bool public revealed = false;

    // Events
    event SaleActivation(bool isActive);
  
    constructor() ERC721A("Pandies", "P") {
    }

    function mint() external {
        require(saleIsActive, "SALE_INACTIVE");
        
        bool pjHolder = (pjContract.balanceOf(msg.sender) > 0);
        uint256 _count = (pjHolder ? maxPerWalletHolder : maxPerWalletNonHolder);
        uint256 _minted = mintedPerWallet[msg.sender];

        require(_minted < _count, "MAX PER WALLET REACHED");
        
        if(_minted > 0) { _count -= _minted; }
        if(totalSupply() < maxSupply && totalSupply() + _count > maxSupply) { _count = maxSupply - totalSupply(); }

        require(
            totalSupply() + _count + (pjHolder ? 0 : holderReserve) <= maxSupply,
            "SOLD_OUT"
        );

        _safeMint(msg.sender, _count);
        mintedPerWallet[msg.sender] = _minted + _count;
        if(pjHolder) { if(holderReserve > _count) { holderReserve -= _count; } else { holderReserve = 0; } }
    }

    function airdrop(address[] calldata recipients, uint256[] calldata count) external onlyOwner {
        require(recipients.length == count.length, "Array length mismatch");
        uint256 totalCount = 0;
        for(uint256 i = 0;i < count.length;i++) {
            totalCount += count[i];
        }
        require(
            totalSupply() + totalCount <= maxSupply,
            "SOLD_OUT"
        );
        
        for(uint256 i = 0;i < recipients.length;i++) {
            _safeMint(recipients[i], count[i]);
        }
    }


    function toggleSaleStatus() external onlyOwner {
        saleIsActive = !saleIsActive;
        emit SaleActivation(saleIsActive);
    }

    function setMaxPerWalletNonHolder(uint256 _max) external onlyOwner {
        maxPerWalletNonHolder = _max;
    }

    function setMaxPerWalletHolder(uint256 _max) external onlyOwner {
        maxPerWalletHolder = _max;
    }

    function setHolderReserve(uint256 _reserve) external onlyOwner {
        holderReserve = _reserve;
    }
    
    function lockMetadata() external onlyOwner {
        locked = true;
    }
    
    function toggleRevealed() external onlyOwner {
        revealed = !revealed;
    }

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }


    function getWalletOfOwner(address owner) external view returns (uint256[] memory) {
        unchecked {
            uint256[] memory a = new uint256[](balanceOf(owner));
            uint256 end = _currentIndex;
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            for (uint256 i; i < end; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    a[tokenIdsIdx++] = i;
                }
            }
            return a;
        }
    }

    function setBaseURI(string memory baseURI) external onlyOwner {
        require(!locked, "METADATA_LOCKED");
        _baseTokenURI = baseURI;
    }

    function setPrerevealURI(string memory prerevealURI) external onlyOwner {
        require(!locked, "METADATA_LOCKED");
        _prerevealTokenURI = prerevealURI;
    }

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

    function setContractURI(string memory mContractURI) external onlyOwner {
        _contractURI = mContractURI;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory){
        if(!revealed) { return _prerevealTokenURI; }
        return string(abi.encodePacked(super.tokenURI(tokenId), ".json"));
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SaleActivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getWalletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderReserve","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":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletNonHolder","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"mContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserve","type":"uint256"}],"name":"setHolderReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxPerWalletHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxPerWalletNonHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prerevealURI","type":"string"}],"name":"setPrerevealURI","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":[],"name":"toggleRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","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"}]

608060405260016009556002600a55610dac600b5573ea508034fcc8eeff24bf43effe42621008359a2e600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e60006101000a81548160ff02191690831515021790555060405180602001604052806000815250600f9080519060200190620000ab929190620002f3565b506040518060200160405280600081525060109080519060200190620000d3929190620002f3565b506040518060200160405280600081525060119080519060200190620000fb929190620002f3565b506000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055503480156200013f57600080fd5b506040518060400160405280600781526020017f50616e64696573000000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f50000000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001c4929190620002f3565b508060039080519060200190620001dd929190620002f3565b50620001ee6200021c60201b60201c565b6000819055505050620002166200020a6200022560201b60201c565b6200022d60201b60201c565b62000408565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200030190620003a3565b90600052602060002090601f01602090048101928262000325576000855562000371565b82601f106200034057805160ff191683800117855562000371565b8280016001018555821562000371579182015b828111156200037057825182559160200191906001019062000353565b5b50905062000380919062000384565b5090565b5b808211156200039f57600081600090555060010162000385565b5090565b60006002820490506001821680620003bc57607f821691505b60208210811415620003d357620003d2620003d9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61472c80620004186000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80636352211e11610146578063a22cb465116100c3578063dc63e90811610087578063dc63e908146106c1578063de3ebae6146106df578063e8a3d485146106fb578063e985e9c514610719578063eb8d244414610749578063f2fde38b146107675761025e565b8063a22cb4651461061d578063b88d4fde14610639578063c87b56dd14610655578063cf30901214610685578063d5abeb01146106a35761025e565b80638462151c1161010a5780638462151c1461058b5780638da5cb5b146105bb578063938e3d7b146105d957806395d89b41146105f5578063989bdbb6146106135761025e565b80636352211e146104e9578063672434821461051957806370a0823114610535578063715018a61461056557806373ed8f761461056f5761025e565b80632f745c59116101df57806351830227116101a35780635183022714610439578063524124911461045757806355f804b3146104755780635bc020bc146104915780635c47c0881461049b578063627fdeab146104b95761025e565b80632f745c59146103835780633a602b4d146103b35780633ccfd60b146103e357806342842e0e146103ed5780634f6ccce7146104095761025e565b8063081812fc11610226578063081812fc146102f3578063095ea7b3146103235780631249c58b1461033f57806318160ddd1461034957806323b872dd146103675761025e565b806301ffc9a714610263578063049c5c491461029357806306fdde031461029d57806307391ba5146102bb578063078eef28146102d7575b600080fd5b61027d60048036038101906102789190613b50565b610783565b60405161028a9190613f89565b60405180910390f35b61029b6108cd565b005b6102a56109bb565b6040516102b29190613fa4565b60405180910390f35b6102d560048036038101906102d09190613bf3565b610a4d565b005b6102f160048036038101906102ec9190613baa565b610ad3565b005b61030d60048036038101906103089190613bf3565b610bb9565b60405161031a9190613f00565b60405180910390f35b61033d60048036038101906103389190613a8f565b610c35565b005b610347610d40565b005b610351611042565b60405161035e91906140a6565b60405180910390f35b610381600480360381019061037c9190613979565b611059565b005b61039d60048036038101906103989190613a8f565b611069565b6040516103aa91906140a6565b60405180910390f35b6103cd60048036038101906103c8919061390c565b611269565b6040516103da91906140a6565b60405180910390f35b6103eb611281565b005b61040760048036038101906104029190613979565b61134d565b005b610423600480360381019061041e9190613bf3565b61136d565b60405161043091906140a6565b60405180910390f35b610441611377565b60405161044e9190613f89565b60405180910390f35b61045f61138a565b60405161046c91906140a6565b60405180910390f35b61048f600480360381019061048a9190613baa565b611390565b005b610499611476565b005b6104a361151e565b6040516104b091906140a6565b60405180910390f35b6104d360048036038101906104ce919061390c565b611524565b6040516104e09190613f67565b60405180910390f35b61050360048036038101906104fe9190613bf3565b61171b565b6040516105109190613f00565b60405180910390f35b610533600480360381019061052e9190613acf565b611731565b005b61054f600480360381019061054a919061390c565b611909565b60405161055c91906140a6565b60405180910390f35b61056d6119d9565b005b61058960048036038101906105849190613bf3565b611a61565b005b6105a560048036038101906105a0919061390c565b611ae7565b6040516105b29190613f67565b60405180910390f35b6105c3611cfa565b6040516105d09190613f00565b60405180910390f35b6105f360048036038101906105ee9190613baa565b611d24565b005b6105fd611dba565b60405161060a9190613fa4565b60405180910390f35b61061b611e4c565b005b61063760048036038101906106329190613a4f565b611ee5565b005b610653600480360381019061064e91906139cc565b61205d565b005b61066f600480360381019061066a9190613bf3565b6120d9565b60405161067c9190613fa4565b60405180910390f35b61068d6121b1565b60405161069a9190613f89565b60405180910390f35b6106ab6121c4565b6040516106b891906140a6565b60405180910390f35b6106c96121ca565b6040516106d691906140a6565b60405180910390f35b6106f960048036038101906106f49190613bf3565b6121d0565b005b610703612256565b6040516107109190613fa4565b60405180910390f35b610733600480360381019061072e9190613939565b6122e8565b6040516107409190613f89565b60405180910390f35b61075161237c565b60405161075e9190613f89565b60405180910390f35b610781600480360381019061077c919061390c565b61238f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c657506108c582612487565b5b9050919050565b6108d56124f1565b73ffffffffffffffffffffffffffffffffffffffff166108f3611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090614086565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600e60009054906101000a900460ff166040516109b19190613f89565b60405180910390a1565b6060600280546109ca90614335565b80601f01602080910402602001604051908101604052809291908181526020018280546109f690614335565b8015610a435780601f10610a1857610100808354040283529160200191610a43565b820191906000526020600020905b815481529060010190602001808311610a2657829003601f168201915b5050505050905090565b610a556124f1565b73ffffffffffffffffffffffffffffffffffffffff16610a73611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac090614086565b60405180910390fd5b80600b8190555050565b610adb6124f1565b73ffffffffffffffffffffffffffffffffffffffff16610af9611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690614086565b60405180910390fd5b601260009054906101000a900460ff1615610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690614026565b60405180910390fd5b8060109080519060200190610bb592919061361c565b5050565b6000610bc4826124f9565b610bfa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c408261171b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc76124f1565b73ffffffffffffffffffffffffffffffffffffffff1614158015610cf95750610cf781610cf26124f1565b6122e8565b155b15610d30576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d3b838383612547565b505050565b600e60009054906101000a900460ff16610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690614066565b60405180910390fd5b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610ded9190613f00565b60206040518083038186803b158015610e0557600080fd5b505afa158015610e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3d9190613c20565b119050600081610e4f57600954610e53565b600a545b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed290614006565b60405180910390fd5b6000811115610ef3578082610ef0919061424b565b91505b612710610efe611042565b108015610f1e575061271082610f12611042565b610f1c91906141c4565b115b15610f3b57610f2b611042565b612710610f38919061424b565b91505b61271083610f4b57600b54610f4e565b60005b83610f57611042565b610f6191906141c4565b610f6b91906141c4565b1115610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390614046565b60405180910390fd5b610fb633836125f9565b8181610fc291906141c4565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550821561103d5781600b5411156110335781600b6000828254611027919061424b565b9250508190555061103c565b6000600b819055505b5b505050565b600061104c612617565b6001546000540303905090565b611064838383612620565b505050565b6000806000905060008054905060006110806136a2565b600061108a612617565b90505b8381101561123057600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050915081604001511561116757611225565b8773ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614156111b057600192508480600101955050611203565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614156111fd5782156111f85784806001019550505b611202565b600092505b5b82801561121257506001850387145b15611224578095505050505050611263565b5b80600101905061108d565b506040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b600d6020528060005260406000206000915090505481565b6112896124f1565b73ffffffffffffffffffffffffffffffffffffffff166112a7611cfa565b73ffffffffffffffffffffffffffffffffffffffff16146112fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f490614086565b60405180910390fd5b611305611cfa565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561134a573d6000803e3d6000fd5b50565b6113688383836040518060200160405280600081525061205d565b505050565b6000819050919050565b601260019054906101000a900460ff1681565b60095481565b6113986124f1565b73ffffffffffffffffffffffffffffffffffffffff166113b6611cfa565b73ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390614086565b60405180910390fd5b601260009054906101000a900460ff161561145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390614026565b60405180910390fd5b80600f908051906020019061147292919061361c565b5050565b61147e6124f1565b73ffffffffffffffffffffffffffffffffffffffff1661149c611cfa565b73ffffffffffffffffffffffffffffffffffffffff16146114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e990614086565b60405180910390fd5b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b600b5481565b6060600061153183611909565b67ffffffffffffffff81111561154a576115496144ce565b5b6040519080825280602002602001820160405280156115785781602001602082028036833780820191505090505b50905060008054905060008060005b8381101561170e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156116645750611701565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146116a457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116ff57818685806001019650815181106116f2576116f161449f565b5b6020026020010181815250505b505b8080600101915050611587565b5083945050505050919050565b600061172682612ad6565b600001519050919050565b6117396124f1565b73ffffffffffffffffffffffffffffffffffffffff16611757611cfa565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490614086565b60405180910390fd5b8181905084849050146117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec90613fc6565b60405180910390fd5b6000805b8383905081101561183e578383828181106118175761181661449f565b5b905060200201358261182991906141c4565b9150808061183690614398565b9150506117f9565b506127108161184b611042565b61185591906141c4565b1115611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614046565b60405180910390fd5b60005b85859050811015611901576118ee8686838181106118ba576118b961449f565b5b90506020020160208101906118cf919061390c565b8585848181106118e2576118e161449f565b5b905060200201356125f9565b80806118f990614398565b915050611899565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611971576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6119e16124f1565b73ffffffffffffffffffffffffffffffffffffffff166119ff611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614086565b60405180910390fd5b611a5f6000612d65565b565b611a696124f1565b73ffffffffffffffffffffffffffffffffffffffff16611a87611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490614086565b60405180910390fd5b8060098190555050565b60606000611af483611909565b905060008054905060008060008467ffffffffffffffff811115611b1b57611b1a6144ce565b5b604051908082528060200260200182016040528015611b495781602001602082028036833780820191505090505b5090506000611b56612617565b90505b84811015611cec576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611c365750611ce1565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c7657806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611cd15781838680600101975081518110611cc457611cc361449f565b5b6020026020010181815250505b86851415611cdf5750611cec565b505b806001019050611b59565b508095505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d2c6124f1565b73ffffffffffffffffffffffffffffffffffffffff16611d4a611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9790614086565b60405180910390fd5b8060119080519060200190611db692919061361c565b5050565b606060038054611dc990614335565b80601f0160208091040260200160405190810160405280929190818152602001828054611df590614335565b8015611e425780601f10611e1757610100808354040283529160200191611e42565b820191906000526020600020905b815481529060010190602001808311611e2557829003601f168201915b5050505050905090565b611e546124f1565b73ffffffffffffffffffffffffffffffffffffffff16611e72611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf90614086565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b611eed6124f1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611f5f6124f1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661200c6124f1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120519190613f89565b60405180910390a35050565b612068848484612620565b6120878373ffffffffffffffffffffffffffffffffffffffff16612e2b565b801561209c575061209a84848484612e3e565b155b156120d3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060601260019054906101000a900460ff1661218157601080546120fc90614335565b80601f016020809104026020016040519081016040528092919081815260200182805461212890614335565b80156121755780601f1061214a57610100808354040283529160200191612175565b820191906000526020600020905b81548152906001019060200180831161215857829003601f168201915b505050505090506121ac565b61218a82612f9e565b60405160200161219a9190613ede565b60405160208183030381529060405290505b919050565b601260009054906101000a900460ff1681565b61271081565b600a5481565b6121d86124f1565b73ffffffffffffffffffffffffffffffffffffffff166121f6611cfa565b73ffffffffffffffffffffffffffffffffffffffff161461224c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224390614086565b60405180910390fd5b80600a8190555050565b60606011805461226590614335565b80601f016020809104026020016040519081016040528092919081815260200182805461229190614335565b80156122de5780601f106122b3576101008083540402835291602001916122de565b820191906000526020600020905b8154815290600101906020018083116122c157829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6123976124f1565b73ffffffffffffffffffffffffffffffffffffffff166123b5611cfa565b73ffffffffffffffffffffffffffffffffffffffff161461240b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240290614086565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290613fe6565b60405180910390fd5b61248481612d65565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612504612617565b11158015612513575060005482105b8015612540575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61261382826040518060200160405280600081525061303d565b5050565b60006001905090565b600061262b82612ad6565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612696576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166126b76124f1565b73ffffffffffffffffffffffffffffffffffffffff1614806126e657506126e5856126e06124f1565b6122e8565b5b8061272b57506126f46124f1565b73ffffffffffffffffffffffffffffffffffffffff1661271384610bb9565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612764576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127cb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127d8858585600161304f565b6127e460008487612547565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a64576000548214612a6357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612acf8585856001613055565b5050505050565b612ade6136a2565b600082905080612aec612617565b11158015612afb575060005481105b15612d2e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d2c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c10578092505050612d60565b5b600115612d2b57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d26578092505050612d60565b612c11565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e646124f1565b8786866040518563ffffffff1660e01b8152600401612e869493929190613f1b565b602060405180830381600087803b158015612ea057600080fd5b505af1925050508015612ed157506040513d601f19601f82011682018060405250810190612ece9190613b7d565b60015b612f4b573d8060008114612f01576040519150601f19603f3d011682016040523d82523d6000602084013e612f06565b606091505b50600081511415612f43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060612fa9826124f9565b612fdf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612fe961305b565b905060008151141561300a5760405180602001604052806000815250613035565b80613014846130ed565b604051602001613025929190613eba565b6040516020818303038152906040525b915050919050565b61304a838383600161324e565b505050565b50505050565b50505050565b6060600f805461306a90614335565b80601f016020809104026020016040519081016040528092919081815260200182805461309690614335565b80156130e35780601f106130b8576101008083540402835291602001916130e3565b820191906000526020600020905b8154815290600101906020018083116130c657829003601f168201915b5050505050905090565b60606000821415613135576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613249565b600082905060005b6000821461316757808061315090614398565b915050600a82613160919061421a565b915061313d565b60008167ffffffffffffffff811115613183576131826144ce565b5b6040519080825280601f01601f1916602001820160405280156131b55781602001600182028036833780820191505090505b5090505b60008514613242576001826131ce919061424b565b9150600a856131dd91906143e1565b60306131e991906141c4565b60f81b8183815181106131ff576131fe61449f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561323b919061421a565b94506131b9565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156132bb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156132f6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613303600086838761304f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156134cd57506134cc8773ffffffffffffffffffffffffffffffffffffffff16612e2b565b5b15613593575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135426000888480600101955088612e3e565b613578576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156134d357826000541461358e57600080fd5b6135ff565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613594575b8160008190555050506136156000868387613055565b5050505050565b82805461362890614335565b90600052602060002090601f01602090048101928261364a5760008555613691565b82601f1061366357805160ff1916838001178555613691565b82800160010185558215613691579182015b82811115613690578251825591602001919060010190613675565b5b50905061369e91906136e5565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136fe5760008160009055506001016136e6565b5090565b6000613715613710846140e6565b6140c1565b9050828152602081018484840111156137315761373061450c565b5b61373c8482856142f3565b509392505050565b600061375761375284614117565b6140c1565b9050828152602081018484840111156137735761377261450c565b5b61377e8482856142f3565b509392505050565b6000813590506137958161469a565b92915050565b60008083601f8401126137b1576137b0614502565b5b8235905067ffffffffffffffff8111156137ce576137cd6144fd565b5b6020830191508360208202830111156137ea576137e9614507565b5b9250929050565b60008083601f84011261380757613806614502565b5b8235905067ffffffffffffffff811115613824576138236144fd565b5b6020830191508360208202830111156138405761383f614507565b5b9250929050565b600081359050613856816146b1565b92915050565b60008135905061386b816146c8565b92915050565b600081519050613880816146c8565b92915050565b600082601f83011261389b5761389a614502565b5b81356138ab848260208601613702565b91505092915050565b600082601f8301126138c9576138c8614502565b5b81356138d9848260208601613744565b91505092915050565b6000813590506138f1816146df565b92915050565b600081519050613906816146df565b92915050565b60006020828403121561392257613921614516565b5b600061393084828501613786565b91505092915050565b600080604083850312156139505761394f614516565b5b600061395e85828601613786565b925050602061396f85828601613786565b9150509250929050565b60008060006060848603121561399257613991614516565b5b60006139a086828701613786565b93505060206139b186828701613786565b92505060406139c2868287016138e2565b9150509250925092565b600080600080608085870312156139e6576139e5614516565b5b60006139f487828801613786565b9450506020613a0587828801613786565b9350506040613a16878288016138e2565b925050606085013567ffffffffffffffff811115613a3757613a36614511565b5b613a4387828801613886565b91505092959194509250565b60008060408385031215613a6657613a65614516565b5b6000613a7485828601613786565b9250506020613a8585828601613847565b9150509250929050565b60008060408385031215613aa657613aa5614516565b5b6000613ab485828601613786565b9250506020613ac5858286016138e2565b9150509250929050565b60008060008060408587031215613ae957613ae8614516565b5b600085013567ffffffffffffffff811115613b0757613b06614511565b5b613b138782880161379b565b9450945050602085013567ffffffffffffffff811115613b3657613b35614511565b5b613b42878288016137f1565b925092505092959194509250565b600060208284031215613b6657613b65614516565b5b6000613b748482850161385c565b91505092915050565b600060208284031215613b9357613b92614516565b5b6000613ba184828501613871565b91505092915050565b600060208284031215613bc057613bbf614516565b5b600082013567ffffffffffffffff811115613bde57613bdd614511565b5b613bea848285016138b4565b91505092915050565b600060208284031215613c0957613c08614516565b5b6000613c17848285016138e2565b91505092915050565b600060208284031215613c3657613c35614516565b5b6000613c44848285016138f7565b91505092915050565b6000613c598383613e9c565b60208301905092915050565b613c6e8161427f565b82525050565b6000613c7f82614158565b613c898185614186565b9350613c9483614148565b8060005b83811015613cc5578151613cac8882613c4d565b9750613cb783614179565b925050600181019050613c98565b5085935050505092915050565b613cdb81614291565b82525050565b6000613cec82614163565b613cf68185614197565b9350613d06818560208601614302565b613d0f8161451b565b840191505092915050565b6000613d258261416e565b613d2f81856141a8565b9350613d3f818560208601614302565b613d488161451b565b840191505092915050565b6000613d5e8261416e565b613d6881856141b9565b9350613d78818560208601614302565b80840191505092915050565b6000613d916015836141a8565b9150613d9c8261452c565b602082019050919050565b6000613db46026836141a8565b9150613dbf82614555565b604082019050919050565b6000613dd76016836141a8565b9150613de2826145a4565b602082019050919050565b6000613dfa600f836141a8565b9150613e05826145cd565b602082019050919050565b6000613e1d6008836141a8565b9150613e28826145f6565b602082019050919050565b6000613e406005836141b9565b9150613e4b8261461f565b600582019050919050565b6000613e63600d836141a8565b9150613e6e82614648565b602082019050919050565b6000613e866020836141a8565b9150613e9182614671565b602082019050919050565b613ea5816142e9565b82525050565b613eb4816142e9565b82525050565b6000613ec68285613d53565b9150613ed28284613d53565b91508190509392505050565b6000613eea8284613d53565b9150613ef582613e33565b915081905092915050565b6000602082019050613f156000830184613c65565b92915050565b6000608082019050613f306000830187613c65565b613f3d6020830186613c65565b613f4a6040830185613eab565b8181036060830152613f5c8184613ce1565b905095945050505050565b60006020820190508181036000830152613f818184613c74565b905092915050565b6000602082019050613f9e6000830184613cd2565b92915050565b60006020820190508181036000830152613fbe8184613d1a565b905092915050565b60006020820190508181036000830152613fdf81613d84565b9050919050565b60006020820190508181036000830152613fff81613da7565b9050919050565b6000602082019050818103600083015261401f81613dca565b9050919050565b6000602082019050818103600083015261403f81613ded565b9050919050565b6000602082019050818103600083015261405f81613e10565b9050919050565b6000602082019050818103600083015261407f81613e56565b9050919050565b6000602082019050818103600083015261409f81613e79565b9050919050565b60006020820190506140bb6000830184613eab565b92915050565b60006140cb6140dc565b90506140d78282614367565b919050565b6000604051905090565b600067ffffffffffffffff821115614101576141006144ce565b5b61410a8261451b565b9050602081019050919050565b600067ffffffffffffffff821115614132576141316144ce565b5b61413b8261451b565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006141cf826142e9565b91506141da836142e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561420f5761420e614412565b5b828201905092915050565b6000614225826142e9565b9150614230836142e9565b9250826142405761423f614441565b5b828204905092915050565b6000614256826142e9565b9150614261836142e9565b92508282101561427457614273614412565b5b828203905092915050565b600061428a826142c9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614320578082015181840152602081019050614305565b8381111561432f576000848401525b50505050565b6000600282049050600182168061434d57607f821691505b6020821081141561436157614360614470565b5b50919050565b6143708261451b565b810181811067ffffffffffffffff8211171561438f5761438e6144ce565b5b80604052505050565b60006143a3826142e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143d6576143d5614412565b5b600182019050919050565b60006143ec826142e9565b91506143f7836142e9565b92508261440757614406614441565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4172726179206c656e677468206d69736d617463680000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d4158205045522057414c4c4554205245414348454400000000000000000000600082015250565b7f4d455441444154415f4c4f434b45440000000000000000000000000000000000600082015250565b7f534f4c445f4f5554000000000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f53414c455f494e41435449564500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6146a38161427f565b81146146ae57600080fd5b50565b6146ba81614291565b81146146c557600080fd5b50565b6146d18161429d565b81146146dc57600080fd5b50565b6146e8816142e9565b81146146f357600080fd5b5056fea2646970667358221220ce53d66f5358d40b81f14ed8d40b391fee4be5e1cd93a9f0ca12da976a0d7cdb64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061025e5760003560e01c80636352211e11610146578063a22cb465116100c3578063dc63e90811610087578063dc63e908146106c1578063de3ebae6146106df578063e8a3d485146106fb578063e985e9c514610719578063eb8d244414610749578063f2fde38b146107675761025e565b8063a22cb4651461061d578063b88d4fde14610639578063c87b56dd14610655578063cf30901214610685578063d5abeb01146106a35761025e565b80638462151c1161010a5780638462151c1461058b5780638da5cb5b146105bb578063938e3d7b146105d957806395d89b41146105f5578063989bdbb6146106135761025e565b80636352211e146104e9578063672434821461051957806370a0823114610535578063715018a61461056557806373ed8f761461056f5761025e565b80632f745c59116101df57806351830227116101a35780635183022714610439578063524124911461045757806355f804b3146104755780635bc020bc146104915780635c47c0881461049b578063627fdeab146104b95761025e565b80632f745c59146103835780633a602b4d146103b35780633ccfd60b146103e357806342842e0e146103ed5780634f6ccce7146104095761025e565b8063081812fc11610226578063081812fc146102f3578063095ea7b3146103235780631249c58b1461033f57806318160ddd1461034957806323b872dd146103675761025e565b806301ffc9a714610263578063049c5c491461029357806306fdde031461029d57806307391ba5146102bb578063078eef28146102d7575b600080fd5b61027d60048036038101906102789190613b50565b610783565b60405161028a9190613f89565b60405180910390f35b61029b6108cd565b005b6102a56109bb565b6040516102b29190613fa4565b60405180910390f35b6102d560048036038101906102d09190613bf3565b610a4d565b005b6102f160048036038101906102ec9190613baa565b610ad3565b005b61030d60048036038101906103089190613bf3565b610bb9565b60405161031a9190613f00565b60405180910390f35b61033d60048036038101906103389190613a8f565b610c35565b005b610347610d40565b005b610351611042565b60405161035e91906140a6565b60405180910390f35b610381600480360381019061037c9190613979565b611059565b005b61039d60048036038101906103989190613a8f565b611069565b6040516103aa91906140a6565b60405180910390f35b6103cd60048036038101906103c8919061390c565b611269565b6040516103da91906140a6565b60405180910390f35b6103eb611281565b005b61040760048036038101906104029190613979565b61134d565b005b610423600480360381019061041e9190613bf3565b61136d565b60405161043091906140a6565b60405180910390f35b610441611377565b60405161044e9190613f89565b60405180910390f35b61045f61138a565b60405161046c91906140a6565b60405180910390f35b61048f600480360381019061048a9190613baa565b611390565b005b610499611476565b005b6104a361151e565b6040516104b091906140a6565b60405180910390f35b6104d360048036038101906104ce919061390c565b611524565b6040516104e09190613f67565b60405180910390f35b61050360048036038101906104fe9190613bf3565b61171b565b6040516105109190613f00565b60405180910390f35b610533600480360381019061052e9190613acf565b611731565b005b61054f600480360381019061054a919061390c565b611909565b60405161055c91906140a6565b60405180910390f35b61056d6119d9565b005b61058960048036038101906105849190613bf3565b611a61565b005b6105a560048036038101906105a0919061390c565b611ae7565b6040516105b29190613f67565b60405180910390f35b6105c3611cfa565b6040516105d09190613f00565b60405180910390f35b6105f360048036038101906105ee9190613baa565b611d24565b005b6105fd611dba565b60405161060a9190613fa4565b60405180910390f35b61061b611e4c565b005b61063760048036038101906106329190613a4f565b611ee5565b005b610653600480360381019061064e91906139cc565b61205d565b005b61066f600480360381019061066a9190613bf3565b6120d9565b60405161067c9190613fa4565b60405180910390f35b61068d6121b1565b60405161069a9190613f89565b60405180910390f35b6106ab6121c4565b6040516106b891906140a6565b60405180910390f35b6106c96121ca565b6040516106d691906140a6565b60405180910390f35b6106f960048036038101906106f49190613bf3565b6121d0565b005b610703612256565b6040516107109190613fa4565b60405180910390f35b610733600480360381019061072e9190613939565b6122e8565b6040516107409190613f89565b60405180910390f35b61075161237c565b60405161075e9190613f89565b60405180910390f35b610781600480360381019061077c919061390c565b61238f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108b657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c657506108c582612487565b5b9050919050565b6108d56124f1565b73ffffffffffffffffffffffffffffffffffffffff166108f3611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090614086565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600e60009054906101000a900460ff166040516109b19190613f89565b60405180910390a1565b6060600280546109ca90614335565b80601f01602080910402602001604051908101604052809291908181526020018280546109f690614335565b8015610a435780601f10610a1857610100808354040283529160200191610a43565b820191906000526020600020905b815481529060010190602001808311610a2657829003601f168201915b5050505050905090565b610a556124f1565b73ffffffffffffffffffffffffffffffffffffffff16610a73611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac090614086565b60405180910390fd5b80600b8190555050565b610adb6124f1565b73ffffffffffffffffffffffffffffffffffffffff16610af9611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690614086565b60405180910390fd5b601260009054906101000a900460ff1615610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690614026565b60405180910390fd5b8060109080519060200190610bb592919061361c565b5050565b6000610bc4826124f9565b610bfa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c408261171b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca8576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc76124f1565b73ffffffffffffffffffffffffffffffffffffffff1614158015610cf95750610cf781610cf26124f1565b6122e8565b155b15610d30576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d3b838383612547565b505050565b600e60009054906101000a900460ff16610d8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8690614066565b60405180910390fd5b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610ded9190613f00565b60206040518083038186803b158015610e0557600080fd5b505afa158015610e19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3d9190613c20565b119050600081610e4f57600954610e53565b600a545b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed290614006565b60405180910390fd5b6000811115610ef3578082610ef0919061424b565b91505b612710610efe611042565b108015610f1e575061271082610f12611042565b610f1c91906141c4565b115b15610f3b57610f2b611042565b612710610f38919061424b565b91505b61271083610f4b57600b54610f4e565b60005b83610f57611042565b610f6191906141c4565b610f6b91906141c4565b1115610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390614046565b60405180910390fd5b610fb633836125f9565b8181610fc291906141c4565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550821561103d5781600b5411156110335781600b6000828254611027919061424b565b9250508190555061103c565b6000600b819055505b5b505050565b600061104c612617565b6001546000540303905090565b611064838383612620565b505050565b6000806000905060008054905060006110806136a2565b600061108a612617565b90505b8381101561123057600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050915081604001511561116757611225565b8773ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614156111b057600192508480600101955050611203565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614156111fd5782156111f85784806001019550505b611202565b600092505b5b82801561121257506001850387145b15611224578095505050505050611263565b5b80600101905061108d565b506040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b600d6020528060005260406000206000915090505481565b6112896124f1565b73ffffffffffffffffffffffffffffffffffffffff166112a7611cfa565b73ffffffffffffffffffffffffffffffffffffffff16146112fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f490614086565b60405180910390fd5b611305611cfa565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561134a573d6000803e3d6000fd5b50565b6113688383836040518060200160405280600081525061205d565b505050565b6000819050919050565b601260019054906101000a900460ff1681565b60095481565b6113986124f1565b73ffffffffffffffffffffffffffffffffffffffff166113b6611cfa565b73ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390614086565b60405180910390fd5b601260009054906101000a900460ff161561145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390614026565b60405180910390fd5b80600f908051906020019061147292919061361c565b5050565b61147e6124f1565b73ffffffffffffffffffffffffffffffffffffffff1661149c611cfa565b73ffffffffffffffffffffffffffffffffffffffff16146114f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e990614086565b60405180910390fd5b601260019054906101000a900460ff1615601260016101000a81548160ff021916908315150217905550565b600b5481565b6060600061153183611909565b67ffffffffffffffff81111561154a576115496144ce565b5b6040519080825280602002602001820160405280156115785781602001602082028036833780820191505090505b50905060008054905060008060005b8381101561170e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156116645750611701565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146116a457806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116ff57818685806001019650815181106116f2576116f161449f565b5b6020026020010181815250505b505b8080600101915050611587565b5083945050505050919050565b600061172682612ad6565b600001519050919050565b6117396124f1565b73ffffffffffffffffffffffffffffffffffffffff16611757611cfa565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490614086565b60405180910390fd5b8181905084849050146117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec90613fc6565b60405180910390fd5b6000805b8383905081101561183e578383828181106118175761181661449f565b5b905060200201358261182991906141c4565b9150808061183690614398565b9150506117f9565b506127108161184b611042565b61185591906141c4565b1115611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614046565b60405180910390fd5b60005b85859050811015611901576118ee8686838181106118ba576118b961449f565b5b90506020020160208101906118cf919061390c565b8585848181106118e2576118e161449f565b5b905060200201356125f9565b80806118f990614398565b915050611899565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611971576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6119e16124f1565b73ffffffffffffffffffffffffffffffffffffffff166119ff611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614086565b60405180910390fd5b611a5f6000612d65565b565b611a696124f1565b73ffffffffffffffffffffffffffffffffffffffff16611a87611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad490614086565b60405180910390fd5b8060098190555050565b60606000611af483611909565b905060008054905060008060008467ffffffffffffffff811115611b1b57611b1a6144ce565b5b604051908082528060200260200182016040528015611b495781602001602082028036833780820191505090505b5090506000611b56612617565b90505b84811015611cec576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611c365750611ce1565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c7657806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611cd15781838680600101975081518110611cc457611cc361449f565b5b6020026020010181815250505b86851415611cdf5750611cec565b505b806001019050611b59565b508095505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611d2c6124f1565b73ffffffffffffffffffffffffffffffffffffffff16611d4a611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614611da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9790614086565b60405180910390fd5b8060119080519060200190611db692919061361c565b5050565b606060038054611dc990614335565b80601f0160208091040260200160405190810160405280929190818152602001828054611df590614335565b8015611e425780601f10611e1757610100808354040283529160200191611e42565b820191906000526020600020905b815481529060010190602001808311611e2557829003601f168201915b5050505050905090565b611e546124f1565b73ffffffffffffffffffffffffffffffffffffffff16611e72611cfa565b73ffffffffffffffffffffffffffffffffffffffff1614611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf90614086565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b611eed6124f1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f52576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611f5f6124f1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661200c6124f1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120519190613f89565b60405180910390a35050565b612068848484612620565b6120878373ffffffffffffffffffffffffffffffffffffffff16612e2b565b801561209c575061209a84848484612e3e565b155b156120d3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060601260019054906101000a900460ff1661218157601080546120fc90614335565b80601f016020809104026020016040519081016040528092919081815260200182805461212890614335565b80156121755780601f1061214a57610100808354040283529160200191612175565b820191906000526020600020905b81548152906001019060200180831161215857829003601f168201915b505050505090506121ac565b61218a82612f9e565b60405160200161219a9190613ede565b60405160208183030381529060405290505b919050565b601260009054906101000a900460ff1681565b61271081565b600a5481565b6121d86124f1565b73ffffffffffffffffffffffffffffffffffffffff166121f6611cfa565b73ffffffffffffffffffffffffffffffffffffffff161461224c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224390614086565b60405180910390fd5b80600a8190555050565b60606011805461226590614335565b80601f016020809104026020016040519081016040528092919081815260200182805461229190614335565b80156122de5780601f106122b3576101008083540402835291602001916122de565b820191906000526020600020905b8154815290600101906020018083116122c157829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6123976124f1565b73ffffffffffffffffffffffffffffffffffffffff166123b5611cfa565b73ffffffffffffffffffffffffffffffffffffffff161461240b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240290614086565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561247b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247290613fe6565b60405180910390fd5b61248481612d65565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612504612617565b11158015612513575060005482105b8015612540575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b61261382826040518060200160405280600081525061303d565b5050565b60006001905090565b600061262b82612ad6565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612696576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166126b76124f1565b73ffffffffffffffffffffffffffffffffffffffff1614806126e657506126e5856126e06124f1565b6122e8565b5b8061272b57506126f46124f1565b73ffffffffffffffffffffffffffffffffffffffff1661271384610bb9565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612764576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156127cb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127d8858585600161304f565b6127e460008487612547565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a64576000548214612a6357878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612acf8585856001613055565b5050505050565b612ade6136a2565b600082905080612aec612617565b11158015612afb575060005481105b15612d2e576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612d2c57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c10578092505050612d60565b5b600115612d2b57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612d26578092505050612d60565b612c11565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e646124f1565b8786866040518563ffffffff1660e01b8152600401612e869493929190613f1b565b602060405180830381600087803b158015612ea057600080fd5b505af1925050508015612ed157506040513d601f19601f82011682018060405250810190612ece9190613b7d565b60015b612f4b573d8060008114612f01576040519150601f19603f3d011682016040523d82523d6000602084013e612f06565b606091505b50600081511415612f43576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060612fa9826124f9565b612fdf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612fe961305b565b905060008151141561300a5760405180602001604052806000815250613035565b80613014846130ed565b604051602001613025929190613eba565b6040516020818303038152906040525b915050919050565b61304a838383600161324e565b505050565b50505050565b50505050565b6060600f805461306a90614335565b80601f016020809104026020016040519081016040528092919081815260200182805461309690614335565b80156130e35780601f106130b8576101008083540402835291602001916130e3565b820191906000526020600020905b8154815290600101906020018083116130c657829003601f168201915b5050505050905090565b60606000821415613135576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613249565b600082905060005b6000821461316757808061315090614398565b915050600a82613160919061421a565b915061313d565b60008167ffffffffffffffff811115613183576131826144ce565b5b6040519080825280601f01601f1916602001820160405280156131b55781602001600182028036833780820191505090505b5090505b60008514613242576001826131ce919061424b565b9150600a856131dd91906143e1565b60306131e991906141c4565b60f81b8183815181106131ff576131fe61449f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561323b919061421a565b94506131b9565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156132bb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156132f6576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613303600086838761304f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156134cd57506134cc8773ffffffffffffffffffffffffffffffffffffffff16612e2b565b5b15613593575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135426000888480600101955088612e3e565b613578576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156134d357826000541461358e57600080fd5b6135ff565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613594575b8160008190555050506136156000868387613055565b5050505050565b82805461362890614335565b90600052602060002090601f01602090048101928261364a5760008555613691565b82601f1061366357805160ff1916838001178555613691565b82800160010185558215613691579182015b82811115613690578251825591602001919060010190613675565b5b50905061369e91906136e5565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136fe5760008160009055506001016136e6565b5090565b6000613715613710846140e6565b6140c1565b9050828152602081018484840111156137315761373061450c565b5b61373c8482856142f3565b509392505050565b600061375761375284614117565b6140c1565b9050828152602081018484840111156137735761377261450c565b5b61377e8482856142f3565b509392505050565b6000813590506137958161469a565b92915050565b60008083601f8401126137b1576137b0614502565b5b8235905067ffffffffffffffff8111156137ce576137cd6144fd565b5b6020830191508360208202830111156137ea576137e9614507565b5b9250929050565b60008083601f84011261380757613806614502565b5b8235905067ffffffffffffffff811115613824576138236144fd565b5b6020830191508360208202830111156138405761383f614507565b5b9250929050565b600081359050613856816146b1565b92915050565b60008135905061386b816146c8565b92915050565b600081519050613880816146c8565b92915050565b600082601f83011261389b5761389a614502565b5b81356138ab848260208601613702565b91505092915050565b600082601f8301126138c9576138c8614502565b5b81356138d9848260208601613744565b91505092915050565b6000813590506138f1816146df565b92915050565b600081519050613906816146df565b92915050565b60006020828403121561392257613921614516565b5b600061393084828501613786565b91505092915050565b600080604083850312156139505761394f614516565b5b600061395e85828601613786565b925050602061396f85828601613786565b9150509250929050565b60008060006060848603121561399257613991614516565b5b60006139a086828701613786565b93505060206139b186828701613786565b92505060406139c2868287016138e2565b9150509250925092565b600080600080608085870312156139e6576139e5614516565b5b60006139f487828801613786565b9450506020613a0587828801613786565b9350506040613a16878288016138e2565b925050606085013567ffffffffffffffff811115613a3757613a36614511565b5b613a4387828801613886565b91505092959194509250565b60008060408385031215613a6657613a65614516565b5b6000613a7485828601613786565b9250506020613a8585828601613847565b9150509250929050565b60008060408385031215613aa657613aa5614516565b5b6000613ab485828601613786565b9250506020613ac5858286016138e2565b9150509250929050565b60008060008060408587031215613ae957613ae8614516565b5b600085013567ffffffffffffffff811115613b0757613b06614511565b5b613b138782880161379b565b9450945050602085013567ffffffffffffffff811115613b3657613b35614511565b5b613b42878288016137f1565b925092505092959194509250565b600060208284031215613b6657613b65614516565b5b6000613b748482850161385c565b91505092915050565b600060208284031215613b9357613b92614516565b5b6000613ba184828501613871565b91505092915050565b600060208284031215613bc057613bbf614516565b5b600082013567ffffffffffffffff811115613bde57613bdd614511565b5b613bea848285016138b4565b91505092915050565b600060208284031215613c0957613c08614516565b5b6000613c17848285016138e2565b91505092915050565b600060208284031215613c3657613c35614516565b5b6000613c44848285016138f7565b91505092915050565b6000613c598383613e9c565b60208301905092915050565b613c6e8161427f565b82525050565b6000613c7f82614158565b613c898185614186565b9350613c9483614148565b8060005b83811015613cc5578151613cac8882613c4d565b9750613cb783614179565b925050600181019050613c98565b5085935050505092915050565b613cdb81614291565b82525050565b6000613cec82614163565b613cf68185614197565b9350613d06818560208601614302565b613d0f8161451b565b840191505092915050565b6000613d258261416e565b613d2f81856141a8565b9350613d3f818560208601614302565b613d488161451b565b840191505092915050565b6000613d5e8261416e565b613d6881856141b9565b9350613d78818560208601614302565b80840191505092915050565b6000613d916015836141a8565b9150613d9c8261452c565b602082019050919050565b6000613db46026836141a8565b9150613dbf82614555565b604082019050919050565b6000613dd76016836141a8565b9150613de2826145a4565b602082019050919050565b6000613dfa600f836141a8565b9150613e05826145cd565b602082019050919050565b6000613e1d6008836141a8565b9150613e28826145f6565b602082019050919050565b6000613e406005836141b9565b9150613e4b8261461f565b600582019050919050565b6000613e63600d836141a8565b9150613e6e82614648565b602082019050919050565b6000613e866020836141a8565b9150613e9182614671565b602082019050919050565b613ea5816142e9565b82525050565b613eb4816142e9565b82525050565b6000613ec68285613d53565b9150613ed28284613d53565b91508190509392505050565b6000613eea8284613d53565b9150613ef582613e33565b915081905092915050565b6000602082019050613f156000830184613c65565b92915050565b6000608082019050613f306000830187613c65565b613f3d6020830186613c65565b613f4a6040830185613eab565b8181036060830152613f5c8184613ce1565b905095945050505050565b60006020820190508181036000830152613f818184613c74565b905092915050565b6000602082019050613f9e6000830184613cd2565b92915050565b60006020820190508181036000830152613fbe8184613d1a565b905092915050565b60006020820190508181036000830152613fdf81613d84565b9050919050565b60006020820190508181036000830152613fff81613da7565b9050919050565b6000602082019050818103600083015261401f81613dca565b9050919050565b6000602082019050818103600083015261403f81613ded565b9050919050565b6000602082019050818103600083015261405f81613e10565b9050919050565b6000602082019050818103600083015261407f81613e56565b9050919050565b6000602082019050818103600083015261409f81613e79565b9050919050565b60006020820190506140bb6000830184613eab565b92915050565b60006140cb6140dc565b90506140d78282614367565b919050565b6000604051905090565b600067ffffffffffffffff821115614101576141006144ce565b5b61410a8261451b565b9050602081019050919050565b600067ffffffffffffffff821115614132576141316144ce565b5b61413b8261451b565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006141cf826142e9565b91506141da836142e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561420f5761420e614412565b5b828201905092915050565b6000614225826142e9565b9150614230836142e9565b9250826142405761423f614441565b5b828204905092915050565b6000614256826142e9565b9150614261836142e9565b92508282101561427457614273614412565b5b828203905092915050565b600061428a826142c9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614320578082015181840152602081019050614305565b8381111561432f576000848401525b50505050565b6000600282049050600182168061434d57607f821691505b6020821081141561436157614360614470565b5b50919050565b6143708261451b565b810181811067ffffffffffffffff8211171561438f5761438e6144ce565b5b80604052505050565b60006143a3826142e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143d6576143d5614412565b5b600182019050919050565b60006143ec826142e9565b91506143f7836142e9565b92508261440757614406614441565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4172726179206c656e677468206d69736d617463680000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d4158205045522057414c4c4554205245414348454400000000000000000000600082015250565b7f4d455441444154415f4c4f434b45440000000000000000000000000000000000600082015250565b7f534f4c445f4f5554000000000000000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f53414c455f494e41435449564500000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6146a38161427f565b81146146ae57600080fd5b50565b6146ba81614291565b81146146c557600080fd5b50565b6146d18161429d565b81146146dc57600080fd5b50565b6146e8816142e9565b81146146f357600080fd5b5056fea2646970667358221220ce53d66f5358d40b81f14ed8d40b391fee4be5e1cd93a9f0ca12da976a0d7cdb64736f6c63430008070033

Deployed Bytecode Sourcemap

47704:4815:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27017:372;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49910:138;;;:::i;:::-;;32943:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50294:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51661:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34446:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34009:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48464:883;;;:::i;:::-;;26257:312;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35311:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28824:977;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48042:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50591:106;;;:::i;:::-;;35552:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29982:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48312:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47776:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51503:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50499:84;;;:::i;:::-;;47867:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50707:788;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32751:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49355:545;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27453:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22491:103;;;:::i;:::-;;50056:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30200:1174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21840:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51961:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33112:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50412:75;;;:::i;:::-;;34722:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35808:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52086:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48279:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47909:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47823:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50178:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52311:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35080:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48121:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22749:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27017:372;27119:4;27171:25;27156:40;;;:11;:40;;;;:105;;;;27228:33;27213:48;;;:11;:48;;;;27156:105;:172;;;;27293:35;27278:50;;;:11;:50;;;;27156:172;:225;;;;27345:36;27369:11;27345:23;:36::i;:::-;27156:225;27136:245;;27017:372;;;:::o;49910:138::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49984:12:::1;;;;;;;;;;;49983:13;49968:12;;:28;;;;;;;;;;;;;;;;;;50012;50027:12;;;;;;;;;;;50012:28;;;;;;:::i;:::-;;;;;;;;49910:138::o:0;32943:100::-;32997:13;33030:5;33023:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32943:100;:::o;50294:106::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50384:8:::1;50368:13;:24;;;;50294:106:::0;:::o;51661:170::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51753:6:::1;;;;;;;;;;;51752:7;51744:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;51811:12;51790:18;:33;;;;;;;;;;;;:::i;:::-;;51661:170:::0;:::o;34446:204::-;34514:7;34539:16;34547:7;34539;:16::i;:::-;34534:64;;34564:34;;;;;;;;;;;;;;34534:64;34618:15;:24;34634:7;34618:24;;;;;;;;;;;;;;;;;;;;;34611:31;;34446:204;;;:::o;34009:371::-;34082:13;34098:24;34114:7;34098:15;:24::i;:::-;34082:40;;34143:5;34137:11;;:2;:11;;;34133:48;;;34157:24;;;;;;;;;;;;;;34133:48;34214:5;34198:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;34224:37;34241:5;34248:12;:10;:12::i;:::-;34224:16;:37::i;:::-;34223:38;34198:63;34194:138;;;34285:35;;;;;;;;;;;;;;34194:138;34344:28;34353:2;34357:7;34366:5;34344:8;:28::i;:::-;34071:309;34009:371;;:::o;48464:883::-;48508:12;;;;;;;;;;;48500:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;48559:13;48611:1;48576:10;;;;;;;;;;;:20;;;48597:10;48576:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;48559:54;;48624:14;48642:8;:53;;48674:21;;48642:53;;;48653:18;;48642:53;48624:72;;48707:15;48725;:27;48741:10;48725:27;;;;;;;;;;;;;;;;48707:45;;48783:6;48773:7;:16;48765:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;48850:1;48840:7;:11;48837:38;;;48865:7;48855:17;;;;;:::i;:::-;;;48837:38;47945:5;48888:13;:11;:13::i;:::-;:25;:63;;;;;47945:5;48933:6;48917:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:34;48888:63;48885:107;;;48976:13;:11;:13::i;:::-;47945:5;48964:25;;;;:::i;:::-;48955:34;;48885:107;47945:5;49052:8;:28;;49067:13;;49052:28;;;49063:1;49052:28;49042:6;49026:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:55;;;;:::i;:::-;:68;;49004:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;49143:29;49153:10;49165:6;49143:9;:29::i;:::-;49223:6;49213:7;:16;;;;:::i;:::-;49183:15;:27;49199:10;49183:27;;;;;;;;;;;;;;;:46;;;;49243:8;49240:100;;;49274:6;49258:13;;:22;49255:83;;;49301:6;49284:13;;:23;;;;;;;:::i;:::-;;;;;;;;49255:83;;;49334:1;49318:13;:17;;;;49255:83;49240:100;48489:858;;;48464:883::o;26257:312::-;26310:7;26535:15;:13;:15::i;:::-;26520:12;;26504:13;;:28;:46;26497:53;;26257:312;:::o;35311:170::-;35445:28;35455:4;35461:2;35465:7;35445:9;:28::i;:::-;35311:170;;;:::o;28824:977::-;28915:7;28935:17;28955:1;28935:21;;28967:18;28988:13;;28967:34;;29012:13;29045:31;;:::i;:::-;29118:9;29130:15;:13;:15::i;:::-;29118:27;;29113:629;29151:10;29147:1;:14;29113:629;;;29199:11;:14;29211:1;29199:14;;;;;;;;;;;29187:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29236:9;:16;;;29232:73;;;29277:8;;29232:73;29344:5;29326:23;;:9;:14;;;:23;;;29323:293;;;29385:4;29374:15;;29413:11;;;;;;;29323:293;;;29479:1;29453:28;;:9;:14;;;:28;;;29450:166;;;29509:8;29506:24;;;29519:11;;;;;;;29506:24;29450:166;;;29590:5;29579:16;;29450:166;29323:293;29637:8;:36;;;;;29671:1;29659:9;:13;29649:5;:24;29637:36;29634:93;;;29705:1;29698:8;;;;;;;;;29634:93;29113:629;29163:3;;;;;29113:629;;;;29770:23;;;;;;;;;;;;;;28824:977;;;;;:::o;48042:50::-;;;;;;;;;;;;;;;;;:::o;50591:106::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50649:7:::1;:5;:7::i;:::-;50641:25;;:48;50667:21;50641:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50591:106::o:0;35552:185::-;35690:39;35707:4;35713:2;35717:7;35690:39;;;;;;;;;;;;:16;:39::i;:::-;35552:185;;;:::o;29982:110::-;30051:7;30078:5;30071:12;;29982:110;;;:::o;48312:28::-;;;;;;;;;;;;;:::o;47776:40::-;;;;:::o;51503:150::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51585:6:::1;;;;;;;;;;;51584:7;51576:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;51638:7;51622:13;:23;;;;;;;;;;;;:::i;:::-;;51503:150:::0;:::o;50499:84::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50567:8:::1;;;;;;;;;;;50566:9;50555:8;;:20;;;;;;;;;;;;;;;;;;50499:84::o:0;47867:35::-;;;;:::o;50707:788::-;50771:16;50825:18;50860:16;50870:5;50860:9;:16::i;:::-;50846:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50825:52;;50892:11;50906:13;;50892:27;;50934:19;50968:25;51013:9;51008:446;51028:3;51024:1;:7;51008:446;;;51057:31;51091:11;:14;51103:1;51091:14;;;;;;;;;;;51057:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51128:9;:16;;;51124:73;;;51169:8;;;51124:73;51245:1;51219:28;;:9;:14;;;:28;;;51215:111;;51292:9;:14;;;51272:34;;51215:111;51369:5;51348:26;;:17;:26;;;51344:95;;;51418:1;51399;51401:13;;;;;;51399:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;51344:95;51038:416;51008:446;51033:3;;;;;;;51008:446;;;;51475:1;51468:8;;;;;;50707:788;;;:::o;32751:125::-;32815:7;32842:21;32855:7;32842:12;:21::i;:::-;:26;;;32835:33;;32751:125;;;:::o;49355:545::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49488:5:::1;;:12;;49467:10;;:17;;:33;49459:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;49537:18;49574:9:::0;49570:89:::1;49592:5;;:12;;49588:1;:16;49570:89;;;49639:5;;49645:1;49639:8;;;;;;;:::i;:::-;;;;;;;;49625:22;;;;;:::i;:::-;;;49605:3;;;;;:::i;:::-;;;;49570:89;;;;47945:5;49707:10;49691:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:39;;49669:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;49791:9;49787:106;49809:10;;:17;;49805:1;:21;49787:106;;;49847:34;49857:10;;49868:1;49857:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;49872:5;;49878:1;49872:8;;;;;;;:::i;:::-;;;;;;;;49847:9;:34::i;:::-;49827:3;;;;;:::i;:::-;;;;49787:106;;;;49448:452;49355:545:::0;;;;:::o;27453:206::-;27517:7;27558:1;27541:19;;:5;:19;;;27537:60;;;27569:28;;;;;;;;;;;;;;27537:60;27623:12;:19;27636:5;27623:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27615:36;;27608:43;;27453:206;;;:::o;22491:103::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22556:30:::1;22583:1;22556:18;:30::i;:::-;22491:103::o:0;50056:114::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50158:4:::1;50134:21;:28;;;;50056:114:::0;:::o;30200:1174::-;30259:16;30288:21;30312:16;30322:5;30312:9;:16::i;:::-;30288:40;;30339:18;30360:13;;30339:34;;30384:19;30414:25;30452:21;30490:13;30476:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30452:52;;30547:9;30559:15;:13;:15::i;:::-;30547:27;;30542:790;30580:10;30576:1;:14;30542:790;;;30616:31;30650:11;:14;30662:1;30650:14;;;;;;;;;;;30616:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30689:9;:16;;;30685:73;;;30730:8;;;30685:73;30860:1;30834:28;;:9;:14;;;:28;;;30830:111;;30907:9;:14;;;30887:34;;30830:111;31062:5;31041:26;;:17;:26;;;31037:98;;;31114:1;31092:4;31097:13;;;;;;31092:19;;;;;;;;:::i;:::-;;;;;;;:23;;;;;31037:98;31254:13;31239:11;:28;31235:82;;;31292:5;;;31235:82;30597:735;30542:790;30592:3;;;;;30542:790;;;;31362:4;31355:11;;;;;;;30200:1174;;;:::o;21840:87::-;21886:7;21913:6;;;;;;;;;;;21906:13;;21840:87;:::o;51961:117::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52058:12:::1;52043;:27;;;;;;;;;;;;:::i;:::-;;51961:117:::0;:::o;33112:104::-;33168:13;33201:7;33194:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33112:104;:::o;50412:75::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50475:4:::1;50466:6;;:13;;;;;;;;;;;;;;;;;;50412:75::o:0;34722:287::-;34833:12;:10;:12::i;:::-;34821:24;;:8;:24;;;34817:54;;;34854:17;;;;;;;;;;;;;;34817:54;34929:8;34884:18;:32;34903:12;:10;:12::i;:::-;34884:32;;;;;;;;;;;;;;;:42;34917:8;34884:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34982:8;34953:48;;34968:12;:10;:12::i;:::-;34953:48;;;34992:8;34953:48;;;;;;:::i;:::-;;;;;;;;34722:287;;:::o;35808:369::-;35975:28;35985:4;35991:2;35995:7;35975:9;:28::i;:::-;36018:15;:2;:13;;;:15::i;:::-;:76;;;;;36038:56;36069:4;36075:2;36079:7;36088:5;36038:30;:56::i;:::-;36037:57;36018:76;36014:156;;;36118:40;;;;;;;;;;;;;;36014:156;35808:369;;;;:::o;52086:217::-;52151:13;52180:8;;;;;;;;;;;52176:44;;52199:18;52192:25;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52176:44;52261:23;52276:7;52261:14;:23::i;:::-;52244:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;52230:65;;52086:217;;;;:::o;48279:26::-;;;;;;;;;;;;;:::o;47909:41::-;47945:5;47909:41;:::o;47823:37::-;;;;:::o;50178:108::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50274:4:::1;50253:18;:25;;;;50178:108:::0;:::o;52311:97::-;52355:13;52388:12;52381:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52311:97;:::o;35080:164::-;35177:4;35201:18;:25;35220:5;35201:25;;;;;;;;;;;;;;;:35;35227:8;35201:35;;;;;;;;;;;;;;;;;;;;;;;;;35194:42;;35080:164;;;;:::o;48121:32::-;;;;;;;;;;;;;:::o;22749:201::-;22071:12;:10;:12::i;:::-;22060:23;;:7;:5;:7::i;:::-;:23;;;22052:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22858:1:::1;22838:22;;:8;:22;;;;22830:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22914:28;22933:8;22914:18;:28::i;:::-;22749:201:::0;:::o;20753:157::-;20838:4;20877:25;20862:40;;;:11;:40;;;;20855:47;;20753:157;;;:::o;17854:98::-;17907:7;17934:10;17927:17;;17854:98;:::o;36432:187::-;36489:4;36532:7;36513:15;:13;:15::i;:::-;:26;;:53;;;;;36553:13;;36543:7;:23;36513:53;:98;;;;;36584:11;:20;36596:7;36584:20;;;;;;;;;;;:27;;;;;;;;;;;;36583:28;36513:98;36506:105;;36432:187;;;:::o;44602:196::-;44744:2;44717:15;:24;44733:7;44717:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44782:7;44778:2;44762:28;;44771:5;44762:28;;;;;;;;;;;;44602:196;;;:::o;36627:104::-;36696:27;36706:2;36710:8;36696:27;;;;;;;;;;;;:9;:27::i;:::-;36627:104;;:::o;52416:100::-;52481:7;52507:1;52500:8;;52416:100;:::o;39545:2130::-;39660:35;39698:21;39711:7;39698:12;:21::i;:::-;39660:59;;39758:4;39736:26;;:13;:18;;;:26;;;39732:67;;39771:28;;;;;;;;;;;;;;39732:67;39812:22;39854:4;39838:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;39875:36;39892:4;39898:12;:10;:12::i;:::-;39875:16;:36::i;:::-;39838:73;:126;;;;39952:12;:10;:12::i;:::-;39928:36;;:20;39940:7;39928:11;:20::i;:::-;:36;;;39838:126;39812:153;;39983:17;39978:66;;40009:35;;;;;;;;;;;;;;39978:66;40073:1;40059:16;;:2;:16;;;40055:52;;;40084:23;;;;;;;;;;;;;;40055:52;40120:43;40142:4;40148:2;40152:7;40161:1;40120:21;:43::i;:::-;40228:35;40245:1;40249:7;40258:4;40228:8;:35::i;:::-;40589:1;40559:12;:18;40572:4;40559:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40633:1;40605:12;:16;40618:2;40605:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40651:31;40685:11;:20;40697:7;40685:20;;;;;;;;;;;40651:54;;40736:2;40720:8;:13;;;:18;;;;;;;;;;;;;;;;;;40786:15;40753:8;:23;;;:49;;;;;;;;;;;;;;;;;;41054:19;41086:1;41076:7;:11;41054:33;;41102:31;41136:11;:24;41148:11;41136:24;;;;;;;;;;;41102:58;;41204:1;41179:27;;:8;:13;;;;;;;;;;;;:27;;;41175:384;;;41389:13;;41374:11;:28;41370:174;;41443:4;41427:8;:13;;;:20;;;;;;;;;;;;;;;;;;41496:13;:28;;;41470:8;:23;;;:54;;;;;;;;;;;;;;;;;;41370:174;41175:384;40534:1036;;;41606:7;41602:2;41587:27;;41596:4;41587:27;;;;;;;;;;;;41625:42;41646:4;41652:2;41656:7;41665:1;41625:20;:42::i;:::-;39649:2026;;39545:2130;;;:::o;31580:1109::-;31642:21;;:::i;:::-;31676:12;31691:7;31676:22;;31759:4;31740:15;:13;:15::i;:::-;:23;;:47;;;;;31774:13;;31767:4;:20;31740:47;31736:886;;;31808:31;31842:11;:17;31854:4;31842:17;;;;;;;;;;;31808:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31883:9;:16;;;31878:729;;31954:1;31928:28;;:9;:14;;;:28;;;31924:101;;31992:9;31985:16;;;;;;31924:101;32327:261;32334:4;32327:261;;;32367:6;;;;;;;;32412:11;:17;32424:4;32412:17;;;;;;;;;;;32400:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32486:1;32460:28;;:9;:14;;;:28;;;32456:109;;32528:9;32521:16;;;;;;32456:109;32327:261;;;31878:729;31789:833;31736:886;32650:31;;;;;;;;;;;;;;31580:1109;;;;:::o;23110:191::-;23184:16;23203:6;;;;;;;;;;;23184:25;;23229:8;23220:6;;:17;;;;;;;;;;;;;;;;;;23284:8;23253:40;;23274:8;23253:40;;;;;;;;;;;;23173:128;23110:191;:::o;9981:387::-;10041:4;10249:12;10316:7;10304:20;10296:28;;10359:1;10352:4;:8;10345:15;;;9981:387;;;:::o;45290:667::-;45453:4;45490:2;45474:36;;;45511:12;:10;:12::i;:::-;45525:4;45531:7;45540:5;45474:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45470:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45725:1;45708:6;:13;:18;45704:235;;;45754:40;;;;;;;;;;;;;;45704:235;45897:6;45891:13;45882:6;45878:2;45874:15;45867:38;45470:480;45603:45;;;45593:55;;;:6;:55;;;;45586:62;;;45290:667;;;;;;:::o;33287:318::-;33360:13;33391:16;33399:7;33391;:16::i;:::-;33386:59;;33416:29;;;;;;;;;;;;;;33386:59;33458:21;33482:10;:8;:10::i;:::-;33458:34;;33535:1;33516:7;33510:21;:26;;:87;;;;;;;;;;;;;;;;;33563:7;33572:18;:7;:16;:18::i;:::-;33546:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33510:87;33503:94;;;33287:318;;;:::o;37094:163::-;37217:32;37223:2;37227:8;37237:5;37244:4;37217:5;:32::i;:::-;37094:163;;;:::o;46605:159::-;;;;;:::o;47423:158::-;;;;;:::o;51839:114::-;51899:13;51932;51925:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51839:114;:::o;18296:723::-;18352:13;18582:1;18573:5;:10;18569:53;;;18600:10;;;;;;;;;;;;;;;;;;;;;18569:53;18632:12;18647:5;18632:20;;18663:14;18688:78;18703:1;18695:4;:9;18688:78;;18721:8;;;;;:::i;:::-;;;;18752:2;18744:10;;;;;:::i;:::-;;;18688:78;;;18776:19;18808:6;18798:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18776:39;;18826:154;18842:1;18833:5;:10;18826:154;;18870:1;18860:11;;;;;:::i;:::-;;;18937:2;18929:5;:10;;;;:::i;:::-;18916:2;:24;;;;:::i;:::-;18903:39;;18886:6;18893;18886:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18966:2;18957:11;;;;;:::i;:::-;;;18826:154;;;19004:6;18990:21;;;;;18296:723;;;;:::o;37516:1775::-;37655:20;37678:13;;37655:36;;37720:1;37706:16;;:2;:16;;;37702:48;;;37731:19;;;;;;;;;;;;;;37702:48;37777:1;37765:8;:13;37761:44;;;37787:18;;;;;;;;;;;;;;37761:44;37818:61;37848:1;37852:2;37856:12;37870:8;37818:21;:61::i;:::-;38191:8;38156:12;:16;38169:2;38156:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38255:8;38215:12;:16;38228:2;38215:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38314:2;38281:11;:25;38293:12;38281:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38381:15;38331:11;:25;38343:12;38331:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38414:20;38437:12;38414:35;;38464:11;38493:8;38478:12;:23;38464:37;;38522:4;:23;;;;;38530:15;:2;:13;;;:15::i;:::-;38522:23;38518:641;;;38566:314;38622:12;38618:2;38597:38;;38614:1;38597:38;;;;;;;;;;;;38663:69;38702:1;38706:2;38710:14;;;;;;38726:5;38663:30;:69::i;:::-;38658:174;;38768:40;;;;;;;;;;;;;;38658:174;38875:3;38859:12;:19;;38566:314;;38961:12;38944:13;;:29;38940:43;;38975:8;;;38940:43;38518:641;;;39024:120;39080:14;;;;;;39076:2;39055:40;;39072:1;39055:40;;;;;;;;;;;;39139:3;39123:12;:19;;39024:120;;38518:641;39189:12;39173:13;:28;;;;38131:1082;;39223:60;39252:1;39256:2;39260:12;39274:8;39223:20;:60::i;:::-;37644:1647;37516:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:143::-;3516:5;3547:6;3541:13;3532:22;;3563:33;3590:5;3563:33;:::i;:::-;3459:143;;;;:::o;3608:329::-;3667:6;3716:2;3704:9;3695:7;3691:23;3687:32;3684:119;;;3722:79;;:::i;:::-;3684:119;3842:1;3867:53;3912:7;3903:6;3892:9;3888:22;3867:53;:::i;:::-;3857:63;;3813:117;3608:329;;;;:::o;3943:474::-;4011:6;4019;4068:2;4056:9;4047:7;4043:23;4039:32;4036:119;;;4074:79;;:::i;:::-;4036:119;4194:1;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4165:117;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3943:474;;;;;:::o;4423:619::-;4500:6;4508;4516;4565:2;4553:9;4544:7;4540:23;4536:32;4533:119;;;4571:79;;:::i;:::-;4533:119;4691:1;4716:53;4761:7;4752:6;4741:9;4737:22;4716:53;:::i;:::-;4706:63;;4662:117;4818:2;4844:53;4889:7;4880:6;4869:9;4865:22;4844:53;:::i;:::-;4834:63;;4789:118;4946:2;4972:53;5017:7;5008:6;4997:9;4993:22;4972:53;:::i;:::-;4962:63;;4917:118;4423:619;;;;;:::o;5048:943::-;5143:6;5151;5159;5167;5216:3;5204:9;5195:7;5191:23;5187:33;5184:120;;;5223:79;;:::i;:::-;5184:120;5343:1;5368:53;5413:7;5404:6;5393:9;5389:22;5368:53;:::i;:::-;5358:63;;5314:117;5470:2;5496:53;5541:7;5532:6;5521:9;5517:22;5496:53;:::i;:::-;5486:63;;5441:118;5598:2;5624:53;5669:7;5660:6;5649:9;5645:22;5624:53;:::i;:::-;5614:63;;5569:118;5754:2;5743:9;5739:18;5726:32;5785:18;5777:6;5774:30;5771:117;;;5807:79;;:::i;:::-;5771:117;5912:62;5966:7;5957:6;5946:9;5942:22;5912:62;:::i;:::-;5902:72;;5697:287;5048:943;;;;;;;:::o;5997:468::-;6062:6;6070;6119:2;6107:9;6098:7;6094:23;6090:32;6087:119;;;6125:79;;:::i;:::-;6087:119;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6372:2;6398:50;6440:7;6431:6;6420:9;6416:22;6398:50;:::i;:::-;6388:60;;6343:115;5997:468;;;;;:::o;6471:474::-;6539:6;6547;6596:2;6584:9;6575:7;6571:23;6567:32;6564:119;;;6602:79;;:::i;:::-;6564:119;6722:1;6747:53;6792:7;6783:6;6772:9;6768:22;6747:53;:::i;:::-;6737:63;;6693:117;6849:2;6875:53;6920:7;6911:6;6900:9;6896:22;6875:53;:::i;:::-;6865:63;;6820:118;6471:474;;;;;:::o;6951:934::-;7073:6;7081;7089;7097;7146:2;7134:9;7125:7;7121:23;7117:32;7114:119;;;7152:79;;:::i;:::-;7114:119;7300:1;7289:9;7285:17;7272:31;7330:18;7322:6;7319:30;7316:117;;;7352:79;;:::i;:::-;7316:117;7465:80;7537:7;7528:6;7517:9;7513:22;7465:80;:::i;:::-;7447:98;;;;7243:312;7622:2;7611:9;7607:18;7594:32;7653:18;7645:6;7642:30;7639:117;;;7675:79;;:::i;:::-;7639:117;7788:80;7860:7;7851:6;7840:9;7836:22;7788:80;:::i;:::-;7770:98;;;;7565:313;6951:934;;;;;;;:::o;7891:327::-;7949:6;7998:2;7986:9;7977:7;7973:23;7969:32;7966:119;;;8004:79;;:::i;:::-;7966:119;8124:1;8149:52;8193:7;8184:6;8173:9;8169:22;8149:52;:::i;:::-;8139:62;;8095:116;7891:327;;;;:::o;8224:349::-;8293:6;8342:2;8330:9;8321:7;8317:23;8313:32;8310:119;;;8348:79;;:::i;:::-;8310:119;8468:1;8493:63;8548:7;8539:6;8528:9;8524:22;8493:63;:::i;:::-;8483:73;;8439:127;8224:349;;;;:::o;8579:509::-;8648:6;8697:2;8685:9;8676:7;8672:23;8668:32;8665:119;;;8703:79;;:::i;:::-;8665:119;8851:1;8840:9;8836:17;8823:31;8881:18;8873:6;8870:30;8867:117;;;8903:79;;:::i;:::-;8867:117;9008:63;9063:7;9054:6;9043:9;9039:22;9008:63;:::i;:::-;8998:73;;8794:287;8579:509;;;;:::o;9094:329::-;9153:6;9202:2;9190:9;9181:7;9177:23;9173:32;9170:119;;;9208:79;;:::i;:::-;9170:119;9328:1;9353:53;9398:7;9389:6;9378:9;9374:22;9353:53;:::i;:::-;9343:63;;9299:117;9094:329;;;;:::o;9429:351::-;9499:6;9548:2;9536:9;9527:7;9523:23;9519:32;9516:119;;;9554:79;;:::i;:::-;9516:119;9674:1;9699:64;9755:7;9746:6;9735:9;9731:22;9699:64;:::i;:::-;9689:74;;9645:128;9429:351;;;;:::o;9786:179::-;9855:10;9876:46;9918:3;9910:6;9876:46;:::i;:::-;9954:4;9949:3;9945:14;9931:28;;9786:179;;;;:::o;9971:118::-;10058:24;10076:5;10058:24;:::i;:::-;10053:3;10046:37;9971:118;;:::o;10125:732::-;10244:3;10273:54;10321:5;10273:54;:::i;:::-;10343:86;10422:6;10417:3;10343:86;:::i;:::-;10336:93;;10453:56;10503:5;10453:56;:::i;:::-;10532:7;10563:1;10548:284;10573:6;10570:1;10567:13;10548:284;;;10649:6;10643:13;10676:63;10735:3;10720:13;10676:63;:::i;:::-;10669:70;;10762:60;10815:6;10762:60;:::i;:::-;10752:70;;10608:224;10595:1;10592;10588:9;10583:14;;10548:284;;;10552:14;10848:3;10841:10;;10249:608;;;10125:732;;;;:::o;10863:109::-;10944:21;10959:5;10944:21;:::i;:::-;10939:3;10932:34;10863:109;;:::o;10978:360::-;11064:3;11092:38;11124:5;11092:38;:::i;:::-;11146:70;11209:6;11204:3;11146:70;:::i;:::-;11139:77;;11225:52;11270:6;11265:3;11258:4;11251:5;11247:16;11225:52;:::i;:::-;11302:29;11324:6;11302:29;:::i;:::-;11297:3;11293:39;11286:46;;11068:270;10978:360;;;;:::o;11344:364::-;11432:3;11460:39;11493:5;11460:39;:::i;:::-;11515:71;11579:6;11574:3;11515:71;:::i;:::-;11508:78;;11595:52;11640:6;11635:3;11628:4;11621:5;11617:16;11595:52;:::i;:::-;11672:29;11694:6;11672:29;:::i;:::-;11667:3;11663:39;11656:46;;11436:272;11344:364;;;;:::o;11714:377::-;11820:3;11848:39;11881:5;11848:39;:::i;:::-;11903:89;11985:6;11980:3;11903:89;:::i;:::-;11896:96;;12001:52;12046:6;12041:3;12034:4;12027:5;12023:16;12001:52;:::i;:::-;12078:6;12073:3;12069:16;12062:23;;11824:267;11714:377;;;;:::o;12097:366::-;12239:3;12260:67;12324:2;12319:3;12260:67;:::i;:::-;12253:74;;12336:93;12425:3;12336:93;:::i;:::-;12454:2;12449:3;12445:12;12438:19;;12097:366;;;:::o;12469:::-;12611:3;12632:67;12696:2;12691:3;12632:67;:::i;:::-;12625:74;;12708:93;12797:3;12708:93;:::i;:::-;12826:2;12821:3;12817:12;12810:19;;12469:366;;;:::o;12841:::-;12983:3;13004:67;13068:2;13063:3;13004:67;:::i;:::-;12997:74;;13080:93;13169:3;13080:93;:::i;:::-;13198:2;13193:3;13189:12;13182:19;;12841:366;;;:::o;13213:::-;13355:3;13376:67;13440:2;13435:3;13376:67;:::i;:::-;13369:74;;13452:93;13541:3;13452:93;:::i;:::-;13570:2;13565:3;13561:12;13554:19;;13213:366;;;:::o;13585:365::-;13727:3;13748:66;13812:1;13807:3;13748:66;:::i;:::-;13741:73;;13823:93;13912:3;13823:93;:::i;:::-;13941:2;13936:3;13932:12;13925:19;;13585:365;;;:::o;13956:400::-;14116:3;14137:84;14219:1;14214:3;14137:84;:::i;:::-;14130:91;;14230:93;14319:3;14230:93;:::i;:::-;14348:1;14343:3;14339:11;14332:18;;13956:400;;;:::o;14362:366::-;14504:3;14525:67;14589:2;14584:3;14525:67;:::i;:::-;14518:74;;14601:93;14690:3;14601:93;:::i;:::-;14719:2;14714:3;14710:12;14703:19;;14362:366;;;:::o;14734:::-;14876:3;14897:67;14961:2;14956:3;14897:67;:::i;:::-;14890:74;;14973:93;15062:3;14973:93;:::i;:::-;15091:2;15086:3;15082:12;15075:19;;14734:366;;;:::o;15106:108::-;15183:24;15201:5;15183:24;:::i;:::-;15178:3;15171:37;15106:108;;:::o;15220:118::-;15307:24;15325:5;15307:24;:::i;:::-;15302:3;15295:37;15220:118;;:::o;15344:435::-;15524:3;15546:95;15637:3;15628:6;15546:95;:::i;:::-;15539:102;;15658:95;15749:3;15740:6;15658:95;:::i;:::-;15651:102;;15770:3;15763:10;;15344:435;;;;;:::o;15785:541::-;16018:3;16040:95;16131:3;16122:6;16040:95;:::i;:::-;16033:102;;16152:148;16296:3;16152:148;:::i;:::-;16145:155;;16317:3;16310:10;;15785:541;;;;:::o;16332:222::-;16425:4;16463:2;16452:9;16448:18;16440:26;;16476:71;16544:1;16533:9;16529:17;16520:6;16476:71;:::i;:::-;16332:222;;;;:::o;16560:640::-;16755:4;16793:3;16782:9;16778:19;16770:27;;16807:71;16875:1;16864:9;16860:17;16851:6;16807:71;:::i;:::-;16888:72;16956:2;16945:9;16941:18;16932:6;16888:72;:::i;:::-;16970;17038:2;17027:9;17023:18;17014:6;16970:72;:::i;:::-;17089:9;17083:4;17079:20;17074:2;17063:9;17059:18;17052:48;17117:76;17188:4;17179:6;17117:76;:::i;:::-;17109:84;;16560:640;;;;;;;:::o;17206:373::-;17349:4;17387:2;17376:9;17372:18;17364:26;;17436:9;17430:4;17426:20;17422:1;17411:9;17407:17;17400:47;17464:108;17567:4;17558:6;17464:108;:::i;:::-;17456:116;;17206:373;;;;:::o;17585:210::-;17672:4;17710:2;17699:9;17695:18;17687:26;;17723:65;17785:1;17774:9;17770:17;17761:6;17723:65;:::i;:::-;17585:210;;;;:::o;17801:313::-;17914:4;17952:2;17941:9;17937:18;17929:26;;18001:9;17995:4;17991:20;17987:1;17976:9;17972:17;17965:47;18029:78;18102:4;18093:6;18029:78;:::i;:::-;18021:86;;17801:313;;;;:::o;18120:419::-;18286:4;18324:2;18313:9;18309:18;18301:26;;18373:9;18367:4;18363:20;18359:1;18348:9;18344:17;18337:47;18401:131;18527:4;18401:131;:::i;:::-;18393:139;;18120:419;;;:::o;18545:::-;18711:4;18749:2;18738:9;18734:18;18726:26;;18798:9;18792:4;18788:20;18784:1;18773:9;18769:17;18762:47;18826:131;18952:4;18826:131;:::i;:::-;18818:139;;18545:419;;;:::o;18970:::-;19136:4;19174:2;19163:9;19159:18;19151:26;;19223:9;19217:4;19213:20;19209:1;19198:9;19194:17;19187:47;19251:131;19377:4;19251:131;:::i;:::-;19243:139;;18970:419;;;:::o;19395:::-;19561:4;19599:2;19588:9;19584:18;19576:26;;19648:9;19642:4;19638:20;19634:1;19623:9;19619:17;19612:47;19676:131;19802:4;19676:131;:::i;:::-;19668:139;;19395:419;;;:::o;19820:::-;19986:4;20024:2;20013:9;20009:18;20001:26;;20073:9;20067:4;20063:20;20059:1;20048:9;20044:17;20037:47;20101:131;20227:4;20101:131;:::i;:::-;20093:139;;19820:419;;;:::o;20245:::-;20411:4;20449:2;20438:9;20434:18;20426:26;;20498:9;20492:4;20488:20;20484:1;20473:9;20469:17;20462:47;20526:131;20652:4;20526:131;:::i;:::-;20518:139;;20245:419;;;:::o;20670:::-;20836:4;20874:2;20863:9;20859:18;20851:26;;20923:9;20917:4;20913:20;20909:1;20898:9;20894:17;20887:47;20951:131;21077:4;20951:131;:::i;:::-;20943:139;;20670:419;;;:::o;21095:222::-;21188:4;21226:2;21215:9;21211:18;21203:26;;21239:71;21307:1;21296:9;21292:17;21283:6;21239:71;:::i;:::-;21095:222;;;;:::o;21323:129::-;21357:6;21384:20;;:::i;:::-;21374:30;;21413:33;21441:4;21433:6;21413:33;:::i;:::-;21323:129;;;:::o;21458:75::-;21491:6;21524:2;21518:9;21508:19;;21458:75;:::o;21539:307::-;21600:4;21690:18;21682:6;21679:30;21676:56;;;21712:18;;:::i;:::-;21676:56;21750:29;21772:6;21750:29;:::i;:::-;21742:37;;21834:4;21828;21824:15;21816:23;;21539:307;;;:::o;21852:308::-;21914:4;22004:18;21996:6;21993:30;21990:56;;;22026:18;;:::i;:::-;21990:56;22064:29;22086:6;22064:29;:::i;:::-;22056:37;;22148:4;22142;22138:15;22130:23;;21852:308;;;:::o;22166:132::-;22233:4;22256:3;22248:11;;22286:4;22281:3;22277:14;22269:22;;22166:132;;;:::o;22304:114::-;22371:6;22405:5;22399:12;22389:22;;22304:114;;;:::o;22424:98::-;22475:6;22509:5;22503:12;22493:22;;22424:98;;;:::o;22528:99::-;22580:6;22614:5;22608:12;22598:22;;22528:99;;;:::o;22633:113::-;22703:4;22735;22730:3;22726:14;22718:22;;22633:113;;;:::o;22752:184::-;22851:11;22885:6;22880:3;22873:19;22925:4;22920:3;22916:14;22901:29;;22752:184;;;;:::o;22942:168::-;23025:11;23059:6;23054:3;23047:19;23099:4;23094:3;23090:14;23075:29;;22942:168;;;;:::o;23116:169::-;23200:11;23234:6;23229:3;23222:19;23274:4;23269:3;23265:14;23250:29;;23116:169;;;;:::o;23291:148::-;23393:11;23430:3;23415:18;;23291:148;;;;:::o;23445:305::-;23485:3;23504:20;23522:1;23504:20;:::i;:::-;23499:25;;23538:20;23556:1;23538:20;:::i;:::-;23533:25;;23692:1;23624:66;23620:74;23617:1;23614:81;23611:107;;;23698:18;;:::i;:::-;23611:107;23742:1;23739;23735:9;23728:16;;23445:305;;;;:::o;23756:185::-;23796:1;23813:20;23831:1;23813:20;:::i;:::-;23808:25;;23847:20;23865:1;23847:20;:::i;:::-;23842:25;;23886:1;23876:35;;23891:18;;:::i;:::-;23876:35;23933:1;23930;23926:9;23921:14;;23756:185;;;;:::o;23947:191::-;23987:4;24007:20;24025:1;24007:20;:::i;:::-;24002:25;;24041:20;24059:1;24041:20;:::i;:::-;24036:25;;24080:1;24077;24074:8;24071:34;;;24085:18;;:::i;:::-;24071:34;24130:1;24127;24123:9;24115:17;;23947:191;;;;:::o;24144:96::-;24181:7;24210:24;24228:5;24210:24;:::i;:::-;24199:35;;24144:96;;;:::o;24246:90::-;24280:7;24323:5;24316:13;24309:21;24298:32;;24246:90;;;:::o;24342:149::-;24378:7;24418:66;24411:5;24407:78;24396:89;;24342:149;;;:::o;24497:126::-;24534:7;24574:42;24567:5;24563:54;24552:65;;24497:126;;;:::o;24629:77::-;24666:7;24695:5;24684:16;;24629:77;;;:::o;24712:154::-;24796:6;24791:3;24786;24773:30;24858:1;24849:6;24844:3;24840:16;24833:27;24712:154;;;:::o;24872:307::-;24940:1;24950:113;24964:6;24961:1;24958:13;24950:113;;;25049:1;25044:3;25040:11;25034:18;25030:1;25025:3;25021:11;25014:39;24986:2;24983:1;24979:10;24974:15;;24950:113;;;25081:6;25078:1;25075:13;25072:101;;;25161:1;25152:6;25147:3;25143:16;25136:27;25072:101;24921:258;24872:307;;;:::o;25185:320::-;25229:6;25266:1;25260:4;25256:12;25246:22;;25313:1;25307:4;25303:12;25334:18;25324:81;;25390:4;25382:6;25378:17;25368:27;;25324:81;25452:2;25444:6;25441:14;25421:18;25418:38;25415:84;;;25471:18;;:::i;:::-;25415:84;25236:269;25185:320;;;:::o;25511:281::-;25594:27;25616:4;25594:27;:::i;:::-;25586:6;25582:40;25724:6;25712:10;25709:22;25688:18;25676:10;25673:34;25670:62;25667:88;;;25735:18;;:::i;:::-;25667:88;25775:10;25771:2;25764:22;25554:238;25511:281;;:::o;25798:233::-;25837:3;25860:24;25878:5;25860:24;:::i;:::-;25851:33;;25906:66;25899:5;25896:77;25893:103;;;25976:18;;:::i;:::-;25893:103;26023:1;26016:5;26012:13;26005:20;;25798:233;;;:::o;26037:176::-;26069:1;26086:20;26104:1;26086:20;:::i;:::-;26081:25;;26120:20;26138:1;26120:20;:::i;:::-;26115:25;;26159:1;26149:35;;26164:18;;:::i;:::-;26149:35;26205:1;26202;26198:9;26193:14;;26037:176;;;;:::o;26219:180::-;26267:77;26264:1;26257:88;26364:4;26361:1;26354:15;26388:4;26385:1;26378:15;26405:180;26453:77;26450:1;26443:88;26550:4;26547:1;26540:15;26574:4;26571:1;26564:15;26591:180;26639:77;26636:1;26629:88;26736:4;26733:1;26726:15;26760:4;26757:1;26750:15;26777:180;26825:77;26822:1;26815:88;26922:4;26919:1;26912:15;26946:4;26943:1;26936:15;26963:180;27011:77;27008:1;27001:88;27108:4;27105:1;27098:15;27132:4;27129:1;27122:15;27149:117;27258:1;27255;27248:12;27272:117;27381:1;27378;27371:12;27395:117;27504:1;27501;27494:12;27518:117;27627:1;27624;27617:12;27641:117;27750:1;27747;27740:12;27764:117;27873:1;27870;27863:12;27887:102;27928:6;27979:2;27975:7;27970:2;27963:5;27959:14;27955:28;27945:38;;27887:102;;;:::o;27995:171::-;28135:23;28131:1;28123:6;28119:14;28112:47;27995:171;:::o;28172:225::-;28312:34;28308:1;28300:6;28296:14;28289:58;28381:8;28376:2;28368:6;28364:15;28357:33;28172:225;:::o;28403:172::-;28543:24;28539:1;28531:6;28527:14;28520:48;28403:172;:::o;28581:165::-;28721:17;28717:1;28709:6;28705:14;28698:41;28581:165;:::o;28752:158::-;28892:10;28888:1;28880:6;28876:14;28869:34;28752:158;:::o;28916:155::-;29056:7;29052:1;29044:6;29040:14;29033:31;28916:155;:::o;29077:163::-;29217:15;29213:1;29205:6;29201:14;29194:39;29077:163;:::o;29246:182::-;29386:34;29382:1;29374:6;29370:14;29363:58;29246:182;:::o;29434:122::-;29507:24;29525:5;29507:24;:::i;:::-;29500:5;29497:35;29487:63;;29546:1;29543;29536:12;29487:63;29434:122;:::o;29562:116::-;29632:21;29647:5;29632:21;:::i;:::-;29625:5;29622:32;29612:60;;29668:1;29665;29658:12;29612:60;29562:116;:::o;29684:120::-;29756:23;29773:5;29756:23;:::i;:::-;29749:5;29746:34;29736:62;;29794:1;29791;29784:12;29736:62;29684:120;:::o;29810:122::-;29883:24;29901:5;29883:24;:::i;:::-;29876:5;29873:35;29863:63;;29922:1;29919;29912:12;29863:63;29810:122;:::o

Swarm Source

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