ETH Price: $2,682.96 (-1.07%)

Token

Forest Guardians (GUARDS)
 

Overview

Max Total Supply

51 GUARDS

Holders

49

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 GUARDS
0xc694D86085178f2c602aaee0f35d32dB2Bdc314f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ForestNFT

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-09-03
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.7.0) (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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

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

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

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

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

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

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

// 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.7.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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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 an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    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/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: forestguardians.sol

pragma solidity >=0.7.0 <0.9.0;








interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ForestNFT is ERC721Enumerable, Ownable {
    using Strings for uint256;

    string baseURI;
    string public baseExtension = "";
    uint256 public cost = 0.15 ether;
    uint256 public maxSupply = 300;
    uint256 public maxMintAmount = 5;
    uint256 public whitelistMintAmount = 1;
    bool public paused = true;
    bool public revealed = false;
    string public notRevealedUri;
    bool public whitelistEnforced = false;
    mapping (address => bool) public isWhitelisted;
    mapping (address => uint256) public whitelistedMintAmount;
    mapping (address => bool) public freeMinted;

    IERC20 public constant forestToken = IERC20(0x03CF23eFdB2A6cF6cf6eB8B5A3383966f5c6B6D5);
    uint256 holdingsRequired = 1000000000000000 * (10 ** forestToken.decimals());
    bool tokenHoldRequired = true;

    constructor() ERC721("Forest Guardians", "GUARDS"){
        setBaseURI("");
        setNotRevealedURI("");
    }

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

    function setTokenHoldRequired(bool enabled, uint256 amountInTokens) external onlyOwner {
        holdingsRequired = amountInTokens * (10 ** forestToken.decimals());
        tokenHoldRequired = enabled;
    }

    // private mint if needed.
    function privateMint(uint256 _mintAmount, address destination) public onlyOwner {
        uint256 supply = totalSupply();
        require(_mintAmount > 0, "cannot mint 0");
        require(supply + _mintAmount <= maxSupply, "Cannot mint above max supply");

        for (uint256 i = 1; i <= _mintAmount; i++) {
            _safeMint(destination, supply + i);
        }
    }

    function airdropMint(address[] memory wallets) external onlyOwner {
        uint256 supply = totalSupply();
        require(supply + wallets.length <= maxSupply, "Cannot mint above max supply");
        for(uint256 i=0; i<wallets.length; i++){
            _safeMint(wallets[i], supply + i);
        }
    }

    // public
    function mint(uint256 _mintAmount) public payable {
        uint256 supply = totalSupply();
        require(!paused, "NFT: Minting is paused");

        if(supply < 50){
            require(_mintAmount == 1, "NFT: Only 1 per free mint");
            require(!freeMinted[msg.sender], "Already free minted");
            freeMinted[msg.sender] = true;
        } else {
            require(_mintAmount <= maxMintAmount, "NFT: Minting too many");
        }
        
        if(tokenHoldRequired){
            require(forestToken.balanceOf(msg.sender) >= holdingsRequired, "Not holding enough tokens");
        }

        if(whitelistEnforced){
            require(isWhitelisted[msg.sender], "NFT: Must be whitelisted in order to mint during this phase");
            require(whitelistedMintAmount[msg.sender] + _mintAmount <= whitelistMintAmount, "NFT: Requesting too many whitelist NFTs to be minted");
            whitelistedMintAmount[msg.sender] += _mintAmount;
        }

        require(_mintAmount > 0, "NFT: cannot mint 0");
        require(supply + _mintAmount <= maxSupply, "NFT: Cannot mint above max supply");

       
        require(msg.value >= getCost(_mintAmount), "NFT: Must send enough ETH to cover mint fee");
        (bool os, ) = payable(address(owner())).call{value: address(this).balance}("");
        require(os);
        
        for (uint256 i = 1; i <= _mintAmount; i++) {
        _safeMint(msg.sender, supply + i);
        }
    }
    
    function startWhitelist() external onlyOwner {
        whitelistEnforced = true;
    }
    
    function startPublicSale() external onlyOwner {
        whitelistEnforced = false;
    }
    
    function whitelistAddresses(address[] calldata wallets, bool whitelistEnabled) external onlyOwner {
        for (uint256 i = 0; i < wallets.length; i++){
            isWhitelisted[wallets[i]] = whitelistEnabled;
        }
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory){
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
        tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory){
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        
        if(revealed == false) {
            return notRevealedUri;
        }

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

    //only owner
    function reveal() public onlyOwner {
        revealed = true;
    }
    
    function setCost(uint256 _newCostInWei) public onlyOwner {
        cost = _newCostInWei;
    }

    function setWhiteListMintAmount(uint256 _newAmount) public onlyOwner {
        require(_newAmount <= 3, "Cannot set higher than 3");
        whitelistMintAmount = _newAmount;
    }

    function setMaxMintAmount(uint256 _newAmount) public onlyOwner {
        require(_newAmount >= 1, "Cannot set lower than 1");
        maxMintAmount = _newAmount;
    }

    function setMaxSupply(uint256 _newMaxSupply) public onlyOwner {
        require(_newMaxSupply <= 10000, "Cannot set higher than 10000");
        maxSupply = _newMaxSupply;
    }
    
    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }
    
    // recover any stuck ETH (if someone sends ETH directly to the contract only)

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

    function getCost(uint256 amount) public view returns (uint256 totalCost) {
        uint256 supply = totalSupply();
        if(supply + amount <= 50){
            totalCost = 0;
        } else if(supply < 50){
            totalCost = (cost * amount) - ((50-supply) * amount);
        } else {
            totalCost = cost * amount;
        }
    }

    function walletHoldsEnough(address wallet) external view returns (bool){
        return (forestToken.balanceOf(wallet) >= holdingsRequired);
    }
}

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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"airdropMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forestToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getCost","outputs":[{"internalType":"uint256","name":"totalCost","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"privateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCostInWei","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"amountInTokens","type":"uint256"}],"name":"setTokenHoldRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"setWhiteListMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[{"internalType":"address","name":"wallet","type":"address"}],"name":"walletHoldsEnough","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"bool","name":"whitelistEnabled","type":"bool"}],"name":"whitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistEnforced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260405180602001604052806000815250600c90805190602001906200002b92919062000464565b50670214e8348c4f0000600d5561012c600e556005600f5560016010556001601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506000601360006101000a81548160ff0219169083151502179055507303cf23efdb2a6cf6cf6eb8b5a3383966f5c6b6d573ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f457600080fd5b505afa15801562000109573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012f91906200052b565b600a6200013d919062000612565b66038d7ea4c680006200015191906200074f565b6017556001601860006101000a81548160ff0219169083151502179055503480156200017c57600080fd5b506040518060400160405280601081526020017f466f7265737420477561726469616e73000000000000000000000000000000008152506040518060400160405280600681526020017f475541524453000000000000000000000000000000000000000000000000000081525081600090805190602001906200020192919062000464565b5080600190805190602001906200021a92919062000464565b5050506200023d620002316200028360201b60201c565b6200028b60201b60201c565b6200025d604051806020016040528060008152506200035160201b60201c565b6200027d604051806020016040528060008152506200037d60201b60201c565b620008b0565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000361620003a960201b60201c565b80600b90805190602001906200037992919062000464565b5050565b6200038d620003a960201b60201c565b8060129080519060200190620003a592919062000464565b5050565b620003b96200028360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003df6200043a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000438576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200042f9062000584565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200047290620007c7565b90600052602060002090601f016020900481019282620004965760008555620004e2565b82601f10620004b157805160ff1916838001178555620004e2565b82800160010185558215620004e2579182015b82811115620004e1578251825591602001919060010190620004c4565b5b509050620004f19190620004f5565b5090565b5b8082111562000510576000816000905550600101620004f6565b5090565b600081519050620005258162000896565b92915050565b6000602082840312156200054457620005436200085b565b5b6000620005548482850162000514565b91505092915050565b60006200056c602083620005a6565b915062000579826200086d565b602082019050919050565b600060208201905081810360008301526200059f816200055d565b9050919050565b600082825260208201905092915050565b6000808291508390505b60018511156200060957808604811115620005e157620005e0620007fd565b5b6001851615620005f15780820291505b8081029050620006018562000860565b9450620005c1565b94509492505050565b60006200061f82620007b0565b91506200062c83620007ba565b92506200065b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000663565b905092915050565b60008262000675576001905062000748565b8162000685576000905062000748565b81600181146200069e5760028114620006a957620006df565b600191505062000748565b60ff841115620006be57620006bd620007fd565b5b8360020a915084821115620006d857620006d7620007fd565b5b5062000748565b5060208310610133831016604e8410600b8410161715620007195782820a905083811115620007135762000712620007fd565b5b62000748565b620007288484846001620005b7565b92509050818404811115620007425762000741620007fd565b5b81810290505b9392505050565b60006200075c82620007b0565b91506200076983620007b0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007a557620007a4620007fd565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b60006002820490506001821680620007e057607f821691505b60208210811415620007f757620007f66200082c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b60008160011c9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620008a181620007ba565b8114620008ad57600080fd5b50565b61591a80620008c06000396000f3fe6080604052600436106102ff5760003560e01c806362e7707e11610190578063b88d4fde116100dc578063cfb89aba11610095578063e305b2bd1161006f578063e305b2bd14610b4c578063e985e9c514610b89578063f2c4ce1e14610bc6578063f2fde38b14610bef576102ff565b8063cfb89aba14610acd578063d5abeb0114610af8578063da3ef23f14610b23576102ff565b8063b88d4fde146109ab578063bb154db6146109d4578063beb73b31146109ff578063bef870ca14610a3c578063c668286214610a65578063c87b56dd14610a90576102ff565b806388f2da661161014957806395d89b411161012357806395d89b4114610924578063a0712d681461094f578063a22cb4651461096b578063a475b5dd14610994576102ff565b806388f2da66146108a557806389f91ece146108ce5780638da5cb5b146108f9576102ff565b806362e7707e146107ab5780636352211e146107d45780636f8b44b01461081157806370a082311461083a578063715018a6146108775780637f19c4121461088e576102ff565b8063389fcf061161024f57806346d3621111610208578063555503b1116101e2578063555503b1146106f157806355f804b31461071a5780635a4dd47d146107435780635c975abb14610780576102ff565b806346d36211146106605780634f6ccce71461068957806351830227146106c6576102ff565b8063389fcf061461054d5780633af32abf1461058a5780633ccfd60b146105c757806342842e0e146105d1578063438b6300146105fa57806344a0d68a14610637576102ff565b8063095ea7b3116102bc57806318160ddd1161029657806318160ddd14610491578063239c70ae146104bc57806323b872dd146104e75780632f745c5914610510576102ff565b8063095ea7b3146104265780630c1c972a1461044f57806313faede614610466576102ff565b806301ffc9a71461030457806302329a291461034157806306fdde031461036a578063081812fc14610395578063081c8c44146103d2578063088a4ed0146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613d6d565b610c18565b60405161033891906145e9565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613d00565b610c92565b005b34801561037657600080fd5b5061037f610cb7565b60405161038c919061461f565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190613e10565b610d49565b6040516103c99190614560565b60405180910390f35b3480156103de57600080fd5b506103e7610d8f565b6040516103f4919061461f565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190613e10565b610e1d565b005b34801561043257600080fd5b5061044d60048036038101906104489190613c17565b610e73565b005b34801561045b57600080fd5b50610464610f8b565b005b34801561047257600080fd5b5061047b610fb0565b6040516104889190614a21565b60405180910390f35b34801561049d57600080fd5b506104a6610fb6565b6040516104b39190614a21565b60405180910390f35b3480156104c857600080fd5b506104d1610fc3565b6040516104de9190614a21565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190613b01565b610fc9565b005b34801561051c57600080fd5b5061053760048036038101906105329190613c17565b611029565b6040516105449190614a21565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f9190613a94565b6110ce565b60405161058191906145e9565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190613a94565b6110ee565b6040516105be91906145e9565b60405180910390f35b6105cf61110e565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613b01565b61118f565b005b34801561060657600080fd5b50610621600480360381019061061c9190613a94565b6111af565b60405161062e91906145c7565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613e10565b61125d565b005b34801561066c57600080fd5b5061068760048036038101906106829190613cb7565b61126f565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613e10565b611327565b6040516106bd9190614a21565b60405180910390f35b3480156106d257600080fd5b506106db611398565b6040516106e891906145e9565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190613e10565b6113ab565b005b34801561072657600080fd5b50610741600480360381019061073c9190613dc7565b611401565b005b34801561074f57600080fd5b5061076a60048036038101906107659190613e10565b611423565b6040516107779190614a21565b60405180910390f35b34801561078c57600080fd5b506107956114a4565b6040516107a291906145e9565b60405180910390f35b3480156107b757600080fd5b506107d260048036038101906107cd9190613c57565b6114b7565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613e10565b611564565b6040516108089190614560565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613e10565b611616565b005b34801561084657600080fd5b50610861600480360381019061085c9190613a94565b61166d565b60405161086e9190614a21565b60405180910390f35b34801561088357600080fd5b5061088c611725565b005b34801561089a57600080fd5b506108a3611739565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190613d2d565b61175e565b005b3480156108da57600080fd5b506108e3611833565b6040516108f091906145e9565b60405180910390f35b34801561090557600080fd5b5061090e611846565b60405161091b9190614560565b60405180910390f35b34801561093057600080fd5b50610939611870565b604051610946919061461f565b60405180910390f35b61096960048036038101906109649190613e10565b611902565b005b34801561097757600080fd5b50610992600480360381019061098d9190613bd7565b611eef565b005b3480156109a057600080fd5b506109a9611f05565b005b3480156109b757600080fd5b506109d260048036038101906109cd9190613b54565b611f2a565b005b3480156109e057600080fd5b506109e9611f8c565b6040516109f69190614604565b60405180910390f35b348015610a0b57600080fd5b50610a266004803603810190610a219190613a94565b611fa4565b604051610a339190614a21565b60405180910390f35b348015610a4857600080fd5b50610a636004803603810190610a5e9190613e6a565b611fbc565b005b348015610a7157600080fd5b50610a7a61209f565b604051610a87919061461f565b60405180910390f35b348015610a9c57600080fd5b50610ab76004803603810190610ab29190613e10565b61212d565b604051610ac4919061461f565b60405180910390f35b348015610ad957600080fd5b50610ae2612286565b604051610aef9190614a21565b60405180910390f35b348015610b0457600080fd5b50610b0d61228c565b604051610b1a9190614a21565b60405180910390f35b348015610b2f57600080fd5b50610b4a6004803603810190610b459190613dc7565b612292565b005b348015610b5857600080fd5b50610b736004803603810190610b6e9190613a94565b6122b4565b604051610b8091906145e9565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab9190613ac1565b61235f565b604051610bbd91906145e9565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be89190613dc7565b6123f3565b005b348015610bfb57600080fd5b50610c166004803603810190610c119190613a94565b612415565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c8b5750610c8a82612499565b5b9050919050565b610c9a61257b565b80601160006101000a81548160ff02191690831515021790555050565b606060008054610cc690614f0a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf290614f0a565b8015610d3f5780601f10610d1457610100808354040283529160200191610d3f565b820191906000526020600020905b815481529060010190602001808311610d2257829003601f168201915b5050505050905090565b6000610d54826125f9565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60128054610d9c90614f0a565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614f0a565b8015610e155780601f10610dea57610100808354040283529160200191610e15565b820191906000526020600020905b815481529060010190602001808311610df857829003601f168201915b505050505081565b610e2561257b565b6001811015610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6090614801565b60405180910390fd5b80600f8190555050565b6000610e7e82611564565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee690614941565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f0e612644565b73ffffffffffffffffffffffffffffffffffffffff161480610f3d5750610f3c81610f37612644565b61235f565b5b610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f73906148a1565b60405180910390fd5b610f86838361264c565b505050565b610f9361257b565b6000601360006101000a81548160ff021916908315150217905550565b600d5481565b6000600880549050905090565b600f5481565b610fda610fd4612644565b82612705565b611019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611010906149e1565b60405180910390fd5b61102483838361279a565b505050565b60006110348361166d565b8210611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c906146a1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b60146020528060005260406000206000915054906101000a900460ff1681565b61111661257b565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161113c9061454b565b60006040518083038185875af1925050503d8060008114611179576040519150601f19603f3d011682016040523d82523d6000602084013e61117e565b606091505b505090508061118c57600080fd5b50565b6111aa83838360405180602001604052806000815250611f2a565b505050565b606060006111bc8361166d565b905060008167ffffffffffffffff8111156111da576111d96150d2565b5b6040519080825280602002602001820160405280156112085781602001602082028036833780820191505090505b50905060005b82811015611252576112208582611029565b828281518110611233576112326150a3565b5b602002602001018181525050808061124a90614f6d565b91505061120e565b508092505050919050565b61126561257b565b80600d8190555050565b61127761257b565b6000611281610fb6565b9050600e548251826112939190614b8b565b11156112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb90614881565b60405180910390fd5b60005b82518110156113225761130f8382815181106112f6576112f56150a3565b5b6020026020010151828461130a9190614b8b565b612a01565b808061131a90614f6d565b9150506112d7565b505050565b6000611331610fb6565b8210611372576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611369906149a1565b60405180910390fd5b60088281548110611386576113856150a3565b5b90600052602060002001549050919050565b601160019054906101000a900460ff1681565b6113b361257b565b60038111156113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90614861565b60405180910390fd5b8060108190555050565b61140961257b565b80600b908051906020019061141f92919061378a565b5050565b60008061142e610fb6565b90506032838261143e9190614b8b565b1161144c576000915061149e565b603281101561148c57828160326114639190614ddd565b61146d9190614d83565b83600d5461147b9190614d83565b6114859190614ddd565b915061149d565b82600d5461149a9190614d83565b91505b5b50919050565b601160009054906101000a900460ff1681565b6114bf61257b565b60005b8383905081101561155e5781601460008686858181106114e5576114e46150a3565b5b90506020020160208101906114fa9190613a94565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061155690614f6d565b9150506114c2565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561160d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160490614921565b60405180910390fd5b80915050919050565b61161e61257b565b612710811115611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a90614981565b60405180910390fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590614821565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61172d61257b565b6117376000612a1f565b565b61174161257b565b6001601360006101000a81548160ff021916908315150217905550565b61176661257b565b7303cf23efdb2a6cf6cf6eb8b5a3383966f5c6b6d573ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156117c057600080fd5b505afa1580156117d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f89190613eaa565b600a6118049190614c65565b8161180f9190614d83565b60178190555081601860006101000a81548160ff0219169083151502179055505050565b601360009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461187f90614f0a565b80601f01602080910402602001604051908101604052809291908181526020018280546118ab90614f0a565b80156118f85780601f106118cd576101008083540402835291602001916118f8565b820191906000526020600020905b8154815290600101906020018083116118db57829003601f168201915b5050505050905090565b600061190c610fb6565b9050601160009054906101000a900460ff161561195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590614641565b60405180910390fd5b6032811015611a9457600182146119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a190614a01565b60405180910390fd5b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90614661565b60405180910390fd5b6001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ada565b600f54821115611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad0906147c1565b60405180910390fd5b5b601860009054906101000a900460ff1615611bd1576017547303cf23efdb2a6cf6cf6eb8b5a3383966f5c6b6d573ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b3f9190614560565b60206040518083038186803b158015611b5757600080fd5b505afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f9190613e3d565b1015611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790614681565b60405180910390fd5b5b601360009054906101000a900460ff1615611d5857601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c69906146e1565b60405180910390fd5b60105482601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09190614b8b565b1115611d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf8906147a1565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d509190614b8b565b925050819055505b60008211611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d92906147e1565b60405180910390fd5b600e548282611daa9190614b8b565b1115611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290614961565b60405180910390fd5b611df482611423565b341015611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d90614841565b60405180910390fd5b6000611e40611846565b73ffffffffffffffffffffffffffffffffffffffff1647604051611e639061454b565b60006040518083038185875af1925050503d8060008114611ea0576040519150601f19603f3d011682016040523d82523d6000602084013e611ea5565b606091505b5050905080611eb357600080fd5b6000600190505b838111611ee957611ed6338285611ed19190614b8b565b612a01565b8080611ee190614f6d565b915050611eba565b50505050565b611f01611efa612644565b8383612ae5565b5050565b611f0d61257b565b6001601160016101000a81548160ff021916908315150217905550565b611f3b611f35612644565b83612705565b611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f71906149e1565b60405180910390fd5b611f8684848484612c52565b50505050565b7303cf23efdb2a6cf6cf6eb8b5a3383966f5c6b6d581565b60156020528060005260406000206000915090505481565b611fc461257b565b6000611fce610fb6565b905060008311612013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200a906149c1565b60405180910390fd5b600e5483826120229190614b8b565b1115612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90614881565b60405180910390fd5b6000600190505b838111612099576120868382846120819190614b8b565b612a01565b808061209190614f6d565b91505061206a565b50505050565b600c80546120ac90614f0a565b80601f01602080910402602001604051908101604052809291908181526020018280546120d890614f0a565b80156121255780601f106120fa57610100808354040283529160200191612125565b820191906000526020600020905b81548152906001019060200180831161210857829003601f168201915b505050505081565b606061213882612cae565b612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e90614901565b60405180910390fd5b60001515601160019054906101000a900460ff161515141561222557601280546121a090614f0a565b80601f01602080910402602001604051908101604052809291908181526020018280546121cc90614f0a565b80156122195780601f106121ee57610100808354040283529160200191612219565b820191906000526020600020905b8154815290600101906020018083116121fc57829003601f168201915b50505050509050612281565b600061222f612d1a565b9050600081511161224f576040518060200160405280600081525061227d565b8061225984612dac565b600c60405160200161226d9392919061451a565b6040516020818303038152906040525b9150505b919050565b60105481565b600e5481565b61229a61257b565b80600c90805190602001906122b092919061378a565b5050565b60006017547303cf23efdb2a6cf6cf6eb8b5a3383966f5c6b6d573ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016123069190614560565b60206040518083038186803b15801561231e57600080fd5b505afa158015612332573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123569190613e3d565b10159050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123fb61257b565b806012908051906020019061241192919061378a565b5050565b61241d61257b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614701565b60405180910390fd5b61249681612a1f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061256457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612574575061257382612f0d565b5b9050919050565b612583612644565b73ffffffffffffffffffffffffffffffffffffffff166125a1611846565b73ffffffffffffffffffffffffffffffffffffffff16146125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee906148e1565b60405180910390fd5b565b61260281612cae565b612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890614921565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126bf83611564565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061271183611564565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127535750612752818561235f565b5b8061279157508373ffffffffffffffffffffffffffffffffffffffff1661277984610d49565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127ba82611564565b73ffffffffffffffffffffffffffffffffffffffff1614612810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280790614721565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287790614761565b60405180910390fd5b61288b838383612f77565b61289660008261264c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e69190614ddd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293d9190614b8b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129fc83838361308b565b505050565b612a1b828260405180602001604052806000815250613090565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4b90614781565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c4591906145e9565b60405180910390a3505050565b612c5d84848461279a565b612c69848484846130eb565b612ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9f906146c1565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054612d2990614f0a565b80601f0160208091040260200160405190810160405280929190818152602001828054612d5590614f0a565b8015612da25780601f10612d7757610100808354040283529160200191612da2565b820191906000526020600020905b815481529060010190602001808311612d8557829003601f168201915b5050505050905090565b60606000821415612df4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f08565b600082905060005b60008214612e26578080612e0f90614f6d565b915050600a82612e1f9190614be1565b9150612dfc565b60008167ffffffffffffffff811115612e4257612e416150d2565b5b6040519080825280601f01601f191660200182016040528015612e745781602001600182028036833780820191505090505b5090505b60008514612f0157600182612e8d9190614ddd565b9150600a85612e9c9190614fb6565b6030612ea89190614b8b565b60f81b818381518110612ebe57612ebd6150a3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612efa9190614be1565b9450612e78565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f82838383613282565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fc557612fc081613287565b613004565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130035761300283826132d0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613047576130428161343d565b613086565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461308557613084828261350e565b5b5b505050565b505050565b61309a838361358d565b6130a760008484846130eb565b6130e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dd906146c1565b60405180910390fd5b505050565b600061310c8473ffffffffffffffffffffffffffffffffffffffff16613767565b15613275578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613135612644565b8786866040518563ffffffff1660e01b8152600401613157949392919061457b565b602060405180830381600087803b15801561317157600080fd5b505af19250505080156131a257506040513d601f19601f8201168201806040525081019061319f9190613d9a565b60015b613225573d80600081146131d2576040519150601f19603f3d011682016040523d82523d6000602084013e6131d7565b606091505b5060008151141561321d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613214906146c1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061327a565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132dd8461166d565b6132e79190614ddd565b90506000600760008481526020019081526020016000205490508181146133cc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134519190614ddd565b9050600060096000848152602001908152602001600020549050600060088381548110613481576134806150a3565b5b9060005260206000200154905080600883815481106134a3576134a26150a3565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134f2576134f1615074565b5b6001900381819060005260206000200160009055905550505050565b60006135198361166d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f4906148c1565b60405180910390fd5b61360681612cae565b15613646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363d90614741565b60405180910390fd5b61365260008383612f77565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136a29190614b8b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137636000838361308b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461379690614f0a565b90600052602060002090601f0160209004810192826137b857600085556137ff565b82601f106137d157805160ff19168380011785556137ff565b828001600101855582156137ff579182015b828111156137fe5782518255916020019190600101906137e3565b5b50905061380c9190613810565b5090565b5b80821115613829576000816000905550600101613811565b5090565b600061384061383b84614a61565b614a3c565b905080838252602082019050828560208602820111156138635761386261510b565b5b60005b8581101561389357816138798882613921565b845260208401935060208301925050600181019050613866565b5050509392505050565b60006138b06138ab84614a8d565b614a3c565b9050828152602081018484840111156138cc576138cb615110565b5b6138d7848285614ec8565b509392505050565b60006138f26138ed84614abe565b614a3c565b90508281526020810184848401111561390e5761390d615110565b5b613919848285614ec8565b509392505050565b60008135905061393081615871565b92915050565b60008083601f84011261394c5761394b615106565b5b8235905067ffffffffffffffff81111561396957613968615101565b5b6020830191508360208202830111156139855761398461510b565b5b9250929050565b600082601f8301126139a1576139a0615106565b5b81356139b184826020860161382d565b91505092915050565b6000813590506139c981615888565b92915050565b6000813590506139de8161589f565b92915050565b6000815190506139f38161589f565b92915050565b600082601f830112613a0e57613a0d615106565b5b8135613a1e84826020860161389d565b91505092915050565b600082601f830112613a3c57613a3b615106565b5b8135613a4c8482602086016138df565b91505092915050565b600081359050613a64816158b6565b92915050565b600081519050613a79816158b6565b92915050565b600081519050613a8e816158cd565b92915050565b600060208284031215613aaa57613aa961511a565b5b6000613ab884828501613921565b91505092915050565b60008060408385031215613ad857613ad761511a565b5b6000613ae685828601613921565b9250506020613af785828601613921565b9150509250929050565b600080600060608486031215613b1a57613b1961511a565b5b6000613b2886828701613921565b9350506020613b3986828701613921565b9250506040613b4a86828701613a55565b9150509250925092565b60008060008060808587031215613b6e57613b6d61511a565b5b6000613b7c87828801613921565b9450506020613b8d87828801613921565b9350506040613b9e87828801613a55565b925050606085013567ffffffffffffffff811115613bbf57613bbe615115565b5b613bcb878288016139f9565b91505092959194509250565b60008060408385031215613bee57613bed61511a565b5b6000613bfc85828601613921565b9250506020613c0d858286016139ba565b9150509250929050565b60008060408385031215613c2e57613c2d61511a565b5b6000613c3c85828601613921565b9250506020613c4d85828601613a55565b9150509250929050565b600080600060408486031215613c7057613c6f61511a565b5b600084013567ffffffffffffffff811115613c8e57613c8d615115565b5b613c9a86828701613936565b93509350506020613cad868287016139ba565b9150509250925092565b600060208284031215613ccd57613ccc61511a565b5b600082013567ffffffffffffffff811115613ceb57613cea615115565b5b613cf78482850161398c565b91505092915050565b600060208284031215613d1657613d1561511a565b5b6000613d24848285016139ba565b91505092915050565b60008060408385031215613d4457613d4361511a565b5b6000613d52858286016139ba565b9250506020613d6385828601613a55565b9150509250929050565b600060208284031215613d8357613d8261511a565b5b6000613d91848285016139cf565b91505092915050565b600060208284031215613db057613daf61511a565b5b6000613dbe848285016139e4565b91505092915050565b600060208284031215613ddd57613ddc61511a565b5b600082013567ffffffffffffffff811115613dfb57613dfa615115565b5b613e0784828501613a27565b91505092915050565b600060208284031215613e2657613e2561511a565b5b6000613e3484828501613a55565b91505092915050565b600060208284031215613e5357613e5261511a565b5b6000613e6184828501613a6a565b91505092915050565b60008060408385031215613e8157613e8061511a565b5b6000613e8f85828601613a55565b9250506020613ea085828601613921565b9150509250929050565b600060208284031215613ec057613ebf61511a565b5b6000613ece84828501613a7f565b91505092915050565b6000613ee383836144fc565b60208301905092915050565b613ef881614e11565b82525050565b6000613f0982614b14565b613f138185614b42565b9350613f1e83614aef565b8060005b83811015613f4f578151613f368882613ed7565b9750613f4183614b35565b925050600181019050613f22565b5085935050505092915050565b613f6581614e23565b82525050565b6000613f7682614b1f565b613f808185614b53565b9350613f90818560208601614ed7565b613f998161511f565b840191505092915050565b613fad81614e92565b82525050565b6000613fbe82614b2a565b613fc88185614b6f565b9350613fd8818560208601614ed7565b613fe18161511f565b840191505092915050565b6000613ff782614b2a565b6140018185614b80565b9350614011818560208601614ed7565b80840191505092915050565b6000815461402a81614f0a565b6140348186614b80565b9450600182166000811461404f576001811461406057614093565b60ff19831686528186019350614093565b61406985614aff565b60005b8381101561408b5781548189015260018201915060208101905061406c565b838801955050505b50505092915050565b60006140a9601683614b6f565b91506140b48261513d565b602082019050919050565b60006140cc601383614b6f565b91506140d782615166565b602082019050919050565b60006140ef601983614b6f565b91506140fa8261518f565b602082019050919050565b6000614112602b83614b6f565b915061411d826151b8565b604082019050919050565b6000614135603283614b6f565b915061414082615207565b604082019050919050565b6000614158603b83614b6f565b915061416382615256565b604082019050919050565b600061417b602683614b6f565b9150614186826152a5565b604082019050919050565b600061419e602583614b6f565b91506141a9826152f4565b604082019050919050565b60006141c1601c83614b6f565b91506141cc82615343565b602082019050919050565b60006141e4602483614b6f565b91506141ef8261536c565b604082019050919050565b6000614207601983614b6f565b9150614212826153bb565b602082019050919050565b600061422a603483614b6f565b9150614235826153e4565b604082019050919050565b600061424d601583614b6f565b915061425882615433565b602082019050919050565b6000614270601283614b6f565b915061427b8261545c565b602082019050919050565b6000614293601783614b6f565b915061429e82615485565b602082019050919050565b60006142b6602983614b6f565b91506142c1826154ae565b604082019050919050565b60006142d9602b83614b6f565b91506142e4826154fd565b604082019050919050565b60006142fc601883614b6f565b91506143078261554c565b602082019050919050565b600061431f601c83614b6f565b915061432a82615575565b602082019050919050565b6000614342603e83614b6f565b915061434d8261559e565b604082019050919050565b6000614365602083614b6f565b9150614370826155ed565b602082019050919050565b6000614388602083614b6f565b915061439382615616565b602082019050919050565b60006143ab602f83614b6f565b91506143b68261563f565b604082019050919050565b60006143ce601883614b6f565b91506143d98261568e565b602082019050919050565b60006143f1602183614b6f565b91506143fc826156b7565b604082019050919050565b6000614414602183614b6f565b915061441f82615706565b604082019050919050565b6000614437601c83614b6f565b915061444282615755565b602082019050919050565b600061445a600083614b64565b91506144658261577e565b600082019050919050565b600061447d602c83614b6f565b915061448882615781565b604082019050919050565b60006144a0600d83614b6f565b91506144ab826157d0565b602082019050919050565b60006144c3602e83614b6f565b91506144ce826157f9565b604082019050919050565b60006144e6601983614b6f565b91506144f182615848565b602082019050919050565b61450581614e7b565b82525050565b61451481614e7b565b82525050565b60006145268286613fec565b91506145328285613fec565b915061453e828461401d565b9150819050949350505050565b60006145568261444d565b9150819050919050565b60006020820190506145756000830184613eef565b92915050565b60006080820190506145906000830187613eef565b61459d6020830186613eef565b6145aa604083018561450b565b81810360608301526145bc8184613f6b565b905095945050505050565b600060208201905081810360008301526145e18184613efe565b905092915050565b60006020820190506145fe6000830184613f5c565b92915050565b60006020820190506146196000830184613fa4565b92915050565b600060208201905081810360008301526146398184613fb3565b905092915050565b6000602082019050818103600083015261465a8161409c565b9050919050565b6000602082019050818103600083015261467a816140bf565b9050919050565b6000602082019050818103600083015261469a816140e2565b9050919050565b600060208201905081810360008301526146ba81614105565b9050919050565b600060208201905081810360008301526146da81614128565b9050919050565b600060208201905081810360008301526146fa8161414b565b9050919050565b6000602082019050818103600083015261471a8161416e565b9050919050565b6000602082019050818103600083015261473a81614191565b9050919050565b6000602082019050818103600083015261475a816141b4565b9050919050565b6000602082019050818103600083015261477a816141d7565b9050919050565b6000602082019050818103600083015261479a816141fa565b9050919050565b600060208201905081810360008301526147ba8161421d565b9050919050565b600060208201905081810360008301526147da81614240565b9050919050565b600060208201905081810360008301526147fa81614263565b9050919050565b6000602082019050818103600083015261481a81614286565b9050919050565b6000602082019050818103600083015261483a816142a9565b9050919050565b6000602082019050818103600083015261485a816142cc565b9050919050565b6000602082019050818103600083015261487a816142ef565b9050919050565b6000602082019050818103600083015261489a81614312565b9050919050565b600060208201905081810360008301526148ba81614335565b9050919050565b600060208201905081810360008301526148da81614358565b9050919050565b600060208201905081810360008301526148fa8161437b565b9050919050565b6000602082019050818103600083015261491a8161439e565b9050919050565b6000602082019050818103600083015261493a816143c1565b9050919050565b6000602082019050818103600083015261495a816143e4565b9050919050565b6000602082019050818103600083015261497a81614407565b9050919050565b6000602082019050818103600083015261499a8161442a565b9050919050565b600060208201905081810360008301526149ba81614470565b9050919050565b600060208201905081810360008301526149da81614493565b9050919050565b600060208201905081810360008301526149fa816144b6565b9050919050565b60006020820190508181036000830152614a1a816144d9565b9050919050565b6000602082019050614a36600083018461450b565b92915050565b6000614a46614a57565b9050614a528282614f3c565b919050565b6000604051905090565b600067ffffffffffffffff821115614a7c57614a7b6150d2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aa857614aa76150d2565b5b614ab18261511f565b9050602081019050919050565b600067ffffffffffffffff821115614ad957614ad86150d2565b5b614ae28261511f565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b9682614e7b565b9150614ba183614e7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bd657614bd5614fe7565b5b828201905092915050565b6000614bec82614e7b565b9150614bf783614e7b565b925082614c0757614c06615016565b5b828204905092915050565b6000808291508390505b6001851115614c5c57808604811115614c3857614c37614fe7565b5b6001851615614c475780820291505b8081029050614c5585615130565b9450614c1c565b94509492505050565b6000614c7082614e7b565b9150614c7b83614e85565b9250614ca87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614cb0565b905092915050565b600082614cc05760019050614d7c565b81614cce5760009050614d7c565b8160018114614ce45760028114614cee57614d1d565b6001915050614d7c565b60ff841115614d0057614cff614fe7565b5b8360020a915084821115614d1757614d16614fe7565b5b50614d7c565b5060208310610133831016604e8410600b8410161715614d525782820a905083811115614d4d57614d4c614fe7565b5b614d7c565b614d5f8484846001614c12565b92509050818404811115614d7657614d75614fe7565b5b81810290505b9392505050565b6000614d8e82614e7b565b9150614d9983614e7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dd257614dd1614fe7565b5b828202905092915050565b6000614de882614e7b565b9150614df383614e7b565b925082821015614e0657614e05614fe7565b5b828203905092915050565b6000614e1c82614e5b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614e9d82614ea4565b9050919050565b6000614eaf82614eb6565b9050919050565b6000614ec182614e5b565b9050919050565b82818337600083830152505050565b60005b83811015614ef5578082015181840152602081019050614eda565b83811115614f04576000848401525b50505050565b60006002820490506001821680614f2257607f821691505b60208210811415614f3657614f35615045565b5b50919050565b614f458261511f565b810181811067ffffffffffffffff82111715614f6457614f636150d2565b5b80604052505050565b6000614f7882614e7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fab57614faa614fe7565b5b600182019050919050565b6000614fc182614e7b565b9150614fcc83614e7b565b925082614fdc57614fdb615016565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f4e46543a204d696e74696e672069732070617573656400000000000000000000600082015250565b7f416c72656164792066726565206d696e74656400000000000000000000000000600082015250565b7f4e6f7420686f6c64696e6720656e6f75676820746f6b656e7300000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e46543a204d7573742062652077686974656c697374656420696e206f72646560008201527f7220746f206d696e7420647572696e6720746869732070686173650000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e46543a2052657175657374696e6720746f6f206d616e792077686974656c6960008201527f7374204e46547320746f206265206d696e746564000000000000000000000000602082015250565b7f4e46543a204d696e74696e6720746f6f206d616e790000000000000000000000600082015250565b7f4e46543a2063616e6e6f74206d696e7420300000000000000000000000000000600082015250565b7f43616e6e6f7420736574206c6f776572207468616e2031000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e46543a204d7573742073656e6420656e6f7567682045544820746f20636f7660008201527f6572206d696e7420666565000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742073657420686967686572207468616e20330000000000000000600082015250565b7f43616e6e6f74206d696e742061626f7665206d617820737570706c7900000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a2043616e6e6f74206d696e742061626f7665206d617820737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742073657420686967686572207468616e20313030303000000000600082015250565b50565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f63616e6e6f74206d696e74203000000000000000000000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f4e46543a204f6e6c792031207065722066726565206d696e7400000000000000600082015250565b61587a81614e11565b811461588557600080fd5b50565b61589181614e23565b811461589c57600080fd5b50565b6158a881614e2f565b81146158b357600080fd5b50565b6158bf81614e7b565b81146158ca57600080fd5b50565b6158d681614e85565b81146158e157600080fd5b5056fea26469706673582212202b89851ce161803291b86be31484b13be876178b73f2f7611ef16a49e573e52f64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c806362e7707e11610190578063b88d4fde116100dc578063cfb89aba11610095578063e305b2bd1161006f578063e305b2bd14610b4c578063e985e9c514610b89578063f2c4ce1e14610bc6578063f2fde38b14610bef576102ff565b8063cfb89aba14610acd578063d5abeb0114610af8578063da3ef23f14610b23576102ff565b8063b88d4fde146109ab578063bb154db6146109d4578063beb73b31146109ff578063bef870ca14610a3c578063c668286214610a65578063c87b56dd14610a90576102ff565b806388f2da661161014957806395d89b411161012357806395d89b4114610924578063a0712d681461094f578063a22cb4651461096b578063a475b5dd14610994576102ff565b806388f2da66146108a557806389f91ece146108ce5780638da5cb5b146108f9576102ff565b806362e7707e146107ab5780636352211e146107d45780636f8b44b01461081157806370a082311461083a578063715018a6146108775780637f19c4121461088e576102ff565b8063389fcf061161024f57806346d3621111610208578063555503b1116101e2578063555503b1146106f157806355f804b31461071a5780635a4dd47d146107435780635c975abb14610780576102ff565b806346d36211146106605780634f6ccce71461068957806351830227146106c6576102ff565b8063389fcf061461054d5780633af32abf1461058a5780633ccfd60b146105c757806342842e0e146105d1578063438b6300146105fa57806344a0d68a14610637576102ff565b8063095ea7b3116102bc57806318160ddd1161029657806318160ddd14610491578063239c70ae146104bc57806323b872dd146104e75780632f745c5914610510576102ff565b8063095ea7b3146104265780630c1c972a1461044f57806313faede614610466576102ff565b806301ffc9a71461030457806302329a291461034157806306fdde031461036a578063081812fc14610395578063081c8c44146103d2578063088a4ed0146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613d6d565b610c18565b60405161033891906145e9565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613d00565b610c92565b005b34801561037657600080fd5b5061037f610cb7565b60405161038c919061461f565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b79190613e10565b610d49565b6040516103c99190614560565b60405180910390f35b3480156103de57600080fd5b506103e7610d8f565b6040516103f4919061461f565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f9190613e10565b610e1d565b005b34801561043257600080fd5b5061044d60048036038101906104489190613c17565b610e73565b005b34801561045b57600080fd5b50610464610f8b565b005b34801561047257600080fd5b5061047b610fb0565b6040516104889190614a21565b60405180910390f35b34801561049d57600080fd5b506104a6610fb6565b6040516104b39190614a21565b60405180910390f35b3480156104c857600080fd5b506104d1610fc3565b6040516104de9190614a21565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190613b01565b610fc9565b005b34801561051c57600080fd5b5061053760048036038101906105329190613c17565b611029565b6040516105449190614a21565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f9190613a94565b6110ce565b60405161058191906145e9565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190613a94565b6110ee565b6040516105be91906145e9565b60405180910390f35b6105cf61110e565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613b01565b61118f565b005b34801561060657600080fd5b50610621600480360381019061061c9190613a94565b6111af565b60405161062e91906145c7565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190613e10565b61125d565b005b34801561066c57600080fd5b5061068760048036038101906106829190613cb7565b61126f565b005b34801561069557600080fd5b506106b060048036038101906106ab9190613e10565b611327565b6040516106bd9190614a21565b60405180910390f35b3480156106d257600080fd5b506106db611398565b6040516106e891906145e9565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190613e10565b6113ab565b005b34801561072657600080fd5b50610741600480360381019061073c9190613dc7565b611401565b005b34801561074f57600080fd5b5061076a60048036038101906107659190613e10565b611423565b6040516107779190614a21565b60405180910390f35b34801561078c57600080fd5b506107956114a4565b6040516107a291906145e9565b60405180910390f35b3480156107b757600080fd5b506107d260048036038101906107cd9190613c57565b6114b7565b005b3480156107e057600080fd5b506107fb60048036038101906107f69190613e10565b611564565b6040516108089190614560565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613e10565b611616565b005b34801561084657600080fd5b50610861600480360381019061085c9190613a94565b61166d565b60405161086e9190614a21565b60405180910390f35b34801561088357600080fd5b5061088c611725565b005b34801561089a57600080fd5b506108a3611739565b005b3480156108b157600080fd5b506108cc60048036038101906108c79190613d2d565b61175e565b005b3480156108da57600080fd5b506108e3611833565b6040516108f091906145e9565b60405180910390f35b34801561090557600080fd5b5061090e611846565b60405161091b9190614560565b60405180910390f35b34801561093057600080fd5b50610939611870565b604051610946919061461f565b60405180910390f35b61096960048036038101906109649190613e10565b611902565b005b34801561097757600080fd5b50610992600480360381019061098d9190613bd7565b611eef565b005b3480156109a057600080fd5b506109a9611f05565b005b3480156109b757600080fd5b506109d260048036038101906109cd9190613b54565b611f2a565b005b3480156109e057600080fd5b506109e9611f8c565b6040516109f69190614604565b60405180910390f35b348015610a0b57600080fd5b50610a266004803603810190610a219190613a94565b611fa4565b604051610a339190614a21565b60405180910390f35b348015610a4857600080fd5b50610a636004803603810190610a5e9190613e6a565b611fbc565b005b348015610a7157600080fd5b50610a7a61209f565b604051610a87919061461f565b60405180910390f35b348015610a9c57600080fd5b50610ab76004803603810190610ab29190613e10565b61212d565b604051610ac4919061461f565b60405180910390f35b348015610ad957600080fd5b50610ae2612286565b604051610aef9190614a21565b60405180910390f35b348015610b0457600080fd5b50610b0d61228c565b604051610b1a9190614a21565b60405180910390f35b348015610b2f57600080fd5b50610b4a6004803603810190610b459190613dc7565b612292565b005b348015610b5857600080fd5b50610b736004803603810190610b6e9190613a94565b6122b4565b604051610b8091906145e9565b60405180910390f35b348015610b9557600080fd5b50610bb06004803603810190610bab9190613ac1565b61235f565b604051610bbd91906145e9565b60405180910390f35b348015610bd257600080fd5b50610bed6004803603810190610be89190613dc7565b6123f3565b005b348015610bfb57600080fd5b50610c166004803603810190610c119190613a94565b612415565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c8b5750610c8a82612499565b5b9050919050565b610c9a61257b565b80601160006101000a81548160ff02191690831515021790555050565b606060008054610cc690614f0a565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf290614f0a565b8015610d3f5780601f10610d1457610100808354040283529160200191610d3f565b820191906000526020600020905b815481529060010190602001808311610d2257829003601f168201915b5050505050905090565b6000610d54826125f9565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60128054610d9c90614f0a565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc890614f0a565b8015610e155780601f10610dea57610100808354040283529160200191610e15565b820191906000526020600020905b815481529060010190602001808311610df857829003601f168201915b505050505081565b610e2561257b565b6001811015610e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6090614801565b60405180910390fd5b80600f8190555050565b6000610e7e82611564565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee690614941565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f0e612644565b73ffffffffffffffffffffffffffffffffffffffff161480610f3d5750610f3c81610f37612644565b61235f565b5b610f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f73906148a1565b60405180910390fd5b610f86838361264c565b505050565b610f9361257b565b6000601360006101000a81548160ff021916908315150217905550565b600d5481565b6000600880549050905090565b600f5481565b610fda610fd4612644565b82612705565b611019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611010906149e1565b60405180910390fd5b61102483838361279a565b505050565b60006110348361166d565b8210611075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106c906146a1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60166020528060005260406000206000915054906101000a900460ff1681565b60146020528060005260406000206000915054906101000a900460ff1681565b61111661257b565b60003373ffffffffffffffffffffffffffffffffffffffff164760405161113c9061454b565b60006040518083038185875af1925050503d8060008114611179576040519150601f19603f3d011682016040523d82523d6000602084013e61117e565b606091505b505090508061118c57600080fd5b50565b6111aa83838360405180602001604052806000815250611f2a565b505050565b606060006111bc8361166d565b905060008167ffffffffffffffff8111156111da576111d96150d2565b5b6040519080825280602002602001820160405280156112085781602001602082028036833780820191505090505b50905060005b82811015611252576112208582611029565b828281518110611233576112326150a3565b5b602002602001018181525050808061124a90614f6d565b91505061120e565b508092505050919050565b61126561257b565b80600d8190555050565b61127761257b565b6000611281610fb6565b9050600e548251826112939190614b8b565b11156112d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cb90614881565b60405180910390fd5b60005b82518110156113225761130f8382815181106112f6576112f56150a3565b5b6020026020010151828461130a9190614b8b565b612a01565b808061131a90614f6d565b9150506112d7565b505050565b6000611331610fb6565b8210611372576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611369906149a1565b60405180910390fd5b60088281548110611386576113856150a3565b5b90600052602060002001549050919050565b601160019054906101000a900460ff1681565b6113b361257b565b60038111156113f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ee90614861565b60405180910390fd5b8060108190555050565b61140961257b565b80600b908051906020019061141f92919061378a565b5050565b60008061142e610fb6565b90506032838261143e9190614b8b565b1161144c576000915061149e565b603281101561148c57828160326114639190614ddd565b61146d9190614d83565b83600d5461147b9190614d83565b6114859190614ddd565b915061149d565b82600d5461149a9190614d83565b91505b5b50919050565b601160009054906101000a900460ff1681565b6114bf61257b565b60005b8383905081101561155e5781601460008686858181106114e5576114e46150a3565b5b90506020020160208101906114fa9190613a94565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061155690614f6d565b9150506114c2565b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561160d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160490614921565b60405180910390fd5b80915050919050565b61161e61257b565b612710811115611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a90614981565b60405180910390fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d590614821565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61172d61257b565b6117376000612a1f565b565b61174161257b565b6001601360006101000a81548160ff021916908315150217905550565b61176661257b565b7303cf23efdb2a6cf6cf6eb8b5a3383966f5c6b6d573ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156117c057600080fd5b505afa1580156117d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f89190613eaa565b600a6118049190614c65565b8161180f9190614d83565b60178190555081601860006101000a81548160ff0219169083151502179055505050565b601360009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461187f90614f0a565b80601f01602080910402602001604051908101604052809291908181526020018280546118ab90614f0a565b80156118f85780601f106118cd576101008083540402835291602001916118f8565b820191906000526020600020905b8154815290600101906020018083116118db57829003601f168201915b5050505050905090565b600061190c610fb6565b9050601160009054906101000a900460ff161561195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590614641565b60405180910390fd5b6032811015611a9457600182146119aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a190614a01565b60405180910390fd5b601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2e90614661565b60405180910390fd5b6001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ada565b600f54821115611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad0906147c1565b60405180910390fd5b5b601860009054906101000a900460ff1615611bd1576017547303cf23efdb2a6cf6cf6eb8b5a3383966f5c6b6d573ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b3f9190614560565b60206040518083038186803b158015611b5757600080fd5b505afa158015611b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8f9190613e3d565b1015611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790614681565b60405180910390fd5b5b601360009054906101000a900460ff1615611d5857601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c69906146e1565b60405180910390fd5b60105482601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc09190614b8b565b1115611d01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf8906147a1565b60405180910390fd5b81601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d509190614b8b565b925050819055505b60008211611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d92906147e1565b60405180910390fd5b600e548282611daa9190614b8b565b1115611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290614961565b60405180910390fd5b611df482611423565b341015611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d90614841565b60405180910390fd5b6000611e40611846565b73ffffffffffffffffffffffffffffffffffffffff1647604051611e639061454b565b60006040518083038185875af1925050503d8060008114611ea0576040519150601f19603f3d011682016040523d82523d6000602084013e611ea5565b606091505b5050905080611eb357600080fd5b6000600190505b838111611ee957611ed6338285611ed19190614b8b565b612a01565b8080611ee190614f6d565b915050611eba565b50505050565b611f01611efa612644565b8383612ae5565b5050565b611f0d61257b565b6001601160016101000a81548160ff021916908315150217905550565b611f3b611f35612644565b83612705565b611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f71906149e1565b60405180910390fd5b611f8684848484612c52565b50505050565b7303cf23efdb2a6cf6cf6eb8b5a3383966f5c6b6d581565b60156020528060005260406000206000915090505481565b611fc461257b565b6000611fce610fb6565b905060008311612013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200a906149c1565b60405180910390fd5b600e5483826120229190614b8b565b1115612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90614881565b60405180910390fd5b6000600190505b838111612099576120868382846120819190614b8b565b612a01565b808061209190614f6d565b91505061206a565b50505050565b600c80546120ac90614f0a565b80601f01602080910402602001604051908101604052809291908181526020018280546120d890614f0a565b80156121255780601f106120fa57610100808354040283529160200191612125565b820191906000526020600020905b81548152906001019060200180831161210857829003601f168201915b505050505081565b606061213882612cae565b612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e90614901565b60405180910390fd5b60001515601160019054906101000a900460ff161515141561222557601280546121a090614f0a565b80601f01602080910402602001604051908101604052809291908181526020018280546121cc90614f0a565b80156122195780601f106121ee57610100808354040283529160200191612219565b820191906000526020600020905b8154815290600101906020018083116121fc57829003601f168201915b50505050509050612281565b600061222f612d1a565b9050600081511161224f576040518060200160405280600081525061227d565b8061225984612dac565b600c60405160200161226d9392919061451a565b6040516020818303038152906040525b9150505b919050565b60105481565b600e5481565b61229a61257b565b80600c90805190602001906122b092919061378a565b5050565b60006017547303cf23efdb2a6cf6cf6eb8b5a3383966f5c6b6d573ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016123069190614560565b60206040518083038186803b15801561231e57600080fd5b505afa158015612332573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123569190613e3d565b10159050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123fb61257b565b806012908051906020019061241192919061378a565b5050565b61241d61257b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561248d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248490614701565b60405180910390fd5b61249681612a1f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061256457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612574575061257382612f0d565b5b9050919050565b612583612644565b73ffffffffffffffffffffffffffffffffffffffff166125a1611846565b73ffffffffffffffffffffffffffffffffffffffff16146125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee906148e1565b60405180910390fd5b565b61260281612cae565b612641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263890614921565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126bf83611564565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061271183611564565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127535750612752818561235f565b5b8061279157508373ffffffffffffffffffffffffffffffffffffffff1661277984610d49565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127ba82611564565b73ffffffffffffffffffffffffffffffffffffffff1614612810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280790614721565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612880576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287790614761565b60405180910390fd5b61288b838383612f77565b61289660008261264c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128e69190614ddd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293d9190614b8b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129fc83838361308b565b505050565b612a1b828260405180602001604052806000815250613090565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4b90614781565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c4591906145e9565b60405180910390a3505050565b612c5d84848461279a565b612c69848484846130eb565b612ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9f906146c1565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b8054612d2990614f0a565b80601f0160208091040260200160405190810160405280929190818152602001828054612d5590614f0a565b8015612da25780601f10612d7757610100808354040283529160200191612da2565b820191906000526020600020905b815481529060010190602001808311612d8557829003601f168201915b5050505050905090565b60606000821415612df4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f08565b600082905060005b60008214612e26578080612e0f90614f6d565b915050600a82612e1f9190614be1565b9150612dfc565b60008167ffffffffffffffff811115612e4257612e416150d2565b5b6040519080825280601f01601f191660200182016040528015612e745781602001600182028036833780820191505090505b5090505b60008514612f0157600182612e8d9190614ddd565b9150600a85612e9c9190614fb6565b6030612ea89190614b8b565b60f81b818381518110612ebe57612ebd6150a3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612efa9190614be1565b9450612e78565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f82838383613282565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612fc557612fc081613287565b613004565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130035761300283826132d0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613047576130428161343d565b613086565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461308557613084828261350e565b5b5b505050565b505050565b61309a838361358d565b6130a760008484846130eb565b6130e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dd906146c1565b60405180910390fd5b505050565b600061310c8473ffffffffffffffffffffffffffffffffffffffff16613767565b15613275578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613135612644565b8786866040518563ffffffff1660e01b8152600401613157949392919061457b565b602060405180830381600087803b15801561317157600080fd5b505af19250505080156131a257506040513d601f19601f8201168201806040525081019061319f9190613d9a565b60015b613225573d80600081146131d2576040519150601f19603f3d011682016040523d82523d6000602084013e6131d7565b606091505b5060008151141561321d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613214906146c1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061327a565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016132dd8461166d565b6132e79190614ddd565b90506000600760008481526020019081526020016000205490508181146133cc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506134519190614ddd565b9050600060096000848152602001908152602001600020549050600060088381548110613481576134806150a3565b5b9060005260206000200154905080600883815481106134a3576134a26150a3565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806134f2576134f1615074565b5b6001900381819060005260206000200160009055905550505050565b60006135198361166d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f4906148c1565b60405180910390fd5b61360681612cae565b15613646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161363d90614741565b60405180910390fd5b61365260008383612f77565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136a29190614b8b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137636000838361308b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461379690614f0a565b90600052602060002090601f0160209004810192826137b857600085556137ff565b82601f106137d157805160ff19168380011785556137ff565b828001600101855582156137ff579182015b828111156137fe5782518255916020019190600101906137e3565b5b50905061380c9190613810565b5090565b5b80821115613829576000816000905550600101613811565b5090565b600061384061383b84614a61565b614a3c565b905080838252602082019050828560208602820111156138635761386261510b565b5b60005b8581101561389357816138798882613921565b845260208401935060208301925050600181019050613866565b5050509392505050565b60006138b06138ab84614a8d565b614a3c565b9050828152602081018484840111156138cc576138cb615110565b5b6138d7848285614ec8565b509392505050565b60006138f26138ed84614abe565b614a3c565b90508281526020810184848401111561390e5761390d615110565b5b613919848285614ec8565b509392505050565b60008135905061393081615871565b92915050565b60008083601f84011261394c5761394b615106565b5b8235905067ffffffffffffffff81111561396957613968615101565b5b6020830191508360208202830111156139855761398461510b565b5b9250929050565b600082601f8301126139a1576139a0615106565b5b81356139b184826020860161382d565b91505092915050565b6000813590506139c981615888565b92915050565b6000813590506139de8161589f565b92915050565b6000815190506139f38161589f565b92915050565b600082601f830112613a0e57613a0d615106565b5b8135613a1e84826020860161389d565b91505092915050565b600082601f830112613a3c57613a3b615106565b5b8135613a4c8482602086016138df565b91505092915050565b600081359050613a64816158b6565b92915050565b600081519050613a79816158b6565b92915050565b600081519050613a8e816158cd565b92915050565b600060208284031215613aaa57613aa961511a565b5b6000613ab884828501613921565b91505092915050565b60008060408385031215613ad857613ad761511a565b5b6000613ae685828601613921565b9250506020613af785828601613921565b9150509250929050565b600080600060608486031215613b1a57613b1961511a565b5b6000613b2886828701613921565b9350506020613b3986828701613921565b9250506040613b4a86828701613a55565b9150509250925092565b60008060008060808587031215613b6e57613b6d61511a565b5b6000613b7c87828801613921565b9450506020613b8d87828801613921565b9350506040613b9e87828801613a55565b925050606085013567ffffffffffffffff811115613bbf57613bbe615115565b5b613bcb878288016139f9565b91505092959194509250565b60008060408385031215613bee57613bed61511a565b5b6000613bfc85828601613921565b9250506020613c0d858286016139ba565b9150509250929050565b60008060408385031215613c2e57613c2d61511a565b5b6000613c3c85828601613921565b9250506020613c4d85828601613a55565b9150509250929050565b600080600060408486031215613c7057613c6f61511a565b5b600084013567ffffffffffffffff811115613c8e57613c8d615115565b5b613c9a86828701613936565b93509350506020613cad868287016139ba565b9150509250925092565b600060208284031215613ccd57613ccc61511a565b5b600082013567ffffffffffffffff811115613ceb57613cea615115565b5b613cf78482850161398c565b91505092915050565b600060208284031215613d1657613d1561511a565b5b6000613d24848285016139ba565b91505092915050565b60008060408385031215613d4457613d4361511a565b5b6000613d52858286016139ba565b9250506020613d6385828601613a55565b9150509250929050565b600060208284031215613d8357613d8261511a565b5b6000613d91848285016139cf565b91505092915050565b600060208284031215613db057613daf61511a565b5b6000613dbe848285016139e4565b91505092915050565b600060208284031215613ddd57613ddc61511a565b5b600082013567ffffffffffffffff811115613dfb57613dfa615115565b5b613e0784828501613a27565b91505092915050565b600060208284031215613e2657613e2561511a565b5b6000613e3484828501613a55565b91505092915050565b600060208284031215613e5357613e5261511a565b5b6000613e6184828501613a6a565b91505092915050565b60008060408385031215613e8157613e8061511a565b5b6000613e8f85828601613a55565b9250506020613ea085828601613921565b9150509250929050565b600060208284031215613ec057613ebf61511a565b5b6000613ece84828501613a7f565b91505092915050565b6000613ee383836144fc565b60208301905092915050565b613ef881614e11565b82525050565b6000613f0982614b14565b613f138185614b42565b9350613f1e83614aef565b8060005b83811015613f4f578151613f368882613ed7565b9750613f4183614b35565b925050600181019050613f22565b5085935050505092915050565b613f6581614e23565b82525050565b6000613f7682614b1f565b613f808185614b53565b9350613f90818560208601614ed7565b613f998161511f565b840191505092915050565b613fad81614e92565b82525050565b6000613fbe82614b2a565b613fc88185614b6f565b9350613fd8818560208601614ed7565b613fe18161511f565b840191505092915050565b6000613ff782614b2a565b6140018185614b80565b9350614011818560208601614ed7565b80840191505092915050565b6000815461402a81614f0a565b6140348186614b80565b9450600182166000811461404f576001811461406057614093565b60ff19831686528186019350614093565b61406985614aff565b60005b8381101561408b5781548189015260018201915060208101905061406c565b838801955050505b50505092915050565b60006140a9601683614b6f565b91506140b48261513d565b602082019050919050565b60006140cc601383614b6f565b91506140d782615166565b602082019050919050565b60006140ef601983614b6f565b91506140fa8261518f565b602082019050919050565b6000614112602b83614b6f565b915061411d826151b8565b604082019050919050565b6000614135603283614b6f565b915061414082615207565b604082019050919050565b6000614158603b83614b6f565b915061416382615256565b604082019050919050565b600061417b602683614b6f565b9150614186826152a5565b604082019050919050565b600061419e602583614b6f565b91506141a9826152f4565b604082019050919050565b60006141c1601c83614b6f565b91506141cc82615343565b602082019050919050565b60006141e4602483614b6f565b91506141ef8261536c565b604082019050919050565b6000614207601983614b6f565b9150614212826153bb565b602082019050919050565b600061422a603483614b6f565b9150614235826153e4565b604082019050919050565b600061424d601583614b6f565b915061425882615433565b602082019050919050565b6000614270601283614b6f565b915061427b8261545c565b602082019050919050565b6000614293601783614b6f565b915061429e82615485565b602082019050919050565b60006142b6602983614b6f565b91506142c1826154ae565b604082019050919050565b60006142d9602b83614b6f565b91506142e4826154fd565b604082019050919050565b60006142fc601883614b6f565b91506143078261554c565b602082019050919050565b600061431f601c83614b6f565b915061432a82615575565b602082019050919050565b6000614342603e83614b6f565b915061434d8261559e565b604082019050919050565b6000614365602083614b6f565b9150614370826155ed565b602082019050919050565b6000614388602083614b6f565b915061439382615616565b602082019050919050565b60006143ab602f83614b6f565b91506143b68261563f565b604082019050919050565b60006143ce601883614b6f565b91506143d98261568e565b602082019050919050565b60006143f1602183614b6f565b91506143fc826156b7565b604082019050919050565b6000614414602183614b6f565b915061441f82615706565b604082019050919050565b6000614437601c83614b6f565b915061444282615755565b602082019050919050565b600061445a600083614b64565b91506144658261577e565b600082019050919050565b600061447d602c83614b6f565b915061448882615781565b604082019050919050565b60006144a0600d83614b6f565b91506144ab826157d0565b602082019050919050565b60006144c3602e83614b6f565b91506144ce826157f9565b604082019050919050565b60006144e6601983614b6f565b91506144f182615848565b602082019050919050565b61450581614e7b565b82525050565b61451481614e7b565b82525050565b60006145268286613fec565b91506145328285613fec565b915061453e828461401d565b9150819050949350505050565b60006145568261444d565b9150819050919050565b60006020820190506145756000830184613eef565b92915050565b60006080820190506145906000830187613eef565b61459d6020830186613eef565b6145aa604083018561450b565b81810360608301526145bc8184613f6b565b905095945050505050565b600060208201905081810360008301526145e18184613efe565b905092915050565b60006020820190506145fe6000830184613f5c565b92915050565b60006020820190506146196000830184613fa4565b92915050565b600060208201905081810360008301526146398184613fb3565b905092915050565b6000602082019050818103600083015261465a8161409c565b9050919050565b6000602082019050818103600083015261467a816140bf565b9050919050565b6000602082019050818103600083015261469a816140e2565b9050919050565b600060208201905081810360008301526146ba81614105565b9050919050565b600060208201905081810360008301526146da81614128565b9050919050565b600060208201905081810360008301526146fa8161414b565b9050919050565b6000602082019050818103600083015261471a8161416e565b9050919050565b6000602082019050818103600083015261473a81614191565b9050919050565b6000602082019050818103600083015261475a816141b4565b9050919050565b6000602082019050818103600083015261477a816141d7565b9050919050565b6000602082019050818103600083015261479a816141fa565b9050919050565b600060208201905081810360008301526147ba8161421d565b9050919050565b600060208201905081810360008301526147da81614240565b9050919050565b600060208201905081810360008301526147fa81614263565b9050919050565b6000602082019050818103600083015261481a81614286565b9050919050565b6000602082019050818103600083015261483a816142a9565b9050919050565b6000602082019050818103600083015261485a816142cc565b9050919050565b6000602082019050818103600083015261487a816142ef565b9050919050565b6000602082019050818103600083015261489a81614312565b9050919050565b600060208201905081810360008301526148ba81614335565b9050919050565b600060208201905081810360008301526148da81614358565b9050919050565b600060208201905081810360008301526148fa8161437b565b9050919050565b6000602082019050818103600083015261491a8161439e565b9050919050565b6000602082019050818103600083015261493a816143c1565b9050919050565b6000602082019050818103600083015261495a816143e4565b9050919050565b6000602082019050818103600083015261497a81614407565b9050919050565b6000602082019050818103600083015261499a8161442a565b9050919050565b600060208201905081810360008301526149ba81614470565b9050919050565b600060208201905081810360008301526149da81614493565b9050919050565b600060208201905081810360008301526149fa816144b6565b9050919050565b60006020820190508181036000830152614a1a816144d9565b9050919050565b6000602082019050614a36600083018461450b565b92915050565b6000614a46614a57565b9050614a528282614f3c565b919050565b6000604051905090565b600067ffffffffffffffff821115614a7c57614a7b6150d2565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614aa857614aa76150d2565b5b614ab18261511f565b9050602081019050919050565b600067ffffffffffffffff821115614ad957614ad86150d2565b5b614ae28261511f565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b9682614e7b565b9150614ba183614e7b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bd657614bd5614fe7565b5b828201905092915050565b6000614bec82614e7b565b9150614bf783614e7b565b925082614c0757614c06615016565b5b828204905092915050565b6000808291508390505b6001851115614c5c57808604811115614c3857614c37614fe7565b5b6001851615614c475780820291505b8081029050614c5585615130565b9450614c1c565b94509492505050565b6000614c7082614e7b565b9150614c7b83614e85565b9250614ca87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614cb0565b905092915050565b600082614cc05760019050614d7c565b81614cce5760009050614d7c565b8160018114614ce45760028114614cee57614d1d565b6001915050614d7c565b60ff841115614d0057614cff614fe7565b5b8360020a915084821115614d1757614d16614fe7565b5b50614d7c565b5060208310610133831016604e8410600b8410161715614d525782820a905083811115614d4d57614d4c614fe7565b5b614d7c565b614d5f8484846001614c12565b92509050818404811115614d7657614d75614fe7565b5b81810290505b9392505050565b6000614d8e82614e7b565b9150614d9983614e7b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614dd257614dd1614fe7565b5b828202905092915050565b6000614de882614e7b565b9150614df383614e7b565b925082821015614e0657614e05614fe7565b5b828203905092915050565b6000614e1c82614e5b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614e9d82614ea4565b9050919050565b6000614eaf82614eb6565b9050919050565b6000614ec182614e5b565b9050919050565b82818337600083830152505050565b60005b83811015614ef5578082015181840152602081019050614eda565b83811115614f04576000848401525b50505050565b60006002820490506001821680614f2257607f821691505b60208210811415614f3657614f35615045565b5b50919050565b614f458261511f565b810181811067ffffffffffffffff82111715614f6457614f636150d2565b5b80604052505050565b6000614f7882614e7b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fab57614faa614fe7565b5b600182019050919050565b6000614fc182614e7b565b9150614fcc83614e7b565b925082614fdc57614fdb615016565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f4e46543a204d696e74696e672069732070617573656400000000000000000000600082015250565b7f416c72656164792066726565206d696e74656400000000000000000000000000600082015250565b7f4e6f7420686f6c64696e6720656e6f75676820746f6b656e7300000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4e46543a204d7573742062652077686974656c697374656420696e206f72646560008201527f7220746f206d696e7420647572696e6720746869732070686173650000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e46543a2052657175657374696e6720746f6f206d616e792077686974656c6960008201527f7374204e46547320746f206265206d696e746564000000000000000000000000602082015250565b7f4e46543a204d696e74696e6720746f6f206d616e790000000000000000000000600082015250565b7f4e46543a2063616e6e6f74206d696e7420300000000000000000000000000000600082015250565b7f43616e6e6f7420736574206c6f776572207468616e2031000000000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4e46543a204d7573742073656e6420656e6f7567682045544820746f20636f7660008201527f6572206d696e7420666565000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742073657420686967686572207468616e20330000000000000000600082015250565b7f43616e6e6f74206d696e742061626f7665206d617820737570706c7900000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e46543a2043616e6e6f74206d696e742061626f7665206d617820737570706c60008201527f7900000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742073657420686967686572207468616e20313030303000000000600082015250565b50565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f63616e6e6f74206d696e74203000000000000000000000000000000000000000600082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f4e46543a204f6e6c792031207065722066726565206d696e7400000000000000600082015250565b61587a81614e11565b811461588557600080fd5b50565b61589181614e23565b811461589c57600080fd5b50565b6158a881614e2f565b81146158b357600080fd5b50565b6158bf81614e7b565b81146158ca57600080fd5b50565b6158d681614e85565b81146158e157600080fd5b5056fea26469706673582212202b89851ce161803291b86be31484b13be876178b73f2f7611ef16a49e573e52f64736f6c63430008070033

Deployed Bytecode Sourcemap

47098:6867:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40010:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53109:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26744:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28257:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47474:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52357:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27774:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50768:90;;;;;;;;;;;;;:::i;:::-;;47247:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40650:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47323:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28957:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40318:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47670:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47553:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53285:158;;;:::i;:::-;;29364:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51109:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52062:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48833:312;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40840:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47439:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52166:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52861:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53451:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47407:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50870:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26455:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52535:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26186:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5273:103;;;;;;;;;;;;;:::i;:::-;;50668:88;;;;;;;;;;;;;:::i;:::-;;48193:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47509:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4625:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26913:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49168:1488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28500:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51981:69;;;;;;;;;;;;;:::i;:::-;;29620:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47722:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47606:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48443:382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47208:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51470:485;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47362:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47286:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52973:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53814:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28726:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52727:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5531:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40010:224;40112:4;40151:35;40136:50;;;:11;:50;;;;:90;;;;40190:36;40214:11;40190:23;:36::i;:::-;40136:90;40129:97;;40010:224;;;:::o;53109:79::-;4511:13;:11;:13::i;:::-;53174:6:::1;53165;;:15;;;;;;;;;;;;;;;;;;53109:79:::0;:::o;26744:100::-;26798:13;26831:5;26824:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26744:100;:::o;28257:171::-;28333:7;28353:23;28368:7;28353:14;:23::i;:::-;28396:15;:24;28412:7;28396:24;;;;;;;;;;;;;;;;;;;;;28389:31;;28257:171;;;:::o;47474:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52357:170::-;4511:13;:11;:13::i;:::-;52453:1:::1;52439:10;:15;;52431:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;52509:10;52493:13;:26;;;;52357:170:::0;:::o;27774:417::-;27855:13;27871:23;27886:7;27871:14;:23::i;:::-;27855:39;;27919:5;27913:11;;:2;:11;;;;27905:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28013:5;27997:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28022:37;28039:5;28046:12;:10;:12::i;:::-;28022:16;:37::i;:::-;27997:62;27975:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;28162:21;28171:2;28175:7;28162:8;:21::i;:::-;27844:347;27774:417;;:::o;50768:90::-;4511:13;:11;:13::i;:::-;50845:5:::1;50825:17;;:25;;;;;;;;;;;;;;;;;;50768:90::o:0;47247:32::-;;;;:::o;40650:113::-;40711:7;40738:10;:17;;;;40731:24;;40650:113;:::o;47323:32::-;;;;:::o;28957:336::-;29152:41;29171:12;:10;:12::i;:::-;29185:7;29152:18;:41::i;:::-;29144:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29257:28;29267:4;29273:2;29277:7;29257:9;:28::i;:::-;28957:336;;;:::o;40318:256::-;40415:7;40451:23;40468:5;40451:16;:23::i;:::-;40443:5;:31;40435:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40540:12;:19;40553:5;40540:19;;;;;;;;;;;;;;;:26;40560:5;40540:26;;;;;;;;;;;;40533:33;;40318:256;;;;:::o;47670:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;47553:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;53285:158::-;4511:13;:11;:13::i;:::-;53342:7:::1;53363:10;53355:24;;53387:21;53355:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53341:72;;;53432:2;53424:11;;;::::0;::::1;;53330:113;53285:158::o:0;29364:185::-;29502:39;29519:4;29525:2;29529:7;29502:39;;;;;;;;;;;;:16;:39::i;:::-;29364:185;;;:::o;51109:353::-;51169:16;51197:23;51223:17;51233:6;51223:9;:17::i;:::-;51197:43;;51251:25;51293:15;51279:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51251:58;;51325:9;51320:109;51340:15;51336:1;:19;51320:109;;;51387:30;51407:6;51415:1;51387:19;:30::i;:::-;51373:8;51382:1;51373:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;51357:3;;;;;:::i;:::-;;;;51320:109;;;;51446:8;51439:15;;;;51109:353;;;:::o;52062:96::-;4511:13;:11;:13::i;:::-;52137::::1;52130:4;:20;;;;52062:96:::0;:::o;48833:312::-;4511:13;:11;:13::i;:::-;48910:14:::1;48927:13;:11;:13::i;:::-;48910:30;;48986:9;;48968:7;:14;48959:6;:23;;;;:::i;:::-;:36;;48951:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;49043:9;49039:99;49058:7;:14;49056:1;:16;49039:99;;;49093:33;49103:7;49111:1;49103:10;;;;;;;;:::i;:::-;;;;;;;;49124:1;49115:6;:10;;;;:::i;:::-;49093:9;:33::i;:::-;49074:3;;;;;:::i;:::-;;;;49039:99;;;;48899:246;48833:312:::0;:::o;40840:233::-;40915:7;40951:30;:28;:30::i;:::-;40943:5;:38;40935:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41048:10;41059:5;41048:17;;;;;;;;:::i;:::-;;;;;;;;;;41041:24;;40840:233;;;:::o;47439:28::-;;;;;;;;;;;;;:::o;52166:183::-;4511:13;:11;:13::i;:::-;52268:1:::1;52254:10;:15;;52246:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52331:10;52309:19;:32;;;;52166:183:::0;:::o;52861:104::-;4511:13;:11;:13::i;:::-;52946:11:::1;52936:7;:21;;;;;;;;;;;;:::i;:::-;;52861:104:::0;:::o;53451:355::-;53505:17;53535:14;53552:13;:11;:13::i;:::-;53535:30;;53598:2;53588:6;53579;:15;;;;:::i;:::-;:21;53576:223;;53628:1;53616:13;;53576:223;;;53659:2;53650:6;:11;53647:152;;;53722:6;53712;53709:2;:9;;;;:::i;:::-;53708:20;;;;:::i;:::-;53697:6;53690:4;;:13;;;;:::i;:::-;53689:40;;;;:::i;:::-;53677:52;;53647:152;;;53781:6;53774:4;;:13;;;;:::i;:::-;53762:25;;53647:152;53576:223;53524:282;53451:355;;;:::o;47407:25::-;;;;;;;;;;;;;:::o;50870:231::-;4511:13;:11;:13::i;:::-;50984:9:::1;50979:115;51003:7;;:14;;50999:1;:18;50979:115;;;51066:16;51038:13;:25;51052:7;;51060:1;51052:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;51038:25;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;51019:3;;;;;:::i;:::-;;;;50979:115;;;;50870:231:::0;;;:::o;26455:222::-;26527:7;26547:13;26563:7;:16;26571:7;26563:16;;;;;;;;;;;;;;;;;;;;;26547:32;;26615:1;26598:19;;:5;:19;;;;26590:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;26664:5;26657:12;;;26455:222;;;:::o;52535:180::-;4511:13;:11;:13::i;:::-;52633:5:::1;52616:13;:22;;52608:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52694:13;52682:9;:25;;;;52535:180:::0;:::o;26186:207::-;26258:7;26303:1;26286:19;;:5;:19;;;;26278:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26369:9;:16;26379:5;26369:16;;;;;;;;;;;;;;;;26362:23;;26186:207;;;:::o;5273:103::-;4511:13;:11;:13::i;:::-;5338:30:::1;5365:1;5338:18;:30::i;:::-;5273:103::o:0;50668:88::-;4511:13;:11;:13::i;:::-;50744:4:::1;50724:17;;:24;;;;;;;;;;;;;;;;;;50668:88::o:0;48193:210::-;4511:13;:11;:13::i;:::-;47766:42:::1;48334:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48328:2;:28;;;;:::i;:::-;48310:14;:47;;;;:::i;:::-;48291:16;:66;;;;48388:7;48368:17;;:27;;;;;;;;;;;;;;;;;;48193:210:::0;;:::o;47509:37::-;;;;;;;;;;;;;:::o;4625:87::-;4671:7;4698:6;;;;;;;;;;;4691:13;;4625:87;:::o;26913:104::-;26969:13;27002:7;26995:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26913:104;:::o;49168:1488::-;49229:14;49246:13;:11;:13::i;:::-;49229:30;;49279:6;;;;;;;;;;;49278:7;49270:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;49337:2;49328:6;:11;49325:305;;;49378:1;49363:11;:16;49355:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;49433:10;:22;49444:10;49433:22;;;;;;;;;;;;;;;;;;;;;;;;;49432:23;49424:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;49519:4;49494:10;:22;49505:10;49494:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49325:305;;;49579:13;;49564:11;:28;;49556:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49325:305;49653:17;;;;;;;;;;;49650:139;;;49731:16;;47766:42;49694:21;;;49716:10;49694:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;49686:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;49650:139;49804:17;;;;;;;;;;;49801:358;;;49845:13;:25;49859:10;49845:25;;;;;;;;;;;;;;;;;;;;;;;;;49837:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;50008:19;;49993:11;49957:21;:33;49979:10;49957:33;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;:70;;49949:135;;;;;;;;;;;;:::i;:::-;;;;;;;;;50136:11;50099:21;:33;50121:10;50099:33;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;49801:358;50193:1;50179:11;:15;50171:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;50260:9;;50245:11;50236:6;:20;;;;:::i;:::-;:33;;50228:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;50350:20;50358:11;50350:7;:20::i;:::-;50337:9;:33;;50329:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;50430:7;50459;:5;:7::i;:::-;50443:30;;50481:21;50443:64;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50429:78;;;50526:2;50518:11;;;;;;50555:9;50567:1;50555:13;;50550:99;50575:11;50570:1;:16;50550:99;;50604:33;50614:10;50635:1;50626:6;:10;;;;:::i;:::-;50604:9;:33::i;:::-;50588:3;;;;;:::i;:::-;;;;50550:99;;;;49218:1438;;49168:1488;:::o;28500:155::-;28595:52;28614:12;:10;:12::i;:::-;28628:8;28638;28595:18;:52::i;:::-;28500:155;;:::o;51981:69::-;4511:13;:11;:13::i;:::-;52038:4:::1;52027:8;;:15;;;;;;;;;;;;;;;;;;51981:69::o:0;29620:323::-;29794:41;29813:12;:10;:12::i;:::-;29827:7;29794:18;:41::i;:::-;29786:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;29897:38;29911:4;29917:2;29921:7;29930:4;29897:13;:38::i;:::-;29620:323;;;;:::o;47722:87::-;47766:42;47722:87;:::o;47606:57::-;;;;;;;;;;;;;;;;;:::o;48443:382::-;4511:13;:11;:13::i;:::-;48534:14:::1;48551:13;:11;:13::i;:::-;48534:30;;48597:1;48583:11;:15;48575:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;48659:9;;48644:11;48635:6;:20;;;;:::i;:::-;:33;;48627:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48719:9;48731:1;48719:13;;48714:104;48739:11;48734:1;:16;48714:104;;48772:34;48782:11;48804:1;48795:6;:10;;;;:::i;:::-;48772:9;:34::i;:::-;48752:3;;;;;:::i;:::-;;;;48714:104;;;;48523:302;48443:382:::0;;:::o;47208:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51470:485::-;51543:13;51576:16;51584:7;51576;:16::i;:::-;51568:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51680:5;51668:17;;:8;;;;;;;;;;;:17;;;51665:70;;;51709:14;51702:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51665:70;51747:28;51778:10;:8;:10::i;:::-;51747:41;;51837:1;51812:14;51806:28;:32;:141;;;;;;;;;;;;;;;;;51878:14;51894:18;:7;:16;:18::i;:::-;51914:13;51861:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51806:141;51799:148;;;51470:485;;;;:::o;47362:38::-;;;;:::o;47286:30::-;;;;:::o;52973:128::-;4511:13;:11;:13::i;:::-;53076:17:::1;53060:13;:33;;;;;;;;;;;;:::i;:::-;;52973:128:::0;:::o;53814:148::-;53880:4;53937:16;;47766:42;53904:21;;;53926:6;53904:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;53896:58;;53814:148;;;:::o;28726:164::-;28823:4;28847:18;:25;28866:5;28847:25;;;;;;;;;;;;;;;:35;28873:8;28847:35;;;;;;;;;;;;;;;;;;;;;;;;;28840:42;;28726:164;;;;:::o;52727:126::-;4511:13;:11;:13::i;:::-;52830:15:::1;52813:14;:32;;;;;;;;;;;;:::i;:::-;;52727:126:::0;:::o;5531:201::-;4511:13;:11;:13::i;:::-;5640:1:::1;5620:22;;:8;:22;;;;5612:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5696:28;5715:8;5696:18;:28::i;:::-;5531:201:::0;:::o;25817:305::-;25919:4;25971:25;25956:40;;;:11;:40;;;;:105;;;;26028:33;26013:48;;;:11;:48;;;;25956:105;:158;;;;26078:36;26102:11;26078:23;:36::i;:::-;25956:158;25936:178;;25817:305;;;:::o;4790:132::-;4865:12;:10;:12::i;:::-;4854:23;;:7;:5;:7::i;:::-;:23;;;4846:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4790:132::o;36232:135::-;36314:16;36322:7;36314;:16::i;:::-;36306:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36232:135;:::o;3176:98::-;3229:7;3256:10;3249:17;;3176:98;:::o;35511:174::-;35613:2;35586:15;:24;35602:7;35586:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35669:7;35665:2;35631:46;;35640:23;35655:7;35640:14;:23::i;:::-;35631:46;;;;;;;;;;;;35511:174;;:::o;31744:264::-;31837:4;31854:13;31870:23;31885:7;31870:14;:23::i;:::-;31854:39;;31923:5;31912:16;;:7;:16;;;:52;;;;31932:32;31949:5;31956:7;31932:16;:32::i;:::-;31912:52;:87;;;;31992:7;31968:31;;:20;31980:7;31968:11;:20::i;:::-;:31;;;31912:87;31904:96;;;31744:264;;;;:::o;34767:625::-;34926:4;34899:31;;:23;34914:7;34899:14;:23::i;:::-;:31;;;34891:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35005:1;34991:16;;:2;:16;;;;34983:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35061:39;35082:4;35088:2;35092:7;35061:20;:39::i;:::-;35165:29;35182:1;35186:7;35165:8;:29::i;:::-;35226:1;35207:9;:15;35217:4;35207:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35255:1;35238:9;:13;35248:2;35238:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35286:2;35267:7;:16;35275:7;35267:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35325:7;35321:2;35306:27;;35315:4;35306:27;;;;;;;;;;;;35346:38;35366:4;35372:2;35376:7;35346:19;:38::i;:::-;34767:625;;;:::o;32350:110::-;32426:26;32436:2;32440:7;32426:26;;;;;;;;;;;;:9;:26::i;:::-;32350:110;;:::o;5892:191::-;5966:16;5985:6;;;;;;;;;;;5966:25;;6011:8;6002:6;;:17;;;;;;;;;;;;;;;;;;6066:8;6035:40;;6056:8;6035:40;;;;;;;;;;;;5955:128;5892:191;:::o;35828:315::-;35983:8;35974:17;;:5;:17;;;;35966:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36070:8;36032:18;:25;36051:5;36032:25;;;;;;;;;;;;;;;:35;36058:8;36032:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36116:8;36094:41;;36109:5;36094:41;;;36126:8;36094:41;;;;;;:::i;:::-;;;;;;;;35828:315;;;:::o;30824:313::-;30980:28;30990:4;30996:2;31000:7;30980:9;:28::i;:::-;31027:47;31050:4;31056:2;31060:7;31069:4;31027:22;:47::i;:::-;31019:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30824:313;;;;:::o;31450:127::-;31515:4;31567:1;31539:30;;:7;:16;31547:7;31539:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31532:37;;31450:127;;;:::o;48077:108::-;48137:13;48170:7;48163:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48077:108;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;17479:157::-;17564:4;17603:25;17588:40;;;:11;:40;;;;17581:47;;17479:157;;;:::o;41686:589::-;41830:45;41857:4;41863:2;41867:7;41830:26;:45::i;:::-;41908:1;41892:18;;:4;:18;;;41888:187;;;41927:40;41959:7;41927:31;:40::i;:::-;41888:187;;;41997:2;41989:10;;:4;:10;;;41985:90;;42016:47;42049:4;42055:7;42016:32;:47::i;:::-;41985:90;41888:187;42103:1;42089:16;;:2;:16;;;42085:183;;;42122:45;42159:7;42122:36;:45::i;:::-;42085:183;;;42195:4;42189:10;;:2;:10;;;42185:83;;42216:40;42244:2;42248:7;42216:27;:40::i;:::-;42185:83;42085:183;41686:589;;;:::o;38867:125::-;;;;:::o;32687:319::-;32816:18;32822:2;32826:7;32816:5;:18::i;:::-;32867:53;32898:1;32902:2;32906:7;32915:4;32867:22;:53::i;:::-;32845:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;32687:319;;;:::o;36931:853::-;37085:4;37106:15;:2;:13;;;:15::i;:::-;37102:675;;;37158:2;37142:36;;;37179:12;:10;:12::i;:::-;37193:4;37199:7;37208:4;37142:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37138:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37400:1;37383:6;:13;:18;37379:328;;;37426:60;;;;;;;;;;:::i;:::-;;;;;;;;37379:328;37657:6;37651:13;37642:6;37638:2;37634:15;37627:38;37138:584;37274:41;;;37264:51;;;:6;:51;;;;37257:58;;;;;37102:675;37761:4;37754:11;;36931:853;;;;;;;:::o;38356:126::-;;;;:::o;42998:164::-;43102:10;:17;;;;43075:15;:24;43091:7;43075:24;;;;;;;;;;;:44;;;;43130:10;43146:7;43130:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42998:164;:::o;43789:988::-;44055:22;44105:1;44080:22;44097:4;44080:16;:22::i;:::-;:26;;;;:::i;:::-;44055:51;;44117:18;44138:17;:26;44156:7;44138:26;;;;;;;;;;;;44117:47;;44285:14;44271:10;:28;44267:328;;44316:19;44338:12;:18;44351:4;44338:18;;;;;;;;;;;;;;;:34;44357:14;44338:34;;;;;;;;;;;;44316:56;;44422:11;44389:12;:18;44402:4;44389:18;;;;;;;;;;;;;;;:30;44408:10;44389:30;;;;;;;;;;;:44;;;;44539:10;44506:17;:30;44524:11;44506:30;;;;;;;;;;;:43;;;;44301:294;44267:328;44691:17;:26;44709:7;44691:26;;;;;;;;;;;44684:33;;;44735:12;:18;44748:4;44735:18;;;;;;;;;;;;;;;:34;44754:14;44735:34;;;;;;;;;;;44728:41;;;43870:907;;43789:988;;:::o;45072:1079::-;45325:22;45370:1;45350:10;:17;;;;:21;;;;:::i;:::-;45325:46;;45382:18;45403:15;:24;45419:7;45403:24;;;;;;;;;;;;45382:45;;45754:19;45776:10;45787:14;45776:26;;;;;;;;:::i;:::-;;;;;;;;;;45754:48;;45840:11;45815:10;45826;45815:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;45951:10;45920:15;:28;45936:11;45920:28;;;;;;;;;;;:41;;;;46092:15;:24;46108:7;46092:24;;;;;;;;;;;46085:31;;;46127:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45143:1008;;;45072:1079;:::o;42576:221::-;42661:14;42678:20;42695:2;42678:16;:20::i;:::-;42661:37;;42736:7;42709:12;:16;42722:2;42709:16;;;;;;;;;;;;;;;:24;42726:6;42709:24;;;;;;;;;;;:34;;;;42783:6;42754:17;:26;42772:7;42754:26;;;;;;;;;;;:35;;;;42650:147;42576:221;;:::o;33342:439::-;33436:1;33422:16;;:2;:16;;;;33414:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33495:16;33503:7;33495;:16::i;:::-;33494:17;33486:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33557:45;33586:1;33590:2;33594:7;33557:20;:45::i;:::-;33632:1;33615:9;:13;33625:2;33615:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33663:2;33644:7;:16;33652:7;33644:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33708:7;33704:2;33683:33;;33700:1;33683:33;;;;;;;;;;;;33729:44;33757:1;33761:2;33765:7;33729:19;:44::i;:::-;33342:439;;:::o;7323:326::-;7383:4;7640:1;7618:7;:19;;;:23;7611:30;;7323:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:370::-;2410:5;2459:3;2452:4;2444:6;2440:17;2436:27;2426:122;;2467:79;;:::i;:::-;2426:122;2584:6;2571:20;2609:94;2699:3;2691:6;2684:4;2676:6;2672:17;2609:94;:::i;:::-;2600:103;;2416:293;2339:370;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:137::-;2899:5;2937:6;2924:20;2915:29;;2953:32;2979:5;2953:32;:::i;:::-;2854:137;;;;:::o;2997:141::-;3053:5;3084:6;3078:13;3069:22;;3100:32;3126:5;3100:32;:::i;:::-;2997:141;;;;:::o;3157:338::-;3212:5;3261:3;3254:4;3246:6;3242:17;3238:27;3228:122;;3269:79;;:::i;:::-;3228:122;3386:6;3373:20;3411:78;3485:3;3477:6;3470:4;3462:6;3458:17;3411:78;:::i;:::-;3402:87;;3218:277;3157:338;;;;:::o;3515:340::-;3571:5;3620:3;3613:4;3605:6;3601:17;3597:27;3587:122;;3628:79;;:::i;:::-;3587:122;3745:6;3732:20;3770:79;3845:3;3837:6;3830:4;3822:6;3818:17;3770:79;:::i;:::-;3761:88;;3577:278;3515:340;;;;:::o;3861:139::-;3907:5;3945:6;3932:20;3923:29;;3961:33;3988:5;3961:33;:::i;:::-;3861:139;;;;:::o;4006:143::-;4063:5;4094:6;4088:13;4079:22;;4110:33;4137:5;4110:33;:::i;:::-;4006:143;;;;:::o;4155:139::-;4210:5;4241:6;4235:13;4226:22;;4257:31;4282:5;4257:31;:::i;:::-;4155:139;;;;:::o;4300:329::-;4359:6;4408:2;4396:9;4387:7;4383:23;4379:32;4376:119;;;4414:79;;:::i;:::-;4376:119;4534:1;4559:53;4604:7;4595:6;4584:9;4580:22;4559:53;:::i;:::-;4549:63;;4505:117;4300:329;;;;:::o;4635:474::-;4703:6;4711;4760:2;4748:9;4739:7;4735:23;4731:32;4728:119;;;4766:79;;:::i;:::-;4728:119;4886:1;4911:53;4956:7;4947:6;4936:9;4932:22;4911:53;:::i;:::-;4901:63;;4857:117;5013:2;5039:53;5084:7;5075:6;5064:9;5060:22;5039:53;:::i;:::-;5029:63;;4984:118;4635:474;;;;;:::o;5115:619::-;5192:6;5200;5208;5257:2;5245:9;5236:7;5232:23;5228:32;5225:119;;;5263:79;;:::i;:::-;5225:119;5383:1;5408:53;5453:7;5444:6;5433:9;5429:22;5408:53;:::i;:::-;5398:63;;5354:117;5510:2;5536:53;5581:7;5572:6;5561:9;5557:22;5536:53;:::i;:::-;5526:63;;5481:118;5638:2;5664:53;5709:7;5700:6;5689:9;5685:22;5664:53;:::i;:::-;5654:63;;5609:118;5115:619;;;;;:::o;5740:943::-;5835:6;5843;5851;5859;5908:3;5896:9;5887:7;5883:23;5879:33;5876:120;;;5915:79;;:::i;:::-;5876:120;6035:1;6060:53;6105:7;6096:6;6085:9;6081:22;6060:53;:::i;:::-;6050:63;;6006:117;6162:2;6188:53;6233:7;6224:6;6213:9;6209:22;6188:53;:::i;:::-;6178:63;;6133:118;6290:2;6316:53;6361:7;6352:6;6341:9;6337:22;6316:53;:::i;:::-;6306:63;;6261:118;6446:2;6435:9;6431:18;6418:32;6477:18;6469:6;6466:30;6463:117;;;6499:79;;:::i;:::-;6463:117;6604:62;6658:7;6649:6;6638:9;6634:22;6604:62;:::i;:::-;6594:72;;6389:287;5740:943;;;;;;;:::o;6689:468::-;6754:6;6762;6811:2;6799:9;6790:7;6786:23;6782:32;6779:119;;;6817:79;;:::i;:::-;6779:119;6937:1;6962:53;7007:7;6998:6;6987:9;6983:22;6962:53;:::i;:::-;6952:63;;6908:117;7064:2;7090:50;7132:7;7123:6;7112:9;7108:22;7090:50;:::i;:::-;7080:60;;7035:115;6689:468;;;;;:::o;7163:474::-;7231:6;7239;7288:2;7276:9;7267:7;7263:23;7259:32;7256:119;;;7294:79;;:::i;:::-;7256:119;7414:1;7439:53;7484:7;7475:6;7464:9;7460:22;7439:53;:::i;:::-;7429:63;;7385:117;7541:2;7567:53;7612:7;7603:6;7592:9;7588:22;7567:53;:::i;:::-;7557:63;;7512:118;7163:474;;;;;:::o;7643:698::-;7735:6;7743;7751;7800:2;7788:9;7779:7;7775:23;7771:32;7768:119;;;7806:79;;:::i;:::-;7768:119;7954:1;7943:9;7939:17;7926:31;7984:18;7976:6;7973:30;7970:117;;;8006:79;;:::i;:::-;7970:117;8119:80;8191:7;8182:6;8171:9;8167:22;8119:80;:::i;:::-;8101:98;;;;7897:312;8248:2;8274:50;8316:7;8307:6;8296:9;8292:22;8274:50;:::i;:::-;8264:60;;8219:115;7643:698;;;;;:::o;8347:539::-;8431:6;8480:2;8468:9;8459:7;8455:23;8451:32;8448:119;;;8486:79;;:::i;:::-;8448:119;8634:1;8623:9;8619:17;8606:31;8664:18;8656:6;8653:30;8650:117;;;8686:79;;:::i;:::-;8650:117;8791:78;8861:7;8852:6;8841:9;8837:22;8791:78;:::i;:::-;8781:88;;8577:302;8347:539;;;;:::o;8892:323::-;8948:6;8997:2;8985:9;8976:7;8972:23;8968:32;8965:119;;;9003:79;;:::i;:::-;8965:119;9123:1;9148:50;9190:7;9181:6;9170:9;9166:22;9148:50;:::i;:::-;9138:60;;9094:114;8892:323;;;;:::o;9221:468::-;9286:6;9294;9343:2;9331:9;9322:7;9318:23;9314:32;9311:119;;;9349:79;;:::i;:::-;9311:119;9469:1;9494:50;9536:7;9527:6;9516:9;9512:22;9494:50;:::i;:::-;9484:60;;9440:114;9593:2;9619:53;9664:7;9655:6;9644:9;9640:22;9619:53;:::i;:::-;9609:63;;9564:118;9221:468;;;;;:::o;9695:327::-;9753:6;9802:2;9790:9;9781:7;9777:23;9773:32;9770:119;;;9808:79;;:::i;:::-;9770:119;9928:1;9953:52;9997:7;9988:6;9977:9;9973:22;9953:52;:::i;:::-;9943:62;;9899:116;9695:327;;;;:::o;10028:349::-;10097:6;10146:2;10134:9;10125:7;10121:23;10117:32;10114:119;;;10152:79;;:::i;:::-;10114:119;10272:1;10297:63;10352:7;10343:6;10332:9;10328:22;10297:63;:::i;:::-;10287:73;;10243:127;10028:349;;;;:::o;10383:509::-;10452:6;10501:2;10489:9;10480:7;10476:23;10472:32;10469:119;;;10507:79;;:::i;:::-;10469:119;10655:1;10644:9;10640:17;10627:31;10685:18;10677:6;10674:30;10671:117;;;10707:79;;:::i;:::-;10671:117;10812:63;10867:7;10858:6;10847:9;10843:22;10812:63;:::i;:::-;10802:73;;10598:287;10383:509;;;;:::o;10898:329::-;10957:6;11006:2;10994:9;10985:7;10981:23;10977:32;10974:119;;;11012:79;;:::i;:::-;10974:119;11132:1;11157:53;11202:7;11193:6;11182:9;11178:22;11157:53;:::i;:::-;11147:63;;11103:117;10898:329;;;;:::o;11233:351::-;11303:6;11352:2;11340:9;11331:7;11327:23;11323:32;11320:119;;;11358:79;;:::i;:::-;11320:119;11478:1;11503:64;11559:7;11550:6;11539:9;11535:22;11503:64;:::i;:::-;11493:74;;11449:128;11233:351;;;;:::o;11590:474::-;11658:6;11666;11715:2;11703:9;11694:7;11690:23;11686:32;11683:119;;;11721:79;;:::i;:::-;11683:119;11841:1;11866:53;11911:7;11902:6;11891:9;11887:22;11866:53;:::i;:::-;11856:63;;11812:117;11968:2;11994:53;12039:7;12030:6;12019:9;12015:22;11994:53;:::i;:::-;11984:63;;11939:118;11590:474;;;;;:::o;12070:347::-;12138:6;12187:2;12175:9;12166:7;12162:23;12158:32;12155:119;;;12193:79;;:::i;:::-;12155:119;12313:1;12338:62;12392:7;12383:6;12372:9;12368:22;12338:62;:::i;:::-;12328:72;;12284:126;12070:347;;;;:::o;12423:179::-;12492:10;12513:46;12555:3;12547:6;12513:46;:::i;:::-;12591:4;12586:3;12582:14;12568:28;;12423:179;;;;:::o;12608:118::-;12695:24;12713:5;12695:24;:::i;:::-;12690:3;12683:37;12608:118;;:::o;12762:732::-;12881:3;12910:54;12958:5;12910:54;:::i;:::-;12980:86;13059:6;13054:3;12980:86;:::i;:::-;12973:93;;13090:56;13140:5;13090:56;:::i;:::-;13169:7;13200:1;13185:284;13210:6;13207:1;13204:13;13185:284;;;13286:6;13280:13;13313:63;13372:3;13357:13;13313:63;:::i;:::-;13306:70;;13399:60;13452:6;13399:60;:::i;:::-;13389:70;;13245:224;13232:1;13229;13225:9;13220:14;;13185:284;;;13189:14;13485:3;13478:10;;12886:608;;;12762:732;;;;:::o;13500:109::-;13581:21;13596:5;13581:21;:::i;:::-;13576:3;13569:34;13500:109;;:::o;13615:360::-;13701:3;13729:38;13761:5;13729:38;:::i;:::-;13783:70;13846:6;13841:3;13783:70;:::i;:::-;13776:77;;13862:52;13907:6;13902:3;13895:4;13888:5;13884:16;13862:52;:::i;:::-;13939:29;13961:6;13939:29;:::i;:::-;13934:3;13930:39;13923:46;;13705:270;13615:360;;;;:::o;13981:161::-;14083:52;14129:5;14083:52;:::i;:::-;14078:3;14071:65;13981:161;;:::o;14148:364::-;14236:3;14264:39;14297:5;14264:39;:::i;:::-;14319:71;14383:6;14378:3;14319:71;:::i;:::-;14312:78;;14399:52;14444:6;14439:3;14432:4;14425:5;14421:16;14399:52;:::i;:::-;14476:29;14498:6;14476:29;:::i;:::-;14471:3;14467:39;14460:46;;14240:272;14148:364;;;;:::o;14518:377::-;14624:3;14652:39;14685:5;14652:39;:::i;:::-;14707:89;14789:6;14784:3;14707:89;:::i;:::-;14700:96;;14805:52;14850:6;14845:3;14838:4;14831:5;14827:16;14805:52;:::i;:::-;14882:6;14877:3;14873:16;14866:23;;14628:267;14518:377;;;;:::o;14925:845::-;15028:3;15065:5;15059:12;15094:36;15120:9;15094:36;:::i;:::-;15146:89;15228:6;15223:3;15146:89;:::i;:::-;15139:96;;15266:1;15255:9;15251:17;15282:1;15277:137;;;;15428:1;15423:341;;;;15244:520;;15277:137;15361:4;15357:9;15346;15342:25;15337:3;15330:38;15397:6;15392:3;15388:16;15381:23;;15277:137;;15423:341;15490:38;15522:5;15490:38;:::i;:::-;15550:1;15564:154;15578:6;15575:1;15572:13;15564:154;;;15652:7;15646:14;15642:1;15637:3;15633:11;15626:35;15702:1;15693:7;15689:15;15678:26;;15600:4;15597:1;15593:12;15588:17;;15564:154;;;15747:6;15742:3;15738:16;15731:23;;15430:334;;15244:520;;15032:738;;14925:845;;;;:::o;15776:366::-;15918:3;15939:67;16003:2;15998:3;15939:67;:::i;:::-;15932:74;;16015:93;16104:3;16015:93;:::i;:::-;16133:2;16128:3;16124:12;16117:19;;15776:366;;;:::o;16148:::-;16290:3;16311:67;16375:2;16370:3;16311:67;:::i;:::-;16304:74;;16387:93;16476:3;16387:93;:::i;:::-;16505:2;16500:3;16496:12;16489:19;;16148:366;;;:::o;16520:::-;16662:3;16683:67;16747:2;16742:3;16683:67;:::i;:::-;16676:74;;16759:93;16848:3;16759:93;:::i;:::-;16877:2;16872:3;16868:12;16861:19;;16520:366;;;:::o;16892:::-;17034:3;17055:67;17119:2;17114:3;17055:67;:::i;:::-;17048:74;;17131:93;17220:3;17131:93;:::i;:::-;17249:2;17244:3;17240:12;17233:19;;16892:366;;;:::o;17264:::-;17406:3;17427:67;17491:2;17486:3;17427:67;:::i;:::-;17420:74;;17503:93;17592:3;17503:93;:::i;:::-;17621:2;17616:3;17612:12;17605:19;;17264:366;;;:::o;17636:::-;17778:3;17799:67;17863:2;17858:3;17799:67;:::i;:::-;17792:74;;17875:93;17964:3;17875:93;:::i;:::-;17993:2;17988:3;17984:12;17977:19;;17636:366;;;:::o;18008:::-;18150:3;18171:67;18235:2;18230:3;18171:67;:::i;:::-;18164:74;;18247:93;18336:3;18247:93;:::i;:::-;18365:2;18360:3;18356:12;18349:19;;18008:366;;;:::o;18380:::-;18522:3;18543:67;18607:2;18602:3;18543:67;:::i;:::-;18536:74;;18619:93;18708:3;18619:93;:::i;:::-;18737:2;18732:3;18728:12;18721:19;;18380:366;;;:::o;18752:::-;18894:3;18915:67;18979:2;18974:3;18915:67;:::i;:::-;18908:74;;18991:93;19080:3;18991:93;:::i;:::-;19109:2;19104:3;19100:12;19093:19;;18752:366;;;:::o;19124:::-;19266:3;19287:67;19351:2;19346:3;19287:67;:::i;:::-;19280:74;;19363:93;19452:3;19363:93;:::i;:::-;19481:2;19476:3;19472:12;19465:19;;19124:366;;;:::o;19496:::-;19638:3;19659:67;19723:2;19718:3;19659:67;:::i;:::-;19652:74;;19735:93;19824:3;19735:93;:::i;:::-;19853:2;19848:3;19844:12;19837:19;;19496:366;;;:::o;19868:::-;20010:3;20031:67;20095:2;20090:3;20031:67;:::i;:::-;20024:74;;20107:93;20196:3;20107:93;:::i;:::-;20225:2;20220:3;20216:12;20209:19;;19868:366;;;:::o;20240:::-;20382:3;20403:67;20467:2;20462:3;20403:67;:::i;:::-;20396:74;;20479:93;20568:3;20479:93;:::i;:::-;20597:2;20592:3;20588:12;20581:19;;20240:366;;;:::o;20612:::-;20754:3;20775:67;20839:2;20834:3;20775:67;:::i;:::-;20768:74;;20851:93;20940:3;20851:93;:::i;:::-;20969:2;20964:3;20960:12;20953:19;;20612:366;;;:::o;20984:::-;21126:3;21147:67;21211:2;21206:3;21147:67;:::i;:::-;21140:74;;21223:93;21312:3;21223:93;:::i;:::-;21341:2;21336:3;21332:12;21325:19;;20984:366;;;:::o;21356:::-;21498:3;21519:67;21583:2;21578:3;21519:67;:::i;:::-;21512:74;;21595:93;21684:3;21595:93;:::i;:::-;21713:2;21708:3;21704:12;21697:19;;21356:366;;;:::o;21728:::-;21870:3;21891:67;21955:2;21950:3;21891:67;:::i;:::-;21884:74;;21967:93;22056:3;21967:93;:::i;:::-;22085:2;22080:3;22076:12;22069:19;;21728:366;;;:::o;22100:::-;22242:3;22263:67;22327:2;22322:3;22263:67;:::i;:::-;22256:74;;22339:93;22428:3;22339:93;:::i;:::-;22457:2;22452:3;22448:12;22441:19;;22100:366;;;:::o;22472:::-;22614:3;22635:67;22699:2;22694:3;22635:67;:::i;:::-;22628:74;;22711:93;22800:3;22711:93;:::i;:::-;22829:2;22824:3;22820:12;22813:19;;22472:366;;;:::o;22844:::-;22986:3;23007:67;23071:2;23066:3;23007:67;:::i;:::-;23000:74;;23083:93;23172:3;23083:93;:::i;:::-;23201:2;23196:3;23192:12;23185:19;;22844:366;;;:::o;23216:::-;23358:3;23379:67;23443:2;23438:3;23379:67;:::i;:::-;23372:74;;23455:93;23544:3;23455:93;:::i;:::-;23573:2;23568:3;23564:12;23557:19;;23216:366;;;:::o;23588:::-;23730:3;23751:67;23815:2;23810:3;23751:67;:::i;:::-;23744:74;;23827:93;23916:3;23827:93;:::i;:::-;23945:2;23940:3;23936:12;23929:19;;23588:366;;;:::o;23960:::-;24102:3;24123:67;24187:2;24182:3;24123:67;:::i;:::-;24116:74;;24199:93;24288:3;24199:93;:::i;:::-;24317:2;24312:3;24308:12;24301:19;;23960:366;;;:::o;24332:::-;24474:3;24495:67;24559:2;24554:3;24495:67;:::i;:::-;24488:74;;24571:93;24660:3;24571:93;:::i;:::-;24689:2;24684:3;24680:12;24673:19;;24332:366;;;:::o;24704:::-;24846:3;24867:67;24931:2;24926:3;24867:67;:::i;:::-;24860:74;;24943:93;25032:3;24943:93;:::i;:::-;25061:2;25056:3;25052:12;25045:19;;24704:366;;;:::o;25076:::-;25218:3;25239:67;25303:2;25298:3;25239:67;:::i;:::-;25232:74;;25315:93;25404:3;25315:93;:::i;:::-;25433:2;25428:3;25424:12;25417:19;;25076:366;;;:::o;25448:::-;25590:3;25611:67;25675:2;25670:3;25611:67;:::i;:::-;25604:74;;25687:93;25776:3;25687:93;:::i;:::-;25805:2;25800:3;25796:12;25789:19;;25448:366;;;:::o;25820:398::-;25979:3;26000:83;26081:1;26076:3;26000:83;:::i;:::-;25993:90;;26092:93;26181:3;26092:93;:::i;:::-;26210:1;26205:3;26201:11;26194:18;;25820:398;;;:::o;26224:366::-;26366:3;26387:67;26451:2;26446:3;26387:67;:::i;:::-;26380:74;;26463:93;26552:3;26463:93;:::i;:::-;26581:2;26576:3;26572:12;26565:19;;26224:366;;;:::o;26596:::-;26738:3;26759:67;26823:2;26818:3;26759:67;:::i;:::-;26752:74;;26835:93;26924:3;26835:93;:::i;:::-;26953:2;26948:3;26944:12;26937:19;;26596:366;;;:::o;26968:::-;27110:3;27131:67;27195:2;27190:3;27131:67;:::i;:::-;27124:74;;27207:93;27296:3;27207:93;:::i;:::-;27325:2;27320:3;27316:12;27309:19;;26968:366;;;:::o;27340:::-;27482:3;27503:67;27567:2;27562:3;27503:67;:::i;:::-;27496:74;;27579:93;27668:3;27579:93;:::i;:::-;27697:2;27692:3;27688:12;27681:19;;27340:366;;;:::o;27712:108::-;27789:24;27807:5;27789:24;:::i;:::-;27784:3;27777:37;27712:108;;:::o;27826:118::-;27913:24;27931:5;27913:24;:::i;:::-;27908:3;27901:37;27826:118;;:::o;27950:589::-;28175:3;28197:95;28288:3;28279:6;28197:95;:::i;:::-;28190:102;;28309:95;28400:3;28391:6;28309:95;:::i;:::-;28302:102;;28421:92;28509:3;28500:6;28421:92;:::i;:::-;28414:99;;28530:3;28523:10;;27950:589;;;;;;:::o;28545:379::-;28729:3;28751:147;28894:3;28751:147;:::i;:::-;28744:154;;28915:3;28908:10;;28545:379;;;:::o;28930:222::-;29023:4;29061:2;29050:9;29046:18;29038:26;;29074:71;29142:1;29131:9;29127:17;29118:6;29074:71;:::i;:::-;28930:222;;;;:::o;29158:640::-;29353:4;29391:3;29380:9;29376:19;29368:27;;29405:71;29473:1;29462:9;29458:17;29449:6;29405:71;:::i;:::-;29486:72;29554:2;29543:9;29539:18;29530:6;29486:72;:::i;:::-;29568;29636:2;29625:9;29621:18;29612:6;29568:72;:::i;:::-;29687:9;29681:4;29677:20;29672:2;29661:9;29657:18;29650:48;29715:76;29786:4;29777:6;29715:76;:::i;:::-;29707:84;;29158:640;;;;;;;:::o;29804:373::-;29947:4;29985:2;29974:9;29970:18;29962:26;;30034:9;30028:4;30024:20;30020:1;30009:9;30005:17;29998:47;30062:108;30165:4;30156:6;30062:108;:::i;:::-;30054:116;;29804:373;;;;:::o;30183:210::-;30270:4;30308:2;30297:9;30293:18;30285:26;;30321:65;30383:1;30372:9;30368:17;30359:6;30321:65;:::i;:::-;30183:210;;;;:::o;30399:252::-;30507:4;30545:2;30534:9;30530:18;30522:26;;30558:86;30641:1;30630:9;30626:17;30617:6;30558:86;:::i;:::-;30399:252;;;;:::o;30657:313::-;30770:4;30808:2;30797:9;30793:18;30785:26;;30857:9;30851:4;30847:20;30843:1;30832:9;30828:17;30821:47;30885:78;30958:4;30949:6;30885:78;:::i;:::-;30877:86;;30657:313;;;;:::o;30976:419::-;31142:4;31180:2;31169:9;31165:18;31157:26;;31229:9;31223:4;31219:20;31215:1;31204:9;31200:17;31193:47;31257:131;31383:4;31257:131;:::i;:::-;31249:139;;30976:419;;;:::o;31401:::-;31567:4;31605:2;31594:9;31590:18;31582:26;;31654:9;31648:4;31644:20;31640:1;31629:9;31625:17;31618:47;31682:131;31808:4;31682:131;:::i;:::-;31674:139;;31401:419;;;:::o;31826:::-;31992:4;32030:2;32019:9;32015:18;32007:26;;32079:9;32073:4;32069:20;32065:1;32054:9;32050:17;32043:47;32107:131;32233:4;32107:131;:::i;:::-;32099:139;;31826:419;;;:::o;32251:::-;32417:4;32455:2;32444:9;32440:18;32432:26;;32504:9;32498:4;32494:20;32490:1;32479:9;32475:17;32468:47;32532:131;32658:4;32532:131;:::i;:::-;32524:139;;32251:419;;;:::o;32676:::-;32842:4;32880:2;32869:9;32865:18;32857:26;;32929:9;32923:4;32919:20;32915:1;32904:9;32900:17;32893:47;32957:131;33083:4;32957:131;:::i;:::-;32949:139;;32676:419;;;:::o;33101:::-;33267:4;33305:2;33294:9;33290:18;33282:26;;33354:9;33348:4;33344:20;33340:1;33329:9;33325:17;33318:47;33382:131;33508:4;33382:131;:::i;:::-;33374:139;;33101:419;;;:::o;33526:::-;33692:4;33730:2;33719:9;33715:18;33707:26;;33779:9;33773:4;33769:20;33765:1;33754:9;33750:17;33743:47;33807:131;33933:4;33807:131;:::i;:::-;33799:139;;33526:419;;;:::o;33951:::-;34117:4;34155:2;34144:9;34140:18;34132:26;;34204:9;34198:4;34194:20;34190:1;34179:9;34175:17;34168:47;34232:131;34358:4;34232:131;:::i;:::-;34224:139;;33951:419;;;:::o;34376:::-;34542:4;34580:2;34569:9;34565:18;34557:26;;34629:9;34623:4;34619:20;34615:1;34604:9;34600:17;34593:47;34657:131;34783:4;34657:131;:::i;:::-;34649:139;;34376:419;;;:::o;34801:::-;34967:4;35005:2;34994:9;34990:18;34982:26;;35054:9;35048:4;35044:20;35040:1;35029:9;35025:17;35018:47;35082:131;35208:4;35082:131;:::i;:::-;35074:139;;34801:419;;;:::o;35226:::-;35392:4;35430:2;35419:9;35415:18;35407:26;;35479:9;35473:4;35469:20;35465:1;35454:9;35450:17;35443:47;35507:131;35633:4;35507:131;:::i;:::-;35499:139;;35226:419;;;:::o;35651:::-;35817:4;35855:2;35844:9;35840:18;35832:26;;35904:9;35898:4;35894:20;35890:1;35879:9;35875:17;35868:47;35932:131;36058:4;35932:131;:::i;:::-;35924:139;;35651:419;;;:::o;36076:::-;36242:4;36280:2;36269:9;36265:18;36257:26;;36329:9;36323:4;36319:20;36315:1;36304:9;36300:17;36293:47;36357:131;36483:4;36357:131;:::i;:::-;36349:139;;36076:419;;;:::o;36501:::-;36667:4;36705:2;36694:9;36690:18;36682:26;;36754:9;36748:4;36744:20;36740:1;36729:9;36725:17;36718:47;36782:131;36908:4;36782:131;:::i;:::-;36774:139;;36501:419;;;:::o;36926:::-;37092:4;37130:2;37119:9;37115:18;37107:26;;37179:9;37173:4;37169:20;37165:1;37154:9;37150:17;37143:47;37207:131;37333:4;37207:131;:::i;:::-;37199:139;;36926:419;;;:::o;37351:::-;37517:4;37555:2;37544:9;37540:18;37532:26;;37604:9;37598:4;37594:20;37590:1;37579:9;37575:17;37568:47;37632:131;37758:4;37632:131;:::i;:::-;37624:139;;37351:419;;;:::o;37776:::-;37942:4;37980:2;37969:9;37965:18;37957:26;;38029:9;38023:4;38019:20;38015:1;38004:9;38000:17;37993:47;38057:131;38183:4;38057:131;:::i;:::-;38049:139;;37776:419;;;:::o;38201:::-;38367:4;38405:2;38394:9;38390:18;38382:26;;38454:9;38448:4;38444:20;38440:1;38429:9;38425:17;38418:47;38482:131;38608:4;38482:131;:::i;:::-;38474:139;;38201:419;;;:::o;38626:::-;38792:4;38830:2;38819:9;38815:18;38807:26;;38879:9;38873:4;38869:20;38865:1;38854:9;38850:17;38843:47;38907:131;39033:4;38907:131;:::i;:::-;38899:139;;38626:419;;;:::o;39051:::-;39217:4;39255:2;39244:9;39240:18;39232:26;;39304:9;39298:4;39294:20;39290:1;39279:9;39275:17;39268:47;39332:131;39458:4;39332:131;:::i;:::-;39324:139;;39051:419;;;:::o;39476:::-;39642:4;39680:2;39669:9;39665:18;39657:26;;39729:9;39723:4;39719:20;39715:1;39704:9;39700:17;39693:47;39757:131;39883:4;39757:131;:::i;:::-;39749:139;;39476:419;;;:::o;39901:::-;40067:4;40105:2;40094:9;40090:18;40082:26;;40154:9;40148:4;40144:20;40140:1;40129:9;40125:17;40118:47;40182:131;40308:4;40182:131;:::i;:::-;40174:139;;39901:419;;;:::o;40326:::-;40492:4;40530:2;40519:9;40515:18;40507:26;;40579:9;40573:4;40569:20;40565:1;40554:9;40550:17;40543:47;40607:131;40733:4;40607:131;:::i;:::-;40599:139;;40326:419;;;:::o;40751:::-;40917:4;40955:2;40944:9;40940:18;40932:26;;41004:9;40998:4;40994:20;40990:1;40979:9;40975:17;40968:47;41032:131;41158:4;41032:131;:::i;:::-;41024:139;;40751:419;;;:::o;41176:::-;41342:4;41380:2;41369:9;41365:18;41357:26;;41429:9;41423:4;41419:20;41415:1;41404:9;41400:17;41393:47;41457:131;41583:4;41457:131;:::i;:::-;41449:139;;41176:419;;;:::o;41601:::-;41767:4;41805:2;41794:9;41790:18;41782:26;;41854:9;41848:4;41844:20;41840:1;41829:9;41825:17;41818:47;41882:131;42008:4;41882:131;:::i;:::-;41874:139;;41601:419;;;:::o;42026:::-;42192:4;42230:2;42219:9;42215:18;42207:26;;42279:9;42273:4;42269:20;42265:1;42254:9;42250:17;42243:47;42307:131;42433:4;42307:131;:::i;:::-;42299:139;;42026:419;;;:::o;42451:::-;42617:4;42655:2;42644:9;42640:18;42632:26;;42704:9;42698:4;42694:20;42690:1;42679:9;42675:17;42668:47;42732:131;42858:4;42732:131;:::i;:::-;42724:139;;42451:419;;;:::o;42876:::-;43042:4;43080:2;43069:9;43065:18;43057:26;;43129:9;43123:4;43119:20;43115:1;43104:9;43100:17;43093:47;43157:131;43283:4;43157:131;:::i;:::-;43149:139;;42876:419;;;:::o;43301:::-;43467:4;43505:2;43494:9;43490:18;43482:26;;43554:9;43548:4;43544:20;43540:1;43529:9;43525:17;43518:47;43582:131;43708:4;43582:131;:::i;:::-;43574:139;;43301:419;;;:::o;43726:::-;43892:4;43930:2;43919:9;43915:18;43907:26;;43979:9;43973:4;43969:20;43965:1;43954:9;43950:17;43943:47;44007:131;44133:4;44007:131;:::i;:::-;43999:139;;43726:419;;;:::o;44151:222::-;44244:4;44282:2;44271:9;44267:18;44259:26;;44295:71;44363:1;44352:9;44348:17;44339:6;44295:71;:::i;:::-;44151:222;;;;:::o;44379:129::-;44413:6;44440:20;;:::i;:::-;44430:30;;44469:33;44497:4;44489:6;44469:33;:::i;:::-;44379:129;;;:::o;44514:75::-;44547:6;44580:2;44574:9;44564:19;;44514:75;:::o;44595:311::-;44672:4;44762:18;44754:6;44751:30;44748:56;;;44784:18;;:::i;:::-;44748:56;44834:4;44826:6;44822:17;44814:25;;44894:4;44888;44884:15;44876:23;;44595:311;;;:::o;44912:307::-;44973:4;45063:18;45055:6;45052:30;45049:56;;;45085:18;;:::i;:::-;45049:56;45123:29;45145:6;45123:29;:::i;:::-;45115:37;;45207:4;45201;45197:15;45189:23;;44912:307;;;:::o;45225:308::-;45287:4;45377:18;45369:6;45366:30;45363:56;;;45399:18;;:::i;:::-;45363:56;45437:29;45459:6;45437:29;:::i;:::-;45429:37;;45521:4;45515;45511:15;45503:23;;45225:308;;;:::o;45539:132::-;45606:4;45629:3;45621:11;;45659:4;45654:3;45650:14;45642:22;;45539:132;;;:::o;45677:141::-;45726:4;45749:3;45741:11;;45772:3;45769:1;45762:14;45806:4;45803:1;45793:18;45785:26;;45677:141;;;:::o;45824:114::-;45891:6;45925:5;45919:12;45909:22;;45824:114;;;:::o;45944:98::-;45995:6;46029:5;46023:12;46013:22;;45944:98;;;:::o;46048:99::-;46100:6;46134:5;46128:12;46118:22;;46048:99;;;:::o;46153:113::-;46223:4;46255;46250:3;46246:14;46238:22;;46153:113;;;:::o;46272:184::-;46371:11;46405:6;46400:3;46393:19;46445:4;46440:3;46436:14;46421:29;;46272:184;;;;:::o;46462:168::-;46545:11;46579:6;46574:3;46567:19;46619:4;46614:3;46610:14;46595:29;;46462:168;;;;:::o;46636:147::-;46737:11;46774:3;46759:18;;46636:147;;;;:::o;46789:169::-;46873:11;46907:6;46902:3;46895:19;46947:4;46942:3;46938:14;46923:29;;46789:169;;;;:::o;46964:148::-;47066:11;47103:3;47088:18;;46964:148;;;;:::o;47118:305::-;47158:3;47177:20;47195:1;47177:20;:::i;:::-;47172:25;;47211:20;47229:1;47211:20;:::i;:::-;47206:25;;47365:1;47297:66;47293:74;47290:1;47287:81;47284:107;;;47371:18;;:::i;:::-;47284:107;47415:1;47412;47408:9;47401:16;;47118:305;;;;:::o;47429:185::-;47469:1;47486:20;47504:1;47486:20;:::i;:::-;47481:25;;47520:20;47538:1;47520:20;:::i;:::-;47515:25;;47559:1;47549:35;;47564:18;;:::i;:::-;47549:35;47606:1;47603;47599:9;47594:14;;47429:185;;;;:::o;47620:848::-;47681:5;47688:4;47712:6;47703:15;;47736:5;47727:14;;47750:712;47771:1;47761:8;47758:15;47750:712;;;47866:4;47861:3;47857:14;47851:4;47848:24;47845:50;;;47875:18;;:::i;:::-;47845:50;47925:1;47915:8;47911:16;47908:451;;;48340:4;48333:5;48329:16;48320:25;;47908:451;48390:4;48384;48380:15;48372:23;;48420:32;48443:8;48420:32;:::i;:::-;48408:44;;47750:712;;;47620:848;;;;;;;:::o;48474:281::-;48532:5;48556:23;48574:4;48556:23;:::i;:::-;48548:31;;48600:25;48616:8;48600:25;:::i;:::-;48588:37;;48644:104;48681:66;48671:8;48665:4;48644:104;:::i;:::-;48635:113;;48474:281;;;;:::o;48761:1073::-;48815:5;49006:8;48996:40;;49027:1;49018:10;;49029:5;;48996:40;49055:4;49045:36;;49072:1;49063:10;;49074:5;;49045:36;49141:4;49189:1;49184:27;;;;49225:1;49220:191;;;;49134:277;;49184:27;49202:1;49193:10;;49204:5;;;49220:191;49265:3;49255:8;49252:17;49249:43;;;49272:18;;:::i;:::-;49249:43;49321:8;49318:1;49314:16;49305:25;;49356:3;49349:5;49346:14;49343:40;;;49363:18;;:::i;:::-;49343:40;49396:5;;;49134:277;;49520:2;49510:8;49507:16;49501:3;49495:4;49492:13;49488:36;49470:2;49460:8;49457:16;49452:2;49446:4;49443:12;49439:35;49423:111;49420:246;;;49576:8;49570:4;49566:19;49557:28;;49611:3;49604:5;49601:14;49598:40;;;49618:18;;:::i;:::-;49598:40;49651:5;;49420:246;49691:42;49729:3;49719:8;49713:4;49710:1;49691:42;:::i;:::-;49676:57;;;;49765:4;49760:3;49756:14;49749:5;49746:25;49743:51;;;49774:18;;:::i;:::-;49743:51;49823:4;49816:5;49812:16;49803:25;;48761:1073;;;;;;:::o;49840:348::-;49880:7;49903:20;49921:1;49903:20;:::i;:::-;49898:25;;49937:20;49955:1;49937:20;:::i;:::-;49932:25;;50125:1;50057:66;50053:74;50050:1;50047:81;50042:1;50035:9;50028:17;50024:105;50021:131;;;50132:18;;:::i;:::-;50021:131;50180:1;50177;50173:9;50162:20;;49840:348;;;;:::o;50194:191::-;50234:4;50254:20;50272:1;50254:20;:::i;:::-;50249:25;;50288:20;50306:1;50288:20;:::i;:::-;50283:25;;50327:1;50324;50321:8;50318:34;;;50332:18;;:::i;:::-;50318:34;50377:1;50374;50370:9;50362:17;;50194:191;;;;:::o;50391:96::-;50428:7;50457:24;50475:5;50457:24;:::i;:::-;50446:35;;50391:96;;;:::o;50493:90::-;50527:7;50570:5;50563:13;50556:21;50545:32;;50493:90;;;:::o;50589:149::-;50625:7;50665:66;50658:5;50654:78;50643:89;;50589:149;;;:::o;50744:126::-;50781:7;50821:42;50814:5;50810:54;50799:65;;50744:126;;;:::o;50876:77::-;50913:7;50942:5;50931:16;;50876:77;;;:::o;50959:86::-;50994:7;51034:4;51027:5;51023:16;51012:27;;50959:86;;;:::o;51051:141::-;51116:9;51149:37;51180:5;51149:37;:::i;:::-;51136:50;;51051:141;;;:::o;51198:126::-;51248:9;51281:37;51312:5;51281:37;:::i;:::-;51268:50;;51198:126;;;:::o;51330:113::-;51380:9;51413:24;51431:5;51413:24;:::i;:::-;51400:37;;51330:113;;;:::o;51449:154::-;51533:6;51528:3;51523;51510:30;51595:1;51586:6;51581:3;51577:16;51570:27;51449:154;;;:::o;51609:307::-;51677:1;51687:113;51701:6;51698:1;51695:13;51687:113;;;51786:1;51781:3;51777:11;51771:18;51767:1;51762:3;51758:11;51751:39;51723:2;51720:1;51716:10;51711:15;;51687:113;;;51818:6;51815:1;51812:13;51809:101;;;51898:1;51889:6;51884:3;51880:16;51873:27;51809:101;51658:258;51609:307;;;:::o;51922:320::-;51966:6;52003:1;51997:4;51993:12;51983:22;;52050:1;52044:4;52040:12;52071:18;52061:81;;52127:4;52119:6;52115:17;52105:27;;52061:81;52189:2;52181:6;52178:14;52158:18;52155:38;52152:84;;;52208:18;;:::i;:::-;52152:84;51973:269;51922:320;;;:::o;52248:281::-;52331:27;52353:4;52331:27;:::i;:::-;52323:6;52319:40;52461:6;52449:10;52446:22;52425:18;52413:10;52410:34;52407:62;52404:88;;;52472:18;;:::i;:::-;52404:88;52512:10;52508:2;52501:22;52291:238;52248:281;;:::o;52535:233::-;52574:3;52597:24;52615:5;52597:24;:::i;:::-;52588:33;;52643:66;52636:5;52633:77;52630:103;;;52713:18;;:::i;:::-;52630:103;52760:1;52753:5;52749:13;52742:20;;52535:233;;;:::o;52774:176::-;52806:1;52823:20;52841:1;52823:20;:::i;:::-;52818:25;;52857:20;52875:1;52857:20;:::i;:::-;52852:25;;52896:1;52886:35;;52901:18;;:::i;:::-;52886:35;52942:1;52939;52935:9;52930:14;;52774:176;;;;:::o;52956:180::-;53004:77;53001:1;52994:88;53101:4;53098:1;53091:15;53125:4;53122:1;53115:15;53142:180;53190:77;53187:1;53180:88;53287:4;53284:1;53277:15;53311:4;53308:1;53301:15;53328:180;53376:77;53373:1;53366:88;53473:4;53470:1;53463:15;53497:4;53494:1;53487:15;53514:180;53562:77;53559:1;53552:88;53659:4;53656:1;53649:15;53683:4;53680:1;53673:15;53700:180;53748:77;53745:1;53738:88;53845:4;53842:1;53835:15;53869:4;53866:1;53859:15;53886:180;53934:77;53931:1;53924:88;54031:4;54028:1;54021:15;54055:4;54052:1;54045:15;54072:117;54181:1;54178;54171:12;54195:117;54304:1;54301;54294:12;54318:117;54427:1;54424;54417:12;54441:117;54550:1;54547;54540:12;54564:117;54673:1;54670;54663:12;54687:117;54796:1;54793;54786:12;54810:102;54851:6;54902:2;54898:7;54893:2;54886:5;54882:14;54878:28;54868:38;;54810:102;;;:::o;54918:::-;54960:8;55007:5;55004:1;55000:13;54979:34;;54918:102;;;:::o;55026:172::-;55166:24;55162:1;55154:6;55150:14;55143:48;55026:172;:::o;55204:169::-;55344:21;55340:1;55332:6;55328:14;55321:45;55204:169;:::o;55379:175::-;55519:27;55515:1;55507:6;55503:14;55496:51;55379:175;:::o;55560:230::-;55700:34;55696:1;55688:6;55684:14;55677:58;55769:13;55764:2;55756:6;55752:15;55745:38;55560:230;:::o;55796:237::-;55936:34;55932:1;55924:6;55920:14;55913:58;56005:20;56000:2;55992:6;55988:15;55981:45;55796:237;:::o;56039:246::-;56179:34;56175:1;56167:6;56163:14;56156:58;56248:29;56243:2;56235:6;56231:15;56224:54;56039:246;:::o;56291:225::-;56431:34;56427:1;56419:6;56415:14;56408:58;56500:8;56495:2;56487:6;56483:15;56476:33;56291:225;:::o;56522:224::-;56662:34;56658:1;56650:6;56646:14;56639:58;56731:7;56726:2;56718:6;56714:15;56707:32;56522:224;:::o;56752:178::-;56892:30;56888:1;56880:6;56876:14;56869:54;56752:178;:::o;56936:223::-;57076:34;57072:1;57064:6;57060:14;57053:58;57145:6;57140:2;57132:6;57128:15;57121:31;56936:223;:::o;57165:175::-;57305:27;57301:1;57293:6;57289:14;57282:51;57165:175;:::o;57346:239::-;57486:34;57482:1;57474:6;57470:14;57463:58;57555:22;57550:2;57542:6;57538:15;57531:47;57346:239;:::o;57591:171::-;57731:23;57727:1;57719:6;57715:14;57708:47;57591:171;:::o;57768:168::-;57908:20;57904:1;57896:6;57892:14;57885:44;57768:168;:::o;57942:173::-;58082:25;58078:1;58070:6;58066:14;58059:49;57942:173;:::o;58121:228::-;58261:34;58257:1;58249:6;58245:14;58238:58;58330:11;58325:2;58317:6;58313:15;58306:36;58121:228;:::o;58355:230::-;58495:34;58491:1;58483:6;58479:14;58472:58;58564:13;58559:2;58551:6;58547:15;58540:38;58355:230;:::o;58591:174::-;58731:26;58727:1;58719:6;58715:14;58708:50;58591:174;:::o;58771:178::-;58911:30;58907:1;58899:6;58895:14;58888:54;58771:178;:::o;58955:249::-;59095:34;59091:1;59083:6;59079:14;59072:58;59164:32;59159:2;59151:6;59147:15;59140:57;58955:249;:::o;59210:182::-;59350:34;59346:1;59338:6;59334:14;59327:58;59210:182;:::o;59398:::-;59538:34;59534:1;59526:6;59522:14;59515:58;59398:182;:::o;59586:234::-;59726:34;59722:1;59714:6;59710:14;59703:58;59795:17;59790:2;59782:6;59778:15;59771:42;59586:234;:::o;59826:174::-;59966:26;59962:1;59954:6;59950:14;59943:50;59826:174;:::o;60006:220::-;60146:34;60142:1;60134:6;60130:14;60123:58;60215:3;60210:2;60202:6;60198:15;60191:28;60006:220;:::o;60232:::-;60372:34;60368:1;60360:6;60356:14;60349:58;60441:3;60436:2;60428:6;60424:15;60417:28;60232:220;:::o;60458:178::-;60598:30;60594:1;60586:6;60582:14;60575:54;60458:178;:::o;60642:114::-;;:::o;60762:231::-;60902:34;60898:1;60890:6;60886:14;60879:58;60971:14;60966:2;60958:6;60954:15;60947:39;60762:231;:::o;60999:163::-;61139:15;61135:1;61127:6;61123:14;61116:39;60999:163;:::o;61168:233::-;61308:34;61304:1;61296:6;61292:14;61285:58;61377:16;61372:2;61364:6;61360:15;61353:41;61168:233;:::o;61407:175::-;61547:27;61543:1;61535:6;61531:14;61524:51;61407:175;:::o;61588:122::-;61661:24;61679:5;61661:24;:::i;:::-;61654:5;61651:35;61641:63;;61700:1;61697;61690:12;61641:63;61588:122;:::o;61716:116::-;61786:21;61801:5;61786:21;:::i;:::-;61779:5;61776:32;61766:60;;61822:1;61819;61812:12;61766:60;61716:116;:::o;61838:120::-;61910:23;61927:5;61910:23;:::i;:::-;61903:5;61900:34;61890:62;;61948:1;61945;61938:12;61890:62;61838:120;:::o;61964:122::-;62037:24;62055:5;62037:24;:::i;:::-;62030:5;62027:35;62017:63;;62076:1;62073;62066:12;62017:63;61964:122;:::o;62092:118::-;62163:22;62179:5;62163:22;:::i;:::-;62156:5;62153:33;62143:61;;62200:1;62197;62190:12;62143:61;62092:118;:::o

Swarm Source

ipfs://2b89851ce161803291b86be31484b13be876178b73f2f7611ef16a49e573e52f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.