ETH Price: $3,680.78 (+1.71%)

Token

ERC-20: love loves (LLTLL)
 

Overview

Max Total Supply

3,798 LLTLL

Holders

1,272

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LLTLL
0x3326554a61f6eD0b14e012237264219A8e2B21A6
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:
LoveLoves

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-01
*/

//
//██▓     ▒█████   ██▒   █▓▓█████     ██▓     ▒█████   ██▒   █▓▓█████   ██████    ▄▄▄█████▓ ▒█████      ██▓     ▒█████   ██▒   █▓▓█████     ██▓     ▒█████   ██▒   █▓▓█████
//▓██▒    ▒██▒  ██▒▓██░   █▒▓█   ▀    ▓██▒    ▒██▒  ██▒▓██░   █▒▓█   ▀ ▒██    ▒    ▓  ██▒ ▓▒▒██▒  ██▒   ▓██▒    ▒██▒  ██▒▓██░   █▒▓█   ▀    ▓██▒    ▒██▒  ██▒▓██░   █▒▓█   ▀
//▒██░    ▒██░  ██▒ ▓██  █▒░▒███      ▒██░    ▒██░  ██▒ ▓██  █▒░▒███   ░ ▓██▄      ▒ ▓██░ ▒░▒██░  ██▒   ▒██░    ▒██░  ██▒ ▓██  █▒░▒███      ▒██░    ▒██░  ██▒ ▓██  █▒░▒███
//▒██░    ▒██   ██░  ▒██ █░░▒▓█  ▄    ▒██░    ▒██   ██░  ▒██ █░░▒▓█  ▄   ▒   ██▒   ░ ▓██▓ ░ ▒██   ██░   ▒██░    ▒██   ██░  ▒██ █░░▒▓█  ▄    ▒██░    ▒██   ██░  ▒██ █░░▒▓█  ▄
//░██████▒░ ████▓▒░   ▒▀█░  ░▒████▒   ░██████▒░ ████▓▒░   ▒▀█░  ░▒████▒▒██████▒▒     ▒██▒ ░ ░ ████▓▒░   ░██████▒░ ████▓▒░   ▒▀█░  ░▒████▒   ░██████▒░ ████▓▒░   ▒▀█░  ░▒████▒
//░ ▒░▓  ░░ ▒░▒░▒░    ░ ▐░  ░░ ▒░ ░   ░ ▒░▓  ░░ ▒░▒░▒░    ░ ▐░  ░░ ▒░ ░▒ ▒▓▒ ▒ ░     ▒ ░░   ░ ▒░▒░▒░    ░ ▒░▓  ░░ ▒░▒░▒░    ░ ▐░  ░░ ▒░ ░   ░ ▒░▓  ░░ ▒░▒░▒░    ░ ▐░  ░░ ▒░ ░
//░ ░ ▒  ░  ░ ▒ ▒░    ░ ░░   ░ ░  ░   ░ ░ ▒  ░  ░ ▒ ▒░    ░ ░░   ░ ░  ░░ ░▒  ░ ░       ░      ░ ▒ ▒░    ░ ░ ▒  ░  ░ ▒ ▒░    ░ ░░   ░ ░  ░   ░ ░ ▒  ░  ░ ▒ ▒░    ░ ░░   ░ ░  ░
//░ ░   ░ ░ ░ ▒       ░░     ░        ░ ░   ░ ░ ░ ▒       ░░     ░   ░  ░  ░       ░      ░ ░ ░ ▒       ░ ░   ░ ░ ░ ▒       ░░     ░        ░ ░   ░ ░ ░ ▒       ░░     ░
//░  ░    ░ ░        ░     ░  ░       ░  ░    ░ ░        ░     ░  ░      ░                  ░ ░         ░  ░    ░ ░        ░     ░  ░       ░  ░    ░ ░        ░     ░  ░
//░                                   ░                                                                 ░                                   ░
//



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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// ERC721A Contracts v4.1.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);
}


// ERC721A Contracts v4.1.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`
     *   - `extraData` = `0`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *   - `extraData` = `<Extra data when token was burned>`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     *   - `extraData` = `<Extra data at start of ownership>`
     */
    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;
        }
    }
}



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



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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity >=0.7.0 <0.9.0;




