ETH Price: $2,494.49 (-0.97%)

Token

Supreme Bones X (SBX)
 

Overview

Max Total Supply

8,888 SBX

Holders

1,365

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
10 SBX
0x7f6ceda3114bf972e504585a92836b69b41e1e48
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:
SupremeMinter

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-24
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));
        address approvedAddress = _tokenApprovals[tokenId];

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            delete _tokenApprovals[tokenId];
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/extensions/IERC721AQueryable.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/extensions/ERC721AQueryable.sol


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

pragma solidity ^0.8.4;



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

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

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

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

// File: contracts/NFT.sol


pragma solidity 0.8.14;






contract SupremeMinter is ERC721AQueryable, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "METADATA";
  string public uriSuffix = ".json";
  string public _contractURI = "";
  string public hiddenMetadataUri;

  uint256 public baseCost = 0.03 ether;
  uint256 public cost = baseCost;

  uint256 public maxSupply = 8889;
  uint256 public maxMintAmountPerTx = 11; //10

  bool public paused = true;
  bool public revealed = false;
  bool public whitelistPhase = true;
  
  uint256 public walletLimit = 0;

  uint256 public maxWalletLimitWL = 3; //2
  uint256 public maxWalletLimitPL = 11; //10

  uint256 public freeMintLimit = 2222; // When do we switch from Free to Paid: 2222

  mapping (address => uint256) public alreadyMinted;

