ETH Price: $2,327.05 (-5.91%)

Token

LDDFrens (LDD)
 

Overview

Max Total Supply

1,344 LDD

Holders

73

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 LDD
0x709799A7Da61969Ba80cD2963979D3cA0B5866b7
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:
LDD

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-22
*/

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


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

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/extensions/IERC721ABurnable.sol


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

pragma solidity ^0.8.4;


/**
 * @dev Interface of an ERC721ABurnable compliant contract.
 */
interface IERC721ABurnable is IERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/extensions/ERC721ABurnable.sol


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

pragma solidity ^0.8.4;



/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

// File: erc721a/contracts/extensions/IERC721AQueryable.sol


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

pragma solidity ^0.8.4;


/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

// File: erc721a/contracts/extensions/ERC721AQueryable.sol


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

pragma solidity ^0.8.4;



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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/5_LDD.sol


pragma solidity ^0.8.4;







contract LDD is Ownable, ERC721AQueryable, ERC721ABurnable, EIP712 {
    using ECDSA for bytes32;
    using Strings for uint256;

    uint256 public constant MAX_SUPPLY = 10000;
    bytes32 public constant MINT_VOUCHER_TYPE_STRUCT =
    keccak256("MintVoucher(address receiver,uint256 waveNum)");

    struct MintWave {
        uint256 startTime;
        uint256 endTime;
        uint256 mintPrice;
        uint256 mintCount;
        uint256 maxPerAddressMintCount;
        uint256 maxMintCount;
    }
    mapping(address => mapping(uint256 => uint256)) public addressMintCount;
    mapping(uint256 => MintWave) public mintWaves;
    bool public paused;
    mapping(address => bool) public signers;
    address public store;

    struct MintVoucher {
        address receiver;
        uint256 waveNum;
    }

    string private _baseMetadataURI;
    string private _contractMetadataURI;
    mapping(uint256 => string) private _tokenURIs;

    event Mint(uint256 wave, address account, uint256 quantity, uint256 refund);

    modifier onlyStoreOrOwner() {
        require(msg.sender == store || msg.sender == owner());
        _;
    }

    constructor(
        string memory _initBaseURI,
        string memory _initContractURI
    ) ERC721A("LDDFrens", "LDD") EIP712("LDDVoucher", "1") {
        signers[msg.sender] = true;
        _baseMetadataURI = _initBaseURI;
        _contractMetadataURI = _initContractURI;
    }

    function tokenURI(uint256 tokenId)
    public
    view
    override
    returns (string memory)
    {
        require(_exists(tokenId));

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

        if (bytes(_tokenURI).length > 0) {
            return _tokenURI;
        }

        return
        bytes(base).length > 0
        ? string(abi.encodePacked(base, tokenId.toString()))
        : "";
    }

    function whitelistMint(
        uint256 quantity,
        MintVoucher calldata voucher,
        bytes memory signature
    ) external payable {
        address signer = _hashTypedDataV4(
            keccak256(
                abi.encode(
                    MINT_VOUCHER_TYPE_STRUCT,
                    voucher.receiver,
                    voucher.waveNum
                )
            )
        ).toEthSignedMessageHash().recover(signature);
        require(signers[signer] == true, "Invalid signer");
        require(voucher.receiver == msg.sender, "Not voucher receiver");

        _mint(quantity, voucher.waveNum);
    }

    function publicMint(uint256 quantity) external payable {
        _mint(quantity, 4);
    }

    function devMint(uint256 quantity, address to) external onlyOwner {
        require(to != address(0));
        require(_totalMinted() + quantity <= MAX_SUPPLY, "Reached max supply");
        _safeMint(to, quantity);
    }

    function setMintWave(
        uint256 waveNum,
        uint256 startTime,
        uint256 endTime,
        uint256 mintPrice,
        uint256 maxPerAddressMintCount,
        uint256 maxMintCount
    ) external onlyOwner {
        require(mintWaves[waveNum].mintCount == 0);
        mintWaves[waveNum] = MintWave(
            startTime,
            endTime,
            mintPrice,
            0,
            maxPerAddressMintCount,
            maxMintCount
        );
    }

    function setContractURI(string calldata newContractURI) external onlyOwner {
        _contractMetadataURI = newContractURI;
    }

    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        _baseMetadataURI = newBaseURI;
    }

    function setSigner(address signer, bool isAuthorized) external onlyOwner {
        require(signer != address(0));
        signers[signer] = isAuthorized;
    }

    function setPaused(bool isPaused) external onlyOwner {
        paused = isPaused;
    }

    function setStore(address _store) external onlyOwner {
        store = _store;
    }

    function withdrawBalance() external onlyOwner {
        require(address(this).balance > 0);
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success);
    }

    function contractURI() external view returns (string memory) {
        return _contractMetadataURI;
    }

    function setTokenURI(
        address owner,
        uint256 tokenId,
        string memory uri
    ) external onlyStoreOrOwner {
        require(ownerOf(tokenId) == owner, "Owner not match");
        _tokenURIs[tokenId] = uri;
    }

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

    function _mint(uint256 quantity, uint256 waveNum) private {
        require(paused == false);

        require(block.timestamp >= mintWaves[waveNum].startTime);
        require(block.timestamp < mintWaves[waveNum].endTime);

        _validateQuantity(quantity, waveNum);
        require(msg.value >= mintWaves[waveNum].mintPrice * quantity);

        mintWaves[waveNum].mintCount += quantity;
        addressMintCount[msg.sender][waveNum] += quantity;

        _safeMint(msg.sender, quantity);
        _refundIfOver(mintWaves[waveNum].mintPrice * quantity);

        emit Mint(
            waveNum,
            msg.sender,
            quantity,
            msg.value - mintWaves[waveNum].mintPrice * quantity
        );
    }

    function _validateQuantity(uint256 quantity, uint256 waveNum) private view {
        require(
            addressMintCount[msg.sender][waveNum] + quantity <=
            mintWaves[waveNum].maxPerAddressMintCount
        );
        require(
            mintWaves[waveNum].mintCount + quantity <=
            mintWaves[waveNum].maxMintCount
        );
        require(_totalMinted() + quantity <= MAX_SUPPLY);
    }

    function _refundIfOver(uint256 price) private {
        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initContractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"wave","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refund","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_VOUCHER_TYPE_STRUCT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintWaves","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"mintCount","type":"uint256"},{"internalType":"uint256","name":"maxPerAddressMintCount","type":"uint256"},{"internalType":"uint256","name":"maxMintCount","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"waveNum","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxPerAddressMintCount","type":"uint256"},{"internalType":"uint256","name":"maxMintCount","type":"uint256"}],"name":"setMintWave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPaused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bool","name":"isAuthorized","type":"bool"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_store","type":"address"}],"name":"setStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"store","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"components":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"waveNum","type":"uint256"}],"internalType":"struct LDD.MintVoucher","name":"voucher","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040523480156200001257600080fd5b5060405162005efe38038062005efe8339818101604052810190620000389190620004fc565b6040518060400160405280600a81526020017f4c4444566f7563686572000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f4c44444672656e730000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4c444400000000000000000000000000000000000000000000000000000000008152506200013062000124620002c160201b60201c565b620002c960201b60201c565b816003908051906020019062000148929190620003ce565b50806004908051906020019062000161929190620003ce565b50620001726200038d60201b60201c565b600181905550505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001e38184846200039260201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080610120818152505050505050506001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555081600e90805190602001906200029f929190620003ce565b5080600f9080519060200190620002b8929190620003ce565b505050620007dd565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b60008383834630604051602001620003af959493929190620005b4565b6040516020818303038152906040528051906020012090509392505050565b828054620003dc90620006ee565b90600052602060002090601f0160209004810192826200040057600085556200044c565b82601f106200041b57805160ff19168380011785556200044c565b828001600101855582156200044c579182015b828111156200044b5782518255916020019190600101906200042e565b5b5090506200045b91906200045f565b5090565b5b808211156200047a57600081600090555060010162000460565b5090565b6000620004956200048f846200063a565b62000611565b905082815260208101848484011115620004b457620004b3620007bd565b5b620004c1848285620006b8565b509392505050565b600082601f830112620004e157620004e0620007b8565b5b8151620004f38482602086016200047e565b91505092915050565b60008060408385031215620005165762000515620007c7565b5b600083015167ffffffffffffffff811115620005375762000536620007c2565b5b6200054585828601620004c9565b925050602083015167ffffffffffffffff811115620005695762000568620007c2565b5b6200057785828601620004c9565b9150509250929050565b6200058c8162000670565b82525050565b6200059d8162000684565b82525050565b620005ae81620006ae565b82525050565b600060a082019050620005cb600083018862000592565b620005da602083018762000592565b620005e9604083018662000592565b620005f86060830185620005a3565b62000607608083018462000581565b9695505050505050565b60006200061d62000630565b90506200062b828262000724565b919050565b6000604051905090565b600067ffffffffffffffff82111562000658576200065762000789565b5b6200066382620007cc565b9050602081019050919050565b60006200067d826200068e565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620006d8578082015181840152602081019050620006bb565b83811115620006e8576000848401525b50505050565b600060028204905060018216806200070757607f821691505b602082108114156200071e576200071d6200075a565b5b50919050565b6200072f82620007cc565b810181811067ffffffffffffffff8211171562000751576200075062000789565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60805160a05160c05160601c60e05161010051610120516156ce62000830600039600061331a0152600061335c0152600061333b01526000613270015260006132c6015260006132ef01526156ce6000f3fe6080604052600436106102465760003560e01c80636352211e11610139578063975057e7116100b6578063c51895fa1161007a578063c51895fa14610897578063c87b56dd146108c2578063e8a3d485146108ff578063e985e9c51461092a578063ec4eb05d14610967578063f2fde38b1461099057610246565b8063975057e7146107a057806399a2557a146107cb578063a22cb46514610808578063b88d4fde14610831578063c23dc68f1461085a57610246565b80638462151c116100fd5780638462151c146106a75780638da5cb5b146106e4578063938e3d7b1461070f57806395d89b411461073857806396bef6a61461076357610246565b80636352211e1461059757806370a08231146105d4578063715018a614610611578063736c0d5b14610628578063753b0eec1461066557610246565b80632db11544116101c75780634e5786bf1161018b5780634e5786bf146104c657806355f804b3146104ef5780635bbb2177146105185780635c975abb146105555780635fd8c7101461058057610246565b80632db115441461040457806331cb61051461042057806332cb6b0c1461044957806342842e0e1461047457806342966c681461049d57610246565b8063158e3e951161020e578063158e3e951461034257806316c38b3c1461035e57806318160ddd1461038757806323b872dd146103b25780632d1a12f6146103db57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063087cbd40146102f0578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190614331565b6109b9565b60405161027f9190614afa565b60405180910390f35b34801561029457600080fd5b5061029d610a4b565b6040516102aa9190614bff565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906143d8565b610add565b6040516102e79190614a4f565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190614036565b610b59565b005b34801561032557600080fd5b50610340600480360381019061033b91906141b9565b610c19565b005b61035c60048036038101906103579190614445565b610dc0565b005b34801561036a57600080fd5b5061038560048036038101906103809190614304565b610f6e565b005b34801561039357600080fd5b5061039c611007565b6040516103a99190614d7c565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906140a3565b61101e565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190614405565b61102e565b005b61041e600480360381019061041991906143d8565b611149565b005b34801561042c57600080fd5b5061044760048036038101906104429190614179565b611157565b005b34801561045557600080fd5b5061045e611268565b60405161046b9190614d7c565b60405180910390f35b34801561048057600080fd5b5061049b600480360381019061049691906140a3565b61126e565b005b3480156104a957600080fd5b506104c460048036038101906104bf91906143d8565b61128e565b005b3480156104d257600080fd5b506104ed60048036038101906104e891906141f9565b61129c565b005b3480156104fb57600080fd5b506105166004803603810190610511919061438b565b6113d6565b005b34801561052457600080fd5b5061053f600480360381019061053a91906142bb565b611468565b60405161054c9190614ab6565b60405180910390f35b34801561056157600080fd5b5061056a611529565b6040516105779190614afa565b60405180910390f35b34801561058c57600080fd5b5061059561153c565b005b3480156105a357600080fd5b506105be60048036038101906105b991906143d8565b61163e565b6040516105cb9190614a4f565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190614036565b611650565b6040516106089190614d7c565b60405180910390f35b34801561061d57600080fd5b50610626611709565b005b34801561063457600080fd5b5061064f600480360381019061064a9190614036565b611791565b60405161065c9190614afa565b60405180910390f35b34801561067157600080fd5b5061068c600480360381019061068791906143d8565b6117b1565b60405161069e96959493929190614ddc565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c99190614036565b6117ed565b6040516106db9190614ad8565b60405180910390f35b3480156106f057600080fd5b506106f9611937565b6040516107069190614a4f565b60405180910390f35b34801561071b57600080fd5b506107366004803603810190610731919061438b565b611960565b005b34801561074457600080fd5b5061074d6119f2565b60405161075a9190614bff565b60405180910390f35b34801561076f57600080fd5b5061078a600480360381019061078591906141b9565b611a84565b6040516107979190614d7c565b60405180910390f35b3480156107ac57600080fd5b506107b5611aa9565b6040516107c29190614a4f565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed9190614268565b611acf565b6040516107ff9190614ad8565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a9190614179565b611ce3565b005b34801561083d57600080fd5b50610858600480360381019061085391906140f6565b611e5b565b005b34801561086657600080fd5b50610881600480360381019061087c91906143d8565b611ece565b60405161088e9190614d61565b60405180910390f35b3480156108a357600080fd5b506108ac611f38565b6040516108b99190614b15565b60405180910390f35b3480156108ce57600080fd5b506108e960048036038101906108e491906143d8565b611f5c565b6040516108f69190614bff565b60405180910390f35b34801561090b57600080fd5b50610914612083565b6040516109219190614bff565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c9190614063565b612115565b60405161095e9190614afa565b60405180910390f35b34801561097357600080fd5b5061098e600480360381019061098991906144b4565b6121a9565b005b34801561099c57600080fd5b506109b760048036038101906109b29190614036565b6122d0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a445750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a5a906151a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a86906151a6565b8015610ad35780601f10610aa857610100808354040283529160200191610ad3565b820191906000526020600020905b815481529060010190602001808311610ab657829003601f168201915b5050505050905090565b6000610ae8826123c8565b610b1e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b61612427565b73ffffffffffffffffffffffffffffffffffffffff16610b7f611937565b73ffffffffffffffffffffffffffffffffffffffff1614610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90614d01565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610c248261242f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cab6124fd565b73ffffffffffffffffffffffffffffffffffffffff1614610d0e57610cd781610cd26124fd565b612115565b610d0d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e4582610e37610e327fb8da390a1c9546b63a371d1c565b634514d45c33017cd3ea14d2aa060f38ffc8876000016020810190610e009190614036565b8860200135604051602001610e1793929190614b30565b60405160208183030381529060405280519060200120612505565b61251f565b61254f90919063ffffffff16565b905060011515600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190614ce1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16836000016020810190610f049190614036565b73ffffffffffffffffffffffffffffffffffffffff1614610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190614d21565b60405180910390fd5b610f68848460200135612576565b50505050565b610f76612427565b73ffffffffffffffffffffffffffffffffffffffff16610f94611937565b73ffffffffffffffffffffffffffffffffffffffff1614610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190614d01565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6000611011612748565b6002546001540303905090565b61102983838361274d565b505050565b611036612427565b73ffffffffffffffffffffffffffffffffffffffff16611054611937565b73ffffffffffffffffffffffffffffffffffffffff16146110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190614d01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110e457600080fd5b612710826110f0612af7565b6110fa9190614fb0565b111561113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290614c81565b60405180910390fd5b6111458183612b0a565b5050565b611154816004612576565b50565b61115f612427565b73ffffffffffffffffffffffffffffffffffffffff1661117d611937565b73ffffffffffffffffffffffffffffffffffffffff16146111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90614d01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d57600080fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61271081565b61128983838360405180602001604052806000815250611e5b565b505050565b611299816001612b28565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061132a57506112fb611937565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61133357600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166113538361163e565b73ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090614d41565b60405180910390fd5b806010600084815260200190815260200160002090805190602001906113d0929190613c6e565b50505050565b6113de612427565b73ffffffffffffffffffffffffffffffffffffffff166113fc611937565b73ffffffffffffffffffffffffffffffffffffffff1614611452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144990614d01565b60405180910390fd5b8181600e9190611463929190613cf4565b505050565b606060008251905060008167ffffffffffffffff81111561148c5761148b615378565b5b6040519080825280602002602001820160405280156114c557816020015b6114b2613d7a565b8152602001906001900390816114aa5790505b50905060005b82811461151e576114f58582815181106114e8576114e7615349565b5b6020026020010151611ece565b82828151811061150857611507615349565b5b60200260200101819052508060010190506114cb565b508092505050919050565b600b60009054906101000a900460ff1681565b611544612427565b73ffffffffffffffffffffffffffffffffffffffff16611562611937565b73ffffffffffffffffffffffffffffffffffffffff16146115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90614d01565b60405180910390fd5b600047116115c557600080fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516115eb90614a3a565b60006040518083038185875af1925050503d8060008114611628576040519150601f19603f3d011682016040523d82523d6000602084013e61162d565b606091505b505090508061163b57600080fd5b50565b60006116498261242f565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611711612427565b73ffffffffffffffffffffffffffffffffffffffff1661172f611937565b73ffffffffffffffffffffffffffffffffffffffff1614611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90614d01565b60405180910390fd5b61178f6000612e00565b565b600c6020528060005260406000206000915054906101000a900460ff1681565b600a6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b606060008060006117fd85611650565b905060008167ffffffffffffffff81111561181b5761181a615378565b5b6040519080825280602002602001820160405280156118495781602001602082028036833780820191505090505b509050611854613d7a565b600061185e612748565b90505b8386146119295761187181612ec4565b91508160400151156118825761191e565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146118c257816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561191d57808387806001019850815181106119105761190f615349565b5b6020026020010181815250505b5b806001019050611861565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611968612427565b73ffffffffffffffffffffffffffffffffffffffff16611986611937565b73ffffffffffffffffffffffffffffffffffffffff16146119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d390614d01565b60405180910390fd5b8181600f91906119ed929190613cf4565b505050565b606060048054611a01906151a6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2d906151a6565b8015611a7a5780601f10611a4f57610100808354040283529160200191611a7a565b820191906000526020600020905b815481529060010190602001808311611a5d57829003601f168201915b5050505050905090565b6009602052816000526040600020602052806000526040600020600091509150505481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060818310611b0a576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b15612eef565b9050611b1f612748565b851015611b3157611b2e612748565b94505b80841115611b3d578093505b6000611b4887611650565b905084861015611b6b576000868603905081811015611b65578091505b50611b70565b600090505b60008167ffffffffffffffff811115611b8c57611b8b615378565b5b604051908082528060200260200182016040528015611bba5781602001602082028036833780820191505090505b5090506000821415611bd25780945050505050611cdc565b6000611bdd88611ece565b905060008160400151611bf257816000015190505b60008990505b888114158015611c085750848714155b15611cce57611c1681612ec4565b9250826040015115611c2757611cc3565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c6757826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc25780848880600101995081518110611cb557611cb4615349565b5b6020026020010181815250505b5b806001019050611bf8565b508583528296505050505050505b9392505050565b611ceb6124fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d50576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611d5d6124fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e0a6124fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e4f9190614afa565b60405180910390a35050565b611e6684848461274d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ec857611e9184848484612ef9565b611ec7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611ed6613d7a565b611ede613d7a565b611ee6612748565b831080611efa5750611ef6612eef565b8310155b15611f085780915050611f33565b611f1183612ec4565b9050806040015115611f265780915050611f33565b611f2f83613059565b9150505b919050565b7fb8da390a1c9546b63a371d1c565b634514d45c33017cd3ea14d2aa060f38ffc881565b6060611f67826123c8565b611f7057600080fd5b6000601060008481526020019081526020016000208054611f90906151a6565b80601f0160208091040260200160405190810160405280929190818152602001828054611fbc906151a6565b80156120095780601f10611fde57610100808354040283529160200191612009565b820191906000526020600020905b815481529060010190602001808311611fec57829003601f168201915b50505050509050600061201a613079565b905060008251111561203057819250505061207e565b600081511161204e5760405180602001604052806000815250612079565b806120588561310b565b6040516020016120699291906149b9565b6040516020818303038152906040525b925050505b919050565b6060600f8054612092906151a6565b80601f01602080910402602001604051908101604052809291908181526020018280546120be906151a6565b801561210b5780601f106120e05761010080835404028352916020019161210b565b820191906000526020600020905b8154815290600101906020018083116120ee57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121b1612427565b73ffffffffffffffffffffffffffffffffffffffff166121cf611937565b73ffffffffffffffffffffffffffffffffffffffff1614612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90614d01565b60405180910390fd5b6000600a6000888152602001908152602001600020600301541461224857600080fd5b6040518060c001604052808681526020018581526020018481526020016000815260200183815260200182815250600a6000888152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050505050505050565b6122d8612427565b73ffffffffffffffffffffffffffffffffffffffff166122f6611937565b73ffffffffffffffffffffffffffffffffffffffff161461234c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234390614d01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b390614c61565b60405180910390fd5b6123c581612e00565b50565b6000816123d3612748565b111580156123e2575060015482105b8015612420575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b6000808290508061243e612748565b116124c6576001548110156124c55760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156124c3575b60008114156124b957600560008360019003935083815260200190815260200160002054905061248e565b80925050506124f8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600061251861251261326c565b83613386565b9050919050565b60008160405160200161253291906149dd565b604051602081830303815290604052805190602001209050919050565b600080600061255e85856133b9565b9150915061256b8161343c565b819250505092915050565b60001515600b60009054906101000a900460ff1615151461259657600080fd5b600a6000828152602001908152602001600020600001544210156125b957600080fd5b600a60008281526020019081526020016000206001015442106125db57600080fd5b6125e58282613611565b81600a6000838152602001908152602001600020600201546126079190615037565b34101561261357600080fd5b81600a600083815260200190815260200160002060030160008282546126399190614fb0565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008282546126a09190614fb0565b925050819055506126b13383612b0a565b6126db82600a6000848152602001908152602001600020600201546126d69190615037565b6136f8565b7f5a3e96f397e68b20a43c25f664b628805b877334dadfcc925c6c1a3ad434045881338485600a6000878152602001908152602001600020600201546127219190615037565b3461272c9190615091565b60405161273c9493929190614d97565b60405180910390a15050565b600090565b60006127588261242f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127bf576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127e06124fd565b73ffffffffffffffffffffffffffffffffffffffff16148061280f575061280e856128096124fd565b612115565b5b80612854575061281d6124fd565b73ffffffffffffffffffffffffffffffffffffffff1661283c84610add565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061288d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128f4576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129018585856001613756565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6129fe8661375c565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612a88576000600184019050600060056000838152602001908152602001600020541415612a86576001548114612a85578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612af08585856001613766565b5050505050565b6000612b01612748565b60015403905090565b612b2482826040518060200160405280600081525061376c565b5050565b6000612b338361242f565b905060008190508215612c105760008173ffffffffffffffffffffffffffffffffffffffff16612b616124fd565b73ffffffffffffffffffffffffffffffffffffffff161480612b905750612b8f82612b8a6124fd565b612115565b5b80612bd55750612b9e6124fd565b73ffffffffffffffffffffffffffffffffffffffff16612bbd86610add565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612c0e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b612c1e816000866001613756565b6007600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b612cf38461375c565b171717600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612d7e576000600185019050600060056000838152602001908152602001600020541415612d7c576001548114612d7b578260056000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612de8816000866001613766565b60026000815480929190600101919050555050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ecc613d7a565b612ee86005600084815260200190815260200160002054613a22565b9050919050565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f1f6124fd565b8786866040518563ffffffff1660e01b8152600401612f419493929190614a6a565b602060405180830381600087803b158015612f5b57600080fd5b505af1925050508015612f8c57506040513d601f19601f82011682018060405250810190612f89919061435e565b60015b613006573d8060008114612fbc576040519150601f19603f3d011682016040523d82523d6000602084013e612fc1565b606091505b50600081511415612ffe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b613061613d7a565b61307261306d8361242f565b613a22565b9050919050565b6060600e8054613088906151a6565b80601f01602080910402602001604051908101604052809291908181526020018280546130b4906151a6565b80156131015780601f106130d657610100808354040283529160200191613101565b820191906000526020600020905b8154815290600101906020018083116130e457829003601f168201915b5050505050905090565b60606000821415613153576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613267565b600082905060005b6000821461318557808061316e90615209565b915050600a8261317e9190615006565b915061315b565b60008167ffffffffffffffff8111156131a1576131a0615378565b5b6040519080825280601f01601f1916602001820160405280156131d35781602001600182028036833780820191505090505b5090505b60008514613260576001826131ec9190615091565b9150600a856131fb919061525c565b60306132079190614fb0565b60f81b81838151811061321d5761321c615349565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132599190615006565b94506131d7565b8093505050505b919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156132e857507f000000000000000000000000000000000000000000000000000000000000000046145b15613315577f00000000000000000000000000000000000000000000000000000000000000009050613383565b6133807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000613abe565b90505b90565b6000828260405160200161339b929190614a03565b60405160208183030381529060405280519060200120905092915050565b6000806041835114156133fb5760008060006020860151925060408601519150606086015160001a90506133ef87828585613af8565b94509450505050613435565b60408351141561342c576000806020850151915060408501519050613421868383613c05565b935093505050613435565b60006002915091505b9250929050565b600060048111156134505761344f6152eb565b5b816004811115613463576134626152eb565b5b141561346e5761360e565b60016004811115613482576134816152eb565b5b816004811115613495576134946152eb565b5b14156134d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cd90614c21565b60405180910390fd5b600260048111156134ea576134e96152eb565b5b8160048111156134fd576134fc6152eb565b5b141561353e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353590614c41565b60405180910390fd5b60036004811115613552576135516152eb565b5b816004811115613565576135646152eb565b5b14156135a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359d90614ca1565b60405180910390fd5b6004808111156135b9576135b86152eb565b5b8160048111156135cc576135cb6152eb565b5b141561360d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360490614cc1565b60405180910390fd5b5b50565b600a60008281526020019081526020016000206004015482600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020546136849190614fb0565b111561368f57600080fd5b600a60008281526020019081526020016000206005015482600a6000848152602001908152602001600020600301546136c89190614fb0565b11156136d357600080fd5b612710826136df612af7565b6136e99190614fb0565b11156136f457600080fd5b5050565b80341115613753573373ffffffffffffffffffffffffffffffffffffffff166108fc82346137269190615091565b9081150290604051600060405180830381858888f19350505050158015613751573d6000803e3d6000fd5b505b50565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137da576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613815576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138226000858386613756565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161388760018514613c64565b901b60a042901b6138978661375c565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461399b575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461394b6000878480600101955087612ef9565b613981576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106138dc57826001541461399657600080fd5b613a06565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061399c575b816001819055505050613a1c6000858386613766565b50505050565b613a2a613d7a565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b60008383834630604051602001613ad9959493929190614b67565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613b33576000600391509150613bfc565b601b8560ff1614158015613b4b5750601c8560ff1614155b15613b5d576000600491509150613bfc565b600060018787878760405160008152602001604052604051613b829493929190614bba565b6020604051602081039080840390855afa158015613ba4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613bf357600060019250925050613bfc565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613c489190614fb0565b9050613c5687828885613af8565b935093505050935093915050565b6000819050919050565b828054613c7a906151a6565b90600052602060002090601f016020900481019282613c9c5760008555613ce3565b82601f10613cb557805160ff1916838001178555613ce3565b82800160010185558215613ce3579182015b82811115613ce2578251825591602001919060010190613cc7565b5b509050613cf09190613dbd565b5090565b828054613d00906151a6565b90600052602060002090601f016020900481019282613d225760008555613d69565b82601f10613d3b57803560ff1916838001178555613d69565b82800160010185558215613d69579182015b82811115613d68578235825591602001919060010190613d4d565b5b509050613d769190613dbd565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613dd6576000816000905550600101613dbe565b5090565b6000613ded613de884614e62565b614e3d565b90508083825260208201905082856020860282011115613e1057613e0f6153b6565b5b60005b85811015613e405781613e268882614021565b845260208401935060208301925050600181019050613e13565b5050509392505050565b6000613e5d613e5884614e8e565b614e3d565b905082815260208101848484011115613e7957613e786153bb565b5b613e84848285615164565b509392505050565b6000613e9f613e9a84614ebf565b614e3d565b905082815260208101848484011115613ebb57613eba6153bb565b5b613ec6848285615164565b509392505050565b600081359050613edd8161563c565b92915050565b600082601f830112613ef857613ef76153ac565b5b8135613f08848260208601613dda565b91505092915050565b600081359050613f2081615653565b92915050565b600081359050613f358161566a565b92915050565b600081519050613f4a8161566a565b92915050565b600082601f830112613f6557613f646153ac565b5b8135613f75848260208601613e4a565b91505092915050565b60008083601f840112613f9457613f936153ac565b5b8235905067ffffffffffffffff811115613fb157613fb06153a7565b5b602083019150836001820283011115613fcd57613fcc6153b6565b5b9250929050565b600082601f830112613fe957613fe86153ac565b5b8135613ff9848260208601613e8c565b91505092915050565b600060408284031215614018576140176153b1565b5b81905092915050565b60008135905061403081615681565b92915050565b60006020828403121561404c5761404b6153c5565b5b600061405a84828501613ece565b91505092915050565b6000806040838503121561407a576140796153c5565b5b600061408885828601613ece565b925050602061409985828601613ece565b9150509250929050565b6000806000606084860312156140bc576140bb6153c5565b5b60006140ca86828701613ece565b93505060206140db86828701613ece565b92505060406140ec86828701614021565b9150509250925092565b600080600080608085870312156141105761410f6153c5565b5b600061411e87828801613ece565b945050602061412f87828801613ece565b935050604061414087828801614021565b925050606085013567ffffffffffffffff811115614161576141606153c0565b5b61416d87828801613f50565b91505092959194509250565b600080604083850312156141905761418f6153c5565b5b600061419e85828601613ece565b92505060206141af85828601613f11565b9150509250929050565b600080604083850312156141d0576141cf6153c5565b5b60006141de85828601613ece565b92505060206141ef85828601614021565b9150509250929050565b600080600060608486031215614212576142116153c5565b5b600061422086828701613ece565b935050602061423186828701614021565b925050604084013567ffffffffffffffff811115614252576142516153c0565b5b61425e86828701613fd4565b9150509250925092565b600080600060608486031215614281576142806153c5565b5b600061428f86828701613ece565b93505060206142a086828701614021565b92505060406142b186828701614021565b9150509250925092565b6000602082840312156142d1576142d06153c5565b5b600082013567ffffffffffffffff8111156142ef576142ee6153c0565b5b6142fb84828501613ee3565b91505092915050565b60006020828403121561431a576143196153c5565b5b600061432884828501613f11565b91505092915050565b600060208284031215614347576143466153c5565b5b600061435584828501613f26565b91505092915050565b600060208284031215614374576143736153c5565b5b600061438284828501613f3b565b91505092915050565b600080602083850312156143a2576143a16153c5565b5b600083013567ffffffffffffffff8111156143c0576143bf6153c0565b5b6143cc85828601613f7e565b92509250509250929050565b6000602082840312156143ee576143ed6153c5565b5b60006143fc84828501614021565b91505092915050565b6000806040838503121561441c5761441b6153c5565b5b600061442a85828601614021565b925050602061443b85828601613ece565b9150509250929050565b60008060006080848603121561445e5761445d6153c5565b5b600061446c86828701614021565b935050602061447d86828701614002565b925050606084013567ffffffffffffffff81111561449e5761449d6153c0565b5b6144aa86828701613f50565b9150509250925092565b60008060008060008060c087890312156144d1576144d06153c5565b5b60006144df89828a01614021565b96505060206144f089828a01614021565b955050604061450189828a01614021565b945050606061451289828a01614021565b935050608061452389828a01614021565b92505060a061453489828a01614021565b9150509295509295509295565b600061454d83836148f9565b60608301905092915050565b6000614565838361497d565b60208301905092915050565b61457a816150c5565b82525050565b614589816150c5565b82525050565b600061459a82614f10565b6145a48185614f56565b93506145af83614ef0565b8060005b838110156145e05781516145c78882614541565b97506145d283614f3c565b9250506001810190506145b3565b5085935050505092915050565b60006145f882614f1b565b6146028185614f67565b935061460d83614f00565b8060005b8381101561463e5781516146258882614559565b975061463083614f49565b925050600181019050614611565b5085935050505092915050565b614654816150d7565b82525050565b614663816150d7565b82525050565b614672816150e3565b82525050565b614689614684826150e3565b615252565b82525050565b600061469a82614f26565b6146a48185614f78565b93506146b4818560208601615173565b6146bd816153ca565b840191505092915050565b60006146d382614f31565b6146dd8185614f94565b93506146ed818560208601615173565b6146f6816153ca565b840191505092915050565b600061470c82614f31565b6147168185614fa5565b9350614726818560208601615173565b80840191505092915050565b600061473f601883614f94565b915061474a826153db565b602082019050919050565b6000614762601f83614f94565b915061476d82615404565b602082019050919050565b6000614785601c83614fa5565b91506147908261542d565b601c82019050919050565b60006147a8602683614f94565b91506147b382615456565b604082019050919050565b60006147cb600283614fa5565b91506147d6826154a5565b600282019050919050565b60006147ee601283614f94565b91506147f9826154ce565b602082019050919050565b6000614811602283614f94565b915061481c826154f7565b604082019050919050565b6000614834602283614f94565b915061483f82615546565b604082019050919050565b6000614857600e83614f94565b915061486282615595565b602082019050919050565b600061487a602083614f94565b9150614885826155be565b602082019050919050565b600061489d601483614f94565b91506148a8826155e7565b602082019050919050565b60006148c0600f83614f94565b91506148cb82615610565b602082019050919050565b60006148e3600083614f89565b91506148ee82615639565b600082019050919050565b60608201600082015161490f6000850182614571565b506020820151614922602085018261499b565b506040820151614935604085018261464b565b50505050565b6060820160008201516149516000850182614571565b506020820151614964602085018261499b565b506040820151614977604085018261464b565b50505050565b61498681615139565b82525050565b61499581615139565b82525050565b6149a481615143565b82525050565b6149b381615157565b82525050565b60006149c58285614701565b91506149d18284614701565b91508190509392505050565b60006149e882614778565b91506149f48284614678565b60208201915081905092915050565b6000614a0e826147be565b9150614a1a8285614678565b602082019150614a2a8284614678565b6020820191508190509392505050565b6000614a45826148d6565b9150819050919050565b6000602082019050614a646000830184614580565b92915050565b6000608082019050614a7f6000830187614580565b614a8c6020830186614580565b614a99604083018561498c565b8181036060830152614aab818461468f565b905095945050505050565b60006020820190508181036000830152614ad0818461458f565b905092915050565b60006020820190508181036000830152614af281846145ed565b905092915050565b6000602082019050614b0f600083018461465a565b92915050565b6000602082019050614b2a6000830184614669565b92915050565b6000606082019050614b456000830186614669565b614b526020830185614580565b614b5f604083018461498c565b949350505050565b600060a082019050614b7c6000830188614669565b614b896020830187614669565b614b966040830186614669565b614ba3606083018561498c565b614bb06080830184614580565b9695505050505050565b6000608082019050614bcf6000830187614669565b614bdc60208301866149aa565b614be96040830185614669565b614bf66060830184614669565b95945050505050565b60006020820190508181036000830152614c1981846146c8565b905092915050565b60006020820190508181036000830152614c3a81614732565b9050919050565b60006020820190508181036000830152614c5a81614755565b9050919050565b60006020820190508181036000830152614c7a8161479b565b9050919050565b60006020820190508181036000830152614c9a816147e1565b9050919050565b60006020820190508181036000830152614cba81614804565b9050919050565b60006020820190508181036000830152614cda81614827565b9050919050565b60006020820190508181036000830152614cfa8161484a565b9050919050565b60006020820190508181036000830152614d1a8161486d565b9050919050565b60006020820190508181036000830152614d3a81614890565b9050919050565b60006020820190508181036000830152614d5a816148b3565b9050919050565b6000606082019050614d76600083018461493b565b92915050565b6000602082019050614d91600083018461498c565b92915050565b6000608082019050614dac600083018761498c565b614db96020830186614580565b614dc6604083018561498c565b614dd3606083018461498c565b95945050505050565b600060c082019050614df1600083018961498c565b614dfe602083018861498c565b614e0b604083018761498c565b614e18606083018661498c565b614e25608083018561498c565b614e3260a083018461498c565b979650505050505050565b6000614e47614e58565b9050614e5382826151d8565b919050565b6000604051905090565b600067ffffffffffffffff821115614e7d57614e7c615378565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ea957614ea8615378565b5b614eb2826153ca565b9050602081019050919050565b600067ffffffffffffffff821115614eda57614ed9615378565b5b614ee3826153ca565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fbb82615139565b9150614fc683615139565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ffb57614ffa61528d565b5b828201905092915050565b600061501182615139565b915061501c83615139565b92508261502c5761502b6152bc565b5b828204905092915050565b600061504282615139565b915061504d83615139565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150865761508561528d565b5b828202905092915050565b600061509c82615139565b91506150a783615139565b9250828210156150ba576150b961528d565b5b828203905092915050565b60006150d082615119565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615191578082015181840152602081019050615176565b838111156151a0576000848401525b50505050565b600060028204905060018216806151be57607f821691505b602082108114156151d2576151d161531a565b5b50919050565b6151e1826153ca565b810181811067ffffffffffffffff82111715615200576151ff615378565b5b80604052505050565b600061521482615139565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152475761524661528d565b5b600182019050919050565b6000819050919050565b600061526782615139565b915061527283615139565b925082615282576152816152bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420766f7563686572207265636569766572000000000000000000000000600082015250565b7f4f776e6572206e6f74206d617463680000000000000000000000000000000000600082015250565b50565b615645816150c5565b811461565057600080fd5b50565b61565c816150d7565b811461566757600080fd5b50565b615673816150ed565b811461567e57600080fd5b50565b61568a81615139565b811461569557600080fd5b5056fea2646970667358221220187f50f499f43662242f2a2b1230f1747e8fee176bc9bfed9fad5b44c0672fb764736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003a68747470733a2f2f6c64646672656e732d6d657461646174612e73332e61702d736f757468656173742d312e616d617a6f6e6177732e636f6d2f000000000000000000000000000000000000000000000000000000000000000000000000004668747470733a2f2f6c64646672656e732d66696c65732e73332e61702d736f757468656173742d312e616d617a6f6e6177732e636f6d2f636f6c6c656374696f6e2e6a736f6e0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c80636352211e11610139578063975057e7116100b6578063c51895fa1161007a578063c51895fa14610897578063c87b56dd146108c2578063e8a3d485146108ff578063e985e9c51461092a578063ec4eb05d14610967578063f2fde38b1461099057610246565b8063975057e7146107a057806399a2557a146107cb578063a22cb46514610808578063b88d4fde14610831578063c23dc68f1461085a57610246565b80638462151c116100fd5780638462151c146106a75780638da5cb5b146106e4578063938e3d7b1461070f57806395d89b411461073857806396bef6a61461076357610246565b80636352211e1461059757806370a08231146105d4578063715018a614610611578063736c0d5b14610628578063753b0eec1461066557610246565b80632db11544116101c75780634e5786bf1161018b5780634e5786bf146104c657806355f804b3146104ef5780635bbb2177146105185780635c975abb146105555780635fd8c7101461058057610246565b80632db115441461040457806331cb61051461042057806332cb6b0c1461044957806342842e0e1461047457806342966c681461049d57610246565b8063158e3e951161020e578063158e3e951461034257806316c38b3c1461035e57806318160ddd1461038757806323b872dd146103b25780632d1a12f6146103db57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b3578063087cbd40146102f0578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190614331565b6109b9565b60405161027f9190614afa565b60405180910390f35b34801561029457600080fd5b5061029d610a4b565b6040516102aa9190614bff565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d591906143d8565b610add565b6040516102e79190614a4f565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190614036565b610b59565b005b34801561032557600080fd5b50610340600480360381019061033b91906141b9565b610c19565b005b61035c60048036038101906103579190614445565b610dc0565b005b34801561036a57600080fd5b5061038560048036038101906103809190614304565b610f6e565b005b34801561039357600080fd5b5061039c611007565b6040516103a99190614d7c565b60405180910390f35b3480156103be57600080fd5b506103d960048036038101906103d491906140a3565b61101e565b005b3480156103e757600080fd5b5061040260048036038101906103fd9190614405565b61102e565b005b61041e600480360381019061041991906143d8565b611149565b005b34801561042c57600080fd5b5061044760048036038101906104429190614179565b611157565b005b34801561045557600080fd5b5061045e611268565b60405161046b9190614d7c565b60405180910390f35b34801561048057600080fd5b5061049b600480360381019061049691906140a3565b61126e565b005b3480156104a957600080fd5b506104c460048036038101906104bf91906143d8565b61128e565b005b3480156104d257600080fd5b506104ed60048036038101906104e891906141f9565b61129c565b005b3480156104fb57600080fd5b506105166004803603810190610511919061438b565b6113d6565b005b34801561052457600080fd5b5061053f600480360381019061053a91906142bb565b611468565b60405161054c9190614ab6565b60405180910390f35b34801561056157600080fd5b5061056a611529565b6040516105779190614afa565b60405180910390f35b34801561058c57600080fd5b5061059561153c565b005b3480156105a357600080fd5b506105be60048036038101906105b991906143d8565b61163e565b6040516105cb9190614a4f565b60405180910390f35b3480156105e057600080fd5b506105fb60048036038101906105f69190614036565b611650565b6040516106089190614d7c565b60405180910390f35b34801561061d57600080fd5b50610626611709565b005b34801561063457600080fd5b5061064f600480360381019061064a9190614036565b611791565b60405161065c9190614afa565b60405180910390f35b34801561067157600080fd5b5061068c600480360381019061068791906143d8565b6117b1565b60405161069e96959493929190614ddc565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c99190614036565b6117ed565b6040516106db9190614ad8565b60405180910390f35b3480156106f057600080fd5b506106f9611937565b6040516107069190614a4f565b60405180910390f35b34801561071b57600080fd5b506107366004803603810190610731919061438b565b611960565b005b34801561074457600080fd5b5061074d6119f2565b60405161075a9190614bff565b60405180910390f35b34801561076f57600080fd5b5061078a600480360381019061078591906141b9565b611a84565b6040516107979190614d7c565b60405180910390f35b3480156107ac57600080fd5b506107b5611aa9565b6040516107c29190614a4f565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed9190614268565b611acf565b6040516107ff9190614ad8565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a9190614179565b611ce3565b005b34801561083d57600080fd5b50610858600480360381019061085391906140f6565b611e5b565b005b34801561086657600080fd5b50610881600480360381019061087c91906143d8565b611ece565b60405161088e9190614d61565b60405180910390f35b3480156108a357600080fd5b506108ac611f38565b6040516108b99190614b15565b60405180910390f35b3480156108ce57600080fd5b506108e960048036038101906108e491906143d8565b611f5c565b6040516108f69190614bff565b60405180910390f35b34801561090b57600080fd5b50610914612083565b6040516109219190614bff565b60405180910390f35b34801561093657600080fd5b50610951600480360381019061094c9190614063565b612115565b60405161095e9190614afa565b60405180910390f35b34801561097357600080fd5b5061098e600480360381019061098991906144b4565b6121a9565b005b34801561099c57600080fd5b506109b760048036038101906109b29190614036565b6122d0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a1457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a445750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a5a906151a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610a86906151a6565b8015610ad35780601f10610aa857610100808354040283529160200191610ad3565b820191906000526020600020905b815481529060010190602001808311610ab657829003601f168201915b5050505050905090565b6000610ae8826123c8565b610b1e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610b61612427565b73ffffffffffffffffffffffffffffffffffffffff16610b7f611937565b73ffffffffffffffffffffffffffffffffffffffff1614610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcc90614d01565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610c248261242f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cab6124fd565b73ffffffffffffffffffffffffffffffffffffffff1614610d0e57610cd781610cd26124fd565b612115565b610d0d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e4582610e37610e327fb8da390a1c9546b63a371d1c565b634514d45c33017cd3ea14d2aa060f38ffc8876000016020810190610e009190614036565b8860200135604051602001610e1793929190614b30565b60405160208183030381529060405280519060200120612505565b61251f565b61254f90919063ffffffff16565b905060011515600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610eda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed190614ce1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16836000016020810190610f049190614036565b73ffffffffffffffffffffffffffffffffffffffff1614610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190614d21565b60405180910390fd5b610f68848460200135612576565b50505050565b610f76612427565b73ffffffffffffffffffffffffffffffffffffffff16610f94611937565b73ffffffffffffffffffffffffffffffffffffffff1614610fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe190614d01565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6000611011612748565b6002546001540303905090565b61102983838361274d565b505050565b611036612427565b73ffffffffffffffffffffffffffffffffffffffff16611054611937565b73ffffffffffffffffffffffffffffffffffffffff16146110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a190614d01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110e457600080fd5b612710826110f0612af7565b6110fa9190614fb0565b111561113b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113290614c81565b60405180910390fd5b6111458183612b0a565b5050565b611154816004612576565b50565b61115f612427565b73ffffffffffffffffffffffffffffffffffffffff1661117d611937565b73ffffffffffffffffffffffffffffffffffffffff16146111d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ca90614d01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561120d57600080fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61271081565b61128983838360405180602001604052806000815250611e5b565b505050565b611299816001612b28565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061132a57506112fb611937565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61133357600080fd5b8273ffffffffffffffffffffffffffffffffffffffff166113538361163e565b73ffffffffffffffffffffffffffffffffffffffff16146113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a090614d41565b60405180910390fd5b806010600084815260200190815260200160002090805190602001906113d0929190613c6e565b50505050565b6113de612427565b73ffffffffffffffffffffffffffffffffffffffff166113fc611937565b73ffffffffffffffffffffffffffffffffffffffff1614611452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144990614d01565b60405180910390fd5b8181600e9190611463929190613cf4565b505050565b606060008251905060008167ffffffffffffffff81111561148c5761148b615378565b5b6040519080825280602002602001820160405280156114c557816020015b6114b2613d7a565b8152602001906001900390816114aa5790505b50905060005b82811461151e576114f58582815181106114e8576114e7615349565b5b6020026020010151611ece565b82828151811061150857611507615349565b5b60200260200101819052508060010190506114cb565b508092505050919050565b600b60009054906101000a900460ff1681565b611544612427565b73ffffffffffffffffffffffffffffffffffffffff16611562611937565b73ffffffffffffffffffffffffffffffffffffffff16146115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90614d01565b60405180910390fd5b600047116115c557600080fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516115eb90614a3a565b60006040518083038185875af1925050503d8060008114611628576040519150601f19603f3d011682016040523d82523d6000602084013e61162d565b606091505b505090508061163b57600080fd5b50565b60006116498261242f565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b8576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611711612427565b73ffffffffffffffffffffffffffffffffffffffff1661172f611937565b73ffffffffffffffffffffffffffffffffffffffff1614611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90614d01565b60405180910390fd5b61178f6000612e00565b565b600c6020528060005260406000206000915054906101000a900460ff1681565b600a6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154905086565b606060008060006117fd85611650565b905060008167ffffffffffffffff81111561181b5761181a615378565b5b6040519080825280602002602001820160405280156118495781602001602082028036833780820191505090505b509050611854613d7a565b600061185e612748565b90505b8386146119295761187181612ec4565b91508160400151156118825761191e565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146118c257816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561191d57808387806001019850815181106119105761190f615349565b5b6020026020010181815250505b5b806001019050611861565b508195505050505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611968612427565b73ffffffffffffffffffffffffffffffffffffffff16611986611937565b73ffffffffffffffffffffffffffffffffffffffff16146119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d390614d01565b60405180910390fd5b8181600f91906119ed929190613cf4565b505050565b606060048054611a01906151a6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2d906151a6565b8015611a7a5780601f10611a4f57610100808354040283529160200191611a7a565b820191906000526020600020905b815481529060010190602001808311611a5d57829003601f168201915b5050505050905090565b6009602052816000526040600020602052806000526040600020600091509150505481565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060818310611b0a576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611b15612eef565b9050611b1f612748565b851015611b3157611b2e612748565b94505b80841115611b3d578093505b6000611b4887611650565b905084861015611b6b576000868603905081811015611b65578091505b50611b70565b600090505b60008167ffffffffffffffff811115611b8c57611b8b615378565b5b604051908082528060200260200182016040528015611bba5781602001602082028036833780820191505090505b5090506000821415611bd25780945050505050611cdc565b6000611bdd88611ece565b905060008160400151611bf257816000015190505b60008990505b888114158015611c085750848714155b15611cce57611c1681612ec4565b9250826040015115611c2757611cc3565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611c6757826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc25780848880600101995081518110611cb557611cb4615349565b5b6020026020010181815250505b5b806001019050611bf8565b508583528296505050505050505b9392505050565b611ceb6124fd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d50576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060086000611d5d6124fd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e0a6124fd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e4f9190614afa565b60405180910390a35050565b611e6684848461274d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611ec857611e9184848484612ef9565b611ec7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611ed6613d7a565b611ede613d7a565b611ee6612748565b831080611efa5750611ef6612eef565b8310155b15611f085780915050611f33565b611f1183612ec4565b9050806040015115611f265780915050611f33565b611f2f83613059565b9150505b919050565b7fb8da390a1c9546b63a371d1c565b634514d45c33017cd3ea14d2aa060f38ffc881565b6060611f67826123c8565b611f7057600080fd5b6000601060008481526020019081526020016000208054611f90906151a6565b80601f0160208091040260200160405190810160405280929190818152602001828054611fbc906151a6565b80156120095780601f10611fde57610100808354040283529160200191612009565b820191906000526020600020905b815481529060010190602001808311611fec57829003601f168201915b50505050509050600061201a613079565b905060008251111561203057819250505061207e565b600081511161204e5760405180602001604052806000815250612079565b806120588561310b565b6040516020016120699291906149b9565b6040516020818303038152906040525b925050505b919050565b6060600f8054612092906151a6565b80601f01602080910402602001604051908101604052809291908181526020018280546120be906151a6565b801561210b5780601f106120e05761010080835404028352916020019161210b565b820191906000526020600020905b8154815290600101906020018083116120ee57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121b1612427565b73ffffffffffffffffffffffffffffffffffffffff166121cf611937565b73ffffffffffffffffffffffffffffffffffffffff1614612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c90614d01565b60405180910390fd5b6000600a6000888152602001908152602001600020600301541461224857600080fd5b6040518060c001604052808681526020018581526020018481526020016000815260200183815260200182815250600a6000888152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050505050505050565b6122d8612427565b73ffffffffffffffffffffffffffffffffffffffff166122f6611937565b73ffffffffffffffffffffffffffffffffffffffff161461234c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234390614d01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b390614c61565b60405180910390fd5b6123c581612e00565b50565b6000816123d3612748565b111580156123e2575060015482105b8015612420575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b6000808290508061243e612748565b116124c6576001548110156124c55760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156124c3575b60008114156124b957600560008360019003935083815260200190815260200160002054905061248e565b80925050506124f8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600061251861251261326c565b83613386565b9050919050565b60008160405160200161253291906149dd565b604051602081830303815290604052805190602001209050919050565b600080600061255e85856133b9565b9150915061256b8161343c565b819250505092915050565b60001515600b60009054906101000a900460ff1615151461259657600080fd5b600a6000828152602001908152602001600020600001544210156125b957600080fd5b600a60008281526020019081526020016000206001015442106125db57600080fd5b6125e58282613611565b81600a6000838152602001908152602001600020600201546126079190615037565b34101561261357600080fd5b81600a600083815260200190815260200160002060030160008282546126399190614fb0565b9250508190555081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008282546126a09190614fb0565b925050819055506126b13383612b0a565b6126db82600a6000848152602001908152602001600020600201546126d69190615037565b6136f8565b7f5a3e96f397e68b20a43c25f664b628805b877334dadfcc925c6c1a3ad434045881338485600a6000878152602001908152602001600020600201546127219190615037565b3461272c9190615091565b60405161273c9493929190614d97565b60405180910390a15050565b600090565b60006127588261242f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127bf576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166127e06124fd565b73ffffffffffffffffffffffffffffffffffffffff16148061280f575061280e856128096124fd565b612115565b5b80612854575061281d6124fd565b73ffffffffffffffffffffffffffffffffffffffff1661283c84610add565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061288d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128f4576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129018585856001613756565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6129fe8661375c565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612a88576000600184019050600060056000838152602001908152602001600020541415612a86576001548114612a85578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612af08585856001613766565b5050505050565b6000612b01612748565b60015403905090565b612b2482826040518060200160405280600081525061376c565b5050565b6000612b338361242f565b905060008190508215612c105760008173ffffffffffffffffffffffffffffffffffffffff16612b616124fd565b73ffffffffffffffffffffffffffffffffffffffff161480612b905750612b8f82612b8a6124fd565b612115565b5b80612bd55750612b9e6124fd565b73ffffffffffffffffffffffffffffffffffffffff16612bbd86610add565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612c0e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b612c1e816000866001613756565b6007600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b612cf38461375c565b171717600560008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612d7e576000600185019050600060056000838152602001908152602001600020541415612d7c576001548114612d7b578260056000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612de8816000866001613766565b60026000815480929190600101919050555050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ecc613d7a565b612ee86005600084815260200190815260200160002054613a22565b9050919050565b6000600154905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f1f6124fd565b8786866040518563ffffffff1660e01b8152600401612f419493929190614a6a565b602060405180830381600087803b158015612f5b57600080fd5b505af1925050508015612f8c57506040513d601f19601f82011682018060405250810190612f89919061435e565b60015b613006573d8060008114612fbc576040519150601f19603f3d011682016040523d82523d6000602084013e612fc1565b606091505b50600081511415612ffe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b613061613d7a565b61307261306d8361242f565b613a22565b9050919050565b6060600e8054613088906151a6565b80601f01602080910402602001604051908101604052809291908181526020018280546130b4906151a6565b80156131015780601f106130d657610100808354040283529160200191613101565b820191906000526020600020905b8154815290600101906020018083116130e457829003601f168201915b5050505050905090565b60606000821415613153576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613267565b600082905060005b6000821461318557808061316e90615209565b915050600a8261317e9190615006565b915061315b565b60008167ffffffffffffffff8111156131a1576131a0615378565b5b6040519080825280601f01601f1916602001820160405280156131d35781602001600182028036833780820191505090505b5090505b60008514613260576001826131ec9190615091565b9150600a856131fb919061525c565b60306132079190614fb0565b60f81b81838151811061321d5761321c615349565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132599190615006565b94506131d7565b8093505050505b919050565b60007f000000000000000000000000ae46645e4fe4b0008b686e53a7b0ab932e16f9da73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156132e857507f000000000000000000000000000000000000000000000000000000000000000146145b15613315577f83615a16cf9262bc831d68b8fbc71ecaed8483190c4e0fc822c0d74ea9bfe3369050613383565b6133807f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fe3fef01f4da007834f34264a3573caf55c7691bfcae6fd1f48dec15456cc32e37fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613abe565b90505b90565b6000828260405160200161339b929190614a03565b60405160208183030381529060405280519060200120905092915050565b6000806041835114156133fb5760008060006020860151925060408601519150606086015160001a90506133ef87828585613af8565b94509450505050613435565b60408351141561342c576000806020850151915060408501519050613421868383613c05565b935093505050613435565b60006002915091505b9250929050565b600060048111156134505761344f6152eb565b5b816004811115613463576134626152eb565b5b141561346e5761360e565b60016004811115613482576134816152eb565b5b816004811115613495576134946152eb565b5b14156134d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cd90614c21565b60405180910390fd5b600260048111156134ea576134e96152eb565b5b8160048111156134fd576134fc6152eb565b5b141561353e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353590614c41565b60405180910390fd5b60036004811115613552576135516152eb565b5b816004811115613565576135646152eb565b5b14156135a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161359d90614ca1565b60405180910390fd5b6004808111156135b9576135b86152eb565b5b8160048111156135cc576135cb6152eb565b5b141561360d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360490614cc1565b60405180910390fd5b5b50565b600a60008281526020019081526020016000206004015482600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020546136849190614fb0565b111561368f57600080fd5b600a60008281526020019081526020016000206005015482600a6000848152602001908152602001600020600301546136c89190614fb0565b11156136d357600080fd5b612710826136df612af7565b6136e99190614fb0565b11156136f457600080fd5b5050565b80341115613753573373ffffffffffffffffffffffffffffffffffffffff166108fc82346137269190615091565b9081150290604051600060405180830381858888f19350505050158015613751573d6000803e3d6000fd5b505b50565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156137da576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415613815576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6138226000858386613756565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161388760018514613c64565b901b60a042901b6138978661375c565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1461399b575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461394b6000878480600101955087612ef9565b613981576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106138dc57826001541461399657600080fd5b613a06565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061399c575b816001819055505050613a1c6000858386613766565b50505050565b613a2a613d7a565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b60008383834630604051602001613ad9959493929190614b67565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613b33576000600391509150613bfc565b601b8560ff1614158015613b4b5750601c8560ff1614155b15613b5d576000600491509150613bfc565b600060018787878760405160008152602001604052604051613b829493929190614bba565b6020604051602081039080840390855afa158015613ba4573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613bf357600060019250925050613bfc565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c613c489190614fb0565b9050613c5687828885613af8565b935093505050935093915050565b6000819050919050565b828054613c7a906151a6565b90600052602060002090601f016020900481019282613c9c5760008555613ce3565b82601f10613cb557805160ff1916838001178555613ce3565b82800160010185558215613ce3579182015b82811115613ce2578251825591602001919060010190613cc7565b5b509050613cf09190613dbd565b5090565b828054613d00906151a6565b90600052602060002090601f016020900481019282613d225760008555613d69565b82601f10613d3b57803560ff1916838001178555613d69565b82800160010185558215613d69579182015b82811115613d68578235825591602001919060010190613d4d565b5b509050613d769190613dbd565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613dd6576000816000905550600101613dbe565b5090565b6000613ded613de884614e62565b614e3d565b90508083825260208201905082856020860282011115613e1057613e0f6153b6565b5b60005b85811015613e405781613e268882614021565b845260208401935060208301925050600181019050613e13565b5050509392505050565b6000613e5d613e5884614e8e565b614e3d565b905082815260208101848484011115613e7957613e786153bb565b5b613e84848285615164565b509392505050565b6000613e9f613e9a84614ebf565b614e3d565b905082815260208101848484011115613ebb57613eba6153bb565b5b613ec6848285615164565b509392505050565b600081359050613edd8161563c565b92915050565b600082601f830112613ef857613ef76153ac565b5b8135613f08848260208601613dda565b91505092915050565b600081359050613f2081615653565b92915050565b600081359050613f358161566a565b92915050565b600081519050613f4a8161566a565b92915050565b600082601f830112613f6557613f646153ac565b5b8135613f75848260208601613e4a565b91505092915050565b60008083601f840112613f9457613f936153ac565b5b8235905067ffffffffffffffff811115613fb157613fb06153a7565b5b602083019150836001820283011115613fcd57613fcc6153b6565b5b9250929050565b600082601f830112613fe957613fe86153ac565b5b8135613ff9848260208601613e8c565b91505092915050565b600060408284031215614018576140176153b1565b5b81905092915050565b60008135905061403081615681565b92915050565b60006020828403121561404c5761404b6153c5565b5b600061405a84828501613ece565b91505092915050565b6000806040838503121561407a576140796153c5565b5b600061408885828601613ece565b925050602061409985828601613ece565b9150509250929050565b6000806000606084860312156140bc576140bb6153c5565b5b60006140ca86828701613ece565b93505060206140db86828701613ece565b92505060406140ec86828701614021565b9150509250925092565b600080600080608085870312156141105761410f6153c5565b5b600061411e87828801613ece565b945050602061412f87828801613ece565b935050604061414087828801614021565b925050606085013567ffffffffffffffff811115614161576141606153c0565b5b61416d87828801613f50565b91505092959194509250565b600080604083850312156141905761418f6153c5565b5b600061419e85828601613ece565b92505060206141af85828601613f11565b9150509250929050565b600080604083850312156141d0576141cf6153c5565b5b60006141de85828601613ece565b92505060206141ef85828601614021565b9150509250929050565b600080600060608486031215614212576142116153c5565b5b600061422086828701613ece565b935050602061423186828701614021565b925050604084013567ffffffffffffffff811115614252576142516153c0565b5b61425e86828701613fd4565b9150509250925092565b600080600060608486031215614281576142806153c5565b5b600061428f86828701613ece565b93505060206142a086828701614021565b92505060406142b186828701614021565b9150509250925092565b6000602082840312156142d1576142d06153c5565b5b600082013567ffffffffffffffff8111156142ef576142ee6153c0565b5b6142fb84828501613ee3565b91505092915050565b60006020828403121561431a576143196153c5565b5b600061432884828501613f11565b91505092915050565b600060208284031215614347576143466153c5565b5b600061435584828501613f26565b91505092915050565b600060208284031215614374576143736153c5565b5b600061438284828501613f3b565b91505092915050565b600080602083850312156143a2576143a16153c5565b5b600083013567ffffffffffffffff8111156143c0576143bf6153c0565b5b6143cc85828601613f7e565b92509250509250929050565b6000602082840312156143ee576143ed6153c5565b5b60006143fc84828501614021565b91505092915050565b6000806040838503121561441c5761441b6153c5565b5b600061442a85828601614021565b925050602061443b85828601613ece565b9150509250929050565b60008060006080848603121561445e5761445d6153c5565b5b600061446c86828701614021565b935050602061447d86828701614002565b925050606084013567ffffffffffffffff81111561449e5761449d6153c0565b5b6144aa86828701613f50565b9150509250925092565b60008060008060008060c087890312156144d1576144d06153c5565b5b60006144df89828a01614021565b96505060206144f089828a01614021565b955050604061450189828a01614021565b945050606061451289828a01614021565b935050608061452389828a01614021565b92505060a061453489828a01614021565b9150509295509295509295565b600061454d83836148f9565b60608301905092915050565b6000614565838361497d565b60208301905092915050565b61457a816150c5565b82525050565b614589816150c5565b82525050565b600061459a82614f10565b6145a48185614f56565b93506145af83614ef0565b8060005b838110156145e05781516145c78882614541565b97506145d283614f3c565b9250506001810190506145b3565b5085935050505092915050565b60006145f882614f1b565b6146028185614f67565b935061460d83614f00565b8060005b8381101561463e5781516146258882614559565b975061463083614f49565b925050600181019050614611565b5085935050505092915050565b614654816150d7565b82525050565b614663816150d7565b82525050565b614672816150e3565b82525050565b614689614684826150e3565b615252565b82525050565b600061469a82614f26565b6146a48185614f78565b93506146b4818560208601615173565b6146bd816153ca565b840191505092915050565b60006146d382614f31565b6146dd8185614f94565b93506146ed818560208601615173565b6146f6816153ca565b840191505092915050565b600061470c82614f31565b6147168185614fa5565b9350614726818560208601615173565b80840191505092915050565b600061473f601883614f94565b915061474a826153db565b602082019050919050565b6000614762601f83614f94565b915061476d82615404565b602082019050919050565b6000614785601c83614fa5565b91506147908261542d565b601c82019050919050565b60006147a8602683614f94565b91506147b382615456565b604082019050919050565b60006147cb600283614fa5565b91506147d6826154a5565b600282019050919050565b60006147ee601283614f94565b91506147f9826154ce565b602082019050919050565b6000614811602283614f94565b915061481c826154f7565b604082019050919050565b6000614834602283614f94565b915061483f82615546565b604082019050919050565b6000614857600e83614f94565b915061486282615595565b602082019050919050565b600061487a602083614f94565b9150614885826155be565b602082019050919050565b600061489d601483614f94565b91506148a8826155e7565b602082019050919050565b60006148c0600f83614f94565b91506148cb82615610565b602082019050919050565b60006148e3600083614f89565b91506148ee82615639565b600082019050919050565b60608201600082015161490f6000850182614571565b506020820151614922602085018261499b565b506040820151614935604085018261464b565b50505050565b6060820160008201516149516000850182614571565b506020820151614964602085018261499b565b506040820151614977604085018261464b565b50505050565b61498681615139565b82525050565b61499581615139565b82525050565b6149a481615143565b82525050565b6149b381615157565b82525050565b60006149c58285614701565b91506149d18284614701565b91508190509392505050565b60006149e882614778565b91506149f48284614678565b60208201915081905092915050565b6000614a0e826147be565b9150614a1a8285614678565b602082019150614a2a8284614678565b6020820191508190509392505050565b6000614a45826148d6565b9150819050919050565b6000602082019050614a646000830184614580565b92915050565b6000608082019050614a7f6000830187614580565b614a8c6020830186614580565b614a99604083018561498c565b8181036060830152614aab818461468f565b905095945050505050565b60006020820190508181036000830152614ad0818461458f565b905092915050565b60006020820190508181036000830152614af281846145ed565b905092915050565b6000602082019050614b0f600083018461465a565b92915050565b6000602082019050614b2a6000830184614669565b92915050565b6000606082019050614b456000830186614669565b614b526020830185614580565b614b5f604083018461498c565b949350505050565b600060a082019050614b7c6000830188614669565b614b896020830187614669565b614b966040830186614669565b614ba3606083018561498c565b614bb06080830184614580565b9695505050505050565b6000608082019050614bcf6000830187614669565b614bdc60208301866149aa565b614be96040830185614669565b614bf66060830184614669565b95945050505050565b60006020820190508181036000830152614c1981846146c8565b905092915050565b60006020820190508181036000830152614c3a81614732565b9050919050565b60006020820190508181036000830152614c5a81614755565b9050919050565b60006020820190508181036000830152614c7a8161479b565b9050919050565b60006020820190508181036000830152614c9a816147e1565b9050919050565b60006020820190508181036000830152614cba81614804565b9050919050565b60006020820190508181036000830152614cda81614827565b9050919050565b60006020820190508181036000830152614cfa8161484a565b9050919050565b60006020820190508181036000830152614d1a8161486d565b9050919050565b60006020820190508181036000830152614d3a81614890565b9050919050565b60006020820190508181036000830152614d5a816148b3565b9050919050565b6000606082019050614d76600083018461493b565b92915050565b6000602082019050614d91600083018461498c565b92915050565b6000608082019050614dac600083018761498c565b614db96020830186614580565b614dc6604083018561498c565b614dd3606083018461498c565b95945050505050565b600060c082019050614df1600083018961498c565b614dfe602083018861498c565b614e0b604083018761498c565b614e18606083018661498c565b614e25608083018561498c565b614e3260a083018461498c565b979650505050505050565b6000614e47614e58565b9050614e5382826151d8565b919050565b6000604051905090565b600067ffffffffffffffff821115614e7d57614e7c615378565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ea957614ea8615378565b5b614eb2826153ca565b9050602081019050919050565b600067ffffffffffffffff821115614eda57614ed9615378565b5b614ee3826153ca565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614fbb82615139565b9150614fc683615139565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ffb57614ffa61528d565b5b828201905092915050565b600061501182615139565b915061501c83615139565b92508261502c5761502b6152bc565b5b828204905092915050565b600061504282615139565b915061504d83615139565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150865761508561528d565b5b828202905092915050565b600061509c82615139565b91506150a783615139565b9250828210156150ba576150b961528d565b5b828203905092915050565b60006150d082615119565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015615191578082015181840152602081019050615176565b838111156151a0576000848401525b50505050565b600060028204905060018216806151be57607f821691505b602082108114156151d2576151d161531a565b5b50919050565b6151e1826153ca565b810181811067ffffffffffffffff82111715615200576151ff615378565b5b80604052505050565b600061521482615139565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152475761524661528d565b5b600182019050919050565b6000819050919050565b600061526782615139565b915061527283615139565b925082615282576152816152bc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207369676e6572000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420766f7563686572207265636569766572000000000000000000000000600082015250565b7f4f776e6572206e6f74206d617463680000000000000000000000000000000000600082015250565b50565b615645816150c5565b811461565057600080fd5b50565b61565c816150d7565b811461566757600080fd5b50565b615673816150ed565b811461567e57600080fd5b50565b61568a81615139565b811461569557600080fd5b5056fea2646970667358221220187f50f499f43662242f2a2b1230f1747e8fee176bc9bfed9fad5b44c0672fb764736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003a68747470733a2f2f6c64646672656e732d6d657461646174612e73332e61702d736f757468656173742d312e616d617a6f6e6177732e636f6d2f000000000000000000000000000000000000000000000000000000000000000000000000004668747470733a2f2f6c64646672656e732d66696c65732e73332e61702d736f757468656173742d312e616d617a6f6e6177732e636f6d2f636f6c6c656374696f6e2e6a736f6e0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string): https://lddfrens-metadata.s3.ap-southeast-1.amazonaws.com/
