ETH Price: $3,610.59 (-2.21%)

Token

ERC-20: ents-town.wtf (ents)
 

Overview

Max Total Supply

6,969 ents

Holders

591

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
10 ents
0x51b8b079bcee06342a1f573438f2ee7d26cf3815
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:
Entstown

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-06-24
*/

// File: contracts/IMeta.sol



//........................................................................................................
//.......................................SSSSSS..................OOOOOO...................................
//.EEEEEEEEEEE.ENNN....NNN.NNTTTTTTTTT..SSSSSSSS..SSTTTTTTTTT..OOOOOOOOO..OOOWW..WWWW...WWWWWNNNN...NNNN..
//.EEEEEEEEEEE.ENNNN...NNN.NNTTTTTTTTT.SSSSSSSSSS.SSTTTTTTTTT.TOOOOOOOOOO..OOWW..WWWWW..WWWWWNNNNN..NNNN..
//.EEEEEEEEEEE.ENNNN...NNN.NNTTTTTTTTT.SSSSSSSSSS.SSTTTTTTTTT.TOOOOOOOOOOO.OOWW..WWWWW.WWWWWWNNNNN..NNNN..
//.EEEE........ENNNNN..NNN.....TTTT...TSSS...SSSSS....TTTT...TTOOO....OOOO.OOWW.WWWWWW.WWWW.WNNNNNN.NNNN..
//.EEEEEEEEEE..ENNNNNN.NNN.....TTTT...TSSSSS..........TTTT...TTOO.....OOOO..OWWWWWWWWW.WWWW.WNNNNNN.NNNN..
//.EEEEEEEEEE..ENNNNNN.NNN.....TTTT....SSSSSSSSS......TTTT...TTOO......OOOO.OWWWWWWWWW.WWWW.WNNNNNNNNNNN..
//.EEEEEEEEEE..ENN.NNNNNNN.....TTTT....SSSSSSSSSS.....TTTT...TTOO......OOOO.OWWWWWWWWWWWWW..WNNNNNNNNNNN..
//.EEEEEEEEEE..ENN.NNNNNNN.....TTTT......SSSSSSSSS....TTTT...TTOO......OOOO.OWWWWWWWWWWWWW..WNNN.NNNNNNN..
//.EEEE........ENN..NNNNNN.....TTTT...TSSS..SSSSSS....TTTT...TTOO.....OOOO...WWWWWW.WWWWWW..WNNN.NNNNNNN..
//.EEEE........ENN..NNNNNN.....TTTT...TSSS....SSSS....TTTT...TTOOO....OOOO...WWWWWW.WWWWWW..WNNN..NNNNNN..
//.EEEEEEEEEEE.ENN...NNNNN.....TTTT...TSSSSSSSSSSS....TTTT....TOOOOOOOOOOO...WWWWW..WWWWW...WNNN...NNNNN..
//.EEEEEEEEEEE.ENN...NNNNN.....TTTT....SSSSSSSSSS.....TTTT.....OOOOOOOOOO.....WWWW..WWWWW...WNNN...NNNNN..
//.EEEEEEEEEEE.ENN....NNNN.....TTTT.....SSSSSSSSS.....TTTT.....OOOOOOOOO......WWWW..WWWWW...WNNN....NNNN..
//.......................................SSSSSS..................OOOOOO...................................
//........................................................................................................
//creator : @entstownwtf
//website : ents.town

pragma solidity ^0.8.0;

