ETH Price: $3,628.57 (-6.81%)

FUDibles Season 1 (FUDibles-S1)
 

Overview

TokenID

82

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

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:
FUDiblesS1

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 2022-12-20
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// 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/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * 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.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
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 simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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 sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _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}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _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: FUDibles.sol


pragma solidity 0.8.17;

/// @author Viv0002




contract FUDiblesS1 is ERC721A, ERC2981 {

    enum MintState {
        PAUSED,
        ALLOWLIST,
        PUBLIC,
        ENDED
    }
    
    MintState public state = MintState.PAUSED;

    uint256 mintcost = 0.06 ether;
    uint256 public maxSupply = 351;
    uint256 public maxMint = 2;
    bytes32 public whitelistMerkleRoot;
    string public tokenUriBase = "http://metadata.mintfud.com:3333/season1/";
    mapping(address => bool) public freeminted;
    uint256[] public round1tokens = new uint256[](100);
    uint256[] public round2tokens = new uint256[](50);
    uint256[] public round3tokens = new uint256[](10);
    uint256[] public round4tokens = new uint256[](2);
    uint256 public winner;
    address public lotteryPicker = 0x7DE56813aF4D33555B44dd6C5A542cedb59B761E;
    address public owner;
    uint256[] ids = new uint256[](50);
    uint256[] ids2 = new uint256[](10);

    constructor() ERC721A("FUDibles Season 1", "FUDibles-S1") {
        owner = msg.sender;
        _setDefaultRoyalty(owner, 750);
    }

    // OVERRIDES
    function _startTokenId() internal view virtual override returns (uint256) {
        return 0;
    }

    // MODIFIERS
    modifier mintCompliance(uint256 _mintAmount, uint256 _freemints) {
        require(_freemints <= 1, "Too many free mints");
        require(
            _mintAmount > 0 && _mintAmount <= (maxMint + _freemints),
            "Invalid mint amount"
        );
        require(
            totalSupply() + _mintAmount <= maxSupply,
            "Max supply exceeded"
        );
        _;
    }

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

    modifier authz(){
        require(msg.sender == owner || msg.sender == lotteryPicker, "Not authorized");
        _;
    }

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

    function _leaf(address account, uint256 freemints)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(bytes.concat(keccak256(abi.encode(account, freemints))));
    }

    // MINTING FUNCTIONS

    function mint(uint256 amount) public payable mintCompliance(amount, 0) {
        require(state == MintState.PUBLIC, "Public mint is not available yet");
        require (amount <= 5, "Too many mints per transaction requested");
        require(msg.value >= mintcost * amount, "Insufficient funds");

        _safeMint(msg.sender, amount);
    }

    function ALMint(
        uint256 amount, 
        uint256 freemints,
        bytes32[] calldata proof
        ) public payable mintCompliance(amount, freemints) {
    require(state == MintState.ALLOWLIST, "AllowList mint is not available yet");
    require(
            numberMinted(msg.sender) + amount <= (maxMint + freemints),
            "Exceeds allowed number of mints"
        );
    
    require(msg.value >= mintcost * (amount - freemints), "Insufficient funds");

    require(_verify(_leaf(msg.sender, freemints), proof), "Invalid proof");

    if (freemints > 0 && msg.value < (amount * mintcost)) {
        require (freeminted[msg.sender]!=true, "Free mint already claimed");
        freeminted[msg.sender] = true;
    }

    _safeMint(msg.sender, amount);
    }

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

    // GETTERS
    function numberMinted(address _minter) public view returns (uint256) {
        return _numberMinted(_minter);
    }

    function tokenURI(
        uint256 tokenId
    ) public view override returns (string memory) {
        return string(abi.encodePacked(tokenUriBase, _toString(tokenId), ".json"));
    }

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

    // SETTERS
    function setState(MintState _state) public onlyOwner {
        state = _state;
    }

    function changeCost(uint256 _newcost) public onlyOwner {
        require(_newcost >= 0.05 ether, "Cost too low");
        mintcost = _newcost;
    }

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        require(_maxSupply < maxSupply, "Cannot increase the supply");
        maxSupply = _maxSupply;
    }

    function setMaxMint(uint256 _maxMint) public onlyOwner {
        maxMint = _maxMint;
    }

    function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot)
        external
        onlyOwner
    {
        whitelistMerkleRoot = _whitelistMerkleRoot;
    }

    function setTokenURI(string memory newUriBase) external onlyOwner {
        tokenUriBase = newUriBase;
    }

    function changeOwner(address _newOwner) external onlyOwner {
        owner = _newOwner;
    }

    function changeLotteryAddr(address _newLotAdd) external onlyOwner {
        lotteryPicker = _newLotAdd;
    }

    // RAFFLE

    function setR1tokens(uint256[] calldata _tokens) public authz {
        require(_tokens.length == round1tokens.length, "Bad Data");
        round1tokens = _tokens;
    }

    function setR2tokens(uint256[] calldata _tokens) public authz {
        require(_tokens.length == round2tokens.length, "Bad Data");
        round2tokens = _tokens;
    }

    function round3pick(string calldata _random) public authz{
        uint256 randomhash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _random)));
        uint256 id;
        for (uint i = 0; i < 10; i++){
            uint256 randomIndex = randomhash % ids.length;
            if (ids[randomIndex] != 0) {
            id = ids[randomIndex];
            } else {
            id = randomIndex;
            }

            if (ids[ids.length - 1] == 0) {
            ids[randomIndex] = ids.length - 1;
            } else {
            ids[randomIndex] = ids[ids.length - 1];
            }
            ids.pop();
            round3tokens[i] = round2tokens[id];
    }
    }

    function round4pick(string calldata _random) public authz{
        uint256 randomhash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _random)));
        uint256 id;
        for (uint i = 0; i < 2; i++){
            uint256 randomIndex = randomhash % ids2.length;
            if (ids2[randomIndex] != 0) {
            id = ids2[randomIndex];
            } else {
            id = randomIndex;
            }

            if (ids2[ids2.length - 1] == 0) {
            ids2[randomIndex] = ids2.length - 1;
            } else {
            ids2[randomIndex] = ids2[ids2.length - 1];
            }
            ids2.pop();
            round4tokens[i] = round3tokens[id];
    }
    }

    function round5pick(string calldata _random) public authz{
        uint256 maxStatValue = 2;
        uint256 randomHash = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, _random)));
        uint256 _pick = randomHash % maxStatValue;
        winner = round4tokens[_pick];
    }

    function getR1tokens() public view returns(uint256[] memory){
        return round1tokens;
    }

    function getR2tokens() public view returns(uint256[] memory){
        return round2tokens;
    }

    function getR3tokens() public view returns(uint256[] memory){
        return round3tokens;
    }

    function getR4tokens() public view returns(uint256[] memory){
        return round4tokens;
    }

    // 2981

    function setDefaultRoyalty(address receiver, uint96 feeNumerator)
    external
    onlyOwner
    {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

   function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721A, ERC2981)
    returns (bool)
     {
        return super.supportsInterface(interfaceId);
    }   

    // WITHDRAW

    function withdraw() public onlyOwner {
        uint256 contractBalance = address(this).balance;
        bool success = true;

        (success, ) = payable(owner).call{
            value: contractBalance}("");
        require(success, "Transfer failed");

    }
}

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":"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":"amount","type":"uint256"},{"internalType":"uint256","name":"freemints","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"ALMint","outputs":[],"stateMutability":"payable","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":"uint256","name":"_newcost","type":"uint256"}],"name":"changeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newLotAdd","type":"address"}],"name":"changeLotteryAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeminted","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":"getR1tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR2tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR3tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR4tokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"lotteryPicker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round1tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round2tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_random","type":"string"}],"name":"round3pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round3tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_random","type":"string"}],"name":"round4pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"round4tokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_random","type":"string"}],"name":"round5pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokens","type":"uint256[]"}],"name":"setR1tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokens","type":"uint256[]"}],"name":"setR2tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FUDiblesS1.MintState","name":"_state","type":"uint8"}],"name":"setState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUriBase","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum FUDiblesS1.MintState","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":"tokenUriBase","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":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"winner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60006101000a81548160ff021916908360038111156200002d576200002c62000682565b5b021790555066d529ae9e860000600b5561015f600c556002600d556040518060600160405280602981526020016200666a60299139600f90816200007291906200092b565b50606467ffffffffffffffff811115620000915762000090620006bc565b5b604051908082528060200260200182016040528015620000c05781602001602082028036833780820191505090505b5060119080519060200190620000d892919062000611565b50603267ffffffffffffffff811115620000f757620000f6620006bc565b5b604051908082528060200260200182016040528015620001265781602001602082028036833780820191505090505b50601290805190602001906200013e92919062000611565b50600a67ffffffffffffffff8111156200015d576200015c620006bc565b5b6040519080825280602002602001820160405280156200018c5781602001602082028036833780820191505090505b5060139080519060200190620001a492919062000611565b50600267ffffffffffffffff811115620001c357620001c2620006bc565b5b604051908082528060200260200182016040528015620001f25781602001602082028036833780820191505090505b50601490805190602001906200020a92919062000611565b50737de56813af4d33555b44dd6c5a542cedb59b761e601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550603267ffffffffffffffff8111156200027e576200027d620006bc565b5b604051908082528060200260200182016040528015620002ad5781602001602082028036833780820191505090505b5060189080519060200190620002c592919062000611565b50600a67ffffffffffffffff811115620002e457620002e3620006bc565b5b604051908082528060200260200182016040528015620003135781602001602082028036833780820191505090505b50601990805190602001906200032b92919062000611565b503480156200033957600080fd5b506040518060400160405280601181526020017f46554469626c657320536561736f6e20310000000000000000000000000000008152506040518060400160405280600b81526020017f46554469626c65732d53310000000000000000000000000000000000000000008152508160029081620003b791906200092b565b508060039081620003c991906200092b565b50620003da6200045f60201b60201c565b600081905550505033601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000459601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166102ee6200046460201b60201c565b62000b2d565b600090565b620004746200060760201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620004d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004cc9062000a99565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000547576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200053e9062000b0b565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b82805482825590600052602060002090810192821562000650579160200282015b828111156200064f57825182559160200191906001019062000632565b5b5090506200065f919062000663565b5090565b5b808211156200067e57600081600090555060010162000664565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200073357607f821691505b602082108103620007495762000748620006eb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620007b37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000774565b620007bf868362000774565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200080c620008066200080084620007d7565b620007e1565b620007d7565b9050919050565b6000819050919050565b6200082883620007eb565b62000840620008378262000813565b84845462000781565b825550505050565b600090565b6200085762000848565b620008648184846200081d565b505050565b5b818110156200088c57620008806000826200084d565b6001810190506200086a565b5050565b601f821115620008db57620008a5816200074f565b620008b08462000764565b81016020851015620008c0578190505b620008d8620008cf8562000764565b83018262000869565b50505b505050565b600082821c905092915050565b60006200090060001984600802620008e0565b1980831691505092915050565b60006200091b8383620008ed565b9150826002028217905092915050565b6200093682620006b1565b67ffffffffffffffff811115620009525762000951620006bc565b5b6200095e82546200071a565b6200096b82828562000890565b600060209050601f831160018114620009a357600084156200098e578287015190505b6200099a85826200090d565b86555062000a0a565b601f198416620009b3866200074f565b60005b82811015620009dd57848901518255600182019150602085019450602081019050620009b6565b86831015620009fd5784890151620009f9601f891682620008ed565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000a81602a8362000a12565b915062000a8e8262000a23565b604082019050919050565b6000602082019050818103600083015262000ab48162000a72565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000af360198362000a12565b915062000b008262000abb565b602082019050919050565b6000602082019050818103600083015262000b268162000ae4565b9050919050565b615b2d8062000b3d6000396000f3fe6080604052600436106102ff5760003560e01c806385ef3e1c11610190578063d5abeb01116100dc578063e985e9c511610095578063f1a2096d1161006f578063f1a2096d14610b71578063fc7e264a14610b9c578063fd90002514610bd9578063fe4ac90614610c04576102ff565b8063e985e9c514610ace578063ef56267e14610b0b578063efbd73f414610b48576102ff565b8063d5abeb01146109ac578063d6cbd04f146109d7578063dc33e68114610a00578063dfbf53ae14610a3d578063e074753d14610a68578063e0df5b6f14610aa5576102ff565b8063a6f9dae111610149578063b88d4fde11610123578063b88d4fde146108ff578063bd32fb661461091b578063c19d93fb14610944578063c87b56dd1461096f576102ff565b8063a6f9dae114610882578063a7f62d86146108ab578063aa98e0c6146108d4576102ff565b806385ef3e1c1461077f5780638da5cb5b146107aa57806393040587146107d557806395d89b4114610812578063a0712d681461083d578063a22cb46514610859576102ff565b8063438b63001161024f5780635cb85cd2116102085780636dfd90ea116101e25780636dfd90ea146106c55780636f8b44b0146106ee57806370a08231146107175780637501f74114610754576102ff565b80635cb85cd2146106365780636352211e1461065f5780636af843b11461069c576102ff565b8063438b6300146105165780634bbd7e3c14610553578063500a2d161461057c578063540c2a97146105b9578063547520fe146105e457806356de96db1461060d576102ff565b806318160ddd116102bc57806323b872dd1161029657806323b872dd146104895780632a55205a146104a55780633ccfd60b146104e357806342842e0e146104fa576102ff565b806318160ddd14610419578063183bed90146104445780631b7b6aed14610460576102ff565b806301ffc9a71461030457806304634d8d1461034157806304bccf7a1461036a57806306fdde0314610395578063081812fc146103c0578063095ea7b3146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613f33565b610c2f565b6040516103389190613f7b565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190614038565b610c41565b005b34801561037657600080fd5b5061037f610cdf565b60405161038c9190614087565b60405180910390f35b3480156103a157600080fd5b506103aa610d05565b6040516103b79190614132565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e2919061418a565b610d97565b6040516103f49190614087565b60405180910390f35b610417600480360381019061041291906141b7565b610e16565b005b34801561042557600080fd5b5061042e610f5a565b60405161043b9190614206565b60405180910390f35b61045e60048036038101906104599190614286565b610f71565b005b34801561046c57600080fd5b5061048760048036038101906104829190614350565b611350565b005b6104a3600480360381019061049e919061439d565b611629565b005b3480156104b157600080fd5b506104cc60048036038101906104c791906143f0565b61194b565b6040516104da929190614430565b60405180910390f35b3480156104ef57600080fd5b506104f8611b35565b005b610514600480360381019061050f919061439d565b611ca2565b005b34801561052257600080fd5b5061053d60048036038101906105389190614459565b611cc2565b60405161054a9190614544565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190614350565b611dc3565b005b34801561058857600080fd5b506105a3600480360381019061059e919061418a565b611f21565b6040516105b09190614206565b60405180910390f35b3480156105c557600080fd5b506105ce611f45565b6040516105db9190614132565b60405180910390f35b3480156105f057600080fd5b5061060b6004803603810190610606919061418a565b611fd3565b005b34801561061957600080fd5b50610634600480360381019061062f919061458b565b61206d565b005b34801561064257600080fd5b5061065d6004803603810190610658919061418a565b61212a565b005b34801561066b57600080fd5b506106866004803603810190610681919061418a565b61220e565b6040516106939190614087565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be9190614350565b612220565b005b3480156106d157600080fd5b506106ec60048036038101906106e7919061460e565b6124f9565b005b3480156106fa57600080fd5b506107156004803603810190610710919061418a565b612641565b005b34801561072357600080fd5b5061073e60048036038101906107399190614459565b61271f565b60405161074b9190614206565b60405180910390f35b34801561076057600080fd5b506107696127d7565b6040516107769190614206565b60405180910390f35b34801561078b57600080fd5b506107946127dd565b6040516107a19190614544565b60405180910390f35b3480156107b657600080fd5b506107bf612835565b6040516107cc9190614087565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f7919061418a565b61285b565b6040516108099190614206565b60405180910390f35b34801561081e57600080fd5b5061082761287f565b6040516108349190614132565b60405180910390f35b6108576004803603810190610852919061418a565b612911565b005b34801561086557600080fd5b50610880600480360381019061087b9190614687565b612b24565b005b34801561088e57600080fd5b506108a960048036038101906108a49190614459565b612c2f565b005b3480156108b757600080fd5b506108d260048036038101906108cd919061460e565b612d03565b005b3480156108e057600080fd5b506108e9612e4b565b6040516108f691906146e0565b60405180910390f35b6109196004803603810190610914919061482b565b612e51565b005b34801561092757600080fd5b50610942600480360381019061093d91906148da565b612ec4565b005b34801561095057600080fd5b50610959612f5e565b604051610966919061497e565b60405180910390f35b34801561097b57600080fd5b506109966004803603810190610991919061418a565b612f71565b6040516109a39190614132565b60405180910390f35b3480156109b857600080fd5b506109c1612fa5565b6040516109ce9190614206565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f99190614459565b612fab565b005b348015610a0c57600080fd5b50610a276004803603810190610a229190614459565b61307f565b604051610a349190614206565b60405180910390f35b348015610a4957600080fd5b50610a52613091565b604051610a5f9190614206565b60405180910390f35b348015610a7457600080fd5b50610a8f6004803603810190610a8a919061418a565b613097565b604051610a9c9190614206565b60405180910390f35b348015610ab157600080fd5b50610acc6004803603810190610ac79190614a3a565b6130bb565b005b348015610ada57600080fd5b50610af56004803603810190610af09190614a83565b61315e565b604051610b029190613f7b565b60405180910390f35b348015610b1757600080fd5b50610b326004803603810190610b2d9190614459565b6131f2565b604051610b3f9190613f7b565b60405180910390f35b348015610b5457600080fd5b50610b6f6004803603810190610b6a9190614ac3565b613212565b005b348015610b7d57600080fd5b50610b86613307565b604051610b939190614544565b60405180910390f35b348015610ba857600080fd5b50610bc36004803603810190610bbe919061418a565b61335f565b604051610bd09190614206565b60405180910390f35b348015610be557600080fd5b50610bee613383565b604051610bfb9190614544565b60405180910390f35b348015610c1057600080fd5b50610c196133db565b604051610c269190614544565b60405180910390f35b6000610c3a82613433565b9050919050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890614b4f565b60405180910390fd5b610cdb82826134ad565b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610d1490614b9e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4090614b9e565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b5050505050905090565b6000610da282613642565b610dd8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e218261220e565b90508073ffffffffffffffffffffffffffffffffffffffff16610e426136a1565b73ffffffffffffffffffffffffffffffffffffffff1614610ea557610e6e81610e696136a1565b61315e565b610ea4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610f646136a9565b6001546000540303905090565b83836001811115610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90614c1b565b60405180910390fd5b600082118015610fd4575080600d54610fd09190614c6a565b8211155b611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90614cea565b60405180910390fd5b600c548261101f610f5a565b6110299190614c6a565b111561106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190614d56565b60405180910390fd5b6001600381111561107e5761107d614907565b5b600a60009054906101000a900460ff1660038111156110a05761109f614907565b5b146110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d790614de8565b60405180910390fd5b84600d546110ee9190614c6a565b866110f83361307f565b6111029190614c6a565b1115611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a90614e54565b60405180910390fd5b848661114f9190614e74565b600b5461115c9190614ea8565b34101561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614f36565b60405180910390fd5b6111f26111ab33876136ae565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050613707565b611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614fa2565b60405180910390fd5b60008511801561124d5750600b548661124a9190614ea8565b34105b1561133e5760011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc9061500e565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b611348338761371e565b505050505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113f95750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90614b4f565b60405180910390fd5b60004233848460405160200161145194939291906150c7565b6040516020818303038152906040528051906020012060001c9050600080600090505b600a811015611622576000601880549050846114909190615131565b90506000601882815481106114a8576114a7615162565b5b9060005260206000200154146114de57601881815481106114cc576114cb615162565b5b906000526020600020015492506114e2565b8092505b6000601860016018805490506114f89190614e74565b8154811061150957611508615162565b5b90600052602060002001540361155257600160188054905061152b9190614e74565b6018828154811061153f5761153e615162565b5b90600052602060002001819055506115a5565b601860016018805490506115669190614e74565b8154811061157757611576615162565b5b90600052602060002001546018828154811061159657611595615162565b5b90600052602060002001819055505b60188054806115b7576115b6615191565b5b60019003818190600052602060002001600090559055601283815481106115e1576115e0615162565b5b906000526020600020015460138381548110611600576115ff615162565b5b906000526020600020018190555050808061161a906151c0565b915050611474565b5050505050565b60006116348261373c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461169b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116a784613808565b915091506116bd81876116b86136a1565b61382f565b611709576116d2866116cd6136a1565b61315e565b611708576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361176f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61177c8686866001613873565b801561178757600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061185585611831888887613879565b7c0200000000000000000000000000000000000000000000000000000000176138a1565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036118db57600060018501905060006004600083815260200190815260200160002054036118d95760005481146118d8578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461194386868660016138cc565b505050505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603611ae05760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611aea6138d2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686611b169190614ea8565b611b209190615208565b90508160000151819350935050509250929050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90614b4f565b60405180910390fd5b6000479050600060019050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611c169061526a565b60006040518083038185875af1925050503d8060008114611c53576040519150601f19603f3d011682016040523d82523d6000602084013e611c58565b606091505b50508091505080611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c95906152cb565b60405180910390fd5b5050565b611cbd83838360405180602001604052806000815250612e51565b505050565b60606000611ccf8361271f565b905060008167ffffffffffffffff811115611ced57611cec614700565b5b604051908082528060200260200182016040528015611d1b5781602001602082028036833780820191505090505b509050600080611d296136a9565b90505b611d34610f5a565b8111611db7578573ffffffffffffffffffffffffffffffffffffffff16611d5a8261220e565b73ffffffffffffffffffffffffffffffffffffffff1603611da45780838381518110611d8957611d88615162565b5b6020026020010181815250508180611da0906151c0565b9250505b8080611daf906151c0565b915050611d2c565b50819350505050919050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e6c5750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614b4f565b60405180910390fd5b600060029050600042338585604051602001611eca94939291906150c7565b6040516020818303038152906040528051906020012060001c905060008282611ef39190615131565b905060148181548110611f0957611f08615162565b5b90600052602060002001546015819055505050505050565b60128181548110611f3157600080fd5b906000526020600020016000915090505481565b600f8054611f5290614b9e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7e90614b9e565b8015611fcb5780601f10611fa057610100808354040283529160200191611fcb565b820191906000526020600020905b815481529060010190602001808311611fae57829003601f168201915b505050505081565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90614b4f565b60405180910390fd5b80600d8190555050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490614b4f565b60405180910390fd5b80600a60006101000a81548160ff0219169083600381111561212257612121614907565b5b021790555050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614b4f565b60405180910390fd5b66b1a2bc2ec50000811015612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb90615337565b60405180910390fd5b80600b8190555050565b60006122198261373c565b9050919050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122c95750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff90614b4f565b60405180910390fd5b60004233848460405160200161232194939291906150c7565b6040516020818303038152906040528051906020012060001c9050600080600090505b60028110156124f2576000601980549050846123609190615131565b905060006019828154811061237857612377615162565b5b9060005260206000200154146123ae576019818154811061239c5761239b615162565b5b906000526020600020015492506123b2565b8092505b6000601960016019805490506123c89190614e74565b815481106123d9576123d8615162565b5b9060005260206000200154036124225760016019805490506123fb9190614e74565b6019828154811061240f5761240e615162565b5b9060005260206000200181905550612475565b601960016019805490506124369190614e74565b8154811061244757612446615162565b5b90600052602060002001546019828154811061246657612465615162565b5b90600052602060002001819055505b601980548061248757612486615191565b5b60019003818190600052602060002001600090559055601383815481106124b1576124b0615162565b5b9060005260206000200154601483815481106124d0576124cf615162565b5b90600052602060002001819055505080806124ea906151c0565b915050612344565b5050505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125a25750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d890614b4f565b60405180910390fd5b601180549050828290501461262b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612622906153a3565b60405180910390fd5b81816011919061263c929190613e5d565b505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c890614b4f565b60405180910390fd5b600c548110612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c9061540f565b60405180910390fd5b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612786576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600d5481565b6060601180548060200260200160405190810160405280929190818152602001828054801561282b57602002820191906000526020600020905b815481526020019060010190808311612817575b5050505050905090565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6013818154811061286b57600080fd5b906000526020600020016000915090505481565b60606003805461288e90614b9e565b80601f01602080910402602001604051908101604052809291908181526020018280546128ba90614b9e565b80156129075780601f106128dc57610100808354040283529160200191612907565b820191906000526020600020905b8154815290600101906020018083116128ea57829003601f168201915b5050505050905090565b8060006001811115612958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294f90614c1b565b60405180910390fd5b600082118015612975575080600d546129719190614c6a565b8211155b6129b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ab90614cea565b60405180910390fd5b600c54826129c0610f5a565b6129ca9190614c6a565b1115612a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0290614d56565b60405180910390fd5b60026003811115612a1f57612a1e614907565b5b600a60009054906101000a900460ff166003811115612a4157612a40614907565b5b14612a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a789061547b565b60405180910390fd5b6005831115612ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abc9061550d565b60405180910390fd5b82600b54612ad39190614ea8565b341015612b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0c90614f36565b60405180910390fd5b612b1f338461371e565b505050565b8060076000612b316136a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612bde6136a1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c239190613f7b565b60405180910390a35050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb690614b4f565b60405180910390fd5b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dac5750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de290614b4f565b60405180910390fd5b6012805490508282905014612e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2c906153a3565b60405180910390fd5b818160129190612e46929190613e5d565b505050565b600e5481565b612e5c848484611629565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ebe57612e87848484846138dc565b612ebd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b90614b4f565b60405180910390fd5b80600e8190555050565b600a60009054906101000a900460ff1681565b6060600f612f7e83613a2c565b604051602001612f8f929190615642565b6040516020818303038152906040529050919050565b600c5481565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461303b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303290614b4f565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061308a82613a7c565b9050919050565b60155481565b601481815481106130a757600080fd5b906000526020600020016000915090505481565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461314b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314290614b4f565b60405180910390fd5b80600f908161315a9190615808565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329990614b4f565b60405180910390fd5b600c54826132ae610f5a565b6132b89190614c6a565b11156132f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f090614d56565b60405180910390fd5b613303818361371e565b5050565b6060601480548060200260200160405190810160405280929190818152602001828054801561335557602002820191906000526020600020905b815481526020019060010190808311613341575b5050505050905090565b6011818154811061336f57600080fd5b906000526020600020016000915090505481565b606060138054806020026020016040519081016040528092919081815260200182805480156133d157602002820191906000526020600020905b8154815260200190600101908083116133bd575b5050505050905090565b6060601280548060200260200160405190810160405280929190818152602001828054801561342957602002820191906000526020600020905b815481526020019060010190808311613415575b5050505050905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806134a657506134a582613ad3565b5b9050919050565b6134b56138d2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115613513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a9061594c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613579906159b8565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008161364d6136a9565b1115801561365c575060005482105b801561369a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600082826040516020016136c3929190614430565b604051602081830303815290604052805190602001206040516020016136e991906159f9565b60405160208183030381529060405280519060200120905092915050565b600061371682600e5485613b3d565b905092915050565b613738828260405180602001604052806000815250613b54565b5050565b6000808290508061374b6136a9565b116137d1576000548110156137d05760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036137ce575b600081036137c457600460008360019003935083815260200190815260200160002054905061379a565b8092505050613803565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613890868684613bf1565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139026136a1565b8786866040518563ffffffff1660e01b81526004016139249493929190615a69565b6020604051808303816000875af192505050801561396057506040513d601f19601f8201168201806040525081019061395d9190615aca565b60015b6139d9573d8060008114613990576040519150601f19603f3d011682016040523d82523d6000602084013e613995565b606091505b5060008151036139d1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060a060405101806040526020810391506000825281835b600115613a6757600184039350600a81066030018453600a8104905080613a45575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600082613b4a8584613bfa565b1490509392505050565b613b5e8383613c50565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613bec57600080549050600083820390505b613b9e60008683806001019450866138dc565b613bd4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613b8b578160005414613be957600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015613c4557613c3082868381518110613c2357613c22615162565b5b6020026020010151613e0b565b91508080613c3d906151c0565b915050613c03565b508091505092915050565b60008054905060008203613c90576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9d6000848385613873565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613d1483613d056000866000613879565b613d0e85613e36565b176138a1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613db557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613d7a565b5060008203613df0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613e0660008483856138cc565b505050565b6000818310613e2357613e1e8284613e46565b613e2e565b613e2d8383613e46565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215613e99579160200282015b82811115613e98578235825591602001919060010190613e7d565b5b509050613ea69190613eaa565b5090565b5b80821115613ec3576000816000905550600101613eab565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f1081613edb565b8114613f1b57600080fd5b50565b600081359050613f2d81613f07565b92915050565b600060208284031215613f4957613f48613ed1565b5b6000613f5784828501613f1e565b91505092915050565b60008115159050919050565b613f7581613f60565b82525050565b6000602082019050613f906000830184613f6c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fc182613f96565b9050919050565b613fd181613fb6565b8114613fdc57600080fd5b50565b600081359050613fee81613fc8565b92915050565b60006bffffffffffffffffffffffff82169050919050565b61401581613ff4565b811461402057600080fd5b50565b6000813590506140328161400c565b92915050565b6000806040838503121561404f5761404e613ed1565b5b600061405d85828601613fdf565b925050602061406e85828601614023565b9150509250929050565b61408181613fb6565b82525050565b600060208201905061409c6000830184614078565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156140dc5780820151818401526020810190506140c1565b60008484015250505050565b6000601f19601f8301169050919050565b6000614104826140a2565b61410e81856140ad565b935061411e8185602086016140be565b614127816140e8565b840191505092915050565b6000602082019050818103600083015261414c81846140f9565b905092915050565b6000819050919050565b61416781614154565b811461417257600080fd5b50565b6000813590506141848161415e565b92915050565b6000602082840312156141a05761419f613ed1565b5b60006141ae84828501614175565b91505092915050565b600080604083850312156141ce576141cd613ed1565b5b60006141dc85828601613fdf565b92505060206141ed85828601614175565b9150509250929050565b61420081614154565b82525050565b600060208201905061421b60008301846141f7565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261424657614245614221565b5b8235905067ffffffffffffffff81111561426357614262614226565b5b60208301915083602082028301111561427f5761427e61422b565b5b9250929050565b600080600080606085870312156142a05761429f613ed1565b5b60006142ae87828801614175565b94505060206142bf87828801614175565b935050604085013567ffffffffffffffff8111156142e0576142df613ed6565b5b6142ec87828801614230565b925092505092959194509250565b60008083601f8401126143105761430f614221565b5b8235905067ffffffffffffffff81111561432d5761432c614226565b5b6020830191508360018202830111156143495761434861422b565b5b9250929050565b6000806020838503121561436757614366613ed1565b5b600083013567ffffffffffffffff81111561438557614384613ed6565b5b614391858286016142fa565b92509250509250929050565b6000806000606084860312156143b6576143b5613ed1565b5b60006143c486828701613fdf565b93505060206143d586828701613fdf565b92505060406143e686828701614175565b9150509250925092565b6000806040838503121561440757614406613ed1565b5b600061441585828601614175565b925050602061442685828601614175565b9150509250929050565b60006040820190506144456000830185614078565b61445260208301846141f7565b9392505050565b60006020828403121561446f5761446e613ed1565b5b600061447d84828501613fdf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144bb81614154565b82525050565b60006144cd83836144b2565b60208301905092915050565b6000602082019050919050565b60006144f182614486565b6144fb8185614491565b9350614506836144a2565b8060005b8381101561453757815161451e88826144c1565b9750614529836144d9565b92505060018101905061450a565b5085935050505092915050565b6000602082019050818103600083015261455e81846144e6565b905092915050565b6004811061457357600080fd5b50565b60008135905061458581614566565b92915050565b6000602082840312156145a1576145a0613ed1565b5b60006145af84828501614576565b91505092915050565b60008083601f8401126145ce576145cd614221565b5b8235905067ffffffffffffffff8111156145eb576145ea614226565b5b6020830191508360208202830111156146075761460661422b565b5b9250929050565b6000806020838503121561462557614624613ed1565b5b600083013567ffffffffffffffff81111561464357614642613ed6565b5b61464f858286016145b8565b92509250509250929050565b61466481613f60565b811461466f57600080fd5b50565b6000813590506146818161465b565b92915050565b6000806040838503121561469e5761469d613ed1565b5b60006146ac85828601613fdf565b92505060206146bd85828601614672565b9150509250929050565b6000819050919050565b6146da816146c7565b82525050565b60006020820190506146f560008301846146d1565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614738826140e8565b810181811067ffffffffffffffff8211171561475757614756614700565b5b80604052505050565b600061476a613ec7565b9050614776828261472f565b919050565b600067ffffffffffffffff82111561479657614795614700565b5b61479f826140e8565b9050602081019050919050565b82818337600083830152505050565b60006147ce6147c98461477b565b614760565b9050828152602081018484840111156147ea576147e96146fb565b5b6147f58482856147ac565b509392505050565b600082601f83011261481257614811614221565b5b81356148228482602086016147bb565b91505092915050565b6000806000806080858703121561484557614844613ed1565b5b600061485387828801613fdf565b945050602061486487828801613fdf565b935050604061487587828801614175565b925050606085013567ffffffffffffffff81111561489657614895613ed6565b5b6148a2878288016147fd565b91505092959194509250565b6148b7816146c7565b81146148c257600080fd5b50565b6000813590506148d4816148ae565b92915050565b6000602082840312156148f0576148ef613ed1565b5b60006148fe848285016148c5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061494757614946614907565b5b50565b600081905061495882614936565b919050565b60006149688261494a565b9050919050565b6149788161495d565b82525050565b6000602082019050614993600083018461496f565b92915050565b600067ffffffffffffffff8211156149b4576149b3614700565b5b6149bd826140e8565b9050602081019050919050565b60006149dd6149d884614999565b614760565b9050828152602081018484840111156149f9576149f86146fb565b5b614a048482856147ac565b509392505050565b600082601f830112614a2157614a20614221565b5b8135614a318482602086016149ca565b91505092915050565b600060208284031215614a5057614a4f613ed1565b5b600082013567ffffffffffffffff811115614a6e57614a6d613ed6565b5b614a7a84828501614a0c565b91505092915050565b60008060408385031215614a9a57614a99613ed1565b5b6000614aa885828601613fdf565b9250506020614ab985828601613fdf565b9150509250929050565b60008060408385031215614ada57614ad9613ed1565b5b6000614ae885828601614175565b9250506020614af985828601613fdf565b9150509250929050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614b39600e836140ad565b9150614b4482614b03565b602082019050919050565b60006020820190508181036000830152614b6881614b2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614bb657607f821691505b602082108103614bc957614bc8614b6f565b5b50919050565b7f546f6f206d616e792066726565206d696e747300000000000000000000000000600082015250565b6000614c056013836140ad565b9150614c1082614bcf565b602082019050919050565b60006020820190508181036000830152614c3481614bf8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c7582614154565b9150614c8083614154565b9250828201905080821115614c9857614c97614c3b565b5b92915050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b6000614cd46013836140ad565b9150614cdf82614c9e565b602082019050919050565b60006020820190508181036000830152614d0381614cc7565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614d406013836140ad565b9150614d4b82614d0a565b602082019050919050565b60006020820190508181036000830152614d6f81614d33565b9050919050565b7f416c6c6f774c697374206d696e74206973206e6f7420617661696c61626c652060008201527f7965740000000000000000000000000000000000000000000000000000000000602082015250565b6000614dd26023836140ad565b9150614ddd82614d76565b604082019050919050565b60006020820190508181036000830152614e0181614dc5565b9050919050565b7f4578636565647320616c6c6f776564206e756d626572206f66206d696e747300600082015250565b6000614e3e601f836140ad565b9150614e4982614e08565b602082019050919050565b60006020820190508181036000830152614e6d81614e31565b9050919050565b6000614e7f82614154565b9150614e8a83614154565b9250828203905081811115614ea257614ea1614c3b565b5b92915050565b6000614eb382614154565b9150614ebe83614154565b9250828202614ecc81614154565b91508282048414831517614ee357614ee2614c3b565b5b5092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614f206012836140ad565b9150614f2b82614eea565b602082019050919050565b60006020820190508181036000830152614f4f81614f13565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614f8c600d836140ad565b9150614f9782614f56565b602082019050919050565b60006020820190508181036000830152614fbb81614f7f565b9050919050565b7f46726565206d696e7420616c726561647920636c61696d656400000000000000600082015250565b6000614ff86019836140ad565b915061500382614fc2565b602082019050919050565b6000602082019050818103600083015261502781614feb565b9050919050565b6000819050919050565b61504961504482614154565b61502e565b82525050565b60008160601b9050919050565b60006150678261504f565b9050919050565b60006150798261505c565b9050919050565b61509161508c82613fb6565b61506e565b82525050565b600081905092915050565b60006150ae8385615097565b93506150bb8385846147ac565b82840190509392505050565b60006150d38287615038565b6020820191506150e38286615080565b6014820191506150f48284866150a2565b915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061513c82614154565b915061514783614154565b92508261515757615156615102565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006151cb82614154565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151fd576151fc614c3b565b5b600182019050919050565b600061521382614154565b915061521e83614154565b92508261522e5761522d615102565b5b828204905092915050565b600081905092915050565b50565b6000615254600083615239565b915061525f82615244565b600082019050919050565b600061527582615247565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006152b5600f836140ad565b91506152c08261527f565b602082019050919050565b600060208201905081810360008301526152e4816152a8565b9050919050565b7f436f737420746f6f206c6f770000000000000000000000000000000000000000600082015250565b6000615321600c836140ad565b915061532c826152eb565b602082019050919050565b6000602082019050818103600083015261535081615314565b9050919050565b7f4261642044617461000000000000000000000000000000000000000000000000600082015250565b600061538d6008836140ad565b915061539882615357565b602082019050919050565b600060208201905081810360008301526153bc81615380565b9050919050565b7f43616e6e6f7420696e6372656173652074686520737570706c79000000000000600082015250565b60006153f9601a836140ad565b9150615404826153c3565b602082019050919050565b60006020820190508181036000830152615428816153ec565b9050919050565b7f5075626c6963206d696e74206973206e6f7420617661696c61626c6520796574600082015250565b60006154656020836140ad565b91506154708261542f565b602082019050919050565b6000602082019050818103600083015261549481615458565b9050919050565b7f546f6f206d616e79206d696e747320706572207472616e73616374696f6e207260008201527f6571756573746564000000000000000000000000000000000000000000000000602082015250565b60006154f76028836140ad565b91506155028261549b565b604082019050919050565b60006020820190508181036000830152615526816154ea565b9050919050565b60008190508160005260206000209050919050565b6000815461554f81614b9e565b6155598186615097565b945060018216600081146155745760018114615589576155bc565b60ff19831686528115158202860193506155bc565b6155928561552d565b60005b838110156155b457815481890152600182019150602081019050615595565b838801955050505b50505092915050565b60006155d0826140a2565b6155da8185615097565b93506155ea8185602086016140be565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061562c600583615097565b9150615637826155f6565b600582019050919050565b600061564e8285615542565b915061565a82846155c5565b91506156658261561f565b91508190509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026156be7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615681565b6156c88683615681565b95508019841693508086168417925050509392505050565b6000819050919050565b60006157056157006156fb84614154565b6156e0565b614154565b9050919050565b6000819050919050565b61571f836156ea565b61573361572b8261570c565b84845461568e565b825550505050565b600090565b61574861573b565b615753818484615716565b505050565b5b818110156157775761576c600082615740565b600181019050615759565b5050565b601f8211156157bc5761578d8161552d565b61579684615671565b810160208510156157a5578190505b6157b96157b185615671565b830182615758565b50505b505050565b600082821c905092915050565b60006157df600019846008026157c1565b1980831691505092915050565b60006157f883836157ce565b9150826002028217905092915050565b615811826140a2565b67ffffffffffffffff81111561582a57615829614700565b5b6158348254614b9e565b61583f82828561577b565b600060209050601f8311600181146158725760008415615860578287015190505b61586a85826157ec565b8655506158d2565b601f1984166158808661552d565b60005b828110156158a857848901518255600182019150602085019450602081019050615883565b868310156158c557848901516158c1601f8916826157ce565b8355505b6001600288020188555050505b505050505050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615936602a836140ad565b9150615941826158da565b604082019050919050565b6000602082019050818103600083015261596581615929565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006159a26019836140ad565b91506159ad8261596c565b602082019050919050565b600060208201905081810360008301526159d181615995565b9050919050565b6000819050919050565b6159f36159ee826146c7565b6159d8565b82525050565b6000615a0582846159e2565b60208201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000615a3b82615a14565b615a458185615a1f565b9350615a558185602086016140be565b615a5e816140e8565b840191505092915050565b6000608082019050615a7e6000830187614078565b615a8b6020830186614078565b615a9860408301856141f7565b8181036060830152615aaa8184615a30565b905095945050505050565b600081519050615ac481613f07565b92915050565b600060208284031215615ae057615adf613ed1565b5b6000615aee84828501615ab5565b9150509291505056fea2646970667358221220fbb68e85acc813ca0f84c1f3363601a246c8274510e727496b58860d7f44442164736f6c63430008110033687474703a2f2f6d657461646174612e6d696e746675642e636f6d3a333333332f736561736f6e312f

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c806385ef3e1c11610190578063d5abeb01116100dc578063e985e9c511610095578063f1a2096d1161006f578063f1a2096d14610b71578063fc7e264a14610b9c578063fd90002514610bd9578063fe4ac90614610c04576102ff565b8063e985e9c514610ace578063ef56267e14610b0b578063efbd73f414610b48576102ff565b8063d5abeb01146109ac578063d6cbd04f146109d7578063dc33e68114610a00578063dfbf53ae14610a3d578063e074753d14610a68578063e0df5b6f14610aa5576102ff565b8063a6f9dae111610149578063b88d4fde11610123578063b88d4fde146108ff578063bd32fb661461091b578063c19d93fb14610944578063c87b56dd1461096f576102ff565b8063a6f9dae114610882578063a7f62d86146108ab578063aa98e0c6146108d4576102ff565b806385ef3e1c1461077f5780638da5cb5b146107aa57806393040587146107d557806395d89b4114610812578063a0712d681461083d578063a22cb46514610859576102ff565b8063438b63001161024f5780635cb85cd2116102085780636dfd90ea116101e25780636dfd90ea146106c55780636f8b44b0146106ee57806370a08231146107175780637501f74114610754576102ff565b80635cb85cd2146106365780636352211e1461065f5780636af843b11461069c576102ff565b8063438b6300146105165780634bbd7e3c14610553578063500a2d161461057c578063540c2a97146105b9578063547520fe146105e457806356de96db1461060d576102ff565b806318160ddd116102bc57806323b872dd1161029657806323b872dd146104895780632a55205a146104a55780633ccfd60b146104e357806342842e0e146104fa576102ff565b806318160ddd14610419578063183bed90146104445780631b7b6aed14610460576102ff565b806301ffc9a71461030457806304634d8d1461034157806304bccf7a1461036a57806306fdde0314610395578063081812fc146103c0578063095ea7b3146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613f33565b610c2f565b6040516103389190613f7b565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190614038565b610c41565b005b34801561037657600080fd5b5061037f610cdf565b60405161038c9190614087565b60405180910390f35b3480156103a157600080fd5b506103aa610d05565b6040516103b79190614132565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e2919061418a565b610d97565b6040516103f49190614087565b60405180910390f35b610417600480360381019061041291906141b7565b610e16565b005b34801561042557600080fd5b5061042e610f5a565b60405161043b9190614206565b60405180910390f35b61045e60048036038101906104599190614286565b610f71565b005b34801561046c57600080fd5b5061048760048036038101906104829190614350565b611350565b005b6104a3600480360381019061049e919061439d565b611629565b005b3480156104b157600080fd5b506104cc60048036038101906104c791906143f0565b61194b565b6040516104da929190614430565b60405180910390f35b3480156104ef57600080fd5b506104f8611b35565b005b610514600480360381019061050f919061439d565b611ca2565b005b34801561052257600080fd5b5061053d60048036038101906105389190614459565b611cc2565b60405161054a9190614544565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190614350565b611dc3565b005b34801561058857600080fd5b506105a3600480360381019061059e919061418a565b611f21565b6040516105b09190614206565b60405180910390f35b3480156105c557600080fd5b506105ce611f45565b6040516105db9190614132565b60405180910390f35b3480156105f057600080fd5b5061060b6004803603810190610606919061418a565b611fd3565b005b34801561061957600080fd5b50610634600480360381019061062f919061458b565b61206d565b005b34801561064257600080fd5b5061065d6004803603810190610658919061418a565b61212a565b005b34801561066b57600080fd5b506106866004803603810190610681919061418a565b61220e565b6040516106939190614087565b60405180910390f35b3480156106a857600080fd5b506106c360048036038101906106be9190614350565b612220565b005b3480156106d157600080fd5b506106ec60048036038101906106e7919061460e565b6124f9565b005b3480156106fa57600080fd5b506107156004803603810190610710919061418a565b612641565b005b34801561072357600080fd5b5061073e60048036038101906107399190614459565b61271f565b60405161074b9190614206565b60405180910390f35b34801561076057600080fd5b506107696127d7565b6040516107769190614206565b60405180910390f35b34801561078b57600080fd5b506107946127dd565b6040516107a19190614544565b60405180910390f35b3480156107b657600080fd5b506107bf612835565b6040516107cc9190614087565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f7919061418a565b61285b565b6040516108099190614206565b60405180910390f35b34801561081e57600080fd5b5061082761287f565b6040516108349190614132565b60405180910390f35b6108576004803603810190610852919061418a565b612911565b005b34801561086557600080fd5b50610880600480360381019061087b9190614687565b612b24565b005b34801561088e57600080fd5b506108a960048036038101906108a49190614459565b612c2f565b005b3480156108b757600080fd5b506108d260048036038101906108cd919061460e565b612d03565b005b3480156108e057600080fd5b506108e9612e4b565b6040516108f691906146e0565b60405180910390f35b6109196004803603810190610914919061482b565b612e51565b005b34801561092757600080fd5b50610942600480360381019061093d91906148da565b612ec4565b005b34801561095057600080fd5b50610959612f5e565b604051610966919061497e565b60405180910390f35b34801561097b57600080fd5b506109966004803603810190610991919061418a565b612f71565b6040516109a39190614132565b60405180910390f35b3480156109b857600080fd5b506109c1612fa5565b6040516109ce9190614206565b60405180910390f35b3480156109e357600080fd5b506109fe60048036038101906109f99190614459565b612fab565b005b348015610a0c57600080fd5b50610a276004803603810190610a229190614459565b61307f565b604051610a349190614206565b60405180910390f35b348015610a4957600080fd5b50610a52613091565b604051610a5f9190614206565b60405180910390f35b348015610a7457600080fd5b50610a8f6004803603810190610a8a919061418a565b613097565b604051610a9c9190614206565b60405180910390f35b348015610ab157600080fd5b50610acc6004803603810190610ac79190614a3a565b6130bb565b005b348015610ada57600080fd5b50610af56004803603810190610af09190614a83565b61315e565b604051610b029190613f7b565b60405180910390f35b348015610b1757600080fd5b50610b326004803603810190610b2d9190614459565b6131f2565b604051610b3f9190613f7b565b60405180910390f35b348015610b5457600080fd5b50610b6f6004803603810190610b6a9190614ac3565b613212565b005b348015610b7d57600080fd5b50610b86613307565b604051610b939190614544565b60405180910390f35b348015610ba857600080fd5b50610bc36004803603810190610bbe919061418a565b61335f565b604051610bd09190614206565b60405180910390f35b348015610be557600080fd5b50610bee613383565b604051610bfb9190614544565b60405180910390f35b348015610c1057600080fd5b50610c196133db565b604051610c269190614544565b60405180910390f35b6000610c3a82613433565b9050919050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890614b4f565b60405180910390fd5b610cdb82826134ad565b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060028054610d1490614b9e565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4090614b9e565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b5050505050905090565b6000610da282613642565b610dd8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e218261220e565b90508073ffffffffffffffffffffffffffffffffffffffff16610e426136a1565b73ffffffffffffffffffffffffffffffffffffffff1614610ea557610e6e81610e696136a1565b61315e565b610ea4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610f646136a9565b6001546000540303905090565b83836001811115610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90614c1b565b60405180910390fd5b600082118015610fd4575080600d54610fd09190614c6a565b8211155b611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90614cea565b60405180910390fd5b600c548261101f610f5a565b6110299190614c6a565b111561106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190614d56565b60405180910390fd5b6001600381111561107e5761107d614907565b5b600a60009054906101000a900460ff1660038111156110a05761109f614907565b5b146110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d790614de8565b60405180910390fd5b84600d546110ee9190614c6a565b866110f83361307f565b6111029190614c6a565b1115611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a90614e54565b60405180910390fd5b848661114f9190614e74565b600b5461115c9190614ea8565b34101561119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614f36565b60405180910390fd5b6111f26111ab33876136ae565b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050613707565b611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614fa2565b60405180910390fd5b60008511801561124d5750600b548661124a9190614ea8565b34105b1561133e5760011515601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515036112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc9061500e565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b611348338761371e565b505050505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113f95750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90614b4f565b60405180910390fd5b60004233848460405160200161145194939291906150c7565b6040516020818303038152906040528051906020012060001c9050600080600090505b600a811015611622576000601880549050846114909190615131565b90506000601882815481106114a8576114a7615162565b5b9060005260206000200154146114de57601881815481106114cc576114cb615162565b5b906000526020600020015492506114e2565b8092505b6000601860016018805490506114f89190614e74565b8154811061150957611508615162565b5b90600052602060002001540361155257600160188054905061152b9190614e74565b6018828154811061153f5761153e615162565b5b90600052602060002001819055506115a5565b601860016018805490506115669190614e74565b8154811061157757611576615162565b5b90600052602060002001546018828154811061159657611595615162565b5b90600052602060002001819055505b60188054806115b7576115b6615191565b5b60019003818190600052602060002001600090559055601283815481106115e1576115e0615162565b5b906000526020600020015460138381548110611600576115ff615162565b5b906000526020600020018190555050808061161a906151c0565b915050611474565b5050505050565b60006116348261373c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461169b576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806116a784613808565b915091506116bd81876116b86136a1565b61382f565b611709576116d2866116cd6136a1565b61315e565b611708576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361176f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61177c8686866001613873565b801561178757600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061185585611831888887613879565b7c0200000000000000000000000000000000000000000000000000000000176138a1565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036118db57600060018501905060006004600083815260200190815260200160002054036118d95760005481146118d8578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461194386868660016138cc565b505050505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603611ae05760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000611aea6138d2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686611b169190614ea8565b611b209190615208565b90508160000151819350935050509250929050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90614b4f565b60405180910390fd5b6000479050600060019050601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051611c169061526a565b60006040518083038185875af1925050503d8060008114611c53576040519150601f19603f3d011682016040523d82523d6000602084013e611c58565b606091505b50508091505080611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c95906152cb565b60405180910390fd5b5050565b611cbd83838360405180602001604052806000815250612e51565b505050565b60606000611ccf8361271f565b905060008167ffffffffffffffff811115611ced57611cec614700565b5b604051908082528060200260200182016040528015611d1b5781602001602082028036833780820191505090505b509050600080611d296136a9565b90505b611d34610f5a565b8111611db7578573ffffffffffffffffffffffffffffffffffffffff16611d5a8261220e565b73ffffffffffffffffffffffffffffffffffffffff1603611da45780838381518110611d8957611d88615162565b5b6020026020010181815250508180611da0906151c0565b9250505b8080611daf906151c0565b915050611d2c565b50819350505050919050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611e6c5750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614b4f565b60405180910390fd5b600060029050600042338585604051602001611eca94939291906150c7565b6040516020818303038152906040528051906020012060001c905060008282611ef39190615131565b905060148181548110611f0957611f08615162565b5b90600052602060002001546015819055505050505050565b60128181548110611f3157600080fd5b906000526020600020016000915090505481565b600f8054611f5290614b9e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7e90614b9e565b8015611fcb5780601f10611fa057610100808354040283529160200191611fcb565b820191906000526020600020905b815481529060010190602001808311611fae57829003601f168201915b505050505081565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90614b4f565b60405180910390fd5b80600d8190555050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f490614b4f565b60405180910390fd5b80600a60006101000a81548160ff0219169083600381111561212257612121614907565b5b021790555050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b190614b4f565b60405180910390fd5b66b1a2bc2ec50000811015612204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fb90615337565b60405180910390fd5b80600b8190555050565b60006122198261373c565b9050919050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806122c95750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ff90614b4f565b60405180910390fd5b60004233848460405160200161232194939291906150c7565b6040516020818303038152906040528051906020012060001c9050600080600090505b60028110156124f2576000601980549050846123609190615131565b905060006019828154811061237857612377615162565b5b9060005260206000200154146123ae576019818154811061239c5761239b615162565b5b906000526020600020015492506123b2565b8092505b6000601960016019805490506123c89190614e74565b815481106123d9576123d8615162565b5b9060005260206000200154036124225760016019805490506123fb9190614e74565b6019828154811061240f5761240e615162565b5b9060005260206000200181905550612475565b601960016019805490506124369190614e74565b8154811061244757612446615162565b5b90600052602060002001546019828154811061246657612465615162565b5b90600052602060002001819055505b601980548061248757612486615191565b5b60019003818190600052602060002001600090559055601383815481106124b1576124b0615162565b5b9060005260206000200154601483815481106124d0576124cf615162565b5b90600052602060002001819055505080806124ea906151c0565b915050612344565b5050505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806125a25750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d890614b4f565b60405180910390fd5b601180549050828290501461262b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612622906153a3565b60405180910390fd5b81816011919061263c929190613e5d565b505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146126d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c890614b4f565b60405180910390fd5b600c548110612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270c9061540f565b60405180910390fd5b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612786576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600d5481565b6060601180548060200260200160405190810160405280929190818152602001828054801561282b57602002820191906000526020600020905b815481526020019060010190808311612817575b5050505050905090565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6013818154811061286b57600080fd5b906000526020600020016000915090505481565b60606003805461288e90614b9e565b80601f01602080910402602001604051908101604052809291908181526020018280546128ba90614b9e565b80156129075780601f106128dc57610100808354040283529160200191612907565b820191906000526020600020905b8154815290600101906020018083116128ea57829003601f168201915b5050505050905090565b8060006001811115612958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294f90614c1b565b60405180910390fd5b600082118015612975575080600d546129719190614c6a565b8211155b6129b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ab90614cea565b60405180910390fd5b600c54826129c0610f5a565b6129ca9190614c6a565b1115612a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0290614d56565b60405180910390fd5b60026003811115612a1f57612a1e614907565b5b600a60009054906101000a900460ff166003811115612a4157612a40614907565b5b14612a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a789061547b565b60405180910390fd5b6005831115612ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abc9061550d565b60405180910390fd5b82600b54612ad39190614ea8565b341015612b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0c90614f36565b60405180910390fd5b612b1f338461371e565b505050565b8060076000612b316136a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612bde6136a1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c239190613f7b565b60405180910390a35050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb690614b4f565b60405180910390fd5b80601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612dac5750601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de290614b4f565b60405180910390fd5b6012805490508282905014612e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2c906153a3565b60405180910390fd5b818160129190612e46929190613e5d565b505050565b600e5481565b612e5c848484611629565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ebe57612e87848484846138dc565b612ebd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4b90614b4f565b60405180910390fd5b80600e8190555050565b600a60009054906101000a900460ff1681565b6060600f612f7e83613a2c565b604051602001612f8f929190615642565b6040516020818303038152906040529050919050565b600c5481565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461303b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303290614b4f565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061308a82613a7c565b9050919050565b60155481565b601481815481106130a757600080fd5b906000526020600020016000915090505481565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461314b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314290614b4f565b60405180910390fd5b80600f908161315a9190615808565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60106020528060005260406000206000915054906101000a900460ff1681565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146132a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329990614b4f565b60405180910390fd5b600c54826132ae610f5a565b6132b89190614c6a565b11156132f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f090614d56565b60405180910390fd5b613303818361371e565b5050565b6060601480548060200260200160405190810160405280929190818152602001828054801561335557602002820191906000526020600020905b815481526020019060010190808311613341575b5050505050905090565b6011818154811061336f57600080fd5b906000526020600020016000915090505481565b606060138054806020026020016040519081016040528092919081815260200182805480156133d157602002820191906000526020600020905b8154815260200190600101908083116133bd575b5050505050905090565b6060601280548060200260200160405190810160405280929190818152602001828054801561342957602002820191906000526020600020905b815481526020019060010190808311613415575b5050505050905090565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806134a657506134a582613ad3565b5b9050919050565b6134b56138d2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115613513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350a9061594c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613579906159b8565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b60008161364d6136a9565b1115801561365c575060005482105b801561369a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600082826040516020016136c3929190614430565b604051602081830303815290604052805190602001206040516020016136e991906159f9565b60405160208183030381529060405280519060200120905092915050565b600061371682600e5485613b3d565b905092915050565b613738828260405180602001604052806000815250613b54565b5050565b6000808290508061374b6136a9565b116137d1576000548110156137d05760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036137ce575b600081036137c457600460008360019003935083815260200190815260200160002054905061379a565b8092505050613803565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8613890868684613bf1565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139026136a1565b8786866040518563ffffffff1660e01b81526004016139249493929190615a69565b6020604051808303816000875af192505050801561396057506040513d601f19601f8201168201806040525081019061395d9190615aca565b60015b6139d9573d8060008114613990576040519150601f19603f3d011682016040523d82523d6000602084013e613995565b606091505b5060008151036139d1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060a060405101806040526020810391506000825281835b600115613a6757600184039350600a81066030018453600a8104905080613a45575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600082613b4a8584613bfa565b1490509392505050565b613b5e8383613c50565b60008373ffffffffffffffffffffffffffffffffffffffff163b14613bec57600080549050600083820390505b613b9e60008683806001019450866138dc565b613bd4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110613b8b578160005414613be957600080fd5b50505b505050565b60009392505050565b60008082905060005b8451811015613c4557613c3082868381518110613c2357613c22615162565b5b6020026020010151613e0b565b91508080613c3d906151c0565b915050613c03565b508091505092915050565b60008054905060008203613c90576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c9d6000848385613873565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613d1483613d056000866000613879565b613d0e85613e36565b176138a1565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114613db557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613d7a565b5060008203613df0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050613e0660008483856138cc565b505050565b6000818310613e2357613e1e8284613e46565b613e2e565b613e2d8383613e46565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054828255906000526020600020908101928215613e99579160200282015b82811115613e98578235825591602001919060010190613e7d565b5b509050613ea69190613eaa565b5090565b5b80821115613ec3576000816000905550600101613eab565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f1081613edb565b8114613f1b57600080fd5b50565b600081359050613f2d81613f07565b92915050565b600060208284031215613f4957613f48613ed1565b5b6000613f5784828501613f1e565b91505092915050565b60008115159050919050565b613f7581613f60565b82525050565b6000602082019050613f906000830184613f6c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fc182613f96565b9050919050565b613fd181613fb6565b8114613fdc57600080fd5b50565b600081359050613fee81613fc8565b92915050565b60006bffffffffffffffffffffffff82169050919050565b61401581613ff4565b811461402057600080fd5b50565b6000813590506140328161400c565b92915050565b6000806040838503121561404f5761404e613ed1565b5b600061405d85828601613fdf565b925050602061406e85828601614023565b9150509250929050565b61408181613fb6565b82525050565b600060208201905061409c6000830184614078565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156140dc5780820151818401526020810190506140c1565b60008484015250505050565b6000601f19601f8301169050919050565b6000614104826140a2565b61410e81856140ad565b935061411e8185602086016140be565b614127816140e8565b840191505092915050565b6000602082019050818103600083015261414c81846140f9565b905092915050565b6000819050919050565b61416781614154565b811461417257600080fd5b50565b6000813590506141848161415e565b92915050565b6000602082840312156141a05761419f613ed1565b5b60006141ae84828501614175565b91505092915050565b600080604083850312156141ce576141cd613ed1565b5b60006141dc85828601613fdf565b92505060206141ed85828601614175565b9150509250929050565b61420081614154565b82525050565b600060208201905061421b60008301846141f7565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261424657614245614221565b5b8235905067ffffffffffffffff81111561426357614262614226565b5b60208301915083602082028301111561427f5761427e61422b565b5b9250929050565b600080600080606085870312156142a05761429f613ed1565b5b60006142ae87828801614175565b94505060206142bf87828801614175565b935050604085013567ffffffffffffffff8111156142e0576142df613ed6565b5b6142ec87828801614230565b925092505092959194509250565b60008083601f8401126143105761430f614221565b5b8235905067ffffffffffffffff81111561432d5761432c614226565b5b6020830191508360018202830111156143495761434861422b565b5b9250929050565b6000806020838503121561436757614366613ed1565b5b600083013567ffffffffffffffff81111561438557614384613ed6565b5b614391858286016142fa565b92509250509250929050565b6000806000606084860312156143b6576143b5613ed1565b5b60006143c486828701613fdf565b93505060206143d586828701613fdf565b92505060406143e686828701614175565b9150509250925092565b6000806040838503121561440757614406613ed1565b5b600061441585828601614175565b925050602061442685828601614175565b9150509250929050565b60006040820190506144456000830185614078565b61445260208301846141f7565b9392505050565b60006020828403121561446f5761446e613ed1565b5b600061447d84828501613fdf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6144bb81614154565b82525050565b60006144cd83836144b2565b60208301905092915050565b6000602082019050919050565b60006144f182614486565b6144fb8185614491565b9350614506836144a2565b8060005b8381101561453757815161451e88826144c1565b9750614529836144d9565b92505060018101905061450a565b5085935050505092915050565b6000602082019050818103600083015261455e81846144e6565b905092915050565b6004811061457357600080fd5b50565b60008135905061458581614566565b92915050565b6000602082840312156145a1576145a0613ed1565b5b60006145af84828501614576565b91505092915050565b60008083601f8401126145ce576145cd614221565b5b8235905067ffffffffffffffff8111156145eb576145ea614226565b5b6020830191508360208202830111156146075761460661422b565b5b9250929050565b6000806020838503121561462557614624613ed1565b5b600083013567ffffffffffffffff81111561464357614642613ed6565b5b61464f858286016145b8565b92509250509250929050565b61466481613f60565b811461466f57600080fd5b50565b6000813590506146818161465b565b92915050565b6000806040838503121561469e5761469d613ed1565b5b60006146ac85828601613fdf565b92505060206146bd85828601614672565b9150509250929050565b6000819050919050565b6146da816146c7565b82525050565b60006020820190506146f560008301846146d1565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614738826140e8565b810181811067ffffffffffffffff8211171561475757614756614700565b5b80604052505050565b600061476a613ec7565b9050614776828261472f565b919050565b600067ffffffffffffffff82111561479657614795614700565b5b61479f826140e8565b9050602081019050919050565b82818337600083830152505050565b60006147ce6147c98461477b565b614760565b9050828152602081018484840111156147ea576147e96146fb565b5b6147f58482856147ac565b509392505050565b600082601f83011261481257614811614221565b5b81356148228482602086016147bb565b91505092915050565b6000806000806080858703121561484557614844613ed1565b5b600061485387828801613fdf565b945050602061486487828801613fdf565b935050604061487587828801614175565b925050606085013567ffffffffffffffff81111561489657614895613ed6565b5b6148a2878288016147fd565b91505092959194509250565b6148b7816146c7565b81146148c257600080fd5b50565b6000813590506148d4816148ae565b92915050565b6000602082840312156148f0576148ef613ed1565b5b60006148fe848285016148c5565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061494757614946614907565b5b50565b600081905061495882614936565b919050565b60006149688261494a565b9050919050565b6149788161495d565b82525050565b6000602082019050614993600083018461496f565b92915050565b600067ffffffffffffffff8211156149b4576149b3614700565b5b6149bd826140e8565b9050602081019050919050565b60006149dd6149d884614999565b614760565b9050828152602081018484840111156149f9576149f86146fb565b5b614a048482856147ac565b509392505050565b600082601f830112614a2157614a20614221565b5b8135614a318482602086016149ca565b91505092915050565b600060208284031215614a5057614a4f613ed1565b5b600082013567ffffffffffffffff811115614a6e57614a6d613ed6565b5b614a7a84828501614a0c565b91505092915050565b60008060408385031215614a9a57614a99613ed1565b5b6000614aa885828601613fdf565b9250506020614ab985828601613fdf565b9150509250929050565b60008060408385031215614ada57614ad9613ed1565b5b6000614ae885828601614175565b9250506020614af985828601613fdf565b9150509250929050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614b39600e836140ad565b9150614b4482614b03565b602082019050919050565b60006020820190508181036000830152614b6881614b2c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614bb657607f821691505b602082108103614bc957614bc8614b6f565b5b50919050565b7f546f6f206d616e792066726565206d696e747300000000000000000000000000600082015250565b6000614c056013836140ad565b9150614c1082614bcf565b602082019050919050565b60006020820190508181036000830152614c3481614bf8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c7582614154565b9150614c8083614154565b9250828201905080821115614c9857614c97614c3b565b5b92915050565b7f496e76616c6964206d696e7420616d6f756e7400000000000000000000000000600082015250565b6000614cd46013836140ad565b9150614cdf82614c9e565b602082019050919050565b60006020820190508181036000830152614d0381614cc7565b9050919050565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b6000614d406013836140ad565b9150614d4b82614d0a565b602082019050919050565b60006020820190508181036000830152614d6f81614d33565b9050919050565b7f416c6c6f774c697374206d696e74206973206e6f7420617661696c61626c652060008201527f7965740000000000000000000000000000000000000000000000000000000000602082015250565b6000614dd26023836140ad565b9150614ddd82614d76565b604082019050919050565b60006020820190508181036000830152614e0181614dc5565b9050919050565b7f4578636565647320616c6c6f776564206e756d626572206f66206d696e747300600082015250565b6000614e3e601f836140ad565b9150614e4982614e08565b602082019050919050565b60006020820190508181036000830152614e6d81614e31565b9050919050565b6000614e7f82614154565b9150614e8a83614154565b9250828203905081811115614ea257614ea1614c3b565b5b92915050565b6000614eb382614154565b9150614ebe83614154565b9250828202614ecc81614154565b91508282048414831517614ee357614ee2614c3b565b5b5092915050565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000614f206012836140ad565b9150614f2b82614eea565b602082019050919050565b60006020820190508181036000830152614f4f81614f13565b9050919050565b7f496e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b6000614f8c600d836140ad565b9150614f9782614f56565b602082019050919050565b60006020820190508181036000830152614fbb81614f7f565b9050919050565b7f46726565206d696e7420616c726561647920636c61696d656400000000000000600082015250565b6000614ff86019836140ad565b915061500382614fc2565b602082019050919050565b6000602082019050818103600083015261502781614feb565b9050919050565b6000819050919050565b61504961504482614154565b61502e565b82525050565b60008160601b9050919050565b60006150678261504f565b9050919050565b60006150798261505c565b9050919050565b61509161508c82613fb6565b61506e565b82525050565b600081905092915050565b60006150ae8385615097565b93506150bb8385846147ac565b82840190509392505050565b60006150d38287615038565b6020820191506150e38286615080565b6014820191506150f48284866150a2565b915081905095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061513c82614154565b915061514783614154565b92508261515757615156615102565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006151cb82614154565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036151fd576151fc614c3b565b5b600182019050919050565b600061521382614154565b915061521e83614154565b92508261522e5761522d615102565b5b828204905092915050565b600081905092915050565b50565b6000615254600083615239565b915061525f82615244565b600082019050919050565b600061527582615247565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b60006152b5600f836140ad565b91506152c08261527f565b602082019050919050565b600060208201905081810360008301526152e4816152a8565b9050919050565b7f436f737420746f6f206c6f770000000000000000000000000000000000000000600082015250565b6000615321600c836140ad565b915061532c826152eb565b602082019050919050565b6000602082019050818103600083015261535081615314565b9050919050565b7f4261642044617461000000000000000000000000000000000000000000000000600082015250565b600061538d6008836140ad565b915061539882615357565b602082019050919050565b600060208201905081810360008301526153bc81615380565b9050919050565b7f43616e6e6f7420696e6372656173652074686520737570706c79000000000000600082015250565b60006153f9601a836140ad565b9150615404826153c3565b602082019050919050565b60006020820190508181036000830152615428816153ec565b9050919050565b7f5075626c6963206d696e74206973206e6f7420617661696c61626c6520796574600082015250565b60006154656020836140ad565b91506154708261542f565b602082019050919050565b6000602082019050818103600083015261549481615458565b9050919050565b7f546f6f206d616e79206d696e747320706572207472616e73616374696f6e207260008201527f6571756573746564000000000000000000000000000000000000000000000000602082015250565b60006154f76028836140ad565b91506155028261549b565b604082019050919050565b60006020820190508181036000830152615526816154ea565b9050919050565b60008190508160005260206000209050919050565b6000815461554f81614b9e565b6155598186615097565b945060018216600081146155745760018114615589576155bc565b60ff19831686528115158202860193506155bc565b6155928561552d565b60005b838110156155b457815481890152600182019150602081019050615595565b838801955050505b50505092915050565b60006155d0826140a2565b6155da8185615097565b93506155ea8185602086016140be565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061562c600583615097565b9150615637826155f6565b600582019050919050565b600061564e8285615542565b915061565a82846155c5565b91506156658261561f565b91508190509392505050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026156be7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615681565b6156c88683615681565b95508019841693508086168417925050509392505050565b6000819050919050565b60006157056157006156fb84614154565b6156e0565b614154565b9050919050565b6000819050919050565b61571f836156ea565b61573361572b8261570c565b84845461568e565b825550505050565b600090565b61574861573b565b615753818484615716565b505050565b5b818110156157775761576c600082615740565b600181019050615759565b5050565b601f8211156157bc5761578d8161552d565b61579684615671565b810160208510156157a5578190505b6157b96157b185615671565b830182615758565b50505b505050565b600082821c905092915050565b60006157df600019846008026157c1565b1980831691505092915050565b60006157f883836157ce565b9150826002028217905092915050565b615811826140a2565b67ffffffffffffffff81111561582a57615829614700565b5b6158348254614b9e565b61583f82828561577b565b600060209050601f8311600181146158725760008415615860578287015190505b61586a85826157ec565b8655506158d2565b601f1984166158808661552d565b60005b828110156158a857848901518255600182019150602085019450602081019050615883565b868310156158c557848901516158c1601f8916826157ce565b8355505b6001600288020188555050505b505050505050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000615936602a836140ad565b9150615941826158da565b604082019050919050565b6000602082019050818103600083015261596581615929565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006159a26019836140ad565b91506159ad8261596c565b602082019050919050565b600060208201905081810360008301526159d181615995565b9050919050565b6000819050919050565b6159f36159ee826146c7565b6159d8565b82525050565b6000615a0582846159e2565b60208201915081905092915050565b600081519050919050565b600082825260208201905092915050565b6000615a3b82615a14565b615a458185615a1f565b9350615a558185602086016140be565b615a5e816140e8565b840191505092915050565b6000608082019050615a7e6000830187614078565b615a8b6020830186614078565b615a9860408301856141f7565b8181036060830152615aaa8184615a30565b905095945050505050565b600081519050615ac481613f07565b92915050565b600060208284031215615ae057615adf613ed1565b5b6000615aee84828501615ab5565b9150509291505056fea2646970667358221220fbb68e85acc813ca0f84c1f3363601a246c8274510e727496b58860d7f44442164736f6c63430008110033