contract LoveLoves is ERC721AQueryable, Ownable {
    enum Status {
        Paused,
        Preminting,
        Started
    }

    Status public status = Status.Paused;
    bytes32 public root;
    string public baseURI;
    string public boxURI;
    uint256 public MAX_MINT_PER_ADDR = 5;
    uint256 public MAX_PREMINT_PER_ADDR = 2;

    uint256 public constant MAX_FREEMINT_PER_ADDR = 1;
    uint256 public constant teamSupply = 500;
    uint256 public freeSupply = 2500;
    uint256 public maxSupply = 5555;
    uint256 public freeMinted = 0;
    uint256 public price = 6900000000000000;

    event Minted(address minter, uint256 amount);

    constructor() ERC721A("love loves", "LLTLL") {}

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

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

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        return
            bytes(baseURI).length != 0
                ? string(abi.encodePacked(baseURI, _toString(tokenId), ".json"))
                : boxURI;
    }

    function mint(uint256 quantity) external payable {
        require(status == Status.Started, "Not minting");
        require(tx.origin == msg.sender, "Contract call not allowed");
        require(totalSupply() + quantity <= maxSupply, "Hearts exceed");
        require(
            numberMinted(msg.sender) + quantity <= MAX_MINT_PER_ADDR,
            "Hearts exceed"
        );
        require(quantity > 0, "One heart at least");
        uint256 nonFreeMintQuantity = quantity;
        if (
            numberMinted(msg.sender) < MAX_FREEMINT_PER_ADDR &&
            freeMinted < freeSupply
        ) {
            nonFreeMintQuantity = quantity - MAX_FREEMINT_PER_ADDR;
            freeMinted += MAX_FREEMINT_PER_ADDR;
        }
        checkPrice(price * nonFreeMintQuantity);
        _safeMint(msg.sender, quantity);
        emit Minted(msg.sender, quantity);
    }

    function checkPrice(uint256 amount) private {
        require(msg.value >= amount, "Need to send more ETH");
    }

    function allowlistMint(bytes32[] memory _proof, uint256 quantity)
        external
        payable
    {
        require(status == Status.Preminting, "Not preminting");
        require(tx.origin == msg.sender, "Contract call not allowed");
        require(_verify(_leaf(msg.sender), _proof), "Not allowlisted");
        require(
            numberMinted(msg.sender) + quantity <= MAX_PREMINT_PER_ADDR,
            "Hearts exceed"
        );
        freeMint(quantity);
    }

    function devMint(uint256 quantity) external payable onlyOwner {
        require(
            numberMinted(msg.sender) + quantity <= teamSupply,
            "Hearts exceed"
        );
        require(totalSupply() + quantity <= teamSupply, "Hearts exceed");
        freeMint(quantity);
    }

    function freeMint(uint256 quantity) private {
        require(freeMinted + quantity <= freeSupply, "Free hearts exceed");
        _safeMint(msg.sender, quantity);
        freeMinted += quantity;
        emit Minted(msg.sender, quantity);
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

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

    function setBaseURI(string calldata uri) public onlyOwner {
        baseURI = uri;
    }

    function setBoxURI(string calldata uri) public onlyOwner {
        boxURI = uri;
    }

    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

    function setAmount(uint256[] calldata amounts) public onlyOwner {
        MAX_MINT_PER_ADDR = amounts[0];
        MAX_PREMINT_PER_ADDR = amounts[1];
    }

    function decreaseMaxSupply(uint256 supply) public onlyOwner {
        require(
            supply <= maxSupply,
            "Max supply must be less than or equal to max supply"
        );
        maxSupply = supply;
    }

    function setFreeSupply(uint256 supply) public onlyOwner {
        require(
            supply <= maxSupply,
            "Free supply must be less than or equal to max supply"
        );
        freeSupply = supply;
    }

    function setStatus(Status newStatus) public onlyOwner {
        status = newStatus;
    }

    function setRoot(uint256 _root) public onlyOwner {
        root = bytes32(_root);
    }

    function _leaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof)
        internal
        view
        returns (bool)
    {
        return MerkleProof.verify(proof, root, leaf);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FREEMINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PREMINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boxURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"decreaseMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"payable","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":"uint24","name":"extraData","type":"uint24"}],"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":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeSupply","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":[{"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"setAmount","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBoxURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"supply","type":"uint256"}],"name":"setFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_root","type":"uint256"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum LoveLoves.Status","name":"newStatus","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"enum LoveLoves.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600860146101000a81548160ff021916908360028111156200002d576200002c620002ff565b5b02179055506005600c556002600d556109c4600e556115b3600f5560006010556618838370f340006011553480156200006557600080fd5b506040518060400160405280600a81526020017f6c6f7665206c6f766573000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c4c544c4c0000000000000000000000000000000000000000000000000000008152508160029080519060200190620000ea92919062000219565b5080600390805190602001906200010392919062000219565b50620001146200014260201b60201c565b60008190555050506200013c620001306200014b60201b60201c565b6200015360201b60201c565b6200035d565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022790620002c9565b90600052602060002090601f0160209004810192826200024b576000855562000297565b82601f106200026657805160ff191683800117855562000297565b8280016001018555821562000297579182015b828111156200029657825182559160200191906001019062000279565b5b509050620002a69190620002aa565b5090565b5b80821115620002c5576000816000905550600101620002ab565b5090565b60006002820490506001821680620002e257607f821691505b60208210811415620002f957620002f86200032e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61470b806200036d6000396000f3fe60806040526004361061027d5760003560e01c80638462151c1161014f578063c23dc68f116100c1578063ebf0c7171161007a578063ebf0c7171461098a578063f2184d0c146109b5578063f2917850146109de578063f2f5a7e514610a09578063f2fde38b14610a32578063f676308a14610a5b5761027d565b8063c23dc68f14610840578063c87b56dd1461087d578063d10a1a2b146108ba578063d5abeb01146108e5578063dc33e68114610910578063e985e9c51461094d5761027d565b806399a2557a1161011357806399a2557a14610741578063a035b1fe1461077e578063a0712d68146107a9578063a22cb465146107c5578063b88d4fde146107ee578063b99b8f00146108175761027d565b80638462151c1461065c5780638da5cb5b1461069957806391b7f5ed146106c457806391ff4a73146106ed57806395d89b41146107165761027d565b80632cfac6ec116101f357806355f804b3116101ac57806355f804b31461053a5780635bbb2177146105635780636352211e146105a05780636c0360eb146105dd57806370a0823114610608578063715018a6146106455761027d565b80632cfac6ec1461046c5780632e49d78b1461049757806331a72cc6146104c0578063375a069a146104eb5780633ccfd60b1461050757806342842e0e146105115761027d565b80631338a83f116102455780631338a83f1461037b578063161548621461039757806318160ddd146103c2578063200d2ed2146103ed57806323b872dd1461041857806324a6ab0c146104415761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630faa689614610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906134e8565b610a84565b6040516102b69190613c33565b60405180910390f35b3480156102cb57600080fd5b506102d4610b16565b6040516102e19190613c84565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906135bc565b610ba8565b60405161031e9190613b5f565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613363565b610c24565b005b34801561035c57600080fd5b50610365610d65565b6040516103729190613e41565b60405180910390f35b610395600480360381019061039091906133f6565b610d6a565b005b3480156103a357600080fd5b506103ac610f04565b6040516103b99190613e41565b60405180910390f35b3480156103ce57600080fd5b506103d7610f0a565b6040516103e49190613e41565b60405180910390f35b3480156103f957600080fd5b50610402610f21565b60405161040f9190613c69565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061324d565b610f34565b005b34801561044d57600080fd5b50610456611259565b6040516104639190613e41565b60405180910390f35b34801561047857600080fd5b5061048161125f565b60405161048e9190613e41565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b99190613542565b611265565b005b3480156104cc57600080fd5b506104d561129a565b6040516104e29190613e41565b60405180910390f35b610505600480360381019061050091906135bc565b6112a0565b005b61050f611363565b005b34801561051d57600080fd5b506105386004803603810190610533919061324d565b6113bb565b005b34801561054657600080fd5b50610561600480360381019061055c919061356f565b6113db565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061349f565b6113f9565b6040516105979190613bef565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c291906135bc565b6114ba565b6040516105d49190613b5f565b60405180910390f35b3480156105e957600080fd5b506105f26114cc565b6040516105ff9190613c84565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a91906131e0565b61155a565b60405161063c9190613e41565b60405180910390f35b34801561065157600080fd5b5061065a611613565b005b34801561066857600080fd5b50610683600480360381019061067e91906131e0565b611627565b6040516106909190613c11565b60405180910390f35b3480156106a557600080fd5b506106ae611771565b6040516106bb9190613b5f565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e691906135bc565b61179b565b005b3480156106f957600080fd5b50610714600480360381019061070f91906135bc565b6117ad565b005b34801561072257600080fd5b5061072b611804565b6040516107389190613c84565b60405180910390f35b34801561074d57600080fd5b50610768600480360381019061076391906133a3565b611896565b6040516107759190613c11565b60405180910390f35b34801561078a57600080fd5b50610793611aaa565b6040516107a09190613e41565b60405180910390f35b6107c360048036038101906107be91906135bc565b611ab0565b005b3480156107d157600080fd5b506107ec60048036038101906107e79190613323565b611d31565b005b3480156107fa57600080fd5b50610815600480360381019061081091906132a0565b611ea9565b005b34801561082357600080fd5b5061083e6004803603810190610839919061356f565b611f1c565b005b34801561084c57600080fd5b50610867600480360381019061086291906135bc565b611f3a565b6040516108749190613e26565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f91906135bc565b611fa4565b6040516108b19190613c84565b60405180910390f35b3480156108c657600080fd5b506108cf612080565b6040516108dc9190613e41565b60405180910390f35b3480156108f157600080fd5b506108fa612086565b6040516109079190613e41565b60405180910390f35b34801561091c57600080fd5b50610937600480360381019061093291906131e0565b61208c565b6040516109449190613e41565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f919061320d565b61209e565b6040516109819190613c33565b60405180910390f35b34801561099657600080fd5b5061099f612132565b6040516109ac9190613c4e565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d79190613452565b612138565b005b3480156109ea57600080fd5b506109f3612186565b604051610a009190613c84565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b91906135bc565b612214565b005b348015610a3e57600080fd5b50610a596004803603810190610a5491906131e0565b612229565b005b348015610a6757600080fd5b50610a826004803603810190610a7d91906135bc565b6122ad565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610adf57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b25906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b51906141c0565b8015610b9e5780601f10610b7357610100808354040283529160200191610b9e565b820191906000526020600020905b815481529060010190602001808311610b8157829003601f168201915b5050505050905090565b6000610bb382612304565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2f826114ba565b90508073ffffffffffffffffffffffffffffffffffffffff16610c50612363565b73ffffffffffffffffffffffffffffffffffffffff1614610cb357610c7c81610c77612363565b61209e565b610cb2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600181565b60016002811115610d7e57610d7d6142bf565b5b600860149054906101000a900460ff166002811115610da057610d9f6142bf565b5b14610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790613d26565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4590613cc6565b60405180910390fd5b610e60610e5a3361236b565b8361239b565b610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690613da6565b60405180910390fd5b600d5481610eac3361208c565b610eb69190613fd4565b1115610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613e06565b60405180910390fd5b610f00816123b2565b5050565b600c5481565b6000610f14612463565b6001546000540303905090565b600860149054906101000a900460ff1681565b6000610f3f8261246c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fb28461253a565b91509150610fc88187610fc3612363565b61255c565b61101457610fdd86610fd8612363565b61209e565b611013576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561107b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61108886868660016125a0565b801561109357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111618561113d8888876125a6565b7c0200000000000000000000000000000000000000000000000000000000176125ce565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156111e95760006001850190506000600460008381526020019081526020016000205414156111e75760005481146111e6578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461125186868660016125f9565b505050505050565b600e5481565b6101f481565b61126d6125ff565b80600860146101000a81548160ff02191690836002811115611292576112916142bf565b5b021790555050565b600d5481565b6112a86125ff565b6101f4816112b53361208c565b6112bf9190613fd4565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790613e06565b60405180910390fd5b6101f48161130c610f0a565b6113169190613fd4565b1115611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e90613e06565b60405180910390fd5b611360816123b2565b50565b61136b6125ff565b611373611771565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113b8573d6000803e3d6000fd5b50565b6113d683838360405180602001604052806000815250611ea9565b505050565b6113e36125ff565b8181600a91906113f4929190612e03565b505050565b606060008251905060008167ffffffffffffffff81111561141d5761141c61434c565b5b60405190808252806020026020018201604052801561145657816020015b611443612e89565b81526020019060019003908161143b5790505b50905060005b8281146114af576114868582815181106114795761147861431d565b5b6020026020010151611f3a565b8282815181106114995761149861431d565b5b602002602001018190525080600101905061145c565b508092505050919050565b60006114c58261246c565b9050919050565b600a80546114d9906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611505906141c0565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61161b6125ff565b611625600061267d565b565b606060008060006116378561155a565b905060008167ffffffffffffffff8111156116555761165461434c565b5b6040519080825280602002602001820160405280156116835781602001602082028036833780820191505090505b50905061168e612e89565b6000611698612463565b90505b838614611763576116ab81612743565b91508160400151156116bc57611758565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116fc57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611757578083878060010198508151811061174a5761174961431d565b5b6020026020010181815250505b5b80600101905061169b565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117a36125ff565b8060118190555050565b6117b56125ff565b600f548111156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190613ca6565b60405180910390fd5b80600f8190555050565b606060038054611813906141c0565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906141c0565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b60608183106118d1576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118dc61276e565b90506118e6612463565b8510156118f8576118f5612463565b94505b80841115611904578093505b600061190f8761155a565b90508486101561193257600086860390508181101561192c578091505b50611937565b600090505b60008167ffffffffffffffff8111156119535761195261434c565b5b6040519080825280602002602001820160405280156119815781602001602082028036833780820191505090505b50905060008214156119995780945050505050611aa3565b60006119a488611f3a565b9050600081604001516119b957816000015190505b60008990505b8881141580156119cf5750848714155b15611a95576119dd81612743565b92508260400151156119ee57611a8a565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a2e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a895780848880600101995081518110611a7c57611a7b61431d565b5b6020026020010181815250505b5b8060010190506119bf565b508583528296505050505050505b9392505050565b60115481565b600280811115611ac357611ac26142bf565b5b600860149054906101000a900460ff166002811115611ae557611ae46142bf565b5b14611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90613dc6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90613cc6565b60405180910390fd5b600f5481611b9f610f0a565b611ba99190613fd4565b1115611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613e06565b60405180910390fd5b600c5481611bf73361208c565b611c019190613fd4565b1115611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3990613e06565b60405180910390fd5b60008111611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90613d46565b60405180910390fd5b60008190506001611c953361208c565b108015611ca55750600e54601054105b15611cd457600182611cb79190614084565b9050600160106000828254611ccc9190613fd4565b925050819055505b611cea81601154611ce5919061402a565b612777565b611cf433836127bd565b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3383604051611d25929190613bc6565b60405180910390a15050565b611d39612363565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d9e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611dab612363565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e58612363565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e9d9190613c33565b60405180910390a35050565b611eb4848484610f34565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f1657611edf848484846127db565b611f15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611f246125ff565b8181600b9190611f35929190612e03565b505050565b611f42612e89565b611f4a612e89565b611f52612463565b831080611f665750611f6261276e565b8310155b15611f745780915050611f9f565b611f7d83612743565b9050806040015115611f925780915050611f9f565b611f9b8361293b565b9150505b919050565b60606000600a8054611fb5906141c0565b9050141561204d57600b8054611fca906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff6906141c0565b80156120435780601f1061201857610100808354040283529160200191612043565b820191906000526020600020905b81548152906001019060200180831161202657829003601f168201915b5050505050612079565b600a6120588361295b565b604051602001612069929190613b30565b6040516020818303038152906040525b9050919050565b60105481565b600f5481565b6000612097826129b5565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b6121406125ff565b818160008181106121545761215361431d565b5b90506020020135600c81905550818160018181106121755761217461431d565b5b90506020020135600d819055505050565b600b8054612193906141c0565b80601f01602080910402602001604051908101604052809291908181526020018280546121bf906141c0565b801561220c5780601f106121e15761010080835404028352916020019161220c565b820191906000526020600020905b8154815290600101906020018083116121ef57829003601f168201915b505050505081565b61221c6125ff565b8060001b60098190555050565b6122316125ff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613d06565b60405180910390fd5b6122aa8161267d565b50565b6122b56125ff565b600f548111156122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190613ce6565b60405180910390fd5b80600e8190555050565b60008161230f612463565b1115801561231e575060005482105b801561235c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008160405160200161237e9190613b15565b604051602081830303815290604052805190602001209050919050565b60006123aa8260095485612a0c565b905092915050565b600e54816010546123c39190613fd4565b1115612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613de6565b60405180910390fd5b61240e33826127bd565b80601060008282546124209190613fd4565b925050819055507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3382604051612458929190613bc6565b60405180910390a150565b60006001905090565b6000808290508061247b612463565b11612503576000548110156125025760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612500575b60008114156124f65760046000836001900393508381526020019081526020016000205490506124cb565b8092505050612535565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125bd868684612a23565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612607612a2c565b73ffffffffffffffffffffffffffffffffffffffff16612625611771565b73ffffffffffffffffffffffffffffffffffffffff161461267b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267290613d66565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61274b612e89565b6127676004600084815260200190815260200160002054612a34565b9050919050565b60008054905090565b803410156127ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b190613d86565b60405180910390fd5b50565b6127d7828260405180602001604052806000815250612aea565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612801612363565b8786866040518563ffffffff1660e01b81526004016128239493929190613b7a565b602060405180830381600087803b15801561283d57600080fd5b505af192505050801561286e57506040513d601f19601f8201168201806040525081019061286b9190613515565b60015b6128e8573d806000811461289e576040519150601f19603f3d011682016040523d82523d6000602084013e6128a3565b606091505b506000815114156128e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612943612e89565b61295461294f8361246c565b612a34565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156129a157600183039250600a81066030018353600a81049050612981565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600082612a198584612b87565b1490509392505050565b60009392505050565b600033905090565b612a3c612e89565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612af48383612bdd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b8257600080549050600083820390505b612b3460008683806001019450866127db565b612b6a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b21578160005414612b7f57600080fd5b50505b505050565b60008082905060005b8451811015612bd257612bbd82868381518110612bb057612baf61431d565b5b6020026020010151612db1565b91508080612bca90614223565b915050612b90565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c4a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c85576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c9260008483856125a0565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d0983612cfa60008660006125a6565b612d0385612ddc565b176125ce565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d2d57806000819055505050612dac60008483856125f9565b505050565b6000818310612dc957612dc48284612dec565b612dd4565b612dd38383612dec565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612e0f906141c0565b90600052602060002090601f016020900481019282612e315760008555612e78565b82601f10612e4a57803560ff1916838001178555612e78565b82800160010185558215612e78579182015b82811115612e77578235825591602001919060010190612e5c565b5b509050612e859190612ed8565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612ef1576000816000905550600101612ed9565b5090565b6000612f08612f0384613e81565b613e5c565b90508083825260208201905082856020860282011115612f2b57612f2a614385565b5b60005b85811015612f5b5781612f4188826130f3565b845260208401935060208301925050600181019050612f2e565b5050509392505050565b6000612f78612f7384613ead565b613e5c565b90508083825260208201905082856020860282011115612f9b57612f9a614385565b5b60005b85811015612fcb5781612fb188826131cb565b845260208401935060208301925050600181019050612f9e565b5050509392505050565b6000612fe8612fe384613ed9565b613e5c565b9050828152602081018484840111156130045761300361438a565b5b61300f84828561417e565b509392505050565b60008135905061302681614652565b92915050565b600082601f83011261304157613040614380565b5b8135613051848260208601612ef5565b91505092915050565b60008083601f8401126130705761306f614380565b5b8235905067ffffffffffffffff81111561308d5761308c61437b565b5b6020830191508360208202830111156130a9576130a8614385565b5b9250929050565b600082601f8301126130c5576130c4614380565b5b81356130d5848260208601612f65565b91505092915050565b6000813590506130ed81614669565b92915050565b60008135905061310281614680565b92915050565b60008135905061311781614697565b92915050565b60008151905061312c81614697565b92915050565b600082601f83011261314757613146614380565b5b8135613157848260208601612fd5565b91505092915050565b60008135905061316f816146ae565b92915050565b60008083601f84011261318b5761318a614380565b5b8235905067ffffffffffffffff8111156131a8576131a761437b565b5b6020830191508360018202830111156131c4576131c3614385565b5b9250929050565b6000813590506131da816146be565b92915050565b6000602082840312156131f6576131f5614394565b5b600061320484828501613017565b91505092915050565b6000806040838503121561322457613223614394565b5b600061323285828601613017565b925050602061324385828601613017565b9150509250929050565b60008060006060848603121561326657613265614394565b5b600061327486828701613017565b935050602061328586828701613017565b9250506040613296868287016131cb565b9150509250925092565b600080600080608085870312156132ba576132b9614394565b5b60006132c887828801613017565b94505060206132d987828801613017565b93505060406132ea878288016131cb565b925050606085013567ffffffffffffffff81111561330b5761330a61438f565b5b61331787828801613132565b91505092959194509250565b6000806040838503121561333a57613339614394565b5b600061334885828601613017565b9250506020613359858286016130de565b9150509250929050565b6000806040838503121561337a57613379614394565b5b600061338885828601613017565b9250506020613399858286016131cb565b9150509250929050565b6000806000606084860312156133bc576133bb614394565b5b60006133ca86828701613017565b93505060206133db868287016131cb565b92505060406133ec868287016131cb565b9150509250925092565b6000806040838503121561340d5761340c614394565b5b600083013567ffffffffffffffff81111561342b5761342a61438f565b5b6134378582860161302c565b9250506020613448858286016131cb565b9150509250929050565b6000806020838503121561346957613468614394565b5b600083013567ffffffffffffffff8111156134875761348661438f565b5b6134938582860161305a565b92509250509250929050565b6000602082840312156134b5576134b4614394565b5b600082013567ffffffffffffffff8111156134d3576134d261438f565b5b6134df848285016130b0565b91505092915050565b6000602082840312156134fe576134fd614394565b5b600061350c84828501613108565b91505092915050565b60006020828403121561352b5761352a614394565b5b60006135398482850161311d565b91505092915050565b60006020828403121561355857613557614394565b5b600061356684828501613160565b91505092915050565b6000806020838503121561358657613585614394565b5b600083013567ffffffffffffffff8111156135a4576135a361438f565b5b6135b085828601613175565b92509250509250929050565b6000602082840312156135d2576135d1614394565b5b60006135e0848285016131cb565b91505092915050565b60006135f58383613a2f565b60808301905092915050565b600061360d8383613ae8565b60208301905092915050565b613622816140b8565b82525050565b613631816140b8565b82525050565b613648613643826140b8565b61426c565b82525050565b600061365982613f3f565b6136638185613f85565b935061366e83613f0a565b8060005b8381101561369f57815161368688826135e9565b975061369183613f6b565b925050600181019050613672565b5085935050505092915050565b60006136b782613f4a565b6136c18185613f96565b93506136cc83613f1a565b8060005b838110156136fd5781516136e48882613601565b97506136ef83613f78565b9250506001810190506136d0565b5085935050505092915050565b613713816140ca565b82525050565b613722816140ca565b82525050565b613731816140d6565b82525050565b600061374282613f55565b61374c8185613fa7565b935061375c81856020860161418d565b61376581614399565b840191505092915050565b6137798161416c565b82525050565b600061378a82613f60565b6137948185613fb8565b93506137a481856020860161418d565b6137ad81614399565b840191505092915050565b60006137c382613f60565b6137cd8185613fc9565b93506137dd81856020860161418d565b80840191505092915050565b600081546137f6816141c0565b6138008186613fc9565b9450600182166000811461381b576001811461382c5761385f565b60ff1983168652818601935061385f565b61383585613f2a565b60005b8381101561385757815481890152600182019150602081019050613838565b838801955050505b50505092915050565b6000613875603383613fb8565b9150613880826143b7565b604082019050919050565b6000613898601983613fb8565b91506138a382614406565b602082019050919050565b60006138bb603483613fb8565b91506138c68261442f565b604082019050919050565b60006138de602683613fb8565b91506138e98261447e565b604082019050919050565b6000613901600e83613fb8565b915061390c826144cd565b602082019050919050565b6000613924601283613fb8565b915061392f826144f6565b602082019050919050565b6000613947600583613fc9565b91506139528261451f565b600582019050919050565b600061396a602083613fb8565b915061397582614548565b602082019050919050565b600061398d601583613fb8565b915061399882614571565b602082019050919050565b60006139b0600f83613fb8565b91506139bb8261459a565b602082019050919050565b60006139d3600b83613fb8565b91506139de826145c3565b602082019050919050565b60006139f6601283613fb8565b9150613a01826145ec565b602082019050919050565b6000613a19600d83613fb8565b9150613a2482614615565b602082019050919050565b608082016000820151613a456000850182613619565b506020820151613a586020850182613b06565b506040820151613a6b604085018261370a565b506060820151613a7e6060850182613ad9565b50505050565b608082016000820151613a9a6000850182613619565b506020820151613aad6020850182613b06565b506040820151613ac0604085018261370a565b506060820151613ad36060850182613ad9565b50505050565b613ae28161413f565b82525050565b613af18161414e565b82525050565b613b008161414e565b82525050565b613b0f81614158565b82525050565b6000613b218284613637565b60148201915081905092915050565b6000613b3c82856137e9565b9150613b4882846137b8565b9150613b538261393a565b91508190509392505050565b6000602082019050613b746000830184613628565b92915050565b6000608082019050613b8f6000830187613628565b613b9c6020830186613628565b613ba96040830185613af7565b8181036060830152613bbb8184613737565b905095945050505050565b6000604082019050613bdb6000830185613628565b613be86020830184613af7565b9392505050565b60006020820190508181036000830152613c09818461364e565b905092915050565b60006020820190508181036000830152613c2b81846136ac565b905092915050565b6000602082019050613c486000830184613719565b92915050565b6000602082019050613c636000830184613728565b92915050565b6000602082019050613c7e6000830184613770565b92915050565b60006020820190508181036000830152613c9e818461377f565b905092915050565b60006020820190508181036000830152613cbf81613868565b9050919050565b60006020820190508181036000830152613cdf8161388b565b9050919050565b60006020820190508181036000830152613cff816138ae565b9050919050565b60006020820190508181036000830152613d1f816138d1565b9050919050565b60006020820190508181036000830152613d3f816138f4565b9050919050565b60006020820190508181036000830152613d5f81613917565b9050919050565b60006020820190508181036000830152613d7f8161395d565b9050919050565b60006020820190508181036000830152613d9f81613980565b9050919050565b60006020820190508181036000830152613dbf816139a3565b9050919050565b60006020820190508181036000830152613ddf816139c6565b9050919050565b60006020820190508181036000830152613dff816139e9565b9050919050565b60006020820190508181036000830152613e1f81613a0c565b9050919050565b6000608082019050613e3b6000830184613a84565b92915050565b6000602082019050613e566000830184613af7565b92915050565b6000613e66613e77565b9050613e7282826141f2565b919050565b6000604051905090565b600067ffffffffffffffff821115613e9c57613e9b61434c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ec857613ec761434c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ef457613ef361434c565b5b613efd82614399565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fdf8261414e565b9150613fea8361414e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561401f5761401e614290565b5b828201905092915050565b60006140358261414e565b91506140408361414e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561407957614078614290565b5b828202905092915050565b600061408f8261414e565b915061409a8361414e565b9250828210156140ad576140ac614290565b5b828203905092915050565b60006140c38261411f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061411a8261463e565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60006141778261410c565b9050919050565b82818337600083830152505050565b60005b838110156141ab578082015181840152602081019050614190565b838111156141ba576000848401525b50505050565b600060028204905060018216806141d857607f821691505b602082108114156141ec576141eb6142ee565b5b50919050565b6141fb82614399565b810181811067ffffffffffffffff8211171561421a5761421961434c565b5b80604052505050565b600061422e8261414e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561426157614260614290565b5b600182019050919050565b60006142778261427e565b9050919050565b6000614289826143aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617820737570706c79206d757374206265206c657373207468616e206f722060008201527f657175616c20746f206d617820737570706c7900000000000000000000000000602082015250565b7f436f6e74726163742063616c6c206e6f7420616c6c6f77656400000000000000600082015250565b7f4672656520737570706c79206d757374206265206c657373207468616e206f7260008201527f20657175616c20746f206d617820737570706c79000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207072656d696e74696e67000000000000000000000000000000000000600082015250565b7f4f6e65206865617274206174206c656173740000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e65656420746f2073656e64206d6f7265204554480000000000000000000000600082015250565b7f4e6f7420616c6c6f776c69737465640000000000000000000000000000000000600082015250565b7f4e6f74206d696e74696e67000000000000000000000000000000000000000000600082015250565b7f4672656520686561727473206578636565640000000000000000000000000000600082015250565b7f4865617274732065786365656400000000000000000000000000000000000000600082015250565b6003811061464f5761464e6142bf565b5b50565b61465b816140b8565b811461466657600080fd5b50565b614672816140ca565b811461467d57600080fd5b50565b614689816140d6565b811461469457600080fd5b50565b6146a0816140e0565b81146146ab57600080fd5b50565b600381106146bb57600080fd5b50565b6146c78161414e565b81146146d257600080fd5b5056fea2646970667358221220c2e10175a41154d10daf1d21094d7e01d9549ab9e717c2682917313d9c4805f064736f6c63430008070033

Deployed Bytecode

0x60806040526004361061027d5760003560e01c80638462151c1161014f578063c23dc68f116100c1578063ebf0c7171161007a578063ebf0c7171461098a578063f2184d0c146109b5578063f2917850146109de578063f2f5a7e514610a09578063f2fde38b14610a32578063f676308a14610a5b5761027d565b8063c23dc68f14610840578063c87b56dd1461087d578063d10a1a2b146108ba578063d5abeb01146108e5578063dc33e68114610910578063e985e9c51461094d5761027d565b806399a2557a1161011357806399a2557a14610741578063a035b1fe1461077e578063a0712d68146107a9578063a22cb465146107c5578063b88d4fde146107ee578063b99b8f00146108175761027d565b80638462151c1461065c5780638da5cb5b1461069957806391b7f5ed146106c457806391ff4a73146106ed57806395d89b41146107165761027d565b80632cfac6ec116101f357806355f804b3116101ac57806355f804b31461053a5780635bbb2177146105635780636352211e146105a05780636c0360eb146105dd57806370a0823114610608578063715018a6146106455761027d565b80632cfac6ec1461046c5780632e49d78b1461049757806331a72cc6146104c0578063375a069a146104eb5780633ccfd60b1461050757806342842e0e146105115761027d565b80631338a83f116102455780631338a83f1461037b578063161548621461039757806318160ddd146103c2578063200d2ed2146103ed57806323b872dd1461041857806324a6ab0c146104415761027d565b806301ffc9a71461028257806306fdde03146102bf578063081812fc146102ea578063095ea7b3146103275780630faa689614610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906134e8565b610a84565b6040516102b69190613c33565b60405180910390f35b3480156102cb57600080fd5b506102d4610b16565b6040516102e19190613c84565b60405180910390f35b3480156102f657600080fd5b50610311600480360381019061030c91906135bc565b610ba8565b60405161031e9190613b5f565b60405180910390f35b34801561033357600080fd5b5061034e60048036038101906103499190613363565b610c24565b005b34801561035c57600080fd5b50610365610d65565b6040516103729190613e41565b60405180910390f35b610395600480360381019061039091906133f6565b610d6a565b005b3480156103a357600080fd5b506103ac610f04565b6040516103b99190613e41565b60405180910390f35b3480156103ce57600080fd5b506103d7610f0a565b6040516103e49190613e41565b60405180910390f35b3480156103f957600080fd5b50610402610f21565b60405161040f9190613c69565b60405180910390f35b34801561042457600080fd5b5061043f600480360381019061043a919061324d565b610f34565b005b34801561044d57600080fd5b50610456611259565b6040516104639190613e41565b60405180910390f35b34801561047857600080fd5b5061048161125f565b60405161048e9190613e41565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b99190613542565b611265565b005b3480156104cc57600080fd5b506104d561129a565b6040516104e29190613e41565b60405180910390f35b610505600480360381019061050091906135bc565b6112a0565b005b61050f611363565b005b34801561051d57600080fd5b506105386004803603810190610533919061324d565b6113bb565b005b34801561054657600080fd5b50610561600480360381019061055c919061356f565b6113db565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061349f565b6113f9565b6040516105979190613bef565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c291906135bc565b6114ba565b6040516105d49190613b5f565b60405180910390f35b3480156105e957600080fd5b506105f26114cc565b6040516105ff9190613c84565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a91906131e0565b61155a565b60405161063c9190613e41565b60405180910390f35b34801561065157600080fd5b5061065a611613565b005b34801561066857600080fd5b50610683600480360381019061067e91906131e0565b611627565b6040516106909190613c11565b60405180910390f35b3480156106a557600080fd5b506106ae611771565b6040516106bb9190613b5f565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e691906135bc565b61179b565b005b3480156106f957600080fd5b50610714600480360381019061070f91906135bc565b6117ad565b005b34801561072257600080fd5b5061072b611804565b6040516107389190613c84565b60405180910390f35b34801561074d57600080fd5b50610768600480360381019061076391906133a3565b611896565b6040516107759190613c11565b60405180910390f35b34801561078a57600080fd5b50610793611aaa565b6040516107a09190613e41565b60405180910390f35b6107c360048036038101906107be91906135bc565b611ab0565b005b3480156107d157600080fd5b506107ec60048036038101906107e79190613323565b611d31565b005b3480156107fa57600080fd5b50610815600480360381019061081091906132a0565b611ea9565b005b34801561082357600080fd5b5061083e6004803603810190610839919061356f565b611f1c565b005b34801561084c57600080fd5b50610867600480360381019061086291906135bc565b611f3a565b6040516108749190613e26565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f91906135bc565b611fa4565b6040516108b19190613c84565b60405180910390f35b3480156108c657600080fd5b506108cf612080565b6040516108dc9190613e41565b60405180910390f35b3480156108f157600080fd5b506108fa612086565b6040516109079190613e41565b60405180910390f35b34801561091c57600080fd5b50610937600480360381019061093291906131e0565b61208c565b6040516109449190613e41565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f919061320d565b61209e565b6040516109819190613c33565b60405180910390f35b34801561099657600080fd5b5061099f612132565b6040516109ac9190613c4e565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d79190613452565b612138565b005b3480156109ea57600080fd5b506109f3612186565b604051610a009190613c84565b60405180910390f35b348015610a1557600080fd5b50610a306004803603810190610a2b91906135bc565b612214565b005b348015610a3e57600080fd5b50610a596004803603810190610a5491906131e0565b612229565b005b348015610a6757600080fd5b50610a826004803603810190610a7d91906135bc565b6122ad565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610adf57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610b25906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b51906141c0565b8015610b9e5780601f10610b7357610100808354040283529160200191610b9e565b820191906000526020600020905b815481529060010190602001808311610b8157829003601f168201915b5050505050905090565b6000610bb382612304565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c2f826114ba565b90508073ffffffffffffffffffffffffffffffffffffffff16610c50612363565b73ffffffffffffffffffffffffffffffffffffffff1614610cb357610c7c81610c77612363565b61209e565b610cb2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600181565b60016002811115610d7e57610d7d6142bf565b5b600860149054906101000a900460ff166002811115610da057610d9f6142bf565b5b14610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790613d26565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4590613cc6565b60405180910390fd5b610e60610e5a3361236b565b8361239b565b610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690613da6565b60405180910390fd5b600d5481610eac3361208c565b610eb69190613fd4565b1115610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613e06565b60405180910390fd5b610f00816123b2565b5050565b600c5481565b6000610f14612463565b6001546000540303905090565b600860149054906101000a900460ff1681565b6000610f3f8261246c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610fb28461253a565b91509150610fc88187610fc3612363565b61255c565b61101457610fdd86610fd8612363565b61209e565b611013576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561107b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61108886868660016125a0565b801561109357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506111618561113d8888876125a6565b7c0200000000000000000000000000000000000000000000000000000000176125ce565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156111e95760006001850190506000600460008381526020019081526020016000205414156111e75760005481146111e6578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461125186868660016125f9565b505050505050565b600e5481565b6101f481565b61126d6125ff565b80600860146101000a81548160ff02191690836002811115611292576112916142bf565b5b021790555050565b600d5481565b6112a86125ff565b6101f4816112b53361208c565b6112bf9190613fd4565b1115611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f790613e06565b60405180910390fd5b6101f48161130c610f0a565b6113169190613fd4565b1115611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e90613e06565b60405180910390fd5b611360816123b2565b50565b61136b6125ff565b611373611771565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156113b8573d6000803e3d6000fd5b50565b6113d683838360405180602001604052806000815250611ea9565b505050565b6113e36125ff565b8181600a91906113f4929190612e03565b505050565b606060008251905060008167ffffffffffffffff81111561141d5761141c61434c565b5b60405190808252806020026020018201604052801561145657816020015b611443612e89565b81526020019060019003908161143b5790505b50905060005b8281146114af576114868582815181106114795761147861431d565b5b6020026020010151611f3a565b8282815181106114995761149861431d565b5b602002602001018190525080600101905061145c565b508092505050919050565b60006114c58261246c565b9050919050565b600a80546114d9906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611505906141c0565b80156115525780601f1061152757610100808354040283529160200191611552565b820191906000526020600020905b81548152906001019060200180831161153557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115c2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61161b6125ff565b611625600061267d565b565b606060008060006116378561155a565b905060008167ffffffffffffffff8111156116555761165461434c565b5b6040519080825280602002602001820160405280156116835781602001602082028036833780820191505090505b50905061168e612e89565b6000611698612463565b90505b838614611763576116ab81612743565b91508160400151156116bc57611758565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116fc57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611757578083878060010198508151811061174a5761174961431d565b5b6020026020010181815250505b5b80600101905061169b565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117a36125ff565b8060118190555050565b6117b56125ff565b600f548111156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f190613ca6565b60405180910390fd5b80600f8190555050565b606060038054611813906141c0565b80601f016020809104026020016040519081016040528092919081815260200182805461183f906141c0565b801561188c5780601f106118615761010080835404028352916020019161188c565b820191906000526020600020905b81548152906001019060200180831161186f57829003601f168201915b5050505050905090565b60608183106118d1576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118dc61276e565b90506118e6612463565b8510156118f8576118f5612463565b94505b80841115611904578093505b600061190f8761155a565b90508486101561193257600086860390508181101561192c578091505b50611937565b600090505b60008167ffffffffffffffff8111156119535761195261434c565b5b6040519080825280602002602001820160405280156119815781602001602082028036833780820191505090505b50905060008214156119995780945050505050611aa3565b60006119a488611f3a565b9050600081604001516119b957816000015190505b60008990505b8881141580156119cf5750848714155b15611a95576119dd81612743565b92508260400151156119ee57611a8a565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1614611a2e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a895780848880600101995081518110611a7c57611a7b61431d565b5b6020026020010181815250505b5b8060010190506119bf565b508583528296505050505050505b9392505050565b60115481565b600280811115611ac357611ac26142bf565b5b600860149054906101000a900460ff166002811115611ae557611ae46142bf565b5b14611b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1c90613dc6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8a90613cc6565b60405180910390fd5b600f5481611b9f610f0a565b611ba99190613fd4565b1115611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613e06565b60405180910390fd5b600c5481611bf73361208c565b611c019190613fd4565b1115611c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3990613e06565b60405180910390fd5b60008111611c85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7c90613d46565b60405180910390fd5b60008190506001611c953361208c565b108015611ca55750600e54601054105b15611cd457600182611cb79190614084565b9050600160106000828254611ccc9190613fd4565b925050819055505b611cea81601154611ce5919061402a565b612777565b611cf433836127bd565b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3383604051611d25929190613bc6565b60405180910390a15050565b611d39612363565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d9e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611dab612363565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e58612363565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e9d9190613c33565b60405180910390a35050565b611eb4848484610f34565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611f1657611edf848484846127db565b611f15576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611f246125ff565b8181600b9190611f35929190612e03565b505050565b611f42612e89565b611f4a612e89565b611f52612463565b831080611f665750611f6261276e565b8310155b15611f745780915050611f9f565b611f7d83612743565b9050806040015115611f925780915050611f9f565b611f9b8361293b565b9150505b919050565b60606000600a8054611fb5906141c0565b9050141561204d57600b8054611fca906141c0565b80601f0160208091040260200160405190810160405280929190818152602001828054611ff6906141c0565b80156120435780601f1061201857610100808354040283529160200191612043565b820191906000526020600020905b81548152906001019060200180831161202657829003601f168201915b5050505050612079565b600a6120588361295b565b604051602001612069929190613b30565b6040516020818303038152906040525b9050919050565b60105481565b600f5481565b6000612097826129b5565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60095481565b6121406125ff565b818160008181106121545761215361431d565b5b90506020020135600c81905550818160018181106121755761217461431d565b5b90506020020135600d819055505050565b600b8054612193906141c0565b80601f01602080910402602001604051908101604052809291908181526020018280546121bf906141c0565b801561220c5780601f106121e15761010080835404028352916020019161220c565b820191906000526020600020905b8154815290600101906020018083116121ef57829003601f168201915b505050505081565b61221c6125ff565b8060001b60098190555050565b6122316125ff565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613d06565b60405180910390fd5b6122aa8161267d565b50565b6122b56125ff565b600f548111156122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190613ce6565b60405180910390fd5b80600e8190555050565b60008161230f612463565b1115801561231e575060005482105b801561235c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60008160405160200161237e9190613b15565b604051602081830303815290604052805190602001209050919050565b60006123aa8260095485612a0c565b905092915050565b600e54816010546123c39190613fd4565b1115612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613de6565b60405180910390fd5b61240e33826127bd565b80601060008282546124209190613fd4565b925050819055507f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe3382604051612458929190613bc6565b60405180910390a150565b60006001905090565b6000808290508061247b612463565b11612503576000548110156125025760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415612500575b60008114156124f65760046000836001900393508381526020019081526020016000205490506124cb565b8092505050612535565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86125bd868684612a23565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612607612a2c565b73ffffffffffffffffffffffffffffffffffffffff16612625611771565b73ffffffffffffffffffffffffffffffffffffffff161461267b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267290613d66565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61274b612e89565b6127676004600084815260200190815260200160002054612a34565b9050919050565b60008054905090565b803410156127ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b190613d86565b60405180910390fd5b50565b6127d7828260405180602001604052806000815250612aea565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612801612363565b8786866040518563ffffffff1660e01b81526004016128239493929190613b7a565b602060405180830381600087803b15801561283d57600080fd5b505af192505050801561286e57506040513d601f19601f8201168201806040525081019061286b9190613515565b60015b6128e8573d806000811461289e576040519150601f19603f3d011682016040523d82523d6000602084013e6128a3565b606091505b506000815114156128e0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612943612e89565b61295461294f8361246c565b612a34565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156129a157600183039250600a81066030018353600a81049050612981565b508181036020830392508083525050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600082612a198584612b87565b1490509392505050565b60009392505050565b600033905090565b612a3c612e89565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b612af48383612bdd565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612b8257600080549050600083820390505b612b3460008683806001019450866127db565b612b6a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612b21578160005414612b7f57600080fd5b50505b505050565b60008082905060005b8451811015612bd257612bbd82868381518110612bb057612baf61431d565b5b6020026020010151612db1565b91508080612bca90614223565b915050612b90565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c4a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612c85576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c9260008483856125a0565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612d0983612cfa60008660006125a6565b612d0385612ddc565b176125ce565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d2d57806000819055505050612dac60008483856125f9565b505050565b6000818310612dc957612dc48284612dec565b612dd4565b612dd38383612dec565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054612e0f906141c0565b90600052602060002090601f016020900481019282612e315760008555612e78565b82601f10612e4a57803560ff1916838001178555612e78565b82800160010185558215612e78579182015b82811115612e77578235825591602001919060010190612e5c565b5b509050612e859190612ed8565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612ef1576000816000905550600101612ed9565b5090565b6000612f08612f0384613e81565b613e5c565b90508083825260208201905082856020860282011115612f2b57612f2a614385565b5b60005b85811015612f5b5781612f4188826130f3565b845260208401935060208301925050600181019050612f2e565b5050509392505050565b6000612f78612f7384613ead565b613e5c565b90508083825260208201905082856020860282011115612f9b57612f9a614385565b5b60005b85811015612fcb5781612fb188826131cb565b845260208401935060208301925050600181019050612f9e565b5050509392505050565b6000612fe8612fe384613ed9565b613e5c565b9050828152602081018484840111156130045761300361438a565b5b61300f84828561417e565b509392505050565b60008135905061302681614652565b92915050565b600082601f83011261304157613040614380565b5b8135613051848260208601612ef5565b91505092915050565b60008083601f8401126130705761306f614380565b5b8235905067ffffffffffffffff81111561308d5761308c61437b565b5b6020830191508360208202830111156130a9576130a8614385565b5b9250929050565b600082601f8301126130c5576130c4614380565b5b81356130d5848260208601612f65565b91505092915050565b6000813590506130ed81614669565b92915050565b60008135905061310281614680565b92915050565b60008135905061311781614697565b92915050565b60008151905061312c81614697565b92915050565b600082601f83011261314757613146614380565b5b8135613157848260208601612fd5565b91505092915050565b60008135905061316f816146ae565b92915050565b60008083601f84011261318b5761318a614380565b5b8235905067ffffffffffffffff8111156131a8576131a761437b565b5b6020830191508360018202830111156131c4576131c3614385565b5b9250929050565b6000813590506131da816146be565b92915050565b6000602082840312156131f6576131f5614394565b5b600061320484828501613017565b91505092915050565b6000806040838503121561322457613223614394565b5b600061323285828601613017565b925050602061324385828601613017565b9150509250929050565b60008060006060848603121561326657613265614394565b5b600061327486828701613017565b935050602061328586828701613017565b9250506040613296868287016131cb565b9150509250925092565b600080600080608085870312156132ba576132b9614394565b5b60006132c887828801613017565b94505060206132d987828801613017565b93505060406132ea878288016131cb565b925050606085013567ffffffffffffffff81111561330b5761330a61438f565b5b61331787828801613132565b91505092959194509250565b6000806040838503121561333a57613339614394565b5b600061334885828601613017565b9250506020613359858286016130de565b9150509250929050565b6000806040838503121561337a57613379614394565b5b600061338885828601613017565b9250506020613399858286016131cb565b9150509250929050565b6000806000606084860312156133bc576133bb614394565b5b60006133ca86828701613017565b93505060206133db868287016131cb565b92505060406133ec868287016131cb565b9150509250925092565b6000806040838503121561340d5761340c614394565b5b600083013567ffffffffffffffff81111561342b5761342a61438f565b5b6134378582860161302c565b9250506020613448858286016131cb565b9150509250929050565b6000806020838503121561346957613468614394565b5b600083013567ffffffffffffffff8111156134875761348661438f565b5b6134938582860161305a565b92509250509250929050565b6000602082840312156134b5576134b4614394565b5b600082013567ffffffffffffffff8111156134d3576134d261438f565b5b6134df848285016130b0565b91505092915050565b6000602082840312156134fe576134fd614394565b5b600061350c84828501613108565b91505092915050565b60006020828403121561352b5761352a614394565b5b60006135398482850161311d565b91505092915050565b60006020828403121561355857613557614394565b5b600061356684828501613160565b91505092915050565b6000806020838503121561358657613585614394565b5b600083013567ffffffffffffffff8111156135a4576135a361438f565b5b6135b085828601613175565b92509250509250929050565b6000602082840312156135d2576135d1614394565b5b60006135e0848285016131cb565b91505092915050565b60006135f58383613a2f565b60808301905092915050565b600061360d8383613ae8565b60208301905092915050565b613622816140b8565b82525050565b613631816140b8565b82525050565b613648613643826140b8565b61426c565b82525050565b600061365982613f3f565b6136638185613f85565b935061366e83613f0a565b8060005b8381101561369f57815161368688826135e9565b975061369183613f6b565b925050600181019050613672565b5085935050505092915050565b60006136b782613f4a565b6136c18185613f96565b93506136cc83613f1a565b8060005b838110156136fd5781516136e48882613601565b97506136ef83613f78565b9250506001810190506136d0565b5085935050505092915050565b613713816140ca565b82525050565b613722816140ca565b82525050565b613731816140d6565b82525050565b600061374282613f55565b61374c8185613fa7565b935061375c81856020860161418d565b61376581614399565b840191505092915050565b6137798161416c565b82525050565b600061378a82613f60565b6137948185613fb8565b93506137a481856020860161418d565b6137ad81614399565b840191505092915050565b60006137c382613f60565b6137cd8185613fc9565b93506137dd81856020860161418d565b80840191505092915050565b600081546137f6816141c0565b6138008186613fc9565b9450600182166000811461381b576001811461382c5761385f565b60ff1983168652818601935061385f565b61383585613f2a565b60005b8381101561385757815481890152600182019150602081019050613838565b838801955050505b50505092915050565b6000613875603383613fb8565b9150613880826143b7565b604082019050919050565b6000613898601983613fb8565b91506138a382614406565b602082019050919050565b60006138bb603483613fb8565b91506138c68261442f565b604082019050919050565b60006138de602683613fb8565b91506138e98261447e565b604082019050919050565b6000613901600e83613fb8565b915061390c826144cd565b602082019050919050565b6000613924601283613fb8565b915061392f826144f6565b602082019050919050565b6000613947600583613fc9565b91506139528261451f565b600582019050919050565b600061396a602083613fb8565b915061397582614548565b602082019050919050565b600061398d601583613fb8565b915061399882614571565b602082019050919050565b60006139b0600f83613fb8565b91506139bb8261459a565b602082019050919050565b60006139d3600b83613fb8565b91506139de826145c3565b602082019050919050565b60006139f6601283613fb8565b9150613a01826145ec565b602082019050919050565b6000613a19600d83613fb8565b9150613a2482614615565b602082019050919050565b608082016000820151613a456000850182613619565b506020820151613a586020850182613b06565b506040820151613a6b604085018261370a565b506060820151613a7e6060850182613ad9565b50505050565b608082016000820151613a9a6000850182613619565b506020820151613aad6020850182613b06565b506040820151613ac0604085018261370a565b506060820151613ad36060850182613ad9565b50505050565b613ae28161413f565b82525050565b613af18161414e565b82525050565b613b008161414e565b82525050565b613b0f81614158565b82525050565b6000613b218284613637565b60148201915081905092915050565b6000613b3c82856137e9565b9150613b4882846137b8565b9150613b538261393a565b91508190509392505050565b6000602082019050613b746000830184613628565b92915050565b6000608082019050613b8f6000830187613628565b613b9c6020830186613628565b613ba96040830185613af7565b8181036060830152613bbb8184613737565b905095945050505050565b6000604082019050613bdb6000830185613628565b613be86020830184613af7565b9392505050565b60006020820190508181036000830152613c09818461364e565b905092915050565b60006020820190508181036000830152613c2b81846136ac565b905092915050565b6000602082019050613c486000830184613719565b92915050565b6000602082019050613c636000830184613728565b92915050565b6000602082019050613c7e6000830184613770565b92915050565b60006020820190508181036000830152613c9e818461377f565b905092915050565b60006020820190508181036000830152613cbf81613868565b9050919050565b60006020820190508181036000830152613cdf8161388b565b9050919050565b60006020820190508181036000830152613cff816138ae565b9050919050565b60006020820190508181036000830152613d1f816138d1565b9050919050565b60006020820190508181036000830152613d3f816138f4565b9050919050565b60006020820190508181036000830152613d5f81613917565b9050919050565b60006020820190508181036000830152613d7f8161395d565b9050919050565b60006020820190508181036000830152613d9f81613980565b9050919050565b60006020820190508181036000830152613dbf816139a3565b9050919050565b60006020820190508181036000830152613ddf816139c6565b9050919050565b60006020820190508181036000830152613dff816139e9565b9050919050565b60006020820190508181036000830152613e1f81613a0c565b9050919050565b6000608082019050613e3b6000830184613a84565b92915050565b6000602082019050613e566000830184613af7565b92915050565b6000613e66613e77565b9050613e7282826141f2565b919050565b6000604051905090565b600067ffffffffffffffff821115613e9c57613e9b61434c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ec857613ec761434c565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ef457613ef361434c565b5b613efd82614399565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613fdf8261414e565b9150613fea8361414e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561401f5761401e614290565b5b828201905092915050565b60006140358261414e565b91506140408361414e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561407957614078614290565b5b828202905092915050565b600061408f8261414e565b915061409a8361414e565b9250828210156140ad576140ac614290565b5b828203905092915050565b60006140c38261411f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061411a8261463e565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60006141778261410c565b9050919050565b82818337600083830152505050565b60005b838110156141ab578082015181840152602081019050614190565b838111156141ba576000848401525b50505050565b600060028204905060018216806141d857607f821691505b602082108114156141ec576141eb6142ee565b5b50919050565b6141fb82614399565b810181811067ffffffffffffffff8211171561421a5761421961434c565b5b80604052505050565b600061422e8261414e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561426157614260614290565b5b600182019050919050565b60006142778261427e565b9050919050565b6000614289826143aa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617820737570706c79206d757374206265206c657373207468616e206f722060008201527f657175616c20746f206d617820737570706c7900000000000000000000000000602082015250565b7f436f6e74726163742063616c6c206e6f7420616c6c6f77656400000000000000600082015250565b7f4672656520737570706c79206d757374206265206c657373207468616e206f7260008201527f20657175616c20746f206d617820737570706c79000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f74207072656d696e74696e67000000000000000000000000000000000000600082015250565b7f4f6e65206865617274206174206c656173740000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e65656420746f2073656e64206d6f7265204554480000000000000000000000600082015250565b7f4e6f7420616c6c6f776c69737465640000000000000000000000000000000000600082015250565b7f4e6f74206d696e74696e67000000000000000000000000000000000000000000600082015250565b7f4672656520686561727473206578636565640000000000000000000000000000600082015250565b7f4865617274732065786365656400000000000000000000000000000000000000600082015250565b6003811061464f5761464e6142bf565b5b50565b61465b816140b8565b811461466657600080fd5b50565b614672816140ca565b811461467d57600080fd5b50565b614689816140d6565b811461469457600080fd5b50565b6146a0816140e0565b81146146ab57600080fd5b50565b600381106146bb57600080fd5b50565b6146c78161414e565b81146146d257600080fd5b5056fea2646970667358221220c2e10175a41154d10daf1d21094d7e01d9549ab9e717c2682917313d9c4805f064736f6c63430008070033

Deployed Bytecode Sourcemap

68758:4991:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17759:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23406:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25352:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24900:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69111:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71016:486;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69020:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16813:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68896:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34617:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69214:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69167:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73237:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69063:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71510:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72192:112;;;:::i;:::-;;26242:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72312:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51860:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23195:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68965:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18438:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59242:103;;;;;;;;;;;;;:::i;:::-;;55672:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58594:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72506:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72767:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23575:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52718:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69327:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69994:890;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25628:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26498:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72410:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51281:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69692:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69291:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69253:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72071:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26007:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68939:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72602:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68993:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73336:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59500:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73003:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17759:615;17844:4;18159:10;18144:25;;:11;:25;;;;:102;;;;18236:10;18221:25;;:11;:25;;;;18144:102;:179;;;;18313:10;18298:25;;:11;:25;;;;18144:179;18124:199;;17759:615;;;:::o;23406:100::-;23460:13;23493:5;23486:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23406:100;:::o;25352:204::-;25420:7;25445:16;25453:7;25445;:16::i;:::-;25440:64;;25470:34;;;;;;;;;;;;;;25440:64;25524:15;:24;25540:7;25524:24;;;;;;;;;;;;;;;;;;;;;25517:31;;25352:204;;;:::o;24900:386::-;24973:13;24989:16;24997:7;24989;:16::i;:::-;24973:32;;25045:5;25022:28;;:19;:17;:19::i;:::-;:28;;;25018:175;;25070:44;25087:5;25094:19;:17;:19::i;:::-;25070:16;:44::i;:::-;25065:128;;25142:35;;;;;;;;;;;;;;25065:128;25018:175;25232:2;25205:15;:24;25221:7;25205:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25270:7;25266:2;25250:28;;25259:5;25250:28;;;;;;;;;;;;24962:324;24900:386;;:::o;69111:49::-;69159:1;69111:49;:::o;71016:486::-;71151:17;71141:27;;;;;;;;:::i;:::-;;:6;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;71133:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;71219:10;71206:23;;:9;:23;;;71198:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;71278:34;71286:17;71292:10;71286:5;:17::i;:::-;71305:6;71278:7;:34::i;:::-;71270:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;71404:20;;71392:8;71365:24;71378:10;71365:12;:24::i;:::-;:35;;;;:::i;:::-;:59;;71343:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;71476:18;71485:8;71476;:18::i;:::-;71016:486;;:::o;69020:36::-;;;;:::o;16813:315::-;16866:7;17094:15;:13;:15::i;:::-;17079:12;;17063:13;;:28;:46;17056:53;;16813:315;:::o;68896:36::-;;;;;;;;;;;;;:::o;34617:2800::-;34751:27;34781;34800:7;34781:18;:27::i;:::-;34751:57;;34866:4;34825:45;;34841:19;34825:45;;;34821:86;;34879:28;;;;;;;;;;;;;;34821:86;34921:27;34950:23;34977:28;34997:7;34977:19;:28::i;:::-;34920:85;;;;35105:62;35124:15;35141:4;35147:19;:17;:19::i;:::-;35105:18;:62::i;:::-;35100:174;;35187:43;35204:4;35210:19;:17;:19::i;:::-;35187:16;:43::i;:::-;35182:92;;35239:35;;;;;;;;;;;;;;35182:92;35100:174;35305:1;35291:16;;:2;:16;;;35287:52;;;35316:23;;;;;;;;;;;;;;35287:52;35352:43;35374:4;35380:2;35384:7;35393:1;35352:21;:43::i;:::-;35488:15;35485:160;;;35628:1;35607:19;35600:30;35485:160;36023:18;:24;36042:4;36023:24;;;;;;;;;;;;;;;;36021:26;;;;;;;;;;;;36092:18;:22;36111:2;36092:22;;;;;;;;;;;;;;;;36090:24;;;;;;;;;;;36414:145;36451:2;36499:45;36514:4;36520:2;36524:19;36499:14;:45::i;:::-;14041:8;36472:72;36414:18;:145::i;:::-;36385:17;:26;36403:7;36385:26;;;;;;;;;;;:174;;;;36729:1;14041:8;36679:19;:46;:51;36675:626;;;36751:19;36783:1;36773:7;:11;36751:33;;36940:1;36906:17;:30;36924:11;36906:30;;;;;;;;;;;;:35;36902:384;;;37044:13;;37029:11;:28;37025:242;;37224:19;37191:17;:30;37209:11;37191:30;;;;;;;;;;;:52;;;;37025:242;36902:384;36732:569;36675:626;37348:7;37344:2;37329:27;;37338:4;37329:27;;;;;;;;;;;;37367:42;37388:4;37394:2;37398:7;37407:1;37367:20;:42::i;:::-;34740:2677;;;34617:2800;;;:::o;69214:32::-;;;;:::o;69167:40::-;69204:3;69167:40;:::o;73237:91::-;58480:13;:11;:13::i;:::-;73311:9:::1;73302:6;;:18;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;73237:91:::0;:::o;69063:39::-;;;;:::o;71510:297::-;58480:13;:11;:13::i;:::-;69204:3:::1;71632:8;71605:24;71618:10;71605:12;:24::i;:::-;:35;;;;:::i;:::-;:49;;71583:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;69204:3;71730:8;71714:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;71706:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;71781:18;71790:8;71781;:18::i;:::-;71510:297:::0;:::o;72192:112::-;58480:13;:11;:13::i;:::-;72256:7:::1;:5;:7::i;:::-;72248:25;;:48;72274:21;72248:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;72192:112::o:0;26242:185::-;26380:39;26397:4;26403:2;26407:7;26380:39;;;;;;;;;;;;:16;:39::i;:::-;26242:185;;;:::o;72312:90::-;58480:13;:11;:13::i;:::-;72391:3:::1;;72381:7;:13;;;;;;;:::i;:::-;;72312:90:::0;;:::o;51860:468::-;51949:23;52010:22;52035:8;:15;52010:40;;52065:34;52123:14;52102:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;52065:73;;52158:9;52153:125;52174:14;52169:1;:19;52153:125;;52230:32;52250:8;52259:1;52250:11;;;;;;;;:::i;:::-;;;;;;;;52230:19;:32::i;:::-;52214:10;52225:1;52214:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;52190:3;;;;;52153:125;;;;52299:10;52292:17;;;;51860:468;;;:::o;23195:144::-;23259:7;23302:27;23321:7;23302:18;:27::i;:::-;23279:52;;23195:144;;;:::o;68965:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18438:224::-;18502:7;18543:1;18526:19;;:5;:19;;;18522:60;;;18554:28;;;;;;;;;;;;;;18522:60;12993:13;18600:18;:25;18619:5;18600:25;;;;;;;;;;;;;;;;:54;18593:61;;18438:224;;;:::o;59242:103::-;58480:13;:11;:13::i;:::-;59307:30:::1;59334:1;59307:18;:30::i;:::-;59242:103::o:0;55672:892::-;55742:16;55796:19;55830:25;55870:22;55895:16;55905:5;55895:9;:16::i;:::-;55870:41;;55926:25;55968:14;55954:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55926:57;;55998:31;;:::i;:::-;56049:9;56061:15;:13;:15::i;:::-;56049:27;;56044:472;56093:14;56078:11;:29;56044:472;;56145:15;56158:1;56145:12;:15::i;:::-;56133:27;;56183:9;:16;;;56179:73;;;56224:8;;56179:73;56300:1;56274:28;;:9;:14;;;:28;;;56270:111;;56347:9;:14;;;56327:34;;56270:111;56424:5;56403:26;;:17;:26;;;56399:102;;;56480:1;56454:8;56463:13;;;;;;56454:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;56399:102;56044:472;56109:3;;;;;56044:472;;;;56537:8;56530:15;;;;;;;55672:892;;;:::o;58594:87::-;58640:7;58667:6;;;;;;;;;;;58660:13;;58594:87;:::o;72506:88::-;58480:13;:11;:13::i;:::-;72578:8:::1;72570:5;:16;;;;72506:88:::0;:::o;72767:228::-;58480:13;:11;:13::i;:::-;72870:9:::1;;72860:6;:19;;72838:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;72981:6;72969:9;:18;;;;72767:228:::0;:::o;23575:104::-;23631:13;23664:7;23657:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23575:104;:::o;52718:2505::-;52853:16;52920:4;52911:5;:13;52907:45;;52933:19;;;;;;;;;;;;;;52907:45;52967:19;53001:17;53021:14;:12;:14::i;:::-;53001:34;;53121:15;:13;:15::i;:::-;53113:5;:23;53109:87;;;53165:15;:13;:15::i;:::-;53157:23;;53109:87;53272:9;53265:4;:16;53261:73;;;53309:9;53302:16;;53261:73;53348:25;53376:16;53386:5;53376:9;:16::i;:::-;53348:44;;53570:4;53562:5;:12;53558:278;;;53595:19;53624:5;53617:4;:12;53595:34;;53666:17;53652:11;:31;53648:111;;;53728:11;53708:31;;53648:111;53576:198;53558:278;;;53819:1;53799:21;;53558:278;53850:25;53892:17;53878:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53850:60;;53950:1;53929:17;:22;53925:78;;;53979:8;53972:15;;;;;;;;53925:78;54147:31;54181:26;54201:5;54181:19;:26::i;:::-;54147:60;;54222:25;54467:9;:16;;;54462:92;;54524:9;:14;;;54504:34;;54462:92;54573:9;54585:5;54573:17;;54568:478;54597:4;54592:1;:9;;:45;;;;;54620:17;54605:11;:32;;54592:45;54568:478;;;54675:15;54688:1;54675:12;:15::i;:::-;54663:27;;54713:9;:16;;;54709:73;;;54754:8;;54709:73;54830:1;54804:28;;:9;:14;;;:28;;;54800:111;;54877:9;:14;;;54857:34;;54800:111;54954:5;54933:26;;:17;:26;;;54929:102;;;55010:1;54984:8;54993:13;;;;;;54984:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;54929:102;54568:478;54639:3;;;;;54568:478;;;;55148:11;55138:8;55131:29;55196:8;55189:15;;;;;;;;52718:2505;;;;;;:::o;69327:39::-;;;;:::o;69994:890::-;70072:14;70062:24;;;;;;;;:::i;:::-;;:6;;;;;;;;;;;:24;;;;;;;;:::i;:::-;;;70054:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;70134:10;70121:23;;:9;:23;;;70113:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;70221:9;;70209:8;70193:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;70185:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;70320:17;;70308:8;70281:24;70294:10;70281:12;:24::i;:::-;:35;;;;:::i;:::-;:56;;70259:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;70408:1;70397:8;:12;70389:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;70443:27;70473:8;70443:38;;69159:1;70510:24;70523:10;70510:12;:24::i;:::-;:48;:88;;;;;70588:10;;70575;;:23;70510:88;70492:249;;;69159:1;70647:8;:32;;;;:::i;:::-;70625:54;;69159:1;70694:10;;:35;;;;;;;:::i;:::-;;;;;;;;70492:249;70751:39;70770:19;70762:5;;:27;;;;:::i;:::-;70751:10;:39::i;:::-;70801:31;70811:10;70823:8;70801:9;:31::i;:::-;70848:28;70855:10;70867:8;70848:28;;;;;;;:::i;:::-;;;;;;;;70043:841;69994:890;:::o;25628:308::-;25739:19;:17;:19::i;:::-;25727:31;;:8;:31;;;25723:61;;;25767:17;;;;;;;;;;;;;;25723:61;25849:8;25797:18;:39;25816:19;:17;:19::i;:::-;25797:39;;;;;;;;;;;;;;;:49;25837:8;25797:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25909:8;25873:55;;25888:19;:17;:19::i;:::-;25873:55;;;25919:8;25873:55;;;;;;:::i;:::-;;;;;;;;25628:308;;:::o;26498:399::-;26665:31;26678:4;26684:2;26688:7;26665:12;:31::i;:::-;26729:1;26711:2;:14;;;:19;26707:183;;26750:56;26781:4;26787:2;26791:7;26800:5;26750:30;:56::i;:::-;26745:145;;26834:40;;;;;;;;;;;;;;26745:145;26707:183;26498:399;;;;:::o;72410:88::-;58480:13;:11;:13::i;:::-;72487:3:::1;;72478:6;:12;;;;;;;:::i;:::-;;72410:88:::0;;:::o;51281:420::-;51357:21;;:::i;:::-;51391:31;;:::i;:::-;51447:15;:13;:15::i;:::-;51437:7;:25;:54;;;;51477:14;:12;:14::i;:::-;51466:7;:25;;51437:54;51433:103;;;51515:9;51508:16;;;;;51433:103;51558:21;51571:7;51558:12;:21::i;:::-;51546:33;;51594:9;:16;;;51590:65;;;51634:9;51627:16;;;;;51590:65;51672:21;51685:7;51672:12;:21::i;:::-;51665:28;;;51281:420;;;;:::o;69692:294::-;69793:13;69869:1;69850:7;69844:21;;;;;:::i;:::-;;;:26;;:134;;69972:6;69844:134;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69914:7;69923:18;69933:7;69923:9;:18::i;:::-;69897:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69844:134;69824:154;;69692:294;;;:::o;69291:29::-;;;;:::o;69253:31::-;;;;:::o;72071:113::-;72129:7;72156:20;72170:5;72156:13;:20::i;:::-;72149:27;;72071:113;;;:::o;26007:164::-;26104:4;26128:18;:25;26147:5;26128:25;;;;;;;;;;;;;;;:35;26154:8;26128:35;;;;;;;;;;;;;;;;;;;;;;;;;26121:42;;26007:164;;;;:::o;68939:19::-;;;;:::o;72602:157::-;58480:13;:11;:13::i;:::-;72697:7:::1;;72705:1;72697:10;;;;;;;:::i;:::-;;;;;;;;72677:17;:30;;;;72741:7;;72749:1;72741:10;;;;;;;:::i;:::-;;;;;;;;72718:20;:33;;;;72602:157:::0;;:::o;68993:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73336:89::-;58480:13;:11;:13::i;:::-;73411:5:::1;73403:14;;73396:4;:21;;;;73336:89:::0;:::o;59500:201::-;58480:13;:11;:13::i;:::-;59609:1:::1;59589:22;;:8;:22;;;;59581:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;59665:28;59684:8;59665:18;:28::i;:::-;59500:201:::0;:::o;73003:226::-;58480:13;:11;:13::i;:::-;73102:9:::1;;73092:6;:19;;73070:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;73215:6;73202:10;:19;;;;73003:226:::0;:::o;27152:273::-;27209:4;27265:7;27246:15;:13;:15::i;:::-;:26;;:66;;;;;27299:13;;27289:7;:23;27246:66;:152;;;;;27397:1;13763:8;27350:17;:26;27368:7;27350:26;;;;;;;;;;;;:43;:48;27246:152;27226:172;;27152:273;;;:::o;45713:105::-;45773:7;45800:10;45793:17;;45713:105;:::o;73433:126::-;73488:7;73542;73525:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;73515:36;;;;;;73508:43;;73433:126;;;:::o;73567:179::-;73672:4;73701:37;73720:5;73727:4;;73733;73701:18;:37::i;:::-;73694:44;;73567:179;;;;:::o;71815:248::-;71903:10;;71891:8;71878:10;;:21;;;;:::i;:::-;:35;;71870:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;71947:31;71957:10;71969:8;71947:9;:31::i;:::-;72003:8;71989:10;;:22;;;;;;;:::i;:::-;;;;;;;;72027:28;72034:10;72046:8;72027:28;;;;;;;:::i;:::-;;;;;;;;71815:248;:::o;69483:93::-;69540:7;69567:1;69560:8;;69483:93;:::o;20112:1129::-;20179:7;20199:12;20214:7;20199:22;;20282:4;20263:15;:13;:15::i;:::-;:23;20259:915;;20316:13;;20309:4;:20;20305:869;;;20354:14;20371:17;:23;20389:4;20371:23;;;;;;;;;;;;20354:40;;20487:1;13763:8;20460:6;:23;:28;20456:699;;;20979:113;20996:1;20986:6;:11;20979:113;;;21039:17;:25;21057:6;;;;;;;21039:25;;;;;;;;;;;;21030:34;;20979:113;;;21125:6;21118:13;;;;;;20456:699;20331:843;20305:869;20259:915;21202:31;;;;;;;;;;;;;;20112:1129;;;;:::o;32953:652::-;33048:27;33077:23;33118:53;33174:15;33118:71;;33360:7;33354:4;33347:21;33395:22;33389:4;33382:36;33471:4;33465;33455:21;33432:44;;33567:19;33561:26;33542:45;;33298:300;32953:652;;;:::o;33718:645::-;33860:11;34022:15;34016:4;34012:26;34004:34;;34181:15;34170:9;34166:31;34153:44;;34328:15;34317:9;34314:30;34307:4;34296:9;34293:19;34290:55;34280:65;;33718:645;;;;;:::o;44546:159::-;;;;;:::o;42858:309::-;42993:7;43013:16;14164:3;43039:19;:40;;43013:67;;14164:3;43106:31;43117:4;43123:2;43127:9;43106:10;:31::i;:::-;43098:40;;:61;;43091:68;;;42858:309;;;;;:::o;22686:447::-;22766:14;22934:15;22927:5;22923:27;22914:36;;23108:5;23094:11;23070:22;23066:40;23063:51;23056:5;23053:62;23043:72;;22686:447;;;;:::o;45364:158::-;;;;;:::o;58759:132::-;58834:12;:10;:12::i;:::-;58823:23;;:7;:5;:7::i;:::-;:23;;;58815:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58759:132::o;59861:191::-;59935:16;59954:6;;;;;;;;;;;59935:25;;59980:8;59971:6;;:17;;;;;;;;;;;;;;;;;;60035:8;60004:40;;60025:8;60004:40;;;;;;;;;;;;59924:128;59861:191;:::o;21789:153::-;21849:21;;:::i;:::-;21890:44;21909:17;:24;21927:5;21909:24;;;;;;;;;;;;21890:18;:44::i;:::-;21883:51;;21789:153;;;:::o;16508:95::-;16555:7;16582:13;;16575:20;;16508:95;:::o;70892:116::-;70968:6;70955:9;:19;;70947:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;70892:116;:::o;27509:104::-;27578:27;27588:2;27592:8;27578:27;;;;;;;;;;;;:9;:27::i;:::-;27509:104;;:::o;41368:716::-;41531:4;41577:2;41552:45;;;41598:19;:17;:19::i;:::-;41619:4;41625:7;41634:5;41552:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41548:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41852:1;41835:6;:13;:18;41831:235;;;41881:40;;;;;;;;;;;;;;41831:235;42024:6;42018:13;42009:6;42005:2;42001:15;41994:38;41548:529;41721:54;;;41711:64;;;:6;:64;;;;41704:71;;;41368:716;;;;;;:::o;22445:158::-;22507:21;;:::i;:::-;22548:47;22567:27;22586:7;22567:18;:27::i;:::-;22548:18;:47::i;:::-;22541:54;;22445:158;;;:::o;45924:1960::-;45981:17;46400:3;46393:4;46387:11;46383:21;46376:28;;46491:3;46485:4;46478:17;46597:3;47053:5;47183:1;47178:3;47174:11;47167:18;;47320:2;47314:4;47310:13;47306:2;47302:22;47297:3;47289:36;47361:2;47355:4;47351:13;47343:21;;46945:697;47380:4;46945:697;;;47571:1;47566:3;47562:11;47555:18;;47622:2;47616:4;47612:13;47608:2;47604:22;47599:3;47591:36;47475:2;47469:4;47465:13;47457:21;;46945:697;;;46949:430;47681:3;47676;47672:13;47796:2;47791:3;47787:12;47780:19;;47859:6;47854:3;47847:19;46020:1857;;45924:1960;;;:::o;18744:176::-;18805:7;12993:13;13130:2;18833:18;:25;18852:5;18833:25;;;;;;;;;;;;;;;;:49;;18832:80;18825:87;;18744:176;;;:::o;61207:190::-;61332:4;61385;61356:25;61369:5;61376:4;61356:12;:25::i;:::-;:33;61349:40;;61207:190;;;;;:::o;43743:147::-;43880:6;43743:147;;;;;:::o;57198:98::-;57251:7;57278:10;57271:17;;57198:98;:::o;21335:363::-;21401:31;;:::i;:::-;21478:6;21445:9;:14;;:41;;;;;;;;;;;13647:3;21531:6;:32;;21497:9;:24;;:67;;;;;;;;;;;21621:1;13763:8;21594:6;:23;:28;;21575:9;:16;;:47;;;;;;;;;;;14164:3;21662:6;:27;;21633:9;:19;;:57;;;;;;;;;;;21335:363;;;:::o;28029:681::-;28152:19;28158:2;28162:8;28152:5;:19::i;:::-;28231:1;28213:2;:14;;;:19;28209:483;;28253:11;28267:13;;28253:27;;28299:13;28321:8;28315:3;:14;28299:30;;28348:233;28379:62;28418:1;28422:2;28426:7;;;;;;28435:5;28379:30;:62::i;:::-;28374:167;;28477:40;;;;;;;;;;;;;;28374:167;28576:3;28568:5;:11;28348:233;;28663:3;28646:13;;:20;28642:34;;28668:8;;;28642:34;28234:458;;28209:483;28029:681;;;:::o;62074:296::-;62157:7;62177:20;62200:4;62177:27;;62220:9;62215:118;62239:5;:12;62235:1;:16;62215:118;;;62288:33;62298:12;62312:5;62318:1;62312:8;;;;;;;;:::i;:::-;;;;;;;;62288:9;:33::i;:::-;62273:48;;62253:3;;;;;:::i;:::-;;;;62215:118;;;;62350:12;62343:19;;;62074:296;;;;:::o;28983:1529::-;29048:20;29071:13;;29048:36;;29113:1;29099:16;;:2;:16;;;29095:48;;;29124:19;;;;;;;;;;;;;;29095:48;29170:1;29158:8;:13;29154:44;;;29180:18;;;;;;;;;;;;;;29154:44;29211:61;29241:1;29245:2;29249:12;29263:8;29211:21;:61::i;:::-;29754:1;13130:2;29725:1;:25;;29724:31;29712:8;:44;29686:18;:22;29705:2;29686:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;30033:139;30070:2;30124:33;30147:1;30151:2;30155:1;30124:14;:33::i;:::-;30091:30;30112:8;30091:20;:30::i;:::-;:66;30033:18;:139::i;:::-;29999:17;:31;30017:12;29999:31;;;;;;;;;;;:173;;;;30189:15;30207:12;30189:30;;30234:11;30263:8;30248:12;:23;30234:37;;30286:101;30338:9;;;;;;30334:2;30313:35;;30330:1;30313:35;;;;;;;;;;;;30382:3;30372:7;:13;30286:101;;30419:3;30403:13;:19;;;;29460:974;;30444:60;30473:1;30477:2;30481:12;30495:8;30444:20;:60::i;:::-;29037:1475;28983:1529;;:::o;68281:149::-;68344:7;68375:1;68371;:5;:51;;68402:20;68417:1;68420;68402:14;:20::i;:::-;68371:51;;;68379:20;68394:1;68397;68379:14;:20::i;:::-;68371:51;68364:58;;68281:149;;;;:::o;24516:322::-;24586:14;24817:1;24807:8;24804:15;24779:23;24775:45;24765:55;;24516:322;;;:::o;68438:268::-;68506:13;68613:1;68607:4;68600:15;68642:1;68636:4;68629:15;68683:4;68677;68667:21;68658:30;;68438:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:139::-;1959:5;1997:6;1984:20;1975:29;;2013:33;2040:5;2013:33;:::i;:::-;1913:139;;;;:::o;2075:370::-;2146:5;2195:3;2188:4;2180:6;2176:17;2172:27;2162:122;;2203:79;;:::i;:::-;2162:122;2320:6;2307:20;2345:94;2435:3;2427:6;2420:4;2412:6;2408:17;2345:94;:::i;:::-;2336:103;;2152:293;2075:370;;;;:::o;2468:568::-;2541:8;2551:6;2601:3;2594:4;2586:6;2582:17;2578:27;2568:122;;2609:79;;:::i;:::-;2568:122;2722:6;2709:20;2699:30;;2752:18;2744:6;2741:30;2738:117;;;2774:79;;:::i;:::-;2738:117;2888:4;2880:6;2876:17;2864:29;;2942:3;2934:4;2926:6;2922:17;2912:8;2908:32;2905:41;2902:128;;;2949:79;;:::i;:::-;2902:128;2468:568;;;;;:::o;3059:370::-;3130:5;3179:3;3172:4;3164:6;3160:17;3156:27;3146:122;;3187:79;;:::i;:::-;3146:122;3304:6;3291:20;3329:94;3419:3;3411:6;3404:4;3396:6;3392:17;3329:94;:::i;:::-;3320:103;;3136:293;3059:370;;;;:::o;3435:133::-;3478:5;3516:6;3503:20;3494:29;;3532:30;3556:5;3532:30;:::i;:::-;3435:133;;;;:::o;3574:139::-;3620:5;3658:6;3645:20;3636:29;;3674:33;3701:5;3674:33;:::i;:::-;3574:139;;;;:::o;3719:137::-;3764:5;3802:6;3789:20;3780:29;;3818:32;3844:5;3818:32;:::i;:::-;3719:137;;;;:::o;3862:141::-;3918:5;3949:6;3943:13;3934:22;;3965:32;3991:5;3965:32;:::i;:::-;3862:141;;;;:::o;4022:338::-;4077:5;4126:3;4119:4;4111:6;4107:17;4103:27;4093:122;;4134:79;;:::i;:::-;4093:122;4251:6;4238:20;4276:78;4350:3;4342:6;4335:4;4327:6;4323:17;4276:78;:::i;:::-;4267:87;;4083:277;4022:338;;;;:::o;4366:161::-;4423:5;4461:6;4448:20;4439:29;;4477:44;4515:5;4477:44;:::i;:::-;4366:161;;;;:::o;4547:553::-;4605:8;4615:6;4665:3;4658:4;4650:6;4646:17;4642:27;4632:122;;4673:79;;:::i;:::-;4632:122;4786:6;4773:20;4763:30;;4816:18;4808:6;4805:30;4802:117;;;4838:79;;:::i;:::-;4802:117;4952:4;4944:6;4940:17;4928:29;;5006:3;4998:4;4990:6;4986:17;4976:8;4972:32;4969:41;4966:128;;;5013:79;;:::i;:::-;4966:128;4547:553;;;;;:::o;5106:139::-;5152:5;5190:6;5177:20;5168:29;;5206:33;5233:5;5206:33;:::i;:::-;5106:139;;;;:::o;5251:329::-;5310:6;5359:2;5347:9;5338:7;5334:23;5330:32;5327:119;;;5365:79;;:::i;:::-;5327:119;5485:1;5510:53;5555:7;5546:6;5535:9;5531:22;5510:53;:::i;:::-;5500:63;;5456:117;5251:329;;;;:::o;5586:474::-;5654:6;5662;5711:2;5699:9;5690:7;5686:23;5682:32;5679:119;;;5717:79;;:::i;:::-;5679:119;5837:1;5862:53;5907:7;5898:6;5887:9;5883:22;5862:53;:::i;:::-;5852:63;;5808:117;5964:2;5990:53;6035:7;6026:6;6015:9;6011:22;5990:53;:::i;:::-;5980:63;;5935:118;5586:474;;;;;:::o;6066:619::-;6143:6;6151;6159;6208:2;6196:9;6187:7;6183:23;6179:32;6176:119;;;6214:79;;:::i;:::-;6176:119;6334:1;6359:53;6404:7;6395:6;6384:9;6380:22;6359:53;:::i;:::-;6349:63;;6305:117;6461:2;6487:53;6532:7;6523:6;6512:9;6508:22;6487:53;:::i;:::-;6477:63;;6432:118;6589:2;6615:53;6660:7;6651:6;6640:9;6636:22;6615:53;:::i;:::-;6605:63;;6560:118;6066:619;;;;;:::o;6691:943::-;6786:6;6794;6802;6810;6859:3;6847:9;6838:7;6834:23;6830:33;6827:120;;;6866:79;;:::i;:::-;6827:120;6986:1;7011:53;7056:7;7047:6;7036:9;7032:22;7011:53;:::i;:::-;7001:63;;6957:117;7113:2;7139:53;7184:7;7175:6;7164:9;7160:22;7139:53;:::i;:::-;7129:63;;7084:118;7241:2;7267:53;7312:7;7303:6;7292:9;7288:22;7267:53;:::i;:::-;7257:63;;7212:118;7397:2;7386:9;7382:18;7369:32;7428:18;7420:6;7417:30;7414:117;;;7450:79;;:::i;:::-;7414:117;7555:62;7609:7;7600:6;7589:9;7585:22;7555:62;:::i;:::-;7545:72;;7340:287;6691:943;;;;;;;:::o;7640:468::-;7705:6;7713;7762:2;7750:9;7741:7;7737:23;7733:32;7730:119;;;7768:79;;:::i;:::-;7730:119;7888:1;7913:53;7958:7;7949:6;7938:9;7934:22;7913:53;:::i;:::-;7903:63;;7859:117;8015:2;8041:50;8083:7;8074:6;8063:9;8059:22;8041:50;:::i;:::-;8031:60;;7986:115;7640:468;;;;;:::o;8114:474::-;8182:6;8190;8239:2;8227:9;8218:7;8214:23;8210:32;8207:119;;;8245:79;;:::i;:::-;8207:119;8365:1;8390:53;8435:7;8426:6;8415:9;8411:22;8390:53;:::i;:::-;8380:63;;8336:117;8492:2;8518:53;8563:7;8554:6;8543:9;8539:22;8518:53;:::i;:::-;8508:63;;8463:118;8114:474;;;;;:::o;8594:619::-;8671:6;8679;8687;8736:2;8724:9;8715:7;8711:23;8707:32;8704:119;;;8742:79;;:::i;:::-;8704:119;8862:1;8887:53;8932:7;8923:6;8912:9;8908:22;8887:53;:::i;:::-;8877:63;;8833:117;8989:2;9015:53;9060:7;9051:6;9040:9;9036:22;9015:53;:::i;:::-;9005:63;;8960:118;9117:2;9143:53;9188:7;9179:6;9168:9;9164:22;9143:53;:::i;:::-;9133:63;;9088:118;8594:619;;;;;:::o;9219:684::-;9312:6;9320;9369:2;9357:9;9348:7;9344:23;9340:32;9337:119;;;9375:79;;:::i;:::-;9337:119;9523:1;9512:9;9508:17;9495:31;9553:18;9545:6;9542:30;9539:117;;;9575:79;;:::i;:::-;9539:117;9680:78;9750:7;9741:6;9730:9;9726:22;9680:78;:::i;:::-;9670:88;;9466:302;9807:2;9833:53;9878:7;9869:6;9858:9;9854:22;9833:53;:::i;:::-;9823:63;;9778:118;9219:684;;;;;:::o;9909:559::-;9995:6;10003;10052:2;10040:9;10031:7;10027:23;10023:32;10020:119;;;10058:79;;:::i;:::-;10020:119;10206:1;10195:9;10191:17;10178:31;10236:18;10228:6;10225:30;10222:117;;;10258:79;;:::i;:::-;10222:117;10371:80;10443:7;10434:6;10423:9;10419:22;10371:80;:::i;:::-;10353:98;;;;10149:312;9909:559;;;;;:::o;10474:539::-;10558:6;10607:2;10595:9;10586:7;10582:23;10578:32;10575:119;;;10613:79;;:::i;:::-;10575:119;10761:1;10750:9;10746:17;10733:31;10791:18;10783:6;10780:30;10777:117;;;10813:79;;:::i;:::-;10777:117;10918:78;10988:7;10979:6;10968:9;10964:22;10918:78;:::i;:::-;10908:88;;10704:302;10474:539;;;;:::o;11019:327::-;11077:6;11126:2;11114:9;11105:7;11101:23;11097:32;11094:119;;;11132:79;;:::i;:::-;11094:119;11252:1;11277:52;11321:7;11312:6;11301:9;11297:22;11277:52;:::i;:::-;11267:62;;11223:116;11019:327;;;;:::o;11352:349::-;11421:6;11470:2;11458:9;11449:7;11445:23;11441:32;11438:119;;;11476:79;;:::i;:::-;11438:119;11596:1;11621:63;11676:7;11667:6;11656:9;11652:22;11621:63;:::i;:::-;11611:73;;11567:127;11352:349;;;;:::o;11707:351::-;11777:6;11826:2;11814:9;11805:7;11801:23;11797:32;11794:119;;;11832:79;;:::i;:::-;11794:119;11952:1;11977:64;12033:7;12024:6;12013:9;12009:22;11977:64;:::i;:::-;11967:74;;11923:128;11707:351;;;;:::o;12064:529::-;12135:6;12143;12192:2;12180:9;12171:7;12167:23;12163:32;12160:119;;;12198:79;;:::i;:::-;12160:119;12346:1;12335:9;12331:17;12318:31;12376:18;12368:6;12365:30;12362:117;;;12398:79;;:::i;:::-;12362:117;12511:65;12568:7;12559:6;12548:9;12544:22;12511:65;:::i;:::-;12493:83;;;;12289:297;12064:529;;;;;:::o;12599:329::-;12658:6;12707:2;12695:9;12686:7;12682:23;12678:32;12675:119;;;12713:79;;:::i;:::-;12675:119;12833:1;12858:53;12903:7;12894:6;12883:9;12879:22;12858:53;:::i;:::-;12848:63;;12804:117;12599:329;;;;:::o;12934:299::-;13063:10;13084:106;13186:3;13178:6;13084:106;:::i;:::-;13222:4;13217:3;13213:14;13199:28;;12934:299;;;;:::o;13239:179::-;13308:10;13329:46;13371:3;13363:6;13329:46;:::i;:::-;13407:4;13402:3;13398:14;13384:28;;13239:179;;;;:::o;13424:108::-;13501:24;13519:5;13501:24;:::i;:::-;13496:3;13489:37;13424:108;;:::o;13538:118::-;13625:24;13643:5;13625:24;:::i;:::-;13620:3;13613:37;13538:118;;:::o;13662:157::-;13767:45;13787:24;13805:5;13787:24;:::i;:::-;13767:45;:::i;:::-;13762:3;13755:58;13662:157;;:::o;13901:972::-;14080:3;14109:84;14187:5;14109:84;:::i;:::-;14209:116;14318:6;14313:3;14209:116;:::i;:::-;14202:123;;14349:86;14429:5;14349:86;:::i;:::-;14458:7;14489:1;14474:374;14499:6;14496:1;14493:13;14474:374;;;14575:6;14569:13;14602:123;14721:3;14706:13;14602:123;:::i;:::-;14595:130;;14748:90;14831:6;14748:90;:::i;:::-;14738:100;;14534:314;14521:1;14518;14514:9;14509:14;;14474:374;;;14478:14;14864:3;14857:10;;14085:788;;;13901:972;;;;:::o;14909:732::-;15028:3;15057:54;15105:5;15057:54;:::i;:::-;15127:86;15206:6;15201:3;15127:86;:::i;:::-;15120:93;;15237:56;15287:5;15237:56;:::i;:::-;15316:7;15347:1;15332:284;15357:6;15354:1;15351:13;15332:284;;;15433:6;15427:13;15460:63;15519:3;15504:13;15460:63;:::i;:::-;15453:70;;15546:60;15599:6;15546:60;:::i;:::-;15536:70;;15392:224;15379:1;15376;15372:9;15367:14;;15332:284;;;15336:14;15632:3;15625:10;;15033:608;;;14909:732;;;;:::o;15647:99::-;15718:21;15733:5;15718:21;:::i;:::-;15713:3;15706:34;15647:99;;:::o;15752:109::-;15833:21;15848:5;15833:21;:::i;:::-;15828:3;15821:34;15752:109;;:::o;15867:118::-;15954:24;15972:5;15954:24;:::i;:::-;15949:3;15942:37;15867:118;;:::o;15991:360::-;16077:3;16105:38;16137:5;16105:38;:::i;:::-;16159:70;16222:6;16217:3;16159:70;:::i;:::-;16152:77;;16238:52;16283:6;16278:3;16271:4;16264:5;16260:16;16238:52;:::i;:::-;16315:29;16337:6;16315:29;:::i;:::-;16310:3;16306:39;16299:46;;16081:270;15991:360;;;;:::o;16357:149::-;16453:46;16493:5;16453:46;:::i;:::-;16448:3;16441:59;16357:149;;:::o;16512:364::-;16600:3;16628:39;16661:5;16628:39;:::i;:::-;16683:71;16747:6;16742:3;16683:71;:::i;:::-;16676:78;;16763:52;16808:6;16803:3;16796:4;16789:5;16785:16;16763:52;:::i;:::-;16840:29;16862:6;16840:29;:::i;:::-;16835:3;16831:39;16824:46;;16604:272;16512:364;;;;:::o;16882:377::-;16988:3;17016:39;17049:5;17016:39;:::i;:::-;17071:89;17153:6;17148:3;17071:89;:::i;:::-;17064:96;;17169:52;17214:6;17209:3;17202:4;17195:5;17191:16;17169:52;:::i;:::-;17246:6;17241:3;17237:16;17230:23;;16992:267;16882:377;;;;:::o;17289:845::-;17392:3;17429:5;17423:12;17458:36;17484:9;17458:36;:::i;:::-;17510:89;17592:6;17587:3;17510:89;:::i;:::-;17503:96;;17630:1;17619:9;17615:17;17646:1;17641:137;;;;17792:1;17787:341;;;;17608:520;;17641:137;17725:4;17721:9;17710;17706:25;17701:3;17694:38;17761:6;17756:3;17752:16;17745:23;;17641:137;;17787:341;17854:38;17886:5;17854:38;:::i;:::-;17914:1;17928:154;17942:6;17939:1;17936:13;17928:154;;;18016:7;18010:14;18006:1;18001:3;17997:11;17990:35;18066:1;18057:7;18053:15;18042:26;;17964:4;17961:1;17957:12;17952:17;;17928:154;;;18111:6;18106:3;18102:16;18095:23;;17794:334;;17608:520;;17396:738;;17289:845;;;;:::o;18140:366::-;18282:3;18303:67;18367:2;18362:3;18303:67;:::i;:::-;18296:74;;18379:93;18468:3;18379:93;:::i;:::-;18497:2;18492:3;18488:12;18481:19;;18140:366;;;:::o;18512:::-;18654:3;18675:67;18739:2;18734:3;18675:67;:::i;:::-;18668:74;;18751:93;18840:3;18751:93;:::i;:::-;18869:2;18864:3;18860:12;18853:19;;18512:366;;;:::o;18884:::-;19026:3;19047:67;19111:2;19106:3;19047:67;:::i;:::-;19040:74;;19123:93;19212:3;19123:93;:::i;:::-;19241:2;19236:3;19232:12;19225:19;;18884:366;;;:::o;19256:::-;19398:3;19419:67;19483:2;19478:3;19419:67;:::i;:::-;19412:74;;19495:93;19584:3;19495:93;:::i;:::-;19613:2;19608:3;19604:12;19597:19;;19256:366;;;:::o;19628:::-;19770:3;19791:67;19855:2;19850:3;19791:67;:::i;:::-;19784:74;;19867:93;19956:3;19867:93;:::i;:::-;19985:2;19980:3;19976:12;19969:19;;19628:366;;;:::o;20000:::-;20142:3;20163:67;20227:2;20222:3;20163:67;:::i;:::-;20156:74;;20239:93;20328:3;20239:93;:::i;:::-;20357:2;20352:3;20348:12;20341:19;;20000:366;;;:::o;20372:400::-;20532:3;20553:84;20635:1;20630:3;20553:84;:::i;:::-;20546:91;;20646:93;20735:3;20646:93;:::i;:::-;20764:1;20759:3;20755:11;20748:18;;20372:400;;;:::o;20778:366::-;20920:3;20941:67;21005:2;21000:3;20941:67;:::i;:::-;20934:74;;21017:93;21106:3;21017:93;:::i;:::-;21135:2;21130:3;21126:12;21119:19;;20778:366;;;:::o;21150:::-;21292:3;21313:67;21377:2;21372:3;21313:67;:::i;:::-;21306:74;;21389:93;21478:3;21389:93;:::i;:::-;21507:2;21502:3;21498:12;21491:19;;21150:366;;;:::o;21522:::-;21664:3;21685:67;21749:2;21744:3;21685:67;:::i;:::-;21678:74;;21761:93;21850:3;21761:93;:::i;:::-;21879:2;21874:3;21870:12;21863:19;;21522:366;;;:::o;21894:::-;22036:3;22057:67;22121:2;22116:3;22057:67;:::i;:::-;22050:74;;22133:93;22222:3;22133:93;:::i;:::-;22251:2;22246:3;22242:12;22235:19;;21894:366;;;:::o;22266:::-;22408:3;22429:67;22493:2;22488:3;22429:67;:::i;:::-;22422:74;;22505:93;22594:3;22505:93;:::i;:::-;22623:2;22618:3;22614:12;22607:19;;22266:366;;;:::o;22638:::-;22780:3;22801:67;22865:2;22860:3;22801:67;:::i;:::-;22794:74;;22877:93;22966:3;22877:93;:::i;:::-;22995:2;22990:3;22986:12;22979:19;;22638:366;;;:::o;23082:862::-;23229:4;23224:3;23220:14;23316:4;23309:5;23305:16;23299:23;23335:63;23392:4;23387:3;23383:14;23369:12;23335:63;:::i;:::-;23244:164;23500:4;23493:5;23489:16;23483:23;23519:61;23574:4;23569:3;23565:14;23551:12;23519:61;:::i;:::-;23418:172;23674:4;23667:5;23663:16;23657:23;23693:57;23744:4;23739:3;23735:14;23721:12;23693:57;:::i;:::-;23600:160;23847:4;23840:5;23836:16;23830:23;23866:61;23921:4;23916:3;23912:14;23898:12;23866:61;:::i;:::-;23770:167;23198:746;23082:862;;:::o;24022:872::-;24179:4;24174:3;24170:14;24266:4;24259:5;24255:16;24249:23;24285:63;24342:4;24337:3;24333:14;24319:12;24285:63;:::i;:::-;24194:164;24450:4;24443:5;24439:16;24433:23;24469:61;24524:4;24519:3;24515:14;24501:12;24469:61;:::i;:::-;24368:172;24624:4;24617:5;24613:16;24607:23;24643:57;24694:4;24689:3;24685:14;24671:12;24643:57;:::i;:::-;24550:160;24797:4;24790:5;24786:16;24780:23;24816:61;24871:4;24866:3;24862:14;24848:12;24816:61;:::i;:::-;24720:167;24148:746;24022:872;;:::o;24900:105::-;24975:23;24992:5;24975:23;:::i;:::-;24970:3;24963:36;24900:105;;:::o;25011:108::-;25088:24;25106:5;25088:24;:::i;:::-;25083:3;25076:37;25011:108;;:::o;25125:118::-;25212:24;25230:5;25212:24;:::i;:::-;25207:3;25200:37;25125:118;;:::o;25249:105::-;25324:23;25341:5;25324:23;:::i;:::-;25319:3;25312:36;25249:105;;:::o;25360:256::-;25472:3;25487:75;25558:3;25549:6;25487:75;:::i;:::-;25587:2;25582:3;25578:12;25571:19;;25607:3;25600:10;;25360:256;;;;:::o;25622:695::-;25900:3;25922:92;26010:3;26001:6;25922:92;:::i;:::-;25915:99;;26031:95;26122:3;26113:6;26031:95;:::i;:::-;26024:102;;26143:148;26287:3;26143:148;:::i;:::-;26136:155;;26308:3;26301:10;;25622:695;;;;;:::o;26323:222::-;26416:4;26454:2;26443:9;26439:18;26431:26;;26467:71;26535:1;26524:9;26520:17;26511:6;26467:71;:::i;:::-;26323:222;;;;:::o;26551:640::-;26746:4;26784:3;26773:9;26769:19;26761:27;;26798:71;26866:1;26855:9;26851:17;26842:6;26798:71;:::i;:::-;26879:72;26947:2;26936:9;26932:18;26923:6;26879:72;:::i;:::-;26961;27029:2;27018:9;27014:18;27005:6;26961:72;:::i;:::-;27080:9;27074:4;27070:20;27065:2;27054:9;27050:18;27043:48;27108:76;27179:4;27170:6;27108:76;:::i;:::-;27100:84;;26551:640;;;;;;;:::o;27197:332::-;27318:4;27356:2;27345:9;27341:18;27333:26;;27369:71;27437:1;27426:9;27422:17;27413:6;27369:71;:::i;:::-;27450:72;27518:2;27507:9;27503:18;27494:6;27450:72;:::i;:::-;27197:332;;;;;:::o;27535:493::-;27738:4;27776:2;27765:9;27761:18;27753:26;;27825:9;27819:4;27815:20;27811:1;27800:9;27796:17;27789:47;27853:168;28016:4;28007:6;27853:168;:::i;:::-;27845:176;;27535:493;;;;:::o;28034:373::-;28177:4;28215:2;28204:9;28200:18;28192:26;;28264:9;28258:4;28254:20;28250:1;28239:9;28235:17;28228:47;28292:108;28395:4;28386:6;28292:108;:::i;:::-;28284:116;;28034:373;;;;:::o;28413:210::-;28500:4;28538:2;28527:9;28523:18;28515:26;;28551:65;28613:1;28602:9;28598:17;28589:6;28551:65;:::i;:::-;28413:210;;;;:::o;28629:222::-;28722:4;28760:2;28749:9;28745:18;28737:26;;28773:71;28841:1;28830:9;28826:17;28817:6;28773:71;:::i;:::-;28629:222;;;;:::o;28857:240::-;28959:4;28997:2;28986:9;28982:18;28974:26;;29010:80;29087:1;29076:9;29072:17;29063:6;29010:80;:::i;:::-;28857:240;;;;:::o;29103:313::-;29216:4;29254:2;29243:9;29239:18;29231:26;;29303:9;29297:4;29293:20;29289:1;29278:9;29274:17;29267:47;29331:78;29404:4;29395:6;29331:78;:::i;:::-;29323:86;;29103:313;;;;:::o;29422:419::-;29588:4;29626:2;29615:9;29611:18;29603:26;;29675:9;29669:4;29665:20;29661:1;29650:9;29646:17;29639:47;29703:131;29829:4;29703:131;:::i;:::-;29695:139;;29422:419;;;:::o;29847:::-;30013:4;30051:2;30040:9;30036:18;30028:26;;30100:9;30094:4;30090:20;30086:1;30075:9;30071:17;30064:47;30128:131;30254:4;30128:131;:::i;:::-;30120:139;;29847:419;;;:::o;30272:::-;30438:4;30476:2;30465:9;30461:18;30453:26;;30525:9;30519:4;30515:20;30511:1;30500:9;30496:17;30489:47;30553:131;30679:4;30553:131;:::i;:::-;30545:139;;30272:419;;;:::o;30697:::-;30863:4;30901:2;30890:9;30886:18;30878:26;;30950:9;30944:4;30940:20;30936:1;30925:9;30921:17;30914:47;30978:131;31104:4;30978:131;:::i;:::-;30970:139;;30697:419;;;:::o;31122:::-;31288:4;31326:2;31315:9;31311:18;31303:26;;31375:9;31369:4;31365:20;31361:1;31350:9;31346:17;31339:47;31403:131;31529:4;31403:131;:::i;:::-;31395:139;;31122:419;;;:::o;31547:::-;31713:4;31751:2;31740:9;31736:18;31728:26;;31800:9;31794:4;31790:20;31786:1;31775:9;31771:17;31764:47;31828:131;31954:4;31828:131;:::i;:::-;31820:139;;31547:419;;;:::o;31972:::-;32138:4;32176:2;32165:9;32161:18;32153:26;;32225:9;32219:4;32215:20;32211:1;32200:9;32196:17;32189:47;32253:131;32379:4;32253:131;:::i;:::-;32245:139;;31972:419;;;:::o;32397:::-;32563:4;32601:2;32590:9;32586:18;32578:26;;32650:9;32644:4;32640:20;32636:1;32625:9;32621:17;32614:47;32678:131;32804:4;32678:131;:::i;:::-;32670:139;;32397:419;;;:::o;32822:::-;32988:4;33026:2;33015:9;33011:18;33003:26;;33075:9;33069:4;33065:20;33061:1;33050:9;33046:17;33039:47;33103:131;33229:4;33103:131;:::i;:::-;33095:139;;32822:419;;;:::o;33247:::-;33413:4;33451:2;33440:9;33436:18;33428:26;;33500:9;33494:4;33490:20;33486:1;33475:9;33471:17;33464:47;33528:131;33654:4;33528:131;:::i;:::-;33520:139;;33247:419;;;:::o;33672:::-;33838:4;33876:2;33865:9;33861:18;33853:26;;33925:9;33919:4;33915:20;33911:1;33900:9;33896:17;33889:47;33953:131;34079:4;33953:131;:::i;:::-;33945:139;;33672:419;;;:::o;34097:::-;34263:4;34301:2;34290:9;34286:18;34278:26;;34350:9;34344:4;34340:20;34336:1;34325:9;34321:17;34314:47;34378:131;34504:4;34378:131;:::i;:::-;34370:139;;34097:419;;;:::o;34522:343::-;34675:4;34713:3;34702:9;34698:19;34690:27;;34727:131;34855:1;34844:9;34840:17;34831:6;34727:131;:::i;:::-;34522:343;;;;:::o;34871:222::-;34964:4;35002:2;34991:9;34987:18;34979:26;;35015:71;35083:1;35072:9;35068:17;35059:6;35015:71;:::i;:::-;34871:222;;;;:::o;35099:129::-;35133:6;35160:20;;:::i;:::-;35150:30;;35189:33;35217:4;35209:6;35189:33;:::i;:::-;35099:129;;;:::o;35234:75::-;35267:6;35300:2;35294:9;35284:19;;35234:75;:::o;35315:311::-;35392:4;35482:18;35474:6;35471:30;35468:56;;;35504:18;;:::i;:::-;35468:56;35554:4;35546:6;35542:17;35534:25;;35614:4;35608;35604:15;35596:23;;35315:311;;;:::o;35632:::-;35709:4;35799:18;35791:6;35788:30;35785:56;;;35821:18;;:::i;:::-;35785:56;35871:4;35863:6;35859:17;35851:25;;35931:4;35925;35921:15;35913:23;;35632:311;;;:::o;35949:307::-;36010:4;36100:18;36092:6;36089:30;36086:56;;;36122:18;;:::i;:::-;36086:56;36160:29;36182:6;36160:29;:::i;:::-;36152:37;;36244:4;36238;36234:15;36226:23;;35949:307;;;:::o;36262:162::-;36359:4;36382:3;36374:11;;36412:4;36407:3;36403:14;36395:22;;36262:162;;;:::o;36430:132::-;36497:4;36520:3;36512:11;;36550:4;36545:3;36541:14;36533:22;;36430:132;;;:::o;36568:141::-;36617:4;36640:3;36632:11;;36663:3;36660:1;36653:14;36697:4;36694:1;36684:18;36676:26;;36568:141;;;:::o;36715:144::-;36812:6;36846:5;36840:12;36830:22;;36715:144;;;:::o;36865:114::-;36932:6;36966:5;36960:12;36950:22;;36865:114;;;:::o;36985:98::-;37036:6;37070:5;37064:12;37054:22;;36985:98;;;:::o;37089:99::-;37141:6;37175:5;37169:12;37159:22;;37089:99;;;:::o;37194:143::-;37294:4;37326;37321:3;37317:14;37309:22;;37194:143;;;:::o;37343:113::-;37413:4;37445;37440:3;37436:14;37428:22;;37343:113;;;:::o;37462:214::-;37591:11;37625:6;37620:3;37613:19;37665:4;37660:3;37656:14;37641:29;;37462:214;;;;:::o;37682:184::-;37781:11;37815:6;37810:3;37803:19;37855:4;37850:3;37846:14;37831:29;;37682:184;;;;:::o;37872:168::-;37955:11;37989:6;37984:3;37977:19;38029:4;38024:3;38020:14;38005:29;;37872:168;;;;:::o;38046:169::-;38130:11;38164:6;38159:3;38152:19;38204:4;38199:3;38195:14;38180:29;;38046:169;;;;:::o;38221:148::-;38323:11;38360:3;38345:18;;38221:148;;;;:::o;38375:305::-;38415:3;38434:20;38452:1;38434:20;:::i;:::-;38429:25;;38468:20;38486:1;38468:20;:::i;:::-;38463:25;;38622:1;38554:66;38550:74;38547:1;38544:81;38541:107;;;38628:18;;:::i;:::-;38541:107;38672:1;38669;38665:9;38658:16;;38375:305;;;;:::o;38686:348::-;38726:7;38749:20;38767:1;38749:20;:::i;:::-;38744:25;;38783:20;38801:1;38783:20;:::i;:::-;38778:25;;38971:1;38903:66;38899:74;38896:1;38893:81;38888:1;38881:9;38874:17;38870:105;38867:131;;;38978:18;;:::i;:::-;38867:131;39026:1;39023;39019:9;39008:20;;38686:348;;;;:::o;39040:191::-;39080:4;39100:20;39118:1;39100:20;:::i;:::-;39095:25;;39134:20;39152:1;39134:20;:::i;:::-;39129:25;;39173:1;39170;39167:8;39164:34;;;39178:18;;:::i;:::-;39164:34;39223:1;39220;39216:9;39208:17;;39040:191;;;;:::o;39237:96::-;39274:7;39303:24;39321:5;39303:24;:::i;:::-;39292:35;;39237:96;;;:::o;39339:90::-;39373:7;39416:5;39409:13;39402:21;39391:32;;39339:90;;;:::o;39435:77::-;39472:7;39501:5;39490:16;;39435:77;;;:::o;39518:149::-;39554:7;39594:66;39587:5;39583:78;39572:89;;39518:149;;;:::o;39673:133::-;39721:7;39750:5;39739:16;;39756:44;39794:5;39756:44;:::i;:::-;39673:133;;;:::o;39812:126::-;39849:7;39889:42;39882:5;39878:54;39867:65;;39812:126;;;:::o;39944:91::-;39980:7;40020:8;40013:5;40009:20;39998:31;;39944:91;;;:::o;40041:77::-;40078:7;40107:5;40096:16;;40041:77;;;:::o;40124:101::-;40160:7;40200:18;40193:5;40189:30;40178:41;;40124:101;;;:::o;40231:133::-;40290:9;40323:35;40352:5;40323:35;:::i;:::-;40310:48;;40231:133;;;:::o;40370:154::-;40454:6;40449:3;40444;40431:30;40516:1;40507:6;40502:3;40498:16;40491:27;40370:154;;;:::o;40530:307::-;40598:1;40608:113;40622:6;40619:1;40616:13;40608:113;;;40707:1;40702:3;40698:11;40692:18;40688:1;40683:3;40679:11;40672:39;40644:2;40641:1;40637:10;40632:15;;40608:113;;;40739:6;40736:1;40733:13;40730:101;;;40819:1;40810:6;40805:3;40801:16;40794:27;40730:101;40579:258;40530:307;;;:::o;40843:320::-;40887:6;40924:1;40918:4;40914:12;40904:22;;40971:1;40965:4;40961:12;40992:18;40982:81;;41048:4;41040:6;41036:17;41026:27;;40982:81;41110:2;41102:6;41099:14;41079:18;41076:38;41073:84;;;41129:18;;:::i;:::-;41073:84;40894:269;40843:320;;;:::o;41169:281::-;41252:27;41274:4;41252:27;:::i;:::-;41244:6;41240:40;41382:6;41370:10;41367:22;41346:18;41334:10;41331:34;41328:62;41325:88;;;41393:18;;:::i;:::-;41325:88;41433:10;41429:2;41422:22;41212:238;41169:281;;:::o;41456:233::-;41495:3;41518:24;41536:5;41518:24;:::i;:::-;41509:33;;41564:66;41557:5;41554:77;41551:103;;;41634:18;;:::i;:::-;41551:103;41681:1;41674:5;41670:13;41663:20;;41456:233;;;:::o;41695:100::-;41734:7;41763:26;41783:5;41763:26;:::i;:::-;41752:37;;41695:100;;;:::o;41801:94::-;41840:7;41869:20;41883:5;41869:20;:::i;:::-;41858:31;;41801:94;;;:::o;41901:180::-;41949:77;41946:1;41939:88;42046:4;42043:1;42036:15;42070:4;42067:1;42060:15;42087:180;42135:77;42132:1;42125:88;42232:4;42229:1;42222:15;42256:4;42253:1;42246:15;42273:180;42321:77;42318:1;42311:88;42418:4;42415:1;42408:15;42442:4;42439:1;42432:15;42459:180;42507:77;42504:1;42497:88;42604:4;42601:1;42594:15;42628:4;42625:1;42618:15;42645:180;42693:77;42690:1;42683:88;42790:4;42787:1;42780:15;42814:4;42811:1;42804:15;42831:117;42940:1;42937;42930:12;42954:117;43063:1;43060;43053:12;43077:117;43186:1;43183;43176:12;43200:117;43309:1;43306;43299:12;43323:117;43432:1;43429;43422:12;43446:117;43555:1;43552;43545:12;43569:102;43610:6;43661:2;43657:7;43652:2;43645:5;43641:14;43637:28;43627:38;;43569:102;;;:::o;43677:94::-;43710:8;43758:5;43754:2;43750:14;43729:35;;43677:94;;;:::o;43777:238::-;43917:34;43913:1;43905:6;43901:14;43894:58;43986:21;43981:2;43973:6;43969:15;43962:46;43777:238;:::o;44021:175::-;44161:27;44157:1;44149:6;44145:14;44138:51;44021:175;:::o;44202:239::-;44342:34;44338:1;44330:6;44326:14;44319:58;44411:22;44406:2;44398:6;44394:15;44387:47;44202:239;:::o;44447:225::-;44587:34;44583:1;44575:6;44571:14;44564:58;44656:8;44651:2;44643:6;44639:15;44632:33;44447:225;:::o;44678:164::-;44818:16;44814:1;44806:6;44802:14;44795:40;44678:164;:::o;44848:168::-;44988:20;44984:1;44976:6;44972:14;44965:44;44848:168;:::o;45022:155::-;45162:7;45158:1;45150:6;45146:14;45139:31;45022:155;:::o;45183:182::-;45323:34;45319:1;45311:6;45307:14;45300:58;45183:182;:::o;45371:171::-;45511:23;45507:1;45499:6;45495:14;45488:47;45371:171;:::o;45548:165::-;45688:17;45684:1;45676:6;45672:14;45665:41;45548:165;:::o;45719:161::-;45859:13;45855:1;45847:6;45843:14;45836:37;45719:161;:::o;45886:168::-;46026:20;46022:1;46014:6;46010:14;46003:44;45886:168;:::o;46060:163::-;46200:15;46196:1;46188:6;46184:14;46177:39;46060:163;:::o;46229:116::-;46313:1;46306:5;46303:12;46293:46;;46319:18;;:::i;:::-;46293:46;46229:116;:::o;46351:122::-;46424:24;46442:5;46424:24;:::i;:::-;46417:5;46414:35;46404:63;;46463:1;46460;46453:12;46404:63;46351:122;:::o;46479:116::-;46549:21;46564:5;46549:21;:::i;:::-;46542:5;46539:32;46529:60;;46585:1;46582;46575:12;46529:60;46479:116;:::o;46601:122::-;46674:24;46692:5;46674:24;:::i;:::-;46667:5;46664:35;46654:63;;46713:1;46710;46703:12;46654:63;46601:122;:::o;46729:120::-;46801:23;46818:5;46801:23;:::i;:::-;46794:5;46791:34;46781:62;;46839:1;46836;46829:12;46781:62;46729:120;:::o;46855:110::-;46939:1;46932:5;46929:12;46919:40;;46955:1;46952;46945:12;46919:40;46855:110;:::o;46971:122::-;47044:24;47062:5;47044:24;:::i;:::-;47037:5;47034:35;47024:63;;47083:1;47080;47073:12;47024:63;46971:122;:::o

Swarm Source

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