interface IMeta 
{
    function getMetadata(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    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;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

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

    // ==============================
    //            IERC165
    // ==============================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

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

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

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

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

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

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

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

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

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-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 {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

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

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

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @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 transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

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

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

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

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

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

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: contracts/Entstown.sol

//SPDX-License-Identifier: MIT

//........................................................................................................
//.......................................SSSSSS..................OOOOOO...................................
//.EEEEEEEEEEE.ENNN....NNN.NNTTTTTTTTT..SSSSSSSS..SSTTTTTTTTT..OOOOOOOOO..OOOWW..WWWW...WWWWWNNNN...NNNN..
//.EEEEEEEEEEE.ENNNN...NNN.NNTTTTTTTTT.SSSSSSSSSS.SSTTTTTTTTT.TOOOOOOOOOO..OOWW..WWWWW..WWWWWNNNNN..NNNN..
//.EEEEEEEEEEE.ENNNN...NNN.NNTTTTTTTTT.SSSSSSSSSS.SSTTTTTTTTT.TOOOOOOOOOOO.OOWW..WWWWW.WWWWWWNNNNN..NNNN..
//.EEEE........ENNNNN..NNN.....TTTT...TSSS...SSSSS....TTTT...TTOOO....OOOO.OOWW.WWWWWW.WWWW.WNNNNNN.NNNN..
//.EEEEEEEEEE..ENNNNNN.NNN.....TTTT...TSSSSS..........TTTT...TTOO.....OOOO..OWWWWWWWWW.WWWW.WNNNNNN.NNNN..
//.EEEEEEEEEE..ENNNNNN.NNN.....TTTT....SSSSSSSSS......TTTT...TTOO......OOOO.OWWWWWWWWW.WWWW.WNNNNNNNNNNN..
//.EEEEEEEEEE..ENN.NNNNNNN.....TTTT....SSSSSSSSSS.....TTTT...TTOO......OOOO.OWWWWWWWWWWWWW..WNNNNNNNNNNN..
//.EEEEEEEEEE..ENN.NNNNNNN.....TTTT......SSSSSSSSS....TTTT...TTOO......OOOO.OWWWWWWWWWWWWW..WNNN.NNNNNNN..
//.EEEE........ENN..NNNNNN.....TTTT...TSSS..SSSSSS....TTTT...TTOO.....OOOO...WWWWWW.WWWWWW..WNNN.NNNNNNN..
//.EEEE........ENN..NNNNNN.....TTTT...TSSS....SSSS....TTTT...TTOOO....OOOO...WWWWWW.WWWWWW..WNNN..NNNNNN..
//.EEEEEEEEEEE.ENN...NNNNN.....TTTT...TSSSSSSSSSSS....TTTT....TOOOOOOOOOOO...WWWWW..WWWWW...WNNN...NNNNN..
//.EEEEEEEEEEE.ENN...NNNNN.....TTTT....SSSSSSSSSS.....TTTT.....OOOOOOOOOO.....WWWW..WWWWW...WNNN...NNNNN..
//.EEEEEEEEEEE.ENN....NNNN.....TTTT.....SSSSSSSSS.....TTTT.....OOOOOOOOO......WWWW..WWWWW...WNNN....NNNN..
//.......................................SSSSSS..................OOOOOO...................................
//........................................................................................................
//creator : @entstownwtf
//website : ents.town

pragma solidity ^0.8.0; 







contract Entstown is ERC721A, Ownable, Pausable 
{
    using Strings for uint256;
    
    uint256 public totalColSize = 6969;
    mapping(address => uint256) public mintList;
    uint256 public walletMintLimit = 30;
    uint256 public txnMintLimit = 10;
    uint256 public txnWLMintLimit = 15;
    bytes32 public freeWLMerkleRoot = 0xbd634cf99ef3e23b5561c713826ac4b5323ce6b0f4969260dcc6b5033104a6e2;
    address public mdProvider;
    string private baseTokenURI;
    bool public providerBasedURI;
    bool public freeMintActive;

    constructor
    ( 
       string memory _name,
       string memory _symbol,
       string memory _baseTokenURI
    ) ERC721A(_name, _symbol) 
    {
        baseTokenURI = _baseTokenURI;
    }

    modifier callerIsUser() 
    {
        require(tx.origin == msg.sender, "Caller is contract");
        _;
    }

    modifier onlyFreeMintActive() {
        require(freeMintActive, "Minting is not active");
        _;
    }

    function setMdProvider(address _mdProvider) external onlyOwner {
        mdProvider = _mdProvider;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "Token not existed");
        require( providerBasedURI ? ( mdProvider != address(0) ) : ( keccak256(abi.encodePacked(baseTokenURI)) != keccak256(abi.encodePacked("")) ),
            "Invalid metadata provider address"
        );

        return providerBasedURI ? IMeta(mdProvider).getMetadata(_tokenId) : string(abi.encodePacked(baseTokenURI, _tokenId.toString(),".json"));
    }
    
    
    function setBaseURI(string calldata _baseTokenURI) external onlyOwner 
    {
        baseTokenURI = _baseTokenURI;
    }


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

    function setFreeWLMerkleRoot(bytes32 _freeWLMerkleRoot)
        external
        onlyOwner
    {
        freeWLMerkleRoot = _freeWLMerkleRoot;
    }


    function wlFreeMint(bytes32[] calldata _merkleProof, uint256 quantity)
        external
        payable
        onlyFreeMintActive
        callerIsUser 
    {
        require(quantity <= txnWLMintLimit, "Up to 15 mints allowed per transaction");
        require(mintList[msg.sender] + quantity <= walletMintLimit, "Up to 30 mints allowed per wallet");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");   

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(
             MerkleProof.verify(_merkleProof, freeWLMerkleRoot, leaf),
             "You are not whitelisted"
         );

        mintList[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);
    }

    function freeMint(uint256 quantity)
        external
        payable
        onlyFreeMintActive
        callerIsUser    
    {
        require(quantity <= txnMintLimit, "Up to 10 mints allowed per transaction");
        require(mintList[msg.sender] + quantity <= walletMintLimit, "Up to 30 mints allowed per wallet");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");

        mintList[msg.sender] += quantity;
        _safeMint(msg.sender, quantity);
    }
    
    function teamMint(uint256 quantity)
        external
        payable
        onlyOwner
    {
        require(quantity > 0, "Invalid quantity");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");

        _safeMint(msg.sender, quantity);
    }

    function airdrop(address toAdd,uint256 quantity)
        external
        payable
        onlyOwner
    {
        require(quantity > 0, "Invalid quantity");
        require(totalSupply() + quantity <= totalColSize, "EXCEED_COL_SIZE");

        _safeMint(toAdd, quantity);
    }

    function toggleProviderBasedURI() 
        external 
        onlyOwner 
    {
        providerBasedURI = !providerBasedURI;
    }

    function togglefreeMint() 
        external 
        onlyOwner 
    {
        freeMintActive = !freeMintActive;
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }
    
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 tokenId,
        uint256 quantity
    ) internal override(ERC721A) whenNotPaused 
    {
        super._beforeTokenTransfers(from, to, tokenId, quantity);
    }

    function changeSupply(uint256 _decreaseAmount) 
        external 
        onlyOwner 
    {
        require(_decreaseAmount > 0 ,"Amount must be greater than 0");
        require(totalSupply() < totalColSize ,"Just sold out" );
        require(totalColSize - _decreaseAmount >= totalSupply() ,"Insufficient amount" );
        totalColSize -= _decreaseAmount;
    }

    function changeMintLimitPerWallet(uint256 _newLimitPerWallet) 
        external 
        onlyOwner 
    {
        require(_newLimitPerWallet > 0 ,"Invalid value");
        walletMintLimit = _newLimitPerWallet;
    }
    function changeMintLimitPerTxn(uint256 _newLimitPerTxn) 
        external 
        onlyOwner 
    {
        require(_newLimitPerTxn > 0 ,"Invalid value");
        txnMintLimit = _newLimitPerTxn;
    }
    function changeWLMintLimitPerTxn(uint256 _newWLLimitPerTxn) 
        external 
        onlyOwner 
    {
        require(_newWLLimitPerTxn > 0 ,"Invalid value");
        txnWLMintLimit = _newWLLimitPerTxn;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"toAdd","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimitPerTxn","type":"uint256"}],"name":"changeMintLimitPerTxn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimitPerWallet","type":"uint256"}],"name":"changeMintLimitPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_decreaseAmount","type":"uint256"}],"name":"changeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWLLimitPerTxn","type":"uint256"}],"name":"changeWLMintLimitPerTxn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeWLMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mdProvider","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintList","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"providerBasedURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_freeWLMerkleRoot","type":"bytes32"}],"name":"setFreeWLMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mdProvider","type":"address"}],"name":"setMdProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"toggleProviderBasedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglefreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalColSize","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":"txnMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"txnWLMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"walletMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"wlFreeMint","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052611b39600955601e600b55600a600c55600f600d557fbd634cf99ef3e23b5561c713826ac4b5323ce6b0f4969260dcc6b5033104a6e260001b600e553480156200004d57600080fd5b5060405162004e2538038062004e25833981810160405281019062000073919062000321565b828281600290805190602001906200008d929190620001f3565b508060039080519060200190620000a6929190620001f3565b50620000b76200011c60201b60201c565b6000819055505050620000df620000d36200012560201b60201c565b6200012d60201b60201c565b6000600860146101000a81548160ff021916908315150217905550806010908051906020019062000112929190620001f3565b505050506200055e565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000201906200046f565b90600052602060002090601f01602090048101928262000225576000855562000271565b82601f106200024057805160ff191683800117855562000271565b8280016001018555821562000271579182015b828111156200027057825182559160200191906001019062000253565b5b50905062000280919062000284565b5090565b5b808211156200029f57600081600090555060010162000285565b5090565b6000620002ba620002b48462000403565b620003da565b905082815260208101848484011115620002d957620002d86200053e565b5b620002e684828562000439565b509392505050565b600082601f83011262000306576200030562000539565b5b815162000318848260208601620002a3565b91505092915050565b6000806000606084860312156200033d576200033c62000548565b5b600084015167ffffffffffffffff8111156200035e576200035d62000543565b5b6200036c86828701620002ee565b935050602084015167ffffffffffffffff81111562000390576200038f62000543565b5b6200039e86828701620002ee565b925050604084015167ffffffffffffffff811115620003c257620003c162000543565b5b620003d086828701620002ee565b9150509250925092565b6000620003e6620003f9565b9050620003f48282620004a5565b919050565b6000604051905090565b600067ffffffffffffffff8211156200042157620004206200050a565b5b6200042c826200054d565b9050602081019050919050565b60005b83811015620004595780820151818401526020810190506200043c565b8381111562000469576000848401525b50505050565b600060028204905060018216806200048857607f821691505b602082108114156200049f576200049e620004db565b5b50919050565b620004b0826200054d565b810181811067ffffffffffffffff82111715620004d257620004d16200050a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6148b7806200056e6000396000f3fe6080604052600436106102515760003560e01c806378c68e1611610139578063a370518b116100b6578063c87b56dd1161007a578063c87b56dd14610806578063cb5bc2aa14610843578063e8a3193d1461086e578063e985e9c514610899578063f2fde38b146108d6578063fec627e0146108ff57610251565b8063a370518b14610721578063ad60de2c1461074a578063b88d4fde14610775578063bef432c61461079e578063c566fc15146107db57610251565b80638da5cb5b116100fd5780638da5cb5b146106625780638ed21d6a1461068d57806395d89b41146106a4578063a22cb465146106cf578063a32d2739146106f857610251565b806378c68e16146105bd5780637bb232ad146105e85780637c928fe9146106135780638456cb591461062f5780638ba4cc3c1461064657610251565b80633f4ba83a116101d25780635c975abb116101965780635c975abb146104ba5780636352211e146104e55780636a4f06581461052257806370a082311461053e578063715018a61461057b57806374c285611461059257610251565b80633f4ba83a146103ff57806340b29b4a1461041657806342842e0e1461043f57806352148e731461046857806355f804b31461049157610251565b8063156d82a411610219578063156d82a41461034f57806318160ddd1461036657806323b872dd146103915780632fbba115146103ba57806339a7919f146103d657610251565b806301ffc9a71461025657806306fdde031461029357806307e77fac146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906136e2565b610928565b60405161028a9190613d0d565b60405180910390f35b34801561029f57600080fd5b506102a86109ba565b6040516102b59190613d43565b60405180910390f35b3480156102ca57600080fd5b506102d3610a4c565b6040516102e09190613fa5565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b91906137d2565b610a52565b60405161031d9190613ca6565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613615565b610ace565b005b34801561035b57600080fd5b50610364610c0f565b005b34801561037257600080fd5b5061037b610cb7565b6040516103889190613fa5565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b391906134ff565b610cce565b005b6103d460048036038101906103cf91906137d2565b610ff3565b005b3480156103e257600080fd5b506103fd60048036038101906103f891906137d2565b611116565b005b34801561040b57600080fd5b50610414611293565b005b34801561042257600080fd5b5061043d600480360381019061043891906137d2565b611319565b005b34801561044b57600080fd5b50610466600480360381019061046191906134ff565b6113e2565b005b34801561047457600080fd5b5061048f600480360381019061048a9190613492565b611402565b005b34801561049d57600080fd5b506104b860048036038101906104b3919061373c565b6114c2565b005b3480156104c657600080fd5b506104cf611554565b6040516104dc9190613d0d565b60405180910390f35b3480156104f157600080fd5b5061050c600480360381019061050791906137d2565b61156b565b6040516105199190613ca6565b60405180910390f35b61053c60048036038101906105379190613655565b61157d565b005b34801561054a57600080fd5b5061056560048036038101906105609190613492565b611883565b6040516105729190613fa5565b60405180910390f35b34801561058757600080fd5b5061059061193c565b005b34801561059e57600080fd5b506105a76119c4565b6040516105b49190613fa5565b60405180910390f35b3480156105c957600080fd5b506105d26119ca565b6040516105df9190613ca6565b60405180910390f35b3480156105f457600080fd5b506105fd6119f0565b60405161060a9190613fa5565b60405180910390f35b61062d600480360381019061062891906137d2565b6119f6565b005b34801561063b57600080fd5b50610644611c41565b005b610660600480360381019061065b9190613615565b611cc7565b005b34801561066e57600080fd5b50610677611deb565b6040516106849190613ca6565b60405180910390f35b34801561069957600080fd5b506106a2611e15565b005b3480156106b057600080fd5b506106b9611ebd565b6040516106c69190613d43565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f191906135d5565b611f4f565b005b34801561070457600080fd5b5061071f600480360381019061071a91906137d2565b6120c7565b005b34801561072d57600080fd5b50610748600480360381019061074391906137d2565b612190565b005b34801561075657600080fd5b5061075f612259565b60405161076c9190613fa5565b60405180910390f35b34801561078157600080fd5b5061079c60048036038101906107979190613552565b61225f565b005b3480156107aa57600080fd5b506107c560048036038101906107c09190613492565b6122d2565b6040516107d29190613fa5565b60405180910390f35b3480156107e757600080fd5b506107f06122ea565b6040516107fd9190613d0d565b60405180910390f35b34801561081257600080fd5b5061082d600480360381019061082891906137d2565b6122fd565b60405161083a9190613d43565b60405180910390f35b34801561084f57600080fd5b5061085861253e565b6040516108659190613d0d565b60405180910390f35b34801561087a57600080fd5b50610883612551565b6040516108909190613d28565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb91906134bf565b612557565b6040516108cd9190613d0d565b60405180910390f35b3480156108e257600080fd5b506108fd60048036038101906108f89190613492565b6125eb565b005b34801561090b57600080fd5b50610926600480360381019061092191906136b5565b6126e3565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109b35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109c99061421a565b80601f01602080910402602001604051908101604052809291908181526020018280546109f59061421a565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b5050505050905090565b600c5481565b6000610a5d82612769565b610a93576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad98261156b565b90508073ffffffffffffffffffffffffffffffffffffffff16610afa6127c8565b73ffffffffffffffffffffffffffffffffffffffff1614610b5d57610b2681610b216127c8565b612557565b610b5c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610c176127d0565b73ffffffffffffffffffffffffffffffffffffffff16610c35611deb565b73ffffffffffffffffffffffffffffffffffffffff1614610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290613ea5565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6000610cc16127d8565b6001546000540303905090565b6000610cd9826127e1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d40576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d4c846128af565b91509150610d628187610d5d6127c8565b6128d1565b610dae57610d7786610d726127c8565b612557565b610dad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e15576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e228686866001612915565b8015610e2d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610efb85610ed788888761296f565b7c020000000000000000000000000000000000000000000000000000000017612997565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f83576000600185019050600060046000838152602001908152602001600020541415610f81576000548114610f80578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610feb86868660016129c2565b505050505050565b610ffb6127d0565b73ffffffffffffffffffffffffffffffffffffffff16611019611deb565b73ffffffffffffffffffffffffffffffffffffffff161461106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106690613ea5565b60405180910390fd5b600081116110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990613e25565b60405180910390fd5b600954816110be610cb7565b6110c8919061409f565b1115611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090613d85565b60405180910390fd5b61111333826129c8565b50565b61111e6127d0565b73ffffffffffffffffffffffffffffffffffffffff1661113c611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990613ea5565b60405180910390fd5b600081116111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc90613dc5565b60405180910390fd5b6009546111e0610cb7565b10611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790613e45565b60405180910390fd5b611228610cb7565b816009546112369190614126565b1015611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e90613f85565b60405180910390fd5b80600960008282546112899190614126565b9250508190555050565b61129b6127d0565b73ffffffffffffffffffffffffffffffffffffffff166112b9611deb565b73ffffffffffffffffffffffffffffffffffffffff161461130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690613ea5565b60405180910390fd5b6113176129e6565b565b6113216127d0565b73ffffffffffffffffffffffffffffffffffffffff1661133f611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613ea5565b60405180910390fd5b600081116113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613f05565b60405180910390fd5b80600b8190555050565b6113fd8383836040518060200160405280600081525061225f565b505050565b61140a6127d0565b73ffffffffffffffffffffffffffffffffffffffff16611428611deb565b73ffffffffffffffffffffffffffffffffffffffff161461147e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147590613ea5565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114ca6127d0565b73ffffffffffffffffffffffffffffffffffffffff166114e8611deb565b73ffffffffffffffffffffffffffffffffffffffff161461153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613ea5565b60405180910390fd5b81816010919061154f9291906131e5565b505050565b6000600860149054906101000a900460ff16905090565b6000611576826127e1565b9050919050565b601160019054906101000a900460ff166115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c390613ec5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190613f45565b60405180910390fd5b600d5481111561167f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167690613f25565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116cd919061409f565b111561170e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170590613e65565b60405180910390fd5b6009548161171a610cb7565b611724919061409f565b1115611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c90613d85565b60405180910390fd5b6000336040516020016117789190613c30565b6040516020818303038152906040528051906020012090506117de848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612a88565b61181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490613e85565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461186c919061409f565b9250508190555061187d33836129c8565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118eb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6119446127d0565b73ffffffffffffffffffffffffffffffffffffffff16611962611deb565b73ffffffffffffffffffffffffffffffffffffffff16146119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90613ea5565b60405180910390fd5b6119c26000612a9f565b565b600b5481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b601160019054906101000a900460ff16611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c90613ec5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90613f45565b60405180910390fd5b600c54811115611af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aef90613f65565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b46919061409f565b1115611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e90613e65565b60405180910390fd5b60095481611b93610cb7565b611b9d919061409f565b1115611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd590613d85565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2d919061409f565b92505081905550611c3e33826129c8565b50565b611c496127d0565b73ffffffffffffffffffffffffffffffffffffffff16611c67611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb490613ea5565b60405180910390fd5b611cc5612b65565b565b611ccf6127d0565b73ffffffffffffffffffffffffffffffffffffffff16611ced611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90613ea5565b60405180910390fd5b60008111611d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7d90613e25565b60405180910390fd5b60095481611d92610cb7565b611d9c919061409f565b1115611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490613d85565b60405180910390fd5b611de782826129c8565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e1d6127d0565b73ffffffffffffffffffffffffffffffffffffffff16611e3b611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8890613ea5565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b606060038054611ecc9061421a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef89061421a565b8015611f455780601f10611f1a57610100808354040283529160200191611f45565b820191906000526020600020905b815481529060010190602001808311611f2857829003601f168201915b5050505050905090565b611f576127c8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fbc576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611fc96127c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120766127c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120bb9190613d0d565b60405180910390a35050565b6120cf6127d0565b73ffffffffffffffffffffffffffffffffffffffff166120ed611deb565b73ffffffffffffffffffffffffffffffffffffffff1614612143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213a90613ea5565b60405180910390fd5b60008111612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d90613f05565b60405180910390fd5b80600d8190555050565b6121986127d0565b73ffffffffffffffffffffffffffffffffffffffff166121b6611deb565b73ffffffffffffffffffffffffffffffffffffffff161461220c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220390613ea5565b60405180910390fd5b6000811161224f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224690613f05565b60405180910390fd5b80600c8190555050565b600d5481565b61226a848484610cce565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122cc5761229584848484612c08565b6122cb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a6020528060005260406000206000915090505481565b601160009054906101000a900460ff1681565b606061230882612769565b612347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233e90613e05565b60405180910390fd5b601160009054906101000a900460ff166123af5760405160200161236a90613c91565b6040516020818303038152906040528051906020012060106040516020016123929190613c4b565b604051602081830303815290604052805190602001201415612403565b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990613ee5565b60405180910390fd5b601160009054906101000a900460ff1661248657601061246183612d68565b604051602001612472929190613c62565b604051602081830303815290604052612537565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a574cea4836040518263ffffffff1660e01b81526004016124e19190613fa5565b60006040518083038186803b1580156124f957600080fd5b505afa15801561250d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906125369190613789565b5b9050919050565b601160019054906101000a900460ff1681565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125f36127d0565b73ffffffffffffffffffffffffffffffffffffffff16612611611deb565b73ffffffffffffffffffffffffffffffffffffffff1614612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e90613ea5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce90613da5565b60405180910390fd5b6126e081612a9f565b50565b6126eb6127d0565b73ffffffffffffffffffffffffffffffffffffffff16612709611deb565b73ffffffffffffffffffffffffffffffffffffffff161461275f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275690613ea5565b60405180910390fd5b80600e8190555050565b6000816127746127d8565b11158015612783575060005482105b80156127c1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b600080829050806127f06127d8565b11612878576000548110156128775760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612875575b600081141561286b576004600083600190039350838152602001908152602001600020549050612840565b80925050506128aa565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b61291d611554565b1561295d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295490613de5565b60405180910390fd5b61296984848484612ec9565b50505050565b60008060e883901c905060e8612986868684612ecf565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6129e2828260405180602001604052806000815250612ed8565b5050565b6129ee611554565b612a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2490613d65565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a716127d0565b604051612a7e9190613ca6565b60405180910390a1565b600082612a958584612f75565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b6d611554565b15612bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba490613de5565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612bf16127d0565b604051612bfe9190613ca6565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c2e6127c8565b8786866040518563ffffffff1660e01b8152600401612c509493929190613cc1565b602060405180830381600087803b158015612c6a57600080fd5b505af1925050508015612c9b57506040513d601f19601f82011682018060405250810190612c98919061370f565b60015b612d15573d8060008114612ccb576040519150601f19603f3d011682016040523d82523d6000602084013e612cd0565b606091505b50600081511415612d0d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612db0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ec4565b600082905060005b60008214612de2578080612dcb9061427d565b915050600a82612ddb91906140f5565b9150612db8565b60008167ffffffffffffffff811115612dfe57612dfd6143d7565b5b6040519080825280601f01601f191660200182016040528015612e305781602001600182028036833780820191505090505b5090505b60008514612ebd57600182612e499190614126565b9150600a85612e5891906142ea565b6030612e64919061409f565b60f81b818381518110612e7a57612e796143a8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612eb691906140f5565b9450612e34565b8093505050505b919050565b50505050565b60009392505050565b612ee28383612fea565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f7057600080549050600083820390505b612f226000868380600101945086612c08565b612f58576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612f0f578160005414612f6d57600080fd5b50505b505050565b60008082905060005b8451811015612fdf576000858281518110612f9c57612f9b6143a8565b5b60200260200101519050808311612fbe57612fb783826131be565b9250612fcb565b612fc881846131be565b92505b508080612fd79061427d565b915050612f7e565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613057576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415613092576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61309f6000848385612915565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061311683613107600086600061296f565b613110856131d5565b17612997565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061313a578060008190555050506131b960008483856129c2565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546131f19061421a565b90600052602060002090601f016020900481019282613213576000855561325a565b82601f1061322c57803560ff191683800117855561325a565b8280016001018555821561325a579182015b8281111561325957823582559160200191906001019061323e565b5b509050613267919061326b565b5090565b5b8082111561328457600081600090555060010161326c565b5090565b600061329b61329684613fe5565b613fc0565b9050828152602081018484840111156132b7576132b6614415565b5b6132c28482856141d8565b509392505050565b60006132dd6132d884614016565b613fc0565b9050828152602081018484840111156132f9576132f8614415565b5b6133048482856141e7565b509392505050565b60008135905061331b8161480e565b92915050565b60008083601f8401126133375761333661440b565b5b8235905067ffffffffffffffff81111561335457613353614406565b5b6020830191508360208202830111156133705761336f614410565b5b9250929050565b60008135905061338681614825565b92915050565b60008135905061339b8161483c565b92915050565b6000813590506133b081614853565b92915050565b6000815190506133c581614853565b92915050565b600082601f8301126133e0576133df61440b565b5b81356133f0848260208601613288565b91505092915050565b60008083601f84011261340f5761340e61440b565b5b8235905067ffffffffffffffff81111561342c5761342b614406565b5b60208301915083600182028301111561344857613447614410565b5b9250929050565b600082601f8301126134645761346361440b565b5b81516134748482602086016132ca565b91505092915050565b60008135905061348c8161486a565b92915050565b6000602082840312156134a8576134a761441f565b5b60006134b68482850161330c565b91505092915050565b600080604083850312156134d6576134d561441f565b5b60006134e48582860161330c565b92505060206134f58582860161330c565b9150509250929050565b6000806000606084860312156135185761351761441f565b5b60006135268682870161330c565b93505060206135378682870161330c565b92505060406135488682870161347d565b9150509250925092565b6000806000806080858703121561356c5761356b61441f565b5b600061357a8782880161330c565b945050602061358b8782880161330c565b935050604061359c8782880161347d565b925050606085013567ffffffffffffffff8111156135bd576135bc61441a565b5b6135c9878288016133cb565b91505092959194509250565b600080604083850312156135ec576135eb61441f565b5b60006135fa8582860161330c565b925050602061360b85828601613377565b9150509250929050565b6000806040838503121561362c5761362b61441f565b5b600061363a8582860161330c565b925050602061364b8582860161347d565b9150509250929050565b60008060006040848603121561366e5761366d61441f565b5b600084013567ffffffffffffffff81111561368c5761368b61441a565b5b61369886828701613321565b935093505060206136ab8682870161347d565b9150509250925092565b6000602082840312156136cb576136ca61441f565b5b60006136d98482850161338c565b91505092915050565b6000602082840312156136f8576136f761441f565b5b6000613706848285016133a1565b91505092915050565b6000602082840312156137255761372461441f565b5b6000613733848285016133b6565b91505092915050565b600080602083850312156137535761375261441f565b5b600083013567ffffffffffffffff8111156137715761377061441a565b5b61377d858286016133f9565b92509250509250929050565b60006020828403121561379f5761379e61441f565b5b600082015167ffffffffffffffff8111156137bd576137bc61441a565b5b6137c98482850161344f565b91505092915050565b6000602082840312156137e8576137e761441f565b5b60006137f68482850161347d565b91505092915050565b6138088161415a565b82525050565b61381f61381a8261415a565b6142c6565b82525050565b61382e8161416c565b82525050565b61383d81614178565b82525050565b600061384e8261405c565b6138588185614072565b93506138688185602086016141e7565b61387181614424565b840191505092915050565b600061388782614067565b6138918185614083565b93506138a18185602086016141e7565b6138aa81614424565b840191505092915050565b60006138c082614067565b6138ca8185614094565b93506138da8185602086016141e7565b80840191505092915050565b600081546138f38161421a565b6138fd8186614094565b9450600182166000811461391857600181146139295761395c565b60ff1983168652818601935061395c565b61393285614047565b60005b8381101561395457815481890152600182019150602081019050613935565b838801955050505b50505092915050565b6000613972601483614083565b915061397d82614442565b602082019050919050565b6000613995600f83614083565b91506139a08261446b565b602082019050919050565b60006139b8602683614083565b91506139c382614494565b604082019050919050565b60006139db601d83614083565b91506139e6826144e3565b602082019050919050565b60006139fe601083614083565b9150613a098261450c565b602082019050919050565b6000613a21601183614083565b9150613a2c82614535565b602082019050919050565b6000613a44601083614083565b9150613a4f8261455e565b602082019050919050565b6000613a67600d83614083565b9150613a7282614587565b602082019050919050565b6000613a8a602183614083565b9150613a95826145b0565b604082019050919050565b6000613aad601783614083565b9150613ab8826145ff565b602082019050919050565b6000613ad0600583614094565b9150613adb82614628565b600582019050919050565b6000613af3602083614083565b9150613afe82614651565b602082019050919050565b6000613b16601583614083565b9150613b218261467a565b602082019050919050565b6000613b39602183614083565b9150613b44826146a3565b604082019050919050565b6000613b5c600d83614083565b9150613b67826146f2565b602082019050919050565b6000613b7f602683614083565b9150613b8a8261471b565b604082019050919050565b6000613ba2601283614083565b9150613bad8261476a565b602082019050919050565b6000613bc5602683614083565b9150613bd082614793565b604082019050919050565b6000613be8601383614083565b9150613bf3826147e2565b602082019050919050565b6000613c0b600083614094565b9150613c168261480b565b600082019050919050565b613c2a816141ce565b82525050565b6000613c3c828461380e565b60148201915081905092915050565b6000613c5782846138e6565b915081905092915050565b6000613c6e82856138e6565b9150613c7a82846138b5565b9150613c8582613ac3565b91508190509392505050565b6000613c9c82613bfe565b9150819050919050565b6000602082019050613cbb60008301846137ff565b92915050565b6000608082019050613cd660008301876137ff565b613ce360208301866137ff565b613cf06040830185613c21565b8181036060830152613d028184613843565b905095945050505050565b6000602082019050613d226000830184613825565b92915050565b6000602082019050613d3d6000830184613834565b92915050565b60006020820190508181036000830152613d5d818461387c565b905092915050565b60006020820190508181036000830152613d7e81613965565b9050919050565b60006020820190508181036000830152613d9e81613988565b9050919050565b60006020820190508181036000830152613dbe816139ab565b9050919050565b60006020820190508181036000830152613dde816139ce565b9050919050565b60006020820190508181036000830152613dfe816139f1565b9050919050565b60006020820190508181036000830152613e1e81613a14565b9050919050565b60006020820190508181036000830152613e3e81613a37565b9050919050565b60006020820190508181036000830152613e5e81613a5a565b9050919050565b60006020820190508181036000830152613e7e81613a7d565b9050919050565b60006020820190508181036000830152613e9e81613aa0565b9050919050565b60006020820190508181036000830152613ebe81613ae6565b9050919050565b60006020820190508181036000830152613ede81613b09565b9050919050565b60006020820190508181036000830152613efe81613b2c565b9050919050565b60006020820190508181036000830152613f1e81613b4f565b9050919050565b60006020820190508181036000830152613f3e81613b72565b9050919050565b60006020820190508181036000830152613f5e81613b95565b9050919050565b60006020820190508181036000830152613f7e81613bb8565b9050919050565b60006020820190508181036000830152613f9e81613bdb565b9050919050565b6000602082019050613fba6000830184613c21565b92915050565b6000613fca613fdb565b9050613fd6828261424c565b919050565b6000604051905090565b600067ffffffffffffffff82111561400057613fff6143d7565b5b61400982614424565b9050602081019050919050565b600067ffffffffffffffff821115614031576140306143d7565b5b61403a82614424565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140aa826141ce565b91506140b5836141ce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140ea576140e961431b565b5b828201905092915050565b6000614100826141ce565b915061410b836141ce565b92508261411b5761411a61434a565b5b828204905092915050565b6000614131826141ce565b915061413c836141ce565b92508282101561414f5761414e61431b565b5b828203905092915050565b6000614165826141ae565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142055780820151818401526020810190506141ea565b83811115614214576000848401525b50505050565b6000600282049050600182168061423257607f821691505b6020821081141561424657614245614379565b5b50919050565b61425582614424565b810181811067ffffffffffffffff82111715614274576142736143d7565b5b80604052505050565b6000614288826141ce565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142bb576142ba61431b565b5b600182019050919050565b60006142d1826142d8565b9050919050565b60006142e382614435565b9050919050565b60006142f5826141ce565b9150614300836141ce565b9250826143105761430f61434a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4558434545445f434f4c5f53495a450000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546f6b656e206e6f742065786973746564000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4a75737420736f6c64206f757400000000000000000000000000000000000000600082015250565b7f557020746f203330206d696e747320616c6c6f776564207065722077616c6c6560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74696e67206973206e6f74206163746976650000000000000000000000600082015250565b7f496e76616c6964206d657461646174612070726f76696465722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f557020746f203135206d696e747320616c6c6f77656420706572207472616e7360008201527f616374696f6e0000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c657220697320636f6e74726163740000000000000000000000000000600082015250565b7f557020746f203130206d696e747320616c6c6f77656420706572207472616e7360008201527f616374696f6e0000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b50565b6148178161415a565b811461482257600080fd5b50565b61482e8161416c565b811461483957600080fd5b50565b61484581614178565b811461485057600080fd5b50565b61485c81614182565b811461486757600080fd5b50565b614873816141ce565b811461487e57600080fd5b5056fea2646970667358221220e47d47b34b79ae08aa4001f90611e21adcf0efb2640431aa6a285804413b6f9964736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000d656e74732d746f776e2e777466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004656e747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f73746f726167656170692e666c65656b2e636f2f34383934326532662d613031392d343762642d396537392d6636623934306265313566362d6275636b65742f7365637265745f6d642f0000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c806378c68e1611610139578063a370518b116100b6578063c87b56dd1161007a578063c87b56dd14610806578063cb5bc2aa14610843578063e8a3193d1461086e578063e985e9c514610899578063f2fde38b146108d6578063fec627e0146108ff57610251565b8063a370518b14610721578063ad60de2c1461074a578063b88d4fde14610775578063bef432c61461079e578063c566fc15146107db57610251565b80638da5cb5b116100fd5780638da5cb5b146106625780638ed21d6a1461068d57806395d89b41146106a4578063a22cb465146106cf578063a32d2739146106f857610251565b806378c68e16146105bd5780637bb232ad146105e85780637c928fe9146106135780638456cb591461062f5780638ba4cc3c1461064657610251565b80633f4ba83a116101d25780635c975abb116101965780635c975abb146104ba5780636352211e146104e55780636a4f06581461052257806370a082311461053e578063715018a61461057b57806374c285611461059257610251565b80633f4ba83a146103ff57806340b29b4a1461041657806342842e0e1461043f57806352148e731461046857806355f804b31461049157610251565b8063156d82a411610219578063156d82a41461034f57806318160ddd1461036657806323b872dd146103915780632fbba115146103ba57806339a7919f146103d657610251565b806301ffc9a71461025657806306fdde031461029357806307e77fac146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061027d600480360381019061027891906136e2565b610928565b60405161028a9190613d0d565b60405180910390f35b34801561029f57600080fd5b506102a86109ba565b6040516102b59190613d43565b60405180910390f35b3480156102ca57600080fd5b506102d3610a4c565b6040516102e09190613fa5565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b91906137d2565b610a52565b60405161031d9190613ca6565b60405180910390f35b34801561033257600080fd5b5061034d60048036038101906103489190613615565b610ace565b005b34801561035b57600080fd5b50610364610c0f565b005b34801561037257600080fd5b5061037b610cb7565b6040516103889190613fa5565b60405180910390f35b34801561039d57600080fd5b506103b860048036038101906103b391906134ff565b610cce565b005b6103d460048036038101906103cf91906137d2565b610ff3565b005b3480156103e257600080fd5b506103fd60048036038101906103f891906137d2565b611116565b005b34801561040b57600080fd5b50610414611293565b005b34801561042257600080fd5b5061043d600480360381019061043891906137d2565b611319565b005b34801561044b57600080fd5b50610466600480360381019061046191906134ff565b6113e2565b005b34801561047457600080fd5b5061048f600480360381019061048a9190613492565b611402565b005b34801561049d57600080fd5b506104b860048036038101906104b3919061373c565b6114c2565b005b3480156104c657600080fd5b506104cf611554565b6040516104dc9190613d0d565b60405180910390f35b3480156104f157600080fd5b5061050c600480360381019061050791906137d2565b61156b565b6040516105199190613ca6565b60405180910390f35b61053c60048036038101906105379190613655565b61157d565b005b34801561054a57600080fd5b5061056560048036038101906105609190613492565b611883565b6040516105729190613fa5565b60405180910390f35b34801561058757600080fd5b5061059061193c565b005b34801561059e57600080fd5b506105a76119c4565b6040516105b49190613fa5565b60405180910390f35b3480156105c957600080fd5b506105d26119ca565b6040516105df9190613ca6565b60405180910390f35b3480156105f457600080fd5b506105fd6119f0565b60405161060a9190613fa5565b60405180910390f35b61062d600480360381019061062891906137d2565b6119f6565b005b34801561063b57600080fd5b50610644611c41565b005b610660600480360381019061065b9190613615565b611cc7565b005b34801561066e57600080fd5b50610677611deb565b6040516106849190613ca6565b60405180910390f35b34801561069957600080fd5b506106a2611e15565b005b3480156106b057600080fd5b506106b9611ebd565b6040516106c69190613d43565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f191906135d5565b611f4f565b005b34801561070457600080fd5b5061071f600480360381019061071a91906137d2565b6120c7565b005b34801561072d57600080fd5b50610748600480360381019061074391906137d2565b612190565b005b34801561075657600080fd5b5061075f612259565b60405161076c9190613fa5565b60405180910390f35b34801561078157600080fd5b5061079c60048036038101906107979190613552565b61225f565b005b3480156107aa57600080fd5b506107c560048036038101906107c09190613492565b6122d2565b6040516107d29190613fa5565b60405180910390f35b3480156107e757600080fd5b506107f06122ea565b6040516107fd9190613d0d565b60405180910390f35b34801561081257600080fd5b5061082d600480360381019061082891906137d2565b6122fd565b60405161083a9190613d43565b60405180910390f35b34801561084f57600080fd5b5061085861253e565b6040516108659190613d0d565b60405180910390f35b34801561087a57600080fd5b50610883612551565b6040516108909190613d28565b60405180910390f35b3480156108a557600080fd5b506108c060048036038101906108bb91906134bf565b612557565b6040516108cd9190613d0d565b60405180910390f35b3480156108e257600080fd5b506108fd60048036038101906108f89190613492565b6125eb565b005b34801561090b57600080fd5b50610926600480360381019061092191906136b5565b6126e3565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109b35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109c99061421a565b80601f01602080910402602001604051908101604052809291908181526020018280546109f59061421a565b8015610a425780601f10610a1757610100808354040283529160200191610a42565b820191906000526020600020905b815481529060010190602001808311610a2557829003601f168201915b5050505050905090565b600c5481565b6000610a5d82612769565b610a93576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ad98261156b565b90508073ffffffffffffffffffffffffffffffffffffffff16610afa6127c8565b73ffffffffffffffffffffffffffffffffffffffff1614610b5d57610b2681610b216127c8565b612557565b610b5c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610c176127d0565b73ffffffffffffffffffffffffffffffffffffffff16610c35611deb565b73ffffffffffffffffffffffffffffffffffffffff1614610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290613ea5565b60405180910390fd5b601160019054906101000a900460ff1615601160016101000a81548160ff021916908315150217905550565b6000610cc16127d8565b6001546000540303905090565b6000610cd9826127e1565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d40576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d4c846128af565b91509150610d628187610d5d6127c8565b6128d1565b610dae57610d7786610d726127c8565b612557565b610dad576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e15576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e228686866001612915565b8015610e2d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610efb85610ed788888761296f565b7c020000000000000000000000000000000000000000000000000000000017612997565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f83576000600185019050600060046000838152602001908152602001600020541415610f81576000548114610f80578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610feb86868660016129c2565b505050505050565b610ffb6127d0565b73ffffffffffffffffffffffffffffffffffffffff16611019611deb565b73ffffffffffffffffffffffffffffffffffffffff161461106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106690613ea5565b60405180910390fd5b600081116110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990613e25565b60405180910390fd5b600954816110be610cb7565b6110c8919061409f565b1115611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110090613d85565b60405180910390fd5b61111333826129c8565b50565b61111e6127d0565b73ffffffffffffffffffffffffffffffffffffffff1661113c611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990613ea5565b60405180910390fd5b600081116111d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cc90613dc5565b60405180910390fd5b6009546111e0610cb7565b10611220576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121790613e45565b60405180910390fd5b611228610cb7565b816009546112369190614126565b1015611277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126e90613f85565b60405180910390fd5b80600960008282546112899190614126565b9250508190555050565b61129b6127d0565b73ffffffffffffffffffffffffffffffffffffffff166112b9611deb565b73ffffffffffffffffffffffffffffffffffffffff161461130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690613ea5565b60405180910390fd5b6113176129e6565b565b6113216127d0565b73ffffffffffffffffffffffffffffffffffffffff1661133f611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613ea5565b60405180910390fd5b600081116113d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cf90613f05565b60405180910390fd5b80600b8190555050565b6113fd8383836040518060200160405280600081525061225f565b505050565b61140a6127d0565b73ffffffffffffffffffffffffffffffffffffffff16611428611deb565b73ffffffffffffffffffffffffffffffffffffffff161461147e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147590613ea5565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114ca6127d0565b73ffffffffffffffffffffffffffffffffffffffff166114e8611deb565b73ffffffffffffffffffffffffffffffffffffffff161461153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613ea5565b60405180910390fd5b81816010919061154f9291906131e5565b505050565b6000600860149054906101000a900460ff16905090565b6000611576826127e1565b9050919050565b601160019054906101000a900460ff166115cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c390613ec5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff161461163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190613f45565b60405180910390fd5b600d5481111561167f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167690613f25565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116cd919061409f565b111561170e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170590613e65565b60405180910390fd5b6009548161171a610cb7565b611724919061409f565b1115611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c90613d85565b60405180910390fd5b6000336040516020016117789190613c30565b6040516020818303038152906040528051906020012090506117de848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612a88565b61181d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181490613e85565b60405180910390fd5b81600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461186c919061409f565b9250508190555061187d33836129c8565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118eb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6119446127d0565b73ffffffffffffffffffffffffffffffffffffffff16611962611deb565b73ffffffffffffffffffffffffffffffffffffffff16146119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90613ea5565b60405180910390fd5b6119c26000612a9f565b565b600b5481565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b601160019054906101000a900460ff16611a45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3c90613ec5565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa90613f45565b60405180910390fd5b600c54811115611af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aef90613f65565b60405180910390fd5b600b5481600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b46919061409f565b1115611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e90613e65565b60405180910390fd5b60095481611b93610cb7565b611b9d919061409f565b1115611bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd590613d85565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c2d919061409f565b92505081905550611c3e33826129c8565b50565b611c496127d0565b73ffffffffffffffffffffffffffffffffffffffff16611c67611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb490613ea5565b60405180910390fd5b611cc5612b65565b565b611ccf6127d0565b73ffffffffffffffffffffffffffffffffffffffff16611ced611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90613ea5565b60405180910390fd5b60008111611d86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7d90613e25565b60405180910390fd5b60095481611d92610cb7565b611d9c919061409f565b1115611ddd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd490613d85565b60405180910390fd5b611de782826129c8565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e1d6127d0565b73ffffffffffffffffffffffffffffffffffffffff16611e3b611deb565b73ffffffffffffffffffffffffffffffffffffffff1614611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8890613ea5565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b606060038054611ecc9061421a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ef89061421a565b8015611f455780601f10611f1a57610100808354040283529160200191611f45565b820191906000526020600020905b815481529060010190602001808311611f2857829003601f168201915b5050505050905090565b611f576127c8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fbc576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611fc96127c8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120766127c8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120bb9190613d0d565b60405180910390a35050565b6120cf6127d0565b73ffffffffffffffffffffffffffffffffffffffff166120ed611deb565b73ffffffffffffffffffffffffffffffffffffffff1614612143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213a90613ea5565b60405180910390fd5b60008111612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d90613f05565b60405180910390fd5b80600d8190555050565b6121986127d0565b73ffffffffffffffffffffffffffffffffffffffff166121b6611deb565b73ffffffffffffffffffffffffffffffffffffffff161461220c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220390613ea5565b60405180910390fd5b6000811161224f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224690613f05565b60405180910390fd5b80600c8190555050565b600d5481565b61226a848484610cce565b60008373ffffffffffffffffffffffffffffffffffffffff163b146122cc5761229584848484612c08565b6122cb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600a6020528060005260406000206000915090505481565b601160009054906101000a900460ff1681565b606061230882612769565b612347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233e90613e05565b60405180910390fd5b601160009054906101000a900460ff166123af5760405160200161236a90613c91565b6040516020818303038152906040528051906020012060106040516020016123929190613c4b565b604051602081830303815290604052805190602001201415612403565b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b612442576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243990613ee5565b60405180910390fd5b601160009054906101000a900460ff1661248657601061246183612d68565b604051602001612472929190613c62565b604051602081830303815290604052612537565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a574cea4836040518263ffffffff1660e01b81526004016124e19190613fa5565b60006040518083038186803b1580156124f957600080fd5b505afa15801561250d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906125369190613789565b5b9050919050565b601160019054906101000a900460ff1681565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125f36127d0565b73ffffffffffffffffffffffffffffffffffffffff16612611611deb565b73ffffffffffffffffffffffffffffffffffffffff1614612667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e90613ea5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ce90613da5565b60405180910390fd5b6126e081612a9f565b50565b6126eb6127d0565b73ffffffffffffffffffffffffffffffffffffffff16612709611deb565b73ffffffffffffffffffffffffffffffffffffffff161461275f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275690613ea5565b60405180910390fd5b80600e8190555050565b6000816127746127d8565b11158015612783575060005482105b80156127c1575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b60006001905090565b600080829050806127f06127d8565b11612878576000548110156128775760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612875575b600081141561286b576004600083600190039350838152602001908152602001600020549050612840565b80925050506128aa565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b61291d611554565b1561295d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295490613de5565b60405180910390fd5b61296984848484612ec9565b50505050565b60008060e883901c905060e8612986868684612ecf565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6129e2828260405180602001604052806000815250612ed8565b5050565b6129ee611554565b612a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2490613d65565b60405180910390fd5b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612a716127d0565b604051612a7e9190613ca6565b60405180910390a1565b600082612a958584612f75565b1490509392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b6d611554565b15612bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba490613de5565b60405180910390fd5b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612bf16127d0565b604051612bfe9190613ca6565b60405180910390a1565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c2e6127c8565b8786866040518563ffffffff1660e01b8152600401612c509493929190613cc1565b602060405180830381600087803b158015612c6a57600080fd5b505af1925050508015612c9b57506040513d601f19601f82011682018060405250810190612c98919061370f565b60015b612d15573d8060008114612ccb576040519150601f19603f3d011682016040523d82523d6000602084013e612cd0565b606091505b50600081511415612d0d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612db0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ec4565b600082905060005b60008214612de2578080612dcb9061427d565b915050600a82612ddb91906140f5565b9150612db8565b60008167ffffffffffffffff811115612dfe57612dfd6143d7565b5b6040519080825280601f01601f191660200182016040528015612e305781602001600182028036833780820191505090505b5090505b60008514612ebd57600182612e499190614126565b9150600a85612e5891906142ea565b6030612e64919061409f565b60f81b818381518110612e7a57612e796143a8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612eb691906140f5565b9450612e34565b8093505050505b919050565b50505050565b60009392505050565b612ee28383612fea565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f7057600080549050600083820390505b612f226000868380600101945086612c08565b612f58576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612f0f578160005414612f6d57600080fd5b50505b505050565b60008082905060005b8451811015612fdf576000858281518110612f9c57612f9b6143a8565b5b60200260200101519050808311612fbe57612fb783826131be565b9250612fcb565b612fc881846131be565b92505b508080612fd79061427d565b915050612f7e565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613057576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415613092576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61309f6000848385612915565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061311683613107600086600061296f565b613110856131d5565b17612997565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061313a578060008190555050506131b960008483856129c2565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b8280546131f19061421a565b90600052602060002090601f016020900481019282613213576000855561325a565b82601f1061322c57803560ff191683800117855561325a565b8280016001018555821561325a579182015b8281111561325957823582559160200191906001019061323e565b5b509050613267919061326b565b5090565b5b8082111561328457600081600090555060010161326c565b5090565b600061329b61329684613fe5565b613fc0565b9050828152602081018484840111156132b7576132b6614415565b5b6132c28482856141d8565b509392505050565b60006132dd6132d884614016565b613fc0565b9050828152602081018484840111156132f9576132f8614415565b5b6133048482856141e7565b509392505050565b60008135905061331b8161480e565b92915050565b60008083601f8401126133375761333661440b565b5b8235905067ffffffffffffffff81111561335457613353614406565b5b6020830191508360208202830111156133705761336f614410565b5b9250929050565b60008135905061338681614825565b92915050565b60008135905061339b8161483c565b92915050565b6000813590506133b081614853565b92915050565b6000815190506133c581614853565b92915050565b600082601f8301126133e0576133df61440b565b5b81356133f0848260208601613288565b91505092915050565b60008083601f84011261340f5761340e61440b565b5b8235905067ffffffffffffffff81111561342c5761342b614406565b5b60208301915083600182028301111561344857613447614410565b5b9250929050565b600082601f8301126134645761346361440b565b5b81516134748482602086016132ca565b91505092915050565b60008135905061348c8161486a565b92915050565b6000602082840312156134a8576134a761441f565b5b60006134b68482850161330c565b91505092915050565b600080604083850312156134d6576134d561441f565b5b60006134e48582860161330c565b92505060206134f58582860161330c565b9150509250929050565b6000806000606084860312156135185761351761441f565b5b60006135268682870161330c565b93505060206135378682870161330c565b92505060406135488682870161347d565b9150509250925092565b6000806000806080858703121561356c5761356b61441f565b5b600061357a8782880161330c565b945050602061358b8782880161330c565b935050604061359c8782880161347d565b925050606085013567ffffffffffffffff8111156135bd576135bc61441a565b5b6135c9878288016133cb565b91505092959194509250565b600080604083850312156135ec576135eb61441f565b5b60006135fa8582860161330c565b925050602061360b85828601613377565b9150509250929050565b6000806040838503121561362c5761362b61441f565b5b600061363a8582860161330c565b925050602061364b8582860161347d565b9150509250929050565b60008060006040848603121561366e5761366d61441f565b5b600084013567ffffffffffffffff81111561368c5761368b61441a565b5b61369886828701613321565b935093505060206136ab8682870161347d565b9150509250925092565b6000602082840312156136cb576136ca61441f565b5b60006136d98482850161338c565b91505092915050565b6000602082840312156136f8576136f761441f565b5b6000613706848285016133a1565b91505092915050565b6000602082840312156137255761372461441f565b5b6000613733848285016133b6565b91505092915050565b600080602083850312156137535761375261441f565b5b600083013567ffffffffffffffff8111156137715761377061441a565b5b61377d858286016133f9565b92509250509250929050565b60006020828403121561379f5761379e61441f565b5b600082015167ffffffffffffffff8111156137bd576137bc61441a565b5b6137c98482850161344f565b91505092915050565b6000602082840312156137e8576137e761441f565b5b60006137f68482850161347d565b91505092915050565b6138088161415a565b82525050565b61381f61381a8261415a565b6142c6565b82525050565b61382e8161416c565b82525050565b61383d81614178565b82525050565b600061384e8261405c565b6138588185614072565b93506138688185602086016141e7565b61387181614424565b840191505092915050565b600061388782614067565b6138918185614083565b93506138a18185602086016141e7565b6138aa81614424565b840191505092915050565b60006138c082614067565b6138ca8185614094565b93506138da8185602086016141e7565b80840191505092915050565b600081546138f38161421a565b6138fd8186614094565b9450600182166000811461391857600181146139295761395c565b60ff1983168652818601935061395c565b61393285614047565b60005b8381101561395457815481890152600182019150602081019050613935565b838801955050505b50505092915050565b6000613972601483614083565b915061397d82614442565b602082019050919050565b6000613995600f83614083565b91506139a08261446b565b602082019050919050565b60006139b8602683614083565b91506139c382614494565b604082019050919050565b60006139db601d83614083565b91506139e6826144e3565b602082019050919050565b60006139fe601083614083565b9150613a098261450c565b602082019050919050565b6000613a21601183614083565b9150613a2c82614535565b602082019050919050565b6000613a44601083614083565b9150613a4f8261455e565b602082019050919050565b6000613a67600d83614083565b9150613a7282614587565b602082019050919050565b6000613a8a602183614083565b9150613a95826145b0565b604082019050919050565b6000613aad601783614083565b9150613ab8826145ff565b602082019050919050565b6000613ad0600583614094565b9150613adb82614628565b600582019050919050565b6000613af3602083614083565b9150613afe82614651565b602082019050919050565b6000613b16601583614083565b9150613b218261467a565b602082019050919050565b6000613b39602183614083565b9150613b44826146a3565b604082019050919050565b6000613b5c600d83614083565b9150613b67826146f2565b602082019050919050565b6000613b7f602683614083565b9150613b8a8261471b565b604082019050919050565b6000613ba2601283614083565b9150613bad8261476a565b602082019050919050565b6000613bc5602683614083565b9150613bd082614793565b604082019050919050565b6000613be8601383614083565b9150613bf3826147e2565b602082019050919050565b6000613c0b600083614094565b9150613c168261480b565b600082019050919050565b613c2a816141ce565b82525050565b6000613c3c828461380e565b60148201915081905092915050565b6000613c5782846138e6565b915081905092915050565b6000613c6e82856138e6565b9150613c7a82846138b5565b9150613c8582613ac3565b91508190509392505050565b6000613c9c82613bfe565b9150819050919050565b6000602082019050613cbb60008301846137ff565b92915050565b6000608082019050613cd660008301876137ff565b613ce360208301866137ff565b613cf06040830185613c21565b8181036060830152613d028184613843565b905095945050505050565b6000602082019050613d226000830184613825565b92915050565b6000602082019050613d3d6000830184613834565b92915050565b60006020820190508181036000830152613d5d818461387c565b905092915050565b60006020820190508181036000830152613d7e81613965565b9050919050565b60006020820190508181036000830152613d9e81613988565b9050919050565b60006020820190508181036000830152613dbe816139ab565b9050919050565b60006020820190508181036000830152613dde816139ce565b9050919050565b60006020820190508181036000830152613dfe816139f1565b9050919050565b60006020820190508181036000830152613e1e81613a14565b9050919050565b60006020820190508181036000830152613e3e81613a37565b9050919050565b60006020820190508181036000830152613e5e81613a5a565b9050919050565b60006020820190508181036000830152613e7e81613a7d565b9050919050565b60006020820190508181036000830152613e9e81613aa0565b9050919050565b60006020820190508181036000830152613ebe81613ae6565b9050919050565b60006020820190508181036000830152613ede81613b09565b9050919050565b60006020820190508181036000830152613efe81613b2c565b9050919050565b60006020820190508181036000830152613f1e81613b4f565b9050919050565b60006020820190508181036000830152613f3e81613b72565b9050919050565b60006020820190508181036000830152613f5e81613b95565b9050919050565b60006020820190508181036000830152613f7e81613bb8565b9050919050565b60006020820190508181036000830152613f9e81613bdb565b9050919050565b6000602082019050613fba6000830184613c21565b92915050565b6000613fca613fdb565b9050613fd6828261424c565b919050565b6000604051905090565b600067ffffffffffffffff82111561400057613fff6143d7565b5b61400982614424565b9050602081019050919050565b600067ffffffffffffffff821115614031576140306143d7565b5b61403a82614424565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140aa826141ce565b91506140b5836141ce565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140ea576140e961431b565b5b828201905092915050565b6000614100826141ce565b915061410b836141ce565b92508261411b5761411a61434a565b5b828204905092915050565b6000614131826141ce565b915061413c836141ce565b92508282101561414f5761414e61431b565b5b828203905092915050565b6000614165826141ae565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142055780820151818401526020810190506141ea565b83811115614214576000848401525b50505050565b6000600282049050600182168061423257607f821691505b6020821081141561424657614245614379565b5b50919050565b61425582614424565b810181811067ffffffffffffffff82111715614274576142736143d7565b5b80604052505050565b6000614288826141ce565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142bb576142ba61431b565b5b600182019050919050565b60006142d1826142d8565b9050919050565b60006142e382614435565b9050919050565b60006142f5826141ce565b9150614300836141ce565b9250826143105761430f61434a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4558434545445f434f4c5f53495a450000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e74206d7573742062652067726561746572207468616e2030000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f546f6b656e206e6f742065786973746564000000000000000000000000000000600082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4a75737420736f6c64206f757400000000000000000000000000000000000000600082015250565b7f557020746f203330206d696e747320616c6c6f776564207065722077616c6c6560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e74696e67206973206e6f74206163746976650000000000000000000000600082015250565b7f496e76616c6964206d657461646174612070726f76696465722061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f557020746f203135206d696e747320616c6c6f77656420706572207472616e7360008201527f616374696f6e0000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c657220697320636f6e74726163740000000000000000000000000000600082015250565b7f557020746f203130206d696e747320616c6c6f77656420706572207472616e7360008201527f616374696f6e0000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e7420616d6f756e7400000000000000000000000000600082015250565b50565b6148178161415a565b811461482257600080fd5b50565b61482e8161416c565b811461483957600080fd5b50565b61484581614178565b811461485057600080fd5b50565b61485c81614182565b811461486757600080fd5b50565b614873816141ce565b811461487e57600080fd5b5056fea2646970667358221220e47d47b34b79ae08aa4001f90611e21adcf0efb2640431aa6a285804413b6f9964736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000d656e74732d746f776e2e777466000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004656e747300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f73746f726167656170692e666c65656b2e636f2f34383934326532662d613031392d343762642d396537392d6636623934306265313566362d6275636b65742f7365637265745f6d642f0000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): ents-town.wtf