// MERKEL TREE STUFF
  bytes32 public merkleRoot = 0x29d49e683bd7a8fbb6cd36773fb395d3ce290f2725a55ca497ad4378e9d62f3f;
  
  constructor() ERC721A("Supreme Bones X", "SBX") {
    _startTokenId();
    setHiddenMetadataUri("https://www.supremebonesx.io/hiddenMeta.json");
    setContractURI("https://www.supremesbonesx.io/sbxcontract.json");
  }

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

  modifier mintCompliance (uint256 _mintAmount) {

    require(!paused, "Minting is PAUSED!");
    require(_mintAmount > 0 && _mintAmount < maxMintAmountPerTx, "Invalid mint amount!");
    require(msg.sender == tx.origin, "No Bots!");
    require(totalSupply() + _mintAmount < maxSupply, "Max supply exceeded!");
    
    if (totalSupply() < freeMintLimit) //2222
    { walletLimit = maxWalletLimitWL; }
    else
    { walletLimit = maxWalletLimitPL; }

    if (totalSupply() < freeMintLimit && totalSupply() + _mintAmount > freeMintLimit)
    {
      uint256 overflow = totalSupply() + _mintAmount - freeMintLimit;
      cost = baseCost * overflow;
    }
    else if (totalSupply() + _mintAmount > freeMintLimit)
    {
      cost = baseCost * _mintAmount;
    }
    else if (totalSupply() + _mintAmount <= freeMintLimit)
    {
      cost = 0;
    }

    require(msg.value >= cost, "Insufficient funds!");
    require(alreadyMinted[msg.sender] + _mintAmount < walletLimit, "Max Mints Per Wallet Reached!");

    _;
  }

  function setMerkleRoot(bytes32 newMerkleRoot) external onlyOwner
  {
    merkleRoot = newMerkleRoot;
  }

  function getAlreadyMinted(address a) public view returns (uint256)
  {
    return alreadyMinted[a];
  }

  function getWhitelistState() public view returns (bool)
  {
    return whitelistPhase;
  }

  function getFreeMint() public view returns (uint256)
  {
    return freeMintLimit;
  }

  function getMaxWalletLimitWL() public view returns (uint256)
  {
    return maxWalletLimitWL;
  }

  function getMaxWalletLimitPL() public view returns (uint256)
  {
    return maxWalletLimitPL;
  }

  function getPausedState() public view returns (bool)
  {
    return paused;
  }

  function getTotalSupply() public view returns (uint256)
  {
    return totalSupply();
  }

  function whitelistMint(bytes32[] calldata _merkleProof, uint256 _mintAmount) external mintCompliance(_mintAmount) payable
  {
    if (whitelistPhase)
    {
      bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

      require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Not on the Whitelist");
      require(keccak256(abi.encodePacked(msg.sender)) == leaf, "Naughty Naughty!");

      alreadyMinted[msg.sender] += _mintAmount;
      _safeMint(msg.sender, _mintAmount);
    }
    else if (!whitelistPhase)
    {
      alreadyMinted[msg.sender] += _mintAmount;
      _safeMint(msg.sender, _mintAmount);
    }
  }

  function publicMint(uint256 _mintAmount) external mintCompliance(_mintAmount) payable
  {
    require(!whitelistPhase, "Still in Whitelist Sale!");

    alreadyMinted[msg.sender] += _mintAmount;
    _safeMint(msg.sender, _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public payable onlyOwner {
    require(totalSupply() + _mintAmount < maxSupply, "Max supply exceeded!");
    _safeMint(_receiver, _mintAmount);
  }

  function mintForAddressMultiple(address[] calldata addresses, uint256[] calldata amount) public onlyOwner
  {
    for (uint256 i; i < addresses.length; i++)
    {
      require(totalSupply() + amount[i] < maxSupply, "Max supply exceeded!");
      _safeMint(addresses[i], amount[i]);
    }
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override (ERC721A, IERC721A)
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _toString(_tokenId), uriSuffix))
        : "";
  }

  function contractURI() 
  public 
  view 
  returns (string memory) 
  {
        return bytes(_contractURI).length > 0
          ? string(abi.encodePacked(_contractURI))
          : "";
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setFreeMintLimit(uint256 _freeMintLimit) public onlyOwner {
    freeMintLimit = _freeMintLimit;
  }

  function setMaxWalletLimitWL(uint256 _maxWalletLimitWL) public onlyOwner {
    maxWalletLimitWL = _maxWalletLimitWL;
  }

  function setMaxWalletLimitPL(uint256 _maxWalletLimitPL) public onlyOwner {
    maxWalletLimitPL = _maxWalletLimitPL;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setContractURI(string memory newContractURI) public onlyOwner {
    _contractURI = newContractURI;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setWhitelistPhase(bool _state) public onlyOwner {
    whitelistPhase = _state;
  }

  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"_contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"alreadyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"getAlreadyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWalletLimitPL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWalletLimitWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPausedState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","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":"maxMintAmountPerTx","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":"maxWalletLimitPL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletLimitWL","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":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"mintForAddressMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_freeMintLimit","type":"uint256"}],"name":"setFreeMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletLimitPL","type":"uint256"}],"name":"setMaxWalletLimitPL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWalletLimitWL","type":"uint256"}],"name":"setMaxWalletLimitWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"walletLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260086080819052674d4554414441544160c01b60a09081526200002b91600a9190620002cd565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200005a91600b91620002cd565b506040805160208101918290526000908190526200007b91600c91620002cd565b50666a94d74f430000600e819055600f556122b9601055600b60118190556012805462ffffff191662010001179055600060135560036014556015556108ae6016557f29d49e683bd7a8fbb6cd36773fb395d3ce290f2725a55ca497ad4378e9d62f3f601855348015620000ee57600080fd5b50604080518082018252600f81526e0a6eae0e4cadaca4084dedccae640b608b1b6020808301918252835180850190945260038452620a684b60eb1b9084015281519192916200014191600291620002cd565b50805162000157906003906020840190620002cd565b50506001600055506200016a33620001b8565b6200018e6040518060600160405280602c815260200162003c7f602c91396200020a565b620001b26040518060600160405280602e815260200162003cab602e913962000272565b620003af565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620002595760405162461bcd60e51b8152602060048201819052602482015260008051602062003c5f83398151915260448201526064015b60405180910390fd5b80516200026e90600d906020840190620002cd565b5050565b6008546001600160a01b03163314620002bd5760405162461bcd60e51b8152602060048201819052602482015260008051602062003c5f833981519152604482015260640162000250565b80516200026e90600c9060208401905b828054620002db9062000373565b90600052602060002090601f016020900481019282620002ff57600085556200034a565b82601f106200031a57805160ff19168380011785556200034a565b828001600101855582156200034a579182015b828111156200034a5782518255916020019190600101906200032d565b50620003589291506200035c565b5090565b5b808211156200035857600081556001016200035d565b600181811c908216806200038857607f821691505b602082108103620003a957634e487b7160e01b600052602260045260246000fd5b50919050565b6138a080620003bf6000396000f3fe6080604052600436106103de5760003560e01c806370a082311161020d578063a45ba8e711610128578063c87b56dd116100bb578063e88731291161008a578063e985e9c51161006f578063e985e9c514610b1a578063efbd73f414610b63578063f2fde38b14610b7657600080fd5b8063e887312914610af0578063e8a3d48514610b0557600080fd5b8063c87b56dd14610a7a578063d5abeb0114610a9a578063de6c6d3614610ab0578063e0a8085314610ad057600080fd5b8063c0e72740116100f7578063c0e72740146109ed578063c23dc68f14610a02578063c4e41b2214610a2f578063c71fbb7114610a4457600080fd5b8063a45ba8e714610978578063b071401b1461098d578063b88d4fde146109ad578063bd2f6eb8146109cd57600080fd5b80638da5cb5b116101a057806395d89b411161016f57806395d89b411461090557806399a2557a1461091a5780639dddc2921461093a578063a22cb4651461095857600080fd5b80638da5cb5b1461089b57806393822557146108b9578063938e3d7b146108cf57806394354fd0146108ef57600080fd5b8063815d544c116101dc578063815d544c1461082657806381692722146108465780638462151c14610866578063861ec1f41461088657600080fd5b806370a08231146107b1578063715018a6146107d15780637cb64759146107e65780637ec4a6591461080657600080fd5b80632db11544116102fd578063518302271161029057806362b99ad41161025f57806362b99ad4146107465780636352211e1461075b57806365a85d481461077b5780636fd02e4b1461079b57600080fd5b806351830227146106cb5780635503a0e8146106ea5780635bbb2177146106ff5780635c975abb1461072c57600080fd5b806342842e0e116102cc57806342842e0e1461063e578063438b63001461065e57806344a0d68a1461068b5780634fdd43cb146106ab57600080fd5b80632db11544146105ea5780632eb4a7ab146105fd5780633c8463a1146106135780633ccfd60b1461062957600080fd5b806313faede6116103755780631c0de051116103445780631c0de0511461058957806323b872dd146105a15780632904e6d9146105c15780632b2bda4f146105d457600080fd5b806313faede61461051657806316ba10e01461052c57806316c38b3c1461054c57806318160ddd1461056c57600080fd5b8063081812fc116103b1578063081812fc1461047b57806308346d85146104b3578063095ea7b3146104c95780630a398b88146104e957600080fd5b806301ffc9a7146103e357806302bdd75514610418578063065721bf1461043a57806306fdde0314610459575b600080fd5b3480156103ef57600080fd5b506104036103fe36600461303f565b610b96565b60405190151581526020015b60405180910390f35b34801561042457600080fd5b50610438610433366004613071565b610c33565b005b34801561044657600080fd5b506015545b60405190815260200161040f565b34801561046557600080fd5b5061046e610c9c565b60405161040f91906130e4565b34801561048757600080fd5b5061049b6104963660046130f7565b610d2e565b6040516001600160a01b03909116815260200161040f565b3480156104bf57600080fd5b5061044b60165481565b3480156104d557600080fd5b506104386104e4366004613127565b610d8b565b3480156104f557600080fd5b5061044b610504366004613151565b60176020526000908152604090205481565b34801561052257600080fd5b5061044b600f5481565b34801561053857600080fd5b5061043861054736600461320b565b610eb9565b34801561055857600080fd5b50610438610567366004613071565b610f18565b34801561057857600080fd5b50600154600054036000190161044b565b34801561059557600080fd5b5060125460ff16610403565b3480156105ad57600080fd5b506104386105bc366004613254565b610f73565b6104386105cf3660046132dc565b610f83565b3480156105e057600080fd5b5061044b60155481565b6104386105f83660046130f7565b611460565b34801561060957600080fd5b5061044b60185481565b34801561061f57600080fd5b5061044b60135481565b34801561063557600080fd5b506104386117f1565b34801561064a57600080fd5b50610438610659366004613254565b6118ad565b34801561066a57600080fd5b5061067e610679366004613151565b6118c8565b60405161040f9190613328565b34801561069757600080fd5b506104386106a63660046130f7565b6119a8565b3480156106b757600080fd5b506104386106c636600461320b565b6119f5565b3480156106d757600080fd5b5060125461040390610100900460ff1681565b3480156106f657600080fd5b5061046e611a50565b34801561070b57600080fd5b5061071f61071a366004613360565b611ade565b60405161040f9190613406565b34801561073857600080fd5b506012546104039060ff1681565b34801561075257600080fd5b5061046e611ba5565b34801561076757600080fd5b5061049b6107763660046130f7565b611bb2565b34801561078757600080fd5b506104386107963660046130f7565b611bbd565b3480156107a757600080fd5b5061044b60145481565b3480156107bd57600080fd5b5061044b6107cc366004613151565b611c0a565b3480156107dd57600080fd5b50610438611c6c565b3480156107f257600080fd5b506104386108013660046130f7565b611cc0565b34801561081257600080fd5b5061043861082136600461320b565b611d0d565b34801561083257600080fd5b506012546104039062010000900460ff1681565b34801561085257600080fd5b506104386108613660046130f7565b611d68565b34801561087257600080fd5b5061067e610881366004613151565b611db5565b34801561089257600080fd5b5060165461044b565b3480156108a757600080fd5b506008546001600160a01b031661049b565b3480156108c557600080fd5b5061044b600e5481565b3480156108db57600080fd5b506104386108ea36600461320b565b611eb2565b3480156108fb57600080fd5b5061044b60115481565b34801561091157600080fd5b5061046e611f0d565b34801561092657600080fd5b5061067e610935366004613471565b611f1c565b34801561094657600080fd5b5060125462010000900460ff16610403565b34801561096457600080fd5b506104386109733660046134a4565b6120bd565b34801561098457600080fd5b5061046e61216b565b34801561099957600080fd5b506104386109a83660046130f7565b612178565b3480156109b957600080fd5b506104386109c83660046134d7565b6121c5565b3480156109d957600080fd5b506104386109e83660046130f7565b612209565b3480156109f957600080fd5b5061046e612256565b348015610a0e57600080fd5b50610a22610a1d3660046130f7565b612263565b60405161040f9190613553565b348015610a3b57600080fd5b5061044b6122d8565b348015610a5057600080fd5b5061044b610a5f366004613151565b6001600160a01b031660009081526017602052604090205490565b348015610a8657600080fd5b5061046e610a953660046130f7565b6122f2565b348015610aa657600080fd5b5061044b60105481565b348015610abc57600080fd5b50610438610acb366004613589565b612473565b348015610adc57600080fd5b50610438610aeb366004613071565b6125a4565b348015610afc57600080fd5b5060145461044b565b348015610b1157600080fd5b5061046e612606565b348015610b2657600080fd5b50610403610b353660046135f5565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610438610b7136600461361f565b612657565b348015610b8257600080fd5b50610438610b91366004613151565b612708565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610bf957507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c2d57507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6008546001600160a01b03163314610c805760405162461bcd60e51b8152602060048201819052602482015260008051602061384b83398151915260448201526064015b60405180910390fd5b60128054911515620100000262ff000019909216919091179055565b606060028054610cab90613642565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd790613642565b8015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b6000610d39826127d5565b610d6f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d968261280a565b9050806001600160a01b0316836001600160a01b031603610de3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614610e50576001600160a01b038116600090815260076020908152604080832033845290915290205460ff16610e50576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610f015760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b8051610f1490600b906020840190612f90565b5050565b6008546001600160a01b03163314610f605760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b6012805460ff1916911515919091179055565b610f7e838383612892565b505050565b601254819060ff1615610fd85760405162461bcd60e51b815260206004820152601260248201527f4d696e74696e67206973205041555345442100000000000000000000000000006044820152606401610c77565b600081118015610fe9575060115481105b6110355760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006044820152606401610c77565b33321461106f5760405162461bcd60e51b81526020600482015260086024820152674e6f20426f74732160c01b6044820152606401610c77565b601054600154600054839190036000190161108a9190613692565b106110ce5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610c77565b601654600154600054036000190110156110ed576014546013556110f4565b6015546013555b6016546001546000540360001901108015611127575060165460015460005483919003600019016111259190613692565b115b15611172576000601654826111456001546000546000199190030190565b61114f9190613692565b61115991906136aa565b905080600e5461116991906136c1565b600f55506111cf565b601654600154600054839190036000190161118d9190613692565b11156111a95780600e546111a191906136c1565b600f556111cf565b60165460015460005483919003600019016111c49190613692565b116111cf576000600f555b600f543410156112215760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610c77565b6013543360009081526017602052604090205461123f908390613692565b1061128c5760405162461bcd60e51b815260206004820152601d60248201527f4d6178204d696e7473205065722057616c6c65742052656163686564210000006044820152606401610c77565b60125462010000900460ff161561141b576040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611317858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506018549150849050612adb565b6113635760405162461bcd60e51b815260206004820152601460248201527f4e6f74206f6e207468652057686974656c6973740000000000000000000000006044820152606401610c77565b6040516bffffffffffffffffffffffff193360601b166020820152819060340160405160208183030381529060405280519060200120146113e65760405162461bcd60e51b815260206004820152601060248201527f4e617567687479204e61756768747921000000000000000000000000000000006044820152606401610c77565b3360009081526017602052604081208054859290611405908490613692565b9091555061141590503384612af1565b5061145a565b60125462010000900460ff1661145a57336000908152601760205260408120805484929061144a908490613692565b9091555061145a90503383612af1565b50505050565b601254819060ff16156114b55760405162461bcd60e51b815260206004820152601260248201527f4d696e74696e67206973205041555345442100000000000000000000000000006044820152606401610c77565b6000811180156114c6575060115481105b6115125760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006044820152606401610c77565b33321461154c5760405162461bcd60e51b81526020600482015260086024820152674e6f20426f74732160c01b6044820152606401610c77565b60105460015460005483919003600019016115679190613692565b106115ab5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610c77565b601654600154600054036000190110156115ca576014546013556115d1565b6015546013555b6016546001546000540360001901108015611604575060165460015460005483919003600019016116029190613692565b115b1561164f576000601654826116226001546000546000199190030190565b61162c9190613692565b61163691906136aa565b905080600e5461164691906136c1565b600f55506116ac565b601654600154600054839190036000190161166a9190613692565b11156116865780600e5461167e91906136c1565b600f556116ac565b60165460015460005483919003600019016116a19190613692565b116116ac576000600f555b600f543410156116fe5760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610c77565b6013543360009081526017602052604090205461171c908390613692565b106117695760405162461bcd60e51b815260206004820152601d60248201527f4d6178204d696e7473205065722057616c6c65742052656163686564210000006044820152606401610c77565b60125462010000900460ff16156117c25760405162461bcd60e51b815260206004820152601860248201527f5374696c6c20696e2057686974656c6973742053616c652100000000000000006044820152606401610c77565b33600090815260176020526040812080548492906117e1908490613692565b90915550610f1490503383612af1565b6008546001600160a01b031633146118395760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b600061184d6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611897576040519150601f19603f3d011682016040523d82523d6000602084013e61189c565b606091505b50509050806118aa57600080fd5b50565b610f7e838383604051806020016040528060008152506121c5565b606060006118d583611c0a565b905060008167ffffffffffffffff8111156118f2576118f261316c565b60405190808252806020026020018201604052801561191b578160200160208202803683370190505b509050600160005b838110801561193457506010548211155b1561199e57600061194483611bb2565b9050866001600160a01b0316816001600160a01b03160361198b5782848381518110611972576119726136e0565b602090810291909101015281611987816136f6565b9250505b82611995816136f6565b93505050611923565b5090949350505050565b6008546001600160a01b031633146119f05760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b600f55565b6008546001600160a01b03163314611a3d5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b8051610f1490600d906020840190612f90565b600b8054611a5d90613642565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8990613642565b8015611ad65780601f10611aab57610100808354040283529160200191611ad6565b820191906000526020600020905b815481529060010190602001808311611ab957829003601f168201915b505050505081565b805160609060008167ffffffffffffffff811115611afe57611afe61316c565b604051908082528060200260200182016040528015611b4957816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181611b1c5790505b50905060005b828114611b9d57611b78858281518110611b6b57611b6b6136e0565b6020026020010151612263565b828281518110611b8a57611b8a6136e0565b6020908102919091010152600101611b4f565b509392505050565b600a8054611a5d90613642565b6000610c2d8261280a565b6008546001600160a01b03163314611c055760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601555565b600081600003611c46576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314611cb45760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b611cbe6000612b0b565b565b6008546001600160a01b03163314611d085760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601855565b6008546001600160a01b03163314611d555760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b8051610f1490600a906020840190612f90565b6008546001600160a01b03163314611db05760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601455565b60606000806000611dc585611c0a565b905060008167ffffffffffffffff811115611de257611de261316c565b604051908082528060200260200182016040528015611e0b578160200160208202803683370190505b50604080516060810182526000808252602082018190529181019190915290915060015b838614611ea657611e3f81612b6a565b91508160400151611e9e5781516001600160a01b031615611e5f57815194505b876001600160a01b0316856001600160a01b031603611e9e5780838780600101985081518110611e9157611e916136e0565b6020026020010181815250505b600101611e2f565b50909695505050505050565b6008546001600160a01b03163314611efa5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b8051610f1490600c906020840190612f90565b606060038054610cab90613642565b6060818310611f57576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611f6360005490565b90506001851015611f7357600194505b80841115611f7f578093505b6000611f8a87611c0a565b905084861015611fa95785850381811015611fa3578091505b50611fad565b5060005b60008167ffffffffffffffff811115611fc857611fc861316c565b604051908082528060200260200182016040528015611ff1578160200160208202803683370190505b509050816000036120075793506120b692505050565b600061201288612263565b905060008160400151612023575080515b885b8881141580156120355750848714155b156120aa5761204381612b6a565b925082604001516120a25782516001600160a01b03161561206357825191505b8a6001600160a01b0316826001600160a01b0316036120a25780848880600101995081518110612095576120956136e0565b6020026020010181815250505b600101612025565b50505092835250909150505b9392505050565b336001600160a01b038316036120ff576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d8054611a5d90613642565b6008546001600160a01b031633146121c05760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601155565b6121d0848484612892565b6001600160a01b0383163b1561145a576121ec84848484612bd5565b61145a576040516368d2bf6b60e11b815260040160405180910390fd5b6008546001600160a01b031633146122515760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601655565b600c8054611a5d90613642565b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101929092529060018310806122a957506000548310155b156122b45792915050565b6122bd83612b6a565b90508060400151156122cf5792915050565b6120b683612cc1565b60006122ed6001546000546000199190030190565b905090565b60606122fd826127d5565b61236f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610c77565b601254610100900460ff16151560000361241557600d805461239090613642565b80601f01602080910402602001604051908101604052809291908181526020018280546123bc90613642565b80156124095780601f106123de57610100808354040283529160200191612409565b820191906000526020600020905b8154815290600101906020018083116123ec57829003601f168201915b50505050509050919050565b600061241f612d25565b9050600081511161243f57604051806020016040528060008152506120b6565b8061244984612d34565b600b60405160200161245d939291906137a8565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146124bb5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b60005b8381101561259d576010548383838181106124db576124db6136e0565b905060200201356124f56001546000546000199190030190565b6124ff9190613692565b106125435760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610c77565b61258b858583818110612558576125586136e0565b905060200201602081019061256d9190613151565b84848481811061257f5761257f6136e0565b90506020020135612af1565b80612595816136f6565b9150506124be565b5050505050565b6008546001600160a01b031633146125ec5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601280549115156101000261ff0019909216919091179055565b60606000600c805461261790613642565b905011612631575060408051602081019091526000815290565b600c60405160200161264391906137e5565b604051602081830303815290604052905090565b6008546001600160a01b0316331461269f5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b60105460015460005484919003600019016126ba9190613692565b106126fe5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610c77565b610f148183612af1565b6008546001600160a01b031633146127505760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b6001600160a01b0381166127cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c77565b6118aa81612b0b565b6000816001111580156127e9575060005482105b8015610c2d575050600090815260046020526040902054600160e01b161590565b60008180600111612860576000548110156128605760008181526004602052604081205490600160e01b8216900361285e575b806000036120b657506000190160008181526004602052604090205461283d565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061289d8261280a565b9050836001600160a01b0316816001600160a01b0316146128ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600660205260408120546001600160a01b039081169190861633148061293857506001600160a01b038616600090815260076020908152604080832033845290915290205460ff165b8061294b57506001600160a01b03821633145b905080612984576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846000036129be576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81156129ee576000848152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff191690555b6001600160a01b0386811660009081526005602090815260408083208054600019019055928816825282822080546001019055868252600490529081207c02000000000000000000000000000000000000000000000000000000004260a01b8817811790915584169003612a9257600184016000818152600460205260408120549003612a90576000548114612a905760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600082612ae88584612d83565b14949350505050565b610f14828260405180602001604052806000815250612def565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160608101825260008082526020820181905291810191909152600082815260046020526040902054610c2d90604080516060810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b90921615159082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612c0a9033908990889088906004016137f1565b6020604051808303816000875af1925050508015612c45575060408051601f3d908101601f19168201909252612c429181019061382d565b60015b612ca3573d808015612c73576040519150601f19603f3d011682016040523d82523d6000602084013e612c78565b606091505b508051600003612c9b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6040805160608101825260008082526020820181905291810191909152610c2d612cea8361280a565b604080516060810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b90921615159082015290565b6060600a8054610cab90613642565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612d7157600183039250600a81066030018353600a9004612d53565b50819003601f19909101908152919050565b600081815b8451811015611b9d576000858281518110612da557612da56136e0565b60200260200101519050808311612dcb5760008381526020829052604090209250612ddc565b600081815260208490526040902092505b5080612de7816136f6565b915050612d88565b60005483600003612e2c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003612e66576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15612f3b575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612f046000878480600101955087612bd5565b612f21576040516368d2bf6b60e11b815260040160405180910390fd5b808210612eb9578260005414612f3657600080fd5b612f80565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612f3c575b50600090815561145a9085838684565b828054612f9c90613642565b90600052602060002090601f016020900481019282612fbe5760008555613004565b82601f10612fd757805160ff1916838001178555613004565b82800160010185558215613004579182015b82811115613004578251825591602001919060010190612fe9565b50613010929150613014565b5090565b5b808211156130105760008155600101613015565b6001600160e01b0319811681146118aa57600080fd5b60006020828403121561305157600080fd5b81356120b681613029565b8035801515811461306c57600080fd5b919050565b60006020828403121561308357600080fd5b6120b68261305c565b60005b838110156130a757818101518382015260200161308f565b8381111561145a5750506000910152565b600081518084526130d081602086016020860161308c565b601f01601f19169290920160200192915050565b6020815260006120b660208301846130b8565b60006020828403121561310957600080fd5b5035919050565b80356001600160a01b038116811461306c57600080fd5b6000806040838503121561313a57600080fd5b61314383613110565b946020939093013593505050565b60006020828403121561316357600080fd5b6120b682613110565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131ab576131ab61316c565b604052919050565b600067ffffffffffffffff8311156131cd576131cd61316c565b6131e0601f8401601f1916602001613182565b90508281528383830111156131f457600080fd5b828260208301376000602084830101529392505050565b60006020828403121561321d57600080fd5b813567ffffffffffffffff81111561323457600080fd5b8201601f8101841361324557600080fd5b612cb9848235602084016131b3565b60008060006060848603121561326957600080fd5b61327284613110565b925061328060208501613110565b9150604084013590509250925092565b60008083601f8401126132a257600080fd5b50813567ffffffffffffffff8111156132ba57600080fd5b6020830191508360208260051b85010111156132d557600080fd5b9250929050565b6000806000604084860312156132f157600080fd5b833567ffffffffffffffff81111561330857600080fd5b61331486828701613290565b909790965060209590950135949350505050565b6020808252825182820181905260009190848201906040850190845b81811015611ea657835183529284019291840191600101613344565b6000602080838503121561337357600080fd5b823567ffffffffffffffff8082111561338b57600080fd5b818501915085601f83011261339f57600080fd5b8135818111156133b1576133b161316c565b8060051b91506133c2848301613182565b81815291830184019184810190888411156133dc57600080fd5b938501935b838510156133fa578435825293850193908501906133e1565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611ea65761345e83855180516001600160a01b0316825260208082015167ffffffffffffffff16908301526040908101511515910152565b9284019260609290920191600101613422565b60008060006060848603121561348657600080fd5b61348f84613110565b95602085013595506040909401359392505050565b600080604083850312156134b757600080fd5b6134c083613110565b91506134ce6020840161305c565b90509250929050565b600080600080608085870312156134ed57600080fd5b6134f685613110565b935061350460208601613110565b925060408501359150606085013567ffffffffffffffff81111561352757600080fd5b8501601f8101871361353857600080fd5b613547878235602084016131b3565b91505092959194509250565b81516001600160a01b0316815260208083015167ffffffffffffffff169082015260408083015115159082015260608101610c2d565b6000806000806040858703121561359f57600080fd5b843567ffffffffffffffff808211156135b757600080fd5b6135c388838901613290565b909650945060208701359150808211156135dc57600080fd5b506135e987828801613290565b95989497509550505050565b6000806040838503121561360857600080fd5b61361183613110565b91506134ce60208401613110565b6000806040838503121561363257600080fd5b823591506134ce60208401613110565b600181811c9082168061365657607f821691505b60208210810361367657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156136a5576136a561367c565b500190565b6000828210156136bc576136bc61367c565b500390565b60008160001904831182151516156136db576136db61367c565b500290565b634e487b7160e01b600052603260045260246000fd5b6000600182016137085761370861367c565b5060010190565b8054600090600181811c908083168061372957607f831692505b6020808410820361374a57634e487b7160e01b600052602260045260246000fd5b81801561375e576001811461376f5761379c565b60ff1986168952848901965061379c565b60008881526020902060005b868110156137945781548b82015290850190830161377b565b505084890196505b50505050505092915050565b600084516137ba81846020890161308c565b8451908301906137ce81836020890161308c565b6137da8183018661370f565b979650505050505050565b60006120b6828461370f565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261382360808301846130b8565b9695505050505050565b60006020828403121561383f57600080fd5b81516120b68161302956fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212205909a9fa7a8049d02f8cd05ce01cabb6665c58e7916fc21b9aff34b05a22f68464736f6c634300080e00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657268747470733a2f2f7777772e73757072656d65626f6e6573782e696f2f68696464656e4d6574612e6a736f6e68747470733a2f2f7777772e73757072656d6573626f6e6573782e696f2f736278636f6e74726163742e6a736f6e

