ETH Price: $3,314.44 (+1.68%)
Gas: 3 Gwei

Token

Cuddly kids (CKS)
 

Overview

Max Total Supply

777 CKS

Holders

228

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
halokitty.eth
Balance
1 CKS
0xfe0f5cb7aace0bf65c594036fdc84e7186bf92b6
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:
CuddlyCrypto

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-26
*/

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

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

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

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

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

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

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

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

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

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

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

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

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: contracts/cuddlyKids.sol


pragma solidity >=0.8.0 <0.9.0;
// ipfs://QmUNNn6iYjDDwX9MM8uKHc8o5ZM2RuNzHm5H84AGGB6nPf/






contract CuddlyCrypto is ERC721A, Ownable, ReentrancyGuard {
    using Strings for uint256;

    enum ContractMintState {
        PAUSED,
        PUBLIC,
        WHITELIST,
        ALLOWLIST,
        WHITELIST_B,
        ALLOWLIST_B
    }
    

    uint256 public maxSupply = 5555;
    uint256 public publicSupply = 5555;

    string public uriPrefix = "";
    string public hiddenMetadataUri =
        "ipfs://QmRtoGVkaRgk4NNy2DP672EV9hKNDiV2GEEFmjJSpwBHmq";

    uint256 public publicCost = 0.02 ether;
    uint256 public allowlistCost = 0.016 ether;
    uint256 public whitelistCost = 0.016 ether;
    constructor() ERC721A("Cuddly kids", "CKS") {}

    function setPublicCost(uint256 _cost) public onlyOwner {
        publicCost = _cost;
    }

    function setAllowlistCost(uint256 _cost) public onlyOwner {
        allowlistCost = _cost;
    }

    function setWhitelistCost(uint256 _cost) public onlyOwner {
        whitelistCost = _cost;                                                                  
    }


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

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

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

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

        return
            bytes(currentBaseURI).length > 0
                ? string(
                    abi.encodePacked(
                        currentBaseURI,
                        _tokenId.toString(),
                        ".json"
                    )
                )
                : hiddenMetadataUri;
    }

    modifier mintCompliance(uint256 _mintAmount, uint256 _limit) {
        require(
            _mintAmount > 0 && _mintAmount <= _limit,
            "Invalid mint amount"
        );
        require(
            totalSupply() + _mintAmount <= maxSupply,
            "Max supply exceeded"
        );
        _;
    }

    uint256 public publicMintLimit = 3;

    function setPublicMintLimit(uint256 _limit) public onlyOwner {
        publicMintLimit = _limit;
    }

    mapping(address => uint256) public publicMinted;

    function publicMint(uint256 amount)
        public
        payable
        mintCompliance(amount, publicMintLimit)
    {
        require(
            publicMinted[msg.sender] + amount <= publicMintLimit,
            "Can't mint that many"
        );
        require(state == ContractMintState.PUBLIC, "Public mint is disabled");
        require(totalSupply() + amount <= publicSupply, "Can't mint that many");
        require(msg.value >= publicCost * amount, "Insufficient funds");
        publicMinted[msg.sender] += amount;
        _safeMint(msg.sender, amount);
    }

    // allowlistMintLimit - section
    uint256 public allowlistMintLimit = 3;

    function setAllowlistMintLimit(uint256 _limit) public onlyOwner {
        allowlistMintLimit = _limit;
    }

    bytes32 private allowlistMerkleRoot =
        0xf5fd04e01134135b09451af2bb9438bc6cca789e6037969be43e6b52baadd91d;

    function setAllowlistMerkleRoot(bytes32 _root) public onlyOwner {
        allowlistMerkleRoot = _root;
    }

    mapping(address => uint256) public allowlistMinted;

    uint256 public whitelistMintLimit = 3;

    function setWhitelistMintLimit(uint256 _limit) public onlyOwner {
        whitelistMintLimit = _limit;
    }

    bytes32 public whitelistMerkleRoot =
        0xd5d0a7d496f2fd3c65af07cbb8fb3a5806c6541f4ef0b95a80eec376a42d4db7;

    function setWhitelistMerkleRoot(bytes32 _root) public onlyOwner {
        whitelistMerkleRoot = _root;
    }

    mapping(address => uint256) public whitelistMinted;

 
    function mintForAddress(uint256 amount, address _reciver) public onlyOwner {
        require(totalSupply() + amount <= maxSupply, "Max supply exceeded");
        _safeMint(_reciver, amount);
    }

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

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

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownerTokens = new uint256[](ownerTokenCount);
        uint256 ownerTokenIdx = 0;
        for (
            uint256 tokenIdx = _startTokenId();
            tokenIdx <= totalSupply();
            tokenIdx++
        ) {
            if (ownerOf(tokenIdx) == _owner) {
                ownerTokens[ownerTokenIdx] = tokenIdx;
                ownerTokenIdx++;
            }
        }
        return ownerTokens;
    }

    ContractMintState public state = ContractMintState.PAUSED;

    function setState(ContractMintState _state) public onlyOwner {
        state = _state;
    }

    function withdraw() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed");
    }
    
    function _leaf(address account, uint256 allowance)
        internal
        pure
        returns(bytes32)
    {
        return keccak256(abi.encodePacked(account, allowance));
    }

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

    function addressTx(uint256 allowance, uint256 num)public view returns(bytes32) {
        if(num == 3) {
            return keccak256(abi.encodePacked(allowance));
        }
        if(num == 4) {
            return keccak256(abi.encodePacked(msg.sender));
        }
       return keccak256(abi.encodePacked(msg.sender, allowance));
    }   

    function whitelistMerkleMint(
        uint256 amount,
        uint256 numToken,
        bytes32[] memory proof
    ) public payable {
        require(
            state == ContractMintState.WHITELIST,
            "whitelist mint disabled"
        );
        require(
            whitelistMinted[msg.sender] + amount <= whitelistMintLimit,
            "can't mint that many"
        );
        require(
            msg.sender != address(0),
             "address error"
        );
        bytes32 leaf = _leaf(msg.sender, numToken);
        require(
            _verify(leaf, proof, whitelistMerkleRoot),
            "Verification failed"
        );

        whitelistMinted[msg.sender] += amount;
        _safeMint(msg.sender, amount);
    }

    function allowlistMerkleMint(
        uint256 amount,
        uint256 numToken,
        bytes32[] memory proof
    )
        public payable
    {
        require(
            state == ContractMintState.ALLOWLIST,
            "allowlist mint disabled"
        );
        require(
            allowlistMinted[msg.sender] + amount <= allowlistMintLimit,
            "can't mint that many"
        );
        require(
            msg.sender != address(0),
             "address error"
        );
        bytes32 leaf = _leaf(msg.sender, numToken);
        require(
            _verify(leaf, proof, allowlistMerkleRoot),
            "Verification failed"
        );

        allowlistMinted[msg.sender] += amount;
        _safeMint(msg.sender, amount);
    }

    // B
    mapping(address => bool) internal isWhitelist;

    function checkWhitelist(address account) public view returns(bool) {
        require(state == ContractMintState.WHITELIST_B, "illegal");
        require(account != address(0), "address illegal");
        return isWhitelist[account];
    }

    function mintForWhiteList(uint256 amount)
        public
        payable
        mintCompliance(amount, whitelistMintLimit)
    {
        require(
            state == ContractMintState.WHITELIST_B,
            "Whitelist mint is disabled"
        );
        require(
            whitelistMinted[msg.sender] + amount <= whitelistMintLimit,
            "Can't mint that many"
        );
        require(isWhitelist[msg.sender], "Not whitelist");
        uint256 mintedNum = whitelistMinted[msg.sender];
        uint256 totalPrice;
        if (mintedNum > 0) {
            totalPrice = whitelistCost * amount;
        } else {
            totalPrice = whitelistCost * (amount - 1);
        }

        require(msg.value >= totalPrice, "value not eq");

        whitelistMinted[msg.sender] += amount;
        _safeMint(msg.sender, amount);
    }

    function setWhiteList(address[] memory _whitelistMenu)
        external
        onlyOwner
        nonReentrant
    {
        require(
            state == ContractMintState.WHITELIST_B,
            "allowlist mint is disabled"
        );
        uint256 idx = 0;
        for (idx; idx < _whitelistMenu.length; idx++) {
            if (_whitelistMenu[idx] != address(0)) {
                isWhitelist[_whitelistMenu[idx]] = true;
            }
        }
    }

    mapping(address => bool) internal isAllowlist;

    function checkAllowlist(address account) public view returns(bool) {
        require(state == ContractMintState.ALLOWLIST_B, "illegal");
        require(account != address(0), "address illegal");
        return isAllowlist[account];
    }

    function setAllowlist(address[] memory _allowlist)
        external
        onlyOwner
        nonReentrant
    {
        require(
            state == ContractMintState.ALLOWLIST_B,
            "allowlist mint is disabled"
        );
        uint256 idx = 0;
        for (idx; idx < _allowlist.length; idx++) {
            if (_allowlist[idx] != address(0)) {
                isAllowlist[_allowlist[idx]] = true;
            }
        }
    }

    function mintForAllowlist(uint256 amount)
        public
        payable
        mintCompliance(amount, allowlistMintLimit)
    {
        require(
            state == ContractMintState.ALLOWLIST_B,
            "Allowlist muint is disabled"
        );
        require(
            allowlistMinted[msg.sender] + amount <= allowlistMintLimit,
            "Can't mint that many"
        );
        require(isAllowlist[msg.sender], "not in allowlist");
        allowlistMinted[msg.sender] += amount;
        _safeMint(msg.sender, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"addressTx","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"numToken","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"allowlistMerkleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"allowlistMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowlistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"checkAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"checkWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_reciver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintForAllowlist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintForWhiteList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_mint","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":"publicCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_allowlist","type":"address[]"}],"name":"setAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setAllowlistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setAllowlistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setAllowlistMintLimit","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":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPublicCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setPublicMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum CuddlyCrypto.ContractMintState","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelistMenu","type":"address[]"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWhitelistCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWhitelistMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum CuddlyCrypto.ContractMintState","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"numToken","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMerkleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526115b3600a556115b3600b5560405180602001604052806000815250600c90816200003091906200053d565b5060405180606001604052806035815260200162005f6060359139600d90816200005b91906200053d565b5066470de4df820000600e556638d7ea4c680000600f556638d7ea4c680000601055600360115560036013557ff5fd04e01134135b09451af2bb9438bc6cca789e6037969be43e6b52baadd91d60001b60145560036016557fd5d0a7d496f2fd3c65af07cbb8fb3a5806c6541f4ef0b95a80eec376a42d4db760001b6017556000601960006101000a81548160ff0219169083600581111562000103576200010262000624565b5b02179055503480156200011557600080fd5b506040518060400160405280600b81526020017f437564646c79206b6964730000000000000000000000000000000000000000008152506040518060400160405280600381526020017f434b53000000000000000000000000000000000000000000000000000000000081525081600290816200019391906200053d565b508060039081620001a591906200053d565b50620001b6620001ec60201b60201c565b6000819055505050620001de620001d2620001f560201b60201c565b620001fd60201b60201c565b600160098190555062000653565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200034557607f821691505b6020821081036200035b576200035a620002fd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000386565b620003d1868362000386565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200041e620004186200041284620003e9565b620003f3565b620003e9565b9050919050565b6000819050919050565b6200043a83620003fd565b62000452620004498262000425565b84845462000393565b825550505050565b600090565b620004696200045a565b620004768184846200042f565b505050565b5b818110156200049e57620004926000826200045f565b6001810190506200047c565b5050565b601f821115620004ed57620004b78162000361565b620004c28462000376565b81016020851015620004d2578190505b620004ea620004e18562000376565b8301826200047b565b50505b505050565b600082821c905092915050565b60006200051260001984600802620004f2565b1980831691505092915050565b60006200052d8383620004ff565b9150826002028217905092915050565b6200054882620002c3565b67ffffffffffffffff811115620005645762000563620002ce565b5b6200057082546200032c565b6200057d828285620004a2565b600060209050601f831160018114620005b55760008415620005a0578287015190505b620005ac85826200051f565b8655506200061c565b601f198416620005c58662000361565b60005b82811015620005ef57848901518255600182019150602085019450602081019050620005c8565b868310156200060f57848901516200060b601f891682620004ff565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6158fd80620006636000396000f3fe6080604052600436106103765760003560e01c8063811d2437116101d1578063c10c678611610102578063e6780215116100a0578063ef3e067c1161006f578063ef3e067c14610c97578063efbd73f414610cc0578063f2fde38b14610ce9578063f95df41414610d1257610376565b8063e678021514610bd6578063e7b99ec714610bf2578063e81ed04414610c1d578063e985e9c514610c5a57610376565b8063d49479eb116100dc578063d49479eb14610b1a578063d5abeb0114610b43578063dc33e68114610b6e578063ddd1783a14610bab57610376565b8063c10c678614610a75578063c19d93fb14610ab2578063c87b56dd14610add57610376565b8063a254c2641161016f578063aa98e0c611610149578063aa98e0c6146109da578063b88d4fde14610a05578063bb485b8814610a21578063bd32fb6614610a4c57610376565b8063a254c2641461095d578063a45ba8e714610986578063a8658c97146109b157610376565b80638da5cb5b116101ab5780638da5cb5b146108a157806395d89b41146108cc57806398a8cffe146108f7578063a22cb4651461093457610376565b8063811d2437146108315780638693da201461085a5780638aeacefe1461088557610376565b806342842e0e116102ab578063612abd441161024957806370a082311161022357806370a082311461078b578063715018a6146107c8578063775b9c13146107df5780637ec4a6591461080857610376565b8063612abd44146106f857806362b99ad4146107235780636352211e1461074e57610376565b8063552b818b11610285578063552b818b1461065f57806356de96db146106885780635b813a6b146106b15780635e84d723146106cd57610376565b806342842e0e146105dd578063438b6300146105f95780634fdd43cb1461063657610376565b806323b872dd1161031857806331e71deb116102f257806331e71deb1461055657806335871c0e14610572578063381b965c1461059d5780633ccfd60b146105c657610376565b806323b872dd146104e157806327eb7099146104fd5780632db115441461053a57610376565b8063095ea7b311610354578063095ea7b3146104205780631015805b1461043c57806318160ddd146104795780631950c218146104a457610376565b806301ffc9a71461037b57806306fdde03146103b8578063081812fc146103e3575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190613c11565b610d3b565b6040516103af9190613c59565b60405180910390f35b3480156103c457600080fd5b506103cd610dcd565b6040516103da9190613d04565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613d5c565b610e5f565b6040516104179190613dca565b60405180910390f35b61043a60048036038101906104359190613e11565b610ede565b005b34801561044857600080fd5b50610463600480360381019061045e9190613e51565b611022565b6040516104709190613e8d565b60405180910390f35b34801561048557600080fd5b5061048e61103a565b60405161049b9190613e8d565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613e51565b611051565b6040516104d89190613c59565b60405180910390f35b6104fb60048036038101906104f69190613ea8565b61118c565b005b34801561050957600080fd5b50610524600480360381019061051f9190613e51565b6114ae565b6040516105319190613c59565b60405180910390f35b610554600480360381019061054f9190613d5c565b6115e8565b005b610570600480360381019061056b9190614079565b6118a3565b005b34801561057e57600080fd5b50610587611ad7565b6040516105949190613e8d565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613d5c565b611add565b005b3480156105d257600080fd5b506105db611aef565b005b6105f760048036038101906105f29190613ea8565b611bb6565b005b34801561060557600080fd5b50610620600480360381019061061b9190613e51565b611bd6565b60405161062d91906141a6565b60405180910390f35b34801561064257600080fd5b5061065d6004803603810190610658919061427d565b611cd7565b005b34801561066b57600080fd5b5061068660048036038101906106819190614389565b611cf2565b005b34801561069457600080fd5b506106af60048036038101906106aa91906143f7565b611e63565b005b6106cb60048036038101906106c69190613d5c565b611e98565b005b3480156106d957600080fd5b506106e2612137565b6040516106ef9190613e8d565b60405180910390f35b34801561070457600080fd5b5061070d61213d565b60405161071a9190613e8d565b60405180910390f35b34801561072f57600080fd5b50610738612143565b6040516107459190613d04565b60405180910390f35b34801561075a57600080fd5b5061077560048036038101906107709190613d5c565b6121d1565b6040516107829190613dca565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad9190613e51565b6121e3565b6040516107bf9190613e8d565b60405180910390f35b3480156107d457600080fd5b506107dd61229b565b005b3480156107eb57600080fd5b5061080660048036038101906108019190614389565b6122af565b005b34801561081457600080fd5b5061082f600480360381019061082a919061427d565b612421565b005b34801561083d57600080fd5b5061085860048036038101906108539190613d5c565b61243c565b005b34801561086657600080fd5b5061086f61244e565b60405161087c9190613e8d565b60405180910390f35b61089f600480360381019061089a9190613d5c565b612454565b005b3480156108ad57600080fd5b506108b66127b9565b6040516108c39190613dca565b60405180910390f35b3480156108d857600080fd5b506108e16127e3565b6040516108ee9190613d04565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190613e51565b612875565b60405161092b9190613e8d565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190614450565b61288d565b005b34801561096957600080fd5b50610984600480360381019061097f9190613d5c565b612998565b005b34801561099257600080fd5b5061099b6129aa565b6040516109a89190613d04565b60405180910390f35b3480156109bd57600080fd5b506109d860048036038101906109d39190613d5c565b612a38565b005b3480156109e657600080fd5b506109ef612a4a565b6040516109fc919061449f565b60405180910390f35b610a1f6004803603810190610a1a919061455b565b612a50565b005b348015610a2d57600080fd5b50610a36612ac3565b604051610a439190613e8d565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e91906145de565b612ac9565b005b348015610a8157600080fd5b50610a9c6004803603810190610a97919061460b565b612adb565b604051610aa9919061449f565b60405180910390f35b348015610abe57600080fd5b50610ac7612b7b565b604051610ad491906146c2565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff9190613d5c565b612b8e565b604051610b119190613d04565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c9190613d5c565b612cb0565b005b348015610b4f57600080fd5b50610b58612cc2565b604051610b659190613e8d565b60405180910390f35b348015610b7a57600080fd5b50610b956004803603810190610b909190613e51565b612cc8565b604051610ba29190613e8d565b60405180910390f35b348015610bb757600080fd5b50610bc0612cda565b604051610bcd9190613e8d565b60405180910390f35b610bf06004803603810190610beb9190614079565b612ce0565b005b348015610bfe57600080fd5b50610c07612f14565b604051610c149190613e8d565b60405180910390f35b348015610c2957600080fd5b50610c446004803603810190610c3f9190613e51565b612f1a565b604051610c519190613e8d565b60405180910390f35b348015610c6657600080fd5b50610c816004803603810190610c7c91906146dd565b612f32565b604051610c8e9190613c59565b60405180910390f35b348015610ca357600080fd5b50610cbe6004803603810190610cb99190613d5c565b612fc6565b005b348015610ccc57600080fd5b50610ce76004803603810190610ce2919061471d565b612fd8565b005b348015610cf557600080fd5b50610d106004803603810190610d0b9190613e51565b613045565b005b348015610d1e57600080fd5b50610d396004803603810190610d3491906145de565b6130c8565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d9657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610dc65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610ddc9061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e089061478c565b8015610e555780601f10610e2a57610100808354040283529160200191610e55565b820191906000526020600020905b815481529060010190602001808311610e3857829003601f168201915b5050505050905090565b6000610e6a826130da565b610ea0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ee9826121d1565b90508073ffffffffffffffffffffffffffffffffffffffff16610f0a613139565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d57610f3681610f31613139565b612f32565b610f6c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60126020528060005260406000206000915090505481565b6000611044613141565b6001546000540303905090565b6000600460058111156110675761106661464b565b5b601960009054906101000a900460ff1660058111156110895761108861464b565b5b146110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c090614809565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f90614875565b60405180910390fd5b601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006111978261314a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111fe576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061120a84613216565b91509150611220818761121b613139565b61323d565b61126c5761123586611230613139565b612f32565b61126b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036112d2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112df8686866001613281565b80156112ea57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506113b885611394888887613287565b7c0200000000000000000000000000000000000000000000000000000000176132af565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361143e576000600185019050600060046000838152602001908152602001600020540361143c57600054811461143b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a686868660016132da565b505050505050565b60006005808111156114c3576114c261464b565b5b601960009054906101000a900460ff1660058111156114e5576114e461464b565b5b14611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90614809565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90614875565b60405180910390fd5b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b806011546000821180156115fc5750808211155b61163b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611632906148e1565b60405180910390fd5b600a548261164761103a565b6116519190614930565b1115611692576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611689906149b0565b60405180910390fd5b60115483601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116e09190614930565b1115611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171890614a1c565b60405180910390fd5b600160058111156117355761173461464b565b5b601960009054906101000a900460ff1660058111156117575761175661464b565b5b14611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e90614a88565b60405180910390fd5b600b54836117a361103a565b6117ad9190614930565b11156117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590614a1c565b60405180910390fd5b82600e546117fc9190614aa8565b34101561183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590614b36565b60405180910390fd5b82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461188d9190614930565b9250508190555061189e33846132e0565b505050565b600360058111156118b7576118b661464b565b5b601960009054906101000a900460ff1660058111156118d9576118d861464b565b5b14611919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191090614ba2565b60405180910390fd5b60135483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119679190614930565b11156119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f90614c0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90614c7a565b60405180910390fd5b6000611a2333846132fe565b9050611a328183601454613331565b611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614ce6565b60405180910390fd5b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ac09190614930565b92505081905550611ad133856132e0565b50505050565b60135481565b611ae5613347565b8060168190555050565b611af7613347565b611aff6133c5565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611b2590614d37565b60006040518083038185875af1925050503d8060008114611b62576040519150601f19603f3d011682016040523d82523d6000602084013e611b67565b606091505b5050905080611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba290614d98565b60405180910390fd5b50611bb4613414565b565b611bd183838360405180602001604052806000815250612a50565b505050565b60606000611be3836121e3565b905060008167ffffffffffffffff811115611c0157611c00613f00565b5b604051908082528060200260200182016040528015611c2f5781602001602082028036833780820191505090505b509050600080611c3d613141565b90505b611c4861103a565b8111611ccb578573ffffffffffffffffffffffffffffffffffffffff16611c6e826121d1565b73ffffffffffffffffffffffffffffffffffffffff1603611cb85780838381518110611c9d57611c9c614db8565b5b6020026020010181815250508180611cb490614de7565b9250505b8080611cc390614de7565b915050611c40565b50819350505050919050565b611cdf613347565b80600d9081611cee9190614fdb565b5050565b611cfa613347565b611d026133c5565b600580811115611d1557611d1461464b565b5b601960009054906101000a900460ff166005811115611d3757611d3661464b565b5b14611d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6e906150f9565b60405180910390fd5b60005b8151811015611e5757600073ffffffffffffffffffffffffffffffffffffffff16828281518110611dae57611dad614db8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614611e44576001601b6000848481518110611dea57611de9614db8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080611e4f90614de7565b915050611d7a565b50611e60613414565b50565b611e6b613347565b80601960006101000a81548160ff02191690836005811115611e9057611e8f61464b565b5b021790555050565b80601354600082118015611eac5750808211155b611eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee2906148e1565b60405180910390fd5b600a5482611ef761103a565b611f019190614930565b1115611f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f39906149b0565b60405180910390fd5b600580811115611f5557611f5461464b565b5b601960009054906101000a900460ff166005811115611f7757611f7661464b565b5b14611fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fae90615165565b60405180910390fd5b60135483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120059190614930565b1115612046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203d90614a1c565b60405180910390fd5b601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c9906151d1565b60405180910390fd5b82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121219190614930565b9250508190555061213233846132e0565b505050565b600b5481565b600f5481565b600c80546121509061478c565b80601f016020809104026020016040519081016040528092919081815260200182805461217c9061478c565b80156121c95780601f1061219e576101008083540402835291602001916121c9565b820191906000526020600020905b8154815290600101906020018083116121ac57829003601f168201915b505050505081565b60006121dc8261314a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361224a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6122a3613347565b6122ad600061341e565b565b6122b7613347565b6122bf6133c5565b600460058111156122d3576122d261464b565b5b601960009054906101000a900460ff1660058111156122f5576122f461464b565b5b14612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c906150f9565b60405180910390fd5b60005b815181101561241557600073ffffffffffffffffffffffffffffffffffffffff1682828151811061236c5761236b614db8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614612402576001601a60008484815181106123a8576123a7614db8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b808061240d90614de7565b915050612338565b5061241e613414565b50565b612429613347565b80600c90816124389190614fdb565b5050565b612444613347565b80600e8190555050565b600e5481565b806016546000821180156124685750808211155b6124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e906148e1565b60405180910390fd5b600a54826124b361103a565b6124bd9190614930565b11156124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f5906149b0565b60405180910390fd5b600460058111156125125761251161464b565b5b601960009054906101000a900460ff1660058111156125345761253361464b565b5b14612574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256b9061523d565b60405180910390fd5b60165483601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125c29190614930565b1115612603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fa90614a1c565b60405180910390fd5b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661268f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612686906152a9565b60405180910390fd5b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211156126f257846010546126eb9190614aa8565b905061270f565b6001856126ff91906152c9565b60105461270c9190614aa8565b90505b80341015612752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274990615349565b60405180910390fd5b84601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127a19190614930565b925050819055506127b233866132e0565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546127f29061478c565b80601f016020809104026020016040519081016040528092919081815260200182805461281e9061478c565b801561286b5780601f106128405761010080835404028352916020019161286b565b820191906000526020600020905b81548152906001019060200180831161284e57829003601f168201915b5050505050905090565b60186020528060005260406000206000915090505481565b806007600061289a613139565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612947613139565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161298c9190613c59565b60405180910390a35050565b6129a0613347565b80600f8190555050565b600d80546129b79061478c565b80601f01602080910402602001604051908101604052809291908181526020018280546129e39061478c565b8015612a305780601f10612a0557610100808354040283529160200191612a30565b820191906000526020600020905b815481529060010190602001808311612a1357829003601f168201915b505050505081565b612a40613347565b8060138190555050565b60175481565b612a5b84848461118c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612abd57612a86848484846134e4565b612abc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60115481565b612ad1613347565b8060178190555050565b600060038203612b135782604051602001612af6919061538a565b604051602081830303815290604052805190602001209050612b75565b60048203612b495733604051602001612b2c91906153ed565b604051602081830303815290604052805190602001209050612b75565b3383604051602001612b5c929190615408565b6040516020818303038152906040528051906020012090505b92915050565b601960009054906101000a900460ff1681565b6060612b99826130da565b612bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcf906154a6565b60405180910390fd5b6000612be2613634565b90506000815111612c7d57600d8054612bfa9061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054612c269061478c565b8015612c735780601f10612c4857610100808354040283529160200191612c73565b820191906000526020600020905b815481529060010190602001808311612c5657829003601f168201915b5050505050612ca8565b80612c87846136c6565b604051602001612c9892919061554e565b6040516020818303038152906040525b915050919050565b612cb8613347565b8060108190555050565b600a5481565b6000612cd382613826565b9050919050565b60165481565b60026005811115612cf457612cf361464b565b5b601960009054906101000a900460ff166005811115612d1657612d1561464b565b5b14612d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4d906155c9565b60405180910390fd5b60165483601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612da49190614930565b1115612de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddc90614c0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b90614c7a565b60405180910390fd5b6000612e6033846132fe565b9050612e6f8183601754613331565b612eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea590614ce6565b60405180910390fd5b83601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612efd9190614930565b92505081905550612f0e33856132e0565b50505050565b60105481565b60156020528060005260406000206000915090505481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612fce613347565b8060118190555050565b612fe0613347565b600a5482612fec61103a565b612ff69190614930565b1115613037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302e906149b0565b60405180910390fd5b61304181836132e0565b5050565b61304d613347565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036130bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b39061565b565b60405180910390fd5b6130c58161341e565b50565b6130d0613347565b8060148190555050565b6000816130e5613141565b111580156130f4575060005482105b8015613132575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080613159613141565b116131df576000548110156131de5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036131dc575b600081036131d25760046000836001900393508381526020019081526020016000205490506131a8565b8092505050613211565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861329e86868461387d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6132fa828260405180602001604052806000815250613886565b5050565b60008282604051602001613313929190615408565b60405160208183030381529060405280519060200120905092915050565b600061333e838386613923565b90509392505050565b61334f61393a565b73ffffffffffffffffffffffffffffffffffffffff1661336d6127b9565b73ffffffffffffffffffffffffffffffffffffffff16146133c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ba906156c7565b60405180910390fd5b565b60026009540361340a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340190615733565b60405180910390fd5b6002600981905550565b6001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261350a613139565b8786866040518563ffffffff1660e01b815260040161352c94939291906157a8565b6020604051808303816000875af192505050801561356857506040513d601f19601f820116820180604052508101906135659190615809565b60015b6135e1573d8060008114613598576040519150601f19603f3d011682016040523d82523d6000602084013e61359d565b606091505b5060008151036135d9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546136439061478c565b80601f016020809104026020016040519081016040528092919081815260200182805461366f9061478c565b80156136bc5780601f10613691576101008083540402835291602001916136bc565b820191906000526020600020905b81548152906001019060200180831161369f57829003601f168201915b5050505050905090565b60606000820361370d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613821565b600082905060005b6000821461373f57808061372890614de7565b915050600a826137389190615865565b9150613715565b60008167ffffffffffffffff81111561375b5761375a613f00565b5b6040519080825280601f01601f19166020018201604052801561378d5781602001600182028036833780820191505090505b5090505b6000851461381a576001826137a691906152c9565b9150600a856137b59190615896565b60306137c19190614930565b60f81b8183815181106137d7576137d6614db8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138139190615865565b9450613791565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60009392505050565b6138908383613942565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461391e57600080549050600083820390505b6138d060008683806001019450866134e4565b613906576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138bd57816000541461391b57600080fd5b50505b505050565b6000826139308584613afd565b1490509392505050565b600033905090565b60008054905060008203613982576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398f6000848385613281565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613a06836139f76000866000613287565b613a0085613b53565b176132af565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613aa757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613a6c565b5060008203613ae2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613af860008483856132da565b505050565b60008082905060005b8451811015613b4857613b3382868381518110613b2657613b25614db8565b5b6020026020010151613b63565b91508080613b4090614de7565b915050613b06565b508091505092915050565b60006001821460e11b9050919050565b6000818310613b7b57613b768284613b8e565b613b86565b613b858383613b8e565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bee81613bb9565b8114613bf957600080fd5b50565b600081359050613c0b81613be5565b92915050565b600060208284031215613c2757613c26613baf565b5b6000613c3584828501613bfc565b91505092915050565b60008115159050919050565b613c5381613c3e565b82525050565b6000602082019050613c6e6000830184613c4a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cae578082015181840152602081019050613c93565b60008484015250505050565b6000601f19601f8301169050919050565b6000613cd682613c74565b613ce08185613c7f565b9350613cf0818560208601613c90565b613cf981613cba565b840191505092915050565b60006020820190508181036000830152613d1e8184613ccb565b905092915050565b6000819050919050565b613d3981613d26565b8114613d4457600080fd5b50565b600081359050613d5681613d30565b92915050565b600060208284031215613d7257613d71613baf565b5b6000613d8084828501613d47565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613db482613d89565b9050919050565b613dc481613da9565b82525050565b6000602082019050613ddf6000830184613dbb565b92915050565b613dee81613da9565b8114613df957600080fd5b50565b600081359050613e0b81613de5565b92915050565b60008060408385031215613e2857613e27613baf565b5b6000613e3685828601613dfc565b9250506020613e4785828601613d47565b9150509250929050565b600060208284031215613e6757613e66613baf565b5b6000613e7584828501613dfc565b91505092915050565b613e8781613d26565b82525050565b6000602082019050613ea26000830184613e7e565b92915050565b600080600060608486031215613ec157613ec0613baf565b5b6000613ecf86828701613dfc565b9350506020613ee086828701613dfc565b9250506040613ef186828701613d47565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f3882613cba565b810181811067ffffffffffffffff82111715613f5757613f56613f00565b5b80604052505050565b6000613f6a613ba5565b9050613f768282613f2f565b919050565b600067ffffffffffffffff821115613f9657613f95613f00565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613fbf81613fac565b8114613fca57600080fd5b50565b600081359050613fdc81613fb6565b92915050565b6000613ff5613ff084613f7b565b613f60565b9050808382526020820190506020840283018581111561401857614017613fa7565b5b835b81811015614041578061402d8882613fcd565b84526020840193505060208101905061401a565b5050509392505050565b600082601f8301126140605761405f613efb565b5b8135614070848260208601613fe2565b91505092915050565b60008060006060848603121561409257614091613baf565b5b60006140a086828701613d47565b93505060206140b186828701613d47565b925050604084013567ffffffffffffffff8111156140d2576140d1613bb4565b5b6140de8682870161404b565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61411d81613d26565b82525050565b600061412f8383614114565b60208301905092915050565b6000602082019050919050565b6000614153826140e8565b61415d81856140f3565b935061416883614104565b8060005b838110156141995781516141808882614123565b975061418b8361413b565b92505060018101905061416c565b5085935050505092915050565b600060208201905081810360008301526141c08184614148565b905092915050565b600080fd5b600067ffffffffffffffff8211156141e8576141e7613f00565b5b6141f182613cba565b9050602081019050919050565b82818337600083830152505050565b600061422061421b846141cd565b613f60565b90508281526020810184848401111561423c5761423b6141c8565b5b6142478482856141fe565b509392505050565b600082601f83011261426457614263613efb565b5b813561427484826020860161420d565b91505092915050565b60006020828403121561429357614292613baf565b5b600082013567ffffffffffffffff8111156142b1576142b0613bb4565b5b6142bd8482850161424f565b91505092915050565b600067ffffffffffffffff8211156142e1576142e0613f00565b5b602082029050602081019050919050565b6000614305614300846142c6565b613f60565b9050808382526020820190506020840283018581111561432857614327613fa7565b5b835b81811015614351578061433d8882613dfc565b84526020840193505060208101905061432a565b5050509392505050565b600082601f8301126143705761436f613efb565b5b81356143808482602086016142f2565b91505092915050565b60006020828403121561439f5761439e613baf565b5b600082013567ffffffffffffffff8111156143bd576143bc613bb4565b5b6143c98482850161435b565b91505092915050565b600681106143df57600080fd5b50565b6000813590506143f1816143d2565b92915050565b60006020828403121561440d5761440c613baf565b5b600061441b848285016143e2565b91505092915050565b61442d81613c3e565b811461443857600080fd5b50565b60008135905061444a81614424565b92915050565b6000806040838503121561446757614466613baf565b5b600061447585828601613dfc565b92505060206144868582860161443b565b9150509250929050565b61449981613fac565b82525050565b60006020820190506144b46000830184614490565b92915050565b600067ffffffffffffffff8211156144d5576144d4613f00565b5b6144de82613cba565b9050602081019050919050565b60006144fe6144f9846144ba565b613f60565b90508281526020810184848401111561451a576145196141c8565b5b6145258482856141fe565b509392505050565b600082601f83011261454257614541613efb565b5b81356145528482602086016144eb565b91505092915050565b6000806000806080858703121561457557614574613baf565b5b600061458387828801613dfc565b945050602061459487828801613dfc565b93505060406145a587828801613d47565b925050606085013567ffffffffffffffff8111156145c6576145c5613bb4565b5b6145d28782880161452d565b91505092959194509250565b6000602082840312156145f4576145f3613baf565b5b600061460284828501613fcd565b91505092915050565b6000806040838503121561462257614621613baf565b5b600061463085828601613d47565b925050602061464185828601613d47565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061468b5761468a61464b565b5b50565b600081905061469c8261467a565b919050565b60006146ac8261468e565b9050919050565b6146bc816146a1565b82525050565b60006020820190506146d760008301846146b3565b92915050565b600080604083850312156146f4576146f3613baf565b5b600061470285828601613dfc565b925050602061471385828601613dfc565b9150509250929050565b6000806040838503121561473457614733613baf565b5b600061474285828601613d47565b925050602061475385828601613dfc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147a457607f821691505b6020821081036147b7576147b661475d565b5b50919050565b7f696c6c6567616c00000000000000000000000000000000000000000000000000600082015250565b60006147f3600783613c7f565b91506147fe826147bd565b602082019050919050565b60006020820190508181036000830152614822816147e6565b9050919050565b7f6164647265737320696c6c6567616c0000000000000000000000000000000000600082015250565b600061485f600f83613c7f565b915061486a82614829565b602082019050919050565b6000602082019050818103600083015261488e81614852565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b60006148cb601383613c7f565b91506148d682614895565b602082019050919050565b600060208201905081810360008301526148fa816148be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061493b82613d26565b915061494683613d26565b925082820190508082111561495e5761495d614901565b5b92915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600061499a601383613c7f565b91506149a582614964565b602082019050919050565b600060208201905081810360008301526149c98161498d565b9050919050565b7f43616e2774206d696e742074686174206d616e79000000000000000000000000600082015250565b6000614a06601483613c7f565b9150614a11826149d0565b602082019050919050565b60006020820190508181036000830152614a35816149f9565b9050919050565b7f5075626c6963206d696e742069732064697361626c6564000000000000000000600082015250565b6000614a72601783613c7f565b9150614a7d82614a3c565b602082019050919050565b60006020820190508181036000830152614aa181614a65565b9050919050565b6000614ab382613d26565b9150614abe83613d26565b9250828202614acc81613d26565b91508282048414831517614ae357614ae2614901565b5b5092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614b20601283613c7f565b9150614b2b82614aea565b602082019050919050565b60006020820190508181036000830152614b4f81614b13565b9050919050565b7f616c6c6f776c697374206d696e742064697361626c6564000000000000000000600082015250565b6000614b8c601783613c7f565b9150614b9782614b56565b602082019050919050565b60006020820190508181036000830152614bbb81614b7f565b9050919050565b7f63616e2774206d696e742074686174206d616e79000000000000000000000000600082015250565b6000614bf8601483613c7f565b9150614c0382614bc2565b602082019050919050565b60006020820190508181036000830152614c2781614beb565b9050919050565b7f61646472657373206572726f7200000000000000000000000000000000000000600082015250565b6000614c64600d83613c7f565b9150614c6f82614c2e565b602082019050919050565b60006020820190508181036000830152614c9381614c57565b9050919050565b7f566572696669636174696f6e206661696c656400000000000000000000000000600082015250565b6000614cd0601383613c7f565b9150614cdb82614c9a565b602082019050919050565b60006020820190508181036000830152614cff81614cc3565b9050919050565b600081905092915050565b50565b6000614d21600083614d06565b9150614d2c82614d11565b600082019050919050565b6000614d4282614d14565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614d82600f83613c7f565b9150614d8d82614d4c565b602082019050919050565b60006020820190508181036000830152614db181614d75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614df282613d26565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e2457614e23614901565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614e917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e54565b614e9b8683614e54565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ed8614ed3614ece84613d26565b614eb3565b613d26565b9050919050565b6000819050919050565b614ef283614ebd565b614f06614efe82614edf565b848454614e61565b825550505050565b600090565b614f1b614f0e565b614f26818484614ee9565b505050565b5b81811015614f4a57614f3f600082614f13565b600181019050614f2c565b5050565b601f821115614f8f57614f6081614e2f565b614f6984614e44565b81016020851015614f78578190505b614f8c614f8485614e44565b830182614f2b565b50505b505050565b600082821c905092915050565b6000614fb260001984600802614f94565b1980831691505092915050565b6000614fcb8383614fa1565b9150826002028217905092915050565b614fe482613c74565b67ffffffffffffffff811115614ffd57614ffc613f00565b5b615007825461478c565b615012828285614f4e565b600060209050601f8311600181146150455760008415615033578287015190505b61503d8582614fbf565b8655506150a5565b601f19841661505386614e2f565b60005b8281101561507b57848901518255600182019150602085019450602081019050615056565b868310156150985784890151615094601f891682614fa1565b8355505b6001600288020188555050505b505050505050565b7f616c6c6f776c697374206d696e742069732064697361626c6564000000000000600082015250565b60006150e3601a83613c7f565b91506150ee826150ad565b602082019050919050565b60006020820190508181036000830152615112816150d6565b9050919050565b7f416c6c6f776c697374206d75696e742069732064697361626c65640000000000600082015250565b600061514f601b83613c7f565b915061515a82615119565b602082019050919050565b6000602082019050818103600083015261517e81615142565b9050919050565b7f6e6f7420696e20616c6c6f776c69737400000000000000000000000000000000600082015250565b60006151bb601083613c7f565b91506151c682615185565b602082019050919050565b600060208201905081810360008301526151ea816151ae565b9050919050565b7f57686974656c697374206d696e742069732064697361626c6564000000000000600082015250565b6000615227601a83613c7f565b9150615232826151f1565b602082019050919050565b600060208201905081810360008301526152568161521a565b9050919050565b7f4e6f742077686974656c69737400000000000000000000000000000000000000600082015250565b6000615293600d83613c7f565b915061529e8261525d565b602082019050919050565b600060208201905081810360008301526152c281615286565b9050919050565b60006152d482613d26565b91506152df83613d26565b92508282039050818111156152f7576152f6614901565b5b92915050565b7f76616c7565206e6f742065710000000000000000000000000000000000000000600082015250565b6000615333600c83613c7f565b915061533e826152fd565b602082019050919050565b6000602082019050818103600083015261536281615326565b9050919050565b6000819050919050565b61538461537f82613d26565b615369565b82525050565b60006153968284615373565b60208201915081905092915050565b60008160601b9050919050565b60006153bd826153a5565b9050919050565b60006153cf826153b2565b9050919050565b6153e76153e282613da9565b6153c4565b82525050565b60006153f982846153d6565b60148201915081905092915050565b600061541482856153d6565b6014820191506154248284615373565b6020820191508190509392505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615490602f83613c7f565b915061549b82615434565b604082019050919050565b600060208201905081810360008301526154bf81615483565b9050919050565b600081905092915050565b60006154dc82613c74565b6154e681856154c6565b93506154f6818560208601613c90565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006155386005836154c6565b915061554382615502565b600582019050919050565b600061555a82856154d1565b915061556682846154d1565b91506155718261552b565b91508190509392505050565b7f77686974656c697374206d696e742064697361626c6564000000000000000000600082015250565b60006155b3601783613c7f565b91506155be8261557d565b602082019050919050565b600060208201905081810360008301526155e2816155a6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615645602683613c7f565b9150615650826155e9565b604082019050919050565b6000602082019050818103600083015261567481615638565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156b1602083613c7f565b91506156bc8261567b565b602082019050919050565b600060208201905081810360008301526156e0816156a4565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061571d601f83613c7f565b9150615728826156e7565b602082019050919050565b6000602082019050818103600083015261574c81615710565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061577a82615753565b615784818561575e565b9350615794818560208601613c90565b61579d81613cba565b840191505092915050565b60006080820190506157bd6000830187613dbb565b6157ca6020830186613dbb565b6157d76040830185613e7e565b81810360608301526157e9818461576f565b905095945050505050565b60008151905061580381613be5565b92915050565b60006020828403121561581f5761581e613baf565b5b600061582d848285016157f4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061587082613d26565b915061587b83613d26565b92508261588b5761588a615836565b5b828204905092915050565b60006158a182613d26565b91506158ac83613d26565b9250826158bc576158bb615836565b5b82820690509291505056fea26469706673582212203ddfc6742a2e36af6b6f8834f203f9666e0f47a55c4af0f7722116edac660b8e64736f6c63430008110033697066733a2f2f516d52746f47566b6152676b344e4e79324450363732455639684b4e44695632474545466d6a4a53707742486d71

Deployed Bytecode

0x6080604052600436106103765760003560e01c8063811d2437116101d1578063c10c678611610102578063e6780215116100a0578063ef3e067c1161006f578063ef3e067c14610c97578063efbd73f414610cc0578063f2fde38b14610ce9578063f95df41414610d1257610376565b8063e678021514610bd6578063e7b99ec714610bf2578063e81ed04414610c1d578063e985e9c514610c5a57610376565b8063d49479eb116100dc578063d49479eb14610b1a578063d5abeb0114610b43578063dc33e68114610b6e578063ddd1783a14610bab57610376565b8063c10c678614610a75578063c19d93fb14610ab2578063c87b56dd14610add57610376565b8063a254c2641161016f578063aa98e0c611610149578063aa98e0c6146109da578063b88d4fde14610a05578063bb485b8814610a21578063bd32fb6614610a4c57610376565b8063a254c2641461095d578063a45ba8e714610986578063a8658c97146109b157610376565b80638da5cb5b116101ab5780638da5cb5b146108a157806395d89b41146108cc57806398a8cffe146108f7578063a22cb4651461093457610376565b8063811d2437146108315780638693da201461085a5780638aeacefe1461088557610376565b806342842e0e116102ab578063612abd441161024957806370a082311161022357806370a082311461078b578063715018a6146107c8578063775b9c13146107df5780637ec4a6591461080857610376565b8063612abd44146106f857806362b99ad4146107235780636352211e1461074e57610376565b8063552b818b11610285578063552b818b1461065f57806356de96db146106885780635b813a6b146106b15780635e84d723146106cd57610376565b806342842e0e146105dd578063438b6300146105f95780634fdd43cb1461063657610376565b806323b872dd1161031857806331e71deb116102f257806331e71deb1461055657806335871c0e14610572578063381b965c1461059d5780633ccfd60b146105c657610376565b806323b872dd146104e157806327eb7099146104fd5780632db115441461053a57610376565b8063095ea7b311610354578063095ea7b3146104205780631015805b1461043c57806318160ddd146104795780631950c218146104a457610376565b806301ffc9a71461037b57806306fdde03146103b8578063081812fc146103e3575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190613c11565b610d3b565b6040516103af9190613c59565b60405180910390f35b3480156103c457600080fd5b506103cd610dcd565b6040516103da9190613d04565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613d5c565b610e5f565b6040516104179190613dca565b60405180910390f35b61043a60048036038101906104359190613e11565b610ede565b005b34801561044857600080fd5b50610463600480360381019061045e9190613e51565b611022565b6040516104709190613e8d565b60405180910390f35b34801561048557600080fd5b5061048e61103a565b60405161049b9190613e8d565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c69190613e51565b611051565b6040516104d89190613c59565b60405180910390f35b6104fb60048036038101906104f69190613ea8565b61118c565b005b34801561050957600080fd5b50610524600480360381019061051f9190613e51565b6114ae565b6040516105319190613c59565b60405180910390f35b610554600480360381019061054f9190613d5c565b6115e8565b005b610570600480360381019061056b9190614079565b6118a3565b005b34801561057e57600080fd5b50610587611ad7565b6040516105949190613e8d565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613d5c565b611add565b005b3480156105d257600080fd5b506105db611aef565b005b6105f760048036038101906105f29190613ea8565b611bb6565b005b34801561060557600080fd5b50610620600480360381019061061b9190613e51565b611bd6565b60405161062d91906141a6565b60405180910390f35b34801561064257600080fd5b5061065d6004803603810190610658919061427d565b611cd7565b005b34801561066b57600080fd5b5061068660048036038101906106819190614389565b611cf2565b005b34801561069457600080fd5b506106af60048036038101906106aa91906143f7565b611e63565b005b6106cb60048036038101906106c69190613d5c565b611e98565b005b3480156106d957600080fd5b506106e2612137565b6040516106ef9190613e8d565b60405180910390f35b34801561070457600080fd5b5061070d61213d565b60405161071a9190613e8d565b60405180910390f35b34801561072f57600080fd5b50610738612143565b6040516107459190613d04565b60405180910390f35b34801561075a57600080fd5b5061077560048036038101906107709190613d5c565b6121d1565b6040516107829190613dca565b60405180910390f35b34801561079757600080fd5b506107b260048036038101906107ad9190613e51565b6121e3565b6040516107bf9190613e8d565b60405180910390f35b3480156107d457600080fd5b506107dd61229b565b005b3480156107eb57600080fd5b5061080660048036038101906108019190614389565b6122af565b005b34801561081457600080fd5b5061082f600480360381019061082a919061427d565b612421565b005b34801561083d57600080fd5b5061085860048036038101906108539190613d5c565b61243c565b005b34801561086657600080fd5b5061086f61244e565b60405161087c9190613e8d565b60405180910390f35b61089f600480360381019061089a9190613d5c565b612454565b005b3480156108ad57600080fd5b506108b66127b9565b6040516108c39190613dca565b60405180910390f35b3480156108d857600080fd5b506108e16127e3565b6040516108ee9190613d04565b60405180910390f35b34801561090357600080fd5b5061091e60048036038101906109199190613e51565b612875565b60405161092b9190613e8d565b60405180910390f35b34801561094057600080fd5b5061095b60048036038101906109569190614450565b61288d565b005b34801561096957600080fd5b50610984600480360381019061097f9190613d5c565b612998565b005b34801561099257600080fd5b5061099b6129aa565b6040516109a89190613d04565b60405180910390f35b3480156109bd57600080fd5b506109d860048036038101906109d39190613d5c565b612a38565b005b3480156109e657600080fd5b506109ef612a4a565b6040516109fc919061449f565b60405180910390f35b610a1f6004803603810190610a1a919061455b565b612a50565b005b348015610a2d57600080fd5b50610a36612ac3565b604051610a439190613e8d565b60405180910390f35b348015610a5857600080fd5b50610a736004803603810190610a6e91906145de565b612ac9565b005b348015610a8157600080fd5b50610a9c6004803603810190610a97919061460b565b612adb565b604051610aa9919061449f565b60405180910390f35b348015610abe57600080fd5b50610ac7612b7b565b604051610ad491906146c2565b60405180910390f35b348015610ae957600080fd5b50610b046004803603810190610aff9190613d5c565b612b8e565b604051610b119190613d04565b60405180910390f35b348015610b2657600080fd5b50610b416004803603810190610b3c9190613d5c565b612cb0565b005b348015610b4f57600080fd5b50610b58612cc2565b604051610b659190613e8d565b60405180910390f35b348015610b7a57600080fd5b50610b956004803603810190610b909190613e51565b612cc8565b604051610ba29190613e8d565b60405180910390f35b348015610bb757600080fd5b50610bc0612cda565b604051610bcd9190613e8d565b60405180910390f35b610bf06004803603810190610beb9190614079565b612ce0565b005b348015610bfe57600080fd5b50610c07612f14565b604051610c149190613e8d565b60405180910390f35b348015610c2957600080fd5b50610c446004803603810190610c3f9190613e51565b612f1a565b604051610c519190613e8d565b60405180910390f35b348015610c6657600080fd5b50610c816004803603810190610c7c91906146dd565b612f32565b604051610c8e9190613c59565b60405180910390f35b348015610ca357600080fd5b50610cbe6004803603810190610cb99190613d5c565b612fc6565b005b348015610ccc57600080fd5b50610ce76004803603810190610ce2919061471d565b612fd8565b005b348015610cf557600080fd5b50610d106004803603810190610d0b9190613e51565b613045565b005b348015610d1e57600080fd5b50610d396004803603810190610d3491906145de565b6130c8565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d9657506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610dc65750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610ddc9061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054610e089061478c565b8015610e555780601f10610e2a57610100808354040283529160200191610e55565b820191906000526020600020905b815481529060010190602001808311610e3857829003601f168201915b5050505050905090565b6000610e6a826130da565b610ea0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ee9826121d1565b90508073ffffffffffffffffffffffffffffffffffffffff16610f0a613139565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d57610f3681610f31613139565b612f32565b610f6c576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60126020528060005260406000206000915090505481565b6000611044613141565b6001546000540303905090565b6000600460058111156110675761106661464b565b5b601960009054906101000a900460ff1660058111156110895761108861464b565b5b146110c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c090614809565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f90614875565b60405180910390fd5b601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60006111978261314a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111fe576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061120a84613216565b91509150611220818761121b613139565b61323d565b61126c5761123586611230613139565b612f32565b61126b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036112d2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112df8686866001613281565b80156112ea57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506113b885611394888887613287565b7c0200000000000000000000000000000000000000000000000000000000176132af565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084160361143e576000600185019050600060046000838152602001908152602001600020540361143c57600054811461143b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46114a686868660016132da565b505050505050565b60006005808111156114c3576114c261464b565b5b601960009054906101000a900460ff1660058111156114e5576114e461464b565b5b14611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90614809565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611594576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158b90614875565b60405180910390fd5b601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b806011546000821180156115fc5750808211155b61163b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611632906148e1565b60405180910390fd5b600a548261164761103a565b6116519190614930565b1115611692576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611689906149b0565b60405180910390fd5b60115483601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116e09190614930565b1115611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171890614a1c565b60405180910390fd5b600160058111156117355761173461464b565b5b601960009054906101000a900460ff1660058111156117575761175661464b565b5b14611797576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178e90614a88565b60405180910390fd5b600b54836117a361103a565b6117ad9190614930565b11156117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590614a1c565b60405180910390fd5b82600e546117fc9190614aa8565b34101561183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590614b36565b60405180910390fd5b82601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461188d9190614930565b9250508190555061189e33846132e0565b505050565b600360058111156118b7576118b661464b565b5b601960009054906101000a900460ff1660058111156118d9576118d861464b565b5b14611919576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191090614ba2565b60405180910390fd5b60135483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119679190614930565b11156119a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199f90614c0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90614c7a565b60405180910390fd5b6000611a2333846132fe565b9050611a328183601454613331565b611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614ce6565b60405180910390fd5b83601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ac09190614930565b92505081905550611ad133856132e0565b50505050565b60135481565b611ae5613347565b8060168190555050565b611af7613347565b611aff6133c5565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051611b2590614d37565b60006040518083038185875af1925050503d8060008114611b62576040519150601f19603f3d011682016040523d82523d6000602084013e611b67565b606091505b5050905080611bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba290614d98565b60405180910390fd5b50611bb4613414565b565b611bd183838360405180602001604052806000815250612a50565b505050565b60606000611be3836121e3565b905060008167ffffffffffffffff811115611c0157611c00613f00565b5b604051908082528060200260200182016040528015611c2f5781602001602082028036833780820191505090505b509050600080611c3d613141565b90505b611c4861103a565b8111611ccb578573ffffffffffffffffffffffffffffffffffffffff16611c6e826121d1565b73ffffffffffffffffffffffffffffffffffffffff1603611cb85780838381518110611c9d57611c9c614db8565b5b6020026020010181815250508180611cb490614de7565b9250505b8080611cc390614de7565b915050611c40565b50819350505050919050565b611cdf613347565b80600d9081611cee9190614fdb565b5050565b611cfa613347565b611d026133c5565b600580811115611d1557611d1461464b565b5b601960009054906101000a900460ff166005811115611d3757611d3661464b565b5b14611d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6e906150f9565b60405180910390fd5b60005b8151811015611e5757600073ffffffffffffffffffffffffffffffffffffffff16828281518110611dae57611dad614db8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614611e44576001601b6000848481518110611dea57611de9614db8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b8080611e4f90614de7565b915050611d7a565b50611e60613414565b50565b611e6b613347565b80601960006101000a81548160ff02191690836005811115611e9057611e8f61464b565b5b021790555050565b80601354600082118015611eac5750808211155b611eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee2906148e1565b60405180910390fd5b600a5482611ef761103a565b611f019190614930565b1115611f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f39906149b0565b60405180910390fd5b600580811115611f5557611f5461464b565b5b601960009054906101000a900460ff166005811115611f7757611f7661464b565b5b14611fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fae90615165565b60405180910390fd5b60135483601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120059190614930565b1115612046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203d90614a1c565b60405180910390fd5b601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c9906151d1565b60405180910390fd5b82601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121219190614930565b9250508190555061213233846132e0565b505050565b600b5481565b600f5481565b600c80546121509061478c565b80601f016020809104026020016040519081016040528092919081815260200182805461217c9061478c565b80156121c95780601f1061219e576101008083540402835291602001916121c9565b820191906000526020600020905b8154815290600101906020018083116121ac57829003601f168201915b505050505081565b60006121dc8261314a565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361224a576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6122a3613347565b6122ad600061341e565b565b6122b7613347565b6122bf6133c5565b600460058111156122d3576122d261464b565b5b601960009054906101000a900460ff1660058111156122f5576122f461464b565b5b14612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c906150f9565b60405180910390fd5b60005b815181101561241557600073ffffffffffffffffffffffffffffffffffffffff1682828151811061236c5761236b614db8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614612402576001601a60008484815181106123a8576123a7614db8565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b808061240d90614de7565b915050612338565b5061241e613414565b50565b612429613347565b80600c90816124389190614fdb565b5050565b612444613347565b80600e8190555050565b600e5481565b806016546000821180156124685750808211155b6124a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249e906148e1565b60405180910390fd5b600a54826124b361103a565b6124bd9190614930565b11156124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f5906149b0565b60405180910390fd5b600460058111156125125761251161464b565b5b601960009054906101000a900460ff1660058111156125345761253361464b565b5b14612574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256b9061523d565b60405180910390fd5b60165483601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546125c29190614930565b1115612603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fa90614a1c565b60405180910390fd5b601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661268f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612686906152a9565b60405180910390fd5b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000808211156126f257846010546126eb9190614aa8565b905061270f565b6001856126ff91906152c9565b60105461270c9190614aa8565b90505b80341015612752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274990615349565b60405180910390fd5b84601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127a19190614930565b925050819055506127b233866132e0565b5050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546127f29061478c565b80601f016020809104026020016040519081016040528092919081815260200182805461281e9061478c565b801561286b5780601f106128405761010080835404028352916020019161286b565b820191906000526020600020905b81548152906001019060200180831161284e57829003601f168201915b5050505050905090565b60186020528060005260406000206000915090505481565b806007600061289a613139565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612947613139565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161298c9190613c59565b60405180910390a35050565b6129a0613347565b80600f8190555050565b600d80546129b79061478c565b80601f01602080910402602001604051908101604052809291908181526020018280546129e39061478c565b8015612a305780601f10612a0557610100808354040283529160200191612a30565b820191906000526020600020905b815481529060010190602001808311612a1357829003601f168201915b505050505081565b612a40613347565b8060138190555050565b60175481565b612a5b84848461118c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612abd57612a86848484846134e4565b612abc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60115481565b612ad1613347565b8060178190555050565b600060038203612b135782604051602001612af6919061538a565b604051602081830303815290604052805190602001209050612b75565b60048203612b495733604051602001612b2c91906153ed565b604051602081830303815290604052805190602001209050612b75565b3383604051602001612b5c929190615408565b6040516020818303038152906040528051906020012090505b92915050565b601960009054906101000a900460ff1681565b6060612b99826130da565b612bd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcf906154a6565b60405180910390fd5b6000612be2613634565b90506000815111612c7d57600d8054612bfa9061478c565b80601f0160208091040260200160405190810160405280929190818152602001828054612c269061478c565b8015612c735780601f10612c4857610100808354040283529160200191612c73565b820191906000526020600020905b815481529060010190602001808311612c5657829003601f168201915b5050505050612ca8565b80612c87846136c6565b604051602001612c9892919061554e565b6040516020818303038152906040525b915050919050565b612cb8613347565b8060108190555050565b600a5481565b6000612cd382613826565b9050919050565b60165481565b60026005811115612cf457612cf361464b565b5b601960009054906101000a900460ff166005811115612d1657612d1561464b565b5b14612d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4d906155c9565b60405180910390fd5b60165483601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612da49190614930565b1115612de5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddc90614c0e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b90614c7a565b60405180910390fd5b6000612e6033846132fe565b9050612e6f8183601754613331565b612eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea590614ce6565b60405180910390fd5b83601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612efd9190614930565b92505081905550612f0e33856132e0565b50505050565b60105481565b60156020528060005260406000206000915090505481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612fce613347565b8060118190555050565b612fe0613347565b600a5482612fec61103a565b612ff69190614930565b1115613037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302e906149b0565b60405180910390fd5b61304181836132e0565b5050565b61304d613347565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036130bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b39061565b565b60405180910390fd5b6130c58161341e565b50565b6130d0613347565b8060148190555050565b6000816130e5613141565b111580156130f4575060005482105b8015613132575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080613159613141565b116131df576000548110156131de5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036131dc575b600081036131d25760046000836001900393508381526020019081526020016000205490506131a8565b8092505050613211565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861329e86868461387d565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6132fa828260405180602001604052806000815250613886565b5050565b60008282604051602001613313929190615408565b60405160208183030381529060405280519060200120905092915050565b600061333e838386613923565b90509392505050565b61334f61393a565b73ffffffffffffffffffffffffffffffffffffffff1661336d6127b9565b73ffffffffffffffffffffffffffffffffffffffff16146133c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ba906156c7565b60405180910390fd5b565b60026009540361340a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340190615733565b60405180910390fd5b6002600981905550565b6001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261350a613139565b8786866040518563ffffffff1660e01b815260040161352c94939291906157a8565b6020604051808303816000875af192505050801561356857506040513d601f19601f820116820180604052508101906135659190615809565b60015b6135e1573d8060008114613598576040519150601f19603f3d011682016040523d82523d6000602084013e61359d565b606091505b5060008151036135d9576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600c80546136439061478c565b80601f016020809104026020016040519081016040528092919081815260200182805461366f9061478c565b80156136bc5780601f10613691576101008083540402835291602001916136bc565b820191906000526020600020905b81548152906001019060200180831161369f57829003601f168201915b5050505050905090565b60606000820361370d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613821565b600082905060005b6000821461373f57808061372890614de7565b915050600a826137389190615865565b9150613715565b60008167ffffffffffffffff81111561375b5761375a613f00565b5b6040519080825280601f01601f19166020018201604052801561378d5781602001600182028036833780820191505090505b5090505b6000851461381a576001826137a691906152c9565b9150600a856137b59190615896565b60306137c19190614930565b60f81b8183815181106137d7576137d6614db8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138139190615865565b9450613791565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60009392505050565b6138908383613942565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461391e57600080549050600083820390505b6138d060008683806001019450866134e4565b613906576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138bd57816000541461391b57600080fd5b50505b505050565b6000826139308584613afd565b1490509392505050565b600033905090565b60008054905060008203613982576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61398f6000848385613281565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613a06836139f76000866000613287565b613a0085613b53565b176132af565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613aa757808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613a6c565b5060008203613ae2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613af860008483856132da565b505050565b60008082905060005b8451811015613b4857613b3382868381518110613b2657613b25614db8565b5b6020026020010151613b63565b91508080613b4090614de7565b915050613b06565b508091505092915050565b60006001821460e11b9050919050565b6000818310613b7b57613b768284613b8e565b613b86565b613b858383613b8e565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bee81613bb9565b8114613bf957600080fd5b50565b600081359050613c0b81613be5565b92915050565b600060208284031215613c2757613c26613baf565b5b6000613c3584828501613bfc565b91505092915050565b60008115159050919050565b613c5381613c3e565b82525050565b6000602082019050613c6e6000830184613c4a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613cae578082015181840152602081019050613c93565b60008484015250505050565b6000601f19601f8301169050919050565b6000613cd682613c74565b613ce08185613c7f565b9350613cf0818560208601613c90565b613cf981613cba565b840191505092915050565b60006020820190508181036000830152613d1e8184613ccb565b905092915050565b6000819050919050565b613d3981613d26565b8114613d4457600080fd5b50565b600081359050613d5681613d30565b92915050565b600060208284031215613d7257613d71613baf565b5b6000613d8084828501613d47565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613db482613d89565b9050919050565b613dc481613da9565b82525050565b6000602082019050613ddf6000830184613dbb565b92915050565b613dee81613da9565b8114613df957600080fd5b50565b600081359050613e0b81613de5565b92915050565b60008060408385031215613e2857613e27613baf565b5b6000613e3685828601613dfc565b9250506020613e4785828601613d47565b9150509250929050565b600060208284031215613e6757613e66613baf565b5b6000613e7584828501613dfc565b91505092915050565b613e8781613d26565b82525050565b6000602082019050613ea26000830184613e7e565b92915050565b600080600060608486031215613ec157613ec0613baf565b5b6000613ecf86828701613dfc565b9350506020613ee086828701613dfc565b9250506040613ef186828701613d47565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f3882613cba565b810181811067ffffffffffffffff82111715613f5757613f56613f00565b5b80604052505050565b6000613f6a613ba5565b9050613f768282613f2f565b919050565b600067ffffffffffffffff821115613f9657613f95613f00565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b613fbf81613fac565b8114613fca57600080fd5b50565b600081359050613fdc81613fb6565b92915050565b6000613ff5613ff084613f7b565b613f60565b9050808382526020820190506020840283018581111561401857614017613fa7565b5b835b81811015614041578061402d8882613fcd565b84526020840193505060208101905061401a565b5050509392505050565b600082601f8301126140605761405f613efb565b5b8135614070848260208601613fe2565b91505092915050565b60008060006060848603121561409257614091613baf565b5b60006140a086828701613d47565b93505060206140b186828701613d47565b925050604084013567ffffffffffffffff8111156140d2576140d1613bb4565b5b6140de8682870161404b565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61411d81613d26565b82525050565b600061412f8383614114565b60208301905092915050565b6000602082019050919050565b6000614153826140e8565b61415d81856140f3565b935061416883614104565b8060005b838110156141995781516141808882614123565b975061418b8361413b565b92505060018101905061416c565b5085935050505092915050565b600060208201905081810360008301526141c08184614148565b905092915050565b600080fd5b600067ffffffffffffffff8211156141e8576141e7613f00565b5b6141f182613cba565b9050602081019050919050565b82818337600083830152505050565b600061422061421b846141cd565b613f60565b90508281526020810184848401111561423c5761423b6141c8565b5b6142478482856141fe565b509392505050565b600082601f83011261426457614263613efb565b5b813561427484826020860161420d565b91505092915050565b60006020828403121561429357614292613baf565b5b600082013567ffffffffffffffff8111156142b1576142b0613bb4565b5b6142bd8482850161424f565b91505092915050565b600067ffffffffffffffff8211156142e1576142e0613f00565b5b602082029050602081019050919050565b6000614305614300846142c6565b613f60565b9050808382526020820190506020840283018581111561432857614327613fa7565b5b835b81811015614351578061433d8882613dfc565b84526020840193505060208101905061432a565b5050509392505050565b600082601f8301126143705761436f613efb565b5b81356143808482602086016142f2565b91505092915050565b60006020828403121561439f5761439e613baf565b5b600082013567ffffffffffffffff8111156143bd576143bc613bb4565b5b6143c98482850161435b565b91505092915050565b600681106143df57600080fd5b50565b6000813590506143f1816143d2565b92915050565b60006020828403121561440d5761440c613baf565b5b600061441b848285016143e2565b91505092915050565b61442d81613c3e565b811461443857600080fd5b50565b60008135905061444a81614424565b92915050565b6000806040838503121561446757614466613baf565b5b600061447585828601613dfc565b92505060206144868582860161443b565b9150509250929050565b61449981613fac565b82525050565b60006020820190506144b46000830184614490565b92915050565b600067ffffffffffffffff8211156144d5576144d4613f00565b5b6144de82613cba565b9050602081019050919050565b60006144fe6144f9846144ba565b613f60565b90508281526020810184848401111561451a576145196141c8565b5b6145258482856141fe565b509392505050565b600082601f83011261454257614541613efb565b5b81356145528482602086016144eb565b91505092915050565b6000806000806080858703121561457557614574613baf565b5b600061458387828801613dfc565b945050602061459487828801613dfc565b93505060406145a587828801613d47565b925050606085013567ffffffffffffffff8111156145c6576145c5613bb4565b5b6145d28782880161452d565b91505092959194509250565b6000602082840312156145f4576145f3613baf565b5b600061460284828501613fcd565b91505092915050565b6000806040838503121561462257614621613baf565b5b600061463085828601613d47565b925050602061464185828601613d47565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6006811061468b5761468a61464b565b5b50565b600081905061469c8261467a565b919050565b60006146ac8261468e565b9050919050565b6146bc816146a1565b82525050565b60006020820190506146d760008301846146b3565b92915050565b600080604083850312156146f4576146f3613baf565b5b600061470285828601613dfc565b925050602061471385828601613dfc565b9150509250929050565b6000806040838503121561473457614733613baf565b5b600061474285828601613d47565b925050602061475385828601613dfc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147a457607f821691505b6020821081036147b7576147b661475d565b5b50919050565b7f696c6c6567616c00000000000000000000000000000000000000000000000000600082015250565b60006147f3600783613c7f565b91506147fe826147bd565b602082019050919050565b60006020820190508181036000830152614822816147e6565b9050919050565b7f6164647265737320696c6c6567616c0000000000000000000000000000000000600082015250565b600061485f600f83613c7f565b915061486a82614829565b602082019050919050565b6000602082019050818103600083015261488e81614852565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b60006148cb601383613c7f565b91506148d682614895565b602082019050919050565b600060208201905081810360008301526148fa816148be565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061493b82613d26565b915061494683613d26565b925082820190508082111561495e5761495d614901565b5b92915050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b600061499a601383613c7f565b91506149a582614964565b602082019050919050565b600060208201905081810360008301526149c98161498d565b9050919050565b7f43616e2774206d696e742074686174206d616e79000000000000000000000000600082015250565b6000614a06601483613c7f565b9150614a11826149d0565b602082019050919050565b60006020820190508181036000830152614a35816149f9565b9050919050565b7f5075626c6963206d696e742069732064697361626c6564000000000000000000600082015250565b6000614a72601783613c7f565b9150614a7d82614a3c565b602082019050919050565b60006020820190508181036000830152614aa181614a65565b9050919050565b6000614ab382613d26565b9150614abe83613d26565b9250828202614acc81613d26565b91508282048414831517614ae357614ae2614901565b5b5092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614b20601283613c7f565b9150614b2b82614aea565b602082019050919050565b60006020820190508181036000830152614b4f81614b13565b9050919050565b7f616c6c6f776c697374206d696e742064697361626c6564000000000000000000600082015250565b6000614b8c601783613c7f565b9150614b9782614b56565b602082019050919050565b60006020820190508181036000830152614bbb81614b7f565b9050919050565b7f63616e2774206d696e742074686174206d616e79000000000000000000000000600082015250565b6000614bf8601483613c7f565b9150614c0382614bc2565b602082019050919050565b60006020820190508181036000830152614c2781614beb565b9050919050565b7f61646472657373206572726f7200000000000000000000000000000000000000600082015250565b6000614c64600d83613c7f565b9150614c6f82614c2e565b602082019050919050565b60006020820190508181036000830152614c9381614c57565b9050919050565b7f566572696669636174696f6e206661696c656400000000000000000000000000600082015250565b6000614cd0601383613c7f565b9150614cdb82614c9a565b602082019050919050565b60006020820190508181036000830152614cff81614cc3565b9050919050565b600081905092915050565b50565b6000614d21600083614d06565b9150614d2c82614d11565b600082019050919050565b6000614d4282614d14565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614d82600f83613c7f565b9150614d8d82614d4c565b602082019050919050565b60006020820190508181036000830152614db181614d75565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614df282613d26565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e2457614e23614901565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614e917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614e54565b614e9b8683614e54565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614ed8614ed3614ece84613d26565b614eb3565b613d26565b9050919050565b6000819050919050565b614ef283614ebd565b614f06614efe82614edf565b848454614e61565b825550505050565b600090565b614f1b614f0e565b614f26818484614ee9565b505050565b5b81811015614f4a57614f3f600082614f13565b600181019050614f2c565b5050565b601f821115614f8f57614f6081614e2f565b614f6984614e44565b81016020851015614f78578190505b614f8c614f8485614e44565b830182614f2b565b50505b505050565b600082821c905092915050565b6000614fb260001984600802614f94565b1980831691505092915050565b6000614fcb8383614fa1565b9150826002028217905092915050565b614fe482613c74565b67ffffffffffffffff811115614ffd57614ffc613f00565b5b615007825461478c565b615012828285614f4e565b600060209050601f8311600181146150455760008415615033578287015190505b61503d8582614fbf565b8655506150a5565b601f19841661505386614e2f565b60005b8281101561507b57848901518255600182019150602085019450602081019050615056565b868310156150985784890151615094601f891682614fa1565b8355505b6001600288020188555050505b505050505050565b7f616c6c6f776c697374206d696e742069732064697361626c6564000000000000600082015250565b60006150e3601a83613c7f565b91506150ee826150ad565b602082019050919050565b60006020820190508181036000830152615112816150d6565b9050919050565b7f416c6c6f776c697374206d75696e742069732064697361626c65640000000000600082015250565b600061514f601b83613c7f565b915061515a82615119565b602082019050919050565b6000602082019050818103600083015261517e81615142565b9050919050565b7f6e6f7420696e20616c6c6f776c69737400000000000000000000000000000000600082015250565b60006151bb601083613c7f565b91506151c682615185565b602082019050919050565b600060208201905081810360008301526151ea816151ae565b9050919050565b7f57686974656c697374206d696e742069732064697361626c6564000000000000600082015250565b6000615227601a83613c7f565b9150615232826151f1565b602082019050919050565b600060208201905081810360008301526152568161521a565b9050919050565b7f4e6f742077686974656c69737400000000000000000000000000000000000000600082015250565b6000615293600d83613c7f565b915061529e8261525d565b602082019050919050565b600060208201905081810360008301526152c281615286565b9050919050565b60006152d482613d26565b91506152df83613d26565b92508282039050818111156152f7576152f6614901565b5b92915050565b7f76616c7565206e6f742065710000000000000000000000000000000000000000600082015250565b6000615333600c83613c7f565b915061533e826152fd565b602082019050919050565b6000602082019050818103600083015261536281615326565b9050919050565b6000819050919050565b61538461537f82613d26565b615369565b82525050565b60006153968284615373565b60208201915081905092915050565b60008160601b9050919050565b60006153bd826153a5565b9050919050565b60006153cf826153b2565b9050919050565b6153e76153e282613da9565b6153c4565b82525050565b60006153f982846153d6565b60148201915081905092915050565b600061541482856153d6565b6014820191506154248284615373565b6020820191508190509392505050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000615490602f83613c7f565b915061549b82615434565b604082019050919050565b600060208201905081810360008301526154bf81615483565b9050919050565b600081905092915050565b60006154dc82613c74565b6154e681856154c6565b93506154f6818560208601613c90565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006155386005836154c6565b915061554382615502565b600582019050919050565b600061555a82856154d1565b915061556682846154d1565b91506155718261552b565b91508190509392505050565b7f77686974656c697374206d696e742064697361626c6564000000000000000000600082015250565b60006155b3601783613c7f565b91506155be8261557d565b602082019050919050565b600060208201905081810360008301526155e2816155a6565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615645602683613c7f565b9150615650826155e9565b604082019050919050565b6000602082019050818103600083015261567481615638565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156b1602083613c7f565b91506156bc8261567b565b602082019050919050565b600060208201905081810360008301526156e0816156a4565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061571d601f83613c7f565b9150615728826156e7565b602082019050919050565b6000602082019050818103600083015261574c81615710565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061577a82615753565b615784818561575e565b9350615794818560208601613c90565b61579d81613cba565b840191505092915050565b60006080820190506157bd6000830187613dbb565b6157ca6020830186613dbb565b6157d76040830185613e7e565b81810360608301526157e9818461576f565b905095945050505050565b60008151905061580381613be5565b92915050565b60006020828403121561581f5761581e613baf565b5b600061582d848285016157f4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061587082613d26565b915061587b83613d26565b92508261588b5761588a615836565b5b828204905092915050565b60006158a182613d26565b91506158ac83613d26565b9250826158bc576158bb615836565b5b82820690509291505056fea26469706673582212203ddfc6742a2e36af6b6f8834f203f9666e0f47a55c4af0f7722116edac660b8e64736f6c63430008110033

Deployed Bytecode Sourcemap

69339:10958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18404:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19306:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25797:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25230:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71948:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15057:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77363:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29436:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79023:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72004:585;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76511:780;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72634:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73143:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74789:185;;;;;;;;;;;;;:::i;:::-;;32357:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73999:614;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70633:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79273:457;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74687:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79738:556;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69639:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69869:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69682:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20699:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16241:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68379:103;;;;;;;;;;;;;:::i;:::-;;78488:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70519:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70021:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69824:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77613:867;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67731:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19482:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73500:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26355:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70121:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69717;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72680:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73261:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33148:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71793:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73382:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75381:345;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74621:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70802:654;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70227:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69601:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73769:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73097:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75737:766;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69918:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73038:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26746:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71836:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73562:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68637:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72920:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18404:639;18489:4;18828:10;18813:25;;:11;:25;;;;:102;;;;18905:10;18890:25;;:11;:25;;;;18813:102;:179;;;;18982:10;18967:25;;:11;:25;;;;18813:179;18793:199;;18404:639;;;:::o;19306:100::-;19360:13;19393:5;19386:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19306:100;:::o;25797:218::-;25873:7;25898:16;25906:7;25898;:16::i;:::-;25893:64;;25923:34;;;;;;;;;;;;;;25893:64;25977:15;:24;25993:7;25977:24;;;;;;;;;;;:30;;;;;;;;;;;;25970:37;;25797:218;;;:::o;25230:408::-;25319:13;25335:16;25343:7;25335;:16::i;:::-;25319:32;;25391:5;25368:28;;:19;:17;:19::i;:::-;:28;;;25364:175;;25416:44;25433:5;25440:19;:17;:19::i;:::-;25416:16;:44::i;:::-;25411:128;;25488:35;;;;;;;;;;;;;;25411:128;25364:175;25584:2;25551:15;:24;25567:7;25551:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25622:7;25618:2;25602:28;;25611:5;25602:28;;;;;;;;;;;;25308:330;25230:408;;:::o;71948:47::-;;;;;;;;;;;;;;;;;:::o;15057:323::-;15118:7;15346:15;:13;:15::i;:::-;15331:12;;15315:13;;:28;:46;15308:53;;15057:323;:::o;77363:242::-;77424:4;77458:29;77449:38;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;77441:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;77537:1;77518:21;;:7;:21;;;77510:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;77577:11;:20;77589:7;77577:20;;;;;;;;;;;;;;;;;;;;;;;;;77570:27;;77363:242;;;:::o;29436:2825::-;29578:27;29608;29627:7;29608:18;:27::i;:::-;29578:57;;29693:4;29652:45;;29668:19;29652:45;;;29648:86;;29706:28;;;;;;;;;;;;;;29648:86;29748:27;29777:23;29804:35;29831:7;29804:26;:35::i;:::-;29747:92;;;;29939:68;29964:15;29981:4;29987:19;:17;:19::i;:::-;29939:24;:68::i;:::-;29934:180;;30027:43;30044:4;30050:19;:17;:19::i;:::-;30027:16;:43::i;:::-;30022:92;;30079:35;;;;;;;;;;;;;;30022:92;29934:180;30145:1;30131:16;;:2;:16;;;30127:52;;30156:23;;;;;;;;;;;;;;30127:52;30192:43;30214:4;30220:2;30224:7;30233:1;30192:21;:43::i;:::-;30328:15;30325:160;;;30468:1;30447:19;30440:30;30325:160;30865:18;:24;30884:4;30865:24;;;;;;;;;;;;;;;;30863:26;;;;;;;;;;;;30934:18;:22;30953:2;30934:22;;;;;;;;;;;;;;;;30932:24;;;;;;;;;;;31256:146;31293:2;31342:45;31357:4;31363:2;31367:19;31342:14;:45::i;:::-;11456:8;31314:73;31256:18;:146::i;:::-;31227:17;:26;31245:7;31227:26;;;;;;;;;;;:175;;;;31573:1;11456:8;31522:19;:47;:52;31518:627;;31595:19;31627:1;31617:7;:11;31595:33;;31784:1;31750:17;:30;31768:11;31750:30;;;;;;;;;;;;:35;31746:384;;31888:13;;31873:11;:28;31869:242;;32068:19;32035:17;:30;32053:11;32035:30;;;;;;;;;;;:52;;;;31869:242;31746:384;31576:569;31518:627;32192:7;32188:2;32173:27;;32182:4;32173:27;;;;;;;;;;;;32211:42;32232:4;32238:2;32242:7;32251:1;32211:20;:42::i;:::-;29567:2694;;;29436:2825;;;:::o;79023:242::-;79084:4;79118:29;79109:38;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;79101:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;79197:1;79178:21;;:7;:21;;;79170:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;79237:11;:20;79249:7;79237:20;;;;;;;;;;;;;;;;;;;;;;;;;79230:27;;79023:242;;;:::o;72004:585::-;72097:6;72105:15;;71572:1;71558:11;:15;:40;;;;;71592:6;71577:11;:21;;71558:40;71536:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;71709:9;;71694:11;71678:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;71656:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;72197:15:::1;;72187:6;72160:12;:24;72173:10;72160:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:52;;72138:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;72288:24;72279:33;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:33;;;;;;;;:::i;:::-;;;72271:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;72385:12;;72375:6;72359:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:38;;72351:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;72467:6;72454:10;;:19;;;;:::i;:::-;72441:9;:32;;72433:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;72535:6;72507:12;:24;72520:10;72507:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;72552:29;72562:10;72574:6;72552:9;:29::i;:::-;72004:585:::0;;;:::o;76511:780::-;76703:27;76694:36;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:36;;;;;;;;:::i;:::-;;;76672:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;76854:18;;76844:6;76814:15;:27;76830:10;76814:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:58;;76792:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;76975:1;76953:24;;:10;:24;;;76931:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;77030:12;77045:27;77051:10;77063:8;77045:5;:27::i;:::-;77030:42;;77105:41;77113:4;77119:5;77126:19;;77105:7;:41::i;:::-;77083:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;77237:6;77206:15;:27;77222:10;77206:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;77254:29;77264:10;77276:6;77254:9;:29::i;:::-;76661:630;76511:780;;;:::o;72634:37::-;;;;:::o;73143:110::-;67617:13;:11;:13::i;:::-;73239:6:::1;73218:18;:27;;;;73143:110:::0;:::o;74789:185::-;67617:13;:11;:13::i;:::-;53780:21:::1;:19;:21::i;:::-;74853:12:::2;74871:10;:15;;74894:21;74871:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74852:68;;;74939:7;74931:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;74841:133;53824:20:::1;:18;:20::i;:::-;74789:185::o:0;32357:193::-;32503:39;32520:4;32526:2;32530:7;32503:39;;;;;;;;;;;;:16;:39::i;:::-;32357:193;;;:::o;73999:614::-;74086:16;74120:23;74146:17;74156:6;74146:9;:17::i;:::-;74120:43;;74174:28;74219:15;74205:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74174:61;;74246:21;74301:16;74320:15;:13;:15::i;:::-;74301:34;;74282:295;74362:13;:11;:13::i;:::-;74350:8;:25;74282:295;;74452:6;74431:27;;:17;74439:8;74431:7;:17::i;:::-;:27;;;74427:139;;74508:8;74479:11;74491:13;74479:26;;;;;;;;:::i;:::-;;;;;;;:37;;;;;74535:15;;;;;:::i;:::-;;;;74427:139;74390:10;;;;;:::i;:::-;;;;74282:295;;;;74594:11;74587:18;;;;;73999:614;;;:::o;70633:161::-;67617:13;:11;:13::i;:::-;70768:18:::1;70748:17;:38;;;;;;:::i;:::-;;70633:161:::0;:::o;79273:457::-;67617:13;:11;:13::i;:::-;53780:21:::1;:19;:21::i;:::-;79430:29:::2;79421:38:::0;::::2;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;79399:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;79524:11;79550:173;79566:10;:17;79560:3;:23;79550:173;;;79638:1;79611:29;;:10;79622:3;79611:15;;;;;;;;:::i;:::-;;;;;;;;:29;;;79607:105;;79692:4;79661:11;:28;79673:10;79684:3;79673:15;;;;;;;;:::i;:::-;;;;;;;;79661:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;79607:105;79585:5;;;;;:::i;:::-;;;;79550:173;;;79388:342;53824:20:::1;:18;:20::i;:::-;79273:457:::0;:::o;74687:94::-;67617:13;:11;:13::i;:::-;74767:6:::1;74759:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;74687:94:::0;:::o;79738:556::-;79837:6;79845:18;;71572:1;71558:11;:15;:40;;;;;71592:6;71577:11;:21;;71558:40;71536:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;71709:9;;71694:11;71678:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;71656:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;79912:29:::1;79903:38:::0;::::1;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;79881:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;80069:18;;80059:6;80029:15;:27;80045:10;80029:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:58;;80007:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;80154:11;:23;80166:10;80154:23;;;;;;;;;;;;;;;;;;;;;;;;;80146:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;80240:6;80209:15;:27;80225:10;80209:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;80257:29;80267:10;80279:6;80257:9;:29::i;:::-;79738:556:::0;;;:::o;69639:34::-;;;;:::o;69869:42::-;;;;:::o;69682:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20699:152::-;20771:7;20814:27;20833:7;20814:18;:27::i;:::-;20791:52;;20699:152;;;:::o;16241:233::-;16313:7;16354:1;16337:19;;:5;:19;;;16333:60;;16365:28;;;;;;;;;;;;;;16333:60;10400:13;16411:18;:25;16430:5;16411:25;;;;;;;;;;;;;;;;:55;16404:62;;16241:233;;;:::o;68379:103::-;67617:13;:11;:13::i;:::-;68444:30:::1;68471:1;68444:18;:30::i;:::-;68379:103::o:0;78488:473::-;67617:13;:11;:13::i;:::-;53780:21:::1;:19;:21::i;:::-;78649:29:::2;78640:38;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;78618:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;78743:11;78769:185;78785:14;:21;78779:3;:27;78769:185;;;78865:1;78834:33;;:14;78849:3;78834:19;;;;;;;;:::i;:::-;;;;;;;;:33;;;78830:113;;78923:4;78888:11;:32;78900:14;78915:3;78900:19;;;;;;;;:::i;:::-;;;;;;;;78888:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;78830:113;78808:5;;;;;:::i;:::-;;;;78769:185;;;78607:354;53824:20:::1;:18;:20::i;:::-;78488:473:::0;:::o;70519:106::-;67617:13;:11;:13::i;:::-;70607:10:::1;70595:9;:22;;;;;;:::i;:::-;;70519:106:::0;:::o;70021:92::-;67617:13;:11;:13::i;:::-;70100:5:::1;70087:10;:18;;;;70021:92:::0;:::o;69824:38::-;;;;:::o;77613:867::-;77712:6;77720:18;;71572:1;71558:11;:15;:40;;;;;71592:6;71577:11;:21;;71558:40;71536:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;71709:9;;71694:11;71678:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;71656:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;77787:29:::1;77778:38;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:38;;;;;;;;:::i;:::-;;;77756:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;77943:18;;77933:6;77903:15;:27;77919:10;77903:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:58;;77881:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;78028:11;:23;78040:10;78028:23;;;;;;;;;;;;;;;;;;;;;;;;;78020:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;78080:17;78100:15;:27;78116:10;78100:27;;;;;;;;;;;;;;;;78080:47;;78138:18;78183:1:::0;78171:9:::1;:13;78167:155;;;78230:6;78214:13;;:22;;;;:::i;:::-;78201:35;;78167:155;;;78308:1;78299:6;:10;;;;:::i;:::-;78282:13;;:28;;;;:::i;:::-;78269:41;;78167:155;78355:10;78342:9;:23;;78334:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;78426:6;78395:15;:27;78411:10;78395:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;78443:29;78453:10;78465:6;78443:9;:29::i;:::-;77745:735;;77613:867:::0;;;:::o;67731:87::-;67777:7;67804:6;;;;;;;;;;;67797:13;;67731:87;:::o;19482:104::-;19538:13;19571:7;19564:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19482:104;:::o;73500:50::-;;;;;;;;;;;;;;;;;:::o;26355:234::-;26502:8;26450:18;:39;26469:19;:17;:19::i;:::-;26450:39;;;;;;;;;;;;;;;:49;26490:8;26450:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26562:8;26526:55;;26541:19;:17;:19::i;:::-;26526:55;;;26572:8;26526:55;;;;;;:::i;:::-;;;;;;;;26355:234;;:::o;70121:98::-;67617:13;:11;:13::i;:::-;70206:5:::1;70190:13;:21;;;;70121:98:::0;:::o;69717:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72680:110::-;67617:13;:11;:13::i;:::-;72776:6:::1;72755:18;:27;;;;72680:110:::0;:::o;73261:112::-;;;;:::o;33148:407::-;33323:31;33336:4;33342:2;33346:7;33323:12;:31::i;:::-;33387:1;33369:2;:14;;;:19;33365:183;;33408:56;33439:4;33445:2;33449:7;33458:5;33408:30;:56::i;:::-;33403:145;;33492:40;;;;;;;;;;;;;;33403:145;33365:183;33148:407;;;;:::o;71793:34::-;;;;:::o;73382:110::-;67617:13;:11;:13::i;:::-;73479:5:::1;73457:19;:27;;;;73382:110:::0;:::o;75381:345::-;75451:7;75481:1;75474:3;:8;75471:85;;75533:9;75516:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;75506:38;;;;;;75499:45;;;;75471:85;75576:1;75569:3;:8;75566:86;;75628:10;75611:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;75601:39;;;;;;75594:46;;;;75566:86;75695:10;75707:9;75678:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75668:50;;;;;;75661:57;;75381:345;;;;;:::o;74621:57::-;;;;;;;;;;;;;:::o;70802:654::-;70921:13;70974:17;70982:8;70974:7;:17::i;:::-;70952:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;71077:28;71108:10;:8;:10::i;:::-;71077:41;;71182:1;71157:14;71151:28;:32;:297;;71431:17;71151:297;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71275:14;71316:19;:8;:17;:19::i;:::-;71232:160;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71151:297;71131:317;;;70802:654;;;:::o;70227:164::-;67617:13;:11;:13::i;:::-;70312:5:::1;70296:13;:21;;;;70227:164:::0;:::o;69601:31::-;;;;:::o;73769:113::-;73827:7;73854:20;73868:5;73854:13;:20::i;:::-;73847:27;;73769:113;;;:::o;73097:37::-;;;;:::o;75737:766::-;75915:27;75906:36;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:36;;;;;;;;:::i;:::-;;;75884:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;76066:18;;76056:6;76026:15;:27;76042:10;76026:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:58;;76004:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;76187:1;76165:24;;:10;:24;;;76143:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;76242:12;76257:27;76263:10;76275:8;76257:5;:27::i;:::-;76242:42;;76317:41;76325:4;76331:5;76338:19;;76317:7;:41::i;:::-;76295:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;76449:6;76418:15;:27;76434:10;76418:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;76466:29;76476:10;76488:6;76466:9;:29::i;:::-;75873:630;75737:766;;;:::o;69918:42::-;;;;:::o;73038:50::-;;;;;;;;;;;;;;;;;:::o;26746:164::-;26843:4;26867:18;:25;26886:5;26867:25;;;;;;;;;;;;;;;:35;26893:8;26867:35;;;;;;;;;;;;;;;;;;;;;;;;;26860:42;;26746:164;;;;:::o;71836:104::-;67617:13;:11;:13::i;:::-;71926:6:::1;71908:15;:24;;;;71836:104:::0;:::o;73562:199::-;67617:13;:11;:13::i;:::-;73682:9:::1;;73672:6;73656:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;73648:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;73726:27;73736:8;73746:6;73726:9;:27::i;:::-;73562:199:::0;;:::o;68637:201::-;67617:13;:11;:13::i;:::-;68746:1:::1;68726:22;;:8;:22;;::::0;68718:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;68802:28;68821:8;68802:18;:28::i;:::-;68637:201:::0;:::o;72920:110::-;67617:13;:11;:13::i;:::-;73017:5:::1;72995:19;:27;;;;72920:110:::0;:::o;27168:282::-;27233:4;27289:7;27270:15;:13;:15::i;:::-;:26;;:66;;;;;27323:13;;27313:7;:23;27270:66;:153;;;;;27422:1;11176:8;27374:17;:26;27392:7;27374:26;;;;;;;;;;;;:44;:49;27270:153;27250:173;;27168:282;;;:::o;49476:105::-;49536:7;49563:10;49556:17;;49476:105;:::o;73890:101::-;73955:7;73982:1;73975:8;;73890:101;:::o;21854:1275::-;21921:7;21941:12;21956:7;21941:22;;22024:4;22005:15;:13;:15::i;:::-;:23;22001:1061;;22058:13;;22051:4;:20;22047:1015;;;22096:14;22113:17;:23;22131:4;22113:23;;;;;;;;;;;;22096:40;;22230:1;11176:8;22202:6;:24;:29;22198:845;;22867:113;22884:1;22874:6;:11;22867:113;;22927:17;:25;22945:6;;;;;;;22927:25;;;;;;;;;;;;22918:34;;22867:113;;;23013:6;23006:13;;;;;;22198:845;22073:989;22047:1015;22001:1061;23090:31;;;;;;;;;;;;;;21854:1275;;;;:::o;28331:485::-;28433:27;28462:23;28503:38;28544:15;:24;28560:7;28544:24;;;;;;;;;;;28503:65;;28721:18;28698:41;;28778:19;28772:26;28753:45;;28683:126;28331:485;;;:::o;27559:659::-;27708:11;27873:16;27866:5;27862:28;27853:37;;28033:16;28022:9;28018:32;28005:45;;28183:15;28172:9;28169:30;28161:5;28150:9;28147:20;28144:56;28134:66;;27559:659;;;;;:::o;34217:159::-;;;;;:::o;48785:311::-;48920:7;48940:16;11580:3;48966:19;:41;;48940:68;;11580:3;49034:31;49045:4;49051:2;49055:9;49034:10;:31::i;:::-;49026:40;;:62;;49019:69;;;48785:311;;;;;:::o;23677:450::-;23757:14;23925:16;23918:5;23914:28;23905:37;;24102:5;24088:11;24063:23;24059:41;24056:52;24049:5;24046:63;24036:73;;23677:450;;;;:::o;35041:158::-;;;;;:::o;43308:112::-;43385:27;43395:2;43399:8;43385:27;;;;;;;;;;;;:9;:27::i;:::-;43308:112;;:::o;74986:187::-;75086:7;75145;75154:9;75128:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75118:47;;;;;;75111:54;;74986:187;;;;:::o;75181:192::-;75299:4;75328:37;75347:5;75354:4;75360;75328:18;:37::i;:::-;75321:44;;75181:192;;;;;:::o;67896:132::-;67971:12;:10;:12::i;:::-;67960:23;;:7;:5;:7::i;:::-;:23;;;67952:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67896:132::o;53860:293::-;53262:1;53994:7;;:19;53986:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53262:1;54127:7;:18;;;;53860:293::o;54161:213::-;53218:1;54344:7;:22;;;;54161:213::o;68998:191::-;69072:16;69091:6;;;;;;;;;;;69072:25;;69117:8;69108:6;;:17;;;;;;;;;;;;;;;;;;69172:8;69141:40;;69162:8;69141:40;;;;;;;;;;;;69061:128;68998:191;:::o;35639:716::-;35802:4;35848:2;35823:45;;;35869:19;:17;:19::i;:::-;35890:4;35896:7;35905:5;35823:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35819:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36123:1;36106:6;:13;:18;36102:235;;36152:40;;;;;;;;;;;;;;36102:235;36295:6;36289:13;36280:6;36276:2;36272:15;36265:38;35819:529;35992:54;;;35982:64;;;:6;:64;;;;35975:71;;;35639:716;;;;;;:::o;70401:110::-;70461:13;70494:9;70487:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70401:110;:::o;54811:723::-;54867:13;55097:1;55088:5;:10;55084:53;;55115:10;;;;;;;;;;;;;;;;;;;;;55084:53;55147:12;55162:5;55147:20;;55178:14;55203:78;55218:1;55210:4;:9;55203:78;;55236:8;;;;;:::i;:::-;;;;55267:2;55259:10;;;;;:::i;:::-;;;55203:78;;;55291:19;55323:6;55313:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55291:39;;55341:154;55357:1;55348:5;:10;55341:154;;55385:1;55375:11;;;;;:::i;:::-;;;55452:2;55444:5;:10;;;;:::i;:::-;55431:2;:24;;;;:::i;:::-;55418:39;;55401:6;55408;55401:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;55481:2;55472:11;;;;;:::i;:::-;;;55341:154;;;55519:6;55505:21;;;;;54811:723;;;;:::o;16556:178::-;16617:7;10400:13;10538:2;16645:18;:25;16664:5;16645:25;;;;;;;;;;;;;;;;:50;;16644:82;16637:89;;16556:178;;;:::o;48486:147::-;48623:6;48486:147;;;;;:::o;42535:689::-;42666:19;42672:2;42676:8;42666:5;:19::i;:::-;42745:1;42727:2;:14;;;:19;42723:483;;42767:11;42781:13;;42767:27;;42813:13;42835:8;42829:3;:14;42813:30;;42862:233;42893:62;42932:1;42936:2;42940:7;;;;;;42949:5;42893:30;:62::i;:::-;42888:167;;42991:40;;;;;;;;;;;;;;42888:167;43090:3;43082:5;:11;42862:233;;43177:3;43160:13;;:20;43156:34;;43182:8;;;43156:34;42748:458;;42723:483;42535:689;;;:::o;58097:190::-;58222:4;58275;58246:25;58259:5;58266:4;58246:12;:25::i;:::-;:33;58239:40;;58097:190;;;;;:::o;66282:98::-;66335:7;66362:10;66355:17;;66282:98;:::o;36817:2966::-;36890:20;36913:13;;36890:36;;36953:1;36941:8;:13;36937:44;;36963:18;;;;;;;;;;;;;;36937:44;36994:61;37024:1;37028:2;37032:12;37046:8;36994:21;:61::i;:::-;37538:1;10538:2;37508:1;:26;;37507:32;37495:8;:45;37469:18;:22;37488:2;37469:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37817:139;37854:2;37908:33;37931:1;37935:2;37939:1;37908:14;:33::i;:::-;37875:30;37896:8;37875:20;:30::i;:::-;:66;37817:18;:139::i;:::-;37783:17;:31;37801:12;37783:31;;;;;;;;;;;:173;;;;37973:16;38004:11;38033:8;38018:12;:23;38004:37;;38554:16;38550:2;38546:25;38534:37;;38926:12;38886:8;38845:1;38783:25;38724:1;38663;38636:335;39297:1;39283:12;39279:20;39237:346;39338:3;39329:7;39326:16;39237:346;;39556:7;39546:8;39543:1;39516:25;39513:1;39510;39505:59;39391:1;39382:7;39378:15;39367:26;;39237:346;;;39241:77;39628:1;39616:8;:13;39612:45;;39638:19;;;;;;;;;;;;;;39612:45;39690:3;39674:13;:19;;;;37243:2462;;39715:60;39744:1;39748:2;39752:12;39766:8;39715:20;:60::i;:::-;36879:2904;36817:2966;;:::o;58964:296::-;59047:7;59067:20;59090:4;59067:27;;59110:9;59105:118;59129:5;:12;59125:1;:16;59105:118;;;59178:33;59188:12;59202:5;59208:1;59202:8;;;;;;;;:::i;:::-;;;;;;;;59178:9;:33::i;:::-;59163:48;;59143:3;;;;;:::i;:::-;;;;59105:118;;;;59240:12;59233:19;;;58964:296;;;;:::o;24229:324::-;24299:14;24532:1;24522:8;24519:15;24493:24;24489:46;24479:56;;24229:324;;;:::o;65171:149::-;65234:7;65265:1;65261;:5;:51;;65292:20;65307:1;65310;65292:14;:20::i;:::-;65261:51;;;65269:20;65284:1;65287;65269:14;:20::i;:::-;65261:51;65254:58;;65171:149;;;;:::o;65328:268::-;65396:13;65503:1;65497:4;65490:15;65532:1;65526:4;65519:15;65573:4;65567;65557:21;65548:30;;65328:268;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:329::-;4949:6;4998:2;4986:9;4977:7;4973:23;4969:32;4966:119;;;5004:79;;:::i;:::-;4966:119;5124:1;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5095:117;4890:329;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:180;6373:77;6370:1;6363:88;6470:4;6467:1;6460:15;6494:4;6491:1;6484:15;6511:281;6594:27;6616:4;6594:27;:::i;:::-;6586:6;6582:40;6724:6;6712:10;6709:22;6688:18;6676:10;6673:34;6670:62;6667:88;;;6735:18;;:::i;:::-;6667:88;6775:10;6771:2;6764:22;6554:238;6511:281;;:::o;6798:129::-;6832:6;6859:20;;:::i;:::-;6849:30;;6888:33;6916:4;6908:6;6888:33;:::i;:::-;6798:129;;;:::o;6933:311::-;7010:4;7100:18;7092:6;7089:30;7086:56;;;7122:18;;:::i;:::-;7086:56;7172:4;7164:6;7160:17;7152:25;;7232:4;7226;7222:15;7214:23;;6933:311;;;:::o;7250:117::-;7359:1;7356;7349:12;7373:77;7410:7;7439:5;7428:16;;7373:77;;;:::o;7456:122::-;7529:24;7547:5;7529:24;:::i;:::-;7522:5;7519:35;7509:63;;7568:1;7565;7558:12;7509:63;7456:122;:::o;7584:139::-;7630:5;7668:6;7655:20;7646:29;;7684:33;7711:5;7684:33;:::i;:::-;7584:139;;;;:::o;7746:710::-;7842:5;7867:81;7883:64;7940:6;7883:64;:::i;:::-;7867:81;:::i;:::-;7858:90;;7968:5;7997:6;7990:5;7983:21;8031:4;8024:5;8020:16;8013:23;;8084:4;8076:6;8072:17;8064:6;8060:30;8113:3;8105:6;8102:15;8099:122;;;8132:79;;:::i;:::-;8099:122;8247:6;8230:220;8264:6;8259:3;8256:15;8230:220;;;8339:3;8368:37;8401:3;8389:10;8368:37;:::i;:::-;8363:3;8356:50;8435:4;8430:3;8426:14;8419:21;;8306:144;8290:4;8285:3;8281:14;8274:21;;8230:220;;;8234:21;7848:608;;7746:710;;;;;:::o;8479:370::-;8550:5;8599:3;8592:4;8584:6;8580:17;8576:27;8566:122;;8607:79;;:::i;:::-;8566:122;8724:6;8711:20;8749:94;8839:3;8831:6;8824:4;8816:6;8812:17;8749:94;:::i;:::-;8740:103;;8556:293;8479:370;;;;:::o;8855:829::-;8957:6;8965;8973;9022:2;9010:9;9001:7;8997:23;8993:32;8990:119;;;9028:79;;:::i;:::-;8990:119;9148:1;9173:53;9218:7;9209:6;9198:9;9194:22;9173:53;:::i;:::-;9163:63;;9119:117;9275:2;9301:53;9346:7;9337:6;9326:9;9322:22;9301:53;:::i;:::-;9291:63;;9246:118;9431:2;9420:9;9416:18;9403:32;9462:18;9454:6;9451:30;9448:117;;;9484:79;;:::i;:::-;9448:117;9589:78;9659:7;9650:6;9639:9;9635:22;9589:78;:::i;:::-;9579:88;;9374:303;8855:829;;;;;:::o;9690:114::-;9757:6;9791:5;9785:12;9775:22;;9690:114;;;:::o;9810:184::-;9909:11;9943:6;9938:3;9931:19;9983:4;9978:3;9974:14;9959:29;;9810:184;;;;:::o;10000:132::-;10067:4;10090:3;10082:11;;10120:4;10115:3;10111:14;10103:22;;10000:132;;;:::o;10138:108::-;10215:24;10233:5;10215:24;:::i;:::-;10210:3;10203:37;10138:108;;:::o;10252:179::-;10321:10;10342:46;10384:3;10376:6;10342:46;:::i;:::-;10420:4;10415:3;10411:14;10397:28;;10252:179;;;;:::o;10437:113::-;10507:4;10539;10534:3;10530:14;10522:22;;10437:113;;;:::o;10586:732::-;10705:3;10734:54;10782:5;10734:54;:::i;:::-;10804:86;10883:6;10878:3;10804:86;:::i;:::-;10797:93;;10914:56;10964:5;10914:56;:::i;:::-;10993:7;11024:1;11009:284;11034:6;11031:1;11028:13;11009:284;;;11110:6;11104:13;11137:63;11196:3;11181:13;11137:63;:::i;:::-;11130:70;;11223:60;11276:6;11223:60;:::i;:::-;11213:70;;11069:224;11056:1;11053;11049:9;11044:14;;11009:284;;;11013:14;11309:3;11302:10;;10710:608;;;10586:732;;;;:::o;11324:373::-;11467:4;11505:2;11494:9;11490:18;11482:26;;11554:9;11548:4;11544:20;11540:1;11529:9;11525:17;11518:47;11582:108;11685:4;11676:6;11582:108;:::i;:::-;11574:116;;11324:373;;;;:::o;11703:117::-;11812:1;11809;11802:12;11826:308;11888:4;11978:18;11970:6;11967:30;11964:56;;;12000:18;;:::i;:::-;11964:56;12038:29;12060:6;12038:29;:::i;:::-;12030:37;;12122:4;12116;12112:15;12104:23;;11826:308;;;:::o;12140:146::-;12237:6;12232:3;12227;12214:30;12278:1;12269:6;12264:3;12260:16;12253:27;12140:146;;;:::o;12292:425::-;12370:5;12395:66;12411:49;12453:6;12411:49;:::i;:::-;12395:66;:::i;:::-;12386:75;;12484:6;12477:5;12470:21;12522:4;12515:5;12511:16;12560:3;12551:6;12546:3;12542:16;12539:25;12536:112;;;12567:79;;:::i;:::-;12536:112;12657:54;12704:6;12699:3;12694;12657:54;:::i;:::-;12376:341;12292:425;;;;;:::o;12737:340::-;12793:5;12842:3;12835:4;12827:6;12823:17;12819:27;12809:122;;12850:79;;:::i;:::-;12809:122;12967:6;12954:20;12992:79;13067:3;13059:6;13052:4;13044:6;13040:17;12992:79;:::i;:::-;12983:88;;12799:278;12737:340;;;;:::o;13083:509::-;13152:6;13201:2;13189:9;13180:7;13176:23;13172:32;13169:119;;;13207:79;;:::i;:::-;13169:119;13355:1;13344:9;13340:17;13327:31;13385:18;13377:6;13374:30;13371:117;;;13407:79;;:::i;:::-;13371:117;13512:63;13567:7;13558:6;13547:9;13543:22;13512:63;:::i;:::-;13502:73;;13298:287;13083:509;;;;:::o;13598:311::-;13675:4;13765:18;13757:6;13754:30;13751:56;;;13787:18;;:::i;:::-;13751:56;13837:4;13829:6;13825:17;13817:25;;13897:4;13891;13887:15;13879:23;;13598:311;;;:::o;13932:710::-;14028:5;14053:81;14069:64;14126:6;14069:64;:::i;:::-;14053:81;:::i;:::-;14044:90;;14154:5;14183:6;14176:5;14169:21;14217:4;14210:5;14206:16;14199:23;;14270:4;14262:6;14258:17;14250:6;14246:30;14299:3;14291:6;14288:15;14285:122;;;14318:79;;:::i;:::-;14285:122;14433:6;14416:220;14450:6;14445:3;14442:15;14416:220;;;14525:3;14554:37;14587:3;14575:10;14554:37;:::i;:::-;14549:3;14542:50;14621:4;14616:3;14612:14;14605:21;;14492:144;14476:4;14471:3;14467:14;14460:21;;14416:220;;;14420:21;14034:608;;13932:710;;;;;:::o;14665:370::-;14736:5;14785:3;14778:4;14770:6;14766:17;14762:27;14752:122;;14793:79;;:::i;:::-;14752:122;14910:6;14897:20;14935:94;15025:3;15017:6;15010:4;15002:6;14998:17;14935:94;:::i;:::-;14926:103;;14742:293;14665:370;;;;:::o;15041:539::-;15125:6;15174:2;15162:9;15153:7;15149:23;15145:32;15142:119;;;15180:79;;:::i;:::-;15142:119;15328:1;15317:9;15313:17;15300:31;15358:18;15350:6;15347:30;15344:117;;;15380:79;;:::i;:::-;15344:117;15485:78;15555:7;15546:6;15535:9;15531:22;15485:78;:::i;:::-;15475:88;;15271:302;15041:539;;;;:::o;15586:121::-;15681:1;15674:5;15671:12;15661:40;;15697:1;15694;15687:12;15661:40;15586:121;:::o;15713:183::-;15781:5;15819:6;15806:20;15797:29;;15835:55;15884:5;15835:55;:::i;:::-;15713:183;;;;:::o;15902:373::-;15983:6;16032:2;16020:9;16011:7;16007:23;16003:32;16000:119;;;16038:79;;:::i;:::-;16000:119;16158:1;16183:75;16250:7;16241:6;16230:9;16226:22;16183:75;:::i;:::-;16173:85;;16129:139;15902:373;;;;:::o;16281:116::-;16351:21;16366:5;16351:21;:::i;:::-;16344:5;16341:32;16331:60;;16387:1;16384;16377:12;16331:60;16281:116;:::o;16403:133::-;16446:5;16484:6;16471:20;16462:29;;16500:30;16524:5;16500:30;:::i;:::-;16403:133;;;;:::o;16542:468::-;16607:6;16615;16664:2;16652:9;16643:7;16639:23;16635:32;16632:119;;;16670:79;;:::i;:::-;16632:119;16790:1;16815:53;16860:7;16851:6;16840:9;16836:22;16815:53;:::i;:::-;16805:63;;16761:117;16917:2;16943:50;16985:7;16976:6;16965:9;16961:22;16943:50;:::i;:::-;16933:60;;16888:115;16542:468;;;;;:::o;17016:118::-;17103:24;17121:5;17103:24;:::i;:::-;17098:3;17091:37;17016:118;;:::o;17140:222::-;17233:4;17271:2;17260:9;17256:18;17248:26;;17284:71;17352:1;17341:9;17337:17;17328:6;17284:71;:::i;:::-;17140:222;;;;:::o;17368:307::-;17429:4;17519:18;17511:6;17508:30;17505:56;;;17541:18;;:::i;:::-;17505:56;17579:29;17601:6;17579:29;:::i;:::-;17571:37;;17663:4;17657;17653:15;17645:23;;17368:307;;;:::o;17681:423::-;17758:5;17783:65;17799:48;17840:6;17799:48;:::i;:::-;17783:65;:::i;:::-;17774:74;;17871:6;17864:5;17857:21;17909:4;17902:5;17898:16;17947:3;17938:6;17933:3;17929:16;17926:25;17923:112;;;17954:79;;:::i;:::-;17923:112;18044:54;18091:6;18086:3;18081;18044:54;:::i;:::-;17764:340;17681:423;;;;;:::o;18123:338::-;18178:5;18227:3;18220:4;18212:6;18208:17;18204:27;18194:122;;18235:79;;:::i;:::-;18194:122;18352:6;18339:20;18377:78;18451:3;18443:6;18436:4;18428:6;18424:17;18377:78;:::i;:::-;18368:87;;18184:277;18123:338;;;;:::o;18467:943::-;18562:6;18570;18578;18586;18635:3;18623:9;18614:7;18610:23;18606:33;18603:120;;;18642:79;;:::i;:::-;18603:120;18762:1;18787:53;18832:7;18823:6;18812:9;18808:22;18787:53;:::i;:::-;18777:63;;18733:117;18889:2;18915:53;18960:7;18951:6;18940:9;18936:22;18915:53;:::i;:::-;18905:63;;18860:118;19017:2;19043:53;19088:7;19079:6;19068:9;19064:22;19043:53;:::i;:::-;19033:63;;18988:118;19173:2;19162:9;19158:18;19145:32;19204:18;19196:6;19193:30;19190:117;;;19226:79;;:::i;:::-;19190:117;19331:62;19385:7;19376:6;19365:9;19361:22;19331:62;:::i;:::-;19321:72;;19116:287;18467:943;;;;;;;:::o;19416:329::-;19475:6;19524:2;19512:9;19503:7;19499:23;19495:32;19492:119;;;19530:79;;:::i;:::-;19492:119;19650:1;19675:53;19720:7;19711:6;19700:9;19696:22;19675:53;:::i;:::-;19665:63;;19621:117;19416:329;;;;:::o;19751:474::-;19819:6;19827;19876:2;19864:9;19855:7;19851:23;19847:32;19844:119;;;19882:79;;:::i;:::-;19844:119;20002:1;20027:53;20072:7;20063:6;20052:9;20048:22;20027:53;:::i;:::-;20017:63;;19973:117;20129:2;20155:53;20200:7;20191:6;20180:9;20176:22;20155:53;:::i;:::-;20145:63;;20100:118;19751:474;;;;;:::o;20231:180::-;20279:77;20276:1;20269:88;20376:4;20373:1;20366:15;20400:4;20397:1;20390:15;20417:127;20512:1;20505:5;20502:12;20492:46;;20518:18;;:::i;:::-;20492:46;20417:127;:::o;20550:155::-;20609:7;20638:5;20627:16;;20644:55;20693:5;20644:55;:::i;:::-;20550:155;;;:::o;20711:::-;20781:9;20814:46;20854:5;20814:46;:::i;:::-;20801:59;;20711:155;;;:::o;20872:171::-;20979:57;21030:5;20979:57;:::i;:::-;20974:3;20967:70;20872:171;;:::o;21049:262::-;21162:4;21200:2;21189:9;21185:18;21177:26;;21213:91;21301:1;21290:9;21286:17;21277:6;21213:91;:::i;:::-;21049:262;;;;:::o;21317:474::-;21385:6;21393;21442:2;21430:9;21421:7;21417:23;21413:32;21410:119;;;21448:79;;:::i;:::-;21410:119;21568:1;21593:53;21638:7;21629:6;21618:9;21614:22;21593:53;:::i;:::-;21583:63;;21539:117;21695:2;21721:53;21766:7;21757:6;21746:9;21742:22;21721:53;:::i;:::-;21711:63;;21666:118;21317:474;;;;;:::o;21797:::-;21865:6;21873;21922:2;21910:9;21901:7;21897:23;21893:32;21890:119;;;21928:79;;:::i;:::-;21890:119;22048:1;22073:53;22118:7;22109:6;22098:9;22094:22;22073:53;:::i;:::-;22063:63;;22019:117;22175:2;22201:53;22246:7;22237:6;22226:9;22222:22;22201:53;:::i;:::-;22191:63;;22146:118;21797:474;;;;;:::o;22277:180::-;22325:77;22322:1;22315:88;22422:4;22419:1;22412:15;22446:4;22443:1;22436:15;22463:320;22507:6;22544:1;22538:4;22534:12;22524:22;;22591:1;22585:4;22581:12;22612:18;22602:81;;22668:4;22660:6;22656:17;22646:27;;22602:81;22730:2;22722:6;22719:14;22699:18;22696:38;22693:84;;22749:18;;:::i;:::-;22693:84;22514:269;22463:320;;;:::o;22789:157::-;22929:9;22925:1;22917:6;22913:14;22906:33;22789:157;:::o;22952:365::-;23094:3;23115:66;23179:1;23174:3;23115:66;:::i;:::-;23108:73;;23190:93;23279:3;23190:93;:::i;:::-;23308:2;23303:3;23299:12;23292:19;;22952:365;;;:::o;23323:419::-;23489:4;23527:2;23516:9;23512:18;23504:26;;23576:9;23570:4;23566:20;23562:1;23551:9;23547:17;23540:47;23604:131;23730:4;23604:131;:::i;:::-;23596:139;;23323:419;;;:::o;23748:165::-;23888:17;23884:1;23876:6;23872:14;23865:41;23748:165;:::o;23919:366::-;24061:3;24082:67;24146:2;24141:3;24082:67;:::i;:::-;24075:74;;24158:93;24247:3;24158:93;:::i;:::-;24276:2;24271:3;24267:12;24260:19;;23919:366;;;:::o;24291:419::-;24457:4;24495:2;24484:9;24480:18;24472:26;;24544:9;24538:4;24534:20;24530:1;24519:9;24515:17;24508:47;24572:131;24698:4;24572:131;:::i;:::-;24564:139;;24291:419;;;:::o;24716:169::-;24856:21;24852:1;24844:6;24840:14;24833:45;24716:169;:::o;24891:366::-;25033:3;25054:67;25118:2;25113:3;25054:67;:::i;:::-;25047:74;;25130:93;25219:3;25130:93;:::i;:::-;25248:2;25243:3;25239:12;25232:19;;24891:366;;;:::o;25263:419::-;25429:4;25467:2;25456:9;25452:18;25444:26;;25516:9;25510:4;25506:20;25502:1;25491:9;25487:17;25480:47;25544:131;25670:4;25544:131;:::i;:::-;25536:139;;25263:419;;;:::o;25688:180::-;25736:77;25733:1;25726:88;25833:4;25830:1;25823:15;25857:4;25854:1;25847:15;25874:191;25914:3;25933:20;25951:1;25933:20;:::i;:::-;25928:25;;25967:20;25985:1;25967:20;:::i;:::-;25962:25;;26010:1;26007;26003:9;25996:16;;26031:3;26028:1;26025:10;26022:36;;;26038:18;;:::i;:::-;26022:36;25874:191;;;;:::o;26071:169::-;26211:21;26207:1;26199:6;26195:14;26188:45;26071:169;:::o;26246:366::-;26388:3;26409:67;26473:2;26468:3;26409:67;:::i;:::-;26402:74;;26485:93;26574:3;26485:93;:::i;:::-;26603:2;26598:3;26594:12;26587:19;;26246:366;;;:::o;26618:419::-;26784:4;26822:2;26811:9;26807:18;26799:26;;26871:9;26865:4;26861:20;26857:1;26846:9;26842:17;26835:47;26899:131;27025:4;26899:131;:::i;:::-;26891:139;;26618:419;;;:::o;27043:170::-;27183:22;27179:1;27171:6;27167:14;27160:46;27043:170;:::o;27219:366::-;27361:3;27382:67;27446:2;27441:3;27382:67;:::i;:::-;27375:74;;27458:93;27547:3;27458:93;:::i;:::-;27576:2;27571:3;27567:12;27560:19;;27219:366;;;:::o;27591:419::-;27757:4;27795:2;27784:9;27780:18;27772:26;;27844:9;27838:4;27834:20;27830:1;27819:9;27815:17;27808:47;27872:131;27998:4;27872:131;:::i;:::-;27864:139;;27591:419;;;:::o;28016:173::-;28156:25;28152:1;28144:6;28140:14;28133:49;28016:173;:::o;28195:366::-;28337:3;28358:67;28422:2;28417:3;28358:67;:::i;:::-;28351:74;;28434:93;28523:3;28434:93;:::i;:::-;28552:2;28547:3;28543:12;28536:19;;28195:366;;;:::o;28567:419::-;28733:4;28771:2;28760:9;28756:18;28748:26;;28820:9;28814:4;28810:20;28806:1;28795:9;28791:17;28784:47;28848:131;28974:4;28848:131;:::i;:::-;28840:139;;28567:419;;;:::o;28992:410::-;29032:7;29055:20;29073:1;29055:20;:::i;:::-;29050:25;;29089:20;29107:1;29089:20;:::i;:::-;29084:25;;29144:1;29141;29137:9;29166:30;29184:11;29166:30;:::i;:::-;29155:41;;29345:1;29336:7;29332:15;29329:1;29326:22;29306:1;29299:9;29279:83;29256:139;;29375:18;;:::i;:::-;29256:139;29040:362;28992:410;;;;:::o;29408:168::-;29548:20;29544:1;29536:6;29532:14;29525:44;29408:168;:::o;29582:366::-;29724:3;29745:67;29809:2;29804:3;29745:67;:::i;:::-;29738:74;;29821:93;29910:3;29821:93;:::i;:::-;29939:2;29934:3;29930:12;29923:19;;29582:366;;;:::o;29954:419::-;30120:4;30158:2;30147:9;30143:18;30135:26;;30207:9;30201:4;30197:20;30193:1;30182:9;30178:17;30171:47;30235:131;30361:4;30235:131;:::i;:::-;30227:139;;29954:419;;;:::o;30379:173::-;30519:25;30515:1;30507:6;30503:14;30496:49;30379:173;:::o;30558:366::-;30700:3;30721:67;30785:2;30780:3;30721:67;:::i;:::-;30714:74;;30797:93;30886:3;30797:93;:::i;:::-;30915:2;30910:3;30906:12;30899:19;;30558:366;;;:::o;30930:419::-;31096:4;31134:2;31123:9;31119:18;31111:26;;31183:9;31177:4;31173:20;31169:1;31158:9;31154:17;31147:47;31211:131;31337:4;31211:131;:::i;:::-;31203:139;;30930:419;;;:::o;31355:170::-;31495:22;31491:1;31483:6;31479:14;31472:46;31355:170;:::o;31531:366::-;31673:3;31694:67;31758:2;31753:3;31694:67;:::i;:::-;31687:74;;31770:93;31859:3;31770:93;:::i;:::-;31888:2;31883:3;31879:12;31872:19;;31531:366;;;:::o;31903:419::-;32069:4;32107:2;32096:9;32092:18;32084:26;;32156:9;32150:4;32146:20;32142:1;32131:9;32127:17;32120:47;32184:131;32310:4;32184:131;:::i;:::-;32176:139;;31903:419;;;:::o;32328:163::-;32468:15;32464:1;32456:6;32452:14;32445:39;32328:163;:::o;32497:366::-;32639:3;32660:67;32724:2;32719:3;32660:67;:::i;:::-;32653:74;;32736:93;32825:3;32736:93;:::i;:::-;32854:2;32849:3;32845:12;32838:19;;32497:366;;;:::o;32869:419::-;33035:4;33073:2;33062:9;33058:18;33050:26;;33122:9;33116:4;33112:20;33108:1;33097:9;33093:17;33086:47;33150:131;33276:4;33150:131;:::i;:::-;33142:139;;32869:419;;;:::o;33294:169::-;33434:21;33430:1;33422:6;33418:14;33411:45;33294:169;:::o;33469:366::-;33611:3;33632:67;33696:2;33691:3;33632:67;:::i;:::-;33625:74;;33708:93;33797:3;33708:93;:::i;:::-;33826:2;33821:3;33817:12;33810:19;;33469:366;;;:::o;33841:419::-;34007:4;34045:2;34034:9;34030:18;34022:26;;34094:9;34088:4;34084:20;34080:1;34069:9;34065:17;34058:47;34122:131;34248:4;34122:131;:::i;:::-;34114:139;;33841:419;;;:::o;34266:147::-;34367:11;34404:3;34389:18;;34266:147;;;;:::o;34419:114::-;;:::o;34539:398::-;34698:3;34719:83;34800:1;34795:3;34719:83;:::i;:::-;34712:90;;34811:93;34900:3;34811:93;:::i;:::-;34929:1;34924:3;34920:11;34913:18;;34539:398;;;:::o;34943:379::-;35127:3;35149:147;35292:3;35149:147;:::i;:::-;35142:154;;35313:3;35306:10;;34943:379;;;:::o;35328:165::-;35468:17;35464:1;35456:6;35452:14;35445:41;35328:165;:::o;35499:366::-;35641:3;35662:67;35726:2;35721:3;35662:67;:::i;:::-;35655:74;;35738:93;35827:3;35738:93;:::i;:::-;35856:2;35851:3;35847:12;35840:19;;35499:366;;;:::o;35871:419::-;36037:4;36075:2;36064:9;36060:18;36052:26;;36124:9;36118:4;36114:20;36110:1;36099:9;36095:17;36088:47;36152:131;36278:4;36152:131;:::i;:::-;36144:139;;35871:419;;;:::o;36296:180::-;36344:77;36341:1;36334:88;36441:4;36438:1;36431:15;36465:4;36462:1;36455:15;36482:233;36521:3;36544:24;36562:5;36544:24;:::i;:::-;36535:33;;36590:66;36583:5;36580:77;36577:103;;36660:18;;:::i;:::-;36577:103;36707:1;36700:5;36696:13;36689:20;;36482:233;;;:::o;36721:141::-;36770:4;36793:3;36785:11;;36816:3;36813:1;36806:14;36850:4;36847:1;36837:18;36829:26;;36721:141;;;:::o;36868:93::-;36905:6;36952:2;36947;36940:5;36936:14;36932:23;36922:33;;36868:93;;;:::o;36967:107::-;37011:8;37061:5;37055:4;37051:16;37030:37;;36967:107;;;;:::o;37080:393::-;37149:6;37199:1;37187:10;37183:18;37222:97;37252:66;37241:9;37222:97;:::i;:::-;37340:39;37370:8;37359:9;37340:39;:::i;:::-;37328:51;;37412:4;37408:9;37401:5;37397:21;37388:30;;37461:4;37451:8;37447:19;37440:5;37437:30;37427:40;;37156:317;;37080:393;;;;;:::o;37479:60::-;37507:3;37528:5;37521:12;;37479:60;;;:::o;37545:142::-;37595:9;37628:53;37646:34;37655:24;37673:5;37655:24;:::i;:::-;37646:34;:::i;:::-;37628:53;:::i;:::-;37615:66;;37545:142;;;:::o;37693:75::-;37736:3;37757:5;37750:12;;37693:75;;;:::o;37774:269::-;37884:39;37915:7;37884:39;:::i;:::-;37945:91;37994:41;38018:16;37994:41;:::i;:::-;37986:6;37979:4;37973:11;37945:91;:::i;:::-;37939:4;37932:105;37850:193;37774:269;;;:::o;38049:73::-;38094:3;38049:73;:::o;38128:189::-;38205:32;;:::i;:::-;38246:65;38304:6;38296;38290:4;38246:65;:::i;:::-;38181:136;38128:189;;:::o;38323:186::-;38383:120;38400:3;38393:5;38390:14;38383:120;;;38454:39;38491:1;38484:5;38454:39;:::i;:::-;38427:1;38420:5;38416:13;38407:22;;38383:120;;;38323:186;;:::o;38515:543::-;38616:2;38611:3;38608:11;38605:446;;;38650:38;38682:5;38650:38;:::i;:::-;38734:29;38752:10;38734:29;:::i;:::-;38724:8;38720:44;38917:2;38905:10;38902:18;38899:49;;;38938:8;38923:23;;38899:49;38961:80;39017:22;39035:3;39017:22;:::i;:::-;39007:8;39003:37;38990:11;38961:80;:::i;:::-;38620:431;;38605:446;38515:543;;;:::o;39064:117::-;39118:8;39168:5;39162:4;39158:16;39137:37;;39064:117;;;;:::o;39187:169::-;39231:6;39264:51;39312:1;39308:6;39300:5;39297:1;39293:13;39264:51;:::i;:::-;39260:56;39345:4;39339;39335:15;39325:25;;39238:118;39187:169;;;;:::o;39361:295::-;39437:4;39583:29;39608:3;39602:4;39583:29;:::i;:::-;39575:37;;39645:3;39642:1;39638:11;39632:4;39629:21;39621:29;;39361:295;;;;:::o;39661:1395::-;39778:37;39811:3;39778:37;:::i;:::-;39880:18;39872:6;39869:30;39866:56;;;39902:18;;:::i;:::-;39866:56;39946:38;39978:4;39972:11;39946:38;:::i;:::-;40031:67;40091:6;40083;40077:4;40031:67;:::i;:::-;40125:1;40149:4;40136:17;;40181:2;40173:6;40170:14;40198:1;40193:618;;;;40855:1;40872:6;40869:77;;;40921:9;40916:3;40912:19;40906:26;40897:35;;40869:77;40972:67;41032:6;41025:5;40972:67;:::i;:::-;40966:4;40959:81;40828:222;40163:887;;40193:618;40245:4;40241:9;40233:6;40229:22;40279:37;40311:4;40279:37;:::i;:::-;40338:1;40352:208;40366:7;40363:1;40360:14;40352:208;;;40445:9;40440:3;40436:19;40430:26;40422:6;40415:42;40496:1;40488:6;40484:14;40474:24;;40543:2;40532:9;40528:18;40515:31;;40389:4;40386:1;40382:12;40377:17;;40352:208;;;40588:6;40579:7;40576:19;40573:179;;;40646:9;40641:3;40637:19;40631:26;40689:48;40731:4;40723:6;40719:17;40708:9;40689:48;:::i;:::-;40681:6;40674:64;40596:156;40573:179;40798:1;40794;40786:6;40782:14;40778:22;40772:4;40765:36;40200:611;;;40163:887;;39753:1303;;;39661:1395;;:::o;41062:176::-;41202:28;41198:1;41190:6;41186:14;41179:52;41062:176;:::o;41244:366::-;41386:3;41407:67;41471:2;41466:3;41407:67;:::i;:::-;41400:74;;41483:93;41572:3;41483:93;:::i;:::-;41601:2;41596:3;41592:12;41585:19;;41244:366;;;:::o;41616:419::-;41782:4;41820:2;41809:9;41805:18;41797:26;;41869:9;41863:4;41859:20;41855:1;41844:9;41840:17;41833:47;41897:131;42023:4;41897:131;:::i;:::-;41889:139;;41616:419;;;:::o;42041:177::-;42181:29;42177:1;42169:6;42165:14;42158:53;42041:177;:::o;42224:366::-;42366:3;42387:67;42451:2;42446:3;42387:67;:::i;:::-;42380:74;;42463:93;42552:3;42463:93;:::i;:::-;42581:2;42576:3;42572:12;42565:19;;42224:366;;;:::o;42596:419::-;42762:4;42800:2;42789:9;42785:18;42777:26;;42849:9;42843:4;42839:20;42835:1;42824:9;42820:17;42813:47;42877:131;43003:4;42877:131;:::i;:::-;42869:139;;42596:419;;;:::o;43021:166::-;43161:18;43157:1;43149:6;43145:14;43138:42;43021:166;:::o;43193:366::-;43335:3;43356:67;43420:2;43415:3;43356:67;:::i;:::-;43349:74;;43432:93;43521:3;43432:93;:::i;:::-;43550:2;43545:3;43541:12;43534:19;;43193:366;;;:::o;43565:419::-;43731:4;43769:2;43758:9;43754:18;43746:26;;43818:9;43812:4;43808:20;43804:1;43793:9;43789:17;43782:47;43846:131;43972:4;43846:131;:::i;:::-;43838:139;;43565:419;;;:::o;43990:176::-;44130:28;44126:1;44118:6;44114:14;44107:52;43990:176;:::o;44172:366::-;44314:3;44335:67;44399:2;44394:3;44335:67;:::i;:::-;44328:74;;44411:93;44500:3;44411:93;:::i;:::-;44529:2;44524:3;44520:12;44513:19;;44172:366;;;:::o;44544:419::-;44710:4;44748:2;44737:9;44733:18;44725:26;;44797:9;44791:4;44787:20;44783:1;44772:9;44768:17;44761:47;44825:131;44951:4;44825:131;:::i;:::-;44817:139;;44544:419;;;:::o;44969:163::-;45109:15;45105:1;45097:6;45093:14;45086:39;44969:163;:::o;45138:366::-;45280:3;45301:67;45365:2;45360:3;45301:67;:::i;:::-;45294:74;;45377:93;45466:3;45377:93;:::i;:::-;45495:2;45490:3;45486:12;45479:19;;45138:366;;;:::o;45510:419::-;45676:4;45714:2;45703:9;45699:18;45691:26;;45763:9;45757:4;45753:20;45749:1;45738:9;45734:17;45727:47;45791:131;45917:4;45791:131;:::i;:::-;45783:139;;45510:419;;;:::o;45935:194::-;45975:4;45995:20;46013:1;45995:20;:::i;:::-;45990:25;;46029:20;46047:1;46029:20;:::i;:::-;46024:25;;46073:1;46070;46066:9;46058:17;;46097:1;46091:4;46088:11;46085:37;;;46102:18;;:::i;:::-;46085:37;45935:194;;;;:::o;46135:162::-;46275:14;46271:1;46263:6;46259:14;46252:38;46135:162;:::o;46303:366::-;46445:3;46466:67;46530:2;46525:3;46466:67;:::i;:::-;46459:74;;46542:93;46631:3;46542:93;:::i;:::-;46660:2;46655:3;46651:12;46644:19;;46303:366;;;:::o;46675:419::-;46841:4;46879:2;46868:9;46864:18;46856:26;;46928:9;46922:4;46918:20;46914:1;46903:9;46899:17;46892:47;46956:131;47082:4;46956:131;:::i;:::-;46948:139;;46675:419;;;:::o;47100:79::-;47139:7;47168:5;47157:16;;47100:79;;;:::o;47185:157::-;47290:45;47310:24;47328:5;47310:24;:::i;:::-;47290:45;:::i;:::-;47285:3;47278:58;47185:157;;:::o;47348:256::-;47460:3;47475:75;47546:3;47537:6;47475:75;:::i;:::-;47575:2;47570:3;47566:12;47559:19;;47595:3;47588:10;;47348:256;;;;:::o;47610:94::-;47643:8;47691:5;47687:2;47683:14;47662:35;;47610:94;;;:::o;47710:::-;47749:7;47778:20;47792:5;47778:20;:::i;:::-;47767:31;;47710:94;;;:::o;47810:100::-;47849:7;47878:26;47898:5;47878:26;:::i;:::-;47867:37;;47810:100;;;:::o;47916:157::-;48021:45;48041:24;48059:5;48041:24;:::i;:::-;48021:45;:::i;:::-;48016:3;48009:58;47916:157;;:::o;48079:256::-;48191:3;48206:75;48277:3;48268:6;48206:75;:::i;:::-;48306:2;48301:3;48297:12;48290:19;;48326:3;48319:10;;48079:256;;;;:::o;48341:397::-;48481:3;48496:75;48567:3;48558:6;48496:75;:::i;:::-;48596:2;48591:3;48587:12;48580:19;;48609:75;48680:3;48671:6;48609:75;:::i;:::-;48709:2;48704:3;48700:12;48693:19;;48729:3;48722:10;;48341:397;;;;;:::o;48744:234::-;48884:34;48880:1;48872:6;48868:14;48861:58;48953:17;48948:2;48940:6;48936:15;48929:42;48744:234;:::o;48984:366::-;49126:3;49147:67;49211:2;49206:3;49147:67;:::i;:::-;49140:74;;49223:93;49312:3;49223:93;:::i;:::-;49341:2;49336:3;49332:12;49325:19;;48984:366;;;:::o;49356:419::-;49522:4;49560:2;49549:9;49545:18;49537:26;;49609:9;49603:4;49599:20;49595:1;49584:9;49580:17;49573:47;49637:131;49763:4;49637:131;:::i;:::-;49629:139;;49356:419;;;:::o;49781:148::-;49883:11;49920:3;49905:18;;49781:148;;;;:::o;49935:390::-;50041:3;50069:39;50102:5;50069:39;:::i;:::-;50124:89;50206:6;50201:3;50124:89;:::i;:::-;50117:96;;50222:65;50280:6;50275:3;50268:4;50261:5;50257:16;50222:65;:::i;:::-;50312:6;50307:3;50303:16;50296:23;;50045:280;49935:390;;;;:::o;50331:155::-;50471:7;50467:1;50459:6;50455:14;50448:31;50331:155;:::o;50492:400::-;50652:3;50673:84;50755:1;50750:3;50673:84;:::i;:::-;50666:91;;50766:93;50855:3;50766:93;:::i;:::-;50884:1;50879:3;50875:11;50868:18;;50492:400;;;:::o;50898:701::-;51179:3;51201:95;51292:3;51283:6;51201:95;:::i;:::-;51194:102;;51313:95;51404:3;51395:6;51313:95;:::i;:::-;51306:102;;51425:148;51569:3;51425:148;:::i;:::-;51418:155;;51590:3;51583:10;;50898:701;;;;;:::o;51605:173::-;51745:25;51741:1;51733:6;51729:14;51722:49;51605:173;:::o;51784:366::-;51926:3;51947:67;52011:2;52006:3;51947:67;:::i;:::-;51940:74;;52023:93;52112:3;52023:93;:::i;:::-;52141:2;52136:3;52132:12;52125:19;;51784:366;;;:::o;52156:419::-;52322:4;52360:2;52349:9;52345:18;52337:26;;52409:9;52403:4;52399:20;52395:1;52384:9;52380:17;52373:47;52437:131;52563:4;52437:131;:::i;:::-;52429:139;;52156:419;;;:::o;52581:225::-;52721:34;52717:1;52709:6;52705:14;52698:58;52790:8;52785:2;52777:6;52773:15;52766:33;52581:225;:::o;52812:366::-;52954:3;52975:67;53039:2;53034:3;52975:67;:::i;:::-;52968:74;;53051:93;53140:3;53051:93;:::i;:::-;53169:2;53164:3;53160:12;53153:19;;52812:366;;;:::o;53184:419::-;53350:4;53388:2;53377:9;53373:18;53365:26;;53437:9;53431:4;53427:20;53423:1;53412:9;53408:17;53401:47;53465:131;53591:4;53465:131;:::i;:::-;53457:139;;53184:419;;;:::o;53609:182::-;53749:34;53745:1;53737:6;53733:14;53726:58;53609:182;:::o;53797:366::-;53939:3;53960:67;54024:2;54019:3;53960:67;:::i;:::-;53953:74;;54036:93;54125:3;54036:93;:::i;:::-;54154:2;54149:3;54145:12;54138:19;;53797:366;;;:::o;54169:419::-;54335:4;54373:2;54362:9;54358:18;54350:26;;54422:9;54416:4;54412:20;54408:1;54397:9;54393:17;54386:47;54450:131;54576:4;54450:131;:::i;:::-;54442:139;;54169:419;;;:::o;54594:181::-;54734:33;54730:1;54722:6;54718:14;54711:57;54594:181;:::o;54781:366::-;54923:3;54944:67;55008:2;55003:3;54944:67;:::i;:::-;54937:74;;55020:93;55109:3;55020:93;:::i;:::-;55138:2;55133:3;55129:12;55122:19;;54781:366;;;:::o;55153:419::-;55319:4;55357:2;55346:9;55342:18;55334:26;;55406:9;55400:4;55396:20;55392:1;55381:9;55377:17;55370:47;55434:131;55560:4;55434:131;:::i;:::-;55426:139;;55153:419;;;:::o;55578:98::-;55629:6;55663:5;55657:12;55647:22;;55578:98;;;:::o;55682:168::-;55765:11;55799:6;55794:3;55787:19;55839:4;55834:3;55830:14;55815:29;;55682:168;;;;:::o;55856:373::-;55942:3;55970:38;56002:5;55970:38;:::i;:::-;56024:70;56087:6;56082:3;56024:70;:::i;:::-;56017:77;;56103:65;56161:6;56156:3;56149:4;56142:5;56138:16;56103:65;:::i;:::-;56193:29;56215:6;56193:29;:::i;:::-;56188:3;56184:39;56177:46;;55946:283;55856:373;;;;:::o;56235:640::-;56430:4;56468:3;56457:9;56453:19;56445:27;;56482:71;56550:1;56539:9;56535:17;56526:6;56482:71;:::i;:::-;56563:72;56631:2;56620:9;56616:18;56607:6;56563:72;:::i;:::-;56645;56713:2;56702:9;56698:18;56689:6;56645:72;:::i;:::-;56764:9;56758:4;56754:20;56749:2;56738:9;56734:18;56727:48;56792:76;56863:4;56854:6;56792:76;:::i;:::-;56784:84;;56235:640;;;;;;;:::o;56881:141::-;56937:5;56968:6;56962:13;56953:22;;56984:32;57010:5;56984:32;:::i;:::-;56881:141;;;;:::o;57028:349::-;57097:6;57146:2;57134:9;57125:7;57121:23;57117:32;57114:119;;;57152:79;;:::i;:::-;57114:119;57272:1;57297:63;57352:7;57343:6;57332:9;57328:22;57297:63;:::i;:::-;57287:73;;57243:127;57028:349;;;;:::o;57383:180::-;57431:77;57428:1;57421:88;57528:4;57525:1;57518:15;57552:4;57549:1;57542:15;57569:185;57609:1;57626:20;57644:1;57626:20;:::i;:::-;57621:25;;57660:20;57678:1;57660:20;:::i;:::-;57655:25;;57699:1;57689:35;;57704:18;;:::i;:::-;57689:35;57746:1;57743;57739:9;57734:14;;57569:185;;;;:::o;57760:176::-;57792:1;57809:20;57827:1;57809:20;:::i;:::-;57804:25;;57843:20;57861:1;57843:20;:::i;:::-;57838:25;;57882:1;57872:35;;57887:18;;:::i;:::-;57872:35;57928:1;57925;57921:9;57916:14;;57760:176;;;;:::o

Swarm Source

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