Arg [1] : _symbol (string): ents
Arg [2] : _baseTokenURI (string): https://storageapi.fleek.co/48942e2f-a019-47bd-9e79-f6b940be15f6-bucket/secret_md/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [4] : 656e74732d746f776e2e77746600000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 656e747300000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [8] : 68747470733a2f2f73746f726167656170692e666c65656b2e636f2f34383934
Arg [9] : 326532662d613031392d343762642d396537392d663662393430626531356636
Arg [10] : 2d6275636b65742f7365637265745f6d642f0000000000000000000000000000


Deployed Bytecode Sourcemap

59326:5659:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27198:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32845:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59554:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34791:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34339:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63401:122;;;;;;;;;;;;;:::i;:::-;;26252:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44056:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62679:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63946:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63602:67;;;;;;;;;;;;;:::i;:::-;;64325:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35681:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60325:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61021:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8890:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32634:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61418:744;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27877:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11789:103;;;;;;;;;;;;;:::i;:::-;;59512:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59741:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59421:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62170:497;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63531:63;;;;;;;;;;;;;:::i;:::-;;62965:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11138:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63259:134;;;;;;;;;;;;;:::i;:::-;;33014:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35067:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64764:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64552:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59593:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35937:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59462:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59807:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60439:564;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59842:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59634:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35446:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12047:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61255:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27198:615;27283:4;27598:10;27583:25;;:11;:25;;;;:102;;;;27675:10;27660:25;;:11;:25;;;;27583:102;:179;;;;27752:10;27737:25;;:11;:25;;;;27583:179;27563:199;;27198:615;;;:::o;32845:100::-;32899:13;32932:5;32925:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32845:100;:::o;59554:32::-;;;;:::o;34791:204::-;34859:7;34884:16;34892:7;34884;:16::i;:::-;34879:64;;34909:34;;;;;;;;;;;;;;34879:64;34963:15;:24;34979:7;34963:24;;;;;;;;;;;;;;;;;;;;;34956:31;;34791:204;;;:::o;34339:386::-;34412:13;34428:16;34436:7;34428;:16::i;:::-;34412:32;;34484:5;34461:28;;:19;:17;:19::i;:::-;:28;;;34457:175;;34509:44;34526:5;34533:19;:17;:19::i;:::-;34509:16;:44::i;:::-;34504:128;;34581:35;;;;;;;;;;;;;;34504:128;34457:175;34671:2;34644:15;:24;34660:7;34644:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34709:7;34705:2;34689:28;;34698:5;34689:28;;;;;;;;;;;;34401:324;34339:386;;:::o;63401:122::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63501:14:::1;;;;;;;;;;;63500:15;63483:14;;:32;;;;;;;;;;;;;;;;;;63401:122::o:0;26252:315::-;26305:7;26533:15;:13;:15::i;:::-;26518:12;;26502:13;;:28;:46;26495:53;;26252:315;:::o;44056:2800::-;44190:27;44220;44239:7;44220:18;:27::i;:::-;44190:57;;44305:4;44264:45;;44280:19;44264:45;;;44260:86;;44318:28;;;;;;;;;;;;;;44260:86;44360:27;44389:23;44416:28;44436:7;44416:19;:28::i;:::-;44359:85;;;;44544:62;44563:15;44580:4;44586:19;:17;:19::i;:::-;44544:18;:62::i;:::-;44539:174;;44626:43;44643:4;44649:19;:17;:19::i;:::-;44626:16;:43::i;:::-;44621:92;;44678:35;;;;;;;;;;;;;;44621:92;44539:174;44744:1;44730:16;;:2;:16;;;44726:52;;;44755:23;;;;;;;;;;;;;;44726:52;44791:43;44813:4;44819:2;44823:7;44832:1;44791:21;:43::i;:::-;44927:15;44924:160;;;45067:1;45046:19;45039:30;44924:160;45462:18;:24;45481:4;45462:24;;;;;;;;;;;;;;;;45460:26;;;;;;;;;;;;45531:18;:22;45550:2;45531:22;;;;;;;;;;;;;;;;45529:24;;;;;;;;;;;45853:145;45890:2;45938:45;45953:4;45959:2;45963:19;45938:14;:45::i;:::-;23480:8;45911:72;45853:18;:145::i;:::-;45824:17;:26;45842:7;45824:26;;;;;;;;;;;:174;;;;46168:1;23480:8;46118:19;:46;:51;46114:626;;;46190:19;46222:1;46212:7;:11;46190:33;;46379:1;46345:17;:30;46363:11;46345:30;;;;;;;;;;;;:35;46341:384;;;46483:13;;46468:11;:28;46464:242;;46663:19;46630:17;:30;46648:11;46630:30;;;;;;;;;;;:52;;;;46464:242;46341:384;46171:569;46114:626;46787:7;46783:2;46768:27;;46777:4;46768:27;;;;;;;;;;;;46806:42;46827:4;46833:2;46837:7;46846:1;46806:20;:42::i;:::-;44179:2677;;;44056:2800;;;:::o;62679:278::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62804:1:::1;62793:8;:12;62785:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;62873:12;;62861:8;62845:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;62837:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62918:31;62928:10;62940:8;62918:9;:31::i;:::-;62679:278:::0;:::o;63946:371::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64075:1:::1;64057:15;:19;64049:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;64145:12;;64129:13;:11;:13::i;:::-;:28;64121:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;64229:13;:11;:13::i;:::-;64210:15;64195:12;;:30;;;;:::i;:::-;:47;;64187:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;64294:15;64278:12;;:31;;;;;;;:::i;:::-;;;;;;;;63946:371:::0;:::o;63602:67::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63651:10:::1;:8;:10::i;:::-;63602:67::o:0;64325:221::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64472:1:::1;64451:18;:22;64443:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;64520:18;64502:15;:36;;;;64325:221:::0;:::o;35681:185::-;35819:39;35836:4;35842:2;35846:7;35819:39;;;;;;;;;;;;:16;:39::i;:::-;35681:185;;;:::o;60325:106::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60412:11:::1;60399:10;;:24;;;;;;;;;;;;;;;;;;60325:106:::0;:::o;61021:123::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61123:13:::1;;61108:12;:28;;;;;;;:::i;:::-;;61021:123:::0;;:::o;8890:86::-;8937:4;8961:7;;;;;;;;;;;8954:14;;8890:86;:::o;32634:144::-;32698:7;32741:27;32760:7;32741:18;:27::i;:::-;32718:52;;32634:144;;;:::o;61418:744::-;60257:14;;;;;;;;;;;60249:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;60147:10:::1;60134:23;;:9;:23;;;60126:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;61611:14:::2;;61599:8;:26;;61591:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;61722:15;;61710:8;61687;:20;61696:10;61687:20;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:50;;61679:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;61822:12;;61810:8;61794:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;61786:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61870:12;61912:10;61895:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;61885:39;;;;;;61870:54;;61958:56;61977:12;;61958:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61991:16;;62009:4;61958:18;:56::i;:::-;61935:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;62104:8;62080;:20;62089:10;62080:20;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;62123:31;62133:10;62145:8;62123:9;:31::i;:::-;61580:582;61418:744:::0;;;:::o;27877:224::-;27941:7;27982:1;27965:19;;:5;:19;;;27961:60;;;27993:28;;;;;;;;;;;;;;27961:60;22432:13;28039:18;:25;28058:5;28039:25;;;;;;;;;;;;;;;;:54;28032:61;;27877:224;;;:::o;11789:103::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11854:30:::1;11881:1;11854:18;:30::i;:::-;11789:103::o:0;59512:35::-;;;;:::o;59741:25::-;;;;;;;;;;;;;:::o;59421:34::-;;;;:::o;62170:497::-;60257:14;;;;;;;;;;;60249:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;60147:10:::1;60134:23;;:9;:23;;;60126:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;62331:12:::2;;62319:8;:24;;62311:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;62440:15;;62428:8;62405;:20;62414:10;62405:20;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;:50;;62397:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;62540:12;;62528:8;62512:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;62504:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62609:8;62585;:20;62594:10;62585:20;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;62628:31;62638:10;62650:8;62628:9;:31::i;:::-;62170:497:::0;:::o;63531:63::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63578:8:::1;:6;:8::i;:::-;63531:63::o:0;62965:286::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63103:1:::1;63092:8;:12;63084:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;63172:12;;63160:8;63144:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:40;;63136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63217:26;63227:5;63234:8;63217:9;:26::i;:::-;62965:286:::0;;:::o;11138:87::-;11184:7;11211:6;;;;;;;;;;;11204:13;;11138:87;:::o;63259:134::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63369:16:::1;;;;;;;;;;;63368:17;63349:16;;:36;;;;;;;;;;;;;;;;;;63259:134::o:0;33014:104::-;33070:13;33103:7;33096:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33014:104;:::o;35067:308::-;35178:19;:17;:19::i;:::-;35166:31;;:8;:31;;;35162:61;;;35206:17;;;;;;;;;;;;;;35162:61;35288:8;35236:18;:39;35255:19;:17;:19::i;:::-;35236:39;;;;;;;;;;;;;;;:49;35276:8;35236:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;35348:8;35312:55;;35327:19;:17;:19::i;:::-;35312:55;;;35358:8;35312:55;;;;;;:::i;:::-;;;;;;;;35067:308;;:::o;64764:216::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64908:1:::1;64888:17;:21;64880:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;64955:17;64938:14;:34;;;;64764:216:::0;:::o;64552:206::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64690:1:::1;64672:15;:19;64664:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;64735:15;64720:12;:30;;;;64552:206:::0;:::o;59593:34::-;;;;:::o;35937:399::-;36104:31;36117:4;36123:2;36127:7;36104:12;:31::i;:::-;36168:1;36150:2;:14;;;:19;36146:183;;36189:56;36220:4;36226:2;36230:7;36239:5;36189:30;:56::i;:::-;36184:145;;36273:40;;;;;;;;;;;;;;36184:145;36146:183;35937:399;;;;:::o;59462:43::-;;;;;;;;;;;;;;;;;:::o;59807:28::-;;;;;;;;;;;;;:::o;60439:564::-;60558:13;60597:17;60605:8;60597:7;:17::i;:::-;60589:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;60656:16;;;;;;;;;;;:130;;60763:20;;;;;;;:::i;:::-;;;;;;;;;;;;;60753:31;;;;;;60735:12;60718:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;60708:41;;;;;;:76;;60656:130;;;60699:1;60677:24;;:10;;;;;;;;;;;:24;;;;60656:130;60647:200;;;;;;;;;;;;:::i;:::-;;;;;;;;;60867:16;;;;;;;;;;;:128;;60952:12;60966:19;:8;:17;:19::i;:::-;60935:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60867:128;;;60892:10;;;;;;;;;;;60886:29;;;60916:8;60886:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60867:128;60860:135;;60439:564;;;:::o;59842:26::-;;;;;;;;;;;;;:::o;59634:100::-;;;;:::o;35446:164::-;35543:4;35567:18;:25;35586:5;35567:25;;;;;;;;;;;;;;;:35;35593:8;35567:35;;;;;;;;;;;;;;;;;;;;;;;;;35560:42;;35446:164;;;;:::o;12047:201::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12156:1:::1;12136:22;;:8;:22;;;;12128:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12212:28;12231:8;12212:18;:28::i;:::-;12047:201:::0;:::o;61255:153::-;11369:12;:10;:12::i;:::-;11358:23;;:7;:5;:7::i;:::-;:23;;;11350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61383:17:::1;61364:16;:36;;;;61255:153:::0;:::o;36591:273::-;36648:4;36704:7;36685:15;:13;:15::i;:::-;:26;;:66;;;;;36738:13;;36728:7;:23;36685:66;:152;;;;;36836:1;23202:8;36789:17;:26;36807:7;36789:26;;;;;;;;;;;;:43;:48;36685:152;36665:172;;36591:273;;;:::o;55152:105::-;55212:7;55239:10;55232:17;;55152:105;:::o;7544:98::-;7597:7;7624:10;7617:17;;7544:98;:::o;61154:93::-;61211:7;61238:1;61231:8;;61154:93;:::o;29551:1129::-;29618:7;29638:12;29653:7;29638:22;;29721:4;29702:15;:13;:15::i;:::-;:23;29698:915;;29755:13;;29748:4;:20;29744:869;;;29793:14;29810:17;:23;29828:4;29810:23;;;;;;;;;;;;29793:40;;29926:1;23202:8;29899:6;:23;:28;29895:699;;;30418:113;30435:1;30425:6;:11;30418:113;;;30478:17;:25;30496:6;;;;;;;30478:25;;;;;;;;;;;;30469:34;;30418:113;;;30564:6;30557:13;;;;;;29895:699;29770:843;29744:869;29698:915;30641:31;;;;;;;;;;;;;;29551:1129;;;;:::o;42392:652::-;42487:27;42516:23;42557:53;42613:15;42557:71;;42799:7;42793:4;42786:21;42834:22;42828:4;42821:36;42910:4;42904;42894:21;42871:44;;43006:19;43000:26;42981:45;;42737:300;42392:652;;;:::o;43157:645::-;43299:11;43461:15;43455:4;43451:26;43443:34;;43620:15;43609:9;43605:31;43592:44;;43767:15;43756:9;43753:30;43746:4;43735:9;43732:19;43729:55;43719:65;;43157:645;;;;;:::o;63681:257::-;9216:8;:6;:8::i;:::-;9215:9;9207:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;63874:56:::1;63902:4;63908:2;63912:7;63921:8;63874:27;:56::i;:::-;63681:257:::0;;;;:::o;52297:309::-;52432:7;52452:16;23603:3;52478:19;:40;;52452:67;;23603:3;52545:31;52556:4;52562:2;52566:9;52545:10;:31::i;:::-;52537:40;;:61;;52530:68;;;52297:309;;;;;:::o;32125:447::-;32205:14;32373:15;32366:5;32362:27;32353:36;;32547:5;32533:11;32509:22;32505:40;32502:51;32495:5;32492:62;32482:72;;32125:447;;;;:::o;54803:158::-;;;;;:::o;36948:104::-;37017:27;37027:2;37031:8;37017:27;;;;;;;;;;;;:9;:27::i;:::-;36948:104;;:::o;9949:120::-;9493:8;:6;:8::i;:::-;9485:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;10018:5:::1;10008:7;;:15;;;;;;;;;;;;;;;;;;10039:22;10048:12;:10;:12::i;:::-;10039:22;;;;;;:::i;:::-;;;;;;;;9949:120::o:0;5400:190::-;5525:4;5578;5549:25;5562:5;5569:4;5549:12;:25::i;:::-;:33;5542:40;;5400:190;;;;;:::o;12408:191::-;12482:16;12501:6;;;;;;;;;;;12482:25;;12527:8;12518:6;;:17;;;;;;;;;;;;;;;;;;12582:8;12551:40;;12572:8;12551:40;;;;;;;;;;;;12471:128;12408:191;:::o;9690:118::-;9216:8;:6;:8::i;:::-;9215:9;9207:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;9760:4:::1;9750:7;;:14;;;;;;;;;;;;;;;;;;9780:20;9787:12;:10;:12::i;:::-;9780:20;;;;;;:::i;:::-;;;;;;;;9690:118::o:0;50807:716::-;50970:4;51016:2;50991:45;;;51037:19;:17;:19::i;:::-;51058:4;51064:7;51073:5;50991:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50987:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51291:1;51274:6;:13;:18;51270:235;;;51320:40;;;;;;;;;;;;;;51270:235;51463:6;51457:13;51448:6;51444:2;51440:15;51433:38;50987:529;51160:54;;;51150:64;;;:6;:64;;;;51143:71;;;50807:716;;;;;;:::o;2421:723::-;2477:13;2707:1;2698:5;:10;2694:53;;;2725:10;;;;;;;;;;;;;;;;;;;;;2694:53;2757:12;2772:5;2757:20;;2788:14;2813:78;2828:1;2820:4;:9;2813:78;;2846:8;;;;;:::i;:::-;;;;2877:2;2869:10;;;;;:::i;:::-;;;2813:78;;;2901:19;2933:6;2923:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2901:39;;2951:154;2967:1;2958:5;:10;2951:154;;2995:1;2985:11;;;;;:::i;:::-;;;3062:2;3054:5;:10;;;;:::i;:::-;3041:2;:24;;;;:::i;:::-;3028:39;;3011:6;3018;3011:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3091:2;3082:11;;;;;:::i;:::-;;;2951:154;;;3129:6;3115:21;;;;;2421:723;;;;:::o;53985:159::-;;;;;:::o;53182:147::-;53319:6;53182:147;;;;;:::o;37468:681::-;37591:19;37597:2;37601:8;37591:5;:19::i;:::-;37670:1;37652:2;:14;;;:19;37648:483;;37692:11;37706:13;;37692:27;;37738:13;37760:8;37754:3;:14;37738:30;;37787:233;37818:62;37857:1;37861:2;37865:7;;;;;;37874:5;37818:30;:62::i;:::-;37813:167;;37916:40;;;;;;;;;;;;;;37813:167;38015:3;38007:5;:11;37787:233;;38102:3;38085:13;;:20;38081:34;;38107:8;;;38081:34;37673:458;;37648:483;37468:681;;;:::o;5951:675::-;6034:7;6054:20;6077:4;6054:27;;6097:9;6092:497;6116:5;:12;6112:1;:16;6092:497;;;6150:20;6173:5;6179:1;6173:8;;;;;;;;:::i;:::-;;;;;;;;6150:31;;6216:12;6200;:28;6196:382;;6343:42;6358:12;6372;6343:14;:42::i;:::-;6328:57;;6196:382;;;6520:42;6535:12;6549;6520:14;:42::i;:::-;6505:57;;6196:382;6135:454;6130:3;;;;;:::i;:::-;;;;6092:497;;;;6606:12;6599:19;;;5951:675;;;;:::o;38422:1529::-;38487:20;38510:13;;38487:36;;38552:1;38538:16;;:2;:16;;;38534:48;;;38563:19;;;;;;;;;;;;;;38534:48;38609:1;38597:8;:13;38593:44;;;38619:18;;;;;;;;;;;;;;38593:44;38650:61;38680:1;38684:2;38688:12;38702:8;38650:21;:61::i;:::-;39193:1;22569:2;39164:1;:25;;39163:31;39151:8;:44;39125:18;:22;39144:2;39125:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;39472:139;39509:2;39563:33;39586:1;39590:2;39594:1;39563:14;:33::i;:::-;39530:30;39551:8;39530:20;:30::i;:::-;:66;39472:18;:139::i;:::-;39438:17;:31;39456:12;39438:31;;;;;;;;;;;:173;;;;39628:15;39646:12;39628:30;;39673:11;39702:8;39687:12;:23;39673:37;;39725:101;39777:9;;;;;;39773:2;39752:35;;39769:1;39752:35;;;;;;;;;;;;39821:3;39811:7;:13;39725:101;;39858:3;39842:13;:19;;;;38899:974;;39883:60;39912:1;39916:2;39920:12;39934:8;39883:20;:60::i;:::-;38476:1475;38422:1529;;:::o;6634:224::-;6702:13;6765:1;6759:4;6752:15;6794:1;6788:4;6781:15;6835:4;6829;6819:21;6810:30;;6634:224;;;;:::o;33955:322::-;34025:14;34256:1;34246:8;34243:15;34218:23;34214:45;34204:55;;33955:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:421::-;512:5;537:66;553:49;595:6;553:49;:::i;:::-;537:66;:::i;:::-;528:75;;626:6;619:5;612:21;664:4;657:5;653:16;702:3;693:6;688:3;684:16;681:25;678:112;;;709:79;;:::i;:::-;678:112;799:39;831:6;826:3;821;799:39;:::i;:::-;518:326;423:421;;;;;:::o;850:139::-;896:5;934:6;921:20;912:29;;950:33;977:5;950:33;:::i;:::-;850:139;;;;:::o;1012:568::-;1085:8;1095:6;1145:3;1138:4;1130:6;1126:17;1122:27;1112:122;;1153:79;;:::i;:::-;1112:122;1266:6;1253:20;1243:30;;1296:18;1288:6;1285:30;1282:117;;;1318:79;;:::i;:::-;1282:117;1432:4;1424:6;1420:17;1408:29;;1486:3;1478:4;1470:6;1466:17;1456:8;1452:32;1449:41;1446:128;;;1493:79;;:::i;:::-;1446:128;1012:568;;;;;:::o;1586:133::-;1629:5;1667:6;1654:20;1645:29;;1683:30;1707:5;1683:30;:::i;:::-;1586:133;;;;:::o;1725:139::-;1771:5;1809:6;1796:20;1787:29;;1825:33;1852:5;1825:33;:::i;:::-;1725:139;;;;:::o;1870:137::-;1915:5;1953:6;1940:20;1931:29;;1969:32;1995:5;1969:32;:::i;:::-;1870:137;;;;:::o;2013:141::-;2069:5;2100:6;2094:13;2085:22;;2116:32;2142:5;2116:32;:::i;:::-;2013:141;;;;:::o;2173:338::-;2228:5;2277:3;2270:4;2262:6;2258:17;2254:27;2244:122;;2285:79;;:::i;:::-;2244:122;2402:6;2389:20;2427:78;2501:3;2493:6;2486:4;2478:6;2474:17;2427:78;:::i;:::-;2418:87;;2234:277;2173:338;;;;:::o;2531:553::-;2589:8;2599:6;2649:3;2642:4;2634:6;2630:17;2626:27;2616:122;;2657:79;;:::i;:::-;2616:122;2770:6;2757:20;2747:30;;2800:18;2792:6;2789:30;2786:117;;;2822:79;;:::i;:::-;2786:117;2936:4;2928:6;2924:17;2912:29;;2990:3;2982:4;2974:6;2970:17;2960:8;2956:32;2953:41;2950:128;;;2997:79;;:::i;:::-;2950:128;2531:553;;;;;:::o;3104:355::-;3171:5;3220:3;3213:4;3205:6;3201:17;3197:27;3187:122;;3228:79;;:::i;:::-;3187:122;3338:6;3332:13;3363:90;3449:3;3441:6;3434:4;3426:6;3422:17;3363:90;:::i;:::-;3354:99;;3177:282;3104:355;;;;:::o;3465:139::-;3511:5;3549:6;3536:20;3527:29;;3565:33;3592:5;3565:33;:::i;:::-;3465:139;;;;:::o;3610:329::-;3669:6;3718:2;3706:9;3697:7;3693:23;3689:32;3686:119;;;3724:79;;:::i;:::-;3686:119;3844:1;3869:53;3914:7;3905:6;3894:9;3890:22;3869:53;:::i;:::-;3859:63;;3815:117;3610:329;;;;:::o;3945:474::-;4013:6;4021;4070:2;4058:9;4049:7;4045:23;4041:32;4038:119;;;4076:79;;:::i;:::-;4038:119;4196:1;4221:53;4266:7;4257:6;4246:9;4242:22;4221:53;:::i;:::-;4211:63;;4167:117;4323:2;4349:53;4394:7;4385:6;4374:9;4370:22;4349:53;:::i;:::-;4339:63;;4294:118;3945:474;;;;;:::o;4425:619::-;4502:6;4510;4518;4567:2;4555:9;4546:7;4542:23;4538:32;4535:119;;;4573:79;;:::i;:::-;4535:119;4693:1;4718:53;4763:7;4754:6;4743:9;4739:22;4718:53;:::i;:::-;4708:63;;4664:117;4820:2;4846:53;4891:7;4882:6;4871:9;4867:22;4846:53;:::i;:::-;4836:63;;4791:118;4948:2;4974:53;5019:7;5010:6;4999:9;4995:22;4974:53;:::i;:::-;4964:63;;4919:118;4425:619;;;;;:::o;5050:943::-;5145:6;5153;5161;5169;5218:3;5206:9;5197:7;5193:23;5189:33;5186:120;;;5225:79;;:::i;:::-;5186:120;5345:1;5370:53;5415:7;5406:6;5395:9;5391:22;5370:53;:::i;:::-;5360:63;;5316:117;5472:2;5498:53;5543:7;5534:6;5523:9;5519:22;5498:53;:::i;:::-;5488:63;;5443:118;5600:2;5626:53;5671:7;5662:6;5651:9;5647:22;5626:53;:::i;:::-;5616:63;;5571:118;5756:2;5745:9;5741:18;5728:32;5787:18;5779:6;5776:30;5773:117;;;5809:79;;:::i;:::-;5773:117;5914:62;5968:7;5959:6;5948:9;5944:22;5914:62;:::i;:::-;5904:72;;5699:287;5050:943;;;;;;;:::o;5999:468::-;6064:6;6072;6121:2;6109:9;6100:7;6096:23;6092:32;6089:119;;;6127:79;;:::i;:::-;6089:119;6247:1;6272:53;6317:7;6308:6;6297:9;6293:22;6272:53;:::i;:::-;6262:63;;6218:117;6374:2;6400:50;6442:7;6433:6;6422:9;6418:22;6400:50;:::i;:::-;6390:60;;6345:115;5999:468;;;;;:::o;6473:474::-;6541:6;6549;6598:2;6586:9;6577:7;6573:23;6569:32;6566:119;;;6604:79;;:::i;:::-;6566:119;6724:1;6749:53;6794:7;6785:6;6774:9;6770:22;6749:53;:::i;:::-;6739:63;;6695:117;6851:2;6877:53;6922:7;6913:6;6902:9;6898:22;6877:53;:::i;:::-;6867:63;;6822:118;6473:474;;;;;:::o;6953:704::-;7048:6;7056;7064;7113:2;7101:9;7092:7;7088:23;7084:32;7081:119;;;7119:79;;:::i;:::-;7081:119;7267:1;7256:9;7252:17;7239:31;7297:18;7289:6;7286:30;7283:117;;;7319:79;;:::i;:::-;7283:117;7432:80;7504:7;7495:6;7484:9;7480:22;7432:80;:::i;:::-;7414:98;;;;7210:312;7561:2;7587:53;7632:7;7623:6;7612:9;7608:22;7587:53;:::i;:::-;7577:63;;7532:118;6953:704;;;;;:::o;7663:329::-;7722:6;7771:2;7759:9;7750:7;7746:23;7742:32;7739:119;;;7777:79;;:::i;:::-;7739:119;7897:1;7922:53;7967:7;7958:6;7947:9;7943:22;7922:53;:::i;:::-;7912:63;;7868:117;7663:329;;;;:::o;7998:327::-;8056:6;8105:2;8093:9;8084:7;8080:23;8076:32;8073:119;;;8111:79;;:::i;:::-;8073:119;8231:1;8256:52;8300:7;8291:6;8280:9;8276:22;8256:52;:::i;:::-;8246:62;;8202:116;7998:327;;;;:::o;8331:349::-;8400:6;8449:2;8437:9;8428:7;8424:23;8420:32;8417:119;;;8455:79;;:::i;:::-;8417:119;8575:1;8600:63;8655:7;8646:6;8635:9;8631:22;8600:63;:::i;:::-;8590:73;;8546:127;8331:349;;;;:::o;8686:529::-;8757:6;8765;8814:2;8802:9;8793:7;8789:23;8785:32;8782:119;;;8820:79;;:::i;:::-;8782:119;8968:1;8957:9;8953:17;8940:31;8998:18;8990:6;8987:30;8984:117;;;9020:79;;:::i;:::-;8984:117;9133:65;9190:7;9181:6;9170:9;9166:22;9133:65;:::i;:::-;9115:83;;;;8911:297;8686:529;;;;;:::o;9221:524::-;9301:6;9350:2;9338:9;9329:7;9325:23;9321:32;9318:119;;;9356:79;;:::i;:::-;9318:119;9497:1;9486:9;9482:17;9476:24;9527:18;9519:6;9516:30;9513:117;;;9549:79;;:::i;:::-;9513:117;9654:74;9720:7;9711:6;9700:9;9696:22;9654:74;:::i;:::-;9644:84;;9447:291;9221:524;;;;:::o;9751:329::-;9810:6;9859:2;9847:9;9838:7;9834:23;9830:32;9827:119;;;9865:79;;:::i;:::-;9827:119;9985:1;10010:53;10055:7;10046:6;10035:9;10031:22;10010:53;:::i;:::-;10000:63;;9956:117;9751:329;;;;:::o;10086:118::-;10173:24;10191:5;10173:24;:::i;:::-;10168:3;10161:37;10086:118;;:::o;10210:157::-;10315:45;10335:24;10353:5;10335:24;:::i;:::-;10315:45;:::i;:::-;10310:3;10303:58;10210:157;;:::o;10373:109::-;10454:21;10469:5;10454:21;:::i;:::-;10449:3;10442:34;10373:109;;:::o;10488:118::-;10575:24;10593:5;10575:24;:::i;:::-;10570:3;10563:37;10488:118;;:::o;10612:360::-;10698:3;10726:38;10758:5;10726:38;:::i;:::-;10780:70;10843:6;10838:3;10780:70;:::i;:::-;10773:77;;10859:52;10904:6;10899:3;10892:4;10885:5;10881:16;10859:52;:::i;:::-;10936:29;10958:6;10936:29;:::i;:::-;10931:3;10927:39;10920:46;;10702:270;10612:360;;;;:::o;10978:364::-;11066:3;11094:39;11127:5;11094:39;:::i;:::-;11149:71;11213:6;11208:3;11149:71;:::i;:::-;11142:78;;11229:52;11274:6;11269:3;11262:4;11255:5;11251:16;11229:52;:::i;:::-;11306:29;11328:6;11306:29;:::i;:::-;11301:3;11297:39;11290:46;;11070:272;10978:364;;;;:::o;11348:377::-;11454:3;11482:39;11515:5;11482:39;:::i;:::-;11537:89;11619:6;11614:3;11537:89;:::i;:::-;11530:96;;11635:52;11680:6;11675:3;11668:4;11661:5;11657:16;11635:52;:::i;:::-;11712:6;11707:3;11703:16;11696:23;;11458:267;11348:377;;;;:::o;11755:845::-;11858:3;11895:5;11889:12;11924:36;11950:9;11924:36;:::i;:::-;11976:89;12058:6;12053:3;11976:89;:::i;:::-;11969:96;;12096:1;12085:9;12081:17;12112:1;12107:137;;;;12258:1;12253:341;;;;12074:520;;12107:137;12191:4;12187:9;12176;12172:25;12167:3;12160:38;12227:6;12222:3;12218:16;12211:23;;12107:137;;12253:341;12320:38;12352:5;12320:38;:::i;:::-;12380:1;12394:154;12408:6;12405:1;12402:13;12394:154;;;12482:7;12476:14;12472:1;12467:3;12463:11;12456:35;12532:1;12523:7;12519:15;12508:26;;12430:4;12427:1;12423:12;12418:17;;12394:154;;;12577:6;12572:3;12568:16;12561:23;;12260:334;;12074:520;;11862:738;;11755:845;;;;:::o;12606:366::-;12748:3;12769:67;12833:2;12828:3;12769:67;:::i;:::-;12762:74;;12845:93;12934:3;12845:93;:::i;:::-;12963:2;12958:3;12954:12;12947:19;;12606:366;;;:::o;12978:::-;13120:3;13141:67;13205:2;13200:3;13141:67;:::i;:::-;13134:74;;13217:93;13306:3;13217:93;:::i;:::-;13335:2;13330:3;13326:12;13319:19;;12978:366;;;:::o;13350:::-;13492:3;13513:67;13577:2;13572:3;13513:67;:::i;:::-;13506:74;;13589:93;13678:3;13589:93;:::i;:::-;13707:2;13702:3;13698:12;13691:19;;13350:366;;;:::o;13722:::-;13864:3;13885:67;13949:2;13944:3;13885:67;:::i;:::-;13878:74;;13961:93;14050:3;13961:93;:::i;:::-;14079:2;14074:3;14070:12;14063:19;;13722:366;;;:::o;14094:::-;14236:3;14257:67;14321:2;14316:3;14257:67;:::i;:::-;14250:74;;14333:93;14422:3;14333:93;:::i;:::-;14451:2;14446:3;14442:12;14435:19;;14094:366;;;:::o;14466:::-;14608:3;14629:67;14693:2;14688:3;14629:67;:::i;:::-;14622:74;;14705:93;14794:3;14705:93;:::i;:::-;14823:2;14818:3;14814:12;14807:19;;14466:366;;;:::o;14838:::-;14980:3;15001:67;15065:2;15060:3;15001:67;:::i;:::-;14994:74;;15077:93;15166:3;15077:93;:::i;:::-;15195:2;15190:3;15186:12;15179:19;;14838:366;;;:::o;15210:::-;15352:3;15373:67;15437:2;15432:3;15373:67;:::i;:::-;15366:74;;15449:93;15538:3;15449:93;:::i;:::-;15567:2;15562:3;15558:12;15551:19;;15210:366;;;:::o;15582:::-;15724:3;15745:67;15809:2;15804:3;15745:67;:::i;:::-;15738:74;;15821:93;15910:3;15821:93;:::i;:::-;15939:2;15934:3;15930:12;15923:19;;15582:366;;;:::o;15954:::-;16096:3;16117:67;16181:2;16176:3;16117:67;:::i;:::-;16110:74;;16193:93;16282:3;16193:93;:::i;:::-;16311:2;16306:3;16302:12;16295:19;;15954:366;;;:::o;16326:400::-;16486:3;16507:84;16589:1;16584:3;16507:84;:::i;:::-;16500:91;;16600:93;16689:3;16600:93;:::i;:::-;16718:1;16713:3;16709:11;16702:18;;16326:400;;;:::o;16732:366::-;16874:3;16895:67;16959:2;16954:3;16895:67;:::i;:::-;16888:74;;16971:93;17060:3;16971:93;:::i;:::-;17089:2;17084:3;17080:12;17073:19;;16732:366;;;:::o;17104:::-;17246:3;17267:67;17331:2;17326:3;17267:67;:::i;:::-;17260:74;;17343:93;17432:3;17343:93;:::i;:::-;17461:2;17456:3;17452:12;17445:19;;17104:366;;;:::o;17476:::-;17618:3;17639:67;17703:2;17698:3;17639:67;:::i;:::-;17632:74;;17715:93;17804:3;17715:93;:::i;:::-;17833:2;17828:3;17824:12;17817:19;;17476:366;;;:::o;17848:::-;17990:3;18011:67;18075:2;18070:3;18011:67;:::i;:::-;18004:74;;18087:93;18176:3;18087:93;:::i;:::-;18205:2;18200:3;18196:12;18189:19;;17848:366;;;:::o;18220:::-;18362:3;18383:67;18447:2;18442:3;18383:67;:::i;:::-;18376:74;;18459:93;18548:3;18459:93;:::i;:::-;18577:2;18572:3;18568:12;18561:19;;18220:366;;;:::o;18592:::-;18734:3;18755:67;18819:2;18814:3;18755:67;:::i;:::-;18748:74;;18831:93;18920:3;18831:93;:::i;:::-;18949:2;18944:3;18940:12;18933:19;;18592:366;;;:::o;18964:::-;19106:3;19127:67;19191:2;19186:3;19127:67;:::i;:::-;19120:74;;19203:93;19292:3;19203:93;:::i;:::-;19321:2;19316:3;19312:12;19305:19;;18964:366;;;:::o;19336:::-;19478:3;19499:67;19563:2;19558:3;19499:67;:::i;:::-;19492:74;;19575:93;19664:3;19575:93;:::i;:::-;19693:2;19688:3;19684:12;19677:19;;19336:366;;;:::o;19708:400::-;19868:3;19889:84;19971:1;19966:3;19889:84;:::i;:::-;19882:91;;19982:93;20071:3;19982:93;:::i;:::-;20100:1;20095:3;20091:11;20084:18;;19708:400;;;:::o;20114:118::-;20201:24;20219:5;20201:24;:::i;:::-;20196:3;20189:37;20114:118;;:::o;20238:256::-;20350:3;20365:75;20436:3;20427:6;20365:75;:::i;:::-;20465:2;20460:3;20456:12;20449:19;;20485:3;20478:10;;20238:256;;;;:::o;20500:269::-;20629:3;20651:92;20739:3;20730:6;20651:92;:::i;:::-;20644:99;;20760:3;20753:10;;20500:269;;;;:::o;20775:695::-;21053:3;21075:92;21163:3;21154:6;21075:92;:::i;:::-;21068:99;;21184:95;21275:3;21266:6;21184:95;:::i;:::-;21177:102;;21296:148;21440:3;21296:148;:::i;:::-;21289:155;;21461:3;21454:10;;20775:695;;;;;:::o;21476:381::-;21661:3;21683:148;21827:3;21683:148;:::i;:::-;21676:155;;21848:3;21841:10;;21476:381;;;:::o;21863:222::-;21956:4;21994:2;21983:9;21979:18;21971:26;;22007:71;22075:1;22064:9;22060:17;22051:6;22007:71;:::i;:::-;21863:222;;;;:::o;22091:640::-;22286:4;22324:3;22313:9;22309:19;22301:27;;22338:71;22406:1;22395:9;22391:17;22382:6;22338:71;:::i;:::-;22419:72;22487:2;22476:9;22472:18;22463:6;22419:72;:::i;:::-;22501;22569:2;22558:9;22554:18;22545:6;22501:72;:::i;:::-;22620:9;22614:4;22610:20;22605:2;22594:9;22590:18;22583:48;22648:76;22719:4;22710:6;22648:76;:::i;:::-;22640:84;;22091:640;;;;;;;:::o;22737:210::-;22824:4;22862:2;22851:9;22847:18;22839:26;;22875:65;22937:1;22926:9;22922:17;22913:6;22875:65;:::i;:::-;22737:210;;;;:::o;22953:222::-;23046:4;23084:2;23073:9;23069:18;23061:26;;23097:71;23165:1;23154:9;23150:17;23141:6;23097:71;:::i;:::-;22953:222;;;;:::o;23181:313::-;23294:4;23332:2;23321:9;23317:18;23309:26;;23381:9;23375:4;23371:20;23367:1;23356:9;23352:17;23345:47;23409:78;23482:4;23473:6;23409:78;:::i;:::-;23401:86;;23181:313;;;;:::o;23500:419::-;23666:4;23704:2;23693:9;23689:18;23681:26;;23753:9;23747:4;23743:20;23739:1;23728:9;23724:17;23717:47;23781:131;23907:4;23781:131;:::i;:::-;23773:139;;23500:419;;;:::o;23925:::-;24091:4;24129:2;24118:9;24114:18;24106:26;;24178:9;24172:4;24168:20;24164:1;24153:9;24149:17;24142:47;24206:131;24332:4;24206:131;:::i;:::-;24198:139;;23925:419;;;:::o;24350:::-;24516:4;24554:2;24543:9;24539:18;24531:26;;24603:9;24597:4;24593:20;24589:1;24578:9;24574:17;24567:47;24631:131;24757:4;24631:131;:::i;:::-;24623:139;;24350:419;;;:::o;24775:::-;24941:4;24979:2;24968:9;24964:18;24956:26;;25028:9;25022:4;25018:20;25014:1;25003:9;24999:17;24992:47;25056:131;25182:4;25056:131;:::i;:::-;25048:139;;24775:419;;;:::o;25200:::-;25366:4;25404:2;25393:9;25389:18;25381:26;;25453:9;25447:4;25443:20;25439:1;25428:9;25424:17;25417:47;25481:131;25607:4;25481:131;:::i;:::-;25473:139;;25200:419;;;:::o;25625:::-;25791:4;25829:2;25818:9;25814:18;25806:26;;25878:9;25872:4;25868:20;25864:1;25853:9;25849:17;25842:47;25906:131;26032:4;25906:131;:::i;:::-;25898:139;;25625:419;;;:::o;26050:::-;26216:4;26254:2;26243:9;26239:18;26231:26;;26303:9;26297:4;26293:20;26289:1;26278:9;26274:17;26267:47;26331:131;26457:4;26331:131;:::i;:::-;26323:139;;26050:419;;;:::o;26475:::-;26641:4;26679:2;26668:9;26664:18;26656:26;;26728:9;26722:4;26718:20;26714:1;26703:9;26699:17;26692:47;26756:131;26882:4;26756:131;:::i;:::-;26748:139;;26475:419;;;:::o;26900:::-;27066:4;27104:2;27093:9;27089:18;27081:26;;27153:9;27147:4;27143:20;27139:1;27128:9;27124:17;27117:47;27181:131;27307:4;27181:131;:::i;:::-;27173:139;;26900:419;;;:::o;27325:::-;27491:4;27529:2;27518:9;27514:18;27506:26;;27578:9;27572:4;27568:20;27564:1;27553:9;27549:17;27542:47;27606:131;27732:4;27606:131;:::i;:::-;27598:139;;27325:419;;;:::o;27750:::-;27916:4;27954:2;27943:9;27939:18;27931:26;;28003:9;27997:4;27993:20;27989:1;27978:9;27974:17;27967:47;28031:131;28157:4;28031:131;:::i;:::-;28023:139;;27750:419;;;:::o;28175:::-;28341:4;28379:2;28368:9;28364:18;28356:26;;28428:9;28422:4;28418:20;28414:1;28403:9;28399:17;28392:47;28456:131;28582:4;28456:131;:::i;:::-;28448:139;;28175:419;;;:::o;28600:::-;28766:4;28804:2;28793:9;28789:18;28781:26;;28853:9;28847:4;28843:20;28839:1;28828:9;28824:17;28817:47;28881:131;29007:4;28881:131;:::i;:::-;28873:139;;28600:419;;;:::o;29025:::-;29191:4;29229:2;29218:9;29214:18;29206:26;;29278:9;29272:4;29268:20;29264:1;29253:9;29249:17;29242:47;29306:131;29432:4;29306:131;:::i;:::-;29298:139;;29025:419;;;:::o;29450:::-;29616:4;29654:2;29643:9;29639:18;29631:26;;29703:9;29697:4;29693:20;29689:1;29678:9;29674:17;29667:47;29731:131;29857:4;29731:131;:::i;:::-;29723:139;;29450:419;;;:::o;29875:::-;30041:4;30079:2;30068:9;30064:18;30056:26;;30128:9;30122:4;30118:20;30114:1;30103:9;30099:17;30092:47;30156:131;30282:4;30156:131;:::i;:::-;30148:139;;29875:419;;;:::o;30300:::-;30466:4;30504:2;30493:9;30489:18;30481:26;;30553:9;30547:4;30543:20;30539:1;30528:9;30524:17;30517:47;30581:131;30707:4;30581:131;:::i;:::-;30573:139;;30300:419;;;:::o;30725:::-;30891:4;30929:2;30918:9;30914:18;30906:26;;30978:9;30972:4;30968:20;30964:1;30953:9;30949:17;30942:47;31006:131;31132:4;31006:131;:::i;:::-;30998:139;;30725:419;;;:::o;31150:222::-;31243:4;31281:2;31270:9;31266:18;31258:26;;31294:71;31362:1;31351:9;31347:17;31338:6;31294:71;:::i;:::-;31150:222;;;;:::o;31378:129::-;31412:6;31439:20;;:::i;:::-;31429:30;;31468:33;31496:4;31488:6;31468:33;:::i;:::-;31378:129;;;:::o;31513:75::-;31546:6;31579:2;31573:9;31563:19;;31513:75;:::o;31594:307::-;31655:4;31745:18;31737:6;31734:30;31731:56;;;31767:18;;:::i;:::-;31731:56;31805:29;31827:6;31805:29;:::i;:::-;31797:37;;31889:4;31883;31879:15;31871:23;;31594:307;;;:::o;31907:308::-;31969:4;32059:18;32051:6;32048:30;32045:56;;;32081:18;;:::i;:::-;32045:56;32119:29;32141:6;32119:29;:::i;:::-;32111:37;;32203:4;32197;32193:15;32185:23;;31907:308;;;:::o;32221:141::-;32270:4;32293:3;32285:11;;32316:3;32313:1;32306:14;32350:4;32347:1;32337:18;32329:26;;32221:141;;;:::o;32368:98::-;32419:6;32453:5;32447:12;32437:22;;32368:98;;;:::o;32472:99::-;32524:6;32558:5;32552:12;32542:22;;32472:99;;;:::o;32577:168::-;32660:11;32694:6;32689:3;32682:19;32734:4;32729:3;32725:14;32710:29;;32577:168;;;;:::o;32751:169::-;32835:11;32869:6;32864:3;32857:19;32909:4;32904:3;32900:14;32885:29;;32751:169;;;;:::o;32926:148::-;33028:11;33065:3;33050:18;;32926:148;;;;:::o;33080:305::-;33120:3;33139:20;33157:1;33139:20;:::i;:::-;33134:25;;33173:20;33191:1;33173:20;:::i;:::-;33168:25;;33327:1;33259:66;33255:74;33252:1;33249:81;33246:107;;;33333:18;;:::i;:::-;33246:107;33377:1;33374;33370:9;33363:16;;33080:305;;;;:::o;33391:185::-;33431:1;33448:20;33466:1;33448:20;:::i;:::-;33443:25;;33482:20;33500:1;33482:20;:::i;:::-;33477:25;;33521:1;33511:35;;33526:18;;:::i;:::-;33511:35;33568:1;33565;33561:9;33556:14;;33391:185;;;;:::o;33582:191::-;33622:4;33642:20;33660:1;33642:20;:::i;:::-;33637:25;;33676:20;33694:1;33676:20;:::i;:::-;33671:25;;33715:1;33712;33709:8;33706:34;;;33720:18;;:::i;:::-;33706:34;33765:1;33762;33758:9;33750:17;;33582:191;;;;:::o;33779:96::-;33816:7;33845:24;33863:5;33845:24;:::i;:::-;33834:35;;33779:96;;;:::o;33881:90::-;33915:7;33958:5;33951:13;33944:21;33933:32;;33881:90;;;:::o;33977:77::-;34014:7;34043:5;34032:16;;33977:77;;;:::o;34060:149::-;34096:7;34136:66;34129:5;34125:78;34114:89;;34060:149;;;:::o;34215:126::-;34252:7;34292:42;34285:5;34281:54;34270:65;;34215:126;;;:::o;34347:77::-;34384:7;34413:5;34402:16;;34347:77;;;:::o;34430:154::-;34514:6;34509:3;34504;34491:30;34576:1;34567:6;34562:3;34558:16;34551:27;34430:154;;;:::o;34590:307::-;34658:1;34668:113;34682:6;34679:1;34676:13;34668:113;;;34767:1;34762:3;34758:11;34752:18;34748:1;34743:3;34739:11;34732:39;34704:2;34701:1;34697:10;34692:15;;34668:113;;;34799:6;34796:1;34793:13;34790:101;;;34879:1;34870:6;34865:3;34861:16;34854:27;34790:101;34639:258;34590:307;;;:::o;34903:320::-;34947:6;34984:1;34978:4;34974:12;34964:22;;35031:1;35025:4;35021:12;35052:18;35042:81;;35108:4;35100:6;35096:17;35086:27;;35042:81;35170:2;35162:6;35159:14;35139:18;35136:38;35133:84;;;35189:18;;:::i;:::-;35133:84;34954:269;34903:320;;;:::o;35229:281::-;35312:27;35334:4;35312:27;:::i;:::-;35304:6;35300:40;35442:6;35430:10;35427:22;35406:18;35394:10;35391:34;35388:62;35385:88;;;35453:18;;:::i;:::-;35385:88;35493:10;35489:2;35482:22;35272:238;35229:281;;:::o;35516:233::-;35555:3;35578:24;35596:5;35578:24;:::i;:::-;35569:33;;35624:66;35617:5;35614:77;35611:103;;;35694:18;;:::i;:::-;35611:103;35741:1;35734:5;35730:13;35723:20;;35516:233;;;:::o;35755:100::-;35794:7;35823:26;35843:5;35823:26;:::i;:::-;35812:37;;35755:100;;;:::o;35861:94::-;35900:7;35929:20;35943:5;35929:20;:::i;:::-;35918:31;;35861:94;;;:::o;35961:176::-;35993:1;36010:20;36028:1;36010:20;:::i;:::-;36005:25;;36044:20;36062:1;36044:20;:::i;:::-;36039:25;;36083:1;36073:35;;36088:18;;:::i;:::-;36073:35;36129:1;36126;36122:9;36117:14;;35961:176;;;;:::o;36143:180::-;36191:77;36188:1;36181:88;36288:4;36285:1;36278:15;36312:4;36309:1;36302:15;36329:180;36377:77;36374:1;36367:88;36474:4;36471:1;36464:15;36498:4;36495:1;36488:15;36515:180;36563:77;36560:1;36553:88;36660:4;36657:1;36650:15;36684:4;36681:1;36674:15;36701:180;36749:77;36746:1;36739:88;36846:4;36843:1;36836:15;36870:4;36867:1;36860:15;36887:180;36935:77;36932:1;36925:88;37032:4;37029:1;37022:15;37056:4;37053:1;37046:15;37073:117;37182:1;37179;37172:12;37196:117;37305:1;37302;37295:12;37319:117;37428:1;37425;37418:12;37442:117;37551:1;37548;37541:12;37565:117;37674:1;37671;37664:12;37688:117;37797:1;37794;37787:12;37811:102;37852:6;37903:2;37899:7;37894:2;37887:5;37883:14;37879:28;37869:38;;37811:102;;;:::o;37919:94::-;37952:8;38000:5;37996:2;37992:14;37971:35;;37919:94;;;:::o;38019:170::-;38159:22;38155:1;38147:6;38143:14;38136:46;38019:170;:::o;38195:165::-;38335:17;38331:1;38323:6;38319:14;38312:41;38195:165;:::o;38366:225::-;38506:34;38502:1;38494:6;38490:14;38483:58;38575:8;38570:2;38562:6;38558:15;38551:33;38366:225;:::o;38597:179::-;38737:31;38733:1;38725:6;38721:14;38714:55;38597:179;:::o;38782:166::-;38922:18;38918:1;38910:6;38906:14;38899:42;38782:166;:::o;38954:167::-;39094:19;39090:1;39082:6;39078:14;39071:43;38954:167;:::o;39127:166::-;39267:18;39263:1;39255:6;39251:14;39244:42;39127:166;:::o;39299:163::-;39439:15;39435:1;39427:6;39423:14;39416:39;39299:163;:::o;39468:220::-;39608:34;39604:1;39596:6;39592:14;39585:58;39677:3;39672:2;39664:6;39660:15;39653:28;39468:220;:::o;39694:173::-;39834:25;39830:1;39822:6;39818:14;39811:49;39694:173;:::o;39873:155::-;40013:7;40009:1;40001:6;39997:14;39990:31;39873:155;:::o;40034:182::-;40174:34;40170:1;40162:6;40158:14;40151:58;40034:182;:::o;40222:171::-;40362:23;40358:1;40350:6;40346:14;40339:47;40222:171;:::o;40399:220::-;40539:34;40535:1;40527:6;40523:14;40516:58;40608:3;40603:2;40595:6;40591:15;40584:28;40399:220;:::o;40625:163::-;40765:15;40761:1;40753:6;40749:14;40742:39;40625:163;:::o;40794:225::-;40934:34;40930:1;40922:6;40918:14;40911:58;41003:8;40998:2;40990:6;40986:15;40979:33;40794:225;:::o;41025:168::-;41165:20;41161:1;41153:6;41149:14;41142:44;41025:168;:::o;41199:225::-;41339:34;41335:1;41327:6;41323:14;41316:58;41408:8;41403:2;41395:6;41391:15;41384:33;41199:225;:::o;41430:169::-;41570:21;41566:1;41558:6;41554:14;41547:45;41430:169;:::o;41605:114::-;;:::o;41725:122::-;41798:24;41816:5;41798:24;:::i;:::-;41791:5;41788:35;41778:63;;41837:1;41834;41827:12;41778:63;41725:122;:::o;41853:116::-;41923:21;41938:5;41923:21;:::i;:::-;41916:5;41913:32;41903:60;;41959:1;41956;41949:12;41903:60;41853:116;:::o;41975:122::-;42048:24;42066:5;42048:24;:::i;:::-;42041:5;42038:35;42028:63;;42087:1;42084;42077:12;42028:63;41975:122;:::o;42103:120::-;42175:23;42192:5;42175:23;:::i;:::-;42168:5;42165:34;42155:62;;42213:1;42210;42203:12;42155:62;42103:120;:::o;42229:122::-;42302:24;42320:5;42302:24;:::i;:::-;42295:5;42292:35;42282:63;;42341:1;42338;42331:12;42282:63;42229:122;:::o

Swarm Source

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