Token Fantom Zombies

 

Overview ERC-721

Total Supply:
0 ZOMBIES

Holders:
1 addresses
Balance
0 ZOMBIES
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FantomZombies

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-03
*/

// File: contracts/IX32PE.sol

pragma solidity ^0.8.4;

interface IX32PE {
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);
    function balanceOf(address owner) external view returns (uint256);
    function ownerOf(uint256 tokenId) external view returns (address);
    function burnForAddress(uint256 tokenId) external;
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
}
// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// 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/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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
    ) external;

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Pausable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

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

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * 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, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/FantomZombies.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;









contract FantomZombies is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Pausable, Ownable {
    using Counters for Counters.Counter;
    using Strings for uint256;

    Counters.Counter private _tokenIds;

    Counters.Counter private _mintCount;

    Counters.Counter private _giveawayCount;

    Counters.Counter private _whitelistCount;

    uint256 public maxMintable = 980;

    uint256 public maxTokens = 1000;

    uint256 public maxGiveaway = 20;

    uint256 public mintPrice = 10 ether;

    uint256 public whitelistPrice = 8 ether;

    uint32 private _whitelistMintLimit = 100;

    address payable public payableAddress;

    address private _virusContract;

    string private _defaultBaseURI;

    bool public whitelistSale;

    bool public salesAvailable;

    constructor() ERC721("Fantom Zombies", "ZOMBIES") {
        salesAvailable = false;
        whitelistSale = false;
        _tokenIds.increment();
    }

    modifier whenWhitelistOnline {
        require(whitelistSale, "Whitelist sale isn't on!");
        _;
    }

    function infect() external payable whenWhitelistOnline {
        uint256 balance = IX32PE(_virusContract).balanceOf(msg.sender);
        require(balance > 0, "Amount higher than your balance");
        require(msg.value >= whitelistPrice, "Invalid price!");
        uint256 tokenId = IX32PE(_virusContract).tokenOfOwnerByIndex(msg.sender, 0);
        IX32PE(_virusContract).burnForAddress(tokenId);
        giveaway(msg.sender, 1);
    }

    function infectForAddress(address to) external onlyOwner {
        uint256 balance = IX32PE(_virusContract).balanceOf(to);
        require(balance > 0, "Amount higher than balance");
        uint256 tokenId = IX32PE(_virusContract).tokenOfOwnerByIndex(to, 1);
        IX32PE(_virusContract).burnForAddress(tokenId);
        giveaway(to, 1);
    }

    function mint(uint256 quantity) external payable whenNotPaused {
        uint256 amountMint = _mintCount.current();
        require(amountMint < maxMintable && ((amountMint + quantity) < maxMintable), "Mint limit exceeded!");
        require(salesAvailable, "Sales isn't public yet!");
        
        uint256 totalPrice = mintPrice * quantity;
        require(msg.value >= totalPrice, "Invalid amount!");

        payableAddress.transfer(totalPrice);

        uint256 tokenId = _tokenIds.current();
        for (uint256 i = 0; i < quantity; i++) {
            mintNFT(msg.sender, tokenId + i);
        }
    }

    function giveaway(address to, uint256 quantity) public onlyOwner {
        uint256 amountGiveaway = _giveawayCount.current();
        require(amountGiveaway < maxGiveaway && (amountGiveaway + quantity) < maxGiveaway, "Mint limit exceeded!");
        
        uint256 tokenId = _tokenIds.current();
        for (uint256 i = 0; i < quantity; i++) {
            giveNFT(to, tokenId + i);
        }
    }

    function isWhitelisted(address whitelistedAddress) public view returns (bool) {
        return IX32PE(_virusContract).balanceOf(whitelistedAddress) > 0;
    }

    function burn(uint256 tokenId) public {
        require(ownerOf(tokenId) == msg.sender, "You're not the owner");
        _burn(tokenId);
    }

    function mintNFT(address to, uint256 tokenId) internal {
        internalMint(to, tokenId);
        _mintCount.increment();
    }

    function giveNFT(address to, uint256 tokenId) internal {
        internalMint(to, tokenId);
        _giveawayCount.increment();
    }

    function internalMint(address to, uint256 tokenId) internal {
        require(tokenId <= maxTokens, "Token limit exceeded!");
        _safeMint(to, tokenId);
        _tokenIds.increment();
    }

    function toggleSalesAvailable() public onlyOwner {
        salesAvailable = !salesAvailable;
    }

    function toggleWhitelistSale() public onlyOwner {
        whitelistSale = !whitelistSale;
    }

    function setVirusAddress(address contractAddress) external onlyOwner {
        _virusContract = contractAddress;
    }

    function setBaseURI(string calldata newBaseURI) public onlyOwner {
        _defaultBaseURI = newBaseURI;
    }

    function setPayableAddress(address newPayableAddress) public onlyOwner {
        payableAddress = payable(newPayableAddress);
    }

    function setMintPrice(uint256 newMintPrice) public onlyOwner {
        mintPrice = newMintPrice;
    }

    function setMaxGiveaway(uint256 newMaxGiveaway) public onlyOwner {
        maxGiveaway = newMaxGiveaway;
    }

    function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) {
        return string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json"));
    }

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

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"infect","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"infectForAddress","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"whitelistedAddress","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salesAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxGiveaway","type":"uint256"}],"name":"setMaxGiveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPayableAddress","type":"address"}],"name":"setPayableAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setVirusAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSalesAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040526103d46010556103e86011556014601255678ac7230489e80000601355676f05b59d3b2000006014556064601560006101000a81548163ffffffff021916908363ffffffff1602179055503480156200005c57600080fd5b506040518060400160405280600e81526020017f46616e746f6d205a6f6d626965730000000000000000000000000000000000008152506040518060400160405280600781526020017f5a4f4d42494553000000000000000000000000000000000000000000000000008152508160009080519060200190620000e19291906200026f565b508060019080519060200190620000fa9291906200026f565b5050506000600b60006101000a81548160ff021916908315150217905550620001386200012c6200018b60201b60201c565b6200019360201b60201c565b6000601860016101000a81548160ff0219169083151502179055506000601860006101000a81548160ff02191690831515021790555062000185600c6200025960201b620021051760201c565b62000384565b600033905090565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8280546200027d906200031f565b90600052602060002090601f016020900481019282620002a15760008555620002ed565b82601f10620002bc57805160ff1916838001178555620002ed565b82800160010185558215620002ed579182015b82811115620002ec578251825591602001919060010190620002cf565b5b509050620002fc919062000300565b5090565b5b808211156200031b57600081600090555060010162000301565b5090565b600060028204905060018216806200033857607f821691505b602082108114156200034f576200034e62000355565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61514a80620003946000396000f3fe6080604052600436106102465760003560e01c806359eda1b511610139578063a0712d68116100b6578063e985e9c51161007a578063e985e9c51461084e578063eb9566c71461088b578063f2fde38b146108b4578063f3f72d1c146108dd578063f4a0a528146108f4578063fc1a1c361461091d57610246565b8063a0712d6814610778578063a22cb46514610794578063b88d4fde146107bd578063c87b56dd146107e6578063e83157421461082357610246565b80636d3eda3e116100fd5780636d3eda3e146106a557806370a08231146106ce578063715018a61461070b5780638da5cb5b1461072257806395d89b411461074d57610246565b806359eda1b5146105d25780635b3eed5c146105e95780635c975abb146106125780636352211e1461063d5780636817c76c1461067a57610246565b806335e7b43e116101c7578063459ba3ae1161018b578063459ba3ae1461050c5780634685e1a0146105375780634f6ccce714610562578063543eebd11461059f57806355f804b3146105a957610246565b806335e7b43e146104295780633af32abf146104545780633e16039c1461049157806342842e0e146104ba57806342966c68146104e357610246565b806318160ddd1161020e57806318160ddd146103425780632154dc391461036d57806323b872dd146103985780632f745c59146103c157806331ffd6f1146103fe57610246565b806301ffc9a71461024b578063050225ea1461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613a6f565b610948565b60405161027f9190614167565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa9190613a2f565b61095a565b005b3480156102bd57600080fd5b506102c6610a88565b6040516102d39190614182565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613b16565b610b1a565b6040516103109190614093565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613a2f565b610b9f565b005b34801561034e57600080fd5b50610357610cb7565b6040516103649190614524565b60405180910390f35b34801561037957600080fd5b50610382610cc4565b60405161038f9190614524565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613919565b610cca565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613a2f565b610d2a565b6040516103f59190614524565b60405180910390f35b34801561040a57600080fd5b50610413610dcf565b6040516104209190614167565b60405180910390f35b34801561043557600080fd5b5061043e610de2565b60405161044b9190614167565b60405180910390f35b34801561046057600080fd5b5061047b600480360381019061047691906138ac565b610df5565b6040516104889190614167565b60405180910390f35b34801561049d57600080fd5b506104b860048036038101906104b39190613b16565b610eab565b005b3480156104c657600080fd5b506104e160048036038101906104dc9190613919565b610f31565b005b3480156104ef57600080fd5b5061050a60048036038101906105059190613b16565b610f51565b005b34801561051857600080fd5b50610521610fd3565b60405161052e9190614524565b60405180910390f35b34801561054357600080fd5b5061054c610fd9565b60405161055991906140ae565b60405180910390f35b34801561056e57600080fd5b5061058960048036038101906105849190613b16565b610fff565b6040516105969190614524565b60405180910390f35b6105a7611070565b005b3480156105b557600080fd5b506105d060048036038101906105cb9190613ac9565b611344565b005b3480156105de57600080fd5b506105e76113d6565b005b3480156105f557600080fd5b50610610600480360381019061060b91906138ac565b61147e565b005b34801561061e57600080fd5b5061062761153e565b6040516106349190614167565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f9190613b16565b611555565b6040516106719190614093565b60405180910390f35b34801561068657600080fd5b5061068f611607565b60405161069c9190614524565b60405180910390f35b3480156106b157600080fd5b506106cc60048036038101906106c791906138ac565b61160d565b005b3480156106da57600080fd5b506106f560048036038101906106f091906138ac565b6118ca565b6040516107029190614524565b60405180910390f35b34801561071757600080fd5b50610720611982565b005b34801561072e57600080fd5b50610737611a0a565b6040516107449190614093565b60405180910390f35b34801561075957600080fd5b50610762611a34565b60405161076f9190614182565b60405180910390f35b610792600480360381019061078d9190613b16565b611ac6565b005b3480156107a057600080fd5b506107bb60048036038101906107b691906139ef565b611ccd565b005b3480156107c957600080fd5b506107e460048036038101906107df919061396c565b611ce3565b005b3480156107f257600080fd5b5061080d60048036038101906108089190613b16565b611d45565b60405161081a9190614182565b60405180910390f35b34801561082f57600080fd5b50610838611d7f565b6040516108459190614524565b60405180910390f35b34801561085a57600080fd5b50610875600480360381019061087091906138d9565b611d85565b6040516108829190614167565b60405180910390f35b34801561089757600080fd5b506108b260048036038101906108ad91906138ac565b611e19565b005b3480156108c057600080fd5b506108db60048036038101906108d691906138ac565b611ed9565b005b3480156108e957600080fd5b506108f2611fd1565b005b34801561090057600080fd5b5061091b60048036038101906109169190613b16565b612079565b005b34801561092957600080fd5b506109326120ff565b60405161093f9190614524565b60405180910390f35b60006109538261211b565b9050919050565b610962612195565b73ffffffffffffffffffffffffffffffffffffffff16610980611a0a565b73ffffffffffffffffffffffffffffffffffffffff16146109d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cd90614404565b60405180910390fd5b60006109e2600e61219d565b905060125481108015610a01575060125482826109ff91906145d8565b105b610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3790614344565b60405180910390fd5b6000610a4c600c61219d565b905060005b83811015610a8157610a6e858284610a6991906145d8565b6121ab565b8080610a799061483c565b915050610a51565b5050505050565b606060008054610a97906147d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac3906147d9565b8015610b105780601f10610ae557610100808354040283529160200191610b10565b820191906000526020600020905b815481529060010190602001808311610af357829003601f168201915b5050505050905090565b6000610b25826121c3565b610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b906143e4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610baa82611555565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1290614464565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c3a612195565b73ffffffffffffffffffffffffffffffffffffffff161480610c695750610c6881610c63612195565b611d85565b5b610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f90614324565b60405180910390fd5b610cb2838361222f565b505050565b6000600880549050905090565b60105481565b610cdb610cd5612195565b826122e8565b610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d11906144a4565b60405180910390fd5b610d258383836123c6565b505050565b6000610d35836118ca565b8210610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d906141e4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601860009054906101000a900460ff1681565b601860019054906101000a900460ff1681565b600080601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401610e539190614093565b60206040518083038186803b158015610e6b57600080fd5b505afa158015610e7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea39190613b43565b119050919050565b610eb3612195565b73ffffffffffffffffffffffffffffffffffffffff16610ed1611a0a565b73ffffffffffffffffffffffffffffffffffffffff1614610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e90614404565b60405180910390fd5b8060128190555050565b610f4c83838360405180602001604052806000815250611ce3565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16610f7182611555565b73ffffffffffffffffffffffffffffffffffffffff1614610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90614504565b60405180910390fd5b610fd08161262d565b50565b60125481565b601560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611009610cb7565b821061104a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611041906144e4565b60405180910390fd5b6008828154811061105e5761105d614972565b5b90600052602060002001549050919050565b601860009054906101000a900460ff166110bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b690614224565b60405180910390fd5b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161111c9190614093565b60206040518083038186803b15801561113457600080fd5b505afa158015611148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116c9190613b43565b9050600081116111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a890614444565b60405180910390fd5b6014543410156111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed90614424565b60405180910390fd5b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c593360006040518363ffffffff1660e01b8152600401611256929190614115565b60206040518083038186803b15801561126e57600080fd5b505afa158015611282573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a69190613b43565b9050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aac52c6d826040518263ffffffff1660e01b81526004016113039190614524565b600060405180830381600087803b15801561131d57600080fd5b505af1158015611331573d6000803e3d6000fd5b5050505061134033600161095a565b5050565b61134c612195565b73ffffffffffffffffffffffffffffffffffffffff1661136a611a0a565b73ffffffffffffffffffffffffffffffffffffffff16146113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b790614404565b60405180910390fd5b8181601791906113d1929190613685565b505050565b6113de612195565b73ffffffffffffffffffffffffffffffffffffffff166113fc611a0a565b73ffffffffffffffffffffffffffffffffffffffff1614611452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144990614404565b60405180910390fd5b601860009054906101000a900460ff1615601860006101000a81548160ff021916908315150217905550565b611486612195565b73ffffffffffffffffffffffffffffffffffffffff166114a4611a0a565b73ffffffffffffffffffffffffffffffffffffffff16146114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190614404565b60405180910390fd5b80601560046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600b60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590614384565b60405180910390fd5b80915050919050565b60135481565b611615612195565b73ffffffffffffffffffffffffffffffffffffffff16611633611a0a565b73ffffffffffffffffffffffffffffffffffffffff1614611689576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168090614404565b60405180910390fd5b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b81526004016116e69190614093565b60206040518083038186803b1580156116fe57600080fd5b505afa158015611712573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117369190613b43565b90506000811161177b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611772906144c4565b60405180910390fd5b6000601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c598460016040518363ffffffff1660e01b81526004016117db92919061413e565b60206040518083038186803b1580156117f357600080fd5b505afa158015611807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182b9190613b43565b9050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aac52c6d826040518263ffffffff1660e01b81526004016118889190614524565b600060405180830381600087803b1580156118a257600080fd5b505af11580156118b6573d6000803e3d6000fd5b505050506118c583600161095a565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290614364565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61198a612195565b73ffffffffffffffffffffffffffffffffffffffff166119a8611a0a565b73ffffffffffffffffffffffffffffffffffffffff16146119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f590614404565b60405180910390fd5b611a086000612639565b565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611a43906147d9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6f906147d9565b8015611abc5780601f10611a9157610100808354040283529160200191611abc565b820191906000526020600020905b815481529060010190602001808311611a9f57829003601f168201915b5050505050905090565b611ace61153e565b15611b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0590614304565b60405180910390fd5b6000611b1a600d61219d565b905060105481108015611b3957506010548282611b3791906145d8565b105b611b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6f90614344565b60405180910390fd5b601860019054906101000a900460ff16611bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbe906141a4565b60405180910390fd5b600082601354611bd7919061465f565b905080341015611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906143c4565b60405180910390fd5b601560049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611c84573d6000803e3d6000fd5b506000611c91600c61219d565b905060005b84811015611cc657611cb3338284611cae91906145d8565b6126ff565b8080611cbe9061483c565b915050611c96565b5050505050565b611cdf611cd8612195565b8383612717565b5050565b611cf4611cee612195565b836122e8565b611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a906144a4565b60405180910390fd5b611d3f84848484612884565b50505050565b6060611d4f6128e0565b611d5883612972565b604051602001611d69929190614064565b6040516020818303038152906040529050919050565b60115481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e21612195565b73ffffffffffffffffffffffffffffffffffffffff16611e3f611a0a565b73ffffffffffffffffffffffffffffffffffffffff1614611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90614404565b60405180910390fd5b80601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611ee1612195565b73ffffffffffffffffffffffffffffffffffffffff16611eff611a0a565b73ffffffffffffffffffffffffffffffffffffffff1614611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c90614404565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fbc90614244565b60405180910390fd5b611fce81612639565b50565b611fd9612195565b73ffffffffffffffffffffffffffffffffffffffff16611ff7611a0a565b73ffffffffffffffffffffffffffffffffffffffff161461204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490614404565b60405180910390fd5b601860019054906101000a900460ff1615601860016101000a81548160ff021916908315150217905550565b612081612195565b73ffffffffffffffffffffffffffffffffffffffff1661209f611a0a565b73ffffffffffffffffffffffffffffffffffffffff16146120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ec90614404565b60405180910390fd5b8060138190555050565b60145481565b6001816000016000828254019250508190555050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061218e575061218d82612ad3565b5b9050919050565b600033905090565b600081600001549050919050565b6121b58282612bb5565b6121bf600e612105565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122a283611555565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122f3826121c3565b612332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612329906142e4565b60405180910390fd5b600061233d83611555565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123ac57508373ffffffffffffffffffffffffffffffffffffffff1661239484610b1a565b73ffffffffffffffffffffffffffffffffffffffff16145b806123bd57506123bc8185611d85565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123e682611555565b73ffffffffffffffffffffffffffffffffffffffff161461243c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243390614264565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a3906142a4565b60405180910390fd5b6124b7838383612c12565b6124c260008261222f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461251291906146b9565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256991906145d8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612628838383612c22565b505050565b61263681612c27565b50565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6127098282612bb5565b612713600d612105565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d906142c4565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128779190614167565b60405180910390a3505050565b61288f8484846123c6565b61289b84848484612c7a565b6128da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d190614204565b60405180910390fd5b50505050565b6060601780546128ef906147d9565b80601f016020809104026020016040519081016040528092919081815260200182805461291b906147d9565b80156129685780601f1061293d57610100808354040283529160200191612968565b820191906000526020600020905b81548152906001019060200180831161294b57829003601f168201915b5050505050905090565b606060008214156129ba576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ace565b600082905060005b600082146129ec5780806129d59061483c565b915050600a826129e5919061462e565b91506129c2565b60008167ffffffffffffffff811115612a0857612a076149a1565b5b6040519080825280601f01601f191660200182016040528015612a3a5781602001600182028036833780820191505090505b5090505b60008514612ac757600182612a5391906146b9565b9150600a85612a629190614885565b6030612a6e91906145d8565b60f81b818381518110612a8457612a83614972565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ac0919061462e565b9450612a3e565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b9e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bae5750612bad82612e11565b5b9050919050565b601154811115612bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf190614484565b60405180910390fd5b612c048282612e7b565b612c0e600c612105565b5050565b612c1d838383612e99565b505050565b505050565b612c3081612ef1565b6000600a60008381526020019081526020016000208054612c50906147d9565b905014612c7757600a60008281526020019081526020016000206000612c76919061370b565b5b50565b6000612c9b8473ffffffffffffffffffffffffffffffffffffffff1661300e565b15612e04578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cc4612195565b8786866040518563ffffffff1660e01b8152600401612ce694939291906140c9565b602060405180830381600087803b158015612d0057600080fd5b505af1925050508015612d3157506040513d601f19601f82011682018060405250810190612d2e9190613a9c565b60015b612db4573d8060008114612d61576040519150601f19603f3d011682016040523d82523d6000602084013e612d66565b606091505b50600081511415612dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da390614204565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e09565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612e95828260405180602001604052806000815250613031565b5050565b612ea483838361308c565b612eac61153e565b15612eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee3906141c4565b60405180910390fd5b505050565b6000612efc82611555565b9050612f0a81600084612c12565b612f1560008361222f565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f6591906146b9565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461300a81600084612c22565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b61303b83836131a0565b6130486000848484612c7a565b613087576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307e90614204565b60405180910390fd5b505050565b61309783838361337a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130da576130d58161337f565b613119565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131185761311783826133c8565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315c5761315781613535565b61319b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461319a576131998282613606565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613207906143a4565b60405180910390fd5b613219816121c3565b15613259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325090614284565b60405180910390fd5b61326560008383612c12565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132b591906145d8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461337660008383612c22565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133d5846118ca565b6133df91906146b9565b90506000600760008481526020019081526020016000205490508181146134c4576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061354991906146b9565b905060006009600084815260200190815260200160002054905060006008838154811061357957613578614972565b5b90600052602060002001549050806008838154811061359b5761359a614972565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806135ea576135e9614943565b5b6001900381819060005260206000200160009055905550505050565b6000613611836118ca565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613691906147d9565b90600052602060002090601f0160209004810192826136b357600085556136fa565b82601f106136cc57803560ff19168380011785556136fa565b828001600101855582156136fa579182015b828111156136f95782358255916020019190600101906136de565b5b509050613707919061374b565b5090565b508054613717906147d9565b6000825580601f106137295750613748565b601f016020900490600052602060002090810190613747919061374b565b5b50565b5b8082111561376457600081600090555060010161374c565b5090565b600061377b61377684614564565b61453f565b905082815260208101848484011115613797576137966149df565b5b6137a2848285614797565b509392505050565b6000813590506137b9816150b8565b92915050565b6000813590506137ce816150cf565b92915050565b6000813590506137e3816150e6565b92915050565b6000815190506137f8816150e6565b92915050565b600082601f830112613813576138126149d5565b5b8135613823848260208601613768565b91505092915050565b60008083601f840112613842576138416149d5565b5b8235905067ffffffffffffffff81111561385f5761385e6149d0565b5b60208301915083600182028301111561387b5761387a6149da565b5b9250929050565b600081359050613891816150fd565b92915050565b6000815190506138a6816150fd565b92915050565b6000602082840312156138c2576138c16149e9565b5b60006138d0848285016137aa565b91505092915050565b600080604083850312156138f0576138ef6149e9565b5b60006138fe858286016137aa565b925050602061390f858286016137aa565b9150509250929050565b600080600060608486031215613932576139316149e9565b5b6000613940868287016137aa565b9350506020613951868287016137aa565b925050604061396286828701613882565b9150509250925092565b60008060008060808587031215613986576139856149e9565b5b6000613994878288016137aa565b94505060206139a5878288016137aa565b93505060406139b687828801613882565b925050606085013567ffffffffffffffff8111156139d7576139d66149e4565b5b6139e3878288016137fe565b91505092959194509250565b60008060408385031215613a0657613a056149e9565b5b6000613a14858286016137aa565b9250506020613a25858286016137bf565b9150509250929050565b60008060408385031215613a4657613a456149e9565b5b6000613a54858286016137aa565b9250506020613a6585828601613882565b9150509250929050565b600060208284031215613a8557613a846149e9565b5b6000613a93848285016137d4565b91505092915050565b600060208284031215613ab257613ab16149e9565b5b6000613ac0848285016137e9565b91505092915050565b60008060208385031215613ae057613adf6149e9565b5b600083013567ffffffffffffffff811115613afe57613afd6149e4565b5b613b0a8582860161382c565b92509250509250929050565b600060208284031215613b2c57613b2b6149e9565b5b6000613b3a84828501613882565b91505092915050565b600060208284031215613b5957613b586149e9565b5b6000613b6784828501613897565b91505092915050565b613b79816146ff565b82525050565b613b88816146ed565b82525050565b613b9781614711565b82525050565b6000613ba882614595565b613bb281856145ab565b9350613bc28185602086016147a6565b613bcb816149ee565b840191505092915050565b613bdf81614773565b82525050565b613bee81614785565b82525050565b6000613bff826145a0565b613c0981856145bc565b9350613c198185602086016147a6565b613c22816149ee565b840191505092915050565b6000613c38826145a0565b613c4281856145cd565b9350613c528185602086016147a6565b80840191505092915050565b6000613c6b6017836145bc565b9150613c76826149ff565b602082019050919050565b6000613c8e602b836145bc565b9150613c9982614a28565b604082019050919050565b6000613cb1602b836145bc565b9150613cbc82614a77565b604082019050919050565b6000613cd46032836145bc565b9150613cdf82614ac6565b604082019050919050565b6000613cf76018836145bc565b9150613d0282614b15565b602082019050919050565b6000613d1a6026836145bc565b9150613d2582614b3e565b604082019050919050565b6000613d3d6025836145bc565b9150613d4882614b8d565b604082019050919050565b6000613d60601c836145bc565b9150613d6b82614bdc565b602082019050919050565b6000613d836024836145bc565b9150613d8e82614c05565b604082019050919050565b6000613da66019836145bc565b9150613db182614c54565b602082019050919050565b6000613dc9602c836145bc565b9150613dd482614c7d565b604082019050919050565b6000613dec6010836145bc565b9150613df782614ccc565b602082019050919050565b6000613e0f6038836145bc565b9150613e1a82614cf5565b604082019050919050565b6000613e326014836145bc565b9150613e3d82614d44565b602082019050919050565b6000613e55602a836145bc565b9150613e6082614d6d565b604082019050919050565b6000613e786029836145bc565b9150613e8382614dbc565b604082019050919050565b6000613e9b6020836145bc565b9150613ea682614e0b565b602082019050919050565b6000613ebe600f836145bc565b9150613ec982614e34565b602082019050919050565b6000613ee1602c836145bc565b9150613eec82614e5d565b604082019050919050565b6000613f046005836145cd565b9150613f0f82614eac565b600582019050919050565b6000613f276020836145bc565b9150613f3282614ed5565b602082019050919050565b6000613f4a600e836145bc565b9150613f5582614efe565b602082019050919050565b6000613f6d601f836145bc565b9150613f7882614f27565b602082019050919050565b6000613f906021836145bc565b9150613f9b82614f50565b604082019050919050565b6000613fb36015836145bc565b9150613fbe82614f9f565b602082019050919050565b6000613fd66031836145bc565b9150613fe182614fc8565b604082019050919050565b6000613ff9601a836145bc565b915061400482615017565b602082019050919050565b600061401c602c836145bc565b915061402782615040565b604082019050919050565b600061403f6014836145bc565b915061404a8261508f565b602082019050919050565b61405e81614769565b82525050565b60006140708285613c2d565b915061407c8284613c2d565b915061408782613ef7565b91508190509392505050565b60006020820190506140a86000830184613b7f565b92915050565b60006020820190506140c36000830184613b70565b92915050565b60006080820190506140de6000830187613b7f565b6140eb6020830186613b7f565b6140f86040830185614055565b818103606083015261410a8184613b9d565b905095945050505050565b600060408201905061412a6000830185613b7f565b6141376020830184613bd6565b9392505050565b60006040820190506141536000830185613b7f565b6141606020830184613be5565b9392505050565b600060208201905061417c6000830184613b8e565b92915050565b6000602082019050818103600083015261419c8184613bf4565b905092915050565b600060208201905081810360008301526141bd81613c5e565b9050919050565b600060208201905081810360008301526141dd81613c81565b9050919050565b600060208201905081810360008301526141fd81613ca4565b9050919050565b6000602082019050818103600083015261421d81613cc7565b9050919050565b6000602082019050818103600083015261423d81613cea565b9050919050565b6000602082019050818103600083015261425d81613d0d565b9050919050565b6000602082019050818103600083015261427d81613d30565b9050919050565b6000602082019050818103600083015261429d81613d53565b9050919050565b600060208201905081810360008301526142bd81613d76565b9050919050565b600060208201905081810360008301526142dd81613d99565b9050919050565b600060208201905081810360008301526142fd81613dbc565b9050919050565b6000602082019050818103600083015261431d81613ddf565b9050919050565b6000602082019050818103600083015261433d81613e02565b9050919050565b6000602082019050818103600083015261435d81613e25565b9050919050565b6000602082019050818103600083015261437d81613e48565b9050919050565b6000602082019050818103600083015261439d81613e6b565b9050919050565b600060208201905081810360008301526143bd81613e8e565b9050919050565b600060208201905081810360008301526143dd81613eb1565b9050919050565b600060208201905081810360008301526143fd81613ed4565b9050919050565b6000602082019050818103600083015261441d81613f1a565b9050919050565b6000602082019050818103600083015261443d81613f3d565b9050919050565b6000602082019050818103600083015261445d81613f60565b9050919050565b6000602082019050818103600083015261447d81613f83565b9050919050565b6000602082019050818103600083015261449d81613fa6565b9050919050565b600060208201905081810360008301526144bd81613fc9565b9050919050565b600060208201905081810360008301526144dd81613fec565b9050919050565b600060208201905081810360008301526144fd8161400f565b9050919050565b6000602082019050818103600083015261451d81614032565b9050919050565b60006020820190506145396000830184614055565b92915050565b600061454961455a565b9050614555828261480b565b919050565b6000604051905090565b600067ffffffffffffffff82111561457f5761457e6149a1565b5b614588826149ee565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145e382614769565b91506145ee83614769565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614623576146226148b6565b5b828201905092915050565b600061463982614769565b915061464483614769565b925082614654576146536148e5565b5b828204905092915050565b600061466a82614769565b915061467583614769565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146ae576146ad6148b6565b5b828202905092915050565b60006146c482614769565b91506146cf83614769565b9250828210156146e2576146e16148b6565b5b828203905092915050565b60006146f882614749565b9050919050565b600061470a82614749565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061477e82614769565b9050919050565b600061479082614769565b9050919050565b82818337600083830152505050565b60005b838110156147c45780820151818401526020810190506147a9565b838111156147d3576000848401525b50505050565b600060028204905060018216806147f157607f821691505b6020821081141561480557614804614914565b5b50919050565b614814826149ee565b810181811067ffffffffffffffff82111715614833576148326149a1565b5b80604052505050565b600061484782614769565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561487a576148796148b6565b5b600182019050919050565b600061489082614769565b915061489b83614769565b9250826148ab576148aa6148e5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f53616c65732069736e2774207075626c69632079657421000000000000000000600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f57686974656c6973742073616c652069736e2774206f6e210000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4d696e74206c696d697420657863656564656421000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f496e76616c696420616d6f756e74210000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c696420707269636521000000000000000000000000000000000000600082015250565b7f416d6f756e7420686967686572207468616e20796f75722062616c616e636500600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e206c696d6974206578636565646564210000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416d6f756e7420686967686572207468616e2062616c616e6365000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f75277265206e6f7420746865206f776e6572000000000000000000000000600082015250565b6150c1816146ed565b81146150cc57600080fd5b50565b6150d881614711565b81146150e357600080fd5b50565b6150ef8161471d565b81146150fa57600080fd5b50565b61510681614769565b811461511157600080fd5b5056fea26469706673582212208392b8faa98245bd224ec695a2411717a084c0984d8d340b7a868eee1e6645e464736f6c63430008070033