Deployed Bytecode

0x6080604052600436106103de5760003560e01c806370a082311161020d578063a45ba8e711610128578063c87b56dd116100bb578063e88731291161008a578063e985e9c51161006f578063e985e9c514610b1a578063efbd73f414610b63578063f2fde38b14610b7657600080fd5b8063e887312914610af0578063e8a3d48514610b0557600080fd5b8063c87b56dd14610a7a578063d5abeb0114610a9a578063de6c6d3614610ab0578063e0a8085314610ad057600080fd5b8063c0e72740116100f7578063c0e72740146109ed578063c23dc68f14610a02578063c4e41b2214610a2f578063c71fbb7114610a4457600080fd5b8063a45ba8e714610978578063b071401b1461098d578063b88d4fde146109ad578063bd2f6eb8146109cd57600080fd5b80638da5cb5b116101a057806395d89b411161016f57806395d89b411461090557806399a2557a1461091a5780639dddc2921461093a578063a22cb4651461095857600080fd5b80638da5cb5b1461089b57806393822557146108b9578063938e3d7b146108cf57806394354fd0146108ef57600080fd5b8063815d544c116101dc578063815d544c1461082657806381692722146108465780638462151c14610866578063861ec1f41461088657600080fd5b806370a08231146107b1578063715018a6146107d15780637cb64759146107e65780637ec4a6591461080657600080fd5b80632db11544116102fd578063518302271161029057806362b99ad41161025f57806362b99ad4146107465780636352211e1461075b57806365a85d481461077b5780636fd02e4b1461079b57600080fd5b806351830227146106cb5780635503a0e8146106ea5780635bbb2177146106ff5780635c975abb1461072c57600080fd5b806342842e0e116102cc57806342842e0e1461063e578063438b63001461065e57806344a0d68a1461068b5780634fdd43cb146106ab57600080fd5b80632db11544146105ea5780632eb4a7ab146105fd5780633c8463a1146106135780633ccfd60b1461062957600080fd5b806313faede6116103755780631c0de051116103445780631c0de0511461058957806323b872dd146105a15780632904e6d9146105c15780632b2bda4f146105d457600080fd5b806313faede61461051657806316ba10e01461052c57806316c38b3c1461054c57806318160ddd1461056c57600080fd5b8063081812fc116103b1578063081812fc1461047b57806308346d85146104b3578063095ea7b3146104c95780630a398b88146104e957600080fd5b806301ffc9a7146103e357806302bdd75514610418578063065721bf1461043a57806306fdde0314610459575b600080fd5b3480156103ef57600080fd5b506104036103fe36600461303f565b610b96565b60405190151581526020015b60405180910390f35b34801561042457600080fd5b50610438610433366004613071565b610c33565b005b34801561044657600080fd5b506015545b60405190815260200161040f565b34801561046557600080fd5b5061046e610c9c565b60405161040f91906130e4565b34801561048757600080fd5b5061049b6104963660046130f7565b610d2e565b6040516001600160a01b03909116815260200161040f565b3480156104bf57600080fd5b5061044b60165481565b3480156104d557600080fd5b506104386104e4366004613127565b610d8b565b3480156104f557600080fd5b5061044b610504366004613151565b60176020526000908152604090205481565b34801561052257600080fd5b5061044b600f5481565b34801561053857600080fd5b5061043861054736600461320b565b610eb9565b34801561055857600080fd5b50610438610567366004613071565b610f18565b34801561057857600080fd5b50600154600054036000190161044b565b34801561059557600080fd5b5060125460ff16610403565b3480156105ad57600080fd5b506104386105bc366004613254565b610f73565b6104386105cf3660046132dc565b610f83565b3480156105e057600080fd5b5061044b60155481565b6104386105f83660046130f7565b611460565b34801561060957600080fd5b5061044b60185481565b34801561061f57600080fd5b5061044b60135481565b34801561063557600080fd5b506104386117f1565b34801561064a57600080fd5b50610438610659366004613254565b6118ad565b34801561066a57600080fd5b5061067e610679366004613151565b6118c8565b60405161040f9190613328565b34801561069757600080fd5b506104386106a63660046130f7565b6119a8565b3480156106b757600080fd5b506104386106c636600461320b565b6119f5565b3480156106d757600080fd5b5060125461040390610100900460ff1681565b3480156106f657600080fd5b5061046e611a50565b34801561070b57600080fd5b5061071f61071a366004613360565b611ade565b60405161040f9190613406565b34801561073857600080fd5b506012546104039060ff1681565b34801561075257600080fd5b5061046e611ba5565b34801561076757600080fd5b5061049b6107763660046130f7565b611bb2565b34801561078757600080fd5b506104386107963660046130f7565b611bbd565b3480156107a757600080fd5b5061044b60145481565b3480156107bd57600080fd5b5061044b6107cc366004613151565b611c0a565b3480156107dd57600080fd5b50610438611c6c565b3480156107f257600080fd5b506104386108013660046130f7565b611cc0565b34801561081257600080fd5b5061043861082136600461320b565b611d0d565b34801561083257600080fd5b506012546104039062010000900460ff1681565b34801561085257600080fd5b506104386108613660046130f7565b611d68565b34801561087257600080fd5b5061067e610881366004613151565b611db5565b34801561089257600080fd5b5060165461044b565b3480156108a757600080fd5b506008546001600160a01b031661049b565b3480156108c557600080fd5b5061044b600e5481565b3480156108db57600080fd5b506104386108ea36600461320b565b611eb2565b3480156108fb57600080fd5b5061044b60115481565b34801561091157600080fd5b5061046e611f0d565b34801561092657600080fd5b5061067e610935366004613471565b611f1c565b34801561094657600080fd5b5060125462010000900460ff16610403565b34801561096457600080fd5b506104386109733660046134a4565b6120bd565b34801561098457600080fd5b5061046e61216b565b34801561099957600080fd5b506104386109a83660046130f7565b612178565b3480156109b957600080fd5b506104386109c83660046134d7565b6121c5565b3480156109d957600080fd5b506104386109e83660046130f7565b612209565b3480156109f957600080fd5b5061046e612256565b348015610a0e57600080fd5b50610a22610a1d3660046130f7565b612263565b60405161040f9190613553565b348015610a3b57600080fd5b5061044b6122d8565b348015610a5057600080fd5b5061044b610a5f366004613151565b6001600160a01b031660009081526017602052604090205490565b348015610a8657600080fd5b5061046e610a953660046130f7565b6122f2565b348015610aa657600080fd5b5061044b60105481565b348015610abc57600080fd5b50610438610acb366004613589565b612473565b348015610adc57600080fd5b50610438610aeb366004613071565b6125a4565b348015610afc57600080fd5b5060145461044b565b348015610b1157600080fd5b5061046e612606565b348015610b2657600080fd5b50610403610b353660046135f5565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610438610b7136600461361f565b612657565b348015610b8257600080fd5b50610438610b91366004613151565b612708565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610bf957507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610c2d57507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6008546001600160a01b03163314610c805760405162461bcd60e51b8152602060048201819052602482015260008051602061384b83398151915260448201526064015b60405180910390fd5b60128054911515620100000262ff000019909216919091179055565b606060028054610cab90613642565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd790613642565b8015610d245780601f10610cf957610100808354040283529160200191610d24565b820191906000526020600020905b815481529060010190602001808311610d0757829003601f168201915b5050505050905090565b6000610d39826127d5565b610d6f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610d968261280a565b9050806001600160a01b0316836001600160a01b031603610de3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614610e50576001600160a01b038116600090815260076020908152604080832033845290915290205460ff16610e50576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314610f015760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b8051610f1490600b906020840190612f90565b5050565b6008546001600160a01b03163314610f605760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b6012805460ff1916911515919091179055565b610f7e838383612892565b505050565b601254819060ff1615610fd85760405162461bcd60e51b815260206004820152601260248201527f4d696e74696e67206973205041555345442100000000000000000000000000006044820152606401610c77565b600081118015610fe9575060115481105b6110355760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006044820152606401610c77565b33321461106f5760405162461bcd60e51b81526020600482015260086024820152674e6f20426f74732160c01b6044820152606401610c77565b601054600154600054839190036000190161108a9190613692565b106110ce5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610c77565b601654600154600054036000190110156110ed576014546013556110f4565b6015546013555b6016546001546000540360001901108015611127575060165460015460005483919003600019016111259190613692565b115b15611172576000601654826111456001546000546000199190030190565b61114f9190613692565b61115991906136aa565b905080600e5461116991906136c1565b600f55506111cf565b601654600154600054839190036000190161118d9190613692565b11156111a95780600e546111a191906136c1565b600f556111cf565b60165460015460005483919003600019016111c49190613692565b116111cf576000600f555b600f543410156112215760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610c77565b6013543360009081526017602052604090205461123f908390613692565b1061128c5760405162461bcd60e51b815260206004820152601d60248201527f4d6178204d696e7473205065722057616c6c65742052656163686564210000006044820152606401610c77565b60125462010000900460ff161561141b576040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050611317858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506018549150849050612adb565b6113635760405162461bcd60e51b815260206004820152601460248201527f4e6f74206f6e207468652057686974656c6973740000000000000000000000006044820152606401610c77565b6040516bffffffffffffffffffffffff193360601b166020820152819060340160405160208183030381529060405280519060200120146113e65760405162461bcd60e51b815260206004820152601060248201527f4e617567687479204e61756768747921000000000000000000000000000000006044820152606401610c77565b3360009081526017602052604081208054859290611405908490613692565b9091555061141590503384612af1565b5061145a565b60125462010000900460ff1661145a57336000908152601760205260408120805484929061144a908490613692565b9091555061145a90503383612af1565b50505050565b601254819060ff16156114b55760405162461bcd60e51b815260206004820152601260248201527f4d696e74696e67206973205041555345442100000000000000000000000000006044820152606401610c77565b6000811180156114c6575060115481105b6115125760405162461bcd60e51b815260206004820152601460248201527f496e76616c6964206d696e7420616d6f756e74210000000000000000000000006044820152606401610c77565b33321461154c5760405162461bcd60e51b81526020600482015260086024820152674e6f20426f74732160c01b6044820152606401610c77565b60105460015460005483919003600019016115679190613692565b106115ab5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610c77565b601654600154600054036000190110156115ca576014546013556115d1565b6015546013555b6016546001546000540360001901108015611604575060165460015460005483919003600019016116029190613692565b115b1561164f576000601654826116226001546000546000199190030190565b61162c9190613692565b61163691906136aa565b905080600e5461164691906136c1565b600f55506116ac565b601654600154600054839190036000190161166a9190613692565b11156116865780600e5461167e91906136c1565b600f556116ac565b60165460015460005483919003600019016116a19190613692565b116116ac576000600f555b600f543410156116fe5760405162461bcd60e51b815260206004820152601360248201527f496e73756666696369656e742066756e647321000000000000000000000000006044820152606401610c77565b6013543360009081526017602052604090205461171c908390613692565b106117695760405162461bcd60e51b815260206004820152601d60248201527f4d6178204d696e7473205065722057616c6c65742052656163686564210000006044820152606401610c77565b60125462010000900460ff16156117c25760405162461bcd60e51b815260206004820152601860248201527f5374696c6c20696e2057686974656c6973742053616c652100000000000000006044820152606401610c77565b33600090815260176020526040812080548492906117e1908490613692565b90915550610f1490503383612af1565b6008546001600160a01b031633146118395760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b600061184d6008546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611897576040519150601f19603f3d011682016040523d82523d6000602084013e61189c565b606091505b50509050806118aa57600080fd5b50565b610f7e838383604051806020016040528060008152506121c5565b606060006118d583611c0a565b905060008167ffffffffffffffff8111156118f2576118f261316c565b60405190808252806020026020018201604052801561191b578160200160208202803683370190505b509050600160005b838110801561193457506010548211155b1561199e57600061194483611bb2565b9050866001600160a01b0316816001600160a01b03160361198b5782848381518110611972576119726136e0565b602090810291909101015281611987816136f6565b9250505b82611995816136f6565b93505050611923565b5090949350505050565b6008546001600160a01b031633146119f05760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b600f55565b6008546001600160a01b03163314611a3d5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b8051610f1490600d906020840190612f90565b600b8054611a5d90613642565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8990613642565b8015611ad65780601f10611aab57610100808354040283529160200191611ad6565b820191906000526020600020905b815481529060010190602001808311611ab957829003601f168201915b505050505081565b805160609060008167ffffffffffffffff811115611afe57611afe61316c565b604051908082528060200260200182016040528015611b4957816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181611b1c5790505b50905060005b828114611b9d57611b78858281518110611b6b57611b6b6136e0565b6020026020010151612263565b828281518110611b8a57611b8a6136e0565b6020908102919091010152600101611b4f565b509392505050565b600a8054611a5d90613642565b6000610c2d8261280a565b6008546001600160a01b03163314611c055760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601555565b600081600003611c46576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314611cb45760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b611cbe6000612b0b565b565b6008546001600160a01b03163314611d085760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601855565b6008546001600160a01b03163314611d555760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b8051610f1490600a906020840190612f90565b6008546001600160a01b03163314611db05760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601455565b60606000806000611dc585611c0a565b905060008167ffffffffffffffff811115611de257611de261316c565b604051908082528060200260200182016040528015611e0b578160200160208202803683370190505b50604080516060810182526000808252602082018190529181019190915290915060015b838614611ea657611e3f81612b6a565b91508160400151611e9e5781516001600160a01b031615611e5f57815194505b876001600160a01b0316856001600160a01b031603611e9e5780838780600101985081518110611e9157611e916136e0565b6020026020010181815250505b600101611e2f565b50909695505050505050565b6008546001600160a01b03163314611efa5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b8051610f1490600c906020840190612f90565b606060038054610cab90613642565b6060818310611f57576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611f6360005490565b90506001851015611f7357600194505b80841115611f7f578093505b6000611f8a87611c0a565b905084861015611fa95785850381811015611fa3578091505b50611fad565b5060005b60008167ffffffffffffffff811115611fc857611fc861316c565b604051908082528060200260200182016040528015611ff1578160200160208202803683370190505b509050816000036120075793506120b692505050565b600061201288612263565b905060008160400151612023575080515b885b8881141580156120355750848714155b156120aa5761204381612b6a565b925082604001516120a25782516001600160a01b03161561206357825191505b8a6001600160a01b0316826001600160a01b0316036120a25780848880600101995081518110612095576120956136e0565b6020026020010181815250505b600101612025565b50505092835250909150505b9392505050565b336001600160a01b038316036120ff576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d8054611a5d90613642565b6008546001600160a01b031633146121c05760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601155565b6121d0848484612892565b6001600160a01b0383163b1561145a576121ec84848484612bd5565b61145a576040516368d2bf6b60e11b815260040160405180910390fd5b6008546001600160a01b031633146122515760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601655565b600c8054611a5d90613642565b604080516060808201835260008083526020808401829052838501829052845192830185528183528201819052928101929092529060018310806122a957506000548310155b156122b45792915050565b6122bd83612b6a565b90508060400151156122cf5792915050565b6120b683612cc1565b60006122ed6001546000546000199190030190565b905090565b60606122fd826127d5565b61236f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610c77565b601254610100900460ff16151560000361241557600d805461239090613642565b80601f01602080910402602001604051908101604052809291908181526020018280546123bc90613642565b80156124095780601f106123de57610100808354040283529160200191612409565b820191906000526020600020905b8154815290600101906020018083116123ec57829003601f168201915b50505050509050919050565b600061241f612d25565b9050600081511161243f57604051806020016040528060008152506120b6565b8061244984612d34565b600b60405160200161245d939291906137a8565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146124bb5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b60005b8381101561259d576010548383838181106124db576124db6136e0565b905060200201356124f56001546000546000199190030190565b6124ff9190613692565b106125435760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610c77565b61258b858583818110612558576125586136e0565b905060200201602081019061256d9190613151565b84848481811061257f5761257f6136e0565b90506020020135612af1565b80612595816136f6565b9150506124be565b5050505050565b6008546001600160a01b031633146125ec5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b601280549115156101000261ff0019909216919091179055565b60606000600c805461261790613642565b905011612631575060408051602081019091526000815290565b600c60405160200161264391906137e5565b604051602081830303815290604052905090565b6008546001600160a01b0316331461269f5760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b60105460015460005484919003600019016126ba9190613692565b106126fe5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610c77565b610f148183612af1565b6008546001600160a01b031633146127505760405162461bcd60e51b8152602060048201819052602482015260008051602061384b8339815191526044820152606401610c77565b6001600160a01b0381166127cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c77565b6118aa81612b0b565b6000816001111580156127e9575060005482105b8015610c2d575050600090815260046020526040902054600160e01b161590565b60008180600111612860576000548110156128605760008181526004602052604081205490600160e01b8216900361285e575b806000036120b657506000190160008181526004602052604090205461283d565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061289d8261280a565b9050836001600160a01b0316816001600160a01b0316146128ea576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600660205260408120546001600160a01b039081169190861633148061293857506001600160a01b038616600090815260076020908152604080832033845290915290205460ff165b8061294b57506001600160a01b03821633145b905080612984576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846000036129be576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81156129ee576000848152600660205260409020805473ffffffffffffffffffffffffffffffffffffffff191690555b6001600160a01b0386811660009081526005602090815260408083208054600019019055928816825282822080546001019055868252600490529081207c02000000000000000000000000000000000000000000000000000000004260a01b8817811790915584169003612a9257600184016000818152600460205260408120549003612a90576000548114612a905760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600082612ae88584612d83565b14949350505050565b610f14828260405180602001604052806000815250612def565b600880546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160608101825260008082526020820181905291810191909152600082815260046020526040902054610c2d90604080516060810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b90921615159082015290565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612c0a9033908990889088906004016137f1565b6020604051808303816000875af1925050508015612c45575060408051601f3d908101601f19168201909252612c429181019061382d565b60015b612ca3573d808015612c73576040519150601f19603f3d011682016040523d82523d6000602084013e612c78565b606091505b508051600003612c9b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6040805160608101825260008082526020820181905291810191909152610c2d612cea8361280a565b604080516060810182526001600160a01b038316815260a083901c67ffffffffffffffff166020820152600160e01b90921615159082015290565b6060600a8054610cab90613642565b604080516080810191829052607f0190826030600a8206018353600a90045b8015612d7157600183039250600a81066030018353600a9004612d53565b50819003601f19909101908152919050565b600081815b8451811015611b9d576000858281518110612da557612da56136e0565b60200260200101519050808311612dcb5760008381526020829052604090209250612ddc565b600081815260208490526040902092505b5080612de7816136f6565b915050612d88565b60005483600003612e2c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003612e66576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15612f3b575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612f046000878480600101955087612bd5565b612f21576040516368d2bf6b60e11b815260040160405180910390fd5b808210612eb9578260005414612f3657600080fd5b612f80565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210612f3c575b50600090815561145a9085838684565b828054612f9c90613642565b90600052602060002090601f016020900481019282612fbe5760008555613004565b82601f10612fd757805160ff1916838001178555613004565b82800160010185558215613004579182015b82811115613004578251825591602001919060010190612fe9565b50613010929150613014565b5090565b5b808211156130105760008155600101613015565b6001600160e01b0319811681146118aa57600080fd5b60006020828403121561305157600080fd5b81356120b681613029565b8035801515811461306c57600080fd5b919050565b60006020828403121561308357600080fd5b6120b68261305c565b60005b838110156130a757818101518382015260200161308f565b8381111561145a5750506000910152565b600081518084526130d081602086016020860161308c565b601f01601f19169290920160200192915050565b6020815260006120b660208301846130b8565b60006020828403121561310957600080fd5b5035919050565b80356001600160a01b038116811461306c57600080fd5b6000806040838503121561313a57600080fd5b61314383613110565b946020939093013593505050565b60006020828403121561316357600080fd5b6120b682613110565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156131ab576131ab61316c565b604052919050565b600067ffffffffffffffff8311156131cd576131cd61316c565b6131e0601f8401601f1916602001613182565b90508281528383830111156131f457600080fd5b828260208301376000602084830101529392505050565b60006020828403121561321d57600080fd5b813567ffffffffffffffff81111561323457600080fd5b8201601f8101841361324557600080fd5b612cb9848235602084016131b3565b60008060006060848603121561326957600080fd5b61327284613110565b925061328060208501613110565b9150604084013590509250925092565b60008083601f8401126132a257600080fd5b50813567ffffffffffffffff8111156132ba57600080fd5b6020830191508360208260051b85010111156132d557600080fd5b9250929050565b6000806000604084860312156132f157600080fd5b833567ffffffffffffffff81111561330857600080fd5b61331486828701613290565b909790965060209590950135949350505050565b6020808252825182820181905260009190848201906040850190845b81811015611ea657835183529284019291840191600101613344565b6000602080838503121561337357600080fd5b823567ffffffffffffffff8082111561338b57600080fd5b818501915085601f83011261339f57600080fd5b8135818111156133b1576133b161316c565b8060051b91506133c2848301613182565b81815291830184019184810190888411156133dc57600080fd5b938501935b838510156133fa578435825293850193908501906133e1565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611ea65761345e83855180516001600160a01b0316825260208082015167ffffffffffffffff16908301526040908101511515910152565b9284019260609290920191600101613422565b60008060006060848603121561348657600080fd5b61348f84613110565b95602085013595506040909401359392505050565b600080604083850312156134b757600080fd5b6134c083613110565b91506134ce6020840161305c565b90509250929050565b600080600080608085870312156134ed57600080fd5b6134f685613110565b935061350460208601613110565b925060408501359150606085013567ffffffffffffffff81111561352757600080fd5b8501601f8101871361353857600080fd5b613547878235602084016131b3565b91505092959194509250565b81516001600160a01b0316815260208083015167ffffffffffffffff169082015260408083015115159082015260608101610c2d565b6000806000806040858703121561359f57600080fd5b843567ffffffffffffffff808211156135b757600080fd5b6135c388838901613290565b909650945060208701359150808211156135dc57600080fd5b506135e987828801613290565b95989497509550505050565b6000806040838503121561360857600080fd5b61361183613110565b91506134ce60208401613110565b6000806040838503121561363257600080fd5b823591506134ce60208401613110565b600181811c9082168061365657607f821691505b60208210810361367657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156136a5576136a561367c565b500190565b6000828210156136bc576136bc61367c565b500390565b60008160001904831182151516156136db576136db61367c565b500290565b634e487b7160e01b600052603260045260246000fd5b6000600182016137085761370861367c565b5060010190565b8054600090600181811c908083168061372957607f831692505b6020808410820361374a57634e487b7160e01b600052602260045260246000fd5b81801561375e576001811461376f5761379c565b60ff1986168952848901965061379c565b60008881526020902060005b868110156137945781548b82015290850190830161377b565b505084890196505b50505050505092915050565b600084516137ba81846020890161308c565b8451908301906137ce81836020890161308c565b6137da8183018661370f565b979650505050505050565b60006120b6828461370f565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261382360808301846130b8565b9695505050505050565b60006020828403121561383f57600080fd5b81516120b68161302956fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212205909a9fa7a8049d02f8cd05ce01cabb6665c58e7916fc21b9aff34b05a22f68464736f6c634300080e0033

