ETH Price: $3,143.54 (-8.53%)
Gas: 9 Gwei

Token

JokerClub (JKR)
 

Overview

Max Total Supply

4,444 JKR

Holders

1,116

Market

Volume (24H)

1.2969 ETH

Min Price (24H)

$14.46 @ 0.004600 ETH

Max Price (24H)

$3,426.46 @ 1.090000 ETH
Balance
2 JKR
0x33cb7917f08a07467aab26e07fd1120d839faca2
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:
JokerClub

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-20
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

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

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 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`,
     * 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,
        bytes calldata data
    ) external;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

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

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

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

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    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: [ERC165](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.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

    /**
     * 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 initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

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

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

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

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

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

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

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

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

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 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: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

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


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}


pragma solidity >=0.7.0 <0.9.0;

/**
 * @author LD
 * @title NFT
 * @dev Deploy a ERC721A NFT Collection
 */
contract JokerClub is ERC721A, Ownable, DefaultOperatorFilterer {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    mapping(address => uint256[]) private _ownedTokens;

    mapping(address => uint256) private _numTokenMinted;

    using Strings for uint256;

    // @dev Merkle root of the whitelist
    bytes32 public merkleRoot;

    // @dev Collcetion max supply 
    uint public maxSupply = 8888;

    // @dev Price token in ether
    uint256 public price = 0.08 ether;

    // @dev Reveal state of the collection
    bool public revealed;

    // @dev Is whitelist sales enabled
    bool public whitelistSale = true;

    // @dev Address of the team wallet
    address payable public _team;

    //@dev Pause state of the sale
    bool public paused = true;

    address payable public partner;



    function getOwnedTokens(address owner) public view returns (uint256[] memory) {
        return _ownedTokens[owner];
    }


    function getTokensMinted(address owner) public view returns (uint256) {
        return _numTokenMinted[owner];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    /**
     * @dev See {IERC721-approve}.
     *      In this example the added modifier ensures that the operator is allowed by the OperatorFilterRegistry.
     */
    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferToken(address from, address to, uint256 tokenId) private {
        uint256[] storage fromTokens = _ownedTokens[from];
        for (uint256 i = 0; i < fromTokens.length; i++) {
            if (fromTokens[i] == tokenId) {
                fromTokens[i] = fromTokens[fromTokens.length - 1];
                fromTokens.pop();
                break;
            }
        }
        _ownedTokens[to].push(tokenId);
    }
    
    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
        transferToken(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
        transferToken(from, to, tokenId);
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId, data);
        transferToken(from, to, tokenId);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function airdrop(address[][] memory recipients, uint256[] memory numNFTs) external onlyOwner {
        require(recipients.length == numNFTs.length, "Input arrays must have the same length");
        uint256 newTokenId;

        for (uint256 i = 0; i < recipients.length; i++) {
            for (uint256 j = 0; j < recipients[i].length; j++) {
                address recipient = recipients[i][j];
                uint256 count = numNFTs[i];
                _mint(recipient, count);
                _numTokenMinted[recipient] += count;
                for (uint256 index = 0; index < count; index++) {
                    newTokenId = _tokenIds.current();
                    _ownedTokens[recipient].push(newTokenId);
                    _tokenIds.increment();
                }
            }
        }
    }

    /**
     * @dev Collection URIs
     * baseURI : URI of the revealed NFT
     * hiddenURI : URI of the non revealed NFT
     */
    string public baseURI;
    string public hiddenURI;

    // @dev Max token by wallet
    uint public maxByWallet = 5;


    /**
     * @dev Modifier isWhitelisted to check if the caller is on the whitelist
     */
    modifier isWhitelisted(bytes32 [] calldata merkleProof, address recipient) {
        if (whitelistSale) {
            bytes32 leaf = keccak256(abi.encodePacked(recipient));
            require(MerkleProof.verify(merkleProof, merkleRoot, leaf), "Not whitelisted !");
        }

        _;
    }


    modifier onlyPartner() {
        require(msg.sender == partner, "Not authorized");
        _;
    }


    function setPartner(address payable _partner) public onlyPartner {
        partner = _partner;
    }

    constructor(address payable team, address payable _partner) ERC721A("JokerClub", "JKR") {
        _team = team;
        partner = _partner;
        _mint(team, 444);
    }

    function mint(uint256 quantity, bytes32[] calldata merkleProof, address recipient) external payable isWhitelisted(merkleProof, recipient) {
        // `_mint`'s second argument now takes in a `quantity`, not a `tokenId`.
        require(!paused, "Sale is paused !");
        require (quantity + _numTokenMinted[recipient] <= maxByWallet, "Request too much for one wallet !");
        require (quantity + _totalMinted() <= maxSupply, "Max supply reached !");
        require(msg.value >= price * quantity, "Not enough ETH !");

        _mint(recipient, quantity);
        uint256 newTokenId;
        for (uint256 index = 0; index < quantity; index++) {
            newTokenId = _tokenIds.current();
            _ownedTokens[recipient].push(newTokenId);
            _tokenIds.increment();
        }

        _numTokenMinted[recipient] += quantity;
    }

    /**
     * @dev Change the pause state of whitelist and public sale
     */
    function setPaused(bool value) public onlyOwner {
        paused = value;
    }

    /**
     * @dev Change the `price` of the token for `newPrice`
     */
    function setPrice(uint256 newPrice) external onlyOwner {
        price = newPrice;
    }

    function setMaxByWallet(uint newValue) external onlyOwner {
        maxByWallet = newValue;
    }

    /**
     * @dev Update the merkle root
     *
     * @param newMerkleRoot must start with 0x  
     * 
     */
    function setMerkleRoot(bytes32 newMerkleRoot) external onlyOwner {
        merkleRoot = newMerkleRoot;
    }

    function setTeamAddress(address payable team) public onlyOwner {
        _team = team;
    }

    function setWhitelistSale(bool value) public onlyOwner {
        whitelistSale = value;
    }
    
    /**
     * @dev Withdraw funds to the `_team` wallet
     */
    function withdraw() external onlyPartner {
        require(address(this).balance != 0, "Nothing to withdraw");
        (bool success, ) = partner.call{value: address(this).balance }("");
           require(success, 'transfer failed');
    }

    /**
     * @dev Reveal the final URI
     */
    function setRevealCollection(bool value) public onlyOwner {
        revealed = value;
    }

    /**
     * @dev Reveal the final URI
     */
    function setBaseURI(string calldata value) public onlyOwner {
        baseURI = value;
    }

    /**
     * @dev Reveal the final URI
     */
    function setHiddenURI(string calldata value) public onlyOwner {
        hiddenURI = value;
    }

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

    /**
     * @dev Return the URI of the NFT
     * @notice return the hidden URI then the Revealed JSON when the Revealed param is true
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
        if (revealed == false) {
            return hiddenURI;
        }

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"team","type":"address"},{"internalType":"address payable","name":"_partner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_team","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[][]","name":"recipients","type":"address[][]"},{"internalType":"uint256[]","name":"numNFTs","type":"uint256[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getOwnedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"partner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"value","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"value","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxByWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_partner","type":"address"}],"name":"setPartner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setRevealCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"team","type":"address"}],"name":"setTeamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526122b8600d5567011c37937e080000600e556001600f60016101000a81548160ff0219169083151502179055506001600f60166101000a81548160ff02191690831515021790555060056013553480156200005e57600080fd5b50604051620054ef380380620054ef83398181016040528101906200008491906200079c565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600981526020017f4a6f6b6572436c756200000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4a4b520000000000000000000000000000000000000000000000000000000000815250816002908162000118919062000a5d565b5080600390816200012a919062000a5d565b506200013b620003f860201b60201c565b60008190555050506200016362000157620003fd60201b60201c565b6200040560201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003585780156200021e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001e492919062000b69565b600060405180830381600087803b158015620001ff57600080fd5b505af115801562000214573d6000803e3d6000fd5b5050505062000357565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002d8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029e92919062000b69565b600060405180830381600087803b158015620002b957600080fd5b505af1158015620002ce573d6000803e3d6000fd5b5050505062000356565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000321919062000b96565b600060405180830381600087803b1580156200033c57600080fd5b505af115801562000351573d6000803e3d6000fd5b505050505b5b5b505081600f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003f0826101bc620004cb60201b60201c565b505062000bb3565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080549050600082036200050c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620005216000848385620006b260201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620005b083620005926000866000620006b860201b60201c565b620005a385620006e860201b60201c565b17620006f860201b60201c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146200065357808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905062000616565b50600082036200068f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050620006ad60008483856200072360201b60201c565b505050565b50505050565b60008060e883901c905060e8620006d78686846200072960201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60009392505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007648262000737565b9050919050565b620007768162000757565b81146200078257600080fd5b50565b60008151905062000796816200076b565b92915050565b60008060408385031215620007b657620007b562000732565b5b6000620007c68582860162000785565b9250506020620007d98582860162000785565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200086557607f821691505b6020821081036200087b576200087a6200081d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620008e57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008a6565b620008f18683620008a6565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200093e62000938620009328462000909565b62000913565b62000909565b9050919050565b6000819050919050565b6200095a836200091d565b62000972620009698262000945565b848454620008b3565b825550505050565b600090565b620009896200097a565b620009968184846200094f565b505050565b5b81811015620009be57620009b26000826200097f565b6001810190506200099c565b5050565b601f82111562000a0d57620009d78162000881565b620009e28462000896565b81016020851015620009f2578190505b62000a0a62000a018562000896565b8301826200099b565b50505b505050565b600082821c905092915050565b600062000a326000198460080262000a12565b1980831691505092915050565b600062000a4d838362000a1f565b9150826002028217905092915050565b62000a6882620007e3565b67ffffffffffffffff81111562000a845762000a83620007ee565b5b62000a9082546200084c565b62000a9d828285620009c2565b600060209050601f83116001811462000ad5576000841562000ac0578287015190505b62000acc858262000a3f565b86555062000b3c565b601f19841662000ae58662000881565b60005b8281101562000b0f5784890151825560018201915060208501945060208101905062000ae8565b8683101562000b2f578489015162000b2b601f89168262000a1f565b8355505b6001600288020188555050505b505050505050565b600062000b518262000737565b9050919050565b62000b638162000b44565b82525050565b600060408201905062000b80600083018562000b58565b62000b8f602083018462000b58565b9392505050565b600060208201905062000bad600083018462000b58565b92915050565b61492c8062000bc36000396000f3fe6080604052600436106102675760003560e01c806370a0823111610144578063ba28b94a116100b6578063cbbf42c11161007a578063cbbf42c1146108e0578063d5abeb01146108fc578063d9d6165514610927578063e985e9c514610964578063ef4de087146109a1578063f2fde38b146109de57610267565b8063ba28b94a146107fd578063bbaac02f14610826578063be10862b1461084f578063c87b56dd1461087a578063ca7ce3ec146108b757610267565b806391b7f5ed1161010857806391b7f5ed1461070357806395d89b411461072c578063a035b1fe14610757578063a16d596014610782578063a22cb465146107ab578063b88d4fde146107d457610267565b806370a0823114610630578063715018a61461066d5780637cb64759146106845780638cc54e7f146106ad5780638da5cb5b146106d857610267565b806334ecc70a116101dd57806351830227116101a1578063518302271461052057806355f804b31461054b5780635c975abb146105745780636352211e1461059f5780636690864e146105dc5780636c0360eb1461060557610267565b806334ecc70a146104615780633ccfd60b1461048c57806341f43434146104a357806342842e0e146104ce5780634b63769f146104f757610267565b806316c38b3c1161022f57806316c38b3c1461036557806318160ddd1461038e57806323b872dd146103b95780632e067421146103e25780632eb4a7ab1461040b57806331ffd6f11461043657610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630ede03431461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190612f66565b610a07565b6040516102a09190612fae565b60405180910390f35b3480156102b557600080fd5b506102be610a19565b6040516102cb9190613059565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f691906130b1565b610aab565b604051610308919061311f565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613166565b610b2a565b005b34801561034657600080fd5b5061034f610b43565b60405161035c91906131c7565b60405180910390f35b34801561037157600080fd5b5061038c6004803603810190610387919061320e565b610b69565b005b34801561039a57600080fd5b506103a3610b8e565b6040516103b0919061324a565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db9190613265565b610ba5565b005b3480156103ee57600080fd5b50610409600480360381019061040491906130b1565b610bff565b005b34801561041757600080fd5b50610420610c11565b60405161042d91906132d1565b60405180910390f35b34801561044257600080fd5b5061044b610c17565b6040516104589190612fae565b60405180910390f35b34801561046d57600080fd5b50610476610c2a565b604051610483919061324a565b60405180910390f35b34801561049857600080fd5b506104a1610c30565b005b3480156104af57600080fd5b506104b8610dd4565b6040516104c5919061334b565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613265565b610de6565b005b34801561050357600080fd5b5061051e60048036038101906105199190613652565b610e40565b005b34801561052c57600080fd5b50610535611045565b6040516105429190612fae565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190613725565b611058565b005b34801561058057600080fd5b50610589611076565b6040516105969190612fae565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c191906130b1565b611089565b6040516105d3919061311f565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe919061379e565b61109b565b005b34801561061157600080fd5b5061061a6110e7565b6040516106279190613059565b60405180910390f35b34801561063c57600080fd5b50610657600480360381019061065291906137cb565b611175565b604051610664919061324a565b60405180910390f35b34801561067957600080fd5b5061068261122d565b005b34801561069057600080fd5b506106ab60048036038101906106a69190613824565b611241565b005b3480156106b957600080fd5b506106c2611253565b6040516106cf9190613059565b60405180910390f35b3480156106e457600080fd5b506106ed6112e1565b6040516106fa919061311f565b60405180910390f35b34801561070f57600080fd5b5061072a600480360381019061072591906130b1565b61130b565b005b34801561073857600080fd5b5061074161131d565b60405161074e9190613059565b60405180910390f35b34801561076357600080fd5b5061076c6113af565b604051610779919061324a565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a4919061379e565b6113b5565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613851565b611489565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613946565b6114a2565b005b34801561080957600080fd5b50610824600480360381019061081f919061320e565b6114fe565b005b34801561083257600080fd5b5061084d60048036038101906108489190613725565b611523565b005b34801561085b57600080fd5b50610864611541565b60405161087191906131c7565b60405180910390f35b34801561088657600080fd5b506108a1600480360381019061089c91906130b1565b611567565b6040516108ae9190613059565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d9919061320e565b6116bc565b005b6108fa60048036038101906108f59190613a1f565b6116e1565b005b34801561090857600080fd5b50610911611a43565b60405161091e919061324a565b60405180910390f35b34801561093357600080fd5b5061094e600480360381019061094991906137cb565b611a49565b60405161095b9190613b51565b60405180910390f35b34801561097057600080fd5b5061098b60048036038101906109869190613b73565b611ae0565b6040516109989190612fae565b60405180910390f35b3480156109ad57600080fd5b506109c860048036038101906109c391906137cb565b611b74565b6040516109d5919061324a565b60405180910390f35b3480156109ea57600080fd5b50610a056004803603810190610a0091906137cb565b611bbd565b005b6000610a1282611c40565b9050919050565b606060028054610a2890613be2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5490613be2565b8015610aa15780601f10610a7657610100808354040283529160200191610aa1565b820191906000526020600020905b815481529060010190602001808311610a8457829003601f168201915b5050505050905090565b6000610ab682611cd2565b610aec576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b3481611d31565b610b3e8383611e2e565b505050565b600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610b71611f72565b80600f60166101000a81548160ff02191690831515021790555050565b6000610b98611ff0565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610be357610be233611d31565b5b610bee848484611ff5565b610bf9848484612317565b50505050565b610c07611f72565b8060138190555050565b600c5481565b600f60019054906101000a900460ff1681565b60135481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb790613c5f565b60405180910390fd5b60004703610d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfa90613ccb565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610d4b90613d1c565b60006040518083038185875af1925050503d8060008114610d88576040519150601f19603f3d011682016040523d82523d6000602084013e610d8d565b606091505b5050905080610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890613d7d565b60405180910390fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e2457610e2333611d31565b5b610e2f848484612488565b610e3a848484612317565b50505050565b610e48611f72565b8051825114610e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8390613e0f565b60405180910390fd5b600080600090505b835181101561103f5760005b848281518110610eb357610eb2613e2f565b5b60200260200101515181101561102b576000858381518110610ed857610ed7613e2f565b5b60200260200101518281518110610ef257610ef1613e2f565b5b602002602001015190506000858481518110610f1157610f10613e2f565b5b60200260200101519050610f2582826124a8565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f749190613e8d565b9250508190555060005b8181101561101557610f906009612663565b9550600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208690806001815401808255809150506001900390600052602060002001600090919091909150556110026009612671565b808061100d90613ec1565b915050610f7e565b505050808061102390613ec1565b915050610ea0565b50808061103790613ec1565b915050610e94565b50505050565b600f60009054906101000a900460ff1681565b611060611f72565b8181601191826110719291906140b6565b505050565b600f60169054906101000a900460ff1681565b600061109482612687565b9050919050565b6110a3611f72565b80600f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601180546110f490613be2565b80601f016020809104026020016040519081016040528092919081815260200182805461112090613be2565b801561116d5780601f106111425761010080835404028352916020019161116d565b820191906000526020600020905b81548152906001019060200180831161115057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111dc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611235611f72565b61123f6000612753565b565b611249611f72565b80600c8190555050565b6012805461126090613be2565b80601f016020809104026020016040519081016040528092919081815260200182805461128c90613be2565b80156112d95780601f106112ae576101008083540402835291602001916112d9565b820191906000526020600020905b8154815290600101906020018083116112bc57829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611313611f72565b80600e8190555050565b60606003805461132c90613be2565b80601f016020809104026020016040519081016040528092919081815260200182805461135890613be2565b80156113a55780601f1061137a576101008083540402835291602001916113a5565b820191906000526020600020905b81548152906001019060200180831161138857829003601f168201915b5050505050905090565b600e5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90613c5f565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8161149381611d31565b61149d8383612819565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114e0576114df33611d31565b5b6114ec85858585612990565b6114f7858585612317565b5050505050565b611506611f72565b80600f60006101000a81548160ff02191690831515021790555050565b61152b611f72565b81816012918261153c9291906140b6565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061157282611cd2565b6115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a8906141f8565b60405180910390fd5b60001515600f60009054906101000a900460ff1615150361165e57601280546115d990613be2565b80601f016020809104026020016040519081016040528092919081815260200182805461160590613be2565b80156116525780601f1061162757610100808354040283529160200191611652565b820191906000526020600020905b81548152906001019060200180831161163557829003601f168201915b505050505090506116b7565b6000611668612a03565b9050600081511161168857604051806020016040528060008152506116b3565b8061169284612a95565b6040516020016116a39291906142a0565b6040516020818303038152906040525b9150505b919050565b6116c4611f72565b80600f60016101000a81548160ff02191690831515021790555050565b828282600f60019054906101000a900460ff16156117b35760008160405160200161170c9190614317565b604051602081830303815290604052805190602001209050611772848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483612bf5565b6117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a89061437e565b60405180910390fd5b505b600f60169054906101000a900460ff1615611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa906143ea565b60405180910390fd5b601354600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054886118519190613e8d565b1115611892576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118899061447c565b60405180910390fd5b600d5461189d612c0c565b886118a89190613e8d565b11156118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e0906144e8565b60405180910390fd5b86600e546118f79190614508565b341015611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090614596565b60405180910390fd5b61194384886124a8565b600080600090505b888110156119e25761195d6009612663565b9150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556119cf6009612671565b80806119da90613ec1565b91505061194b565b5087600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a329190613e8d565b925050819055505050505050505050565b600d5481565b6060600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611ad457602002820191906000526020600020905b815481526020019060010190808311611ac0575b50505050509050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bc5611f72565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b90614628565b60405180910390fd5b611c3d81612753565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c9b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ccb5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600081611cdd611ff0565b11158015611cec575060005482105b8015611d2a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e2b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611da8929190614648565b602060405180830381865afa158015611dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de99190614686565b611e2a57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e21919061311f565b60405180910390fd5b5b50565b6000611e3982611089565b90508073ffffffffffffffffffffffffffffffffffffffff16611e5a612c1f565b73ffffffffffffffffffffffffffffffffffffffff1614611ebd57611e8681611e81612c1f565b611ae0565b611ebc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611f7a612c27565b73ffffffffffffffffffffffffffffffffffffffff16611f986112e1565b73ffffffffffffffffffffffffffffffffffffffff1614611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906146ff565b60405180910390fd5b565b600090565b600061200082612687565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612067576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061207384612c2f565b915091506120898187612084612c1f565b612c56565b6120d55761209e86612099612c1f565b611ae0565b6120d4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361213b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121488686866001612c9a565b801561215357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612221856121fd888887612ca0565b7c020000000000000000000000000000000000000000000000000000000017612cc8565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036122a757600060018501905060006004600083815260200190815260200160002054036122a55760005481146122a4578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461230f8686866001612cf3565b505050505050565b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b818054905081101561241b578282828154811061237d5761237c613e2f565b5b90600052602060002001540361240857816001838054905061239f919061471f565b815481106123b0576123af613e2f565b5b90600052602060002001548282815481106123ce576123cd613e2f565b5b9060005260206000200181905550818054806123ed576123ec614753565b5b6001900381819060005260206000200160009055905561241b565b808061241390613ec1565b91505061235d565b50600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505060019003906000526020600020016000909190919091505550505050565b6124a3838383604051806020016040528060008152506114a2565b505050565b600080549050600082036124e8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124f56000848385612c9a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061256c8361255d6000866000612ca0565b61256685612cf9565b17612cc8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461260d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125d2565b5060008203612648576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061265e6000848385612cf3565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b60008082905080612696611ff0565b1161271c5760005481101561271b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612719575b6000810361270f5760046000836001900393508381526020019081526020016000205490506126e5565b809250505061274e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612821612c1f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612885576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612892612c1f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661293f612c1f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129849190612fae565b60405180910390a35050565b61299b848484610ba5565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129fd576129c684848484612d09565b6129fc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060118054612a1290613be2565b80601f0160208091040260200160405190810160405280929190818152602001828054612a3e90613be2565b8015612a8b5780601f10612a6057610100808354040283529160200191612a8b565b820191906000526020600020905b815481529060010190602001808311612a6e57829003601f168201915b5050505050905090565b606060008203612adc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bf0565b600082905060005b60008214612b0e578080612af790613ec1565b915050600a82612b0791906147b1565b9150612ae4565b60008167ffffffffffffffff811115612b2a57612b2961336b565b5b6040519080825280601f01601f191660200182016040528015612b5c5781602001600182028036833780820191505090505b5090505b60008514612be957600182612b75919061471f565b9150600a85612b8491906147e2565b6030612b909190613e8d565b60f81b818381518110612ba657612ba5613e2f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612be291906147b1565b9450612b60565b8093505050505b919050565b600082612c028584612e59565b1490509392505050565b6000612c16611ff0565b60005403905090565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612cb7868684612eaf565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d2f612c1f565b8786866040518563ffffffff1660e01b8152600401612d519493929190614868565b6020604051808303816000875af1925050508015612d8d57506040513d601f19601f82011682018060405250810190612d8a91906148c9565b60015b612e06573d8060008114612dbd576040519150601f19603f3d011682016040523d82523d6000602084013e612dc2565b606091505b506000815103612dfe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008082905060005b8451811015612ea457612e8f82868381518110612e8257612e81613e2f565b5b6020026020010151612eb8565b91508080612e9c90613ec1565b915050612e62565b508091505092915050565b60009392505050565b6000818310612ed057612ecb8284612ee3565b612edb565b612eda8383612ee3565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f4381612f0e565b8114612f4e57600080fd5b50565b600081359050612f6081612f3a565b92915050565b600060208284031215612f7c57612f7b612f04565b5b6000612f8a84828501612f51565b91505092915050565b60008115159050919050565b612fa881612f93565b82525050565b6000602082019050612fc36000830184612f9f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613003578082015181840152602081019050612fe8565b60008484015250505050565b6000601f19601f8301169050919050565b600061302b82612fc9565b6130358185612fd4565b9350613045818560208601612fe5565b61304e8161300f565b840191505092915050565b600060208201905081810360008301526130738184613020565b905092915050565b6000819050919050565b61308e8161307b565b811461309957600080fd5b50565b6000813590506130ab81613085565b92915050565b6000602082840312156130c7576130c6612f04565b5b60006130d58482850161309c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613109826130de565b9050919050565b613119816130fe565b82525050565b60006020820190506131346000830184613110565b92915050565b613143816130fe565b811461314e57600080fd5b50565b6000813590506131608161313a565b92915050565b6000806040838503121561317d5761317c612f04565b5b600061318b85828601613151565b925050602061319c8582860161309c565b9150509250929050565b60006131b1826130de565b9050919050565b6131c1816131a6565b82525050565b60006020820190506131dc60008301846131b8565b92915050565b6131eb81612f93565b81146131f657600080fd5b50565b600081359050613208816131e2565b92915050565b60006020828403121561322457613223612f04565b5b6000613232848285016131f9565b91505092915050565b6132448161307b565b82525050565b600060208201905061325f600083018461323b565b92915050565b60008060006060848603121561327e5761327d612f04565b5b600061328c86828701613151565b935050602061329d86828701613151565b92505060406132ae8682870161309c565b9150509250925092565b6000819050919050565b6132cb816132b8565b82525050565b60006020820190506132e660008301846132c2565b92915050565b6000819050919050565b600061331161330c613307846130de565b6132ec565b6130de565b9050919050565b6000613323826132f6565b9050919050565b600061333582613318565b9050919050565b6133458161332a565b82525050565b6000602082019050613360600083018461333c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133a38261300f565b810181811067ffffffffffffffff821117156133c2576133c161336b565b5b80604052505050565b60006133d5612efa565b90506133e1828261339a565b919050565b600067ffffffffffffffff8211156134015761340061336b565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156134325761343161336b565b5b602082029050602081019050919050565b600061345661345184613417565b6133cb565b9050808382526020820190506020840283018581111561347957613478613412565b5b835b818110156134a2578061348e8882613151565b84526020840193505060208101905061347b565b5050509392505050565b600082601f8301126134c1576134c0613366565b5b81356134d1848260208601613443565b91505092915050565b60006134ed6134e8846133e6565b6133cb565b905080838252602082019050602084028301858111156135105761350f613412565b5b835b8181101561355757803567ffffffffffffffff81111561353557613534613366565b5b80860161354289826134ac565b85526020850194505050602081019050613512565b5050509392505050565b600082601f83011261357657613575613366565b5b81356135868482602086016134da565b91505092915050565b600067ffffffffffffffff8211156135aa576135a961336b565b5b602082029050602081019050919050565b60006135ce6135c98461358f565b6133cb565b905080838252602082019050602084028301858111156135f1576135f0613412565b5b835b8181101561361a5780613606888261309c565b8452602084019350506020810190506135f3565b5050509392505050565b600082601f83011261363957613638613366565b5b81356136498482602086016135bb565b91505092915050565b6000806040838503121561366957613668612f04565b5b600083013567ffffffffffffffff81111561368757613686612f09565b5b61369385828601613561565b925050602083013567ffffffffffffffff8111156136b4576136b3612f09565b5b6136c085828601613624565b9150509250929050565b600080fd5b60008083601f8401126136e5576136e4613366565b5b8235905067ffffffffffffffff811115613702576137016136ca565b5b60208301915083600182028301111561371e5761371d613412565b5b9250929050565b6000806020838503121561373c5761373b612f04565b5b600083013567ffffffffffffffff81111561375a57613759612f09565b5b613766858286016136cf565b92509250509250929050565b61377b816131a6565b811461378657600080fd5b50565b60008135905061379881613772565b92915050565b6000602082840312156137b4576137b3612f04565b5b60006137c284828501613789565b91505092915050565b6000602082840312156137e1576137e0612f04565b5b60006137ef84828501613151565b91505092915050565b613801816132b8565b811461380c57600080fd5b50565b60008135905061381e816137f8565b92915050565b60006020828403121561383a57613839612f04565b5b60006138488482850161380f565b91505092915050565b6000806040838503121561386857613867612f04565b5b600061387685828601613151565b9250506020613887858286016131f9565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156138b1576138b061336b565b5b6138ba8261300f565b9050602081019050919050565b82818337600083830152505050565b60006138e96138e484613896565b6133cb565b90508281526020810184848401111561390557613904613891565b5b6139108482856138c7565b509392505050565b600082601f83011261392d5761392c613366565b5b813561393d8482602086016138d6565b91505092915050565b600080600080608085870312156139605761395f612f04565b5b600061396e87828801613151565b945050602061397f87828801613151565b93505060406139908782880161309c565b925050606085013567ffffffffffffffff8111156139b1576139b0612f09565b5b6139bd87828801613918565b91505092959194509250565b60008083601f8401126139df576139de613366565b5b8235905067ffffffffffffffff8111156139fc576139fb6136ca565b5b602083019150836020820283011115613a1857613a17613412565b5b9250929050565b60008060008060608587031215613a3957613a38612f04565b5b6000613a478782880161309c565b945050602085013567ffffffffffffffff811115613a6857613a67612f09565b5b613a74878288016139c9565b93509350506040613a8787828801613151565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ac88161307b565b82525050565b6000613ada8383613abf565b60208301905092915050565b6000602082019050919050565b6000613afe82613a93565b613b088185613a9e565b9350613b1383613aaf565b8060005b83811015613b44578151613b2b8882613ace565b9750613b3683613ae6565b925050600181019050613b17565b5085935050505092915050565b60006020820190508181036000830152613b6b8184613af3565b905092915050565b60008060408385031215613b8a57613b89612f04565b5b6000613b9885828601613151565b9250506020613ba985828601613151565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bfa57607f821691505b602082108103613c0d57613c0c613bb3565b5b50919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000613c49600e83612fd4565b9150613c5482613c13565b602082019050919050565b60006020820190508181036000830152613c7881613c3c565b9050919050565b7f4e6f7468696e6720746f20776974686472617700000000000000000000000000600082015250565b6000613cb5601383612fd4565b9150613cc082613c7f565b602082019050919050565b60006020820190508181036000830152613ce481613ca8565b9050919050565b600081905092915050565b50565b6000613d06600083613ceb565b9150613d1182613cf6565b600082019050919050565b6000613d2782613cf9565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613d67600f83612fd4565b9150613d7282613d31565b602082019050919050565b60006020820190508181036000830152613d9681613d5a565b9050919050565b7f496e70757420617272617973206d7573742068617665207468652073616d652060008201527f6c656e6774680000000000000000000000000000000000000000000000000000602082015250565b6000613df9602683612fd4565b9150613e0482613d9d565b604082019050919050565b60006020820190508181036000830152613e2881613dec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e988261307b565b9150613ea38361307b565b9250828201905080821115613ebb57613eba613e5e565b5b92915050565b6000613ecc8261307b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613efe57613efd613e5e565b5b600182019050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f39565b613f808683613f39565b95508019841693508086168417925050509392505050565b6000613fb3613fae613fa98461307b565b6132ec565b61307b565b9050919050565b6000819050919050565b613fcd83613f98565b613fe1613fd982613fba565b848454613f46565b825550505050565b600090565b613ff6613fe9565b614001818484613fc4565b505050565b5b818110156140255761401a600082613fee565b600181019050614007565b5050565b601f82111561406a5761403b81613f14565b61404484613f29565b81016020851015614053578190505b61406761405f85613f29565b830182614006565b50505b505050565b600082821c905092915050565b600061408d6000198460080261406f565b1980831691505092915050565b60006140a6838361407c565b9150826002028217905092915050565b6140c08383613f09565b67ffffffffffffffff8111156140d9576140d861336b565b5b6140e38254613be2565b6140ee828285614029565b6000601f83116001811461411d576000841561410b578287013590505b614115858261409a565b86555061417d565b601f19841661412b86613f14565b60005b828110156141535784890135825560018201915060208501945060208101905061412e565b86831015614170578489013561416c601f89168261407c565b8355505b6001600288020188555050505b50505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006141e2602f83612fd4565b91506141ed82614186565b604082019050919050565b60006020820190508181036000830152614211816141d5565b9050919050565b600081905092915050565b600061422e82612fc9565b6142388185614218565b9350614248818560208601612fe5565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061428a600583614218565b915061429582614254565b600582019050919050565b60006142ac8285614223565b91506142b88284614223565b91506142c38261427d565b91508190509392505050565b60008160601b9050919050565b60006142e7826142cf565b9050919050565b60006142f9826142dc565b9050919050565b61431161430c826130fe565b6142ee565b82525050565b60006143238284614300565b60148201915081905092915050565b7f4e6f742077686974656c69737465642021000000000000000000000000000000600082015250565b6000614368601183612fd4565b915061437382614332565b602082019050919050565b600060208201905081810360008301526143978161435b565b9050919050565b7f53616c6520697320706175736564202100000000000000000000000000000000600082015250565b60006143d4601083612fd4565b91506143df8261439e565b602082019050919050565b60006020820190508181036000830152614403816143c7565b9050919050565b7f5265717565737420746f6f206d75636820666f72206f6e652077616c6c65742060008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000614466602183612fd4565b91506144718261440a565b604082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f4d617820737570706c7920726561636865642021000000000000000000000000600082015250565b60006144d2601483612fd4565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b60006145138261307b565b915061451e8361307b565b925082820261452c8161307b565b9150828204841483151761454357614542613e5e565b5b5092915050565b7f4e6f7420656e6f75676820455448202100000000000000000000000000000000600082015250565b6000614580601083612fd4565b915061458b8261454a565b602082019050919050565b600060208201905081810360008301526145af81614573565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614612602683612fd4565b915061461d826145b6565b604082019050919050565b6000602082019050818103600083015261464181614605565b9050919050565b600060408201905061465d6000830185613110565b61466a6020830184613110565b9392505050565b600081519050614680816131e2565b92915050565b60006020828403121561469c5761469b612f04565b5b60006146aa84828501614671565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146e9602083612fd4565b91506146f4826146b3565b602082019050919050565b60006020820190508181036000830152614718816146dc565b9050919050565b600061472a8261307b565b91506147358361307b565b925082820390508181111561474d5761474c613e5e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147bc8261307b565b91506147c78361307b565b9250826147d7576147d6614782565b5b828204905092915050565b60006147ed8261307b565b91506147f88361307b565b92508261480857614807614782565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061483a82614813565b614844818561481e565b9350614854818560208601612fe5565b61485d8161300f565b840191505092915050565b600060808201905061487d6000830187613110565b61488a6020830186613110565b614897604083018561323b565b81810360608301526148a9818461482f565b905095945050505050565b6000815190506148c381612f3a565b92915050565b6000602082840312156148df576148de612f04565b5b60006148ed848285016148b4565b9150509291505056fea2646970667358221220880418037a03d48ffe73525ed28654c5eab990debf010603e9e7ad490feeb99c64736f6c63430008120033000000000000000000000000ee762ceee6601991d4f30049e7916a387b38b1bf000000000000000000000000fca1671996d750b463bfea7b9ebce41dfdd149aa

Deployed Bytecode

0x6080604052600436106102675760003560e01c806370a0823111610144578063ba28b94a116100b6578063cbbf42c11161007a578063cbbf42c1146108e0578063d5abeb01146108fc578063d9d6165514610927578063e985e9c514610964578063ef4de087146109a1578063f2fde38b146109de57610267565b8063ba28b94a146107fd578063bbaac02f14610826578063be10862b1461084f578063c87b56dd1461087a578063ca7ce3ec146108b757610267565b806391b7f5ed1161010857806391b7f5ed1461070357806395d89b411461072c578063a035b1fe14610757578063a16d596014610782578063a22cb465146107ab578063b88d4fde146107d457610267565b806370a0823114610630578063715018a61461066d5780637cb64759146106845780638cc54e7f146106ad5780638da5cb5b146106d857610267565b806334ecc70a116101dd57806351830227116101a1578063518302271461052057806355f804b31461054b5780635c975abb146105745780636352211e1461059f5780636690864e146105dc5780636c0360eb1461060557610267565b806334ecc70a146104615780633ccfd60b1461048c57806341f43434146104a357806342842e0e146104ce5780634b63769f146104f757610267565b806316c38b3c1161022f57806316c38b3c1461036557806318160ddd1461038e57806323b872dd146103b95780632e067421146103e25780632eb4a7ab1461040b57806331ffd6f11461043657610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630ede03431461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190612f66565b610a07565b6040516102a09190612fae565b60405180910390f35b3480156102b557600080fd5b506102be610a19565b6040516102cb9190613059565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f691906130b1565b610aab565b604051610308919061311f565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613166565b610b2a565b005b34801561034657600080fd5b5061034f610b43565b60405161035c91906131c7565b60405180910390f35b34801561037157600080fd5b5061038c6004803603810190610387919061320e565b610b69565b005b34801561039a57600080fd5b506103a3610b8e565b6040516103b0919061324a565b60405180910390f35b3480156103c557600080fd5b506103e060048036038101906103db9190613265565b610ba5565b005b3480156103ee57600080fd5b50610409600480360381019061040491906130b1565b610bff565b005b34801561041757600080fd5b50610420610c11565b60405161042d91906132d1565b60405180910390f35b34801561044257600080fd5b5061044b610c17565b6040516104589190612fae565b60405180910390f35b34801561046d57600080fd5b50610476610c2a565b604051610483919061324a565b60405180910390f35b34801561049857600080fd5b506104a1610c30565b005b3480156104af57600080fd5b506104b8610dd4565b6040516104c5919061334b565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613265565b610de6565b005b34801561050357600080fd5b5061051e60048036038101906105199190613652565b610e40565b005b34801561052c57600080fd5b50610535611045565b6040516105429190612fae565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190613725565b611058565b005b34801561058057600080fd5b50610589611076565b6040516105969190612fae565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c191906130b1565b611089565b6040516105d3919061311f565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe919061379e565b61109b565b005b34801561061157600080fd5b5061061a6110e7565b6040516106279190613059565b60405180910390f35b34801561063c57600080fd5b50610657600480360381019061065291906137cb565b611175565b604051610664919061324a565b60405180910390f35b34801561067957600080fd5b5061068261122d565b005b34801561069057600080fd5b506106ab60048036038101906106a69190613824565b611241565b005b3480156106b957600080fd5b506106c2611253565b6040516106cf9190613059565b60405180910390f35b3480156106e457600080fd5b506106ed6112e1565b6040516106fa919061311f565b60405180910390f35b34801561070f57600080fd5b5061072a600480360381019061072591906130b1565b61130b565b005b34801561073857600080fd5b5061074161131d565b60405161074e9190613059565b60405180910390f35b34801561076357600080fd5b5061076c6113af565b604051610779919061324a565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a4919061379e565b6113b5565b005b3480156107b757600080fd5b506107d260048036038101906107cd9190613851565b611489565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613946565b6114a2565b005b34801561080957600080fd5b50610824600480360381019061081f919061320e565b6114fe565b005b34801561083257600080fd5b5061084d60048036038101906108489190613725565b611523565b005b34801561085b57600080fd5b50610864611541565b60405161087191906131c7565b60405180910390f35b34801561088657600080fd5b506108a1600480360381019061089c91906130b1565b611567565b6040516108ae9190613059565b60405180910390f35b3480156108c357600080fd5b506108de60048036038101906108d9919061320e565b6116bc565b005b6108fa60048036038101906108f59190613a1f565b6116e1565b005b34801561090857600080fd5b50610911611a43565b60405161091e919061324a565b60405180910390f35b34801561093357600080fd5b5061094e600480360381019061094991906137cb565b611a49565b60405161095b9190613b51565b60405180910390f35b34801561097057600080fd5b5061098b60048036038101906109869190613b73565b611ae0565b6040516109989190612fae565b60405180910390f35b3480156109ad57600080fd5b506109c860048036038101906109c391906137cb565b611b74565b6040516109d5919061324a565b60405180910390f35b3480156109ea57600080fd5b50610a056004803603810190610a0091906137cb565b611bbd565b005b6000610a1282611c40565b9050919050565b606060028054610a2890613be2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5490613be2565b8015610aa15780601f10610a7657610100808354040283529160200191610aa1565b820191906000526020600020905b815481529060010190602001808311610a8457829003601f168201915b5050505050905090565b6000610ab682611cd2565b610aec576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610b3481611d31565b610b3e8383611e2e565b505050565b600f60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610b71611f72565b80600f60166101000a81548160ff02191690831515021790555050565b6000610b98611ff0565b6001546000540303905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610be357610be233611d31565b5b610bee848484611ff5565b610bf9848484612317565b50505050565b610c07611f72565b8060138190555050565b600c5481565b600f60019054906101000a900460ff1681565b60135481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb790613c5f565b60405180910390fd5b60004703610d03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfa90613ccb565b60405180910390fd5b6000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610d4b90613d1c565b60006040518083038185875af1925050503d8060008114610d88576040519150601f19603f3d011682016040523d82523d6000602084013e610d8d565b606091505b5050905080610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890613d7d565b60405180910390fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e2457610e2333611d31565b5b610e2f848484612488565b610e3a848484612317565b50505050565b610e48611f72565b8051825114610e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8390613e0f565b60405180910390fd5b600080600090505b835181101561103f5760005b848281518110610eb357610eb2613e2f565b5b60200260200101515181101561102b576000858381518110610ed857610ed7613e2f565b5b60200260200101518281518110610ef257610ef1613e2f565b5b602002602001015190506000858481518110610f1157610f10613e2f565b5b60200260200101519050610f2582826124a8565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f749190613e8d565b9250508190555060005b8181101561101557610f906009612663565b9550600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208690806001815401808255809150506001900390600052602060002001600090919091909150556110026009612671565b808061100d90613ec1565b915050610f7e565b505050808061102390613ec1565b915050610ea0565b50808061103790613ec1565b915050610e94565b50505050565b600f60009054906101000a900460ff1681565b611060611f72565b8181601191826110719291906140b6565b505050565b600f60169054906101000a900460ff1681565b600061109482612687565b9050919050565b6110a3611f72565b80600f60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601180546110f490613be2565b80601f016020809104026020016040519081016040528092919081815260200182805461112090613be2565b801561116d5780601f106111425761010080835404028352916020019161116d565b820191906000526020600020905b81548152906001019060200180831161115057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111dc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611235611f72565b61123f6000612753565b565b611249611f72565b80600c8190555050565b6012805461126090613be2565b80601f016020809104026020016040519081016040528092919081815260200182805461128c90613be2565b80156112d95780601f106112ae576101008083540402835291602001916112d9565b820191906000526020600020905b8154815290600101906020018083116112bc57829003601f168201915b505050505081565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611313611f72565b80600e8190555050565b60606003805461132c90613be2565b80601f016020809104026020016040519081016040528092919081815260200182805461135890613be2565b80156113a55780601f1061137a576101008083540402835291602001916113a5565b820191906000526020600020905b81548152906001019060200180831161138857829003601f168201915b5050505050905090565b600e5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c90613c5f565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8161149381611d31565b61149d8383612819565b505050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114e0576114df33611d31565b5b6114ec85858585612990565b6114f7858585612317565b5050505050565b611506611f72565b80600f60006101000a81548160ff02191690831515021790555050565b61152b611f72565b81816012918261153c9291906140b6565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606061157282611cd2565b6115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a8906141f8565b60405180910390fd5b60001515600f60009054906101000a900460ff1615150361165e57601280546115d990613be2565b80601f016020809104026020016040519081016040528092919081815260200182805461160590613be2565b80156116525780601f1061162757610100808354040283529160200191611652565b820191906000526020600020905b81548152906001019060200180831161163557829003601f168201915b505050505090506116b7565b6000611668612a03565b9050600081511161168857604051806020016040528060008152506116b3565b8061169284612a95565b6040516020016116a39291906142a0565b6040516020818303038152906040525b9150505b919050565b6116c4611f72565b80600f60016101000a81548160ff02191690831515021790555050565b828282600f60019054906101000a900460ff16156117b35760008160405160200161170c9190614317565b604051602081830303815290604052805190602001209050611772848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483612bf5565b6117b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a89061437e565b60405180910390fd5b505b600f60169054906101000a900460ff1615611803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fa906143ea565b60405180910390fd5b601354600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054886118519190613e8d565b1115611892576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118899061447c565b60405180910390fd5b600d5461189d612c0c565b886118a89190613e8d565b11156118e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e0906144e8565b60405180910390fd5b86600e546118f79190614508565b341015611939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193090614596565b60405180910390fd5b61194384886124a8565b600080600090505b888110156119e25761195d6009612663565b9150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556119cf6009612671565b80806119da90613ec1565b91505061194b565b5087600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a329190613e8d565b925050819055505050505050505050565b600d5481565b6060600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015611ad457602002820191906000526020600020905b815481526020019060010190808311611ac0575b50505050509050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bc5611f72565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b90614628565b60405180910390fd5b611c3d81612753565b50565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c9b57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ccb5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600081611cdd611ff0565b11158015611cec575060005482105b8015611d2a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e2b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611da8929190614648565b602060405180830381865afa158015611dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de99190614686565b611e2a57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e21919061311f565b60405180910390fd5b5b50565b6000611e3982611089565b90508073ffffffffffffffffffffffffffffffffffffffff16611e5a612c1f565b73ffffffffffffffffffffffffffffffffffffffff1614611ebd57611e8681611e81612c1f565b611ae0565b611ebc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611f7a612c27565b73ffffffffffffffffffffffffffffffffffffffff16611f986112e1565b73ffffffffffffffffffffffffffffffffffffffff1614611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906146ff565b60405180910390fd5b565b600090565b600061200082612687565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612067576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061207384612c2f565b915091506120898187612084612c1f565b612c56565b6120d55761209e86612099612c1f565b611ae0565b6120d4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361213b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121488686866001612c9a565b801561215357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550612221856121fd888887612ca0565b7c020000000000000000000000000000000000000000000000000000000017612cc8565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036122a757600060018501905060006004600083815260200190815260200160002054036122a55760005481146122a4578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461230f8686866001612cf3565b505050505050565b6000600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b818054905081101561241b578282828154811061237d5761237c613e2f565b5b90600052602060002001540361240857816001838054905061239f919061471f565b815481106123b0576123af613e2f565b5b90600052602060002001548282815481106123ce576123cd613e2f565b5b9060005260206000200181905550818054806123ed576123ec614753565b5b6001900381819060005260206000200160009055905561241b565b808061241390613ec1565b91505061235d565b50600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082908060018154018082558091505060019003906000526020600020016000909190919091505550505050565b6124a3838383604051806020016040528060008152506114a2565b505050565b600080549050600082036124e8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124f56000848385612c9a565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061256c8361255d6000866000612ca0565b61256685612cf9565b17612cc8565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461260d57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506125d2565b5060008203612648576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061265e6000848385612cf3565b505050565b600081600001549050919050565b6001816000016000828254019250508190555050565b60008082905080612696611ff0565b1161271c5760005481101561271b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612719575b6000810361270f5760046000836001900393508381526020019081526020016000205490506126e5565b809250505061274e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612821612c1f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612885576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612892612c1f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661293f612c1f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129849190612fae565b60405180910390a35050565b61299b848484610ba5565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129fd576129c684848484612d09565b6129fc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060118054612a1290613be2565b80601f0160208091040260200160405190810160405280929190818152602001828054612a3e90613be2565b8015612a8b5780601f10612a6057610100808354040283529160200191612a8b565b820191906000526020600020905b815481529060010190602001808311612a6e57829003601f168201915b5050505050905090565b606060008203612adc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bf0565b600082905060005b60008214612b0e578080612af790613ec1565b915050600a82612b0791906147b1565b9150612ae4565b60008167ffffffffffffffff811115612b2a57612b2961336b565b5b6040519080825280601f01601f191660200182016040528015612b5c5781602001600182028036833780820191505090505b5090505b60008514612be957600182612b75919061471f565b9150600a85612b8491906147e2565b6030612b909190613e8d565b60f81b818381518110612ba657612ba5613e2f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612be291906147b1565b9450612b60565b8093505050505b919050565b600082612c028584612e59565b1490509392505050565b6000612c16611ff0565b60005403905090565b600033905090565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612cb7868684612eaf565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60006001821460e11b9050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d2f612c1f565b8786866040518563ffffffff1660e01b8152600401612d519493929190614868565b6020604051808303816000875af1925050508015612d8d57506040513d601f19601f82011682018060405250810190612d8a91906148c9565b60015b612e06573d8060008114612dbd576040519150601f19603f3d011682016040523d82523d6000602084013e612dc2565b606091505b506000815103612dfe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008082905060005b8451811015612ea457612e8f82868381518110612e8257612e81613e2f565b5b6020026020010151612eb8565b91508080612e9c90613ec1565b915050612e62565b508091505092915050565b60009392505050565b6000818310612ed057612ecb8284612ee3565b612edb565b612eda8383612ee3565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f4381612f0e565b8114612f4e57600080fd5b50565b600081359050612f6081612f3a565b92915050565b600060208284031215612f7c57612f7b612f04565b5b6000612f8a84828501612f51565b91505092915050565b60008115159050919050565b612fa881612f93565b82525050565b6000602082019050612fc36000830184612f9f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613003578082015181840152602081019050612fe8565b60008484015250505050565b6000601f19601f8301169050919050565b600061302b82612fc9565b6130358185612fd4565b9350613045818560208601612fe5565b61304e8161300f565b840191505092915050565b600060208201905081810360008301526130738184613020565b905092915050565b6000819050919050565b61308e8161307b565b811461309957600080fd5b50565b6000813590506130ab81613085565b92915050565b6000602082840312156130c7576130c6612f04565b5b60006130d58482850161309c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613109826130de565b9050919050565b613119816130fe565b82525050565b60006020820190506131346000830184613110565b92915050565b613143816130fe565b811461314e57600080fd5b50565b6000813590506131608161313a565b92915050565b6000806040838503121561317d5761317c612f04565b5b600061318b85828601613151565b925050602061319c8582860161309c565b9150509250929050565b60006131b1826130de565b9050919050565b6131c1816131a6565b82525050565b60006020820190506131dc60008301846131b8565b92915050565b6131eb81612f93565b81146131f657600080fd5b50565b600081359050613208816131e2565b92915050565b60006020828403121561322457613223612f04565b5b6000613232848285016131f9565b91505092915050565b6132448161307b565b82525050565b600060208201905061325f600083018461323b565b92915050565b60008060006060848603121561327e5761327d612f04565b5b600061328c86828701613151565b935050602061329d86828701613151565b92505060406132ae8682870161309c565b9150509250925092565b6000819050919050565b6132cb816132b8565b82525050565b60006020820190506132e660008301846132c2565b92915050565b6000819050919050565b600061331161330c613307846130de565b6132ec565b6130de565b9050919050565b6000613323826132f6565b9050919050565b600061333582613318565b9050919050565b6133458161332a565b82525050565b6000602082019050613360600083018461333c565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133a38261300f565b810181811067ffffffffffffffff821117156133c2576133c161336b565b5b80604052505050565b60006133d5612efa565b90506133e1828261339a565b919050565b600067ffffffffffffffff8211156134015761340061336b565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156134325761343161336b565b5b602082029050602081019050919050565b600061345661345184613417565b6133cb565b9050808382526020820190506020840283018581111561347957613478613412565b5b835b818110156134a2578061348e8882613151565b84526020840193505060208101905061347b565b5050509392505050565b600082601f8301126134c1576134c0613366565b5b81356134d1848260208601613443565b91505092915050565b60006134ed6134e8846133e6565b6133cb565b905080838252602082019050602084028301858111156135105761350f613412565b5b835b8181101561355757803567ffffffffffffffff81111561353557613534613366565b5b80860161354289826134ac565b85526020850194505050602081019050613512565b5050509392505050565b600082601f83011261357657613575613366565b5b81356135868482602086016134da565b91505092915050565b600067ffffffffffffffff8211156135aa576135a961336b565b5b602082029050602081019050919050565b60006135ce6135c98461358f565b6133cb565b905080838252602082019050602084028301858111156135f1576135f0613412565b5b835b8181101561361a5780613606888261309c565b8452602084019350506020810190506135f3565b5050509392505050565b600082601f83011261363957613638613366565b5b81356136498482602086016135bb565b91505092915050565b6000806040838503121561366957613668612f04565b5b600083013567ffffffffffffffff81111561368757613686612f09565b5b61369385828601613561565b925050602083013567ffffffffffffffff8111156136b4576136b3612f09565b5b6136c085828601613624565b9150509250929050565b600080fd5b60008083601f8401126136e5576136e4613366565b5b8235905067ffffffffffffffff811115613702576137016136ca565b5b60208301915083600182028301111561371e5761371d613412565b5b9250929050565b6000806020838503121561373c5761373b612f04565b5b600083013567ffffffffffffffff81111561375a57613759612f09565b5b613766858286016136cf565b92509250509250929050565b61377b816131a6565b811461378657600080fd5b50565b60008135905061379881613772565b92915050565b6000602082840312156137b4576137b3612f04565b5b60006137c284828501613789565b91505092915050565b6000602082840312156137e1576137e0612f04565b5b60006137ef84828501613151565b91505092915050565b613801816132b8565b811461380c57600080fd5b50565b60008135905061381e816137f8565b92915050565b60006020828403121561383a57613839612f04565b5b60006138488482850161380f565b91505092915050565b6000806040838503121561386857613867612f04565b5b600061387685828601613151565b9250506020613887858286016131f9565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156138b1576138b061336b565b5b6138ba8261300f565b9050602081019050919050565b82818337600083830152505050565b60006138e96138e484613896565b6133cb565b90508281526020810184848401111561390557613904613891565b5b6139108482856138c7565b509392505050565b600082601f83011261392d5761392c613366565b5b813561393d8482602086016138d6565b91505092915050565b600080600080608085870312156139605761395f612f04565b5b600061396e87828801613151565b945050602061397f87828801613151565b93505060406139908782880161309c565b925050606085013567ffffffffffffffff8111156139b1576139b0612f09565b5b6139bd87828801613918565b91505092959194509250565b60008083601f8401126139df576139de613366565b5b8235905067ffffffffffffffff8111156139fc576139fb6136ca565b5b602083019150836020820283011115613a1857613a17613412565b5b9250929050565b60008060008060608587031215613a3957613a38612f04565b5b6000613a478782880161309c565b945050602085013567ffffffffffffffff811115613a6857613a67612f09565b5b613a74878288016139c9565b93509350506040613a8787828801613151565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ac88161307b565b82525050565b6000613ada8383613abf565b60208301905092915050565b6000602082019050919050565b6000613afe82613a93565b613b088185613a9e565b9350613b1383613aaf565b8060005b83811015613b44578151613b2b8882613ace565b9750613b3683613ae6565b925050600181019050613b17565b5085935050505092915050565b60006020820190508181036000830152613b6b8184613af3565b905092915050565b60008060408385031215613b8a57613b89612f04565b5b6000613b9885828601613151565b9250506020613ba985828601613151565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bfa57607f821691505b602082108103613c0d57613c0c613bb3565b5b50919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000613c49600e83612fd4565b9150613c5482613c13565b602082019050919050565b60006020820190508181036000830152613c7881613c3c565b9050919050565b7f4e6f7468696e6720746f20776974686472617700000000000000000000000000600082015250565b6000613cb5601383612fd4565b9150613cc082613c7f565b602082019050919050565b60006020820190508181036000830152613ce481613ca8565b9050919050565b600081905092915050565b50565b6000613d06600083613ceb565b9150613d1182613cf6565b600082019050919050565b6000613d2782613cf9565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613d67600f83612fd4565b9150613d7282613d31565b602082019050919050565b60006020820190508181036000830152613d9681613d5a565b9050919050565b7f496e70757420617272617973206d7573742068617665207468652073616d652060008201527f6c656e6774680000000000000000000000000000000000000000000000000000602082015250565b6000613df9602683612fd4565b9150613e0482613d9d565b604082019050919050565b60006020820190508181036000830152613e2881613dec565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e988261307b565b9150613ea38361307b565b9250828201905080821115613ebb57613eba613e5e565b5b92915050565b6000613ecc8261307b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613efe57613efd613e5e565b5b600182019050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613f767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f39565b613f808683613f39565b95508019841693508086168417925050509392505050565b6000613fb3613fae613fa98461307b565b6132ec565b61307b565b9050919050565b6000819050919050565b613fcd83613f98565b613fe1613fd982613fba565b848454613f46565b825550505050565b600090565b613ff6613fe9565b614001818484613fc4565b505050565b5b818110156140255761401a600082613fee565b600181019050614007565b5050565b601f82111561406a5761403b81613f14565b61404484613f29565b81016020851015614053578190505b61406761405f85613f29565b830182614006565b50505b505050565b600082821c905092915050565b600061408d6000198460080261406f565b1980831691505092915050565b60006140a6838361407c565b9150826002028217905092915050565b6140c08383613f09565b67ffffffffffffffff8111156140d9576140d861336b565b5b6140e38254613be2565b6140ee828285614029565b6000601f83116001811461411d576000841561410b578287013590505b614115858261409a565b86555061417d565b601f19841661412b86613f14565b60005b828110156141535784890135825560018201915060208501945060208101905061412e565b86831015614170578489013561416c601f89168261407c565b8355505b6001600288020188555050505b50505050505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006141e2602f83612fd4565b91506141ed82614186565b604082019050919050565b60006020820190508181036000830152614211816141d5565b9050919050565b600081905092915050565b600061422e82612fc9565b6142388185614218565b9350614248818560208601612fe5565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061428a600583614218565b915061429582614254565b600582019050919050565b60006142ac8285614223565b91506142b88284614223565b91506142c38261427d565b91508190509392505050565b60008160601b9050919050565b60006142e7826142cf565b9050919050565b60006142f9826142dc565b9050919050565b61431161430c826130fe565b6142ee565b82525050565b60006143238284614300565b60148201915081905092915050565b7f4e6f742077686974656c69737465642021000000000000000000000000000000600082015250565b6000614368601183612fd4565b915061437382614332565b602082019050919050565b600060208201905081810360008301526143978161435b565b9050919050565b7f53616c6520697320706175736564202100000000000000000000000000000000600082015250565b60006143d4601083612fd4565b91506143df8261439e565b602082019050919050565b60006020820190508181036000830152614403816143c7565b9050919050565b7f5265717565737420746f6f206d75636820666f72206f6e652077616c6c65742060008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b6000614466602183612fd4565b91506144718261440a565b604082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f4d617820737570706c7920726561636865642021000000000000000000000000600082015250565b60006144d2601483612fd4565b91506144dd8261449c565b602082019050919050565b60006020820190508181036000830152614501816144c5565b9050919050565b60006145138261307b565b915061451e8361307b565b925082820261452c8161307b565b9150828204841483151761454357614542613e5e565b5b5092915050565b7f4e6f7420656e6f75676820455448202100000000000000000000000000000000600082015250565b6000614580601083612fd4565b915061458b8261454a565b602082019050919050565b600060208201905081810360008301526145af81614573565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614612602683612fd4565b915061461d826145b6565b604082019050919050565b6000602082019050818103600083015261464181614605565b9050919050565b600060408201905061465d6000830185613110565b61466a6020830184613110565b9392505050565b600081519050614680816131e2565b92915050565b60006020828403121561469c5761469b612f04565b5b60006146aa84828501614671565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006146e9602083612fd4565b91506146f4826146b3565b602082019050919050565b60006020820190508181036000830152614718816146dc565b9050919050565b600061472a8261307b565b91506147358361307b565b925082820390508181111561474d5761474c613e5e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147bc8261307b565b91506147c78361307b565b9250826147d7576147d6614782565b5b828204905092915050565b60006147ed8261307b565b91506147f88361307b565b92508261480857614807614782565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061483a82614813565b614844818561481e565b9350614854818560208601612fe5565b61485d8161300f565b840191505092915050565b600060808201905061487d6000830187613110565b61488a6020830186613110565b614897604083018561323b565b81810360608301526148a9818461482f565b905095945050505050565b6000815190506148c381612f3a565b92915050565b6000602082840312156148df576148de612f04565b5b60006148ed848285016148b4565b9150509291505056fea2646970667358221220880418037a03d48ffe73525ed28654c5eab990debf010603e9e7ad490feeb99c64736f6c63430008120033

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

000000000000000000000000ee762ceee6601991d4f30049e7916a387b38b1bf000000000000000000000000fca1671996d750b463bfea7b9ebce41dfdd149aa

-----Decoded View---------------
Arg [0] : team (address): 0xeE762CEee6601991d4F30049e7916A387b38b1BF
Arg [1] : _partner (address): 0xFCA1671996D750B463bFEa7b9EbcE41DfDD149aa

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ee762ceee6601991d4f30049e7916a387b38b1bf
Arg [1] : 000000000000000000000000fca1671996d750b463bfea7b9ebce41dfdd149aa


Deployed Bytecode Sourcemap

77343:8359:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80382:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34152:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40635:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79014:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78071:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83422:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29903:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79631:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83687:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77694:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77990:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81614:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84310:244;;;;;;;;;;;;;:::i;:::-;;74420:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79845:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80552:824;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77921:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84767:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78144:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35545:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84033:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81521:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31087:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;;;;;;;;;;;:::i;:::-;;83915:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81549:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83589:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34328:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77835:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82171:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78660:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80071:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84614:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84921:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78178:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85293:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84135:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82464:867;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77764:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78221:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41658:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78354:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80382:162;80476:4;80500:36;80524:11;80500:23;:36::i;:::-;80493:43;;80382:162;;;:::o;34152:100::-;34206:13;34239:5;34232:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34152:100;:::o;40635:218::-;40711:7;40736:16;40744:7;40736;:16::i;:::-;40731:64;;40761:34;;;;;;;;;;;;;;40731:64;40815:15;:24;40831:7;40815:24;;;;;;;;;;;:30;;;;;;;;;;;;40808:37;;40635:218;;;:::o;79014:157::-;79110:8;76202:30;76223:8;76202:20;:30::i;:::-;79131:32:::1;79145:8;79155:7;79131:13;:32::i;:::-;79014:157:::0;;;:::o;78071:28::-;;;;;;;;;;;;;:::o;83422:81::-;4511:13;:11;:13::i;:::-;83490:5:::1;83481:6;;:14;;;;;;;;;;;;;;;;;;83422:81:::0;:::o;29903:323::-;29964:7;30192:15;:13;:15::i;:::-;30177:12;;30161:13;;:28;:46;30154:53;;29903:323;:::o;79631:206::-;79732:4;75936:10;75928:18;;:4;:18;;;75924:83;;75963:32;75984:10;75963:20;:32::i;:::-;75924:83;79749:37:::1;79768:4;79774:2;79778:7;79749:18;:37::i;:::-;79797:32;79811:4;79817:2;79821:7;79797:13;:32::i;:::-;79631:206:::0;;;;:::o;83687:99::-;4511:13;:11;:13::i;:::-;83770:8:::1;83756:11;:22;;;;83687:99:::0;:::o;77694:25::-;;;;:::o;77990:32::-;;;;;;;;;;;;;:::o;81614:27::-;;;;:::o;84310:244::-;82115:7;;;;;;;;;;;82101:21;;:10;:21;;;82093:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;84395:1:::1;84370:21;:26:::0;84362:58:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;84432:12;84450:7;;;;;;;;;;;:12;;84470:21;84450:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84431:66;;;84519:7;84511:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;84351:203;84310:244::o:0;74420:143::-;67029:42;74420:143;:::o;79845:214::-;79950:4;75936:10;75928:18;;:4;:18;;;75924:83;;75963:32;75984:10;75963:20;:32::i;:::-;75924:83;79967:41:::1;79990:4;79996:2;80000:7;79967:22;:41::i;:::-;80019:32;80033:4;80039:2;80043:7;80019:13;:32::i;:::-;79845:214:::0;;;;:::o;80552:824::-;4511:13;:11;:13::i;:::-;80685:7:::1;:14;80664:10;:17;:35;80656:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;80753:18;80789:9:::0;80801:1:::1;80789:13;;80784:585;80808:10;:17;80804:1;:21;80784:585;;;80852:9;80847:511;80871:10;80882:1;80871:13;;;;;;;;:::i;:::-;;;;;;;;:20;80867:1;:24;80847:511;;;80917:17;80937:10;80948:1;80937:13;;;;;;;;:::i;:::-;;;;;;;;80951:1;80937:16;;;;;;;;:::i;:::-;;;;;;;;80917:36;;80972:13;80988:7;80996:1;80988:10;;;;;;;;:::i;:::-;;;;;;;;80972:26;;81017:23;81023:9;81034:5;81017;:23::i;:::-;81089:5;81059:15;:26;81075:9;81059:26;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;81118:13;81113:230;81145:5;81137;:13;81113:230;;;81197:19;:9;:17;:19::i;:::-;81184:32;;81239:12;:23;81252:9;81239:23;;;;;;;;;;;;;;;81268:10;81239:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81302:21;:9;:19;:21::i;:::-;81152:7;;;;;:::i;:::-;;;;81113:230;;;;80898:460;;80893:3;;;;;:::i;:::-;;;;80847:511;;;;80827:3;;;;;:::i;:::-;;;;80784:585;;;;80645:731;80552:824:::0;;:::o;77921:20::-;;;;;;;;;;;;;:::o;84767:94::-;4511:13;:11;:13::i;:::-;84848:5:::1;;84838:7;:15;;;;;;;:::i;:::-;;84767:94:::0;;:::o;78144:25::-;;;;;;;;;;;;;:::o;35545:152::-;35617:7;35660:27;35679:7;35660:18;:27::i;:::-;35637:52;;35545:152;;;:::o;84033:94::-;4511:13;:11;:13::i;:::-;84115:4:::1;84107:5;;:12;;;;;;;;;;;;;;;;;;84033:94:::0;:::o;81521:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31087:233::-;31159:7;31200:1;31183:19;;:5;:19;;;31179:60;;31211:28;;;;;;;;;;;;;;31179:60;25246:13;31257:18;:25;31276:5;31257:25;;;;;;;;;;;;;;;;:55;31250:62;;31087:233;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;83915:110::-;4511:13;:11;:13::i;:::-;84004::::1;83991:10;:26;;;;83915:110:::0;:::o;81549:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4625:87::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;83589:90::-;4511:13;:11;:13::i;:::-;83663:8:::1;83655:5;:16;;;;83589:90:::0;:::o;34328:104::-;34384:13;34417:7;34410:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34328:104;:::o;77835:33::-;;;;:::o;82171:102::-;82115:7;;;;;;;;;;;82101:21;;:10;:21;;;82093:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;82257:8:::1;82247:7;;:18;;;;;;;;;;;;;;;;;;82171:102:::0;:::o;78660:176::-;78764:8;76202:30;76223:8;76202:20;:30::i;:::-;78785:43:::1;78809:8;78819;78785:23;:43::i;:::-;78660:176:::0;;;:::o;80071:239::-;80195:4;75936:10;75928:18;;:4;:18;;;75924:83;;75963:32;75984:10;75963:20;:32::i;:::-;75924:83;80212:47:::1;80235:4;80241:2;80245:7;80254:4;80212:22;:47::i;:::-;80270:32;80284:4;80290:2;80294:7;80270:13;:32::i;:::-;80071:239:::0;;;;;:::o;84614:93::-;4511:13;:11;:13::i;:::-;84694:5:::1;84683:8;;:16;;;;;;;;;;;;;;;;;;84614:93:::0;:::o;84921:98::-;4511:13;:11;:13::i;:::-;85006:5:::1;;84994:9;:17;;;;;;;:::i;:::-;;84921:98:::0;;:::o;78178:30::-;;;;;;;;;;;;;:::o;85293:406::-;85366:13;85400:16;85408:7;85400;:16::i;:::-;85392:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;85494:5;85482:17;;:8;;;;;;;;;;;:17;;;85478:66;;85523:9;85516:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85478:66;85556:17;85576:10;:8;:10::i;:::-;85556:30;;85624:1;85610:3;85604:17;:21;:87;;;;;;;;;;;;;;;;;85652:3;85657:18;:7;:16;:18::i;:::-;85635:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85604:87;85597:94;;;85293:406;;;;:::o;84135:95::-;4511:13;:11;:13::i;:::-;84217:5:::1;84201:13;;:21;;;;;;;;;;;;;;;;;;84135:95:::0;:::o;82464:867::-;82578:11;;82591:9;81839:13;;;;;;;;;;;81835:193;;;81869:12;81911:9;81894:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;81884:38;;;;;;81869:53;;81945:49;81964:11;;81945:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81977:10;;81989:4;81945:18;:49::i;:::-;81937:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;81854:174;81835:193;82704:6:::1;;;;;;;;;;;82703:7;82695:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;82792:11;;82762:15;:26;82778:9;82762:26;;;;;;;;;;;;;;;;82751:8;:37;;;;:::i;:::-;:52;;82742:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;82890:9;;82872:14;:12;:14::i;:::-;82861:8;:25;;;;:::i;:::-;:38;;82852:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;82964:8;82956:5;;:16;;;;:::i;:::-;82943:9;:29;;82935:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;83006:26;83012:9;83023:8;83006:5;:26::i;:::-;83043:18;83077:13:::0;83093:1:::1;83077:17;;83072:201;83104:8;83096:5;:16;83072:201;;;83151:19;:9;:17;:19::i;:::-;83138:32;;83185:12;:23;83198:9;83185:23;;;;;;;;;;;;;;;83214:10;83185:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83240:21;:9;:19;:21::i;:::-;83114:7;;;;;:::i;:::-;;;;83072:201;;;;83315:8;83285:15;:26;83301:9;83285:26;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;82602:729;82464:867:::0;;;;;;;:::o;77764:28::-;;;;:::o;78221:123::-;78281:16;78317:12;:19;78330:5;78317:19;;;;;;;;;;;;;;;78310:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78221:123;;;:::o;41658:164::-;41755:4;41779:18;:25;41798:5;41779:25;;;;;;;;;;;;;;;:35;41805:8;41779:35;;;;;;;;;;;;;;;;;;;;;;;;;41772:42;;41658:164;;;;:::o;78354:118::-;78415:7;78442:15;:22;78458:5;78442:22;;;;;;;;;;;;;;;;78435:29;;78354:118;;;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;::::0;5612:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;33250:639::-;33335:4;33674:10;33659:25;;:11;:25;;;;:102;;;;33751:10;33736:25;;:11;:25;;;;33659:102;:179;;;;33828:10;33813:25;;:11;:25;;;;33659:179;33639:199;;33250:639;;;:::o;42080:282::-;42145:4;42201:7;42182:15;:13;:15::i;:::-;:26;;:66;;;;;42235:13;;42225:7;:23;42182:66;:153;;;;;42334:1;26022:8;42286:17;:26;42304:7;42286:26;;;;;;;;;;;;:44;:49;42182:153;42162:173;;42080:282;;;:::o;76345:647::-;76584:1;67029:42;76536:45;;;:49;76532:453;;;67029:42;76835;;;76886:4;76893:8;76835:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76830:144;;76949:8;76930:28;;;;;;;;;;;:::i;:::-;;;;;;;;76830:144;76532:453;76345:647;:::o;40076:400::-;40157:13;40173:16;40181:7;40173;:16::i;:::-;40157:32;;40229:5;40206:28;;:19;:17;:19::i;:::-;:28;;;40202:175;;40254:44;40271:5;40278:19;:17;:19::i;:::-;40254:16;:44::i;:::-;40249:128;;40326:35;;;;;;;;;;;;;;40249:128;40202:175;40422:2;40389:15;:24;40405:7;40389:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40460:7;40456:2;40440:28;;40449:5;40440:28;;;;;;;;;;;;40146:330;40076:400;;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;29419:92::-;29475:7;29419:92;:::o;44342:2817::-;44476:27;44506;44525:7;44506:18;:27::i;:::-;44476:57;;44591:4;44550:45;;44566:19;44550:45;;;44546:86;;44604:28;;;;;;;;;;;;;;44546:86;44646:27;44675:23;44702:35;44729:7;44702:26;:35::i;:::-;44645:92;;;;44837:68;44862:15;44879:4;44885:19;:17;:19::i;:::-;44837:24;:68::i;:::-;44832:180;;44925:43;44942:4;44948:19;:17;:19::i;:::-;44925:16;:43::i;:::-;44920:92;;44977:35;;;;;;;;;;;;;;44920:92;44832:180;45043:1;45029:16;;:2;:16;;;45025:52;;45054:23;;;;;;;;;;;;;;45025:52;45090:43;45112:4;45118:2;45122:7;45131:1;45090:21;:43::i;:::-;45226:15;45223:160;;;45366:1;45345:19;45338:30;45223:160;45763:18;:24;45782:4;45763:24;;;;;;;;;;;;;;;;45761:26;;;;;;;;;;;;45832:18;:22;45851:2;45832:22;;;;;;;;;;;;;;;;45830:24;;;;;;;;;;;46154:146;46191:2;46240:45;46255:4;46261:2;46265:19;46240:14;:45::i;:::-;26302:8;46212:73;46154:18;:146::i;:::-;46125:17;:26;46143:7;46125:26;;;;;;;;;;;:175;;;;46471:1;26302:8;46420:19;:47;:52;46416:627;;46493:19;46525:1;46515:7;:11;46493:33;;46682:1;46648:17;:30;46666:11;46648:30;;;;;;;;;;;;:35;46644:384;;46786:13;;46771:11;:28;46767:242;;46966:19;46933:17;:30;46951:11;46933:30;;;;;;;;;;;:52;;;;46767:242;46644:384;46474:569;46416:627;47090:7;47086:2;47071:27;;47080:4;47071:27;;;;;;;;;;;;47109:42;47130:4;47136:2;47140:7;47149:1;47109:20;:42::i;:::-;44465:2694;;;44342:2817;;;:::o;79179:440::-;79264:28;79295:12;:18;79308:4;79295:18;;;;;;;;;;;;;;;79264:49;;79329:9;79324:247;79348:10;:17;;;;79344:1;:21;79324:247;;;79408:7;79391:10;79402:1;79391:13;;;;;;;;:::i;:::-;;;;;;;;;;:24;79387:173;;79452:10;79483:1;79463:10;:17;;;;:21;;;;:::i;:::-;79452:33;;;;;;;;:::i;:::-;;;;;;;;;;79436:10;79447:1;79436:13;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;79504:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;79539:5;;79387:173;79367:3;;;;;:::i;:::-;;;;79324:247;;;;79581:12;:16;79594:2;79581:16;;;;;;;;;;;;;;;79603:7;79581:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79253:366;79179:440;;;:::o;47255:185::-;47393:39;47410:4;47416:2;47420:7;47393:39;;;;;;;;;;;;:16;:39::i;:::-;47255:185;;;:::o;51699:2454::-;51772:20;51795:13;;51772:36;;51835:1;51823:8;:13;51819:44;;51845:18;;;;;;;;;;;;;;51819:44;51876:61;51906:1;51910:2;51914:12;51928:8;51876:21;:61::i;:::-;52420:1;25384:2;52390:1;:26;;52389:32;52377:8;:45;52351:18;:22;52370:2;52351:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;52699:139;52736:2;52790:33;52813:1;52817:2;52821:1;52790:14;:33::i;:::-;52757:30;52778:8;52757:20;:30::i;:::-;:66;52699:18;:139::i;:::-;52665:17;:31;52683:12;52665:31;;;;;;;;;;;:173;;;;52855:16;52886:11;52915:8;52900:12;:23;52886:37;;53170:16;53166:2;53162:25;53150:37;;53542:12;53502:8;53461:1;53399:25;53340:1;53279;53252:335;53667:1;53653:12;53649:20;53607:346;53708:3;53699:7;53696:16;53607:346;;53926:7;53916:8;53913:1;53886:25;53883:1;53880;53875:59;53761:1;53752:7;53748:15;53737:26;;53607:346;;;53611:77;53998:1;53986:8;:13;53982:45;;54008:19;;;;;;;;;;;;;;53982:45;54060:3;54044:13;:19;;;;52125:1950;;54085:60;54114:1;54118:2;54122:12;54136:8;54085:20;:60::i;:::-;51761:2392;51699:2454;;:::o;66374:114::-;66439:7;66466;:14;;;66459:21;;66374:114;;;:::o;66496:127::-;66603:1;66585:7;:14;;;:19;;;;;;;;;;;66496:127;:::o;36700:1275::-;36767:7;36787:12;36802:7;36787:22;;36870:4;36851:15;:13;:15::i;:::-;:23;36847:1061;;36904:13;;36897:4;:20;36893:1015;;;36942:14;36959:17;:23;36977:4;36959:23;;;;;;;;;;;;36942:40;;37076:1;26022:8;37048:6;:24;:29;37044:845;;37713:113;37730:1;37720:6;:11;37713:113;;37773:17;:25;37791:6;;;;;;;37773:25;;;;;;;;;;;;37764:34;;37713:113;;;37859:6;37852:13;;;;;;37044:845;36919:989;36893:1015;36847:1061;37936:31;;;;;;;;;;;;;;36700:1275;;;;:::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5955:128;5892:191;:::o;41193:308::-;41304:19;:17;:19::i;:::-;41292:31;;:8;:31;;;41288:61;;41332:17;;;;;;;;;;;;;;41288:61;41414:8;41362:18;:39;41381:19;:17;:19::i;:::-;41362:39;;;;;;;;;;;;;;;:49;41402:8;41362:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;41474:8;41438:55;;41453:19;:17;:19::i;:::-;41438:55;;;41484:8;41438:55;;;;;;:::i;:::-;;;;;;;;41193:308;;:::o;48038:399::-;48205:31;48218:4;48224:2;48228:7;48205:12;:31::i;:::-;48269:1;48251:2;:14;;;:19;48247:183;;48290:56;48321:4;48327:2;48331:7;48340:5;48290:30;:56::i;:::-;48285:145;;48374:40;;;;;;;;;;;;;;48285:145;48247:183;48038:399;;;;:::o;85027:108::-;85087:13;85120:7;85113:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85027:108;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;7309:190::-;7434:4;7487;7458:25;7471:5;7478:4;7458:12;:25::i;:::-;:33;7451:40;;7309:190;;;;;:::o;30324:296::-;30379:7;30586:15;:13;:15::i;:::-;30570:13;;:31;30563:38;;30324:296;:::o;63846:105::-;63906:7;63933:10;63926:17;;63846:105;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;43243:479::-;43345:27;43374:23;43415:38;43456:15;:24;43472:7;43456:24;;;;;;;;;;;43415:65;;43627:18;43604:41;;43684:19;43678:26;43659:45;;43589:126;43243:479;;;:::o;42471:659::-;42620:11;42785:16;42778:5;42774:28;42765:37;;42945:16;42934:9;42930:32;42917:45;;43095:15;43084:9;43081:30;43073:5;43062:9;43059:20;43056:56;43046:66;;42471:659;;;;;:::o;49099:159::-;;;;;:::o;63155:311::-;63290:7;63310:16;26426:3;63336:19;:41;;63310:68;;26426:3;63404:31;63415:4;63421:2;63425:9;63404:10;:31::i;:::-;63396:40;;:62;;63389:69;;;63155:311;;;;;:::o;38523:450::-;38603:14;38771:16;38764:5;38760:28;38751:37;;38948:5;38934:11;38909:23;38905:41;38902:52;38895:5;38892:63;38882:73;;38523:450;;;;:::o;49923:158::-;;;;;:::o;39075:324::-;39145:14;39378:1;39368:8;39365:15;39339:24;39335:46;39325:56;;39075:324;;;:::o;50521:716::-;50684:4;50730:2;50705:45;;;50751:19;:17;:19::i;:::-;50772:4;50778:7;50787:5;50705:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50701:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51005:1;50988:6;:13;:18;50984:235;;51034:40;;;;;;;;;;;;;;50984:235;51177:6;51171:13;51162:6;51158:2;51154:15;51147:38;50701:529;50874:54;;;50864:64;;;:6;:64;;;;50857:71;;;50521:716;;;;;;:::o;8176:296::-;8259:7;8279:20;8302:4;8279:27;;8322:9;8317:118;8341:5;:12;8337:1;:16;8317:118;;;8390:33;8400:12;8414:5;8420:1;8414:8;;;;;;;;:::i;:::-;;;;;;;;8390:9;:33::i;:::-;8375:48;;8355:3;;;;;:::i;:::-;;;;8317:118;;;;8452:12;8445:19;;;8176:296;;;;:::o;62856:147::-;62993:6;62856:147;;;;;:::o;14383:149::-;14446:7;14477:1;14473;:5;:51;;14504:20;14519:1;14522;14504:14;:20::i;:::-;14473:51;;;14481:20;14496:1;14499;14481:14;:20::i;:::-;14473:51;14466:58;;14383:149;;;;:::o;14540:268::-;14608:13;14715:1;14709:4;14702:15;14744:1;14738:4;14731:15;14785:4;14779;14769:21;14760:30;;14540:268;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:104::-;4935:7;4964:24;4982:5;4964:24;:::i;:::-;4953:35;;4890:104;;;:::o;5000:142::-;5103:32;5129:5;5103:32;:::i;:::-;5098:3;5091:45;5000:142;;:::o;5148:254::-;5257:4;5295:2;5284:9;5280:18;5272:26;;5308:87;5392:1;5381:9;5377:17;5368:6;5308:87;:::i;:::-;5148:254;;;;:::o;5408:116::-;5478:21;5493:5;5478:21;:::i;:::-;5471:5;5468:32;5458:60;;5514:1;5511;5504:12;5458:60;5408:116;:::o;5530:133::-;5573:5;5611:6;5598:20;5589:29;;5627:30;5651:5;5627:30;:::i;:::-;5530:133;;;;:::o;5669:323::-;5725:6;5774:2;5762:9;5753:7;5749:23;5745:32;5742:119;;;5780:79;;:::i;:::-;5742:119;5900:1;5925:50;5967:7;5958:6;5947:9;5943:22;5925:50;:::i;:::-;5915:60;;5871:114;5669:323;;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:619::-;6427:6;6435;6443;6492:2;6480:9;6471:7;6467:23;6463:32;6460:119;;;6498:79;;:::i;:::-;6460:119;6618:1;6643:53;6688:7;6679:6;6668:9;6664:22;6643:53;:::i;:::-;6633:63;;6589:117;6745:2;6771:53;6816:7;6807:6;6796:9;6792:22;6771:53;:::i;:::-;6761:63;;6716:118;6873:2;6899:53;6944:7;6935:6;6924:9;6920:22;6899:53;:::i;:::-;6889:63;;6844:118;6350:619;;;;;:::o;6975:77::-;7012:7;7041:5;7030:16;;6975:77;;;:::o;7058:118::-;7145:24;7163:5;7145:24;:::i;:::-;7140:3;7133:37;7058:118;;:::o;7182:222::-;7275:4;7313:2;7302:9;7298:18;7290:26;;7326:71;7394:1;7383:9;7379:17;7370:6;7326:71;:::i;:::-;7182:222;;;;:::o;7410:60::-;7438:3;7459:5;7452:12;;7410:60;;;:::o;7476:142::-;7526:9;7559:53;7577:34;7586:24;7604:5;7586:24;:::i;:::-;7577:34;:::i;:::-;7559:53;:::i;:::-;7546:66;;7476:142;;;:::o;7624:126::-;7674:9;7707:37;7738:5;7707:37;:::i;:::-;7694:50;;7624:126;;;:::o;7756:158::-;7838:9;7871:37;7902:5;7871:37;:::i;:::-;7858:50;;7756:158;;;:::o;7920:195::-;8039:69;8102:5;8039:69;:::i;:::-;8034:3;8027:82;7920:195;;:::o;8121:286::-;8246:4;8284:2;8273:9;8269:18;8261:26;;8297:103;8397:1;8386:9;8382:17;8373:6;8297:103;:::i;:::-;8121:286;;;;:::o;8413:117::-;8522:1;8519;8512:12;8536:180;8584:77;8581:1;8574:88;8681:4;8678:1;8671:15;8705:4;8702:1;8695:15;8722:281;8805:27;8827:4;8805:27;:::i;:::-;8797:6;8793:40;8935:6;8923:10;8920:22;8899:18;8887:10;8884:34;8881:62;8878:88;;;8946:18;;:::i;:::-;8878:88;8986:10;8982:2;8975:22;8765:238;8722:281;;:::o;9009:129::-;9043:6;9070:20;;:::i;:::-;9060:30;;9099:33;9127:4;9119:6;9099:33;:::i;:::-;9009:129;;;:::o;9144:336::-;9246:4;9336:18;9328:6;9325:30;9322:56;;;9358:18;;:::i;:::-;9322:56;9408:4;9400:6;9396:17;9388:25;;9468:4;9462;9458:15;9450:23;;9144:336;;;:::o;9486:117::-;9595:1;9592;9585:12;9609:311;9686:4;9776:18;9768:6;9765:30;9762:56;;;9798:18;;:::i;:::-;9762:56;9848:4;9840:6;9836:17;9828:25;;9908:4;9902;9898:15;9890:23;;9609:311;;;:::o;9943:710::-;10039:5;10064:81;10080:64;10137:6;10080:64;:::i;:::-;10064:81;:::i;:::-;10055:90;;10165:5;10194:6;10187:5;10180:21;10228:4;10221:5;10217:16;10210:23;;10281:4;10273:6;10269:17;10261:6;10257:30;10310:3;10302:6;10299:15;10296:122;;;10329:79;;:::i;:::-;10296:122;10444:6;10427:220;10461:6;10456:3;10453:15;10427:220;;;10536:3;10565:37;10598:3;10586:10;10565:37;:::i;:::-;10560:3;10553:50;10632:4;10627:3;10623:14;10616:21;;10503:144;10487:4;10482:3;10478:14;10471:21;;10427:220;;;10431:21;10045:608;;9943:710;;;;;:::o;10676:370::-;10747:5;10796:3;10789:4;10781:6;10777:17;10773:27;10763:122;;10804:79;;:::i;:::-;10763:122;10921:6;10908:20;10946:94;11036:3;11028:6;11021:4;11013:6;11009:17;10946:94;:::i;:::-;10937:103;;10753:293;10676:370;;;;:::o;11071:990::-;11192:5;11217:106;11233:89;11315:6;11233:89;:::i;:::-;11217:106;:::i;:::-;11208:115;;11343:5;11372:6;11365:5;11358:21;11406:4;11399:5;11395:16;11388:23;;11459:4;11451:6;11447:17;11439:6;11435:30;11488:3;11480:6;11477:15;11474:122;;;11507:79;;:::i;:::-;11474:122;11622:6;11605:450;11639:6;11634:3;11631:15;11605:450;;;11728:3;11715:17;11764:18;11751:11;11748:35;11745:122;;;11786:79;;:::i;:::-;11745:122;11910:11;11902:6;11898:24;11948:62;12006:3;11994:10;11948:62;:::i;:::-;11943:3;11936:75;12040:4;12035:3;12031:14;12024:21;;11681:374;;11665:4;11660:3;11656:14;11649:21;;11605:450;;;11609:21;11198:863;;11071:990;;;;;:::o;12086:420::-;12182:5;12231:3;12224:4;12216:6;12212:17;12208:27;12198:122;;12239:79;;:::i;:::-;12198:122;12356:6;12343:20;12381:119;12496:3;12488:6;12481:4;12473:6;12469:17;12381:119;:::i;:::-;12372:128;;12188:318;12086:420;;;;:::o;12512:311::-;12589:4;12679:18;12671:6;12668:30;12665:56;;;12701:18;;:::i;:::-;12665:56;12751:4;12743:6;12739:17;12731:25;;12811:4;12805;12801:15;12793:23;;12512:311;;;:::o;12846:710::-;12942:5;12967:81;12983:64;13040:6;12983:64;:::i;:::-;12967:81;:::i;:::-;12958:90;;13068:5;13097:6;13090:5;13083:21;13131:4;13124:5;13120:16;13113:23;;13184:4;13176:6;13172:17;13164:6;13160:30;13213:3;13205:6;13202:15;13199:122;;;13232:79;;:::i;:::-;13199:122;13347:6;13330:220;13364:6;13359:3;13356:15;13330:220;;;13439:3;13468:37;13501:3;13489:10;13468:37;:::i;:::-;13463:3;13456:50;13535:4;13530:3;13526:14;13519:21;;13406:144;13390:4;13385:3;13381:14;13374:21;;13330:220;;;13334:21;12948:608;;12846:710;;;;;:::o;13579:370::-;13650:5;13699:3;13692:4;13684:6;13680:17;13676:27;13666:122;;13707:79;;:::i;:::-;13666:122;13824:6;13811:20;13849:94;13939:3;13931:6;13924:4;13916:6;13912:17;13849:94;:::i;:::-;13840:103;;13656:293;13579:370;;;;:::o;13955:944::-;14098:6;14106;14155:2;14143:9;14134:7;14130:23;14126:32;14123:119;;;14161:79;;:::i;:::-;14123:119;14309:1;14298:9;14294:17;14281:31;14339:18;14331:6;14328:30;14325:117;;;14361:79;;:::i;:::-;14325:117;14466:103;14561:7;14552:6;14541:9;14537:22;14466:103;:::i;:::-;14456:113;;14252:327;14646:2;14635:9;14631:18;14618:32;14677:18;14669:6;14666:30;14663:117;;;14699:79;;:::i;:::-;14663:117;14804:78;14874:7;14865:6;14854:9;14850:22;14804:78;:::i;:::-;14794:88;;14589:303;13955:944;;;;;:::o;14905:117::-;15014:1;15011;15004:12;15042:553;15100:8;15110:6;15160:3;15153:4;15145:6;15141:17;15137:27;15127:122;;15168:79;;:::i;:::-;15127:122;15281:6;15268:20;15258:30;;15311:18;15303:6;15300:30;15297:117;;;15333:79;;:::i;:::-;15297:117;15447:4;15439:6;15435:17;15423:29;;15501:3;15493:4;15485:6;15481:17;15471:8;15467:32;15464:41;15461:128;;;15508:79;;:::i;:::-;15461:128;15042:553;;;;;:::o;15601:529::-;15672:6;15680;15729:2;15717:9;15708:7;15704:23;15700:32;15697:119;;;15735:79;;:::i;:::-;15697:119;15883:1;15872:9;15868:17;15855:31;15913:18;15905:6;15902:30;15899:117;;;15935:79;;:::i;:::-;15899:117;16048:65;16105:7;16096:6;16085:9;16081:22;16048:65;:::i;:::-;16030:83;;;;15826:297;15601:529;;;;;:::o;16136:138::-;16217:32;16243:5;16217:32;:::i;:::-;16210:5;16207:43;16197:71;;16264:1;16261;16254:12;16197:71;16136:138;:::o;16280:155::-;16334:5;16372:6;16359:20;16350:29;;16388:41;16423:5;16388:41;:::i;:::-;16280:155;;;;:::o;16441:345::-;16508:6;16557:2;16545:9;16536:7;16532:23;16528:32;16525:119;;;16563:79;;:::i;:::-;16525:119;16683:1;16708:61;16761:7;16752:6;16741:9;16737:22;16708:61;:::i;:::-;16698:71;;16654:125;16441:345;;;;:::o;16792:329::-;16851:6;16900:2;16888:9;16879:7;16875:23;16871:32;16868:119;;;16906:79;;:::i;:::-;16868:119;17026:1;17051:53;17096:7;17087:6;17076:9;17072:22;17051:53;:::i;:::-;17041:63;;16997:117;16792:329;;;;:::o;17127:122::-;17200:24;17218:5;17200:24;:::i;:::-;17193:5;17190:35;17180:63;;17239:1;17236;17229:12;17180:63;17127:122;:::o;17255:139::-;17301:5;17339:6;17326:20;17317:29;;17355:33;17382:5;17355:33;:::i;:::-;17255:139;;;;:::o;17400:329::-;17459:6;17508:2;17496:9;17487:7;17483:23;17479:32;17476:119;;;17514:79;;:::i;:::-;17476:119;17634:1;17659:53;17704:7;17695:6;17684:9;17680:22;17659:53;:::i;:::-;17649:63;;17605:117;17400:329;;;;:::o;17735:468::-;17800:6;17808;17857:2;17845:9;17836:7;17832:23;17828:32;17825:119;;;17863:79;;:::i;:::-;17825:119;17983:1;18008:53;18053:7;18044:6;18033:9;18029:22;18008:53;:::i;:::-;17998:63;;17954:117;18110:2;18136:50;18178:7;18169:6;18158:9;18154:22;18136:50;:::i;:::-;18126:60;;18081:115;17735:468;;;;;:::o;18209:117::-;18318:1;18315;18308:12;18332:307;18393:4;18483:18;18475:6;18472:30;18469:56;;;18505:18;;:::i;:::-;18469:56;18543:29;18565:6;18543:29;:::i;:::-;18535:37;;18627:4;18621;18617:15;18609:23;;18332:307;;;:::o;18645:146::-;18742:6;18737:3;18732;18719:30;18783:1;18774:6;18769:3;18765:16;18758:27;18645:146;;;:::o;18797:423::-;18874:5;18899:65;18915:48;18956:6;18915:48;:::i;:::-;18899:65;:::i;:::-;18890:74;;18987:6;18980:5;18973:21;19025:4;19018:5;19014:16;19063:3;19054:6;19049:3;19045:16;19042:25;19039:112;;;19070:79;;:::i;:::-;19039:112;19160:54;19207:6;19202:3;19197;19160:54;:::i;:::-;18880:340;18797:423;;;;;:::o;19239:338::-;19294:5;19343:3;19336:4;19328:6;19324:17;19320:27;19310:122;;19351:79;;:::i;:::-;19310:122;19468:6;19455:20;19493:78;19567:3;19559:6;19552:4;19544:6;19540:17;19493:78;:::i;:::-;19484:87;;19300:277;19239:338;;;;:::o;19583:943::-;19678:6;19686;19694;19702;19751:3;19739:9;19730:7;19726:23;19722:33;19719:120;;;19758:79;;:::i;:::-;19719:120;19878:1;19903:53;19948:7;19939:6;19928:9;19924:22;19903:53;:::i;:::-;19893:63;;19849:117;20005:2;20031:53;20076:7;20067:6;20056:9;20052:22;20031:53;:::i;:::-;20021:63;;19976:118;20133:2;20159:53;20204:7;20195:6;20184:9;20180:22;20159:53;:::i;:::-;20149:63;;20104:118;20289:2;20278:9;20274:18;20261:32;20320:18;20312:6;20309:30;20306:117;;;20342:79;;:::i;:::-;20306:117;20447:62;20501:7;20492:6;20481:9;20477:22;20447:62;:::i;:::-;20437:72;;20232:287;19583:943;;;;;;;:::o;20549:568::-;20622:8;20632:6;20682:3;20675:4;20667:6;20663:17;20659:27;20649:122;;20690:79;;:::i;:::-;20649:122;20803:6;20790:20;20780:30;;20833:18;20825:6;20822:30;20819:117;;;20855:79;;:::i;:::-;20819:117;20969:4;20961:6;20957:17;20945:29;;21023:3;21015:4;21007:6;21003:17;20993:8;20989:32;20986:41;20983:128;;;21030:79;;:::i;:::-;20983:128;20549:568;;;;;:::o;21123:849::-;21227:6;21235;21243;21251;21300:2;21288:9;21279:7;21275:23;21271:32;21268:119;;;21306:79;;:::i;:::-;21268:119;21426:1;21451:53;21496:7;21487:6;21476:9;21472:22;21451:53;:::i;:::-;21441:63;;21397:117;21581:2;21570:9;21566:18;21553:32;21612:18;21604:6;21601:30;21598:117;;;21634:79;;:::i;:::-;21598:117;21747:80;21819:7;21810:6;21799:9;21795:22;21747:80;:::i;:::-;21729:98;;;;21524:313;21876:2;21902:53;21947:7;21938:6;21927:9;21923:22;21902:53;:::i;:::-;21892:63;;21847:118;21123:849;;;;;;;:::o;21978:114::-;22045:6;22079:5;22073:12;22063:22;;21978:114;;;:::o;22098:184::-;22197:11;22231:6;22226:3;22219:19;22271:4;22266:3;22262:14;22247:29;;22098:184;;;;:::o;22288:132::-;22355:4;22378:3;22370:11;;22408:4;22403:3;22399:14;22391:22;;22288:132;;;:::o;22426:108::-;22503:24;22521:5;22503:24;:::i;:::-;22498:3;22491:37;22426:108;;:::o;22540:179::-;22609:10;22630:46;22672:3;22664:6;22630:46;:::i;:::-;22708:4;22703:3;22699:14;22685:28;;22540:179;;;;:::o;22725:113::-;22795:4;22827;22822:3;22818:14;22810:22;;22725:113;;;:::o;22874:732::-;22993:3;23022:54;23070:5;23022:54;:::i;:::-;23092:86;23171:6;23166:3;23092:86;:::i;:::-;23085:93;;23202:56;23252:5;23202:56;:::i;:::-;23281:7;23312:1;23297:284;23322:6;23319:1;23316:13;23297:284;;;23398:6;23392:13;23425:63;23484:3;23469:13;23425:63;:::i;:::-;23418:70;;23511:60;23564:6;23511:60;:::i;:::-;23501:70;;23357:224;23344:1;23341;23337:9;23332:14;;23297:284;;;23301:14;23597:3;23590:10;;22998:608;;;22874:732;;;;:::o;23612:373::-;23755:4;23793:2;23782:9;23778:18;23770:26;;23842:9;23836:4;23832:20;23828:1;23817:9;23813:17;23806:47;23870:108;23973:4;23964:6;23870:108;:::i;:::-;23862:116;;23612:373;;;;:::o;23991:474::-;24059:6;24067;24116:2;24104:9;24095:7;24091:23;24087:32;24084:119;;;24122:79;;:::i;:::-;24084:119;24242:1;24267:53;24312:7;24303:6;24292:9;24288:22;24267:53;:::i;:::-;24257:63;;24213:117;24369:2;24395:53;24440:7;24431:6;24420:9;24416:22;24395:53;:::i;:::-;24385:63;;24340:118;23991:474;;;;;:::o;24471:180::-;24519:77;24516:1;24509:88;24616:4;24613:1;24606:15;24640:4;24637:1;24630:15;24657:320;24701:6;24738:1;24732:4;24728:12;24718:22;;24785:1;24779:4;24775:12;24806:18;24796:81;;24862:4;24854:6;24850:17;24840:27;;24796:81;24924:2;24916:6;24913:14;24893:18;24890:38;24887:84;;24943:18;;:::i;:::-;24887:84;24708:269;24657:320;;;:::o;24983:164::-;25123:16;25119:1;25111:6;25107:14;25100:40;24983:164;:::o;25153:366::-;25295:3;25316:67;25380:2;25375:3;25316:67;:::i;:::-;25309:74;;25392:93;25481:3;25392:93;:::i;:::-;25510:2;25505:3;25501:12;25494:19;;25153:366;;;:::o;25525:419::-;25691:4;25729:2;25718:9;25714:18;25706:26;;25778:9;25772:4;25768:20;25764:1;25753:9;25749:17;25742:47;25806:131;25932:4;25806:131;:::i;:::-;25798:139;;25525:419;;;:::o;25950:169::-;26090:21;26086:1;26078:6;26074:14;26067:45;25950:169;:::o;26125:366::-;26267:3;26288:67;26352:2;26347:3;26288:67;:::i;:::-;26281:74;;26364:93;26453:3;26364:93;:::i;:::-;26482:2;26477:3;26473:12;26466:19;;26125:366;;;:::o;26497:419::-;26663:4;26701:2;26690:9;26686:18;26678:26;;26750:9;26744:4;26740:20;26736:1;26725:9;26721:17;26714:47;26778:131;26904:4;26778:131;:::i;:::-;26770:139;;26497:419;;;:::o;26922:147::-;27023:11;27060:3;27045:18;;26922:147;;;;:::o;27075:114::-;;:::o;27195:398::-;27354:3;27375:83;27456:1;27451:3;27375:83;:::i;:::-;27368:90;;27467:93;27556:3;27467:93;:::i;:::-;27585:1;27580:3;27576:11;27569:18;;27195:398;;;:::o;27599:379::-;27783:3;27805:147;27948:3;27805:147;:::i;:::-;27798:154;;27969:3;27962:10;;27599:379;;;:::o;27984:165::-;28124:17;28120:1;28112:6;28108:14;28101:41;27984:165;:::o;28155:366::-;28297:3;28318:67;28382:2;28377:3;28318:67;:::i;:::-;28311:74;;28394:93;28483:3;28394:93;:::i;:::-;28512:2;28507:3;28503:12;28496:19;;28155:366;;;:::o;28527:419::-;28693:4;28731:2;28720:9;28716:18;28708:26;;28780:9;28774:4;28770:20;28766:1;28755:9;28751:17;28744:47;28808:131;28934:4;28808:131;:::i;:::-;28800:139;;28527:419;;;:::o;28952:225::-;29092:34;29088:1;29080:6;29076:14;29069:58;29161:8;29156:2;29148:6;29144:15;29137:33;28952:225;:::o;29183:366::-;29325:3;29346:67;29410:2;29405:3;29346:67;:::i;:::-;29339:74;;29422:93;29511:3;29422:93;:::i;:::-;29540:2;29535:3;29531:12;29524:19;;29183:366;;;:::o;29555:419::-;29721:4;29759:2;29748:9;29744:18;29736:26;;29808:9;29802:4;29798:20;29794:1;29783:9;29779:17;29772:47;29836:131;29962:4;29836:131;:::i;:::-;29828:139;;29555:419;;;:::o;29980:180::-;30028:77;30025:1;30018:88;30125:4;30122:1;30115:15;30149:4;30146:1;30139:15;30166:180;30214:77;30211:1;30204:88;30311:4;30308:1;30301:15;30335:4;30332:1;30325:15;30352:191;30392:3;30411:20;30429:1;30411:20;:::i;:::-;30406:25;;30445:20;30463:1;30445:20;:::i;:::-;30440:25;;30488:1;30485;30481:9;30474:16;;30509:3;30506:1;30503:10;30500:36;;;30516:18;;:::i;:::-;30500:36;30352:191;;;;:::o;30549:233::-;30588:3;30611:24;30629:5;30611:24;:::i;:::-;30602:33;;30657:66;30650:5;30647:77;30644:103;;30727:18;;:::i;:::-;30644:103;30774:1;30767:5;30763:13;30756:20;;30549:233;;;:::o;30788:97::-;30847:6;30875:3;30865:13;;30788:97;;;;:::o;30891:141::-;30940:4;30963:3;30955:11;;30986:3;30983:1;30976:14;31020:4;31017:1;31007:18;30999:26;;30891:141;;;:::o;31038:93::-;31075:6;31122:2;31117;31110:5;31106:14;31102:23;31092:33;;31038:93;;;:::o;31137:107::-;31181:8;31231:5;31225:4;31221:16;31200:37;;31137:107;;;;:::o;31250:393::-;31319:6;31369:1;31357:10;31353:18;31392:97;31422:66;31411:9;31392:97;:::i;:::-;31510:39;31540:8;31529:9;31510:39;:::i;:::-;31498:51;;31582:4;31578:9;31571:5;31567:21;31558:30;;31631:4;31621:8;31617:19;31610:5;31607:30;31597:40;;31326:317;;31250:393;;;;;:::o;31649:142::-;31699:9;31732:53;31750:34;31759:24;31777:5;31759:24;:::i;:::-;31750:34;:::i;:::-;31732:53;:::i;:::-;31719:66;;31649:142;;;:::o;31797:75::-;31840:3;31861:5;31854:12;;31797:75;;;:::o;31878:269::-;31988:39;32019:7;31988:39;:::i;:::-;32049:91;32098:41;32122:16;32098:41;:::i;:::-;32090:6;32083:4;32077:11;32049:91;:::i;:::-;32043:4;32036:105;31954:193;31878:269;;;:::o;32153:73::-;32198:3;32153:73;:::o;32232:189::-;32309:32;;:::i;:::-;32350:65;32408:6;32400;32394:4;32350:65;:::i;:::-;32285:136;32232:189;;:::o;32427:186::-;32487:120;32504:3;32497:5;32494:14;32487:120;;;32558:39;32595:1;32588:5;32558:39;:::i;:::-;32531:1;32524:5;32520:13;32511:22;;32487:120;;;32427:186;;:::o;32619:543::-;32720:2;32715:3;32712:11;32709:446;;;32754:38;32786:5;32754:38;:::i;:::-;32838:29;32856:10;32838:29;:::i;:::-;32828:8;32824:44;33021:2;33009:10;33006:18;33003:49;;;33042:8;33027:23;;33003:49;33065:80;33121:22;33139:3;33121:22;:::i;:::-;33111:8;33107:37;33094:11;33065:80;:::i;:::-;32724:431;;32709:446;32619:543;;;:::o;33168:117::-;33222:8;33272:5;33266:4;33262:16;33241:37;;33168:117;;;;:::o;33291:169::-;33335:6;33368:51;33416:1;33412:6;33404:5;33401:1;33397:13;33368:51;:::i;:::-;33364:56;33449:4;33443;33439:15;33429:25;;33342:118;33291:169;;;;:::o;33465:295::-;33541:4;33687:29;33712:3;33706:4;33687:29;:::i;:::-;33679:37;;33749:3;33746:1;33742:11;33736:4;33733:21;33725:29;;33465:295;;;;:::o;33765:1403::-;33889:44;33929:3;33924;33889:44;:::i;:::-;33998:18;33990:6;33987:30;33984:56;;;34020:18;;:::i;:::-;33984:56;34064:38;34096:4;34090:11;34064:38;:::i;:::-;34149:67;34209:6;34201;34195:4;34149:67;:::i;:::-;34243:1;34272:2;34264:6;34261:14;34289:1;34284:632;;;;34960:1;34977:6;34974:84;;;35033:9;35028:3;35024:19;35011:33;35002:42;;34974:84;35084:67;35144:6;35137:5;35084:67;:::i;:::-;35078:4;35071:81;34933:229;34254:908;;34284:632;34336:4;34332:9;34324:6;34320:22;34370:37;34402:4;34370:37;:::i;:::-;34429:1;34443:215;34457:7;34454:1;34451:14;34443:215;;;34543:9;34538:3;34534:19;34521:33;34513:6;34506:49;34594:1;34586:6;34582:14;34572:24;;34641:2;34630:9;34626:18;34613:31;;34480:4;34477:1;34473:12;34468:17;;34443:215;;;34686:6;34677:7;34674:19;34671:186;;;34751:9;34746:3;34742:19;34729:33;34794:48;34836:4;34828:6;34824:17;34813:9;34794:48;:::i;:::-;34786:6;34779:64;34694:163;34671:186;34903:1;34899;34891:6;34887:14;34883:22;34877:4;34870:36;34291:625;;;34254:908;;33864:1304;;;33765:1403;;;:::o;35174:234::-;35314:34;35310:1;35302:6;35298:14;35291:58;35383:17;35378:2;35370:6;35366:15;35359:42;35174:234;:::o;35414:366::-;35556:3;35577:67;35641:2;35636:3;35577:67;:::i;:::-;35570:74;;35653:93;35742:3;35653:93;:::i;:::-;35771:2;35766:3;35762:12;35755:19;;35414:366;;;:::o;35786:419::-;35952:4;35990:2;35979:9;35975:18;35967:26;;36039:9;36033:4;36029:20;36025:1;36014:9;36010:17;36003:47;36067:131;36193:4;36067:131;:::i;:::-;36059:139;;35786:419;;;:::o;36211:148::-;36313:11;36350:3;36335:18;;36211:148;;;;:::o;36365:390::-;36471:3;36499:39;36532:5;36499:39;:::i;:::-;36554:89;36636:6;36631:3;36554:89;:::i;:::-;36547:96;;36652:65;36710:6;36705:3;36698:4;36691:5;36687:16;36652:65;:::i;:::-;36742:6;36737:3;36733:16;36726:23;;36475:280;36365:390;;;;:::o;36761:155::-;36901:7;36897:1;36889:6;36885:14;36878:31;36761:155;:::o;36922:400::-;37082:3;37103:84;37185:1;37180:3;37103:84;:::i;:::-;37096:91;;37196:93;37285:3;37196:93;:::i;:::-;37314:1;37309:3;37305:11;37298:18;;36922:400;;;:::o;37328:701::-;37609:3;37631:95;37722:3;37713:6;37631:95;:::i;:::-;37624:102;;37743:95;37834:3;37825:6;37743:95;:::i;:::-;37736:102;;37855:148;37999:3;37855:148;:::i;:::-;37848:155;;38020:3;38013:10;;37328:701;;;;;:::o;38035:94::-;38068:8;38116:5;38112:2;38108:14;38087:35;;38035:94;;;:::o;38135:::-;38174:7;38203:20;38217:5;38203:20;:::i;:::-;38192:31;;38135:94;;;:::o;38235:100::-;38274:7;38303:26;38323:5;38303:26;:::i;:::-;38292:37;;38235:100;;;:::o;38341:157::-;38446:45;38466:24;38484:5;38466:24;:::i;:::-;38446:45;:::i;:::-;38441:3;38434:58;38341:157;;:::o;38504:256::-;38616:3;38631:75;38702:3;38693:6;38631:75;:::i;:::-;38731:2;38726:3;38722:12;38715:19;;38751:3;38744:10;;38504:256;;;;:::o;38766:167::-;38906:19;38902:1;38894:6;38890:14;38883:43;38766:167;:::o;38939:366::-;39081:3;39102:67;39166:2;39161:3;39102:67;:::i;:::-;39095:74;;39178:93;39267:3;39178:93;:::i;:::-;39296:2;39291:3;39287:12;39280:19;;38939:366;;;:::o;39311:419::-;39477:4;39515:2;39504:9;39500:18;39492:26;;39564:9;39558:4;39554:20;39550:1;39539:9;39535:17;39528:47;39592:131;39718:4;39592:131;:::i;:::-;39584:139;;39311:419;;;:::o;39736:166::-;39876:18;39872:1;39864:6;39860:14;39853:42;39736:166;:::o;39908:366::-;40050:3;40071:67;40135:2;40130:3;40071:67;:::i;:::-;40064:74;;40147:93;40236:3;40147:93;:::i;:::-;40265:2;40260:3;40256:12;40249:19;;39908:366;;;:::o;40280:419::-;40446:4;40484:2;40473:9;40469:18;40461:26;;40533:9;40527:4;40523:20;40519:1;40508:9;40504:17;40497:47;40561:131;40687:4;40561:131;:::i;:::-;40553:139;;40280:419;;;:::o;40705:220::-;40845:34;40841:1;40833:6;40829:14;40822:58;40914:3;40909:2;40901:6;40897:15;40890:28;40705:220;:::o;40931:366::-;41073:3;41094:67;41158:2;41153:3;41094:67;:::i;:::-;41087:74;;41170:93;41259:3;41170:93;:::i;:::-;41288:2;41283:3;41279:12;41272:19;;40931:366;;;:::o;41303:419::-;41469:4;41507:2;41496:9;41492:18;41484:26;;41556:9;41550:4;41546:20;41542:1;41531:9;41527:17;41520:47;41584:131;41710:4;41584:131;:::i;:::-;41576:139;;41303:419;;;:::o;41728:170::-;41868:22;41864:1;41856:6;41852:14;41845:46;41728:170;:::o;41904:366::-;42046:3;42067:67;42131:2;42126:3;42067:67;:::i;:::-;42060:74;;42143:93;42232:3;42143:93;:::i;:::-;42261:2;42256:3;42252:12;42245:19;;41904:366;;;:::o;42276:419::-;42442:4;42480:2;42469:9;42465:18;42457:26;;42529:9;42523:4;42519:20;42515:1;42504:9;42500:17;42493:47;42557:131;42683:4;42557:131;:::i;:::-;42549:139;;42276:419;;;:::o;42701:410::-;42741:7;42764:20;42782:1;42764:20;:::i;:::-;42759:25;;42798:20;42816:1;42798:20;:::i;:::-;42793:25;;42853:1;42850;42846:9;42875:30;42893:11;42875:30;:::i;:::-;42864:41;;43054:1;43045:7;43041:15;43038:1;43035:22;43015:1;43008:9;42988:83;42965:139;;43084:18;;:::i;:::-;42965:139;42749:362;42701:410;;;;:::o;43117:166::-;43257:18;43253:1;43245:6;43241:14;43234:42;43117:166;:::o;43289:366::-;43431:3;43452:67;43516:2;43511:3;43452:67;:::i;:::-;43445:74;;43528:93;43617:3;43528:93;:::i;:::-;43646:2;43641:3;43637:12;43630:19;;43289:366;;;:::o;43661:419::-;43827:4;43865:2;43854:9;43850:18;43842:26;;43914:9;43908:4;43904:20;43900:1;43889:9;43885:17;43878:47;43942:131;44068:4;43942:131;:::i;:::-;43934:139;;43661:419;;;:::o;44086:225::-;44226:34;44222:1;44214:6;44210:14;44203:58;44295:8;44290:2;44282:6;44278:15;44271:33;44086:225;:::o;44317:366::-;44459:3;44480:67;44544:2;44539:3;44480:67;:::i;:::-;44473:74;;44556:93;44645:3;44556:93;:::i;:::-;44674:2;44669:3;44665:12;44658:19;;44317:366;;;:::o;44689:419::-;44855:4;44893:2;44882:9;44878:18;44870:26;;44942:9;44936:4;44932:20;44928:1;44917:9;44913:17;44906:47;44970:131;45096:4;44970:131;:::i;:::-;44962:139;;44689:419;;;:::o;45114:332::-;45235:4;45273:2;45262:9;45258:18;45250:26;;45286:71;45354:1;45343:9;45339:17;45330:6;45286:71;:::i;:::-;45367:72;45435:2;45424:9;45420:18;45411:6;45367:72;:::i;:::-;45114:332;;;;;:::o;45452:137::-;45506:5;45537:6;45531:13;45522:22;;45553:30;45577:5;45553:30;:::i;:::-;45452:137;;;;:::o;45595:345::-;45662:6;45711:2;45699:9;45690:7;45686:23;45682:32;45679:119;;;45717:79;;:::i;:::-;45679:119;45837:1;45862:61;45915:7;45906:6;45895:9;45891:22;45862:61;:::i;:::-;45852:71;;45808:125;45595:345;;;;:::o;45946:182::-;46086:34;46082:1;46074:6;46070:14;46063:58;45946:182;:::o;46134:366::-;46276:3;46297:67;46361:2;46356:3;46297:67;:::i;:::-;46290:74;;46373:93;46462:3;46373:93;:::i;:::-;46491:2;46486:3;46482:12;46475:19;;46134:366;;;:::o;46506:419::-;46672:4;46710:2;46699:9;46695:18;46687:26;;46759:9;46753:4;46749:20;46745:1;46734:9;46730:17;46723:47;46787:131;46913:4;46787:131;:::i;:::-;46779:139;;46506:419;;;:::o;46931:194::-;46971:4;46991:20;47009:1;46991:20;:::i;:::-;46986:25;;47025:20;47043:1;47025:20;:::i;:::-;47020:25;;47069:1;47066;47062:9;47054:17;;47093:1;47087:4;47084:11;47081:37;;;47098:18;;:::i;:::-;47081:37;46931:194;;;;:::o;47131:180::-;47179:77;47176:1;47169:88;47276:4;47273:1;47266:15;47300:4;47297:1;47290:15;47317:180;47365:77;47362:1;47355:88;47462:4;47459:1;47452:15;47486:4;47483:1;47476:15;47503:185;47543:1;47560:20;47578:1;47560:20;:::i;:::-;47555:25;;47594:20;47612:1;47594:20;:::i;:::-;47589:25;;47633:1;47623:35;;47638:18;;:::i;:::-;47623:35;47680:1;47677;47673:9;47668:14;;47503:185;;;;:::o;47694:176::-;47726:1;47743:20;47761:1;47743:20;:::i;:::-;47738:25;;47777:20;47795:1;47777:20;:::i;:::-;47772:25;;47816:1;47806:35;;47821:18;;:::i;:::-;47806:35;47862:1;47859;47855:9;47850:14;;47694:176;;;;:::o;47876:98::-;47927:6;47961:5;47955:12;47945:22;;47876:98;;;:::o;47980:168::-;48063:11;48097:6;48092:3;48085:19;48137:4;48132:3;48128:14;48113:29;;47980:168;;;;:::o;48154:373::-;48240:3;48268:38;48300:5;48268:38;:::i;:::-;48322:70;48385:6;48380:3;48322:70;:::i;:::-;48315:77;;48401:65;48459:6;48454:3;48447:4;48440:5;48436:16;48401:65;:::i;:::-;48491:29;48513:6;48491:29;:::i;:::-;48486:3;48482:39;48475:46;;48244:283;48154:373;;;;:::o;48533:640::-;48728:4;48766:3;48755:9;48751:19;48743:27;;48780:71;48848:1;48837:9;48833:17;48824:6;48780:71;:::i;:::-;48861:72;48929:2;48918:9;48914:18;48905:6;48861:72;:::i;:::-;48943;49011:2;49000:9;48996:18;48987:6;48943:72;:::i;:::-;49062:9;49056:4;49052:20;49047:2;49036:9;49032:18;49025:48;49090:76;49161:4;49152:6;49090:76;:::i;:::-;49082:84;;48533:640;;;;;;;:::o;49179:141::-;49235:5;49266:6;49260:13;49251:22;;49282:32;49308:5;49282:32;:::i;:::-;49179:141;;;;:::o;49326:349::-;49395:6;49444:2;49432:9;49423:7;49419:23;49415:32;49412:119;;;49450:79;;:::i;:::-;49412:119;49570:1;49595:63;49650:7;49641:6;49630:9;49626:22;49595:63;:::i;:::-;49585:73;;49541:127;49326:349;;;;:::o

Swarm Source

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