Deployed Bytecode Sourcemap

68076:8945:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76530:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76362:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68806:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26303:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32794:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32227:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22054:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70752:795;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74186:703;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36433:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4500:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;76749:269;;;;;;;;;;;;;:::i;:::-;;39354:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72125:614;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75618:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68611:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68426:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73196:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72763:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72857:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27696:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74897:713;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73826:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73016;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23238:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68352:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75923:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68886:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68667:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26479:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70394:350;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33352:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73587:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74006:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68385:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40145:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73296:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68229:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71928:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68315:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73690:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71803:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68778:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68723:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73469:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33743:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68505:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71555:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76241:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68554:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76135:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76029;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76530:189;76645:4;76675:36;76699:11;76675:23;:36::i;:::-;76668:43;;76530:189;;;:::o;76362:161::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;76473:42:::1;76492:8;76502:12;76473:18;:42::i;:::-;76362:161:::0;;:::o;68806:73::-;;;;;;;;;;;;;:::o;26303:100::-;26357:13;26390:5;26383:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26303:100;:::o;32794:218::-;32870:7;32895:16;32903:7;32895;:16::i;:::-;32890:64;;32920:34;;;;;;;;;;;;;;32890:64;32974:15;:24;32990:7;32974:24;;;;;;;;;;;:30;;;;;;;;;;;;32967:37;;32794:218;;;:::o;32227:408::-;32316:13;32332:16;32340:7;32332;:16::i;:::-;32316:32;;32388:5;32365:28;;:19;:17;:19::i;:::-;:28;;;32361:175;;32413:44;32430:5;32437:19;:17;:19::i;:::-;32413:16;:44::i;:::-;32408:128;;32485:35;;;;;;;;;;;;;;32408:128;32361:175;32581:2;32548:15;:24;32564:7;32548:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32619:7;32615:2;32599:28;;32608:5;32599:28;;;;;;;;;;;;32305:330;32227:408;;:::o;22054:323::-;22115:7;22343:15;:13;:15::i;:::-;22328:12;;22312:13;;:28;:46;22305:53;;22054:323;:::o;70752:795::-;70898:6;70906:9;69383:1;69369:10;:15;;69361:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;69455:1;69441:11;:15;:56;;;;;69486:10;69476:7;;:20;;;;:::i;:::-;69460:11;:37;;69441:56;69419:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;69608:9;;69593:11;69577:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;69555:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;70941:19:::1;70932:28;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;70924:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;71077:9;71067:7;;:19;;;;:::i;:::-;71056:6;71029:24;71042:10;71029:12;:24::i;:::-;:33;;;;:::i;:::-;:58;;71007:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;71201:9;71192:6;:18;;;;:::i;:::-;71180:8;;:31;;;;:::i;:::-;71167:9;:44;;71159:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;71251:44;71259:28;71265:10;71277:9;71259:5;:28::i;:::-;71289:5;;71251:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:44::i;:::-;71243:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;71338:1;71326:9;:13;:48;;;;;71365:8;;71356:6;:17;;;;:::i;:::-;71343:9;:31;71326:48;71322:180;;;71420:4;71396:28;;:10;:22;71407:10;71396:22;;;;;;;;;;;;;;;;;;;;;;;;;:28;;::::0;71387:67:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;71490:4;71465:10;:22;71476:10;71465:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;71322:180;71510:29;71520:10;71532:6;71510:9;:29::i;:::-;70752:795:::0;;;;;;:::o;74186:703::-;69846:5;;;;;;;;;;;69832:19;;:10;:19;;;:50;;;;69869:13;;;;;;;;;;;69855:27;;:10;:27;;;69832:50;69824:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;74254:18:::1;74310:15;74327:10;74339:7;;74293:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74283:65;;;;;;74275:74;;74254:95;;74360:10;74386:6:::0;74395:1:::1;74386:10;;74381:501;74402:2;74398:1;:6;74381:501;;;74425:19;74460:3;:10;;;;74447;:23;;;;:::i;:::-;74425:45;;74509:1;74489:3;74493:11;74489:16;;;;;;;;:::i;:::-;;;;;;;;;;:21;74485:132;;74532:3;74536:11;74532:16;;;;;;;;:::i;:::-;;;;;;;;;;74527:21;;74485:132;;;74590:11;74585:16;;74485:132;74660:1;74637:3;74654:1;74641:3;:10;;;;:14;;;;:::i;:::-;74637:19;;;;;;;;:::i;:::-;;;;;;;;;;:24:::0;74633:169:::1;;74710:1;74697:3;:10;;;;:14;;;;:::i;:::-;74678:3;74682:11;74678:16;;;;;;;;:::i;:::-;;;;;;;;;:33;;;;74633:169;;;74767:3;74784:1;74771:3;:10;;;;:14;;;;:::i;:::-;74767:19;;;;;;;;:::i;:::-;;;;;;;;;;74748:3;74752:11;74748:16;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;74633:169;74816:3;:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;74858:12;74871:2;74858:16;;;;;;;;:::i;:::-;;;;;;;;;;74840:12;74853:1;74840:15;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;74410:472;74406:3;;;;;:::i;:::-;;;;74381:501;;;;74243:646;;74186:703:::0;;:::o;36433:2825::-;36575:27;36605;36624:7;36605:18;:27::i;:::-;36575:57;;36690:4;36649:45;;36665:19;36649:45;;;36645:86;;36703:28;;;;;;;;;;;;;;36645:86;36745:27;36774:23;36801:35;36828:7;36801:26;:35::i;:::-;36744:92;;;;36936:68;36961:15;36978:4;36984:19;:17;:19::i;:::-;36936:24;:68::i;:::-;36931:180;;37024:43;37041:4;37047:19;:17;:19::i;:::-;37024:16;:43::i;:::-;37019:92;;37076:35;;;;;;;;;;;;;;37019:92;36931:180;37142:1;37128:16;;:2;:16;;;37124:52;;37153:23;;;;;;;;;;;;;;37124:52;37189:43;37211:4;37217:2;37221:7;37230:1;37189:21;:43::i;:::-;37325:15;37322:160;;;37465:1;37444:19;37437:30;37322:160;37862:18;:24;37881:4;37862:24;;;;;;;;;;;;;;;;37860:26;;;;;;;;;;;;37931:18;:22;37950:2;37931:22;;;;;;;;;;;;;;;;37929:24;;;;;;;;;;;38253:146;38290:2;38339:45;38354:4;38360:2;38364:19;38339:14;:45::i;:::-;18453:8;38311:73;38253:18;:146::i;:::-;38224:17;:26;38242:7;38224:26;;;;;;;;;;;:175;;;;38570:1;18453:8;38519:19;:47;:52;38515:627;;38592:19;38624:1;38614:7;:11;38592:33;;38781:1;38747:17;:30;38765:11;38747:30;;;;;;;;;;;;:35;38743:384;;38885:13;;38870:11;:28;38866:242;;39065:19;39032:17;:30;39050:11;39032:30;;;;;;;;;;;:52;;;;38866:242;38743:384;38573:569;38515:627;39189:7;39185:2;39170:27;;39179:4;39170:27;;;;;;;;;;;;39208:42;39229:4;39235:2;39239:7;39248:1;39208:20;:42::i;:::-;36564:2694;;;36433:2825;;;:::o;4500:442::-;4597:7;4606;4626:26;4655:17;:27;4673:8;4655:27;;;;;;;;;;;4626:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4727:1;4699:30;;:7;:16;;;:30;;;4695:92;;4756:19;4746:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4695:92;4799:21;4864:17;:15;:17::i;:::-;4823:58;;4837:7;:23;;;4824:36;;:10;:36;;;;:::i;:::-;4823:58;;;;:::i;:::-;4799:82;;4902:7;:16;;;4920:13;4894:40;;;;;;4500:442;;;;;:::o;76749:269::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;76797:23:::1;76823:21;76797:47;;76855:12;76870:4;76855:19;;76909:5;;;;;;;;;;;76901:19;;76942:15;76901:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76887:75;;;;;76981:7;76973:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;76786:232;;76749:269::o:0;39354:193::-;39500:39;39517:4;39523:2;39527:7;39500:39;;;;;;;;;;;;:16;:39::i;:::-;39354:193;;;:::o;72125:614::-;72212:16;72246:23;72272:17;72282:6;72272:9;:17::i;:::-;72246:43;;72300:28;72345:15;72331:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72300:61;;72372:21;72427:16;72446:15;:13;:15::i;:::-;72427:34;;72408:295;72488:13;:11;:13::i;:::-;72476:8;:25;72408:295;;72578:6;72557:27;;:17;72565:8;72557:7;:17::i;:::-;:27;;;72553:139;;72634:8;72605:11;72617:13;72605:26;;;;;;;;:::i;:::-;;;;;;;:37;;;;;72661:15;;;;;:::i;:::-;;;;72553:139;72516:10;;;;;:::i;:::-;;;;72408:295;;;;72720:11;72713:18;;;;;72125:614;;;:::o;75618:297::-;69846:5;;;;;;;;;;;69832:19;;:10;:19;;;:50;;;;69869:13;;;;;;;;;;;69855:27;;:10;:27;;;69832:50;69824:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;75686:20:::1;75709:1;75686:24;;75721:18;75777:15;75794:10;75806:7;;75760:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75750:65;;;;;;75742:74;;75721:95;;75827:13;75856:12;75843:10;:25;;;;:::i;:::-;75827:41;;75888:12;75901:5;75888:19;;;;;;;;:::i;:::-;;;;;;;;;;75879:6;:28;;;;75675:240;;;75618:297:::0;;:::o;68611:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68426:72::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73196:92::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73272:8:::1;73262:7;:18;;;;73196:92:::0;:::o;72763:86::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;72835:6:::1;72827:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;72763:86:::0;:::o;72857:151::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;72943:10:::1;72931:8;:22;;72923:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;72992:8;72981;:19;;;;72857:151:::0;:::o;27696:152::-;27768:7;27811:27;27830:7;27811:18;:27::i;:::-;27788:52;;27696:152;;;:::o;74897:713::-;69846:5;;;;;;;;;;;69832:19;;:10;:19;;;:50;;;;69869:13;;;;;;;;;;;69855:27;;:10;:27;;;69832:50;69824:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;74965:18:::1;75021:15;75038:10;75050:7;;75004:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74994:65;;;;;;74986:74;;74965:95;;75071:10;75097:6:::0;75106:1:::1;75097:10;;75092:511;75113:1;75109;:5;75092:511;;;75135:19;75170:4;:11;;;;75157:10;:24;;;;:::i;:::-;75135:46;;75221:1;75200:4;75205:11;75200:17;;;;;;;;:::i;:::-;;;;;;;;;;:22;75196:134;;75244:4;75249:11;75244:17;;;;;;;;:::i;:::-;;;;;;;;;;75239:22;;75196:134;;;75303:11;75298:16;;75196:134;75375:1;75350:4;75369:1;75355:4;:11;;;;:15;;;;:::i;:::-;75350:21;;;;;;;;:::i;:::-;;;;;;;;;;:26:::0;75346:176:::1;;75427:1;75413:4;:11;;;;:15;;;;:::i;:::-;75393:4;75398:11;75393:17;;;;;;;;:::i;:::-;;;;;;;;;:35;;;;75346:176;;;75485:4;75504:1;75490:4;:11;;;;:15;;;;:::i;:::-;75485:21;;;;;;;;:::i;:::-;;;;;;;;;;75465:4;75470:11;75465:17;;;;;;;;:::i;:::-;;;;;;;;;:41;;;;75346:176;75536:4;:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;75579:12;75592:2;75579:16;;;;;;;;:::i;:::-;;;;;;;;;;75561:12;75574:1;75561:15;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;75120:483;75116:3;;;;;:::i;:::-;;;;75092:511;;;;74954:656;;74897:713:::0;;:::o;73826:172::-;69846:5;;;;;;;;;;;69832:19;;:10;:19;;;:50;;;;69869:13;;;;;;;;;;;69855:27;;:10;:27;;;69832:50;69824:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;73925:12:::1;:19;;;;73907:7;;:14;;:37;73899:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;73983:7;;73968:12;:22;;;;;;;:::i;:::-;;73826:172:::0;;:::o;73016:::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73107:9:::1;;73094:10;:22;73086:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;73170:10;73158:9;:22;;;;73016:172:::0;:::o;23238:233::-;23310:7;23351:1;23334:19;;:5;:19;;;23330:60;;23362:28;;;;;;;;;;;;;;23330:60;17397:13;23408:18;:25;23427:5;23408:25;;;;;;;;;;;;;;;;:55;23401:62;;23238:233;;;:::o;68352:26::-;;;;:::o;75923:98::-;75966:16;76001:12;75994:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75923:98;:::o;68886:20::-;;;;;;;;;;;;;:::o;68667:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26479:104::-;26535:13;26568:7;26561:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26479:104;:::o;70394:350::-;70454:6;70462:1;69383;69369:10;:15;;69361:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;69455:1;69441:11;:15;:56;;;;;69486:10;69476:7;;:20;;;;:::i;:::-;69460:11;:37;;69441:56;69419:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;69608:9;;69593:11;69577:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;69555:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;70493:16:::1;70484:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;70476:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;70576:1;70566:6;:11;;70557:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;70665:6;70654:8;;:17;;;;:::i;:::-;70641:9;:30;;70633:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;70707:29;70717:10;70729:6;70707:9;:29::i;:::-;70394:350:::0;;;:::o;33352:234::-;33499:8;33447:18;:39;33466:19;:17;:19::i;:::-;33447:39;;;;;;;;;;;;;;;:49;33487:8;33447:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;33559:8;33523:55;;33538:19;:17;:19::i;:::-;33523:55;;;33569:8;33523:55;;;;;;:::i;:::-;;;;;;;;33352:234;;:::o;73587:95::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73665:9:::1;73657:5;;:17;;;;;;;;;;;;;;;;;;73587:95:::0;:::o;74006:172::-;69846:5;;;;;;;;;;;69832:19;;:10;:19;;;:50;;;;69869:13;;;;;;;;;;;69855:27;;:10;:27;;;69832:50;69824:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;74105:12:::1;:19;;;;74087:7;;:14;;:37;74079:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;74163:7;;74148:12;:22;;;;;;;:::i;:::-;;74006:172:::0;;:::o;68385:34::-;;;;:::o;40145:407::-;40320:31;40333:4;40339:2;40343:7;40320:12;:31::i;:::-;40384:1;40366:2;:14;;;:19;40362:183;;40405:56;40436:4;40442:2;40446:7;40455:5;40405:30;:56::i;:::-;40400:145;;40489:40;;;;;;;;;;;;;;40400:145;40362:183;40145:407;;;;:::o;73296:165::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73433:20:::1;73411:19;:42;;;;73296:165:::0;:::o;68229:41::-;;;;;;;;;;;;;:::o;71928:189::-;72009:13;72066:12;72080:18;72090:7;72080:9;:18::i;:::-;72049:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72035:74;;71928:189;;;:::o;68315:30::-;;;;:::o;73690:111::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73783:10:::1;73767:13;;:26;;;;;;;;;;;;;;;;;;73690:111:::0;:::o;71803:117::-;71863:7;71890:22;71904:7;71890:13;:22::i;:::-;71883:29;;71803:117;;;:::o;68778:21::-;;;;:::o;68723:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;73469:110::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;73561:10:::1;73546:12;:25;;;;;;:::i;:::-;;73469:110:::0;:::o;33743:164::-;33840:4;33864:18;:25;33883:5;33864:25;;;;;;;;;;;;;;;:35;33890:8;33864:35;;;;;;;;;;;;;;;;;;;;;;;;;33857:42;;33743:164;;;;:::o;68505:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;71555:224::-;69745:5;;;;;;;;;;;69731:19;;:10;:19;;;69723:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;71699:9:::1;;71689:6;71673:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;71665:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;71743:28;71753:9;71764:6;71743:9;:28::i;:::-;71555:224:::0;;:::o;76241:98::-;76284:16;76319:12;76312:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76241:98;:::o;68554:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76135:98::-;76178:16;76213:12;76206:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76135:98;:::o;76029:::-;76072:16;76107:12;76100:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76029:98;:::o;4230:215::-;4332:4;4371:26;4356:41;;;:11;:41;;;;:81;;;;4401:36;4425:11;4401:23;:36::i;:::-;4356:81;4349:88;;4230:215;;;:::o;5592:332::-;5711:17;:15;:17::i;:::-;5695:33;;:12;:33;;;;5687:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;5814:1;5794:22;;:8;:22;;;5786:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5881:35;;;;;;;;5893:8;5881:35;;;;;;5903:12;5881:35;;;;;5859:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5592:332;;:::o;34165:282::-;34230:4;34286:7;34267:15;:13;:15::i;:::-;:26;;:66;;;;;34320:13;;34310:7;:23;34267:66;:153;;;;;34419:1;18173:8;34371:17;:26;34389:7;34371:26;;;;;;;;;;;;:44;:49;34267:153;34247:173;;34165:282;;;:::o;56473:105::-;56533:7;56560:10;56553:17;;56473:105;:::o;69158:101::-;69223:7;69158:101;:::o;70151:207::-;70252:7;70328;70337:9;70317:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70307:41;;;;;;70294:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;70284:66;;;;;;70277:73;;70151:207;;;;:::o;69949:194::-;70054:4;70083:52;70102:5;70109:19;;70130:4;70083:18;:52::i;:::-;70076:59;;69949:194;;;;:::o;50305:112::-;50382:27;50392:2;50396:8;50382:27;;;;;;;;;;;;:9;:27::i;:::-;50305:112;;:::o;28851:1275::-;28918:7;28938:12;28953:7;28938:22;;29021:4;29002:15;:13;:15::i;:::-;:23;28998:1061;;29055:13;;29048:4;:20;29044:1015;;;29093:14;29110:17;:23;29128:4;29110:23;;;;;;;;;;;;29093:40;;29227:1;18173:8;29199:6;:24;:29;29195:845;;29864:113;29881:1;29871:6;:11;29864:113;;29924:17;:25;29942:6;;;;;;;29924:25;;;;;;;;;;;;29915:34;;29864:113;;;30010:6;30003:13;;;;;;29195:845;29070:989;29044:1015;28998:1061;30087:31;;;;;;;;;;;;;;28851:1275;;;;:::o;35328:485::-;35430:27;35459:23;35500:38;35541:15;:24;35557:7;35541:24;;;;;;;;;;;35500:65;;35718:18;35695:41;;35775:19;35769:26;35750:45;;35680:126;35328:485;;;:::o;34556:659::-;34705:11;34870:16;34863:5;34859:28;34850:37;;35030:16;35019:9;35015:32;35002:45;;35180:15;35169:9;35166:30;35158:5;35147:9;35144:20;35141:56;35131:66;;34556:659;;;;;:::o;41214:159::-;;;;;:::o;55782:311::-;55917:7;55937:16;18577:3;55963:19;:41;;55937:68;;18577:3;56031:31;56042:4;56048:2;56052:9;56031:10;:31::i;:::-;56023:40;;:62;;56016:69;;;55782:311;;;;;:::o;30674:450::-;30754:14;30922:16;30915:5;30911:28;30902:37;;31099:5;31085:11;31060:23;31056:41;31053:52;31046:5;31043:63;31033:73;;30674:450;;;;:::o;42038:158::-;;;;;:::o;5224:97::-;5282:6;5308:5;5301:12;;5224:97;:::o;42636:716::-;42799:4;42845:2;42820:45;;;42866:19;:17;:19::i;:::-;42887:4;42893:7;42902:5;42820:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42816:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43120:1;43103:6;:13;:18;43099:235;;43149:40;;;;;;;;;;;;;;43099:235;43292:6;43286:13;43277:6;43273:2;43269:15;43262:38;42816:529;42989:54;;;42979:64;;;:6;:64;;;;42972:71;;;42636:716;;;;;;:::o;56680:1745::-;56745:17;57179:4;57172;57166:11;57162:22;57271:1;57265:4;57258:15;57346:4;57343:1;57339:12;57332:19;;57428:1;57423:3;57416:14;57532:3;57771:5;57753:428;57779:1;57753:428;;;57819:1;57814:3;57810:11;57803:18;;57990:2;57984:4;57980:13;57976:2;57972:22;57967:3;57959:36;58084:2;58078:4;58074:13;58066:21;;58151:4;57753:428;58141:25;57753:428;57757:21;58220:3;58215;58211:13;58335:4;58330:3;58326:14;58319:21;;58400:6;58395:3;58388:19;56784:1634;;;56680:1745;;;:::o;23553:178::-;23614:7;17397:13;17535:2;23642:18;:25;23661:5;23642:25;;;;;;;;;;;;;;;;:50;;23641:82;23634:89;;23553:178;;;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;59654:190::-;59779:4;59832;59803:25;59816:5;59823:4;59803:12;:25::i;:::-;:33;59796:40;;59654:190;;;;;:::o;49532:689::-;49663:19;49669:2;49673:8;49663:5;:19::i;:::-;49742:1;49724:2;:14;;;:19;49720:483;;49764:11;49778:13;;49764:27;;49810:13;49832:8;49826:3;:14;49810:30;;49859:233;49890:62;49929:1;49933:2;49937:7;;;;;;49946:5;49890:30;:62::i;:::-;49885:167;;49988:40;;;;;;;;;;;;;;49885:167;50087:3;50079:5;:11;49859:233;;50174:3;50157:13;;:20;50153:34;;50179:8;;;50153:34;49745:458;;49720:483;49532:689;;;:::o;55483:147::-;55620:6;55483:147;;;;;:::o;60521:296::-;60604:7;60624:20;60647:4;60624:27;;60667:9;60662:118;60686:5;:12;60682:1;:16;60662:118;;;60735:33;60745:12;60759:5;60765:1;60759:8;;;;;;;;:::i;:::-;;;;;;;;60735:9;:33::i;:::-;60720:48;;60700:3;;;;;:::i;:::-;;;;60662:118;;;;60797:12;60790:19;;;60521:296;;;;:::o;43814:2966::-;43887:20;43910:13;;43887:36;;43950:1;43938:8;:13;43934:44;;43960:18;;;;;;;;;;;;;;43934:44;43991:61;44021:1;44025:2;44029:12;44043:8;43991:21;:61::i;:::-;44535:1;17535:2;44505:1;:26;;44504:32;44492:8;:45;44466:18;:22;44485:2;44466:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;44814:139;44851:2;44905:33;44928:1;44932:2;44936:1;44905:14;:33::i;:::-;44872:30;44893:8;44872:20;:30::i;:::-;:66;44814:18;:139::i;:::-;44780:17;:31;44798:12;44780:31;;;;;;;;;;;:173;;;;44970:16;45001:11;45030:8;45015:12;:23;45001:37;;45551:16;45547:2;45543:25;45531:37;;45923:12;45883:8;45842:1;45780:25;45721:1;45660;45633:335;46294:1;46280:12;46276:20;46234:346;46335:3;46326:7;46323:16;46234:346;;46553:7;46543:8;46540:1;46513:25;46510:1;46507;46502:59;46388:1;46379:7;46375:15;46364:26;;46234:346;;;46238:77;46625:1;46613:8;:13;46609:45;;46635:19;;;;;;;;;;;;;;46609:45;46687:3;46671:13;:19;;;;44240:2462;;46712:60;46741:1;46745:2;46749:12;46763:8;46712:20;:60::i;:::-;43876:2904;43814:2966;;:::o;67561:149::-;67624:7;67655:1;67651;:5;:51;;67682:20;67697:1;67700;67682:14;:20::i;:::-;67651:51;;;67659:20;67674:1;67677;67659:14;:20::i;:::-;67651:51;67644:58;;67561:149;;;;:::o;31226:324::-;31296:14;31529:1;31519:8;31516:15;31490:24;31486:46;31476:56;;31226:324;;;:::o;67718:268::-;67786:13;67893:1;67887:4;67880:15;67922:1;67916:4;67909:15;67963:4;67957;67947:21;67938:30;;67718:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::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:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:118::-;2974:24;2992:5;2974:24;:::i;:::-;2969:3;2962:37;2887:118;;:::o;3011:222::-;3104:4;3142:2;3131:9;3127:18;3119:26;;3155:71;3223:1;3212:9;3208:17;3199:6;3155:71;:::i;:::-;3011:222;;;;:::o;3239:99::-;3291:6;3325:5;3319:12;3309:22;;3239:99;;;:::o;3344:169::-;3428:11;3462:6;3457:3;3450:19;3502:4;3497:3;3493:14;3478:29;;3344:169;;;;:::o;3519:246::-;3600:1;3610:113;3624:6;3621:1;3618:13;3610:113;;;3709:1;3704:3;3700:11;3694:18;3690:1;3685:3;3681:11;3674:39;3646:2;3643:1;3639:10;3634:15;;3610:113;;;3757:1;3748:6;3743:3;3739:16;3732:27;3581:184;3519:246;;;:::o;3771:102::-;3812:6;3863:2;3859:7;3854:2;3847:5;3843:14;3839:28;3829:38;;3771:102;;;:::o;3879:377::-;3967:3;3995:39;4028:5;3995:39;:::i;:::-;4050:71;4114:6;4109:3;4050:71;:::i;:::-;4043:78;;4130:65;4188:6;4183:3;4176:4;4169:5;4165:16;4130:65;:::i;:::-;4220:29;4242:6;4220:29;:::i;:::-;4215:3;4211:39;4204:46;;3971:285;3879:377;;;;:::o;4262:313::-;4375:4;4413:2;4402:9;4398:18;4390:26;;4462:9;4456:4;4452:20;4448:1;4437:9;4433:17;4426:47;4490:78;4563:4;4554:6;4490:78;:::i;:::-;4482:86;;4262:313;;;;:::o;4581:77::-;4618:7;4647:5;4636:16;;4581:77;;;:::o;4664:122::-;4737:24;4755:5;4737:24;:::i;:::-;4730:5;4727:35;4717:63;;4776:1;4773;4766:12;4717:63;4664:122;:::o;4792:139::-;4838:5;4876:6;4863:20;4854:29;;4892:33;4919:5;4892:33;:::i;:::-;4792:139;;;;:::o;4937:329::-;4996:6;5045:2;5033:9;5024:7;5020:23;5016:32;5013:119;;;5051:79;;:::i;:::-;5013:119;5171:1;5196:53;5241:7;5232:6;5221:9;5217:22;5196:53;:::i;:::-;5186:63;;5142:117;4937:329;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:118::-;5839:24;5857:5;5839:24;:::i;:::-;5834:3;5827:37;5752:118;;:::o;5876:222::-;5969:4;6007:2;5996:9;5992:18;5984:26;;6020:71;6088:1;6077:9;6073:17;6064:6;6020:71;:::i;:::-;5876:222;;;;:::o;6104:117::-;6213:1;6210;6203:12;6227:117;6336:1;6333;6326:12;6350:117;6459:1;6456;6449:12;6490:568;6563:8;6573:6;6623:3;6616:4;6608:6;6604:17;6600:27;6590:122;;6631:79;;:::i;:::-;6590:122;6744:6;6731:20;6721:30;;6774:18;6766:6;6763:30;6760:117;;;6796:79;;:::i;:::-;6760:117;6910:4;6902:6;6898:17;6886:29;;6964:3;6956:4;6948:6;6944:17;6934:8;6930:32;6927:41;6924:128;;;6971:79;;:::i;:::-;6924:128;6490:568;;;;;:::o;7064:849::-;7168:6;7176;7184;7192;7241:2;7229:9;7220:7;7216:23;7212:32;7209:119;;;7247:79;;:::i;:::-;7209:119;7367:1;7392:53;7437:7;7428:6;7417:9;7413:22;7392:53;:::i;:::-;7382:63;;7338:117;7494:2;7520:53;7565:7;7556:6;7545:9;7541:22;7520:53;:::i;:::-;7510:63;;7465:118;7650:2;7639:9;7635:18;7622:32;7681:18;7673:6;7670:30;7667:117;;;7703:79;;:::i;:::-;7667:117;7816:80;7888:7;7879:6;7868:9;7864:22;7816:80;:::i;:::-;7798:98;;;;7593:313;7064:849;;;;;;;:::o;7933:553::-;7991:8;8001:6;8051:3;8044:4;8036:6;8032:17;8028:27;8018:122;;8059:79;;:::i;:::-;8018:122;8172:6;8159:20;8149:30;;8202:18;8194:6;8191:30;8188:117;;;8224:79;;:::i;:::-;8188:117;8338:4;8330:6;8326:17;8314:29;;8392:3;8384:4;8376:6;8372:17;8362:8;8358:32;8355:41;8352:128;;;8399:79;;:::i;:::-;8352:128;7933:553;;;;;:::o;8492:529::-;8563:6;8571;8620:2;8608:9;8599:7;8595:23;8591:32;8588:119;;;8626:79;;:::i;:::-;8588:119;8774:1;8763:9;8759:17;8746:31;8804:18;8796:6;8793:30;8790:117;;;8826:79;;:::i;:::-;8790:117;8939:65;8996:7;8987:6;8976:9;8972:22;8939:65;:::i;:::-;8921:83;;;;8717:297;8492:529;;;;;:::o;9027:619::-;9104:6;9112;9120;9169:2;9157:9;9148:7;9144:23;9140:32;9137:119;;;9175:79;;:::i;:::-;9137:119;9295:1;9320:53;9365:7;9356:6;9345:9;9341:22;9320:53;:::i;:::-;9310:63;;9266:117;9422:2;9448:53;9493:7;9484:6;9473:9;9469:22;9448:53;:::i;:::-;9438:63;;9393:118;9550:2;9576:53;9621:7;9612:6;9601:9;9597:22;9576:53;:::i;:::-;9566:63;;9521:118;9027:619;;;;;:::o;9652:474::-;9720:6;9728;9777:2;9765:9;9756:7;9752:23;9748:32;9745:119;;;9783:79;;:::i;:::-;9745:119;9903:1;9928:53;9973:7;9964:6;9953:9;9949:22;9928:53;:::i;:::-;9918:63;;9874:117;10030:2;10056:53;10101:7;10092:6;10081:9;10077:22;10056:53;:::i;:::-;10046:63;;10001:118;9652:474;;;;;:::o;10132:332::-;10253:4;10291:2;10280:9;10276:18;10268:26;;10304:71;10372:1;10361:9;10357:17;10348:6;10304:71;:::i;:::-;10385:72;10453:2;10442:9;10438:18;10429:6;10385:72;:::i;:::-;10132:332;;;;;:::o;10470:329::-;10529:6;10578:2;10566:9;10557:7;10553:23;10549:32;10546:119;;;10584:79;;:::i;:::-;10546:119;10704:1;10729:53;10774:7;10765:6;10754:9;10750:22;10729:53;:::i;:::-;10719:63;;10675:117;10470:329;;;;:::o;10805:114::-;10872:6;10906:5;10900:12;10890:22;;10805:114;;;:::o;10925:184::-;11024:11;11058:6;11053:3;11046:19;11098:4;11093:3;11089:14;11074:29;;10925:184;;;;:::o;11115:132::-;11182:4;11205:3;11197:11;;11235:4;11230:3;11226:14;11218:22;;11115:132;;;:::o;11253:108::-;11330:24;11348:5;11330:24;:::i;:::-;11325:3;11318:37;11253:108;;:::o;11367:179::-;11436:10;11457:46;11499:3;11491:6;11457:46;:::i;:::-;11535:4;11530:3;11526:14;11512:28;;11367:179;;;;:::o;11552:113::-;11622:4;11654;11649:3;11645:14;11637:22;;11552:113;;;:::o;11701:732::-;11820:3;11849:54;11897:5;11849:54;:::i;:::-;11919:86;11998:6;11993:3;11919:86;:::i;:::-;11912:93;;12029:56;12079:5;12029:56;:::i;:::-;12108:7;12139:1;12124:284;12149:6;12146:1;12143:13;12124:284;;;12225:6;12219:13;12252:63;12311:3;12296:13;12252:63;:::i;:::-;12245:70;;12338:60;12391:6;12338:60;:::i;:::-;12328:70;;12184:224;12171:1;12168;12164:9;12159:14;;12124:284;;;12128:14;12424:3;12417:10;;11825:608;;;11701:732;;;;:::o;12439:373::-;12582:4;12620:2;12609:9;12605:18;12597:26;;12669:9;12663:4;12659:20;12655:1;12644:9;12640:17;12633:47;12697:108;12800:4;12791:6;12697:108;:::i;:::-;12689:116;;12439:373;;;;:::o;12818:113::-;12905:1;12898:5;12895:12;12885:40;;12921:1;12918;12911:12;12885:40;12818:113;:::o;12937:167::-;12997:5;13035:6;13022:20;13013:29;;13051:47;13092:5;13051:47;:::i;:::-;12937:167;;;;:::o;13110:357::-;13183:6;13232:2;13220:9;13211:7;13207:23;13203:32;13200:119;;;13238:79;;:::i;:::-;13200:119;13358:1;13383:67;13442:7;13433:6;13422:9;13418:22;13383:67;:::i;:::-;13373:77;;13329:131;13110:357;;;;:::o;13490:568::-;13563:8;13573:6;13623:3;13616:4;13608:6;13604:17;13600:27;13590:122;;13631:79;;:::i;:::-;13590:122;13744:6;13731:20;13721:30;;13774:18;13766:6;13763:30;13760:117;;;13796:79;;:::i;:::-;13760:117;13910:4;13902:6;13898:17;13886:29;;13964:3;13956:4;13948:6;13944:17;13934:8;13930:32;13927:41;13924:128;;;13971:79;;:::i;:::-;13924:128;13490:568;;;;;:::o;14064:559::-;14150:6;14158;14207:2;14195:9;14186:7;14182:23;14178:32;14175:119;;;14213:79;;:::i;:::-;14175:119;14361:1;14350:9;14346:17;14333:31;14391:18;14383:6;14380:30;14377:117;;;14413:79;;:::i;:::-;14377:117;14526:80;14598:7;14589:6;14578:9;14574:22;14526:80;:::i;:::-;14508:98;;;;14304:312;14064:559;;;;;:::o;14629:116::-;14699:21;14714:5;14699:21;:::i;:::-;14692:5;14689:32;14679:60;;14735:1;14732;14725:12;14679:60;14629:116;:::o;14751:133::-;14794:5;14832:6;14819:20;14810:29;;14848:30;14872:5;14848:30;:::i;:::-;14751:133;;;;:::o;14890:468::-;14955:6;14963;15012:2;15000:9;14991:7;14987:23;14983:32;14980:119;;;15018:79;;:::i;:::-;14980:119;15138:1;15163:53;15208:7;15199:6;15188:9;15184:22;15163:53;:::i;:::-;15153:63;;15109:117;15265:2;15291:50;15333:7;15324:6;15313:9;15309:22;15291:50;:::i;:::-;15281:60;;15236:115;14890:468;;;;;:::o;15364:77::-;15401:7;15430:5;15419:16;;15364:77;;;:::o;15447:118::-;15534:24;15552:5;15534:24;:::i;:::-;15529:3;15522:37;15447:118;;:::o;15571:222::-;15664:4;15702:2;15691:9;15687:18;15679:26;;15715:71;15783:1;15772:9;15768:17;15759:6;15715:71;:::i;:::-;15571:222;;;;:::o;15799:117::-;15908:1;15905;15898:12;15922:180;15970:77;15967:1;15960:88;16067:4;16064:1;16057:15;16091:4;16088:1;16081:15;16108:281;16191:27;16213:4;16191:27;:::i;:::-;16183:6;16179:40;16321:6;16309:10;16306:22;16285:18;16273:10;16270:34;16267:62;16264:88;;;16332:18;;:::i;:::-;16264:88;16372:10;16368:2;16361:22;16151:238;16108:281;;:::o;16395:129::-;16429:6;16456:20;;:::i;:::-;16446:30;;16485:33;16513:4;16505:6;16485:33;:::i;:::-;16395:129;;;:::o;16530:307::-;16591:4;16681:18;16673:6;16670:30;16667:56;;;16703:18;;:::i;:::-;16667:56;16741:29;16763:6;16741:29;:::i;:::-;16733:37;;16825:4;16819;16815:15;16807:23;;16530:307;;;:::o;16843:146::-;16940:6;16935:3;16930;16917:30;16981:1;16972:6;16967:3;16963:16;16956:27;16843:146;;;:::o;16995:423::-;17072:5;17097:65;17113:48;17154:6;17113:48;:::i;:::-;17097:65;:::i;:::-;17088:74;;17185:6;17178:5;17171:21;17223:4;17216:5;17212:16;17261:3;17252:6;17247:3;17243:16;17240:25;17237:112;;;17268:79;;:::i;:::-;17237:112;17358:54;17405:6;17400:3;17395;17358:54;:::i;:::-;17078:340;16995:423;;;;;:::o;17437:338::-;17492:5;17541:3;17534:4;17526:6;17522:17;17518:27;17508:122;;17549:79;;:::i;:::-;17508:122;17666:6;17653:20;17691:78;17765:3;17757:6;17750:4;17742:6;17738:17;17691:78;:::i;:::-;17682:87;;17498:277;17437:338;;;;:::o;17781:943::-;17876:6;17884;17892;17900;17949:3;17937:9;17928:7;17924:23;17920:33;17917:120;;;17956:79;;:::i;:::-;17917:120;18076:1;18101:53;18146:7;18137:6;18126:9;18122:22;18101:53;:::i;:::-;18091:63;;18047:117;18203:2;18229:53;18274:7;18265:6;18254:9;18250:22;18229:53;:::i;:::-;18219:63;;18174:118;18331:2;18357:53;18402:7;18393:6;18382:9;18378:22;18357:53;:::i;:::-;18347:63;;18302:118;18487:2;18476:9;18472:18;18459:32;18518:18;18510:6;18507:30;18504:117;;;18540:79;;:::i;:::-;18504:117;18645:62;18699:7;18690:6;18679:9;18675:22;18645:62;:::i;:::-;18635:72;;18430:287;17781:943;;;;;;;:::o;18730:122::-;18803:24;18821:5;18803:24;:::i;:::-;18796:5;18793:35;18783:63;;18842:1;18839;18832:12;18783:63;18730:122;:::o;18858:139::-;18904:5;18942:6;18929:20;18920:29;;18958:33;18985:5;18958:33;:::i;:::-;18858:139;;;;:::o;19003:329::-;19062:6;19111:2;19099:9;19090:7;19086:23;19082:32;19079:119;;;19117:79;;:::i;:::-;19079:119;19237:1;19262:53;19307:7;19298:6;19287:9;19283:22;19262:53;:::i;:::-;19252:63;;19208:117;19003:329;;;;:::o;19338:180::-;19386:77;19383:1;19376:88;19483:4;19480:1;19473:15;19507:4;19504:1;19497:15;19524:119;19611:1;19604:5;19601:12;19591:46;;19617:18;;:::i;:::-;19591:46;19524:119;:::o;19649:139::-;19700:7;19729:5;19718:16;;19735:47;19776:5;19735:47;:::i;:::-;19649:139;;;:::o;19794:::-;19856:9;19889:38;19921:5;19889:38;:::i;:::-;19876:51;;19794:139;;;:::o;19939:155::-;20038:49;20081:5;20038:49;:::i;:::-;20033:3;20026:62;19939:155;;:::o;20100:246::-;20205:4;20243:2;20232:9;20228:18;20220:26;;20256:83;20336:1;20325:9;20321:17;20312:6;20256:83;:::i;:::-;20100:246;;;;:::o;20352:308::-;20414:4;20504:18;20496:6;20493:30;20490:56;;;20526:18;;:::i;:::-;20490:56;20564:29;20586:6;20564:29;:::i;:::-;20556:37;;20648:4;20642;20638:15;20630:23;;20352:308;;;:::o;20666:425::-;20744:5;20769:66;20785:49;20827:6;20785:49;:::i;:::-;20769:66;:::i;:::-;20760:75;;20858:6;20851:5;20844:21;20896:4;20889:5;20885:16;20934:3;20925:6;20920:3;20916:16;20913:25;20910:112;;;20941:79;;:::i;:::-;20910:112;21031:54;21078:6;21073:3;21068;21031:54;:::i;:::-;20750:341;20666:425;;;;;:::o;21111:340::-;21167:5;21216:3;21209:4;21201:6;21197:17;21193:27;21183:122;;21224:79;;:::i;:::-;21183:122;21341:6;21328:20;21366:79;21441:3;21433:6;21426:4;21418:6;21414:17;21366:79;:::i;:::-;21357:88;;21173:278;21111:340;;;;:::o;21457:509::-;21526:6;21575:2;21563:9;21554:7;21550:23;21546:32;21543:119;;;21581:79;;:::i;:::-;21543:119;21729:1;21718:9;21714:17;21701:31;21759:18;21751:6;21748:30;21745:117;;;21781:79;;:::i;:::-;21745:117;21886:63;21941:7;21932:6;21921:9;21917:22;21886:63;:::i;:::-;21876:73;;21672:287;21457:509;;;;:::o;21972:474::-;22040:6;22048;22097:2;22085:9;22076:7;22072:23;22068:32;22065:119;;;22103:79;;:::i;:::-;22065:119;22223:1;22248:53;22293:7;22284:6;22273:9;22269:22;22248:53;:::i;:::-;22238:63;;22194:117;22350:2;22376:53;22421:7;22412:6;22401:9;22397:22;22376:53;:::i;:::-;22366:63;;22321:118;21972:474;;;;;:::o;22452:::-;22520:6;22528;22577:2;22565:9;22556:7;22552:23;22548:32;22545:119;;;22583:79;;:::i;:::-;22545:119;22703:1;22728:53;22773:7;22764:6;22753:9;22749:22;22728:53;:::i;:::-;22718:63;;22674:117;22830:2;22856:53;22901:7;22892:6;22881:9;22877:22;22856:53;:::i;:::-;22846:63;;22801:118;22452:474;;;;;:::o;22932:164::-;23072:16;23068:1;23060:6;23056:14;23049:40;22932:164;:::o;23102:366::-;23244:3;23265:67;23329:2;23324:3;23265:67;:::i;:::-;23258:74;;23341:93;23430:3;23341:93;:::i;:::-;23459:2;23454:3;23450:12;23443:19;;23102:366;;;:::o;23474:419::-;23640:4;23678:2;23667:9;23663:18;23655:26;;23727:9;23721:4;23717:20;23713:1;23702:9;23698:17;23691:47;23755:131;23881:4;23755:131;:::i;:::-;23747:139;;23474:419;;;:::o;23899:180::-;23947:77;23944:1;23937:88;24044:4;24041:1;24034:15;24068:4;24065:1;24058:15;24085:320;24129:6;24166:1;24160:4;24156:12;24146:22;;24213:1;24207:4;24203:12;24234:18;24224:81;;24290:4;24282:6;24278:17;24268:27;;24224:81;24352:2;24344:6;24341:14;24321:18;24318:38;24315:84;;24371:18;;:::i;:::-;24315:84;24136:269;24085:320;;;:::o;24411:169::-;24551:21;24547:1;24539:6;24535:14;24528:45;24411:169;:::o;24586:366::-;24728:3;24749:67;24813:2;24808:3;24749:67;:::i;:::-;24742:74;;24825:93;24914:3;24825:93;:::i;:::-;24943:2;24938:3;24934:12;24927:19;;24586:366;;;:::o;24958:419::-;25124:4;25162:2;25151:9;25147:18;25139:26;;25211:9;25205:4;25201:20;25197:1;25186:9;25182:17;25175:47;25239:131;25365:4;25239:131;:::i;:::-;25231:139;;24958:419;;;:::o;25383:180::-;25431:77;25428:1;25421:88;25528:4;25525:1;25518:15;25552:4;25549:1;25542:15;25569:191;25609:3;25628:20;25646:1;25628:20;:::i;:::-;25623:25;;25662:20;25680:1;25662:20;:::i;:::-;25657:25;;25705:1;25702;25698:9;25691:16;;25726:3;25723:1;25720:10;25717:36;;;25733:18;;:::i;:::-;25717:36;25569:191;;;;:::o;25766:169::-;25906:21;25902:1;25894:6;25890:14;25883:45;25766:169;:::o;25941:366::-;26083:3;26104:67;26168:2;26163:3;26104:67;:::i;:::-;26097:74;;26180:93;26269:3;26180:93;:::i;:::-;26298:2;26293:3;26289:12;26282:19;;25941:366;;;:::o;26313:419::-;26479:4;26517:2;26506:9;26502:18;26494:26;;26566:9;26560:4;26556:20;26552:1;26541:9;26537:17;26530:47;26594:131;26720:4;26594:131;:::i;:::-;26586:139;;26313:419;;;:::o;26738:169::-;26878:21;26874:1;26866:6;26862:14;26855:45;26738:169;:::o;26913:366::-;27055:3;27076:67;27140:2;27135:3;27076:67;:::i;:::-;27069:74;;27152:93;27241:3;27152:93;:::i;:::-;27270:2;27265:3;27261:12;27254:19;;26913:366;;;:::o;27285:419::-;27451:4;27489:2;27478:9;27474:18;27466:26;;27538:9;27532:4;27528:20;27524:1;27513:9;27509:17;27502:47;27566:131;27692:4;27566:131;:::i;:::-;27558:139;;27285:419;;;:::o;27710:222::-;27850:34;27846:1;27838:6;27834:14;27827:58;27919:5;27914:2;27906:6;27902:15;27895:30;27710:222;:::o;27938:366::-;28080:3;28101:67;28165:2;28160:3;28101:67;:::i;:::-;28094:74;;28177:93;28266:3;28177:93;:::i;:::-;28295:2;28290:3;28286:12;28279:19;;27938:366;;;:::o;28310:419::-;28476:4;28514:2;28503:9;28499:18;28491:26;;28563:9;28557:4;28553:20;28549:1;28538:9;28534:17;28527:47;28591:131;28717:4;28591:131;:::i;:::-;28583:139;;28310:419;;;:::o;28735:181::-;28875:33;28871:1;28863:6;28859:14;28852:57;28735:181;:::o;28922:366::-;29064:3;29085:67;29149:2;29144:3;29085:67;:::i;:::-;29078:74;;29161:93;29250:3;29161:93;:::i;:::-;29279:2;29274:3;29270:12;29263:19;;28922:366;;;:::o;29294:419::-;29460:4;29498:2;29487:9;29483:18;29475:26;;29547:9;29541:4;29537:20;29533:1;29522:9;29518:17;29511:47;29575:131;29701:4;29575:131;:::i;:::-;29567:139;;29294:419;;;:::o;29719:194::-;29759:4;29779:20;29797:1;29779:20;:::i;:::-;29774:25;;29813:20;29831:1;29813:20;:::i;:::-;29808:25;;29857:1;29854;29850:9;29842:17;;29881:1;29875:4;29872:11;29869:37;;;29886:18;;:::i;:::-;29869:37;29719:194;;;;:::o;29919:410::-;29959:7;29982:20;30000:1;29982:20;:::i;:::-;29977:25;;30016:20;30034:1;30016:20;:::i;:::-;30011:25;;30071:1;30068;30064:9;30093:30;30111:11;30093:30;:::i;:::-;30082:41;;30272:1;30263:7;30259:15;30256:1;30253:22;30233:1;30226:9;30206:83;30183:139;;30302:18;;:::i;:::-;30183:139;29967:362;29919:410;;;;:::o;30335:168::-;30475:20;30471:1;30463:6;30459:14;30452:44;30335:168;:::o;30509:366::-;30651:3;30672:67;30736:2;30731:3;30672:67;:::i;:::-;30665:74;;30748:93;30837:3;30748:93;:::i;:::-;30866:2;30861:3;30857:12;30850:19;;30509:366;;;:::o;30881:419::-;31047:4;31085:2;31074:9;31070:18;31062:26;;31134:9;31128:4;31124:20;31120:1;31109:9;31105:17;31098:47;31162:131;31288:4;31162:131;:::i;:::-;31154:139;;30881:419;;;:::o;31306:163::-;31446:15;31442:1;31434:6;31430:14;31423:39;31306:163;:::o;31475:366::-;31617:3;31638:67;31702:2;31697:3;31638:67;:::i;:::-;31631:74;;31714:93;31803:3;31714:93;:::i;:::-;31832:2;31827:3;31823:12;31816:19;;31475:366;;;:::o;31847:419::-;32013:4;32051:2;32040:9;32036:18;32028:26;;32100:9;32094:4;32090:20;32086:1;32075:9;32071:17;32064:47;32128:131;32254:4;32128:131;:::i;:::-;32120:139;;31847:419;;;:::o;32272:175::-;32412:27;32408:1;32400:6;32396:14;32389:51;32272:175;:::o;32453:366::-;32595:3;32616:67;32680:2;32675:3;32616:67;:::i;:::-;32609:74;;32692:93;32781:3;32692:93;:::i;:::-;32810:2;32805:3;32801:12;32794:19;;32453:366;;;:::o;32825:419::-;32991:4;33029:2;33018:9;33014:18;33006:26;;33078:9;33072:4;33068:20;33064:1;33053:9;33049:17;33042:47;33106:131;33232:4;33106:131;:::i;:::-;33098:139;;32825:419;;;:::o;33250:79::-;33289:7;33318:5;33307:16;;33250:79;;;:::o;33335:157::-;33440:45;33460:24;33478:5;33460:24;:::i;:::-;33440:45;:::i;:::-;33435:3;33428:58;33335:157;;:::o;33498:94::-;33531:8;33579:5;33575:2;33571:14;33550:35;;33498:94;;;:::o;33598:::-;33637:7;33666:20;33680:5;33666:20;:::i;:::-;33655:31;;33598:94;;;:::o;33698:100::-;33737:7;33766:26;33786:5;33766:26;:::i;:::-;33755:37;;33698:100;;;:::o;33804:157::-;33909:45;33929:24;33947:5;33929:24;:::i;:::-;33909:45;:::i;:::-;33904:3;33897:58;33804:157;;:::o;33967:148::-;34069:11;34106:3;34091:18;;33967:148;;;;:::o;34145:330::-;34261:3;34282:89;34364:6;34359:3;34282:89;:::i;:::-;34275:96;;34381:56;34430:6;34425:3;34418:5;34381:56;:::i;:::-;34462:6;34457:3;34453:16;34446:23;;34145:330;;;;;:::o;34481:577::-;34679:3;34694:75;34765:3;34756:6;34694:75;:::i;:::-;34794:2;34789:3;34785:12;34778:19;;34807:75;34878:3;34869:6;34807:75;:::i;:::-;34907:2;34902:3;34898:12;34891:19;;34927:105;35028:3;35019:6;35011;34927:105;:::i;:::-;34920:112;;35049:3;35042:10;;34481:577;;;;;;;:::o;35064:180::-;35112:77;35109:1;35102:88;35209:4;35206:1;35199:15;35233:4;35230:1;35223:15;35250:176;35282:1;35299:20;35317:1;35299:20;:::i;:::-;35294:25;;35333:20;35351:1;35333:20;:::i;:::-;35328:25;;35372:1;35362:35;;35377:18;;:::i;:::-;35362:35;35418:1;35415;35411:9;35406:14;;35250:176;;;;:::o;35432:180::-;35480:77;35477:1;35470:88;35577:4;35574:1;35567:15;35601:4;35598:1;35591:15;35618:180;35666:77;35663:1;35656:88;35763:4;35760:1;35753:15;35787:4;35784:1;35777:15;35804:233;35843:3;35866:24;35884:5;35866:24;:::i;:::-;35857:33;;35912:66;35905:5;35902:77;35899:103;;35982:18;;:::i;:::-;35899:103;36029:1;36022:5;36018:13;36011:20;;35804:233;;;:::o;36043:185::-;36083:1;36100:20;36118:1;36100:20;:::i;:::-;36095:25;;36134:20;36152:1;36134:20;:::i;:::-;36129:25;;36173:1;36163:35;;36178:18;;:::i;:::-;36163:35;36220:1;36217;36213:9;36208:14;;36043:185;;;;:::o;36234:147::-;36335:11;36372:3;36357:18;;36234:147;;;;:::o;36387:114::-;;:::o;36507:398::-;36666:3;36687:83;36768:1;36763:3;36687:83;:::i;:::-;36680:90;;36779:93;36868:3;36779:93;:::i;:::-;36897:1;36892:3;36888:11;36881:18;;36507:398;;;:::o;36911:379::-;37095:3;37117:147;37260:3;37117:147;:::i;:::-;37110:154;;37281:3;37274:10;;36911:379;;;:::o;37296:165::-;37436:17;37432:1;37424:6;37420:14;37413:41;37296:165;:::o;37467:366::-;37609:3;37630:67;37694:2;37689:3;37630:67;:::i;:::-;37623:74;;37706:93;37795:3;37706:93;:::i;:::-;37824:2;37819:3;37815:12;37808:19;;37467:366;;;:::o;37839:419::-;38005:4;38043:2;38032:9;38028:18;38020:26;;38092:9;38086:4;38082:20;38078:1;38067:9;38063:17;38056:47;38120:131;38246:4;38120:131;:::i;:::-;38112:139;;37839:419;;;:::o;38264:162::-;38404:14;38400:1;38392:6;38388:14;38381:38;38264:162;:::o;38432:366::-;38574:3;38595:67;38659:2;38654:3;38595:67;:::i;:::-;38588:74;;38671:93;38760:3;38671:93;:::i;:::-;38789:2;38784:3;38780:12;38773:19;;38432:366;;;:::o;38804:419::-;38970:4;39008:2;38997:9;38993:18;38985:26;;39057:9;39051:4;39047:20;39043:1;39032:9;39028:17;39021:47;39085:131;39211:4;39085:131;:::i;:::-;39077:139;;38804:419;;;:::o;39229:158::-;39369:10;39365:1;39357:6;39353:14;39346:34;39229:158;:::o;39393:365::-;39535:3;39556:66;39620:1;39615:3;39556:66;:::i;:::-;39549:73;;39631:93;39720:3;39631:93;:::i;:::-;39749:2;39744:3;39740:12;39733:19;;39393:365;;;:::o;39764:419::-;39930:4;39968:2;39957:9;39953:18;39945:26;;40017:9;40011:4;40007:20;40003:1;39992:9;39988:17;39981:47;40045:131;40171:4;40045:131;:::i;:::-;40037:139;;39764:419;;;:::o;40189:176::-;40329:28;40325:1;40317:6;40313:14;40306:52;40189:176;:::o;40371:366::-;40513:3;40534:67;40598:2;40593:3;40534:67;:::i;:::-;40527:74;;40610:93;40699:3;40610:93;:::i;:::-;40728:2;40723:3;40719:12;40712:19;;40371:366;;;:::o;40743:419::-;40909:4;40947:2;40936:9;40932:18;40924:26;;40996:9;40990:4;40986:20;40982:1;40971:9;40967:17;40960:47;41024:131;41150:4;41024:131;:::i;:::-;41016:139;;40743:419;;;:::o;41168:182::-;41308:34;41304:1;41296:6;41292:14;41285:58;41168:182;:::o;41356:366::-;41498:3;41519:67;41583:2;41578:3;41519:67;:::i;:::-;41512:74;;41595:93;41684:3;41595:93;:::i;:::-;41713:2;41708:3;41704:12;41697:19;;41356:366;;;:::o;41728:419::-;41894:4;41932:2;41921:9;41917:18;41909:26;;41981:9;41975:4;41971:20;41967:1;41956:9;41952:17;41945:47;42009:131;42135:4;42009:131;:::i;:::-;42001:139;;41728:419;;;:::o;42153:227::-;42293:34;42289:1;42281:6;42277:14;42270:58;42362:10;42357:2;42349:6;42345:15;42338:35;42153:227;:::o;42386:366::-;42528:3;42549:67;42613:2;42608:3;42549:67;:::i;:::-;42542:74;;42625:93;42714:3;42625:93;:::i;:::-;42743:2;42738:3;42734:12;42727:19;;42386:366;;;:::o;42758:419::-;42924:4;42962:2;42951:9;42947:18;42939:26;;43011:9;43005:4;43001:20;42997:1;42986:9;42982:17;42975:47;43039:131;43165:4;43039:131;:::i;:::-;43031:139;;42758:419;;;:::o;43183:141::-;43232:4;43255:3;43247:11;;43278:3;43275:1;43268:14;43312:4;43309:1;43299:18;43291:26;;43183:141;;;:::o;43354:874::-;43457:3;43494:5;43488:12;43523:36;43549:9;43523:36;:::i;:::-;43575:89;43657:6;43652:3;43575:89;:::i;:::-;43568:96;;43695:1;43684:9;43680:17;43711:1;43706:166;;;;43886:1;43881:341;;;;43673:549;;43706:166;43790:4;43786:9;43775;43771:25;43766:3;43759:38;43852:6;43845:14;43838:22;43830:6;43826:35;43821:3;43817:45;43810:52;;43706:166;;43881:341;43948:38;43980:5;43948:38;:::i;:::-;44008:1;44022:154;44036:6;44033:1;44030:13;44022:154;;;44110:7;44104:14;44100:1;44095:3;44091:11;44084:35;44160:1;44151:7;44147:15;44136:26;;44058:4;44055:1;44051:12;44046:17;;44022:154;;;44205:6;44200:3;44196:16;44189:23;;43888:334;;43673:549;;43461:767;;43354:874;;;;:::o;44234:390::-;44340:3;44368:39;44401:5;44368:39;:::i;:::-;44423:89;44505:6;44500:3;44423:89;:::i;:::-;44416:96;;44521:65;44579:6;44574:3;44567:4;44560:5;44556:16;44521:65;:::i;:::-;44611:6;44606:3;44602:16;44595:23;;44344:280;44234:390;;;;:::o;44630:155::-;44770:7;44766:1;44758:6;44754:14;44747:31;44630:155;:::o;44791:400::-;44951:3;44972:84;45054:1;45049:3;44972:84;:::i;:::-;44965:91;;45065:93;45154:3;45065:93;:::i;:::-;45183:1;45178:3;45174:11;45167:18;;44791:400;;;:::o;45197:695::-;45475:3;45497:92;45585:3;45576:6;45497:92;:::i;:::-;45490:99;;45606:95;45697:3;45688:6;45606:95;:::i;:::-;45599:102;;45718:148;45862:3;45718:148;:::i;:::-;45711:155;;45883:3;45876:10;;45197:695;;;;;:::o;45898:93::-;45935:6;45982:2;45977;45970:5;45966:14;45962:23;45952:33;;45898:93;;;:::o;45997:107::-;46041:8;46091:5;46085:4;46081:16;46060:37;;45997:107;;;;:::o;46110:393::-;46179:6;46229:1;46217:10;46213:18;46252:97;46282:66;46271:9;46252:97;:::i;:::-;46370:39;46400:8;46389:9;46370:39;:::i;:::-;46358:51;;46442:4;46438:9;46431:5;46427:21;46418:30;;46491:4;46481:8;46477:19;46470:5;46467:30;46457:40;;46186:317;;46110:393;;;;;:::o;46509:60::-;46537:3;46558:5;46551:12;;46509:60;;;:::o;46575:142::-;46625:9;46658:53;46676:34;46685:24;46703:5;46685:24;:::i;:::-;46676:34;:::i;:::-;46658:53;:::i;:::-;46645:66;;46575:142;;;:::o;46723:75::-;46766:3;46787:5;46780:12;;46723:75;;;:::o;46804:269::-;46914:39;46945:7;46914:39;:::i;:::-;46975:91;47024:41;47048:16;47024:41;:::i;:::-;47016:6;47009:4;47003:11;46975:91;:::i;:::-;46969:4;46962:105;46880:193;46804:269;;;:::o;47079:73::-;47124:3;47079:73;:::o;47158:189::-;47235:32;;:::i;:::-;47276:65;47334:6;47326;47320:4;47276:65;:::i;:::-;47211:136;47158:189;;:::o;47353:186::-;47413:120;47430:3;47423:5;47420:14;47413:120;;;47484:39;47521:1;47514:5;47484:39;:::i;:::-;47457:1;47450:5;47446:13;47437:22;;47413:120;;;47353:186;;:::o;47545:543::-;47646:2;47641:3;47638:11;47635:446;;;47680:38;47712:5;47680:38;:::i;:::-;47764:29;47782:10;47764:29;:::i;:::-;47754:8;47750:44;47947:2;47935:10;47932:18;47929:49;;;47968:8;47953:23;;47929:49;47991:80;48047:22;48065:3;48047:22;:::i;:::-;48037:8;48033:37;48020:11;47991:80;:::i;:::-;47650:431;;47635:446;47545:543;;;:::o;48094:117::-;48148:8;48198:5;48192:4;48188:16;48167:37;;48094:117;;;;:::o;48217:169::-;48261:6;48294:51;48342:1;48338:6;48330:5;48327:1;48323:13;48294:51;:::i;:::-;48290:56;48375:4;48369;48365:15;48355:25;;48268:118;48217:169;;;;:::o;48391:295::-;48467:4;48613:29;48638:3;48632:4;48613:29;:::i;:::-;48605:37;;48675:3;48672:1;48668:11;48662:4;48659:21;48651:29;;48391:295;;;;:::o;48691:1395::-;48808:37;48841:3;48808:37;:::i;:::-;48910:18;48902:6;48899:30;48896:56;;;48932:18;;:::i;:::-;48896:56;48976:38;49008:4;49002:11;48976:38;:::i;:::-;49061:67;49121:6;49113;49107:4;49061:67;:::i;:::-;49155:1;49179:4;49166:17;;49211:2;49203:6;49200:14;49228:1;49223:618;;;;49885:1;49902:6;49899:77;;;49951:9;49946:3;49942:19;49936:26;49927:35;;49899:77;50002:67;50062:6;50055:5;50002:67;:::i;:::-;49996:4;49989:81;49858:222;49193:887;;49223:618;49275:4;49271:9;49263:6;49259:22;49309:37;49341:4;49309:37;:::i;:::-;49368:1;49382:208;49396:7;49393:1;49390:14;49382:208;;;49475:9;49470:3;49466:19;49460:26;49452:6;49445:42;49526:1;49518:6;49514:14;49504:24;;49573:2;49562:9;49558:18;49545:31;;49419:4;49416:1;49412:12;49407:17;;49382:208;;;49618:6;49609:7;49606:19;49603:179;;;49676:9;49671:3;49667:19;49661:26;49719:48;49761:4;49753:6;49749:17;49738:9;49719:48;:::i;:::-;49711:6;49704:64;49626:156;49603:179;49828:1;49824;49816:6;49812:14;49808:22;49802:4;49795:36;49230:611;;;49193:887;;48783:1303;;;48691:1395;;:::o;50092:229::-;50232:34;50228:1;50220:6;50216:14;50209:58;50301:12;50296:2;50288:6;50284:15;50277:37;50092:229;:::o;50327:366::-;50469:3;50490:67;50554:2;50549:3;50490:67;:::i;:::-;50483:74;;50566:93;50655:3;50566:93;:::i;:::-;50684:2;50679:3;50675:12;50668:19;;50327:366;;;:::o;50699:419::-;50865:4;50903:2;50892:9;50888:18;50880:26;;50952:9;50946:4;50942:20;50938:1;50927:9;50923:17;50916:47;50980:131;51106:4;50980:131;:::i;:::-;50972:139;;50699:419;;;:::o;51124:175::-;51264:27;51260:1;51252:6;51248:14;51241:51;51124:175;:::o;51305:366::-;51447:3;51468:67;51532:2;51527:3;51468:67;:::i;:::-;51461:74;;51544:93;51633:3;51544:93;:::i;:::-;51662:2;51657:3;51653:12;51646:19;;51305:366;;;:::o;51677:419::-;51843:4;51881:2;51870:9;51866:18;51858:26;;51930:9;51924:4;51920:20;51916:1;51905:9;51901:17;51894:47;51958:131;52084:4;51958:131;:::i;:::-;51950:139;;51677:419;;;:::o;52102:79::-;52141:7;52170:5;52159:16;;52102:79;;;:::o;52187:157::-;52292:45;52312:24;52330:5;52312:24;:::i;:::-;52292:45;:::i;:::-;52287:3;52280:58;52187:157;;:::o;52350:256::-;52462:3;52477:75;52548:3;52539:6;52477:75;:::i;:::-;52577:2;52572:3;52568:12;52561:19;;52597:3;52590:10;;52350:256;;;;:::o;52612:98::-;52663:6;52697:5;52691:12;52681:22;;52612:98;;;:::o;52716:168::-;52799:11;52833:6;52828:3;52821:19;52873:4;52868:3;52864:14;52849:29;;52716:168;;;;:::o;52890:373::-;52976:3;53004:38;53036:5;53004:38;:::i;:::-;53058:70;53121:6;53116:3;53058:70;:::i;:::-;53051:77;;53137:65;53195:6;53190:3;53183:4;53176:5;53172:16;53137:65;:::i;:::-;53227:29;53249:6;53227:29;:::i;:::-;53222:3;53218:39;53211:46;;52980:283;52890:373;;;;:::o;53269:640::-;53464:4;53502:3;53491:9;53487:19;53479:27;;53516:71;53584:1;53573:9;53569:17;53560:6;53516:71;:::i;:::-;53597:72;53665:2;53654:9;53650:18;53641:6;53597:72;:::i;:::-;53679;53747:2;53736:9;53732:18;53723:6;53679:72;:::i;:::-;53798:9;53792:4;53788:20;53783:2;53772:9;53768:18;53761:48;53826:76;53897:4;53888:6;53826:76;:::i;:::-;53818:84;;53269:640;;;;;;;:::o;53915:141::-;53971:5;54002:6;53996:13;53987:22;;54018:32;54044:5;54018:32;:::i;:::-;53915:141;;;;:::o;54062:349::-;54131:6;54180:2;54168:9;54159:7;54155:23;54151:32;54148:119;;;54186:79;;:::i;:::-;54148:119;54306:1;54331:63;54386:7;54377:6;54366:9;54362:22;54331:63;:::i;:::-;54321:73;;54277:127;54062:349;;;;:::o

Swarm Source

ipfs://fbb68e85acc813ca0f84c1f3363601a246c8274510e727496b58860d7f444421
Loading...
Loading
Loading...
Loading
[ 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.