Deployed ByteCode Sourcemap

52789:5426:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58041:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55331:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30381:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31940:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31463:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47166:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53150:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32690:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46834:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53536:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53570:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55747:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57272:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33100:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55915:145;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53231:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53412:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47356:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53886:444;;;:::i;:::-;;56899:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56666:97;;;;;;;;;;;;;:::i;:::-;;57019:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8608:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30075:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53271:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54338:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29805:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6659:103;;;;;;;;;;;;;:::i;:::-;;6008:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30550:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54698:625;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32233:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33356:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57392:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53191:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32459:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56771:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6917:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56558:100;;;;;;;;;;;;;:::i;:::-;;57160:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53315:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58041:171;58144:4;58168:36;58192:11;58168:23;:36::i;:::-;58161:43;;58041:171;;;:::o;55331:408::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55407:22:::1;55432:24;:14;:22;:24::i;:::-;55407:49;;55492:11;;55475:14;:28;:73;;;;;55537:11;;55525:8;55508:14;:25;;;;:::i;:::-;55507:41;55475:73;55467:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;55594:15;55612:19;:9;:17;:19::i;:::-;55594:37;;55647:9;55642:90;55666:8;55662:1;:12;55642:90;;;55696:24;55704:2;55718:1;55708:7;:11;;;;:::i;:::-;55696:7;:24::i;:::-;55676:3;;;;;:::i;:::-;;;;55642:90;;;;55396:343;;55331:408:::0;;:::o;30381:100::-;30435:13;30468:5;30461:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30381:100;:::o;31940:221::-;32016:7;32044:16;32052:7;32044;:16::i;:::-;32036:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32129:15;:24;32145:7;32129:24;;;;;;;;;;;;;;;;;;;;;32122:31;;31940:221;;;:::o;31463:411::-;31544:13;31560:23;31575:7;31560:14;:23::i;:::-;31544:39;;31608:5;31602:11;;:2;:11;;;;31594:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31702:5;31686:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31711:37;31728:5;31735:12;:10;:12::i;:::-;31711:16;:37::i;:::-;31686:62;31664:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31845:21;31854:2;31858:7;31845:8;:21::i;:::-;31533:341;31463:411;;:::o;47166:113::-;47227:7;47254:10;:17;;;;47247:24;;47166:113;:::o;53150:32::-;;;;:::o;32690:339::-;32885:41;32904:12;:10;:12::i;:::-;32918:7;32885:18;:41::i;:::-;32877:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32993:28;33003:4;33009:2;33013:7;32993:9;:28::i;:::-;32690:339;;;:::o;46834:256::-;46931:7;46967:23;46984:5;46967:16;:23::i;:::-;46959:5;:31;46951:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;47056:12;:19;47069:5;47056:19;;;;;;;;;;;;;;;:26;47076:5;47056:26;;;;;;;;;;;;47049:33;;46834:256;;;;:::o;53536:25::-;;;;;;;;;;;;;:::o;53570:26::-;;;;;;;;;;;;;:::o;55747:160::-;55819:4;55898:1;55850:14;;;;;;;;;;;55843:32;;;55876:18;55843:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;55836:63;;55747:160;;;:::o;57272:112::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57362:14:::1;57348:11;:28;;;;57272:112:::0;:::o;33100:185::-;33238:39;33255:4;33261:2;33265:7;33238:39;;;;;;;;;;;;:16;:39::i;:::-;33100:185;;;:::o;55915:145::-;55992:10;55972:30;;:16;55980:7;55972;:16::i;:::-;:30;;;55964:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56038:14;56044:7;56038:5;:14::i;:::-;55915:145;:::o;53231:31::-;;;;:::o;53412:37::-;;;;;;;;;;;;;:::o;47356:233::-;47431:7;47467:30;:28;:30::i;:::-;47459:5;:38;47451:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;47564:10;47575:5;47564:17;;;;;;;;:::i;:::-;;;;;;;;;;47557:24;;47356:233;;;:::o;53886:444::-;53816:13;;;;;;;;;;;53808:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;53952:15:::1;53977:14;;;;;;;;;;;53970:32;;;54003:10;53970:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53952:62;;54043:1;54033:7;:11;54025:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54112:14;;54099:9;:27;;54091:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;54156:15;54181:14;;;;;;;;;;;54174:42;;;54217:10;54229:1;54174:57;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54156:75;;54249:14;;;;;;;;;;;54242:37;;;54280:7;54242:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54299:23;54308:10;54320:1;54299:8;:23::i;:::-;53941:389;;53886:444::o:0;56899:112::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56993:10:::1;;56975:15;:28;;;;;;;:::i;:::-;;56899:112:::0;;:::o;56666:97::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56742:13:::1;;;;;;;;;;;56741:14;56725:13;;:30;;;;;;;;;;;;;;;;;;56666:97::o:0;57019:133::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57126:17:::1;57101:14;;:43;;;;;;;;;;;;;;;;;;57019:133:::0;:::o;8608:86::-;8655:4;8679:7;;;;;;;;;;;8672:14;;8608:86;:::o;30075:239::-;30147:7;30167:13;30183:7;:16;30191:7;30183:16;;;;;;;;;;;;;;;;;;;;;30167:32;;30235:1;30218:19;;:5;:19;;;;30210:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30301:5;30294:12;;;30075:239;;;:::o;53271:35::-;;;;:::o;54338:352::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54406:15:::1;54431:14;;;;;;;;;;;54424:32;;;54457:2;54424:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54406:54;;54489:1;54479:7;:11;54471:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;54532:15;54557:14;;;;;;;;;;;54550:42;;;54593:2;54597:1;54550:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54532:67;;54617:14;;;;;;;;;;;54610:37;;;54648:7;54610:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54667:15;54676:2;54680:1;54667:8;:15::i;:::-;54395:295;;54338:352:::0;:::o;29805:208::-;29877:7;29922:1;29905:19;;:5;:19;;;;29897:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29989:9;:16;29999:5;29989:16;;;;;;;;;;;;;;;;29982:23;;29805:208;;;:::o;6659:103::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6724:30:::1;6751:1;6724:18;:30::i;:::-;6659:103::o:0;6008:87::-;6054:7;6081:6;;;;;;;;;;;6074:13;;6008:87;:::o;30550:104::-;30606:13;30639:7;30632:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30550:104;:::o;54698:625::-;8934:8;:6;:8::i;:::-;8933:9;8925:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;54772:18:::1;54793:20;:10;:18;:20::i;:::-;54772:41;;54845:11;;54832:10;:24;:67;;;;;54887:11;;54875:8;54862:10;:21;;;;:::i;:::-;54861:37;54832:67;54824:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;54943:14;;;;;;;;;;;54935:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;55006:18;55039:8;55027:9;;:20;;;;:::i;:::-;55006:41;;55079:10;55066:9;:23;;55058:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;55122:14;;;;;;;;;;;:23;;:35;55146:10;55122:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55170:15;55188:19;:9;:17;:19::i;:::-;55170:37;;55223:9;55218:98;55242:8;55238:1;:12;55218:98;;;55272:32;55280:10;55302:1;55292:7;:11;;;;:::i;:::-;55272:7;:32::i;:::-;55252:3;;;;;:::i;:::-;;;;55218:98;;;;54761:562;;;54698:625:::0;:::o;32233:155::-;32328:52;32347:12;:10;:12::i;:::-;32361:8;32371;32328:18;:52::i;:::-;32233:155;;:::o;33356:328::-;33531:41;33550:12;:10;:12::i;:::-;33564:7;33531:18;:41::i;:::-;33523:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33637:39;33651:4;33657:2;33661:7;33670:5;33637:13;:39::i;:::-;33356:328;;;;:::o;57392:197::-;57483:13;57540:10;:8;:10::i;:::-;57552:18;:7;:16;:18::i;:::-;57523:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57509:72;;57392:197;;;:::o;53191:31::-;;;;:::o;32459:164::-;32556:4;32580:18;:25;32599:5;32580:25;;;;;;;;;;;;;;;:35;32606:8;32580:35;;;;;;;;;;;;;;;;;;;;;;;;;32573:42;;32459:164;;;;:::o;56771:120::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56868:15:::1;56851:14;;:32;;;;;;;;;;;;;;;;;;56771:120:::0;:::o;6917:201::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7026:1:::1;7006:22;;:8;:22;;;;6998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7082:28;7101:8;7082:18;:28::i;:::-;6917:201:::0;:::o;56558:100::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56636:14:::1;;;;;;;;;;;56635:15;56618:14;;:32;;;;;;;;;;;;;;;;;;56558:100::o:0;57160:104::-;6239:12;:10;:12::i;:::-;6228:23;;:7;:5;:7::i;:::-;:23;;;6220:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57244:12:::1;57232:9;:24;;;;57160:104:::0;:::o;53315:39::-;;;;:::o;1458:127::-;1565:1;1547:7;:14;;;:19;;;;;;;;;;;1458:127;:::o;46526:224::-;46628:4;46667:35;46652:50;;;:11;:50;;;;:90;;;;46706:36;46730:11;46706:23;:36::i;:::-;46652:90;46645:97;;46526:224;;;:::o;4732:98::-;4785:7;4812:10;4805:17;;4732:98;:::o;1336:114::-;1401:7;1428;:14;;;1421:21;;1336:114;;;:::o;56208:136::-;56274:25;56287:2;56291:7;56274:12;:25::i;:::-;56310:26;:14;:24;:26::i;:::-;56208:136;;:::o;35194:127::-;35259:4;35311:1;35283:30;;:7;:16;35291:7;35283:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35276:37;;35194:127;;;:::o;39340:174::-;39442:2;39415:15;:24;39431:7;39415:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39498:7;39494:2;39460:46;;39469:23;39484:7;39469:14;:23::i;:::-;39460:46;;;;;;;;;;;;39340:174;;:::o;35488:348::-;35581:4;35606:16;35614:7;35606;:16::i;:::-;35598:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35682:13;35698:23;35713:7;35698:14;:23::i;:::-;35682:39;;35751:5;35740:16;;:7;:16;;;:51;;;;35784:7;35760:31;;:20;35772:7;35760:11;:20::i;:::-;:31;;;35740:51;:87;;;;35795:32;35812:5;35819:7;35795:16;:32::i;:::-;35740:87;35732:96;;;35488:348;;;;:::o;38597:625::-;38756:4;38729:31;;:23;38744:7;38729:14;:23::i;:::-;:31;;;38721:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;38835:1;38821:16;;:2;:16;;;;38813:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38891:39;38912:4;38918:2;38922:7;38891:20;:39::i;:::-;38995:29;39012:1;39016:7;38995:8;:29::i;:::-;39056:1;39037:9;:15;39047:4;39037:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39085:1;39068:9;:13;39078:2;39068:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39116:2;39097:7;:16;39105:7;39097:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39155:7;39151:2;39136:27;;39145:4;39136:27;;;;;;;;;;;;39176:38;39196:4;39202:2;39206:7;39176:19;:38::i;:::-;38597:625;;;:::o;57713:115::-;57800:20;57812:7;57800:11;:20::i;:::-;57713:115;:::o;7278:191::-;7352:16;7371:6;;;;;;;;;;;7352:25;;7397:8;7388:6;;:17;;;;;;;;;;;;;;;;;;7452:8;7421:40;;7442:8;7421:40;;;;;;;;;;;;7341:128;7278:191;:::o;56068:132::-;56134:25;56147:2;56151:7;56134:12;:25::i;:::-;56170:22;:10;:20;:22::i;:::-;56068:132;;:::o;39656:315::-;39811:8;39802:17;;:5;:17;;;;39794:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;39898:8;39860:18;:25;39879:5;39860:25;;;;;;;;;;;;;;;:35;39886:8;39860:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;39944:8;39922:41;;39937:5;39922:41;;;39954:8;39922:41;;;;;;:::i;:::-;;;;;;;;39656:315;;;:::o;34566:::-;34723:28;34733:4;34739:2;34743:7;34723:9;:28::i;:::-;34770:48;34793:4;34799:2;34803:7;34812:5;34770:22;:48::i;:::-;34762:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34566:315;;;;:::o;57597:108::-;57649:13;57682:15;57675:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57597:108;:::o;2294:723::-;2350:13;2580:1;2571:5;:10;2567:53;;;2598:10;;;;;;;;;;;;;;;;;;;;;2567:53;2630:12;2645:5;2630:20;;2661:14;2686:78;2701:1;2693:4;:9;2686:78;;2719:8;;;;;:::i;:::-;;;;2750:2;2742:10;;;;;:::i;:::-;;;2686:78;;;2774:19;2806:6;2796:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2774:39;;2824:154;2840:1;2831:5;:10;2824:154;;2868:1;2858:11;;;;;:::i;:::-;;;2935:2;2927:5;:10;;;;:::i;:::-;2914:2;:24;;;;:::i;:::-;2901:39;;2884:6;2891;2884:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2964:2;2955:11;;;;;:::i;:::-;;;2824:154;;;3002:6;2988:21;;;;;2294:723;;;;:::o;29436:305::-;29538:4;29590:25;29575:40;;;:11;:40;;;;:105;;;;29647:33;29632:48;;;:11;:48;;;;29575:105;:158;;;;29697:36;29721:11;29697:23;:36::i;:::-;29575:158;29555:178;;29436:305;;;:::o;56352:198::-;56442:9;;56431:7;:20;;56423:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;56488:22;56498:2;56502:7;56488:9;:22::i;:::-;56521:21;:9;:19;:21::i;:::-;56352:198;;:::o;57836:197::-;57980:45;58007:4;58013:2;58017:7;57980:26;:45::i;:::-;57836:197;;;:::o;42418:125::-;;;;:::o;45302:206::-;45371:20;45383:7;45371:11;:20::i;:::-;45445:1;45414:10;:19;45425:7;45414:19;;;;;;;;;;;45408:33;;;;;:::i;:::-;;;:38;45404:97;;45470:10;:19;45481:7;45470:19;;;;;;;;;;;;45463:26;;;;:::i;:::-;45404:97;45302:206;:::o;40536:799::-;40691:4;40712:15;:2;:13;;;:15::i;:::-;40708:620;;;40764:2;40748:36;;;40785:12;:10;:12::i;:::-;40799:4;40805:7;40814:5;40748:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40744:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41007:1;40990:6;:13;:18;40986:272;;;41033:60;;;;;;;;;;:::i;:::-;;;;;;;;40986:272;41208:6;41202:13;41193:6;41189:2;41185:15;41178:38;40744:529;40881:41;;;40871:51;;;:6;:51;;;;40864:58;;;;;40708:620;41312:4;41305:11;;40536:799;;;;;;;:::o;21110:157::-;21195:4;21234:25;21219:40;;;:11;:40;;;;21212:47;;21110:157;;;:::o;36178:110::-;36254:26;36264:2;36268:7;36254:26;;;;;;;;;;;;:9;:26::i;:::-;36178:110;;:::o;43228:275::-;43372:45;43399:4;43405:2;43409:7;43372:26;:45::i;:::-;43439:8;:6;:8::i;:::-;43438:9;43430:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43228:275;;;:::o;37840:420::-;37900:13;37916:23;37931:7;37916:14;:23::i;:::-;37900:39;;37952:48;37973:5;37988:1;37992:7;37952:20;:48::i;:::-;38041:29;38058:1;38062:7;38041:8;:29::i;:::-;38103:1;38083:9;:16;38093:5;38083:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;38122:7;:16;38130:7;38122:16;;;;;;;;;;;;38115:23;;;;;;;;;;;38184:7;38180:1;38156:36;;38165:5;38156:36;;;;;;;;;;;;38205:47;38225:5;38240:1;38244:7;38205:19;:47::i;:::-;37889:371;37840:420;:::o;11027:326::-;11087:4;11344:1;11322:7;:19;;;:23;11315:30;;11027:326;;;:::o;36515:321::-;36645:18;36651:2;36655:7;36645:5;:18::i;:::-;36696:54;36727:1;36731:2;36735:7;36744:5;36696:22;:54::i;:::-;36674:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36515:321;;;:::o;48202:589::-;48346:45;48373:4;48379:2;48383:7;48346:26;:45::i;:::-;48424:1;48408:18;;:4;:18;;;48404:187;;;48443:40;48475:7;48443:31;:40::i;:::-;48404:187;;;48513:2;48505:10;;:4;:10;;;48501:90;;48532:47;48565:4;48571:7;48532:32;:47::i;:::-;48501:90;48404:187;48619:1;48605:16;;:2;:16;;;48601:183;;;48638:45;48675:7;48638:36;:45::i;:::-;48601:183;;;48711:4;48705:10;;:2;:10;;;48701:83;;48732:40;48760:2;48764:7;48732:27;:40::i;:::-;48701:83;48601:183;48202:589;;;:::o;37172:439::-;37266:1;37252:16;;:2;:16;;;;37244:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37325:16;37333:7;37325;:16::i;:::-;37324:17;37316:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37387:45;37416:1;37420:2;37424:7;37387:20;:45::i;:::-;37462:1;37445:9;:13;37455:2;37445:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37493:2;37474:7;:16;37482:7;37474:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37538:7;37534:2;37513:33;;37530:1;37513:33;;;;;;;;;;;;37559:44;37587:1;37591:2;37595:7;37559:19;:44::i;:::-;37172:439;;:::o;41907:126::-;;;;:::o;49514:164::-;49618:10;:17;;;;49591:15;:24;49607:7;49591:24;;;;;;;;;;;:44;;;;49646:10;49662:7;49646:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49514:164;:::o;50305:988::-;50571:22;50621:1;50596:22;50613:4;50596:16;:22::i;:::-;:26;;;;:::i;:::-;50571:51;;50633:18;50654:17;:26;50672:7;50654:26;;;;;;;;;;;;50633:47;;50801:14;50787:10;:28;50783:328;;50832:19;50854:12;:18;50867:4;50854:18;;;;;;;;;;;;;;;:34;50873:14;50854:34;;;;;;;;;;;;50832:56;;50938:11;50905:12;:18;50918:4;50905:18;;;;;;;;;;;;;;;:30;50924:10;50905:30;;;;;;;;;;;:44;;;;51055:10;51022:17;:30;51040:11;51022:30;;;;;;;;;;;:43;;;;50817:294;50783:328;51207:17;:26;51225:7;51207:26;;;;;;;;;;;51200:33;;;51251:12;:18;51264:4;51251:18;;;;;;;;;;;;;;;:34;51270:14;51251:34;;;;;;;;;;;51244:41;;;50386:907;;50305:988;;:::o;51588:1079::-;51841:22;51886:1;51866:10;:17;;;;:21;;;;:::i;:::-;51841:46;;51898:18;51919:15;:24;51935:7;51919:24;;;;;;;;;;;;51898:45;;52270:19;52292:10;52303:14;52292:26;;;;;;;;:::i;:::-;;;;;;;;;;52270:48;;52356:11;52331:10;52342;52331:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;52467:10;52436:15;:28;52452:11;52436:28;;;;;;;;;;;:41;;;;52608:15;:24;52624:7;52608:24;;;;;;;;;;;52601:31;;;52643:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;51659:1008;;;51588:1079;:::o;49092:221::-;49177:14;49194:20;49211:2;49194:16;:20::i;:::-;49177:37;;49252:7;49225:12;:16;49238:2;49225:16;;;;;;;;;;;;;;;:24;49242:6;49225:24;;;;;;;;;;;:34;;;;49299:6;49270:17;:26;49288:7;49270:26;;;;;;;;;;;:35;;;;49166:147;49092:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:143::-;2129:5;2160:6;2154:13;2145:22;;2176:33;2203:5;2176:33;:::i;:::-;2072:143;;;;:::o;2221:329::-;2280:6;2329:2;2317:9;2308:7;2304:23;2300:32;2297:119;;;2335:79;;:::i;:::-;2297:119;2455:1;2480:53;2525:7;2516:6;2505:9;2501:22;2480:53;:::i;:::-;2470:63;;2426:117;2221:329;;;;:::o;2556:474::-;2624:6;2632;2681:2;2669:9;2660:7;2656:23;2652:32;2649:119;;;2687:79;;:::i;:::-;2649:119;2807:1;2832:53;2877:7;2868:6;2857:9;2853:22;2832:53;:::i;:::-;2822:63;;2778:117;2934:2;2960:53;3005:7;2996:6;2985:9;2981:22;2960:53;:::i;:::-;2950:63;;2905:118;2556:474;;;;;:::o;3036:619::-;3113:6;3121;3129;3178:2;3166:9;3157:7;3153:23;3149:32;3146:119;;;3184:79;;:::i;:::-;3146:119;3304:1;3329:53;3374:7;3365:6;3354:9;3350:22;3329:53;:::i;:::-;3319:63;;3275:117;3431:2;3457:53;3502:7;3493:6;3482:9;3478:22;3457:53;:::i;:::-;3447:63;;3402:118;3559:2;3585:53;3630:7;3621:6;3610:9;3606:22;3585:53;:::i;:::-;3575:63;;3530:118;3036:619;;;;;:::o;3661:943::-;3756:6;3764;3772;3780;3829:3;3817:9;3808:7;3804:23;3800:33;3797:120;;;3836:79;;:::i;:::-;3797:120;3956:1;3981:53;4026:7;4017:6;4006:9;4002:22;3981:53;:::i;:::-;3971:63;;3927:117;4083:2;4109:53;4154:7;4145:6;4134:9;4130:22;4109:53;:::i;:::-;4099:63;;4054:118;4211:2;4237:53;4282:7;4273:6;4262:9;4258:22;4237:53;:::i;:::-;4227:63;;4182:118;4367:2;4356:9;4352:18;4339:32;4398:18;4390:6;4387:30;4384:117;;;4420:79;;:::i;:::-;4384:117;4525:62;4579:7;4570:6;4559:9;4555:22;4525:62;:::i;:::-;4515:72;;4310:287;3661:943;;;;;;;:::o;4610:468::-;4675:6;4683;4732:2;4720:9;4711:7;4707:23;4703:32;4700:119;;;4738:79;;:::i;:::-;4700:119;4858:1;4883:53;4928:7;4919:6;4908:9;4904:22;4883:53;:::i;:::-;4873:63;;4829:117;4985:2;5011:50;5053:7;5044:6;5033:9;5029:22;5011:50;:::i;:::-;5001:60;;4956:115;4610:468;;;;;:::o;5084:474::-;5152:6;5160;5209:2;5197:9;5188:7;5184:23;5180:32;5177:119;;;5215:79;;:::i;:::-;5177:119;5335:1;5360:53;5405:7;5396:6;5385:9;5381:22;5360:53;:::i;:::-;5350:63;;5306:117;5462:2;5488:53;5533:7;5524:6;5513:9;5509:22;5488:53;:::i;:::-;5478:63;;5433:118;5084:474;;;;;:::o;5564:327::-;5622:6;5671:2;5659:9;5650:7;5646:23;5642:32;5639:119;;;5677:79;;:::i;:::-;5639:119;5797:1;5822:52;5866:7;5857:6;5846:9;5842:22;5822:52;:::i;:::-;5812:62;;5768:116;5564:327;;;;:::o;5897:349::-;5966:6;6015:2;6003:9;5994:7;5990:23;5986:32;5983:119;;;6021:79;;:::i;:::-;5983:119;6141:1;6166:63;6221:7;6212:6;6201:9;6197:22;6166:63;:::i;:::-;6156:73;;6112:127;5897:349;;;;:::o;6252:529::-;6323:6;6331;6380:2;6368:9;6359:7;6355:23;6351:32;6348:119;;;6386:79;;:::i;:::-;6348:119;6534:1;6523:9;6519:17;6506:31;6564:18;6556:6;6553:30;6550:117;;;6586:79;;:::i;:::-;6550:117;6699:65;6756:7;6747:6;6736:9;6732:22;6699:65;:::i;:::-;6681:83;;;;6477:297;6252:529;;;;;:::o;6787:329::-;6846:6;6895:2;6883:9;6874:7;6870:23;6866:32;6863:119;;;6901:79;;:::i;:::-;6863:119;7021:1;7046:53;7091:7;7082:6;7071:9;7067:22;7046:53;:::i;:::-;7036:63;;6992:117;6787:329;;;;:::o;7122:351::-;7192:6;7241:2;7229:9;7220:7;7216:23;7212:32;7209:119;;;7247:79;;:::i;:::-;7209:119;7367:1;7392:64;7448:7;7439:6;7428:9;7424:22;7392:64;:::i;:::-;7382:74;;7338:128;7122:351;;;;:::o;7479:142::-;7582:32;7608:5;7582:32;:::i;:::-;7577:3;7570:45;7479:142;;:::o;7627:118::-;7714:24;7732:5;7714:24;:::i;:::-;7709:3;7702:37;7627:118;;:::o;7751:109::-;7832:21;7847:5;7832:21;:::i;:::-;7827:3;7820:34;7751:109;;:::o;7866:360::-;7952:3;7980:38;8012:5;7980:38;:::i;:::-;8034:70;8097:6;8092:3;8034:70;:::i;:::-;8027:77;;8113:52;8158:6;8153:3;8146:4;8139:5;8135:16;8113:52;:::i;:::-;8190:29;8212:6;8190:29;:::i;:::-;8185:3;8181:39;8174:46;;7956:270;7866:360;;;;:::o;8232:147::-;8327:45;8366:5;8327:45;:::i;:::-;8322:3;8315:58;8232:147;;:::o;8385:::-;8480:45;8519:5;8480:45;:::i;:::-;8475:3;8468:58;8385:147;;:::o;8538:364::-;8626:3;8654:39;8687:5;8654:39;:::i;:::-;8709:71;8773:6;8768:3;8709:71;:::i;:::-;8702:78;;8789:52;8834:6;8829:3;8822:4;8815:5;8811:16;8789:52;:::i;:::-;8866:29;8888:6;8866:29;:::i;:::-;8861:3;8857:39;8850:46;;8630:272;8538:364;;;;:::o;8908:377::-;9014:3;9042:39;9075:5;9042:39;:::i;:::-;9097:89;9179:6;9174:3;9097:89;:::i;:::-;9090:96;;9195:52;9240:6;9235:3;9228:4;9221:5;9217:16;9195:52;:::i;:::-;9272:6;9267:3;9263:16;9256:23;;9018:267;8908:377;;;;:::o;9291:366::-;9433:3;9454:67;9518:2;9513:3;9454:67;:::i;:::-;9447:74;;9530:93;9619:3;9530:93;:::i;:::-;9648:2;9643:3;9639:12;9632:19;;9291:366;;;:::o;9663:::-;9805:3;9826:67;9890:2;9885:3;9826:67;:::i;:::-;9819:74;;9902:93;9991:3;9902:93;:::i;:::-;10020:2;10015:3;10011:12;10004:19;;9663:366;;;:::o;10035:::-;10177:3;10198:67;10262:2;10257:3;10198:67;:::i;:::-;10191:74;;10274:93;10363:3;10274:93;:::i;:::-;10392:2;10387:3;10383:12;10376:19;;10035:366;;;:::o;10407:::-;10549:3;10570:67;10634:2;10629:3;10570:67;:::i;:::-;10563:74;;10646:93;10735:3;10646:93;:::i;:::-;10764:2;10759:3;10755:12;10748:19;;10407:366;;;:::o;10779:::-;10921:3;10942:67;11006:2;11001:3;10942:67;:::i;:::-;10935:74;;11018:93;11107:3;11018:93;:::i;:::-;11136:2;11131:3;11127:12;11120:19;;10779:366;;;:::o;11151:::-;11293:3;11314:67;11378:2;11373:3;11314:67;:::i;:::-;11307:74;;11390:93;11479:3;11390:93;:::i;:::-;11508:2;11503:3;11499:12;11492:19;;11151:366;;;:::o;11523:::-;11665:3;11686:67;11750:2;11745:3;11686:67;:::i;:::-;11679:74;;11762:93;11851:3;11762:93;:::i;:::-;11880:2;11875:3;11871:12;11864:19;;11523:366;;;:::o;11895:::-;12037:3;12058:67;12122:2;12117:3;12058:67;:::i;:::-;12051:74;;12134:93;12223:3;12134:93;:::i;:::-;12252:2;12247:3;12243:12;12236:19;;11895:366;;;:::o;12267:::-;12409:3;12430:67;12494:2;12489:3;12430:67;:::i;:::-;12423:74;;12506:93;12595:3;12506:93;:::i;:::-;12624:2;12619:3;12615:12;12608:19;;12267:366;;;:::o;12639:::-;12781:3;12802:67;12866:2;12861:3;12802:67;:::i;:::-;12795:74;;12878:93;12967:3;12878:93;:::i;:::-;12996:2;12991:3;12987:12;12980:19;;12639:366;;;:::o;13011:::-;13153:3;13174:67;13238:2;13233:3;13174:67;:::i;:::-;13167:74;;13250:93;13339:3;13250:93;:::i;:::-;13368:2;13363:3;13359:12;13352:19;;13011:366;;;:::o;13383:::-;13525:3;13546:67;13610:2;13605:3;13546:67;:::i;:::-;13539:74;;13622:93;13711:3;13622:93;:::i;:::-;13740:2;13735:3;13731:12;13724:19;;13383:366;;;:::o;13755:::-;13897:3;13918:67;13982:2;13977:3;13918:67;:::i;:::-;13911:74;;13994:93;14083:3;13994:93;:::i;:::-;14112:2;14107:3;14103:12;14096:19;;13755:366;;;:::o;14127:::-;14269:3;14290:67;14354:2;14349:3;14290:67;:::i;:::-;14283:74;;14366:93;14455:3;14366:93;:::i;:::-;14484:2;14479:3;14475:12;14468:19;;14127:366;;;:::o;14499:::-;14641:3;14662:67;14726:2;14721:3;14662:67;:::i;:::-;14655:74;;14738:93;14827:3;14738:93;:::i;:::-;14856:2;14851:3;14847:12;14840:19;;14499:366;;;:::o;14871:::-;15013:3;15034:67;15098:2;15093:3;15034:67;:::i;:::-;15027:74;;15110:93;15199:3;15110:93;:::i;:::-;15228:2;15223:3;15219:12;15212:19;;14871:366;;;:::o;15243:::-;15385:3;15406:67;15470:2;15465:3;15406:67;:::i;:::-;15399:74;;15482:93;15571:3;15482:93;:::i;:::-;15600:2;15595:3;15591:12;15584:19;;15243:366;;;:::o;15615:::-;15757:3;15778:67;15842:2;15837:3;15778:67;:::i;:::-;15771:74;;15854:93;15943:3;15854:93;:::i;:::-;15972:2;15967:3;15963:12;15956:19;;15615:366;;;:::o;15987:::-;16129:3;16150:67;16214:2;16209:3;16150:67;:::i;:::-;16143:74;;16226:93;16315:3;16226:93;:::i;:::-;16344:2;16339:3;16335:12;16328:19;;15987:366;;;:::o;16359:400::-;16519:3;16540:84;16622:1;16617:3;16540:84;:::i;:::-;16533:91;;16633:93;16722:3;16633:93;:::i;:::-;16751:1;16746:3;16742:11;16735:18;;16359:400;;;:::o;16765:366::-;16907:3;16928:67;16992:2;16987:3;16928:67;:::i;:::-;16921:74;;17004:93;17093:3;17004:93;:::i;:::-;17122:2;17117:3;17113:12;17106:19;;16765:366;;;:::o;17137:::-;17279:3;17300:67;17364:2;17359:3;17300:67;:::i;:::-;17293:74;;17376:93;17465:3;17376:93;:::i;:::-;17494:2;17489:3;17485:12;17478:19;;17137:366;;;:::o;17509:::-;17651:3;17672:67;17736:2;17731:3;17672:67;:::i;:::-;17665:74;;17748:93;17837:3;17748:93;:::i;:::-;17866:2;17861:3;17857:12;17850:19;;17509:366;;;:::o;17881:::-;18023:3;18044:67;18108:2;18103:3;18044:67;:::i;:::-;18037:74;;18120:93;18209:3;18120:93;:::i;:::-;18238:2;18233:3;18229:12;18222:19;;17881:366;;;:::o;18253:::-;18395:3;18416:67;18480:2;18475:3;18416:67;:::i;:::-;18409:74;;18492:93;18581:3;18492:93;:::i;:::-;18610:2;18605:3;18601:12;18594:19;;18253:366;;;:::o;18625:::-;18767:3;18788:67;18852:2;18847:3;18788:67;:::i;:::-;18781:74;;18864:93;18953:3;18864:93;:::i;:::-;18982:2;18977:3;18973:12;18966:19;;18625:366;;;:::o;18997:::-;19139:3;19160:67;19224:2;19219:3;19160:67;:::i;:::-;19153:74;;19236:93;19325:3;19236:93;:::i;:::-;19354:2;19349:3;19345:12;19338:19;;18997:366;;;:::o;19369:::-;19511:3;19532:67;19596:2;19591:3;19532:67;:::i;:::-;19525:74;;19608:93;19697:3;19608:93;:::i;:::-;19726:2;19721:3;19717:12;19710:19;;19369:366;;;:::o;19741:::-;19883:3;19904:67;19968:2;19963:3;19904:67;:::i;:::-;19897:74;;19980:93;20069:3;19980:93;:::i;:::-;20098:2;20093:3;20089:12;20082:19;;19741:366;;;:::o;20113:118::-;20200:24;20218:5;20200:24;:::i;:::-;20195:3;20188:37;20113:118;;:::o;20237:701::-;20518:3;20540:95;20631:3;20622:6;20540:95;:::i;:::-;20533:102;;20652:95;20743:3;20734:6;20652:95;:::i;:::-;20645:102;;20764:148;20908:3;20764:148;:::i;:::-;20757:155;;20929:3;20922:10;;20237:701;;;;;:::o;20944:222::-;21037:4;21075:2;21064:9;21060:18;21052:26;;21088:71;21156:1;21145:9;21141:17;21132:6;21088:71;:::i;:::-;20944:222;;;;:::o;21172:254::-;21281:4;21319:2;21308:9;21304:18;21296:26;;21332:87;21416:1;21405:9;21401:17;21392:6;21332:87;:::i;:::-;21172:254;;;;:::o;21432:640::-;21627:4;21665:3;21654:9;21650:19;21642:27;;21679:71;21747:1;21736:9;21732:17;21723:6;21679:71;:::i;:::-;21760:72;21828:2;21817:9;21813:18;21804:6;21760:72;:::i;:::-;21842;21910:2;21899:9;21895:18;21886:6;21842:72;:::i;:::-;21961:9;21955:4;21951:20;21946:2;21935:9;21931:18;21924:48;21989:76;22060:4;22051:6;21989:76;:::i;:::-;21981:84;;21432:640;;;;;;;:::o;22078:348::-;22207:4;22245:2;22234:9;22230:18;22222:26;;22258:71;22326:1;22315:9;22311:17;22302:6;22258:71;:::i;:::-;22339:80;22415:2;22404:9;22400:18;22391:6;22339:80;:::i;:::-;22078:348;;;;;:::o;22432:::-;22561:4;22599:2;22588:9;22584:18;22576:26;;22612:71;22680:1;22669:9;22665:17;22656:6;22612:71;:::i;:::-;22693:80;22769:2;22758:9;22754:18;22745:6;22693:80;:::i;:::-;22432:348;;;;;:::o;22786:210::-;22873:4;22911:2;22900:9;22896:18;22888:26;;22924:65;22986:1;22975:9;22971:17;22962:6;22924:65;:::i;:::-;22786:210;;;;:::o;23002:313::-;23115:4;23153:2;23142:9;23138:18;23130:26;;23202:9;23196:4;23192:20;23188:1;23177:9;23173:17;23166:47;23230:78;23303:4;23294:6;23230:78;:::i;:::-;23222:86;;23002:313;;;;:::o;23321:419::-;23487:4;23525:2;23514:9;23510:18;23502:26;;23574:9;23568:4;23564:20;23560:1;23549:9;23545:17;23538:47;23602:131;23728:4;23602:131;:::i;:::-;23594:139;;23321:419;;;:::o;23746:::-;23912:4;23950:2;23939:9;23935:18;23927:26;;23999:9;23993:4;23989:20;23985:1;23974:9;23970:17;23963:47;24027:131;24153:4;24027:131;:::i;:::-;24019:139;;23746:419;;;:::o;24171:::-;24337:4;24375:2;24364:9;24360:18;24352:26;;24424:9;24418:4;24414:20;24410:1;24399:9;24395:17;24388:47;24452:131;24578:4;24452:131;:::i;:::-;24444:139;;24171:419;;;:::o;24596:::-;24762:4;24800:2;24789:9;24785:18;24777:26;;24849:9;24843:4;24839:20;24835:1;24824:9;24820:17;24813:47;24877:131;25003:4;24877:131;:::i;:::-;24869:139;;24596:419;;;:::o;25021:::-;25187:4;25225:2;25214:9;25210:18;25202:26;;25274:9;25268:4;25264:20;25260:1;25249:9;25245:17;25238:47;25302:131;25428:4;25302:131;:::i;:::-;25294:139;;25021:419;;;:::o;25446:::-;25612:4;25650:2;25639:9;25635:18;25627:26;;25699:9;25693:4;25689:20;25685:1;25674:9;25670:17;25663:47;25727:131;25853:4;25727:131;:::i;:::-;25719:139;;25446:419;;;:::o;25871:::-;26037:4;26075:2;26064:9;26060:18;26052:26;;26124:9;26118:4;26114:20;26110:1;26099:9;26095:17;26088:47;26152:131;26278:4;26152:131;:::i;:::-;26144:139;;25871:419;;;:::o;26296:::-;26462:4;26500:2;26489:9;26485:18;26477:26;;26549:9;26543:4;26539:20;26535:1;26524:9;26520:17;26513:47;26577:131;26703:4;26577:131;:::i;:::-;26569:139;;26296:419;;;:::o;26721:::-;26887:4;26925:2;26914:9;26910:18;26902:26;;26974:9;26968:4;26964:20;26960:1;26949:9;26945:17;26938:47;27002:131;27128:4;27002:131;:::i;:::-;26994:139;;26721:419;;;:::o;27146:::-;27312:4;27350:2;27339:9;27335:18;27327:26;;27399:9;27393:4;27389:20;27385:1;27374:9;27370:17;27363:47;27427:131;27553:4;27427:131;:::i;:::-;27419:139;;27146:419;;;:::o;27571:::-;27737:4;27775:2;27764:9;27760:18;27752:26;;27824:9;27818:4;27814:20;27810:1;27799:9;27795:17;27788:47;27852:131;27978:4;27852:131;:::i;:::-;27844:139;;27571:419;;;:::o;27996:::-;28162:4;28200:2;28189:9;28185:18;28177:26;;28249:9;28243:4;28239:20;28235:1;28224:9;28220:17;28213:47;28277:131;28403:4;28277:131;:::i;:::-;28269:139;;27996:419;;;:::o;28421:::-;28587:4;28625:2;28614:9;28610:18;28602:26;;28674:9;28668:4;28664:20;28660:1;28649:9;28645:17;28638:47;28702:131;28828:4;28702:131;:::i;:::-;28694:139;;28421:419;;;:::o;28846:::-;29012:4;29050:2;29039:9;29035:18;29027:26;;29099:9;29093:4;29089:20;29085:1;29074:9;29070:17;29063:47;29127:131;29253:4;29127:131;:::i;:::-;29119:139;;28846:419;;;:::o;29271:::-;29437:4;29475:2;29464:9;29460:18;29452:26;;29524:9;29518:4;29514:20;29510:1;29499:9;29495:17;29488:47;29552:131;29678:4;29552:131;:::i;:::-;29544:139;;29271:419;;;:::o;29696:::-;29862:4;29900:2;29889:9;29885:18;29877:26;;29949:9;29943:4;29939:20;29935:1;29924:9;29920:17;29913:47;29977:131;30103:4;29977:131;:::i;:::-;29969:139;;29696:419;;;:::o;30121:::-;30287:4;30325:2;30314:9;30310:18;30302:26;;30374:9;30368:4;30364:20;30360:1;30349:9;30345:17;30338:47;30402:131;30528:4;30402:131;:::i;:::-;30394:139;;30121:419;;;:::o;30546:::-;30712:4;30750:2;30739:9;30735:18;30727:26;;30799:9;30793:4;30789:20;30785:1;30774:9;30770:17;30763:47;30827:131;30953:4;30827:131;:::i;:::-;30819:139;;30546:419;;;:::o;30971:::-;31137:4;31175:2;31164:9;31160:18;31152:26;;31224:9;31218:4;31214:20;31210:1;31199:9;31195:17;31188:47;31252:131;31378:4;31252:131;:::i;:::-;31244:139;;30971:419;;;:::o;31396:::-;31562:4;31600:2;31589:9;31585:18;31577:26;;31649:9;31643:4;31639:20;31635:1;31624:9;31620:17;31613:47;31677:131;31803:4;31677:131;:::i;:::-;31669:139;;31396:419;;;:::o;31821:::-;31987:4;32025:2;32014:9;32010:18;32002:26;;32074:9;32068:4;32064:20;32060:1;32049:9;32045:17;32038:47;32102:131;32228:4;32102:131;:::i;:::-;32094:139;;31821:419;;;:::o;32246:::-;32412:4;32450:2;32439:9;32435:18;32427:26;;32499:9;32493:4;32489:20;32485:1;32474:9;32470:17;32463:47;32527:131;32653:4;32527:131;:::i;:::-;32519:139;;32246:419;;;:::o;32671:::-;32837:4;32875:2;32864:9;32860:18;32852:26;;32924:9;32918:4;32914:20;32910:1;32899:9;32895:17;32888:47;32952:131;33078:4;32952:131;:::i;:::-;32944:139;;32671:419;;;:::o;33096:::-;33262:4;33300:2;33289:9;33285:18;33277:26;;33349:9;33343:4;33339:20;33335:1;33324:9;33320:17;33313:47;33377:131;33503:4;33377:131;:::i;:::-;33369:139;;33096:419;;;:::o;33521:::-;33687:4;33725:2;33714:9;33710:18;33702:26;;33774:9;33768:4;33764:20;33760:1;33749:9;33745:17;33738:47;33802:131;33928:4;33802:131;:::i;:::-;33794:139;;33521:419;;;:::o;33946:::-;34112:4;34150:2;34139:9;34135:18;34127:26;;34199:9;34193:4;34189:20;34185:1;34174:9;34170:17;34163:47;34227:131;34353:4;34227:131;:::i;:::-;34219:139;;33946:419;;;:::o;34371:::-;34537:4;34575:2;34564:9;34560:18;34552:26;;34624:9;34618:4;34614:20;34610:1;34599:9;34595:17;34588:47;34652:131;34778:4;34652:131;:::i;:::-;34644:139;;34371:419;;;:::o;34796:::-;34962:4;35000:2;34989:9;34985:18;34977:26;;35049:9;35043:4;35039:20;35035:1;35024:9;35020:17;35013:47;35077:131;35203:4;35077:131;:::i;:::-;35069:139;;34796:419;;;:::o;35221:222::-;35314:4;35352:2;35341:9;35337:18;35329:26;;35365:71;35433:1;35422:9;35418:17;35409:6;35365:71;:::i;:::-;35221:222;;;;:::o;35449:129::-;35483:6;35510:20;;:::i;:::-;35500:30;;35539:33;35567:4;35559:6;35539:33;:::i;:::-;35449:129;;;:::o;35584:75::-;35617:6;35650:2;35644:9;35634:19;;35584:75;:::o;35665:307::-;35726:4;35816:18;35808:6;35805:30;35802:56;;;35838:18;;:::i;:::-;35802:56;35876:29;35898:6;35876:29;:::i;:::-;35868:37;;35960:4;35954;35950:15;35942:23;;35665:307;;;:::o;35978:98::-;36029:6;36063:5;36057:12;36047:22;;35978:98;;;:::o;36082:99::-;36134:6;36168:5;36162:12;36152:22;;36082:99;;;:::o;36187:168::-;36270:11;36304:6;36299:3;36292:19;36344:4;36339:3;36335:14;36320:29;;36187:168;;;;:::o;36361:169::-;36445:11;36479:6;36474:3;36467:19;36519:4;36514:3;36510:14;36495:29;;36361:169;;;;:::o;36536:148::-;36638:11;36675:3;36660:18;;36536:148;;;;:::o;36690:305::-;36730:3;36749:20;36767:1;36749:20;:::i;:::-;36744:25;;36783:20;36801:1;36783:20;:::i;:::-;36778:25;;36937:1;36869:66;36865:74;36862:1;36859:81;36856:107;;;36943:18;;:::i;:::-;36856:107;36987:1;36984;36980:9;36973:16;;36690:305;;;;:::o;37001:185::-;37041:1;37058:20;37076:1;37058:20;:::i;:::-;37053:25;;37092:20;37110:1;37092:20;:::i;:::-;37087:25;;37131:1;37121:35;;37136:18;;:::i;:::-;37121:35;37178:1;37175;37171:9;37166:14;;37001:185;;;;:::o;37192:348::-;37232:7;37255:20;37273:1;37255:20;:::i;:::-;37250:25;;37289:20;37307:1;37289:20;:::i;:::-;37284:25;;37477:1;37409:66;37405:74;37402:1;37399:81;37394:1;37387:9;37380:17;37376:105;37373:131;;;37484:18;;:::i;:::-;37373:131;37532:1;37529;37525:9;37514:20;;37192:348;;;;:::o;37546:191::-;37586:4;37606:20;37624:1;37606:20;:::i;:::-;37601:25;;37640:20;37658:1;37640:20;:::i;:::-;37635:25;;37679:1;37676;37673:8;37670:34;;;37684:18;;:::i;:::-;37670:34;37729:1;37726;37722:9;37714:17;;37546:191;;;;:::o;37743:96::-;37780:7;37809:24;37827:5;37809:24;:::i;:::-;37798:35;;37743:96;;;:::o;37845:104::-;37890:7;37919:24;37937:5;37919:24;:::i;:::-;37908:35;;37845:104;;;:::o;37955:90::-;37989:7;38032:5;38025:13;38018:21;38007:32;;37955:90;;;:::o;38051:149::-;38087:7;38127:66;38120:5;38116:78;38105:89;;38051:149;;;:::o;38206:126::-;38243:7;38283:42;38276:5;38272:54;38261:65;;38206:126;;;:::o;38338:77::-;38375:7;38404:5;38393:16;;38338:77;;;:::o;38421:121::-;38479:9;38512:24;38530:5;38512:24;:::i;:::-;38499:37;;38421:121;;;:::o;38548:::-;38606:9;38639:24;38657:5;38639:24;:::i;:::-;38626:37;;38548:121;;;:::o;38675:154::-;38759:6;38754:3;38749;38736:30;38821:1;38812:6;38807:3;38803:16;38796:27;38675:154;;;:::o;38835:307::-;38903:1;38913:113;38927:6;38924:1;38921:13;38913:113;;;39012:1;39007:3;39003:11;38997:18;38993:1;38988:3;38984:11;38977:39;38949:2;38946:1;38942:10;38937:15;;38913:113;;;39044:6;39041:1;39038:13;39035:101;;;39124:1;39115:6;39110:3;39106:16;39099:27;39035:101;38884:258;38835:307;;;:::o;39148:320::-;39192:6;39229:1;39223:4;39219:12;39209:22;;39276:1;39270:4;39266:12;39297:18;39287:81;;39353:4;39345:6;39341:17;39331:27;;39287:81;39415:2;39407:6;39404:14;39384:18;39381:38;39378:84;;;39434:18;;:::i;:::-;39378:84;39199:269;39148:320;;;:::o;39474:281::-;39557:27;39579:4;39557:27;:::i;:::-;39549:6;39545:40;39687:6;39675:10;39672:22;39651:18;39639:10;39636:34;39633:62;39630:88;;;39698:18;;:::i;:::-;39630:88;39738:10;39734:2;39727:22;39517:238;39474:281;;:::o;39761:233::-;39800:3;39823:24;39841:5;39823:24;:::i;:::-;39814:33;;39869:66;39862:5;39859:77;39856:103;;;39939:18;;:::i;:::-;39856:103;39986:1;39979:5;39975:13;39968:20;;39761:233;;;:::o;40000:176::-;40032:1;40049:20;40067:1;40049:20;:::i;:::-;40044:25;;40083:20;40101:1;40083:20;:::i;:::-;40078:25;;40122:1;40112:35;;40127:18;;:::i;:::-;40112:35;40168:1;40165;40161:9;40156:14;;40000:176;;;;:::o;40182:180::-;40230:77;40227:1;40220:88;40327:4;40324:1;40317:15;40351:4;40348:1;40341:15;40368:180;40416:77;40413:1;40406:88;40513:4;40510:1;40503:15;40537:4;40534:1;40527:15;40554:180;40602:77;40599:1;40592:88;40699:4;40696:1;40689:15;40723:4;40720:1;40713:15;40740:180;40788:77;40785:1;40778:88;40885:4;40882:1;40875:15;40909:4;40906:1;40899:15;40926:180;40974:77;40971:1;40964:88;41071:4;41068:1;41061:15;41095:4;41092:1;41085:15;41112:180;41160:77;41157:1;41150:88;41257:4;41254:1;41247:15;41281:4;41278:1;41271:15;41298:117;41407:1;41404;41397:12;41421:117;41530:1;41527;41520:12;41544:117;41653:1;41650;41643:12;41667:117;41776:1;41773;41766:12;41790:117;41899:1;41896;41889:12;41913:117;42022:1;42019;42012:12;42036:102;42077:6;42128:2;42124:7;42119:2;42112:5;42108:14;42104:28;42094:38;;42036:102;;;:::o;42144:173::-;42284:25;42280:1;42272:6;42268:14;42261:49;42144:173;:::o;42323:230::-;42463:34;42459:1;42451:6;42447:14;42440:58;42532:13;42527:2;42519:6;42515:15;42508:38;42323:230;:::o;42559:::-;42699:34;42695:1;42687:6;42683:14;42676:58;42768:13;42763:2;42755:6;42751:15;42744:38;42559:230;:::o;42795:237::-;42935:34;42931:1;42923:6;42919:14;42912:58;43004:20;42999:2;42991:6;42987:15;42980:45;42795:237;:::o;43038:174::-;43178:26;43174:1;43166:6;43162:14;43155:50;43038:174;:::o;43218:225::-;43358:34;43354:1;43346:6;43342:14;43335:58;43427:8;43422:2;43414:6;43410:15;43403:33;43218:225;:::o;43449:224::-;43589:34;43585:1;43577:6;43573:14;43566:58;43658:7;43653:2;43645:6;43641:15;43634:32;43449:224;:::o;43679:178::-;43819:30;43815:1;43807:6;43803:14;43796:54;43679:178;:::o;43863:223::-;44003:34;43999:1;43991:6;43987:14;43980:58;44072:6;44067:2;44059:6;44055:15;44048:31;43863:223;:::o;44092:175::-;44232:27;44228:1;44220:6;44216:14;44209:51;44092:175;:::o;44273:231::-;44413:34;44409:1;44401:6;44397:14;44390:58;44482:14;44477:2;44469:6;44465:15;44458:39;44273:231;:::o;44510:166::-;44650:18;44646:1;44638:6;44634:14;44627:42;44510:166;:::o;44682:243::-;44822:34;44818:1;44810:6;44806:14;44799:58;44891:26;44886:2;44878:6;44874:15;44867:51;44682:243;:::o;44931:170::-;45071:22;45067:1;45059:6;45055:14;45048:46;44931:170;:::o;45107:229::-;45247:34;45243:1;45235:6;45231:14;45224:58;45316:12;45311:2;45303:6;45299:15;45292:37;45107:229;:::o;45342:228::-;45482:34;45478:1;45470:6;45466:14;45459:58;45551:11;45546:2;45538:6;45534:15;45527:36;45342:228;:::o;45576:182::-;45716:34;45712:1;45704:6;45700:14;45693:58;45576:182;:::o;45764:165::-;45904:17;45900:1;45892:6;45888:14;45881:41;45764:165;:::o;45935:231::-;46075:34;46071:1;46063:6;46059:14;46052:58;46144:14;46139:2;46131:6;46127:15;46120:39;45935:231;:::o;46172:155::-;46312:7;46308:1;46300:6;46296:14;46289:31;46172:155;:::o;46333:182::-;46473:34;46469:1;46461:6;46457:14;46450:58;46333:182;:::o;46521:164::-;46661:16;46657:1;46649:6;46645:14;46638:40;46521:164;:::o;46691:181::-;46831:33;46827:1;46819:6;46815:14;46808:57;46691:181;:::o;46878:220::-;47018:34;47014:1;47006:6;47002:14;46995:58;47087:3;47082:2;47074:6;47070:15;47063:28;46878:220;:::o;47104:171::-;47244:23;47240:1;47232:6;47228:14;47221:47;47104:171;:::o;47281:236::-;47421:34;47417:1;47409:6;47405:14;47398:58;47490:19;47485:2;47477:6;47473:15;47466:44;47281:236;:::o;47523:176::-;47663:28;47659:1;47651:6;47647:14;47640:52;47523:176;:::o;47705:231::-;47845:34;47841:1;47833:6;47829:14;47822:58;47914:14;47909:2;47901:6;47897:15;47890:39;47705:231;:::o;47942:170::-;48082:22;48078:1;48070:6;48066:14;48059:46;47942:170;:::o;48118:122::-;48191:24;48209:5;48191:24;:::i;:::-;48184:5;48181:35;48171:63;;48230:1;48227;48220:12;48171:63;48118:122;:::o;48246:116::-;48316:21;48331:5;48316:21;:::i;:::-;48309:5;48306:32;48296:60;;48352:1;48349;48342:12;48296:60;48246:116;:::o;48368:120::-;48440:23;48457:5;48440:23;:::i;:::-;48433:5;48430:34;48420:62;;48478:1;48475;48468:12;48420:62;48368:120;:::o;48494:122::-;48567:24;48585:5;48567:24;:::i;:::-;48560:5;48557:35;48547:63;;48606:1;48603;48596:12;48547:63;48494:122;:::o

Swarm Source

ipfs://8392b8faa98245bd224ec695a2411717a084c0984d8d340b7a868eee1e6645e4
Loading