Deployed Bytecode Sourcemap

57195:7590:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22844:615;;;;;;;;;;-1:-1:-1;22844:615:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;22844:615:0;;;;;;;;64434:93;;;;;;;;;;-1:-1:-1;64434:93:0;;;;;:::i;:::-;;:::i;:::-;;60125:100;;;;;;;;;;-1:-1:-1;60203:16:0;;60125:100;;;1134:25:1;;;1122:2;1107:18;60125:100:0;988:177:1;27867:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29935:204::-;;;;;;;;;;-1:-1:-1;29935:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2270:55:1;;;2252:74;;2240:2;2225:18;29935:204:0;2106:226:1;57913:35:0;;;;;;;;;;;;;;;;29395:474;;;;;;;;;;-1:-1:-1;29395:474:0;;;;;:::i;:::-;;:::i;58000:49::-;;;;;;;;;;-1:-1:-1;58000:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;57556:30;;;;;;;;;;;;;;;;64126:100;;;;;;;;;;-1:-1:-1;64126:100:0;;;;;:::i;:::-;;:::i;64351:77::-;;;;;;;;;;-1:-1:-1;64351:77:0;;;;;:::i;:::-;;:::i;21898:315::-;;;;;;;;;;-1:-1:-1;58533:1:0;22164:12;21951:7;22148:13;:28;-1:-1:-1;;22148:46:0;21898:315;;60231:82;;;;;;;;;;-1:-1:-1;60301:6:0;;;;60231:82;;30821:170;;;;;;;;;;-1:-1:-1;30821:170:0;;;;;:::i;:::-;;:::i;60417:643::-;;;;;;:::i;:::-;;:::i;57865:36::-;;;;;;;;;;;;;;;;61066:244;;;;;;:::i;:::-;;:::i;58078:94::-;;;;;;;;;;;;;;;;57784:30;;;;;;;;;;;;;;;;64533:137;;;;;;;;;;;;;:::i;31062:185::-;;;;;;;;;;-1:-1:-1;31062:185:0;;;;;:::i;:::-;;:::i;61843:635::-;;;;;;;;;;-1:-1:-1;61843:635:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63294:74::-;;;;;;;;;;-1:-1:-1;63294:74:0;;;;;:::i;:::-;;:::i;63882:132::-;;;;;;;;;;-1:-1:-1;63882:132:0;;;;;:::i;:::-;;:::i;57709:28::-;;;;;;;;;;-1:-1:-1;57709:28:0;;;;;;;;;;;57403:33;;;;;;;;;;;;;:::i;52415:468::-;;;;;;;;;;-1:-1:-1;52415:468:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57679:25::-;;;;;;;;;;-1:-1:-1;57679:25:0;;;;;;;;57362:36;;;;;;;;;;;;;:::i;27656:144::-;;;;;;;;;;-1:-1:-1;27656:144:0;;;;;:::i;:::-;;:::i;63754:122::-;;;;;;;;;;-1:-1:-1;63754:122:0;;;;;:::i;:::-;;:::i;57821:35::-;;;;;;;;;;;;;;;;23523:234;;;;;;;;;;-1:-1:-1;23523:234:0;;;;;:::i;:::-;;:::i;5291:103::-;;;;;;;;;;;;;:::i;59600:107::-;;;;;;;;;;-1:-1:-1;59600:107:0;;;;;:::i;:::-;;:::i;64020:100::-;;;;;;;;;;-1:-1:-1;64020:100:0;;;;;:::i;:::-;;:::i;57742:33::-;;;;;;;;;;-1:-1:-1;57742:33:0;;;;;;;;;;;63626:122;;;;;;;;;;-1:-1:-1;63626:122:0;;;;;:::i;:::-;;:::i;56227:892::-;;;;;;;;;;-1:-1:-1;56227:892:0;;;;;:::i;:::-;;:::i;59924:89::-;;;;;;;;;;-1:-1:-1;59994:13:0;;59924:89;;4640:87;;;;;;;;;;-1:-1:-1;4713:6:0;;-1:-1:-1;;;;;4713:6:0;4640:87;;57515:36;;;;;;;;;;;;;;;;64232:113;;;;;;;;;;-1:-1:-1;64232:113:0;;;;;:::i;:::-;;:::i;57629:38::-;;;;;;;;;;;;;;;;28036:104;;;;;;;;;;;;;:::i;53273:2505::-;;;;;;;;;;-1:-1:-1;53273:2505:0;;;;;:::i;:::-;;:::i;59825:93::-;;;;;;;;;;-1:-1:-1;59898:14:0;;;;;;;59825:93;;30211:308;;;;;;;;;;-1:-1:-1;30211:308:0;;;;;:::i;:::-;;:::i;57477:31::-;;;;;;;;;;;;;:::i;63374:130::-;;;;;;;;;;-1:-1:-1;63374:130:0;;;;;:::i;:::-;;:::i;31318:396::-;;;;;;;;;;-1:-1:-1;31318:396:0;;;;;:::i;:::-;;:::i;63510:110::-;;;;;;;;;;-1:-1:-1;63510:110:0;;;;;:::i;:::-;;:::i;57441:31::-;;;;;;;;;;;;;:::i;51836:420::-;;;;;;;;;;-1:-1:-1;51836:420:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;60319:92::-;;;;;;;;;;;;;:::i;59713:106::-;;;;;;;;;;-1:-1:-1;59713:106:0;;;;;:::i;:::-;-1:-1:-1;;;;;59797:16:0;59771:7;59797:16;;;:13;:16;;;;;;;59713:106;62484:514;;;;;;;;;;-1:-1:-1;62484:514:0;;;;;:::i;:::-;;:::i;57593:31::-;;;;;;;;;;;;;;;;61538:299;;;;;;;;;;-1:-1:-1;61538:299:0;;;;;:::i;:::-;;:::i;63207:81::-;;;;;;;;;;-1:-1:-1;63207:81:0;;;;;:::i;:::-;;:::i;60019:100::-;;;;;;;;;;-1:-1:-1;60097:16:0;;60019:100;;63004:197;;;;;;;;;;;;;:::i;30590:164::-;;;;;;;;;;-1:-1:-1;30590:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;30711:25:0;;;30687:4;30711:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30590:164;61318:214;;;;;;:::i;:::-;;:::i;5549:201::-;;;;;;;;;;-1:-1:-1;5549:201:0;;;;;:::i;:::-;;:::i;22844:615::-;22929:4;23229:25;-1:-1:-1;;;;;;23229:25:0;;;;:102;;-1:-1:-1;23306:25:0;-1:-1:-1;;;;;;23306:25:0;;;23229:102;:179;;;-1:-1:-1;23383:25:0;-1:-1:-1;;;;;;23383:25:0;;;23229:179;23209:199;22844:615;-1:-1:-1;;22844:615:0:o;64434:93::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;;;;;;;;;64498:14:::1;:23:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;64498:23:0;;::::1;::::0;;;::::1;::::0;;64434:93::o;27867:100::-;27921:13;27954:5;27947:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27867:100;:::o;29935:204::-;30003:7;30028:16;30036:7;30028;:16::i;:::-;30023:64;;30053:34;;;;;;;;;;;;;;30023:64;-1:-1:-1;30107:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30107:24:0;;29935:204::o;29395:474::-;29468:13;29500:27;29519:7;29500:18;:27::i;:::-;29468:61;;29550:5;-1:-1:-1;;;;;29544:11:0;:2;-1:-1:-1;;;;;29544:11:0;;29540:48;;29564:24;;;;;;;;;;;;;;29540:48;3444:10;-1:-1:-1;;;;;29605:28:0;;;29601:175;;-1:-1:-1;;;;;30711:25:0;;30687:4;30711:25;;;:18;:25;;;;;;;;3444:10;30711:35;;;;;;;;;;29648:128;;29725:35;;;;;;;;;;;;;;29648:128;29788:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;29788:29:0;-1:-1:-1;;;;;29788:29:0;;;;;;;;;29833:28;;29788:24;;29833:28;;;;;;;29457:412;29395:474;;:::o;64126:100::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;64198:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;64126:100:::0;:::o;64351:77::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;64407:6:::1;:15:::0;;-1:-1:-1;;64407:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;64351:77::o;30821:170::-;30955:28;30965:4;30971:2;30975:7;30955:9;:28::i;:::-;30821:170;;;:::o;60417:643::-;58612:6;;60518:11;;58612:6;;58611:7;58603:38;;;;-1:-1:-1;;;58603:38:0;;12363:2:1;58603:38:0;;;12345:21:1;12402:2;12382:18;;;12375:30;12441:20;12421:18;;;12414:48;12479:18;;58603:38:0;12161:342:1;58603:38:0;58670:1;58656:11;:15;:51;;;;;58689:18;;58675:11;:32;58656:51;58648:84;;;;-1:-1:-1;;;58648:84:0;;12710:2:1;58648:84:0;;;12692:21:1;12749:2;12729:18;;;12722:30;12788:22;12768:18;;;12761:50;12828:18;;58648:84:0;12508:344:1;58648:84:0;58747:10;58761:9;58747:23;58739:44;;;;-1:-1:-1;;;58739:44:0;;13059:2:1;58739:44:0;;;13041:21:1;13098:1;13078:18;;;13071:29;-1:-1:-1;;;13116:18:1;;;13109:38;13164:18;;58739:44:0;12857:331:1;58739:44:0;58828:9;;58533:1;22164:12;21951:7;22148:13;58814:11;;22148:28;;-1:-1:-1;;22148:46:0;58798:27;;;;:::i;:::-;:39;58790:72;;;;-1:-1:-1;;;58790:72:0;;13717:2:1;58790:72:0;;;13699:21:1;13756:2;13736:18;;;13729:30;-1:-1:-1;;;13775:18:1;;;13768:50;13835:18;;58790:72:0;13515:344:1;58790:72:0;58895:13;;58533:1;22164:12;21951:7;22148:13;:28;-1:-1:-1;;22148:46:0;58879:29;58875:133;;;58938:16;;58924:11;:30;58875:133;;;58989:16;;58975:11;:30;58875:133;59036:13;;58533:1;22164:12;21951:7;22148:13;:28;-1:-1:-1;;22148:46:0;59020:29;:76;;;;-1:-1:-1;59083:13:0;;58533:1;22164:12;21951:7;22148:13;59069:11;;22148:28;;-1:-1:-1;;22148:46:0;59053:27;;;;:::i;:::-;:43;59020:76;59016:403;;;59112:16;59161:13;;59147:11;59131:13;58533:1;22164:12;21951:7;22148:13;-1:-1:-1;;22148:28:0;;;:46;;21898:315;59131:13;:27;;;;:::i;:::-;:43;;;;:::i;:::-;59112:62;;59201:8;59190;;:19;;;;:::i;:::-;59183:4;:26;-1:-1:-1;59016:403:0;;;59262:13;;58533:1;22164:12;21951:7;22148:13;59248:11;;22148:28;;-1:-1:-1;;22148:46:0;59232:27;;;;:::i;:::-;:43;59228:191;;;59309:11;59298:8;;:22;;;;:::i;:::-;59291:4;:29;59228:191;;;59374:13;;58533:1;22164:12;21951:7;22148:13;59359:11;;22148:28;;-1:-1:-1;;22148:46:0;59343:27;;;;:::i;:::-;:44;59339:80;;59410:1;59403:4;:8;59339:80;59448:4;;59435:9;:17;;59427:49;;;;-1:-1:-1;;;59427:49:0;;14369:2:1;59427:49:0;;;14351:21:1;14408:2;14388:18;;;14381:30;14447:21;14427:18;;;14420:49;14486:18;;59427:49:0;14167:343:1;59427:49:0;59533:11;;59505:10;59491:25;;;;:13;:25;;;;;;:39;;59519:11;;59491:39;:::i;:::-;:53;59483:95;;;;-1:-1:-1;;;59483:95:0;;14717:2:1;59483:95:0;;;14699:21:1;14756:2;14736:18;;;14729:30;14795:31;14775:18;;;14768:59;14844:18;;59483:95:0;14515:353:1;59483:95:0;60553:14:::1;::::0;;;::::1;;;60549:506;;;60608:28;::::0;-1:-1:-1;;60625:10:0::1;15022:2:1::0;15018:15;15014:53;60608:28:0::1;::::0;::::1;15002:66:1::0;60583:12:0::1;::::0;15084::1;;60608:28:0::1;;;;;;;;;;;;60598:39;;;;;;60583:54;;60656:50;60675:12;;60656:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;60689:10:0::1;::::0;;-1:-1:-1;60701:4:0;;-1:-1:-1;60656:18:0::1;:50::i;:::-;60648:83;;;::::0;-1:-1:-1;;;60648:83:0;;15309:2:1;60648:83:0::1;::::0;::::1;15291:21:1::0;15348:2;15328:18;;;15321:30;15387:22;15367:18;;;15360:50;15427:18;;60648:83:0::1;15107:344:1::0;60648:83:0::1;60758:28;::::0;-1:-1:-1;;60775:10:0::1;15022:2:1::0;15018:15;15014:53;60758:28:0::1;::::0;::::1;15002:66:1::0;60791:4:0;;15084:12:1;;60758:28:0::1;;;;;;;;;;;;60748:39;;;;;;:47;60740:76;;;::::0;-1:-1:-1;;;60740:76:0;;15658:2:1;60740:76:0::1;::::0;::::1;15640:21:1::0;15697:2;15677:18;;;15670:30;15736:18;15716;;;15709:46;15772:18;;60740:76:0::1;15456:340:1::0;60740:76:0::1;60841:10;60827:25;::::0;;;:13:::1;:25;::::0;;;;:40;;60856:11;;60827:25;:40:::1;::::0;60856:11;;60827:40:::1;:::i;:::-;::::0;;;-1:-1:-1;60876:34:0::1;::::0;-1:-1:-1;60886:10:0::1;60898:11:::0;60876:9:::1;:34::i;:::-;60574:344;60549:506;;;60934:14;::::0;;;::::1;;;60929:126;;60978:10;60964:25;::::0;;;:13:::1;:25;::::0;;;;:40;;60993:11;;60964:25;:40:::1;::::0;60993:11;;60964:40:::1;:::i;:::-;::::0;;;-1:-1:-1;61013:34:0::1;::::0;-1:-1:-1;61023:10:0::1;61035:11:::0;61013:9:::1;:34::i;:::-;60417:643:::0;;;;:::o;61066:244::-;58612:6;;61131:11;;58612:6;;58611:7;58603:38;;;;-1:-1:-1;;;58603:38:0;;12363:2:1;58603:38:0;;;12345:21:1;12402:2;12382:18;;;12375:30;12441:20;12421:18;;;12414:48;12479:18;;58603:38:0;12161:342:1;58603:38:0;58670:1;58656:11;:15;:51;;;;;58689:18;;58675:11;:32;58656:51;58648:84;;;;-1:-1:-1;;;58648:84:0;;12710:2:1;58648:84:0;;;12692:21:1;12749:2;12729:18;;;12722:30;12788:22;12768:18;;;12761:50;12828:18;;58648:84:0;12508:344:1;58648:84:0;58747:10;58761:9;58747:23;58739:44;;;;-1:-1:-1;;;58739:44:0;;13059:2:1;58739:44:0;;;13041:21:1;13098:1;13078:18;;;13071:29;-1:-1:-1;;;13116:18:1;;;13109:38;13164:18;;58739:44:0;12857:331:1;58739:44:0;58828:9;;58533:1;22164:12;21951:7;22148:13;58814:11;;22148:28;;-1:-1:-1;;22148:46:0;58798:27;;;;:::i;:::-;:39;58790:72;;;;-1:-1:-1;;;58790:72:0;;13717:2:1;58790:72:0;;;13699:21:1;13756:2;13736:18;;;13729:30;-1:-1:-1;;;13775:18:1;;;13768:50;13835:18;;58790:72:0;13515:344:1;58790:72:0;58895:13;;58533:1;22164:12;21951:7;22148:13;:28;-1:-1:-1;;22148:46:0;58879:29;58875:133;;;58938:16;;58924:11;:30;58875:133;;;58989:16;;58975:11;:30;58875:133;59036:13;;58533:1;22164:12;21951:7;22148:13;:28;-1:-1:-1;;22148:46:0;59020:29;:76;;;;-1:-1:-1;59083:13:0;;58533:1;22164:12;21951:7;22148:13;59069:11;;22148:28;;-1:-1:-1;;22148:46:0;59053:27;;;;:::i;:::-;:43;59020:76;59016:403;;;59112:16;59161:13;;59147:11;59131:13;58533:1;22164:12;21951:7;22148:13;-1:-1:-1;;22148:28:0;;;:46;;21898:315;59131:13;:27;;;;:::i;:::-;:43;;;;:::i;:::-;59112:62;;59201:8;59190;;:19;;;;:::i;:::-;59183:4;:26;-1:-1:-1;59016:403:0;;;59262:13;;58533:1;22164:12;21951:7;22148:13;59248:11;;22148:28;;-1:-1:-1;;22148:46:0;59232:27;;;;:::i;:::-;:43;59228:191;;;59309:11;59298:8;;:22;;;;:::i;:::-;59291:4;:29;59228:191;;;59374:13;;58533:1;22164:12;21951:7;22148:13;59359:11;;22148:28;;-1:-1:-1;;22148:46:0;59343:27;;;;:::i;:::-;:44;59339:80;;59410:1;59403:4;:8;59339:80;59448:4;;59435:9;:17;;59427:49;;;;-1:-1:-1;;;59427:49:0;;14369:2:1;59427:49:0;;;14351:21:1;14408:2;14388:18;;;14381:30;14447:21;14427:18;;;14420:49;14486:18;;59427:49:0;14167:343:1;59427:49:0;59533:11;;59505:10;59491:25;;;;:13;:25;;;;;;:39;;59519:11;;59491:39;:::i;:::-;:53;59483:95;;;;-1:-1:-1;;;59483:95:0;;14717:2:1;59483:95:0;;;14699:21:1;14756:2;14736:18;;;14729:30;14795:31;14775:18;;;14768:59;14844:18;;59483:95:0;14515:353:1;59483:95:0;61171:14:::1;::::0;;;::::1;;;61170:15;61162:52;;;::::0;-1:-1:-1;;;61162:52:0;;16003:2:1;61162:52:0::1;::::0;::::1;15985:21:1::0;16042:2;16022:18;;;16015:30;16081:26;16061:18;;;16054:54;16125:18;;61162:52:0::1;15801:348:1::0;61162:52:0::1;61237:10;61223:25;::::0;;;:13:::1;:25;::::0;;;;:40;;61252:11;;61223:25;:40:::1;::::0;61252:11;;61223:40:::1;:::i;:::-;::::0;;;-1:-1:-1;61270:34:0::1;::::0;-1:-1:-1;61280:10:0::1;61292:11:::0;61270:9:::1;:34::i;64533:137::-:0;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;64578:7:::1;64599;4713:6:::0;;-1:-1:-1;;;;;4713:6:0;;4640:87;64599:7:::1;-1:-1:-1::0;;;;;64591:21:0::1;64620;64591:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64577:69;;;64661:2;64653:11;;;::::0;::::1;;64570:100;64533:137::o:0;31062:185::-;31200:39;31217:4;31223:2;31227:7;31200:39;;;;;;;;;;;;:16;:39::i;61843:635::-;61918:16;61946:23;61972:17;61982:6;61972:9;:17::i;:::-;61946:43;;61996:30;62043:15;62029:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62029:30:0;-1:-1:-1;61996:63:0;-1:-1:-1;62091:1:0;62066:22;62135:309;62160:15;62142;:33;:64;;;;;62197:9;;62179:14;:27;;62142:64;62135:309;;;62217:25;62245:23;62253:14;62245:7;:23::i;:::-;62217:51;;62304:6;-1:-1:-1;;;;;62283:27:0;:17;-1:-1:-1;;;;;62283:27:0;;62279:131;;62356:14;62323:13;62337:15;62323:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;62383:17;;;;:::i;:::-;;;;62279:131;62420:16;;;;:::i;:::-;;;;62208:236;62135:309;;;-1:-1:-1;62459:13:0;;61843:635;-1:-1:-1;;;;61843:635:0:o;63294:74::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;63350:4:::1;:12:::0;63294:74::o;63882:132::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;63970:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;57403:33::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52415:468::-;52590:15;;52504:23;;52565:22;52590:15;52657:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;52657:36:0;;-1:-1:-1;;52657:36:0;;;;;;;;;;;;52620:73;;52713:9;52708:125;52729:14;52724:1;:19;52708:125;;52785:32;52805:8;52814:1;52805:11;;;;;;;;:::i;:::-;;;;;;;52785:19;:32::i;:::-;52769:10;52780:1;52769:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;52745:3;;52708:125;;;-1:-1:-1;52854:10:0;52415:468;-1:-1:-1;;;52415:468:0:o;57362:36::-;;;;;;;:::i;27656:144::-;27720:7;27763:27;27782:7;27763:18;:27::i;63754:122::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;63834:16:::1;:36:::0;63754:122::o;23523:234::-;23587:7;23629:5;23639:1;23611:29;23607:70;;23649:28;;;;;;;;;;;;;;23607:70;-1:-1:-1;;;;;;23695:25:0;;;;;:18;:25;;;;;;18868:13;23695:54;;23523:234::o;5291:103::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;5356:30:::1;5383:1;5356:18;:30::i;:::-;5291:103::o:0;59600:107::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;59675:10:::1;:26:::0;59600:107::o;64020:100::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;64092:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;63626:122::-:0;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;63706:16:::1;:36:::0;63626:122::o;56227:892::-;56297:16;56351:19;56385:25;56425:22;56450:16;56460:5;56450:9;:16::i;:::-;56425:41;;56481:25;56523:14;56509:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56509:29:0;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;56481:57:0;;-1:-1:-1;58533:1:0;56599:472;56648:14;56633:11;:29;56599:472;;56700:15;56713:1;56700:12;:15::i;:::-;56688:27;;56738:9;:16;;;56779:8;56734:73;56829:14;;-1:-1:-1;;;;;56829:28:0;;56825:111;;56902:14;;;-1:-1:-1;56825:111:0;56979:5;-1:-1:-1;;;;;56958:26:0;:17;-1:-1:-1;;;;;56958:26:0;;56954:102;;57035:1;57009:8;57018:13;;;;;;57009:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;56954:102;56664:3;;56599:472;;;-1:-1:-1;57092:8:0;;56227:892;-1:-1:-1;;;;;;56227:892:0:o;64232:113::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;64310:29;;::::1;::::0;:12:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;28036:104::-:0;28092:13;28125:7;28118:14;;;;;:::i;53273:2505::-;53408:16;53475:4;53466:5;:13;53462:45;;53488:19;;;;;;;;;;;;;;53462:45;53522:19;53556:17;53576:14;21640:7;21667:13;;21593:95;53576:14;53556:34;-1:-1:-1;58533:1:0;53668:5;:23;53664:87;;;58533:1;53712:23;;53664:87;53827:9;53820:4;:16;53816:73;;;53864:9;53857:16;;53816:73;53903:25;53931:16;53941:5;53931:9;:16::i;:::-;53903:44;;54125:4;54117:5;:12;54113:278;;;54172:12;;;54207:31;;;54203:111;;;54283:11;54263:31;;54203:111;54131:198;54113:278;;;-1:-1:-1;54374:1:0;54113:278;54405:25;54447:17;54433:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54433:32:0;;54405:60;;54484:17;54505:1;54484:22;54480:78;;54534:8;-1:-1:-1;54527:15:0;;-1:-1:-1;;;54527:15:0;54480:78;54702:31;54736:26;54756:5;54736:19;:26::i;:::-;54702:60;;54777:25;55022:9;:16;;;55017:92;;-1:-1:-1;55079:14:0;;55017:92;55140:5;55123:478;55152:4;55147:1;:9;;:45;;;;;55175:17;55160:11;:32;;55147:45;55123:478;;;55230:15;55243:1;55230:12;:15::i;:::-;55218:27;;55268:9;:16;;;55309:8;55264:73;55359:14;;-1:-1:-1;;;;;55359:28:0;;55355:111;;55432:14;;;-1:-1:-1;55355:111:0;55509:5;-1:-1:-1;;;;;55488:26:0;:17;-1:-1:-1;;;;;55488:26:0;;55484:102;;55565:1;55539:8;55548:13;;;;;;55539:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;55484:102;55194:3;;55123:478;;;-1:-1:-1;;;55686:29:0;;;-1:-1:-1;55693:8:0;;-1:-1:-1;;53273:2505:0;;;;;;:::o;30211:308::-;3444:10;-1:-1:-1;;;;;30310:31:0;;;30306:61;;30350:17;;;;;;;;;;;;;;30306:61;3444:10;30380:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;30380:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;30380:60:0;;;;;;;;;;30456:55;;586:41:1;;;30380:49:0;;3444:10;30456:55;;559:18:1;30456:55:0;;;;;;;30211:308;;:::o;57477:31::-;;;;;;;:::i;63374:130::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;63458:18:::1;:40:::0;63374:130::o;31318:396::-;31485:28;31495:4;31501:2;31505:7;31485:9;:28::i;:::-;-1:-1:-1;;;;;31528:14:0;;;:19;31524:183;;31567:56;31598:4;31604:2;31608:7;31617:5;31567:30;:56::i;:::-;31562:145;;31651:40;;-1:-1:-1;;;31651:40:0;;;;;;;;;;;63510:110;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;63584:13:::1;:30:::0;63510:110::o;57441:31::-;;;;;;;:::i;51836:420::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58533:1:0;51992:7;:25;:54;;;-1:-1:-1;21640:7:0;21667:13;52021:7;:25;;51992:54;51988:103;;;52070:9;51836:420;-1:-1:-1;;51836:420:0:o;51988:103::-;52113:21;52126:7;52113:12;:21::i;:::-;52101:33;;52149:9;:16;;;52145:65;;;52189:9;51836:420;-1:-1:-1;;51836:420:0:o;52145:65::-;52227:21;52240:7;52227:12;:21::i;60319:92::-;60366:7;60392:13;58533:1;22164:12;21951:7;22148:13;-1:-1:-1;;22148:28:0;;;:46;;21898:315;60392:13;60385:20;;60319:92;:::o;62484:514::-;62603:13;62644:17;62652:8;62644:7;:17::i;:::-;62628:98;;;;-1:-1:-1;;;62628:98:0;;16895:2:1;62628:98:0;;;16877:21:1;16934:2;16914:18;;;16907:30;16973:34;16953:18;;;16946:62;17044:17;17024:18;;;17017:45;17079:19;;62628:98:0;16693:411:1;62628:98:0;62739:8;;;;;;;:17;;62751:5;62739:17;62735:64;;62774:17;62767:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62484:514;;;:::o;62735:64::-;62807:28;62838:10;:8;:10::i;:::-;62807:41;;62893:1;62868:14;62862:28;:32;:130;;;;;;;;;;;;;;;;;62930:14;62946:19;62956:8;62946:9;:19::i;:::-;62967:9;62913:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62855:137;62484:514;-1:-1:-1;;;62484:514:0:o;61538:299::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;61659:9:::1;61654:178;61670:20:::0;;::::1;61654:178;;;61747:9;;61735:6;;61742:1;61735:9;;;;;;;:::i;:::-;;;;;;;61719:13;58533:1:::0;22164:12;21951:7;22148:13;-1:-1:-1;;22148:28:0;;;:46;;21898:315;61719:13:::1;:25;;;;:::i;:::-;:37;61711:70;;;::::0;-1:-1:-1;;;61711:70:0;;13717:2:1;61711:70:0::1;::::0;::::1;13699:21:1::0;13756:2;13736:18;;;13729:30;-1:-1:-1;;;13775:18:1;;;13768:50;13835:18;;61711:70:0::1;13515:344:1::0;61711:70:0::1;61790:34;61800:9;;61810:1;61800:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;61814:6;;61821:1;61814:9;;;;;;;:::i;:::-;;;;;;;61790;:34::i;:::-;61692:3:::0;::::1;::::0;::::1;:::i;:::-;;;;61654:178;;;;61538:299:::0;;;;:::o;63207:81::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;63265:8:::1;:17:::0;;;::::1;;;;-1:-1:-1::0;;63265:17:0;;::::1;::::0;;;::::1;::::0;;63207:81::o;63004:197::-;63060:13;63126:1;63103:12;63097:26;;;;;:::i;:::-;;;:30;:98;;-1:-1:-1;63097:98:0;;;;;;;;;-1:-1:-1;63097:98:0;;;60319:92::o;63097:98::-;63165:12;63148:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;63090:105;;63004:197;:::o;61318:214::-;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;61452:9:::1;::::0;58533:1;22164:12;21951:7;22148:13;61438:11;;22148:28;;-1:-1:-1;;22148:46:0;61422:27:::1;;;;:::i;:::-;:39;61414:72;;;::::0;-1:-1:-1;;;61414:72:0;;13717:2:1;61414:72:0::1;::::0;::::1;13699:21:1::0;13756:2;13736:18;;;13729:30;-1:-1:-1;;;13775:18:1;;;13768:50;13835:18;;61414:72:0::1;13515:344:1::0;61414:72:0::1;61493:33;61503:9;61514:11;61493:9;:33::i;5549:201::-:0;4713:6;;-1:-1:-1;;;;;4713:6:0;3444:10;4860:23;4852:68;;;;-1:-1:-1;;;4852:68:0;;11560:2:1;4852:68:0;;;11542:21:1;;;11579:18;;;11572:30;-1:-1:-1;;;;;;;;;;;11618:18:1;;;11611:62;11690:18;;4852:68:0;11358:356:1;4852:68:0;-1:-1:-1;;;;;5638:22:0;::::1;5630:73;;;::::0;-1:-1:-1;;;5630:73:0;;19229:2:1;5630:73:0::1;::::0;::::1;19211:21:1::0;19268:2;19248:18;;;19241:30;19307:34;19287:18;;;19280:62;19378:8;19358:18;;;19351:36;19404:19;;5630:73:0::1;19027:402:1::0;5630:73:0::1;5714:28;5733:8;5714:18;:28::i;31969:273::-:0;32026:4;32082:7;58533:1;32063:26;;:66;;;;;32116:13;;32106:7;:23;32063:66;:152;;;;-1:-1:-1;;32167:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;32167:43:0;:48;;31969:273::o;25171:1129::-;25238:7;25273;;58533:1;25322:23;25318:915;;25375:13;;25368:4;:20;25364:869;;;25413:14;25430:23;;;:17;:23;;;;;;;-1:-1:-1;;;25519:23:0;;:28;;25515:699;;26038:113;26045:6;26055:1;26045:11;26038:113;;-1:-1:-1;;;26116:6:0;26098:25;;;;:17;:25;;;;;;26038:113;;25515:699;25390:843;25364:869;26261:31;;;;;;;;;;;;;;37228:2654;37343:27;37373;37392:7;37373:18;:27::i;:::-;37343:57;;37458:4;-1:-1:-1;;;;;37417:45:0;37433:19;-1:-1:-1;;;;;37417:45:0;;37413:86;;37471:28;;;;;;;;;;;;;;37413:86;37512:23;37538:24;;;:15;:24;;;;;;-1:-1:-1;;;;;37538:24:0;;;;37512:23;37601:27;;3444:10;37601:27;;:87;;-1:-1:-1;;;;;;30711:25:0;;30687:4;30711:25;;;:18;:25;;;;;;;;3444:10;30711:35;;;;;;;;;;37645:43;37601:142;;;-1:-1:-1;;;;;;37705:38:0;;3444:10;37705:38;37601:142;37575:169;;37762:17;37757:66;;37788:35;;;;;;;;;;;;;;37757:66;37856:2;37863:1;37838:26;37834:62;;37873:23;;;;;;;;;;;;;;37834:62;38040:15;38022:39;38018:103;;38085:24;;;;:15;:24;;;;;38078:31;;-1:-1:-1;;38078:31:0;;;38018:103;-1:-1:-1;;;;;38488:24:0;;;;;;;:18;:24;;;;;;;;38486:26;;-1:-1:-1;;38486:26:0;;;38557:22;;;;;;;;38555:24;;-1:-1:-1;38555:24:0;;;38850:26;;;:17;:26;;;;;19916:8;38938:15;19522:3;38938:41;38896:84;;:128;;38850:174;;;39144:46;;:51;;39140:626;;39248:1;39238:11;;39216:19;39371:30;;;:17;:30;;;;;;:35;;39367:384;;39509:13;;39494:11;:28;39490:242;;39656:30;;;;:17;:30;;;;;:52;;;39490:242;39197:569;39140:626;39813:7;39809:2;-1:-1:-1;;;;;39794:27:0;39803:4;-1:-1:-1;;;;;39794:27:0;;;;;;;;;;;37332:2550;;;37228:2654;;;:::o;1220:190::-;1345:4;1398;1369:25;1382:5;1389:4;1369:12;:25::i;:::-;:33;;1220:190;-1:-1:-1;;;;1220:190:0:o;32326:104::-;32395:27;32405:2;32409:8;32395:27;;;;;;;;;;;;:9;:27::i;5910:191::-;6003:6;;;-1:-1:-1;;;;;6020:17:0;;;-1:-1:-1;;6020:17:0;;;;;;;6053:40;;6003:6;;;6020:17;6003:6;;6053:40;;5984:16;;6053:40;5973:128;5910:191;:::o;26780:153::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;26900:24:0;;;;:17;:24;;;;;;26881:44;;-1:-1:-1;;;;;;;;;;;;;26504:41:0;;;;19522:3;26590:32;;;26556:67;;-1:-1:-1;;;26556:67:0;-1:-1:-1;;;26653:23:0;;;:28;;-1:-1:-1;;;26634:47:0;-1:-1:-1;26394:295:0;43705:716;43889:88;;-1:-1:-1;;;43889:88:0;;43868:4;;-1:-1:-1;;;;;43889:45:0;;;;;:88;;3444:10;;43956:4;;43962:7;;43971:5;;43889:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43889:88:0;;;;;;;;-1:-1:-1;;43889:88:0;;;;;;;;;;;;:::i;:::-;;;43885:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44172:6;:13;44189:1;44172:18;44168:235;;44218:40;;-1:-1:-1;;;44218:40:0;;;;;;;;;;;44168:235;44361:6;44355:13;44346:6;44342:2;44338:15;44331:38;43885:529;-1:-1:-1;;;;;;44048:64:0;-1:-1:-1;;;44048:64:0;;-1:-1:-1;43885:529:0;43705:716;;;;;;:::o;27436:158::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;27539:47:0;27558:27;27577:7;27558:18;:27::i;:::-;-1:-1:-1;;;;;;;;;;;;;26504:41:0;;;;19522:3;26590:32;;;26556:67;;-1:-1:-1;;;26556:67:0;-1:-1:-1;;;26653:23:0;;;:28;;-1:-1:-1;;;26634:47:0;-1:-1:-1;26394:295:0;64676:104;64736:13;64765:9;64758:16;;;;;:::i;46447:1943::-;46916:4;46910:11;;46923:3;46906:21;;47001:17;;;;47697:11;;;47576:5;47829:2;47843;47833:13;;47825:22;47697:11;47812:36;47884:2;47874:13;;47468:680;47903:4;47468:680;;;48077:1;48072:3;48068:11;48061:18;;48128:2;48122:4;48118:13;48114:2;48110:22;48105:3;48097:36;47998:2;47988:13;;47468:680;;;-1:-1:-1;48178:13:0;;;-1:-1:-1;;48293:12:0;;;48353:19;;;48293:12;46447:1943;-1:-1:-1;46447:1943:0:o;1771:675::-;1854:7;1897:4;1854:7;1912:497;1936:5;:12;1932:1;:16;1912:497;;;1970:20;1993:5;1999:1;1993:8;;;;;;;;:::i;:::-;;;;;;;1970:31;;2036:12;2020;:28;2016:382;;2522:13;2572:15;;;2608:4;2601:15;;;2655:4;2639:21;;2148:57;;2016:382;;;2522:13;2572:15;;;2608:4;2601:15;;;2655:4;2639:21;;2325:57;;2016:382;-1:-1:-1;1950:3:0;;;;:::i;:::-;;;;1912:497;;32803:2246;32926:20;32949:13;32995:2;33002:1;32977:26;32973:58;;33012:19;;;;;;;;;;;;;;32973:58;33046:8;33058:1;33046:13;33042:44;;33068:18;;;;;;;;;;;;;;33042:44;-1:-1:-1;;;;;33635:22:0;;;;;;:18;:22;;;;19005:2;33635:22;;;:70;;33673:31;33661:44;;33635:70;;;33948:31;;;:17;:31;;;;;34041:15;19522:3;34041:41;33999:84;;-1:-1:-1;34119:13:0;;19781:3;34104:56;33999:162;33948:213;;:31;;34242:23;;;;34286:14;:19;34282:635;;34326:313;34357:38;;34382:12;;-1:-1:-1;;;;;34357:38:0;;;34374:1;;34357:38;;34374:1;;34357:38;34423:69;34462:1;34466:2;34470:14;;;;;;34486:5;34423:30;:69::i;:::-;34418:174;;34528:40;;-1:-1:-1;;;34528:40:0;;;;;;;;;;;34418:174;34634:3;34619:12;:18;34326:313;;34720:12;34703:13;;:29;34699:43;;34734:8;;;34699:43;34282:635;;;34783:119;34814:40;;34839:14;;;;;-1:-1:-1;;;;;34814:40:0;;;34831:1;;34814:40;;34831:1;;34814:40;34897:3;34882:12;:18;34783:119;;34282:635;-1:-1:-1;34931:13:0;:28;;;34981:60;;35014:2;35018:12;35032:8;34981:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:160::-;703:20;;759:13;;752:21;742:32;;732:60;;788:1;785;778:12;732:60;638:160;;;:::o;803:180::-;859:6;912:2;900:9;891:7;887:23;883:32;880:52;;;928:1;925;918:12;880:52;951:26;967:9;951:26;:::i;1170:258::-;1242:1;1252:113;1266:6;1263:1;1260:13;1252:113;;;1342:11;;;1336:18;1323:11;;;1316:39;1288:2;1281:10;1252:113;;;1383:6;1380:1;1377:13;1374:48;;;-1:-1:-1;;1418:1:1;1400:16;;1393:27;1170:258::o;1433:::-;1475:3;1513:5;1507:12;1540:6;1535:3;1528:19;1556:63;1612:6;1605:4;1600:3;1596:14;1589:4;1582:5;1578:16;1556:63;:::i;:::-;1673:2;1652:15;-1:-1:-1;;1648:29:1;1639:39;;;;1680:4;1635:50;;1433:258;-1:-1:-1;;1433:258:1:o;1696:220::-;1845:2;1834:9;1827:21;1808:4;1865:45;1906:2;1895:9;1891:18;1883:6;1865:45;:::i;1921:180::-;1980:6;2033:2;2021:9;2012:7;2008:23;2004:32;2001:52;;;2049:1;2046;2039:12;2001:52;-1:-1:-1;2072:23:1;;1921:180;-1:-1:-1;1921:180:1:o;2337:196::-;2405:20;;-1:-1:-1;;;;;2454:54:1;;2444:65;;2434:93;;2523:1;2520;2513:12;2538:254;2606:6;2614;2667:2;2655:9;2646:7;2642:23;2638:32;2635:52;;;2683:1;2680;2673:12;2635:52;2706:29;2725:9;2706:29;:::i;:::-;2696:39;2782:2;2767:18;;;;2754:32;;-1:-1:-1;;;2538:254:1:o;2797:186::-;2856:6;2909:2;2897:9;2888:7;2884:23;2880:32;2877:52;;;2925:1;2922;2915:12;2877:52;2948:29;2967:9;2948:29;:::i;2988:184::-;-1:-1:-1;;;3037:1:1;3030:88;3137:4;3134:1;3127:15;3161:4;3158:1;3151:15;3177:275;3248:2;3242:9;3313:2;3294:13;;-1:-1:-1;;3290:27:1;3278:40;;3348:18;3333:34;;3369:22;;;3330:62;3327:88;;;3395:18;;:::i;:::-;3431:2;3424:22;3177:275;;-1:-1:-1;3177:275:1:o;3457:407::-;3522:5;3556:18;3548:6;3545:30;3542:56;;;3578:18;;:::i;:::-;3616:57;3661:2;3640:15;;-1:-1:-1;;3636:29:1;3667:4;3632:40;3616:57;:::i;:::-;3607:66;;3696:6;3689:5;3682:21;3736:3;3727:6;3722:3;3718:16;3715:25;3712:45;;;3753:1;3750;3743:12;3712:45;3802:6;3797:3;3790:4;3783:5;3779:16;3766:43;3856:1;3849:4;3840:6;3833:5;3829:18;3825:29;3818:40;3457:407;;;;;:::o;3869:451::-;3938:6;3991:2;3979:9;3970:7;3966:23;3962:32;3959:52;;;4007:1;4004;3997:12;3959:52;4047:9;4034:23;4080:18;4072:6;4069:30;4066:50;;;4112:1;4109;4102:12;4066:50;4135:22;;4188:4;4180:13;;4176:27;-1:-1:-1;4166:55:1;;4217:1;4214;4207:12;4166:55;4240:74;4306:7;4301:2;4288:16;4283:2;4279;4275:11;4240:74;:::i;4325:328::-;4402:6;4410;4418;4471:2;4459:9;4450:7;4446:23;4442:32;4439:52;;;4487:1;4484;4477:12;4439:52;4510:29;4529:9;4510:29;:::i;:::-;4500:39;;4558:38;4592:2;4581:9;4577:18;4558:38;:::i;:::-;4548:48;;4643:2;4632:9;4628:18;4615:32;4605:42;;4325:328;;;;;:::o;4658:367::-;4721:8;4731:6;4785:3;4778:4;4770:6;4766:17;4762:27;4752:55;;4803:1;4800;4793:12;4752:55;-1:-1:-1;4826:20:1;;4869:18;4858:30;;4855:50;;;4901:1;4898;4891:12;4855:50;4938:4;4930:6;4926:17;4914:29;;4998:3;4991:4;4981:6;4978:1;4974:14;4966:6;4962:27;4958:38;4955:47;4952:67;;;5015:1;5012;5005:12;4952:67;4658:367;;;;;:::o;5030:505::-;5125:6;5133;5141;5194:2;5182:9;5173:7;5169:23;5165:32;5162:52;;;5210:1;5207;5200:12;5162:52;5250:9;5237:23;5283:18;5275:6;5272:30;5269:50;;;5315:1;5312;5305:12;5269:50;5354:70;5416:7;5407:6;5396:9;5392:22;5354:70;:::i;:::-;5443:8;;5328:96;;-1:-1:-1;5525:2:1;5510:18;;;;5497:32;;5030:505;-1:-1:-1;;;;5030:505:1:o;5722:632::-;5893:2;5945:21;;;6015:13;;5918:18;;;6037:22;;;5864:4;;5893:2;6116:15;;;;6090:2;6075:18;;;5864:4;6159:169;6173:6;6170:1;6167:13;6159:169;;;6234:13;;6222:26;;6303:15;;;;6268:12;;;;6195:1;6188:9;6159:169;;6359:946;6443:6;6474:2;6517;6505:9;6496:7;6492:23;6488:32;6485:52;;;6533:1;6530;6523:12;6485:52;6573:9;6560:23;6602:18;6643:2;6635:6;6632:14;6629:34;;;6659:1;6656;6649:12;6629:34;6697:6;6686:9;6682:22;6672:32;;6742:7;6735:4;6731:2;6727:13;6723:27;6713:55;;6764:1;6761;6754:12;6713:55;6800:2;6787:16;6822:2;6818;6815:10;6812:36;;;6828:18;;:::i;:::-;6874:2;6871:1;6867:10;6857:20;;6897:28;6921:2;6917;6913:11;6897:28;:::i;:::-;6959:15;;;7029:11;;;7025:20;;;6990:12;;;;7057:19;;;7054:39;;;7089:1;7086;7079:12;7054:39;7113:11;;;;7133:142;7149:6;7144:3;7141:15;7133:142;;;7215:17;;7203:30;;7166:12;;;;7253;;;;7133:142;;;7294:5;6359:946;-1:-1:-1;;;;;;;;6359:946:1:o;7616:722::-;7849:2;7901:21;;;7971:13;;7874:18;;;7993:22;;;7820:4;;7849:2;8072:15;;;;8046:2;8031:18;;;7820:4;8115:197;8129:6;8126:1;8123:13;8115:197;;;8178:52;8226:3;8217:6;8211:13;7394:12;;-1:-1:-1;;;;;7390:61:1;7378:74;;7505:4;7494:16;;;7488:23;7513:18;7484:48;7468:14;;;7461:72;7596:4;7585:16;;;7579:23;7572:31;7565:39;7549:14;;7542:63;7310:301;8178:52;8287:15;;;;8259:4;8250:14;;;;;8151:1;8144:9;8115:197;;8528:322;8605:6;8613;8621;8674:2;8662:9;8653:7;8649:23;8645:32;8642:52;;;8690:1;8687;8680:12;8642:52;8713:29;8732:9;8713:29;:::i;:::-;8703:39;8789:2;8774:18;;8761:32;;-1:-1:-1;8840:2:1;8825:18;;;8812:32;;8528:322;-1:-1:-1;;;8528:322:1:o;8855:254::-;8920:6;8928;8981:2;8969:9;8960:7;8956:23;8952:32;8949:52;;;8997:1;8994;8987:12;8949:52;9020:29;9039:9;9020:29;:::i;:::-;9010:39;;9068:35;9099:2;9088:9;9084:18;9068:35;:::i;:::-;9058:45;;8855:254;;;;;:::o;9114:667::-;9209:6;9217;9225;9233;9286:3;9274:9;9265:7;9261:23;9257:33;9254:53;;;9303:1;9300;9293:12;9254:53;9326:29;9345:9;9326:29;:::i;:::-;9316:39;;9374:38;9408:2;9397:9;9393:18;9374:38;:::i;:::-;9364:48;;9459:2;9448:9;9444:18;9431:32;9421:42;;9514:2;9503:9;9499:18;9486:32;9541:18;9533:6;9530:30;9527:50;;;9573:1;9570;9563:12;9527:50;9596:22;;9649:4;9641:13;;9637:27;-1:-1:-1;9627:55:1;;9678:1;9675;9668:12;9627:55;9701:74;9767:7;9762:2;9749:16;9744:2;9740;9736:11;9701:74;:::i;:::-;9691:84;;;9114:667;;;;;;;:::o;9786:265::-;7394:12;;-1:-1:-1;;;;;7390:61:1;7378:74;;7505:4;7494:16;;;7488:23;7513:18;7484:48;7468:14;;;7461:72;7596:4;7585:16;;;7579:23;7572:31;7565:39;7549:14;;;7542:63;9982:2;9967:18;;9994:51;7310:301;10056:773;10178:6;10186;10194;10202;10255:2;10243:9;10234:7;10230:23;10226:32;10223:52;;;10271:1;10268;10261:12;10223:52;10311:9;10298:23;10340:18;10381:2;10373:6;10370:14;10367:34;;;10397:1;10394;10387:12;10367:34;10436:70;10498:7;10489:6;10478:9;10474:22;10436:70;:::i;:::-;10525:8;;-1:-1:-1;10410:96:1;-1:-1:-1;10613:2:1;10598:18;;10585:32;;-1:-1:-1;10629:16:1;;;10626:36;;;10658:1;10655;10648:12;10626:36;;10697:72;10761:7;10750:8;10739:9;10735:24;10697:72;:::i;:::-;10056:773;;;;-1:-1:-1;10788:8:1;-1:-1:-1;;;;10056:773:1:o;10834:260::-;10902:6;10910;10963:2;10951:9;10942:7;10938:23;10934:32;10931:52;;;10979:1;10976;10969:12;10931:52;11002:29;11021:9;11002:29;:::i;:::-;10992:39;;11050:38;11084:2;11073:9;11069:18;11050:38;:::i;11099:254::-;11167:6;11175;11228:2;11216:9;11207:7;11203:23;11199:32;11196:52;;;11244:1;11241;11234:12;11196:52;11280:9;11267:23;11257:33;;11309:38;11343:2;11332:9;11328:18;11309:38;:::i;11719:437::-;11798:1;11794:12;;;;11841;;;11862:61;;11916:4;11908:6;11904:17;11894:27;;11862:61;11969:2;11961:6;11958:14;11938:18;11935:38;11932:218;;-1:-1:-1;;;12003:1:1;11996:88;12107:4;12104:1;12097:15;12135:4;12132:1;12125:15;11932:218;;11719:437;;;:::o;13193:184::-;-1:-1:-1;;;13242:1:1;13235:88;13342:4;13339:1;13332:15;13366:4;13363:1;13356:15;13382:128;13422:3;13453:1;13449:6;13446:1;13443:13;13440:39;;;13459:18;;:::i;:::-;-1:-1:-1;13495:9:1;;13382:128::o;13864:125::-;13904:4;13932:1;13929;13926:8;13923:34;;;13937:18;;:::i;:::-;-1:-1:-1;13974:9:1;;13864:125::o;13994:168::-;14034:7;14100:1;14096;14092:6;14088:14;14085:1;14082:21;14077:1;14070:9;14063:17;14059:45;14056:71;;;14107:18;;:::i;:::-;-1:-1:-1;14147:9:1;;13994:168::o;16364:184::-;-1:-1:-1;;;16413:1:1;16406:88;16513:4;16510:1;16503:15;16537:4;16534:1;16527:15;16553:135;16592:3;16613:17;;;16610:43;;16633:18;;:::i;:::-;-1:-1:-1;16680:1:1;16669:13;;16553:135::o;17235:1030::-;17320:12;;17285:3;;17375:1;17395:18;;;;17448;;;;17475:61;;17529:4;17521:6;17517:17;17507:27;;17475:61;17555:2;17603;17595:6;17592:14;17572:18;17569:38;17566:218;;-1:-1:-1;;;17637:1:1;17630:88;17741:4;17738:1;17731:15;17769:4;17766:1;17759:15;17566:218;17800:18;17827:104;;;;17945:1;17940:319;;;;17793:466;;17827:104;-1:-1:-1;;17860:24:1;;17848:37;;17905:16;;;;-1:-1:-1;17827:104:1;;17940:319;17182:1;17175:14;;;17219:4;17206:18;;18034:1;18048:165;18062:6;18059:1;18056:13;18048:165;;;18140:14;;18127:11;;;18120:35;18183:16;;;;18077:10;;18048:165;;;18052:3;;18242:6;18237:3;18233:16;18226:23;;17793:466;;;;;;;17235:1030;;;;:::o;18270:550::-;18494:3;18532:6;18526:13;18548:53;18594:6;18589:3;18582:4;18574:6;18570:17;18548:53;:::i;:::-;18664:13;;18623:16;;;;18686:57;18664:13;18623:16;18720:4;18708:17;;18686:57;:::i;:::-;18759:55;18804:8;18797:5;18793:20;18785:6;18759:55;:::i;:::-;18752:62;18270:550;-1:-1:-1;;;;;;;18270:550:1:o;18825:197::-;18953:3;18978:38;19012:3;19004:6;18978:38;:::i;19434:512::-;19628:4;-1:-1:-1;;;;;19738:2:1;19730:6;19726:15;19715:9;19708:34;19790:2;19782:6;19778:15;19773:2;19762:9;19758:18;19751:43;;19830:6;19825:2;19814:9;19810:18;19803:34;19873:3;19868:2;19857:9;19853:18;19846:31;19894:46;19935:3;19924:9;19920:19;19912:6;19894:46;:::i;:::-;19886:54;19434:512;-1:-1:-1;;;;;;19434:512:1:o;19951:249::-;20020:6;20073:2;20061:9;20052:7;20048:23;20044:32;20041:52;;;20089:1;20086;20079:12;20041:52;20121:9;20115:16;20140:30;20164:5;20140:30;:::i

Swarm Source

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