Arg [1] : _initContractURI (string): https://lddfrens-files.s3.ap-southeast-1.amazonaws.com/collection.json

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000000000000000000000000000000000000000003a
Arg [3] : 68747470733a2f2f6c64646672656e732d6d657461646174612e73332e61702d
Arg [4] : 736f757468656173742d312e616d617a6f6e6177732e636f6d2f000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000046
Arg [6] : 68747470733a2f2f6c64646672656e732d66696c65732e73332e61702d736f75
Arg [7] : 7468656173742d312e616d617a6f6e6177732e636f6d2f636f6c6c656374696f
Arg [8] : 6e2e6a736f6e0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

67875:6092:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29849:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34862:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36930:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71831:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36390:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69820:644;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71734:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28903:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37816:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70572:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70472:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71564:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68013:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38057:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55629:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72253:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71441:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59668:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68527:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71925:205;;;;;;;;;;;;;:::i;:::-;;34651:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30528:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66985:103;;;;;;;;;;;;;:::i;:::-;;68552:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68475:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;63480:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66334:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71302:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35031:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68397:71;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68598:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60526:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37206:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38313:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59089:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68062:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69348:464;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72138:107;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37585:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70805:489;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67243:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29849:615;29934:4;30249:10;30234:25;;:11;:25;;;;:102;;;;30326:10;30311:25;;:11;:25;;;;30234:102;:179;;;;30403:10;30388:25;;:11;:25;;;;30234:179;30214:199;;29849:615;;;:::o;34862:100::-;34916:13;34949:5;34942:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34862:100;:::o;36930:204::-;36998:7;37023:16;37031:7;37023;:16::i;:::-;37018:64;;37048:34;;;;;;;;;;;;;;37018:64;37102:15;:24;37118:7;37102:24;;;;;;;;;;;;;;;;;;;;;37095:31;;36930:204;;;:::o;71831:86::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71903:6:::1;71895:5;;:14;;;;;;;;;;;;;;;;;;71831:86:::0;:::o;36390:474::-;36463:13;36495:27;36514:7;36495:18;:27::i;:::-;36463:61;;36545:5;36539:11;;:2;:11;;;36535:48;;;36559:24;;;;;;;;;;;;;;36535:48;36623:5;36600:28;;:19;:17;:19::i;:::-;:28;;;36596:175;;36648:44;36665:5;36672:19;:17;:19::i;:::-;36648:16;:44::i;:::-;36643:128;;36720:35;;;;;;;;;;;;;;36643:128;36596:175;36810:2;36783:15;:24;36799:7;36783:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36848:7;36844:2;36828:28;;36837:5;36828:28;;;;;;;;;;;;36452:412;36390:474;;:::o;69820:644::-;69977:14;69994:282;70266:9;69994:263;:238;68118:58;70133:7;:16;;;;;;;;;;:::i;:::-;70172:7;:15;;;70053:153;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70025:196;;;;;;69994:16;:238::i;:::-;:261;:263::i;:::-;:271;;:282;;;;:::i;:::-;69977:299;;70314:4;70295:23;;:7;:15;70303:6;70295:15;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;70287:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;70376:10;70356:30;;:7;:16;;;;;;;;;;:::i;:::-;:30;;;70348:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;70424:32;70430:8;70440:7;:15;;;70424:5;:32::i;:::-;69966:498;69820:644;;;:::o;71734:89::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71807:8:::1;71798:6;;:17;;;;;;;;;;;;;;;;;;71734:89:::0;:::o;28903:315::-;28956:7;29184:15;:13;:15::i;:::-;29169:12;;29153:13;;:28;:46;29146:53;;28903:315;:::o;37816:170::-;37950:28;37960:4;37966:2;37970:7;37950:9;:28::i;:::-;37816:170;;;:::o;70572:225::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70671:1:::1;70657:16;;:2;:16;;;;70649:25;;;::::0;::::1;;68050:5;70710:8;70693:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;70685:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;70766:23;70776:2;70780:8;70766:9;:23::i;:::-;70572:225:::0;;:::o;70472:92::-;70538:18;70544:8;70554:1;70538:5;:18::i;:::-;70472:92;:::o;71564:162::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71674:1:::1;71656:20;;:6;:20;;;;71648:29;;;::::0;::::1;;71706:12;71688:7;:15;71696:6;71688:15;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;71564:162:::0;;:::o;68013:42::-;68050:5;68013:42;:::o;38057:185::-;38195:39;38212:4;38218:2;38222:7;38195:39;;;;;;;;;;;;:16;:39::i;:::-;38057:185;;;:::o;55629:94::-;55695:20;55701:7;55710:4;55695:5;:20::i;:::-;55629:94;:::o;72253:240::-;68994:5;;;;;;;;;;;68980:19;;:10;:19;;;:44;;;;69017:7;:5;:7::i;:::-;69003:21;;:10;:21;;;68980:44;68972:53;;;;;;72424:5:::1;72404:25;;:16;72412:7;72404;:16::i;:::-;:25;;;72396:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;72482:3;72460:10;:19;72471:7;72460:19;;;;;;;;;;;:25;;;;;;;;;;;;:::i;:::-;;72253:240:::0;;;:::o;71441:115::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71538:10:::1;;71519:16;:29;;;;;;;:::i;:::-;;71441:115:::0;;:::o;59668:468::-;59757:23;59818:22;59843:8;:15;59818:40;;59873:34;59931:14;59910:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;59873:73;;59966:9;59961:125;59982:14;59977:1;:19;59961:125;;60038:32;60058:8;60067:1;60058:11;;;;;;;;:::i;:::-;;;;;;;;60038:19;:32::i;:::-;60022:10;60033:1;60022:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;59998:3;;;;;59961:125;;;;60107:10;60100:17;;;;59668:468;;;:::o;68527:18::-;;;;;;;;;;;;;:::o;71925:205::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72014:1:::1;71990:21;:25;71982:34;;;::::0;::::1;;72028:12;72046:10;:15;;72069:21;72046:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72027:68;;;72114:7;72106:16;;;::::0;::::1;;71971:159;71925:205::o:0;34651:144::-;34715:7;34758:27;34777:7;34758:18;:27::i;:::-;34735:52;;34651:144;;;:::o;30528:224::-;30592:7;30633:1;30616:19;;:5;:19;;;30612:60;;;30644:28;;;;;;;;;;;;;;30612:60;25867:13;30690:18;:25;30709:5;30690:25;;;;;;;;;;;;;;;;:54;30683:61;;30528:224;;;:::o;66985:103::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67050:30:::1;67077:1;67050:18;:30::i;:::-;66985:103::o:0;68552:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;68475:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63480:892::-;63550:16;63604:19;63638:25;63678:22;63703:16;63713:5;63703:9;:16::i;:::-;63678:41;;63734:25;63776:14;63762:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63734:57;;63806:31;;:::i;:::-;63857:9;63869:15;:13;:15::i;:::-;63857:27;;63852:472;63901:14;63886:11;:29;63852:472;;63953:15;63966:1;63953:12;:15::i;:::-;63941:27;;63991:9;:16;;;63987:73;;;64032:8;;63987:73;64108:1;64082:28;;:9;:14;;;:28;;;64078:111;;64155:9;:14;;;64135:34;;64078:111;64232:5;64211:26;;:17;:26;;;64207:102;;;64288:1;64262:8;64271:13;;;;;;64262:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;64207:102;63852:472;63917:3;;;;;63852:472;;;;64345:8;64338:15;;;;;;;63480:892;;;:::o;66334:87::-;66380:7;66407:6;;;;;;;;;;;66400:13;;66334:87;:::o;71302:131::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71411:14:::1;;71388:20;:37;;;;;;;:::i;:::-;;71302:131:::0;;:::o;35031:104::-;35087:13;35120:7;35113:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35031:104;:::o;68397:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68598:20::-;;;;;;;;;;;;;:::o;60526:2505::-;60661:16;60728:4;60719:5;:13;60715:45;;60741:19;;;;;;;;;;;;;;60715:45;60775:19;60809:17;60829:14;:12;:14::i;:::-;60809:34;;60929:15;:13;:15::i;:::-;60921:5;:23;60917:87;;;60973:15;:13;:15::i;:::-;60965:23;;60917:87;61080:9;61073:4;:16;61069:73;;;61117:9;61110:16;;61069:73;61156:25;61184:16;61194:5;61184:9;:16::i;:::-;61156:44;;61378:4;61370:5;:12;61366:278;;;61403:19;61432:5;61425:4;:12;61403:34;;61474:17;61460:11;:31;61456:111;;;61536:11;61516:31;;61456:111;61384:198;61366:278;;;61627:1;61607:21;;61366:278;61658:25;61700:17;61686:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61658:60;;61758:1;61737:17;:22;61733:78;;;61787:8;61780:15;;;;;;;;61733:78;61955:31;61989:26;62009:5;61989:19;:26::i;:::-;61955:60;;62030:25;62275:9;:16;;;62270:92;;62332:9;:14;;;62312:34;;62270:92;62381:9;62393:5;62381:17;;62376:478;62405:4;62400:1;:9;;:45;;;;;62428:17;62413:11;:32;;62400:45;62376:478;;;62483:15;62496:1;62483:12;:15::i;:::-;62471:27;;62521:9;:16;;;62517:73;;;62562:8;;62517:73;62638:1;62612:28;;:9;:14;;;:28;;;62608:111;;62685:9;:14;;;62665:34;;62608:111;62762:5;62741:26;;:17;:26;;;62737:102;;;62818:1;62792:8;62801:13;;;;;;62792:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;62737:102;62376:478;62447:3;;;;;62376:478;;;;62956:11;62946:8;62939:29;63004:8;62997:15;;;;;;;;60526:2505;;;;;;:::o;37206:308::-;37317:19;:17;:19::i;:::-;37305:31;;:8;:31;;;37301:61;;;37345:17;;;;;;;;;;;;;;37301:61;37427:8;37375:18;:39;37394:19;:17;:19::i;:::-;37375:39;;;;;;;;;;;;;;;:49;37415:8;37375:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;37487:8;37451:55;;37466:19;:17;:19::i;:::-;37451:55;;;37497:8;37451:55;;;;;;:::i;:::-;;;;;;;;37206:308;;:::o;38313:396::-;38480:28;38490:4;38496:2;38500:7;38480:9;:28::i;:::-;38541:1;38523:2;:14;;;:19;38519:183;;38562:56;38593:4;38599:2;38603:7;38612:5;38562:30;:56::i;:::-;38557:145;;38646:40;;;;;;;;;;;;;;38557:145;38519:183;38313:396;;;;:::o;59089:420::-;59165:21;;:::i;:::-;59199:31;;:::i;:::-;59255:15;:13;:15::i;:::-;59245:7;:25;:54;;;;59285:14;:12;:14::i;:::-;59274:7;:25;;59245:54;59241:103;;;59323:9;59316:16;;;;;59241:103;59366:21;59379:7;59366:12;:21::i;:::-;59354:33;;59402:9;:16;;;59398:65;;;59442:9;59435:16;;;;;59398:65;59480:21;59493:7;59480:12;:21::i;:::-;59473:28;;;59089:420;;;;:::o;68062:114::-;68118:58;68062:114;:::o;69348:464::-;69433:13;69472:16;69480:7;69472;:16::i;:::-;69464:25;;;;;;69502:23;69528:10;:19;69539:7;69528:19;;;;;;;;;;;69502:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69558:18;69579:10;:8;:10::i;:::-;69558:31;;69632:1;69612:9;69606:23;:27;69602:76;;;69657:9;69650:16;;;;;;69602:76;69727:1;69712:4;69706:18;:22;:98;;;;;;;;;;;;;;;;;69764:4;69770:18;:7;:16;:18::i;:::-;69747:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69706:98;69690:114;;;;69348:464;;;;:::o;72138:107::-;72184:13;72217:20;72210:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72138:107;:::o;37585:164::-;37682:4;37706:18;:25;37725:5;37706:25;;;;;;;;;;;;;;;:35;37732:8;37706:35;;;;;;;;;;;;;;;;;;;;;;;;;37699:42;;37585:164;;;;:::o;70805:489::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71083:1:::1;71051:9;:18;71061:7;71051:18;;;;;;;;;;;:28;;;:33;71043:42;;;::::0;::::1;;71117:169;;;;;;;;71140:9;71117:169;;;;71164:7;71117:169;;;;71186:9;71117:169;;;;71210:1;71117:169;;;;71226:22;71117:169;;;;71263:12;71117:169;;::::0;71096:9:::1;:18;71106:7;71096:18;;;;;;;;;;;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70805:489:::0;;;;;;:::o;67243:201::-;66565:12;:10;:12::i;:::-;66554:23;;:7;:5;:7::i;:::-;:23;;;66546:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67352:1:::1;67332:22;;:8;:22;;;;67324:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67408:28;67427:8;67408:18;:28::i;:::-;67243:201:::0;:::o;38964:273::-;39021:4;39077:7;39058:15;:13;:15::i;:::-;:26;;:66;;;;;39111:13;;39101:7;:23;39058:66;:152;;;;;39209:1;26637:8;39162:17;:26;39180:7;39162:26;;;;;;;;;;;;:43;:48;39058:152;39038:172;;38964:273;;;:::o;65058:98::-;65111:7;65138:10;65131:17;;65058:98;:::o;32166:1129::-;32233:7;32253:12;32268:7;32253:22;;32336:4;32317:15;:13;:15::i;:::-;:23;32313:915;;32370:13;;32363:4;:20;32359:869;;;32408:14;32425:17;:23;32443:4;32425:23;;;;;;;;;;;;32408:40;;32541:1;26637:8;32514:6;:23;:28;32510:699;;;33033:113;33050:1;33040:6;:11;33033:113;;;33093:17;:25;33111:6;;;;;;;33093:25;;;;;;;;;;;;33084:34;;33033:113;;;33179:6;33172:13;;;;;;32510:699;32385:843;32359:869;32313:915;33256:31;;;;;;;;;;;;;;32166:1129;;;;:::o;52946:105::-;53006:7;53033:10;53026:17;;52946:105;:::o;16115:167::-;16192:7;16219:55;16241:20;:18;:20::i;:::-;16263:10;16219:21;:55::i;:::-;16212:62;;16115:167;;;:::o;10343:269::-;10412:7;10598:4;10545:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;10535:69;;;;;;10528:76;;10343:269;;;:::o;6541:231::-;6619:7;6640:17;6659:18;6681:27;6692:4;6698:9;6681:10;:27::i;:::-;6639:69;;;;6719:18;6731:5;6719:11;:18::i;:::-;6755:9;6748:16;;;;6541:231;;;;:::o;72618:746::-;72705:5;72695:15;;:6;;;;;;;;;;;:15;;;72687:24;;;;;;72751:9;:18;72761:7;72751:18;;;;;;;;;;;:28;;;72732:15;:47;;72724:56;;;;;;72817:9;:18;72827:7;72817:18;;;;;;;;;;;:26;;;72799:15;:44;72791:53;;;;;;72857:36;72875:8;72885:7;72857:17;:36::i;:::-;72956:8;72925:9;:18;72935:7;72925:18;;;;;;;;;;;:28;;;:39;;;;:::i;:::-;72912:9;:52;;72904:61;;;;;;73010:8;72978:9;:18;72988:7;72978:18;;;;;;;;;;;:28;;;:40;;;;;;;:::i;:::-;;;;;;;;73070:8;73029:16;:28;73046:10;73029:28;;;;;;;;;;;;;;;:37;73058:7;73029:37;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;73091:31;73101:10;73113:8;73091:9;:31::i;:::-;73133:54;73178:8;73147:9;:18;73157:7;73147:18;;;;;;;;;;;:28;;;:39;;;;:::i;:::-;73133:13;:54::i;:::-;73205:151;73224:7;73246:10;73271:8;73337;73306:9;:18;73316:7;73306:18;;;;;;;;;;;:28;;;:39;;;;:::i;:::-;73294:9;:51;;;;:::i;:::-;73205:151;;;;;;;;;:::i;:::-;;;;;;;;72618:746;;:::o;28426:92::-;28482:7;28426:92;:::o;44203:2515::-;44318:27;44348;44367:7;44348:18;:27::i;:::-;44318:57;;44433:4;44392:45;;44408:19;44392:45;;;44388:86;;44446:28;;;;;;;;;;;;;;44388:86;44487:22;44536:4;44513:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;44557:43;44574:4;44580:19;:17;:19::i;:::-;44557:16;:43::i;:::-;44513:87;:147;;;;44641:19;:17;:19::i;:::-;44617:43;;:20;44629:7;44617:11;:20::i;:::-;:43;;;44513:147;44487:174;;44679:17;44674:66;;44705:35;;;;;;;;;;;;;;44674:66;44769:1;44755:16;;:2;:16;;;44751:52;;;44780:23;;;;;;;;;;;;;;44751:52;44816:43;44838:4;44844:2;44848:7;44857:1;44816:21;:43::i;:::-;44932:15;:24;44948:7;44932:24;;;;;;;;;;;;44925:31;;;;;;;;;;;45324:18;:24;45343:4;45324:24;;;;;;;;;;;;;;;;45322:26;;;;;;;;;;;;45393:18;:22;45412:2;45393:22;;;;;;;;;;;;;;;;45391:24;;;;;;;;;;;26919:8;26521:3;45774:15;:41;;45732:21;45750:2;45732:17;:21::i;:::-;:84;:128;45686:17;:26;45704:7;45686:26;;;;;;;;;;;:174;;;;46030:1;26919:8;45980:19;:46;:51;45976:626;;;46052:19;46084:1;46074:7;:11;46052:33;;46241:1;46207:17;:30;46225:11;46207:30;;;;;;;;;;;;:35;46203:384;;;46345:13;;46330:11;:28;46326:242;;46525:19;46492:17;:30;46510:11;46492:30;;;;;;;;;;;:52;;;;46326:242;46203:384;46033:569;45976:626;46649:7;46645:2;46630:27;;46639:4;46630:27;;;;;;;;;;;;46668:42;46689:4;46695:2;46699:7;46708:1;46668:20;:42::i;:::-;44307:2411;;44203:2515;;;:::o;29316:285::-;29363:7;29567:15;:13;:15::i;:::-;29551:13;;:31;29544:38;;29316:285;:::o;39321:104::-;39390:27;39400:2;39404:8;39390:27;;;;;;;;;;;;:9;:27::i;:::-;39321:104;;:::o;47114:2809::-;47194:27;47224;47243:7;47224:18;:27::i;:::-;47194:57;;47264:12;47295:19;47264:52;;47333:13;47329:311;;;47363:22;47412:4;47389:27;;:19;:17;:19::i;:::-;:27;;;:91;;;;47437:43;47454:4;47460:19;:17;:19::i;:::-;47437:16;:43::i;:::-;47389:91;:155;;;;47525:19;:17;:19::i;:::-;47501:43;;:20;47513:7;47501:11;:20::i;:::-;:43;;;47389:155;47363:182;;47567:17;47562:66;;47593:35;;;;;;;;;;;;;;47562:66;47348:292;47329:311;47652:51;47674:4;47688:1;47692:7;47701:1;47652:21;:51::i;:::-;47776:15;:24;47792:7;47776:24;;;;;;;;;;;;47769:31;;;;;;;;;;;48447:1;26130:3;48418:1;:25;;48417:31;48389:18;:24;48408:4;48389:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;26919:8;26637;26521:3;48776:15;:41;;48732:23;48750:4;48732:17;:23::i;:::-;:86;:120;:165;48686:17;:26;48704:7;48686:26;;;;;;;;;;;:211;;;;49067:1;26919:8;49017:19;:46;:51;49013:626;;;49089:19;49121:1;49111:7;:11;49089:33;;49278:1;49244:17;:30;49262:11;49244:30;;;;;;;;;;;;:35;49240:384;;;49382:13;;49367:11;:28;49363:242;;49562:19;49529:17;:30;49547:11;49529:30;;;;;;;;;;;:52;;;;49363:242;49240:384;49070:569;49013:626;49694:7;49690:1;49667:35;;49676:4;49667:35;;;;;;;;;;;;49713:50;49734:4;49748:1;49752:7;49761:1;49713:20;:50::i;:::-;49890:12;;:14;;;;;;;;;;;;;47183:2740;;47114:2809;;:::o;67604:191::-;67678:16;67697:6;;;;;;;;;;;67678:25;;67723:8;67714:6;;:17;;;;;;;;;;;;;;;;;;67778:8;67747:40;;67768:8;67747:40;;;;;;;;;;;;67667:128;67604:191;:::o;33775:153::-;33835:21;;:::i;:::-;33876:44;33895:17;:24;33913:5;33895:24;;;;;;;;;;;;33876:18;:44::i;:::-;33869:51;;33775:153;;;:::o;28597:95::-;28644:7;28671:13;;28664:20;;28597:95;:::o;50415:716::-;50578:4;50624:2;50599:45;;;50645:19;:17;:19::i;:::-;50666:4;50672:7;50681:5;50599:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50595:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50899:1;50882:6;:13;:18;50878:235;;;50928:40;;;;;;;;;;;;;;50878:235;51071:6;51065:13;51056:6;51052:2;51048:15;51041:38;50595:529;50768:54;;;50758:64;;;:6;:64;;;;50751:71;;;50415:716;;;;;;:::o;34431:158::-;34493:21;;:::i;:::-;34534:47;34553:27;34572:7;34553:18;:27::i;:::-;34534:18;:47::i;:::-;34527:54;;34431:158;;;:::o;72501:109::-;72553:13;72586:16;72579:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72501:109;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;14888:314::-;14941:7;14982:12;14965:29;;14973:4;14965:29;;;:66;;;;;15015:16;14998:13;:33;14965:66;14961:234;;;15055:24;15048:31;;;;14961:234;15119:64;15141:10;15153:12;15167:15;15119:21;:64::i;:::-;15112:71;;14888:314;;:::o;11455:196::-;11548:7;11614:15;11631:10;11585:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11575:68;;;;;;11568:75;;11455:196;;;;:::o;4431:1308::-;4512:7;4521:12;4766:2;4746:9;:16;:22;4742:990;;;4785:9;4809;4833:7;5042:4;5031:9;5027:20;5021:27;5016:32;;5092:4;5081:9;5077:20;5071:27;5066:32;;5150:4;5139:9;5135:20;5129:27;5126:1;5121:36;5116:41;;5193:25;5204:4;5210:1;5213;5216;5193:10;:25::i;:::-;5186:32;;;;;;;;;4742:990;5260:2;5240:9;:16;:22;5236:496;;;5279:9;5303:10;5515:4;5504:9;5500:20;5494:27;5489:32;;5566:4;5555:9;5551:20;5545:27;5539:33;;5608:23;5619:4;5625:1;5628:2;5608:10;:23::i;:::-;5601:30;;;;;;;;5236:496;5680:1;5684:35;5664:56;;;;4431:1308;;;;;;:::o;2702:643::-;2780:20;2771:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;2767:571;;;2817:7;;2767:571;2878:29;2869:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;2865:473;;;2924:34;;;;;;;;;;:::i;:::-;;;;;;;;2865:473;2989:35;2980:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;2976:362;;;3041:41;;;;;;;;;;:::i;:::-;;;;;;;;2976:362;3113:30;3104:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3100:238;;;3160:44;;;;;;;;;;:::i;:::-;;;;;;;;3100:238;3235:30;3226:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3222:116;;;3282:44;;;;;;;;;;:::i;:::-;;;;;;;;3222:116;2702:643;;:::o;73372:423::-;73545:9;:18;73555:7;73545:18;;;;;;;;;;;:41;;;73520:8;73480:16;:28;73497:10;73480:28;;;;;;;;;;;;;;;:37;73509:7;73480:37;;;;;;;;;;;;:48;;;;:::i;:::-;:106;;73458:139;;;;;;73686:9;:18;73696:7;73686:18;;;;;;;;;;;:31;;;73661:8;73630:9;:18;73640:7;73630:18;;;;;;;;;;;:28;;;:39;;;;:::i;:::-;:87;;73608:120;;;;;;68050:5;73764:8;73747:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;73739:48;;;;;;73372:423;;:::o;73803:161::-;73876:5;73864:9;:17;73860:97;;;73906:10;73898:28;;:47;73939:5;73927:9;:17;;;;:::i;:::-;73898:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73860:97;73803:161;:::o;51779:159::-;;;;;:::o;35951:148::-;36015:14;36076:5;36066:15;;35951:148;;;:::o;52597:158::-;;;;;:::o;39798:2236::-;39921:20;39944:13;;39921:36;;39986:1;39972:16;;:2;:16;;;39968:48;;;39997:19;;;;;;;;;;;;;;39968:48;40043:1;40031:8;:13;40027:44;;;40053:18;;;;;;;;;;;;;;40027:44;40084:61;40114:1;40118:2;40122:12;40136:8;40084:21;:61::i;:::-;40688:1;26004:2;40659:1;:25;;40658:31;40646:8;:44;40620:18;:22;40639:2;40620:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;26784:3;41089:29;41116:1;41104:8;:13;41089:14;:29::i;:::-;:56;;26521:3;41026:15;:41;;40984:21;41002:2;40984:17;:21::i;:::-;:84;:162;40933:17;:31;40951:12;40933:31;;;;;;;;;;;:213;;;;41163:20;41186:12;41163:35;;41213:11;41242:8;41227:12;:23;41213:37;;41289:1;41271:2;:14;;;:19;41267:635;;41311:313;41367:12;41363:2;41342:38;;41359:1;41342:38;;;;;;;;;;;;41408:69;41447:1;41451:2;41455:14;;;;;;41471:5;41408:30;:69::i;:::-;41403:174;;41513:40;;;;;;;;;;;;;;41403:174;41619:3;41604:12;:18;41311:313;;41705:12;41688:13;;:29;41684:43;;41719:8;;;41684:43;41267:635;;;41768:119;41824:14;;;;;;41820:2;41799:40;;41816:1;41799:40;;;;;;;;;;;;41882:3;41867:12;:18;41768:119;;41267:635;41932:12;41916:13;:28;;;;40397:1559;;41966:60;41995:1;41999:2;42003:12;42017:8;41966:20;:60::i;:::-;39910:2124;39798:2236;;;:::o;33389:295::-;33455:31;;:::i;:::-;33532:6;33499:9;:14;;:41;;;;;;;;;;;26521:3;33585:6;:32;;33551:9;:24;;:67;;;;;;;;;;;33675:1;26637:8;33648:6;:23;:28;;33629:9;:16;;:47;;;;;;;;;;;33389:295;;;:::o;15210:263::-;15354:7;15402:8;15412;15422:11;15435:13;15458:4;15391:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15381:84;;;;;;15374:91;;15210:263;;;;;:::o;7993:1632::-;8124:7;8133:12;9058:66;9053:1;9045:10;;:79;9041:163;;;9157:1;9161:30;9141:51;;;;;;9041:163;9223:2;9218:1;:7;;;;:18;;;;;9234:2;9229:1;:7;;;;9218:18;9214:102;;;9269:1;9273:30;9253:51;;;;;;9214:102;9413:14;9430:24;9440:4;9446:1;9449;9452;9430:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9413:41;;9487:1;9469:20;;:6;:20;;;9465:103;;;9522:1;9526:29;9506:50;;;;;;;9465:103;9588:6;9596:20;9580:37;;;;;7993:1632;;;;;;;;:::o;7035:344::-;7149:7;7158:12;7183:9;7208:66;7200:75;;7195:2;:80;7183:92;;7286:7;7325:2;7318:3;7311:2;7303:11;;:18;;7302:25;;;;:::i;:::-;7286:42;;7346:25;7357:4;7363:1;7366;7369;7346:10;:25::i;:::-;7339:32;;;;;;7035:344;;;;;;:::o;36186:142::-;36244:14;36305:5;36295:15;;36186:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:553::-;2982:8;2992:6;3042:3;3035:4;3027:6;3023:17;3019:27;3009:122;;3050:79;;:::i;:::-;3009:122;3163:6;3150:20;3140:30;;3193:18;3185:6;3182:30;3179:117;;;3215:79;;:::i;:::-;3179:117;3329:4;3321:6;3317:17;3305:29;;3383:3;3375:4;3367:6;3363:17;3353:8;3349:32;3346:41;3343:128;;;3390:79;;:::i;:::-;3343:128;2924:553;;;;;:::o;3497:340::-;3553:5;3602:3;3595:4;3587:6;3583:17;3579:27;3569:122;;3610:79;;:::i;:::-;3569:122;3727:6;3714:20;3752:79;3827:3;3819:6;3812:4;3804:6;3800:17;3752:79;:::i;:::-;3743:88;;3559:278;3497:340;;;;:::o;3873:235::-;3950:5;3991:2;3982:6;3977:3;3973:16;3969:25;3966:112;;;3997:79;;:::i;:::-;3966:112;4096:6;4087:15;;3873:235;;;;:::o;4114:139::-;4160:5;4198:6;4185:20;4176:29;;4214:33;4241:5;4214:33;:::i;:::-;4114:139;;;;:::o;4259:329::-;4318:6;4367:2;4355:9;4346:7;4342:23;4338:32;4335:119;;;4373:79;;:::i;:::-;4335:119;4493:1;4518:53;4563:7;4554:6;4543:9;4539:22;4518:53;:::i;:::-;4508:63;;4464:117;4259:329;;;;:::o;4594:474::-;4662:6;4670;4719:2;4707:9;4698:7;4694:23;4690:32;4687:119;;;4725:79;;:::i;:::-;4687:119;4845:1;4870:53;4915:7;4906:6;4895:9;4891:22;4870:53;:::i;:::-;4860:63;;4816:117;4972:2;4998:53;5043:7;5034:6;5023:9;5019:22;4998:53;:::i;:::-;4988:63;;4943:118;4594:474;;;;;:::o;5074:619::-;5151:6;5159;5167;5216:2;5204:9;5195:7;5191:23;5187:32;5184:119;;;5222:79;;:::i;:::-;5184:119;5342:1;5367:53;5412:7;5403:6;5392:9;5388:22;5367:53;:::i;:::-;5357:63;;5313:117;5469:2;5495:53;5540:7;5531:6;5520:9;5516:22;5495:53;:::i;:::-;5485:63;;5440:118;5597:2;5623:53;5668:7;5659:6;5648:9;5644:22;5623:53;:::i;:::-;5613:63;;5568:118;5074:619;;;;;:::o;5699:943::-;5794:6;5802;5810;5818;5867:3;5855:9;5846:7;5842:23;5838:33;5835:120;;;5874:79;;:::i;:::-;5835:120;5994:1;6019:53;6064:7;6055:6;6044:9;6040:22;6019:53;:::i;:::-;6009:63;;5965:117;6121:2;6147:53;6192:7;6183:6;6172:9;6168:22;6147:53;:::i;:::-;6137:63;;6092:118;6249:2;6275:53;6320:7;6311:6;6300:9;6296:22;6275:53;:::i;:::-;6265:63;;6220:118;6405:2;6394:9;6390:18;6377:32;6436:18;6428:6;6425:30;6422:117;;;6458:79;;:::i;:::-;6422:117;6563:62;6617:7;6608:6;6597:9;6593:22;6563:62;:::i;:::-;6553:72;;6348:287;5699:943;;;;;;;:::o;6648:468::-;6713:6;6721;6770:2;6758:9;6749:7;6745:23;6741:32;6738:119;;;6776:79;;:::i;:::-;6738:119;6896:1;6921:53;6966:7;6957:6;6946:9;6942:22;6921:53;:::i;:::-;6911:63;;6867:117;7023:2;7049:50;7091:7;7082:6;7071:9;7067:22;7049:50;:::i;:::-;7039:60;;6994:115;6648:468;;;;;:::o;7122:474::-;7190:6;7198;7247:2;7235:9;7226:7;7222:23;7218:32;7215:119;;;7253:79;;:::i;:::-;7215:119;7373:1;7398:53;7443:7;7434:6;7423:9;7419:22;7398:53;:::i;:::-;7388:63;;7344:117;7500:2;7526:53;7571:7;7562:6;7551:9;7547:22;7526:53;:::i;:::-;7516:63;;7471:118;7122:474;;;;;:::o;7602:799::-;7689:6;7697;7705;7754:2;7742:9;7733:7;7729:23;7725:32;7722:119;;;7760:79;;:::i;:::-;7722:119;7880:1;7905:53;7950:7;7941:6;7930:9;7926:22;7905:53;:::i;:::-;7895:63;;7851:117;8007:2;8033:53;8078:7;8069:6;8058:9;8054:22;8033:53;:::i;:::-;8023:63;;7978:118;8163:2;8152:9;8148:18;8135:32;8194:18;8186:6;8183:30;8180:117;;;8216:79;;:::i;:::-;8180:117;8321:63;8376:7;8367:6;8356:9;8352:22;8321:63;:::i;:::-;8311:73;;8106:288;7602:799;;;;;:::o;8407:619::-;8484:6;8492;8500;8549:2;8537:9;8528:7;8524:23;8520:32;8517:119;;;8555:79;;:::i;:::-;8517:119;8675:1;8700:53;8745:7;8736:6;8725:9;8721:22;8700:53;:::i;:::-;8690:63;;8646:117;8802:2;8828:53;8873:7;8864:6;8853:9;8849:22;8828:53;:::i;:::-;8818:63;;8773:118;8930:2;8956:53;9001:7;8992:6;8981:9;8977:22;8956:53;:::i;:::-;8946:63;;8901:118;8407:619;;;;;:::o;9032:539::-;9116:6;9165:2;9153:9;9144:7;9140:23;9136:32;9133:119;;;9171:79;;:::i;:::-;9133:119;9319:1;9308:9;9304:17;9291:31;9349:18;9341:6;9338:30;9335:117;;;9371:79;;:::i;:::-;9335:117;9476:78;9546:7;9537:6;9526:9;9522:22;9476:78;:::i;:::-;9466:88;;9262:302;9032:539;;;;:::o;9577:323::-;9633:6;9682:2;9670:9;9661:7;9657:23;9653:32;9650:119;;;9688:79;;:::i;:::-;9650:119;9808:1;9833:50;9875:7;9866:6;9855:9;9851:22;9833:50;:::i;:::-;9823:60;;9779:114;9577:323;;;;:::o;9906:327::-;9964:6;10013:2;10001:9;9992:7;9988:23;9984:32;9981:119;;;10019:79;;:::i;:::-;9981:119;10139:1;10164:52;10208:7;10199:6;10188:9;10184:22;10164:52;:::i;:::-;10154:62;;10110:116;9906:327;;;;:::o;10239:349::-;10308:6;10357:2;10345:9;10336:7;10332:23;10328:32;10325:119;;;10363:79;;:::i;:::-;10325:119;10483:1;10508:63;10563:7;10554:6;10543:9;10539:22;10508:63;:::i;:::-;10498:73;;10454:127;10239:349;;;;:::o;10594:529::-;10665:6;10673;10722:2;10710:9;10701:7;10697:23;10693:32;10690:119;;;10728:79;;:::i;:::-;10690:119;10876:1;10865:9;10861:17;10848:31;10906:18;10898:6;10895:30;10892:117;;;10928:79;;:::i;:::-;10892:117;11041:65;11098:7;11089:6;11078:9;11074:22;11041:65;:::i;:::-;11023:83;;;;10819:297;10594:529;;;;;:::o;11129:329::-;11188:6;11237:2;11225:9;11216:7;11212:23;11208:32;11205:119;;;11243:79;;:::i;:::-;11205:119;11363:1;11388:53;11433:7;11424:6;11413:9;11409:22;11388:53;:::i;:::-;11378:63;;11334:117;11129:329;;;;:::o;11464:474::-;11532:6;11540;11589:2;11577:9;11568:7;11564:23;11560:32;11557:119;;;11595:79;;:::i;:::-;11557:119;11715:1;11740:53;11785:7;11776:6;11765:9;11761:22;11740:53;:::i;:::-;11730:63;;11686:117;11842:2;11868:53;11913:7;11904:6;11893:9;11889:22;11868:53;:::i;:::-;11858:63;;11813:118;11464:474;;;;;:::o;11944:860::-;12061:6;12069;12077;12126:3;12114:9;12105:7;12101:23;12097:33;12094:120;;;12133:79;;:::i;:::-;12094:120;12253:1;12278:53;12323:7;12314:6;12303:9;12299:22;12278:53;:::i;:::-;12268:63;;12224:117;12380:2;12406:84;12482:7;12473:6;12462:9;12458:22;12406:84;:::i;:::-;12396:94;;12351:149;12567:2;12556:9;12552:18;12539:32;12598:18;12590:6;12587:30;12584:117;;;12620:79;;:::i;:::-;12584:117;12725:62;12779:7;12770:6;12759:9;12755:22;12725:62;:::i;:::-;12715:72;;12510:287;11944:860;;;;;:::o;12810:1057::-;12914:6;12922;12930;12938;12946;12954;13003:3;12991:9;12982:7;12978:23;12974:33;12971:120;;;13010:79;;:::i;:::-;12971:120;13130:1;13155:53;13200:7;13191:6;13180:9;13176:22;13155:53;:::i;:::-;13145:63;;13101:117;13257:2;13283:53;13328:7;13319:6;13308:9;13304:22;13283:53;:::i;:::-;13273:63;;13228:118;13385:2;13411:53;13456:7;13447:6;13436:9;13432:22;13411:53;:::i;:::-;13401:63;;13356:118;13513:2;13539:53;13584:7;13575:6;13564:9;13560:22;13539:53;:::i;:::-;13529:63;;13484:118;13641:3;13668:53;13713:7;13704:6;13693:9;13689:22;13668:53;:::i;:::-;13658:63;;13612:119;13770:3;13797:53;13842:7;13833:6;13822:9;13818:22;13797:53;:::i;:::-;13787:63;;13741:119;12810:1057;;;;;;;;:::o;13873:303::-;14004:10;14025:108;14129:3;14121:6;14025:108;:::i;:::-;14165:4;14160:3;14156:14;14142:28;;13873:303;;;;:::o;14182:179::-;14251:10;14272:46;14314:3;14306:6;14272:46;:::i;:::-;14350:4;14345:3;14341:14;14327:28;;14182:179;;;;:::o;14367:108::-;14444:24;14462:5;14444:24;:::i;:::-;14439:3;14432:37;14367:108;;:::o;14481:118::-;14568:24;14586:5;14568:24;:::i;:::-;14563:3;14556:37;14481:118;;:::o;14681:980::-;14862:3;14891:85;14970:5;14891:85;:::i;:::-;14992:117;15102:6;15097:3;14992:117;:::i;:::-;14985:124;;15133:87;15214:5;15133:87;:::i;:::-;15243:7;15274:1;15259:377;15284:6;15281:1;15278:13;15259:377;;;15360:6;15354:13;15387:125;15508:3;15493:13;15387:125;:::i;:::-;15380:132;;15535:91;15619:6;15535:91;:::i;:::-;15525:101;;15319:317;15306:1;15303;15299:9;15294:14;;15259:377;;;15263:14;15652:3;15645:10;;14867:794;;;14681:980;;;;:::o;15697:732::-;15816:3;15845:54;15893:5;15845:54;:::i;:::-;15915:86;15994:6;15989:3;15915:86;:::i;:::-;15908:93;;16025:56;16075:5;16025:56;:::i;:::-;16104:7;16135:1;16120:284;16145:6;16142:1;16139:13;16120:284;;;16221:6;16215:13;16248:63;16307:3;16292:13;16248:63;:::i;:::-;16241:70;;16334:60;16387:6;16334:60;:::i;:::-;16324:70;;16180:224;16167:1;16164;16160:9;16155:14;;16120:284;;;16124:14;16420:3;16413:10;;15821:608;;;15697:732;;;;:::o;16435:99::-;16506:21;16521:5;16506:21;:::i;:::-;16501:3;16494:34;16435:99;;:::o;16540:109::-;16621:21;16636:5;16621:21;:::i;:::-;16616:3;16609:34;16540:109;;:::o;16655:118::-;16742:24;16760:5;16742:24;:::i;:::-;16737:3;16730:37;16655:118;;:::o;16779:157::-;16884:45;16904:24;16922:5;16904:24;:::i;:::-;16884:45;:::i;:::-;16879:3;16872:58;16779:157;;:::o;16942:360::-;17028:3;17056:38;17088:5;17056:38;:::i;:::-;17110:70;17173:6;17168:3;17110:70;:::i;:::-;17103:77;;17189:52;17234:6;17229:3;17222:4;17215:5;17211:16;17189:52;:::i;:::-;17266:29;17288:6;17266:29;:::i;:::-;17261:3;17257:39;17250:46;;17032:270;16942:360;;;;:::o;17308:364::-;17396:3;17424:39;17457:5;17424:39;:::i;:::-;17479:71;17543:6;17538:3;17479:71;:::i;:::-;17472:78;;17559:52;17604:6;17599:3;17592:4;17585:5;17581:16;17559:52;:::i;:::-;17636:29;17658:6;17636:29;:::i;:::-;17631:3;17627:39;17620:46;;17400:272;17308:364;;;;:::o;17678:377::-;17784:3;17812:39;17845:5;17812:39;:::i;:::-;17867:89;17949:6;17944:3;17867:89;:::i;:::-;17860:96;;17965:52;18010:6;18005:3;17998:4;17991:5;17987:16;17965:52;:::i;:::-;18042:6;18037:3;18033:16;18026:23;;17788:267;17678:377;;;;:::o;18061:366::-;18203:3;18224:67;18288:2;18283:3;18224:67;:::i;:::-;18217:74;;18300:93;18389:3;18300:93;:::i;:::-;18418:2;18413:3;18409:12;18402:19;;18061:366;;;:::o;18433:::-;18575:3;18596:67;18660:2;18655:3;18596:67;:::i;:::-;18589:74;;18672:93;18761:3;18672:93;:::i;:::-;18790:2;18785:3;18781:12;18774:19;;18433:366;;;:::o;18805:402::-;18965:3;18986:85;19068:2;19063:3;18986:85;:::i;:::-;18979:92;;19080:93;19169:3;19080:93;:::i;:::-;19198:2;19193:3;19189:12;19182:19;;18805:402;;;:::o;19213:366::-;19355:3;19376:67;19440:2;19435:3;19376:67;:::i;:::-;19369:74;;19452:93;19541:3;19452:93;:::i;:::-;19570:2;19565:3;19561:12;19554:19;;19213:366;;;:::o;19585:400::-;19745:3;19766:84;19848:1;19843:3;19766:84;:::i;:::-;19759:91;;19859:93;19948:3;19859:93;:::i;:::-;19977:1;19972:3;19968:11;19961:18;;19585:400;;;:::o;19991:366::-;20133:3;20154:67;20218:2;20213:3;20154:67;:::i;:::-;20147:74;;20230:93;20319:3;20230:93;:::i;:::-;20348:2;20343:3;20339:12;20332:19;;19991:366;;;:::o;20363:::-;20505:3;20526:67;20590:2;20585:3;20526:67;:::i;:::-;20519:74;;20602:93;20691:3;20602:93;:::i;:::-;20720:2;20715:3;20711:12;20704:19;;20363:366;;;:::o;20735:::-;20877:3;20898:67;20962:2;20957:3;20898:67;:::i;:::-;20891:74;;20974:93;21063:3;20974:93;:::i;:::-;21092:2;21087:3;21083:12;21076:19;;20735:366;;;:::o;21107:::-;21249:3;21270:67;21334:2;21329:3;21270:67;:::i;:::-;21263:74;;21346:93;21435:3;21346:93;:::i;:::-;21464:2;21459:3;21455:12;21448:19;;21107:366;;;:::o;21479:::-;21621:3;21642:67;21706:2;21701:3;21642:67;:::i;:::-;21635:74;;21718:93;21807:3;21718:93;:::i;:::-;21836:2;21831:3;21827:12;21820:19;;21479:366;;;:::o;21851:::-;21993:3;22014:67;22078:2;22073:3;22014:67;:::i;:::-;22007:74;;22090:93;22179:3;22090:93;:::i;:::-;22208:2;22203:3;22199:12;22192:19;;21851:366;;;:::o;22223:::-;22365:3;22386:67;22450:2;22445:3;22386:67;:::i;:::-;22379:74;;22462:93;22551:3;22462:93;:::i;:::-;22580:2;22575:3;22571:12;22564:19;;22223:366;;;:::o;22595:398::-;22754:3;22775:83;22856:1;22851:3;22775:83;:::i;:::-;22768:90;;22867:93;22956:3;22867:93;:::i;:::-;22985:1;22980:3;22976:11;22969:18;;22595:398;;;:::o;23071:687::-;23220:4;23215:3;23211:14;23307:4;23300:5;23296:16;23290:23;23326:63;23383:4;23378:3;23374:14;23360:12;23326:63;:::i;:::-;23235:164;23491:4;23484:5;23480:16;23474:23;23510:61;23565:4;23560:3;23556:14;23542:12;23510:61;:::i;:::-;23409:172;23665:4;23658:5;23654:16;23648:23;23684:57;23735:4;23730:3;23726:14;23712:12;23684:57;:::i;:::-;23591:160;23189:569;23071:687;;:::o;23836:697::-;23995:4;23990:3;23986:14;24082:4;24075:5;24071:16;24065:23;24101:63;24158:4;24153:3;24149:14;24135:12;24101:63;:::i;:::-;24010:164;24266:4;24259:5;24255:16;24249:23;24285:61;24340:4;24335:3;24331:14;24317:12;24285:61;:::i;:::-;24184:172;24440:4;24433:5;24429:16;24423:23;24459:57;24510:4;24505:3;24501:14;24487:12;24459:57;:::i;:::-;24366:160;23964:569;23836:697;;:::o;24539:108::-;24616:24;24634:5;24616:24;:::i;:::-;24611:3;24604:37;24539:108;;:::o;24653:118::-;24740:24;24758:5;24740:24;:::i;:::-;24735:3;24728:37;24653:118;;:::o;24777:105::-;24852:23;24869:5;24852:23;:::i;:::-;24847:3;24840:36;24777:105;;:::o;24888:112::-;24971:22;24987:5;24971:22;:::i;:::-;24966:3;24959:35;24888:112;;:::o;25006:435::-;25186:3;25208:95;25299:3;25290:6;25208:95;:::i;:::-;25201:102;;25320:95;25411:3;25402:6;25320:95;:::i;:::-;25313:102;;25432:3;25425:10;;25006:435;;;;;:::o;25447:522::-;25660:3;25682:148;25826:3;25682:148;:::i;:::-;25675:155;;25840:75;25911:3;25902:6;25840:75;:::i;:::-;25940:2;25935:3;25931:12;25924:19;;25960:3;25953:10;;25447:522;;;;:::o;25975:663::-;26216:3;26238:148;26382:3;26238:148;:::i;:::-;26231:155;;26396:75;26467:3;26458:6;26396:75;:::i;:::-;26496:2;26491:3;26487:12;26480:19;;26509:75;26580:3;26571:6;26509:75;:::i;:::-;26609:2;26604:3;26600:12;26593:19;;26629:3;26622:10;;25975:663;;;;;:::o;26644:379::-;26828:3;26850:147;26993:3;26850:147;:::i;:::-;26843:154;;27014:3;27007:10;;26644:379;;;:::o;27029:222::-;27122:4;27160:2;27149:9;27145:18;27137:26;;27173:71;27241:1;27230:9;27226:17;27217:6;27173:71;:::i;:::-;27029:222;;;;:::o;27257:640::-;27452:4;27490:3;27479:9;27475:19;27467:27;;27504:71;27572:1;27561:9;27557:17;27548:6;27504:71;:::i;:::-;27585:72;27653:2;27642:9;27638:18;27629:6;27585:72;:::i;:::-;27667;27735:2;27724:9;27720:18;27711:6;27667:72;:::i;:::-;27786:9;27780:4;27776:20;27771:2;27760:9;27756:18;27749:48;27814:76;27885:4;27876:6;27814:76;:::i;:::-;27806:84;;27257:640;;;;;;;:::o;27903:497::-;28108:4;28146:2;28135:9;28131:18;28123:26;;28195:9;28189:4;28185:20;28181:1;28170:9;28166:17;28159:47;28223:170;28388:4;28379:6;28223:170;:::i;:::-;28215:178;;27903:497;;;;:::o;28406:373::-;28549:4;28587:2;28576:9;28572:18;28564:26;;28636:9;28630:4;28626:20;28622:1;28611:9;28607:17;28600:47;28664:108;28767:4;28758:6;28664:108;:::i;:::-;28656:116;;28406:373;;;;:::o;28785:210::-;28872:4;28910:2;28899:9;28895:18;28887:26;;28923:65;28985:1;28974:9;28970:17;28961:6;28923:65;:::i;:::-;28785:210;;;;:::o;29001:222::-;29094:4;29132:2;29121:9;29117:18;29109:26;;29145:71;29213:1;29202:9;29198:17;29189:6;29145:71;:::i;:::-;29001:222;;;;:::o;29229:442::-;29378:4;29416:2;29405:9;29401:18;29393:26;;29429:71;29497:1;29486:9;29482:17;29473:6;29429:71;:::i;:::-;29510:72;29578:2;29567:9;29563:18;29554:6;29510:72;:::i;:::-;29592;29660:2;29649:9;29645:18;29636:6;29592:72;:::i;:::-;29229:442;;;;;;:::o;29677:664::-;29882:4;29920:3;29909:9;29905:19;29897:27;;29934:71;30002:1;29991:9;29987:17;29978:6;29934:71;:::i;:::-;30015:72;30083:2;30072:9;30068:18;30059:6;30015:72;:::i;:::-;30097;30165:2;30154:9;30150:18;30141:6;30097:72;:::i;:::-;30179;30247:2;30236:9;30232:18;30223:6;30179:72;:::i;:::-;30261:73;30329:3;30318:9;30314:19;30305:6;30261:73;:::i;:::-;29677:664;;;;;;;;:::o;30347:545::-;30520:4;30558:3;30547:9;30543:19;30535:27;;30572:71;30640:1;30629:9;30625:17;30616:6;30572:71;:::i;:::-;30653:68;30717:2;30706:9;30702:18;30693:6;30653:68;:::i;:::-;30731:72;30799:2;30788:9;30784:18;30775:6;30731:72;:::i;:::-;30813;30881:2;30870:9;30866:18;30857:6;30813:72;:::i;:::-;30347:545;;;;;;;:::o;30898:313::-;31011:4;31049:2;31038:9;31034:18;31026:26;;31098:9;31092:4;31088:20;31084:1;31073:9;31069:17;31062:47;31126:78;31199:4;31190:6;31126:78;:::i;:::-;31118:86;;30898:313;;;;:::o;31217:419::-;31383:4;31421:2;31410:9;31406:18;31398:26;;31470:9;31464:4;31460:20;31456:1;31445:9;31441:17;31434:47;31498:131;31624:4;31498:131;:::i;:::-;31490:139;;31217:419;;;:::o;31642:::-;31808:4;31846:2;31835:9;31831:18;31823:26;;31895:9;31889:4;31885:20;31881:1;31870:9;31866:17;31859:47;31923:131;32049:4;31923:131;:::i;:::-;31915:139;;31642:419;;;:::o;32067:::-;32233:4;32271:2;32260:9;32256:18;32248:26;;32320:9;32314:4;32310:20;32306:1;32295:9;32291:17;32284:47;32348:131;32474:4;32348:131;:::i;:::-;32340:139;;32067:419;;;:::o;32492:::-;32658:4;32696:2;32685:9;32681:18;32673:26;;32745:9;32739:4;32735:20;32731:1;32720:9;32716:17;32709:47;32773:131;32899:4;32773:131;:::i;:::-;32765:139;;32492:419;;;:::o;32917:::-;33083:4;33121:2;33110:9;33106:18;33098:26;;33170:9;33164:4;33160:20;33156:1;33145:9;33141:17;33134:47;33198:131;33324:4;33198:131;:::i;:::-;33190:139;;32917:419;;;:::o;33342:::-;33508:4;33546:2;33535:9;33531:18;33523:26;;33595:9;33589:4;33585:20;33581:1;33570:9;33566:17;33559:47;33623:131;33749:4;33623:131;:::i;:::-;33615:139;;33342:419;;;:::o;33767:::-;33933:4;33971:2;33960:9;33956:18;33948:26;;34020:9;34014:4;34010:20;34006:1;33995:9;33991:17;33984:47;34048:131;34174:4;34048:131;:::i;:::-;34040:139;;33767:419;;;:::o;34192:::-;34358:4;34396:2;34385:9;34381:18;34373:26;;34445:9;34439:4;34435:20;34431:1;34420:9;34416:17;34409:47;34473:131;34599:4;34473:131;:::i;:::-;34465:139;;34192:419;;;:::o;34617:::-;34783:4;34821:2;34810:9;34806:18;34798:26;;34870:9;34864:4;34860:20;34856:1;34845:9;34841:17;34834:47;34898:131;35024:4;34898:131;:::i;:::-;34890:139;;34617:419;;;:::o;35042:::-;35208:4;35246:2;35235:9;35231:18;35223:26;;35295:9;35289:4;35285:20;35281:1;35270:9;35266:17;35259:47;35323:131;35449:4;35323:131;:::i;:::-;35315:139;;35042:419;;;:::o;35467:346::-;35622:4;35660:2;35649:9;35645:18;35637:26;;35673:133;35803:1;35792:9;35788:17;35779:6;35673:133;:::i;:::-;35467:346;;;;:::o;35819:222::-;35912:4;35950:2;35939:9;35935:18;35927:26;;35963:71;36031:1;36020:9;36016:17;36007:6;35963:71;:::i;:::-;35819:222;;;;:::o;36047:553::-;36224:4;36262:3;36251:9;36247:19;36239:27;;36276:71;36344:1;36333:9;36329:17;36320:6;36276:71;:::i;:::-;36357:72;36425:2;36414:9;36410:18;36401:6;36357:72;:::i;:::-;36439;36507:2;36496:9;36492:18;36483:6;36439:72;:::i;:::-;36521;36589:2;36578:9;36574:18;36565:6;36521:72;:::i;:::-;36047:553;;;;;;;:::o;36606:775::-;36839:4;36877:3;36866:9;36862:19;36854:27;;36891:71;36959:1;36948:9;36944:17;36935:6;36891:71;:::i;:::-;36972:72;37040:2;37029:9;37025:18;37016:6;36972:72;:::i;:::-;37054;37122:2;37111:9;37107:18;37098:6;37054:72;:::i;:::-;37136;37204:2;37193:9;37189:18;37180:6;37136:72;:::i;:::-;37218:73;37286:3;37275:9;37271:19;37262:6;37218:73;:::i;:::-;37301;37369:3;37358:9;37354:19;37345:6;37301:73;:::i;:::-;36606:775;;;;;;;;;:::o;37387:129::-;37421:6;37448:20;;:::i;:::-;37438:30;;37477:33;37505:4;37497:6;37477:33;:::i;:::-;37387:129;;;:::o;37522:75::-;37555:6;37588:2;37582:9;37572:19;;37522:75;:::o;37603:311::-;37680:4;37770:18;37762:6;37759:30;37756:56;;;37792:18;;:::i;:::-;37756:56;37842:4;37834:6;37830:17;37822:25;;37902:4;37896;37892:15;37884:23;;37603:311;;;:::o;37920:307::-;37981:4;38071:18;38063:6;38060:30;38057:56;;;38093:18;;:::i;:::-;38057:56;38131:29;38153:6;38131:29;:::i;:::-;38123:37;;38215:4;38209;38205:15;38197:23;;37920:307;;;:::o;38233:308::-;38295:4;38385:18;38377:6;38374:30;38371:56;;;38407:18;;:::i;:::-;38371:56;38445:29;38467:6;38445:29;:::i;:::-;38437:37;;38529:4;38523;38519:15;38511:23;;38233:308;;;:::o;38547:163::-;38645:4;38668:3;38660:11;;38698:4;38693:3;38689:14;38681:22;;38547:163;;;:::o;38716:132::-;38783:4;38806:3;38798:11;;38836:4;38831:3;38827:14;38819:22;;38716:132;;;:::o;38854:145::-;38952:6;38986:5;38980:12;38970:22;;38854:145;;;:::o;39005:114::-;39072:6;39106:5;39100:12;39090:22;;39005:114;;;:::o;39125:98::-;39176:6;39210:5;39204:12;39194:22;;39125:98;;;:::o;39229:99::-;39281:6;39315:5;39309:12;39299:22;;39229:99;;;:::o;39334:144::-;39435:4;39467;39462:3;39458:14;39450:22;;39334:144;;;:::o;39484:113::-;39554:4;39586;39581:3;39577:14;39569:22;;39484:113;;;:::o;39603:215::-;39733:11;39767:6;39762:3;39755:19;39807:4;39802:3;39798:14;39783:29;;39603:215;;;;:::o;39824:184::-;39923:11;39957:6;39952:3;39945:19;39997:4;39992:3;39988:14;39973:29;;39824:184;;;;:::o;40014:168::-;40097:11;40131:6;40126:3;40119:19;40171:4;40166:3;40162:14;40147:29;;40014:168;;;;:::o;40188:147::-;40289:11;40326:3;40311:18;;40188:147;;;;:::o;40341:169::-;40425:11;40459:6;40454:3;40447:19;40499:4;40494:3;40490:14;40475:29;;40341:169;;;;:::o;40516:148::-;40618:11;40655:3;40640:18;;40516:148;;;;:::o;40670:305::-;40710:3;40729:20;40747:1;40729:20;:::i;:::-;40724:25;;40763:20;40781:1;40763:20;:::i;:::-;40758:25;;40917:1;40849:66;40845:74;40842:1;40839:81;40836:107;;;40923:18;;:::i;:::-;40836:107;40967:1;40964;40960:9;40953:16;;40670:305;;;;:::o;40981:185::-;41021:1;41038:20;41056:1;41038:20;:::i;:::-;41033:25;;41072:20;41090:1;41072:20;:::i;:::-;41067:25;;41111:1;41101:35;;41116:18;;:::i;:::-;41101:35;41158:1;41155;41151:9;41146:14;;40981:185;;;;:::o;41172:348::-;41212:7;41235:20;41253:1;41235:20;:::i;:::-;41230:25;;41269:20;41287:1;41269:20;:::i;:::-;41264:25;;41457:1;41389:66;41385:74;41382:1;41379:81;41374:1;41367:9;41360:17;41356:105;41353:131;;;41464:18;;:::i;:::-;41353:131;41512:1;41509;41505:9;41494:20;;41172:348;;;;:::o;41526:191::-;41566:4;41586:20;41604:1;41586:20;:::i;:::-;41581:25;;41620:20;41638:1;41620:20;:::i;:::-;41615:25;;41659:1;41656;41653:8;41650:34;;;41664:18;;:::i;:::-;41650:34;41709:1;41706;41702:9;41694:17;;41526:191;;;;:::o;41723:96::-;41760:7;41789:24;41807:5;41789:24;:::i;:::-;41778:35;;41723:96;;;:::o;41825:90::-;41859:7;41902:5;41895:13;41888:21;41877:32;;41825:90;;;:::o;41921:77::-;41958:7;41987:5;41976:16;;41921:77;;;:::o;42004:149::-;42040:7;42080:66;42073:5;42069:78;42058:89;;42004:149;;;:::o;42159:126::-;42196:7;42236:42;42229:5;42225:54;42214:65;;42159:126;;;:::o;42291:77::-;42328:7;42357:5;42346:16;;42291:77;;;:::o;42374:101::-;42410:7;42450:18;42443:5;42439:30;42428:41;;42374:101;;;:::o;42481:86::-;42516:7;42556:4;42549:5;42545:16;42534:27;;42481:86;;;:::o;42573:154::-;42657:6;42652:3;42647;42634:30;42719:1;42710:6;42705:3;42701:16;42694:27;42573:154;;;:::o;42733:307::-;42801:1;42811:113;42825:6;42822:1;42819:13;42811:113;;;42910:1;42905:3;42901:11;42895:18;42891:1;42886:3;42882:11;42875:39;42847:2;42844:1;42840:10;42835:15;;42811:113;;;42942:6;42939:1;42936:13;42933:101;;;43022:1;43013:6;43008:3;43004:16;42997:27;42933:101;42782:258;42733:307;;;:::o;43046:320::-;43090:6;43127:1;43121:4;43117:12;43107:22;;43174:1;43168:4;43164:12;43195:18;43185:81;;43251:4;43243:6;43239:17;43229:27;;43185:81;43313:2;43305:6;43302:14;43282:18;43279:38;43276:84;;;43332:18;;:::i;:::-;43276:84;43097:269;43046:320;;;:::o;43372:281::-;43455:27;43477:4;43455:27;:::i;:::-;43447:6;43443:40;43585:6;43573:10;43570:22;43549:18;43537:10;43534:34;43531:62;43528:88;;;43596:18;;:::i;:::-;43528:88;43636:10;43632:2;43625:22;43415:238;43372:281;;:::o;43659:233::-;43698:3;43721:24;43739:5;43721:24;:::i;:::-;43712:33;;43767:66;43760:5;43757:77;43754:103;;;43837:18;;:::i;:::-;43754:103;43884:1;43877:5;43873:13;43866:20;;43659:233;;;:::o;43898:79::-;43937:7;43966:5;43955:16;;43898:79;;;:::o;43983:176::-;44015:1;44032:20;44050:1;44032:20;:::i;:::-;44027:25;;44066:20;44084:1;44066:20;:::i;:::-;44061:25;;44105:1;44095:35;;44110:18;;:::i;:::-;44095:35;44151:1;44148;44144:9;44139:14;;43983:176;;;;:::o;44165:180::-;44213:77;44210:1;44203:88;44310:4;44307:1;44300:15;44334:4;44331:1;44324:15;44351:180;44399:77;44396:1;44389:88;44496:4;44493:1;44486:15;44520:4;44517:1;44510:15;44537:180;44585:77;44582:1;44575:88;44682:4;44679:1;44672:15;44706:4;44703:1;44696:15;44723:180;44771:77;44768:1;44761:88;44868:4;44865:1;44858:15;44892:4;44889:1;44882:15;44909:180;44957:77;44954:1;44947:88;45054:4;45051:1;45044:15;45078:4;45075:1;45068:15;45095:180;45143:77;45140:1;45133:88;45240:4;45237:1;45230:15;45264:4;45261:1;45254:15;45281:117;45390:1;45387;45380:12;45404:117;45513:1;45510;45503:12;45527:117;45636:1;45633;45626:12;45650:117;45759:1;45756;45749:12;45773:117;45882:1;45879;45872:12;45896:117;46005:1;46002;45995:12;46019:117;46128:1;46125;46118:12;46142:102;46183:6;46234:2;46230:7;46225:2;46218:5;46214:14;46210:28;46200:38;;46142:102;;;:::o;46250:174::-;46390:26;46386:1;46378:6;46374:14;46367:50;46250:174;:::o;46430:181::-;46570:33;46566:1;46558:6;46554:14;46547:57;46430:181;:::o;46617:214::-;46757:66;46753:1;46745:6;46741:14;46734:90;46617:214;:::o;46837:225::-;46977:34;46973:1;46965:6;46961:14;46954:58;47046:8;47041:2;47033:6;47029:15;47022:33;46837:225;:::o;47068:214::-;47208:66;47204:1;47196:6;47192:14;47185:90;47068:214;:::o;47288:168::-;47428:20;47424:1;47416:6;47412:14;47405:44;47288:168;:::o;47462:221::-;47602:34;47598:1;47590:6;47586:14;47579:58;47671:4;47666:2;47658:6;47654:15;47647:29;47462:221;:::o;47689:::-;47829:34;47825:1;47817:6;47813:14;47806:58;47898:4;47893:2;47885:6;47881:15;47874:29;47689:221;:::o;47916:164::-;48056:16;48052:1;48044:6;48040:14;48033:40;47916:164;:::o;48086:182::-;48226:34;48222:1;48214:6;48210:14;48203:58;48086:182;:::o;48274:170::-;48414:22;48410:1;48402:6;48398:14;48391:46;48274:170;:::o;48450:165::-;48590:17;48586:1;48578:6;48574:14;48567:41;48450:165;:::o;48621:114::-;;:::o;48741:122::-;48814:24;48832:5;48814:24;:::i;:::-;48807:5;48804:35;48794:63;;48853:1;48850;48843:12;48794:63;48741:122;:::o;48869:116::-;48939:21;48954:5;48939:21;:::i;:::-;48932:5;48929:32;48919:60;;48975:1;48972;48965:12;48919:60;48869:116;:::o;48991:120::-;49063:23;49080:5;49063:23;:::i;:::-;49056:5;49053:34;49043:62;;49101:1;49098;49091:12;49043:62;48991:120;:::o;49117:122::-;49190:24;49208:5;49190:24;:::i;:::-;49183:5;49180:35;49170:63;;49229:1;49226;49219:12;49170:63;49117:122;:::o

Swarm Source

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