ETH Price: $2,476.20 (+7.45%)

Token

friesDAO NFT (FRIESDAONFT)
 

Overview

Max Total Supply

385 FRIESDAONFT

Holders

193

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FRIESDAONFT
0xcaca8e72c9ba1e2624d18b8e2bbbf4261201b0ae
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Welcome to the home of friesDAO NFT on OpenSea. Discover the best items in this collection.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
FriesDAONFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.9.2 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]


// 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/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


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

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// 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/utils/[email protected]


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// 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/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// 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/[email protected]


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// 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/[email protected]


// 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 @openzeppelin/contracts/access/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// File @openzeppelin/contracts/token/ERC20/[email protected]


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

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens 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 amount
    ) 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, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}


// File @openzeppelin/contracts/utils/cryptography/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File contracts/nft-721.sol

// SPDX-License-Identifier: Apache-2.0

/*

  /$$$$$$          /$$                     /$$$$$$$   /$$$$$$   /$$$$$$ 
 /$$__  $$        |__/                    | $$__  $$ /$$__  $$ /$$__  $$
| $$  \__//$$$$$$  /$$  /$$$$$$   /$$$$$$$| $$  \ $$| $$  \ $$| $$  \ $$
| $$$$   /$$__  $$| $$ /$$__  $$ /$$_____/| $$  | $$| $$$$$$$$| $$  | $$
| $$_/  | $$  \__/| $$| $$$$$$$$|  $$$$$$ | $$  | $$| $$__  $$| $$  | $$
| $$    | $$      | $$| $$_____/ \____  $$| $$  | $$| $$  | $$| $$  | $$
| $$    | $$      | $$|  $$$$$$$ /$$$$$$$/| $$$$$$$/| $$  | $$|  $$$$$$/
|__/    |__/      |__/ \_______/|_______/ |_______/ |__/  |__/ \______/ 

*/

pragma solidity ^0.8.7;
contract FriesDAONFT is ERC721Enumerable, Ownable {

    // Token ID 0-199: founders
    // Token ID 200-549: genesis
    // Token ID 550-999: limited
    // Token ID 1000-7968: standard
    // Mint limit array: [founders, genesis, limited]

    string public baseURI = "https://api.fries.fund/nft/";

    ERC20Burnable public KETCHUP;
    address public treasury;
    bytes32 public merkleRoot;
    mapping(address => mapping(uint256 => uint256)) public minted;

	uint256 public foundersIndex = 1;
    uint256 public foundersEnd = 200;

    uint256 public genesisIndex = 201;
    uint256 public genesisEnd = 550;
    uint256 public genesisPriceETH = 0.03 ether;

    uint256 public limitedIndex = 551;
    uint256 public limitedEnd = 1000;
    uint256 public limitedPriceETH = 0.06 ether;

    uint256 public standardIndex = 1001;
    uint256 public standardEnd = 7969;
    uint256 public standardPriceKETCHUP = 100000 * 10 ** 18;

    constructor(address treasuryAddress, address ketchup, bytes32 root) ERC721("friesDAO NFT", "FRIESDAONFT") {
        treasury = treasuryAddress;
        KETCHUP = ERC20Burnable(ketchup);
        merkleRoot = root;
    }

    modifier verifyProof(uint256 tokenType, uint256[3] calldata limits, bytes32[] calldata proof) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, limits));
        require(MerkleProof.verify(proof, merkleRoot, leaf), "invalid whitelist parameters");
        require(minted[msg.sender][tokenType] < limits[tokenType], "mint over limit");
        minted[msg.sender][tokenType] ++;
        _;
    }

    /*
     * ------------------
     * EXTERNAL FUNCTIONS
     * ------------------
     */
    

	function mintFounders(uint256[3] calldata limits, bytes32[] calldata proof) external payable verifyProof(0, limits, proof) {
        require(foundersIndex <= foundersEnd, "no more available to mint");
        _safeMint(msg.sender, foundersIndex);
        foundersIndex ++;
    }

    function mintGenesis(uint256[3] calldata limits, bytes32[] calldata proof) external payable verifyProof(1, limits, proof) {
        require(genesisIndex <= genesisEnd, "no more available to mint");
        require(msg.value >= genesisPriceETH, "insufficient payment");
        (bool success,) = treasury.call{value: msg.value}("");
        require(success, "transfer failed");
        _safeMint(msg.sender, genesisIndex);
        genesisIndex ++;
    }

    function mintLimited(uint256[3] calldata limits, bytes32[] calldata proof) external payable verifyProof(2, limits, proof) {
        require(limitedIndex <= limitedEnd, "no more available to mint");
        require(msg.value >= limitedPriceETH, "insufficient payment");
        (bool success,) = treasury.call{value: msg.value}("");
        require(success, "transfer failed");
        _safeMint(msg.sender, limitedIndex);
        limitedIndex ++;
    }

    function mintStandard(uint256 amount) external payable {
        require(standardIndex + amount - 1 <= standardEnd, "no more available to mint");
		uint256 startStandardIndex = standardIndex;

		KETCHUP.burnFrom(msg.sender, standardPriceKETCHUP * amount);
		standardIndex = startStandardIndex + amount;

		for (uint256 i = 0; i < amount; i++) {
			_safeMint(msg.sender, startStandardIndex + i);
		}
    }

    /*
     * --------------------
     * RESTRICTED FUNCTIONS
     * --------------------
     */

    function setBaseURI(string memory metadataURI) external onlyOwner {
        baseURI = metadataURI;
    }

    function setTreasury(address treasuryAddress) external {
        require(msg.sender == treasury, "caller is not the treasury");
        treasury = treasuryAddress;
    }

    function setMerkleRoot(bytes32 root) external onlyOwner {
        merkleRoot = root;
    }

    /*
     * ------------------
     * INTERNAL FUNCTIONS
     * ------------------
     */

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

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"treasuryAddress","type":"address"},{"internalType":"address","name":"ketchup","type":"address"},{"internalType":"bytes32","name":"root","type":"bytes32"}],"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":[],"name":"KETCHUP","outputs":[{"internalType":"contract ERC20Burnable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundersEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisPriceETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitedEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitedPriceETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"limits","type":"uint256[3]"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintFounders","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"limits","type":"uint256[3]"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintGenesis","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"limits","type":"uint256[3]"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintLimited","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintStandard","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadataURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasuryAddress","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"standardEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardPriceKETCHUP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280601b81526020017f68747470733a2f2f6170692e66726965732e66756e642f6e66742f0000000000815250600b908051906020019062000051929190620002f6565b50600160105560c860115560c9601255610226601355666a94d74f4300006014556102276015556103e860165566d529ae9e8600006017556103e9601855611f2160195569152d02c7e14af6800000601a55348015620000b057600080fd5b5060405162005357380380620053578339818101604052810190620000d69190620003d4565b6040518060400160405280600c81526020017f667269657344414f204e465400000000000000000000000000000000000000008152506040518060400160405280600b81526020017f465249455344414f4e465400000000000000000000000000000000000000000081525081600090805190602001906200015a929190620002f6565b50806001908051906020019062000173929190620002f6565b505050620001966200018a6200022860201b60201c565b6200023060201b60201c565b82600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e819055505050506200050c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000304906200046e565b90600052602060002090601f01602090048101928262000328576000855562000374565b82601f106200034357805160ff191683800117855562000374565b8280016001018555821562000374579182015b828111156200037357825182559160200191906001019062000356565b5b50905062000383919062000387565b5090565b5b80821115620003a257600081600090555060010162000388565b5090565b600081519050620003b781620004d8565b92915050565b600081519050620003ce81620004f2565b92915050565b600080600060608486031215620003f057620003ef620004d3565b5b60006200040086828701620003a6565b93505060206200041386828701620003a6565b92505060406200042686828701620003bd565b9150509250925092565b60006200043d826200044e565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200048757607f821691505b602082108114156200049e576200049d620004a4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620004e38162000430565b8114620004ef57600080fd5b50565b620004fd8162000444565b81146200050957600080fd5b50565b614e3b806200051c6000396000f3fe6080604052600436106102515760003560e01c806370a0823111610139578063a9abc96e116100b6578063c87b56dd1161007a578063c87b56dd14610891578063d4f83ab7146108ce578063e985e9c5146108f9578063ed5b620714610936578063f0f4426014610952578063f2fde38b1461097b57610251565b8063a9abc96e146107aa578063ad68b20b146107d5578063af63b4fd14610800578063b76568081461082b578063b88d4fde1461086857610251565b80638da5cb5b116100fd5780638da5cb5b146106f357806395d89b411461071e578063a22cb46514610749578063a614f3ea14610772578063a80487571461078e57610251565b806370a0823114610620578063714a6eef1461065d578063715018a6146106885780637cb647591461069f57806387463cc5146106c857610251565b80633201451c116101d257806355f804b31161019657806355f804b31461051d5780635a872bac1461054657806361d027b31461057157806362dc96931461059c5780636352211e146105b85780636c0360eb146105f557610251565b80633201451c1461043657806342842e0e14610461578063439514da1461048a5780634f6ccce7146104b55780635454f5f0146104f257610251565b806318160ddd1161021957806318160ddd1461034f57806323b872dd1461037a5780632c804275146103a35780632eb4a7ab146103ce5780632f745c59146103f957610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806315080c7f14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613899565b6109a4565b60405161028a9190613ede565b60405180910390f35b34801561029f57600080fd5b506102a8610a1e565b6040516102b59190613f2f565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e0919061393c565b610ab0565b6040516102f29190613e4e565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d91906137cc565b610b35565b005b34801561033057600080fd5b50610339610c4d565b6040516103469190614251565b60405180910390f35b34801561035b57600080fd5b50610364610c53565b6040516103719190614251565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c91906136b6565b610c60565b005b3480156103af57600080fd5b506103b8610cc0565b6040516103c59190614251565b60405180910390f35b3480156103da57600080fd5b506103e3610cc6565b6040516103f09190613ef9565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b91906137cc565b610ccc565b60405161042d9190614251565b60405180910390f35b34801561044257600080fd5b5061044b610d71565b6040516104589190614251565b60405180910390f35b34801561046d57600080fd5b50610488600480360381019061048391906136b6565b610d77565b005b34801561049657600080fd5b5061049f610d97565b6040516104ac9190614251565b60405180910390f35b3480156104c157600080fd5b506104dc60048036038101906104d7919061393c565b610d9d565b6040516104e99190614251565b60405180910390f35b3480156104fe57600080fd5b50610507610e0e565b6040516105149190614251565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906138f3565b610e14565b005b34801561055257600080fd5b5061055b610eaa565b6040516105689190613f14565b60405180910390f35b34801561057d57600080fd5b50610586610ed0565b6040516105939190613e4e565b60405180910390f35b6105b660048036038101906105b1919061380c565b610ef6565b005b3480156105c457600080fd5b506105df60048036038101906105da919061393c565b61124d565b6040516105ec9190613e4e565b60405180910390f35b34801561060157600080fd5b5061060a6112ff565b6040516106179190613f2f565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190613649565b61138d565b6040516106549190614251565b60405180910390f35b34801561066957600080fd5b50610672611445565b60405161067f9190614251565b60405180910390f35b34801561069457600080fd5b5061069d61144b565b005b3480156106ab57600080fd5b506106c660048036038101906106c1919061386c565b6114d3565b005b3480156106d457600080fd5b506106dd611559565b6040516106ea9190614251565b60405180910390f35b3480156106ff57600080fd5b5061070861155f565b6040516107159190613e4e565b60405180910390f35b34801561072a57600080fd5b50610733611589565b6040516107409190613f2f565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b919061378c565b61161b565b005b61078c6004803603810190610787919061380c565b611631565b005b6107a860048036038101906107a3919061380c565b611874565b005b3480156107b657600080fd5b506107bf611bcb565b6040516107cc9190614251565b60405180910390f35b3480156107e157600080fd5b506107ea611bd1565b6040516107f79190614251565b60405180910390f35b34801561080c57600080fd5b50610815611bd7565b6040516108229190614251565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d91906137cc565b611bdd565b60405161085f9190614251565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190613709565b611c02565b005b34801561089d57600080fd5b506108b860048036038101906108b3919061393c565b611c64565b6040516108c59190613f2f565b60405180910390f35b3480156108da57600080fd5b506108e3611d0b565b6040516108f09190614251565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190613676565b611d11565b60405161092d9190613ede565b60405180910390f35b610950600480360381019061094b919061393c565b611da5565b005b34801561095e57600080fd5b5061097960048036038101906109749190613649565b611ef0565b005b34801561098757600080fd5b506109a2600480360381019061099d9190613649565b611fc4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a175750610a16826120bc565b5b9050919050565b606060008054610a2d9061454c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a599061454c565b8015610aa65780601f10610a7b57610100808354040283529160200191610aa6565b820191906000526020600020905b815481529060010190602001808311610a8957829003601f168201915b5050505050905090565b6000610abb8261219e565b610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190614131565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b408261124d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba8906141b1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd061220a565b73ffffffffffffffffffffffffffffffffffffffff161480610bff5750610bfe81610bf961220a565b611d11565b5b610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906140b1565b60405180910390fd5b610c488383612212565b505050565b60145481565b6000600880549050905090565b610c71610c6b61220a565b826122cb565b610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca7906141f1565b60405180910390fd5b610cbb8383836123a9565b505050565b60195481565b600e5481565b6000610cd78361138d565b8210610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90613f91565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b610d9283838360405180602001604052806000815250611c02565b505050565b60105481565b6000610da7610c53565b8210610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90614211565b60405180910390fd5b60088281548110610dfc57610dfb614709565b5b90600052602060002001549050919050565b60125481565b610e1c61220a565b73ffffffffffffffffffffffffffffffffffffffff16610e3a61155f565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790614151565b60405180910390fd5b80600b9080519060200190610ea69291906133d0565b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600183838360003384604051602001610f10929190613de9565b604051602081830303815290604052805190602001209050610f76838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612610565b610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac90613f51565b60405180910390fd5b838560038110610fc857610fc7614709565b5b6020020135600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020541061105e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611055906141d1565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008154809291906110bf906145af565b9190505550601354601254111561110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290613f71565b60405180910390fd5b601454341015611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790614051565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161119890613e39565b60006040518083038185875af1925050503d80600081146111d5576040519150601f19603f3d011682016040523d82523d6000602084013e6111da565b606091505b505090508061121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590614231565b60405180910390fd5b61122a33601254612627565b6012600081548092919061123d906145af565b9190505550505050505050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed906140f1565b60405180910390fd5b80915050919050565b600b805461130c9061454c565b80601f01602080910402602001604051908101604052809291908181526020018280546113389061454c565b80156113855780601f1061135a57610100808354040283529160200191611385565b820191906000526020600020905b81548152906001019060200180831161136857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f5906140d1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60175481565b61145361220a565b73ffffffffffffffffffffffffffffffffffffffff1661147161155f565b73ffffffffffffffffffffffffffffffffffffffff16146114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be90614151565b60405180910390fd5b6114d16000612645565b565b6114db61220a565b73ffffffffffffffffffffffffffffffffffffffff166114f961155f565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690614151565b60405180910390fd5b80600e8190555050565b60185481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115989061454c565b80601f01602080910402602001604051908101604052809291908181526020018280546115c49061454c565b80156116115780601f106115e657610100808354040283529160200191611611565b820191906000526020600020905b8154815290600101906020018083116115f457829003601f168201915b5050505050905090565b61162d61162661220a565b838361270b565b5050565b60008383836000338460405160200161164b929190613de9565b6040516020818303038152906040528051906020012090506116b1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612610565b6116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790613f51565b60405180910390fd5b83856003811061170357611702614709565b5b6020020135600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205410611799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611790906141d1565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008154809291906117fa906145af565b91905055506011546010541115611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90613f71565b60405180910390fd5b61185233601054612627565b60106000815480929190611865906145af565b91905055505050505050505050565b60028383836000338460405160200161188e929190613de9565b6040516020818303038152906040528051906020012090506118f4838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612610565b611933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192a90613f51565b60405180910390fd5b83856003811061194657611945614709565b5b6020020135600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002054106119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d3906141d1565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206000815480929190611a3d906145af565b91905055506016546015541115611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090613f71565b60405180910390fd5b601754341015611ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac590614051565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611b1690613e39565b60006040518083038185875af1925050503d8060008114611b53576040519150601f19603f3d011682016040523d82523d6000602084013e611b58565b606091505b5050905080611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390614231565b60405180910390fd5b611ba833601554612627565b60156000815480929190611bbb906145af565b9190505550505050505050505050565b60135481565b60155481565b60165481565b600f602052816000526040600020602052806000526040600020600091509150505481565b611c13611c0d61220a565b836122cb565b611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c49906141f1565b60405180910390fd5b611c5e84848484612878565b50505050565b6060611c6f8261219e565b611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca590614171565b60405180910390fd5b6000611cb86128d4565b90506000815111611cd85760405180602001604052806000815250611d03565b80611ce284612966565b604051602001611cf3929190613e15565b6040516020818303038152906040525b915050919050565b601a5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601954600182601854611db89190614341565b611dc29190614422565b1115611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa90613f71565b60405180910390fd5b60006018549050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc67903384601a54611e5791906143c8565b6040518363ffffffff1660e01b8152600401611e74929190613eb5565b600060405180830381600087803b158015611e8e57600080fd5b505af1158015611ea2573d6000803e3d6000fd5b505050508181611eb29190614341565b60188190555060005b82811015611eeb57611ed8338284611ed39190614341565b612627565b8080611ee3906145af565b915050611ebb565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790614191565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611fcc61220a565b73ffffffffffffffffffffffffffffffffffffffff16611fea61155f565b73ffffffffffffffffffffffffffffffffffffffff1614612040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203790614151565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a790613fd1565b60405180910390fd5b6120b981612645565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061218757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612197575061219682612ac7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122858361124d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122d68261219e565b612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c90614091565b60405180910390fd5b60006123208361124d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238f57508373ffffffffffffffffffffffffffffffffffffffff1661237784610ab0565b73ffffffffffffffffffffffffffffffffffffffff16145b806123a0575061239f8185611d11565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123c98261124d565b73ffffffffffffffffffffffffffffffffffffffff161461241f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241690613ff1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690614031565b60405180910390fd5b61249a838383612b31565b6124a5600082612212565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f59190614422565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254c9190614341565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461260b838383612c45565b505050565b60008261261d8584612c4a565b1490509392505050565b612641828260405180602001604052806000815250612cbf565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561277a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277190614071565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161286b9190613ede565b60405180910390a3505050565b6128838484846123a9565b61288f84848484612d1a565b6128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c590613fb1565b60405180910390fd5b50505050565b6060600b80546128e39061454c565b80601f016020809104026020016040519081016040528092919081815260200182805461290f9061454c565b801561295c5780601f106129315761010080835404028352916020019161295c565b820191906000526020600020905b81548152906001019060200180831161293f57829003601f168201915b5050505050905090565b606060008214156129ae576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ac2565b600082905060005b600082146129e05780806129c9906145af565b915050600a826129d99190614397565b91506129b6565b60008167ffffffffffffffff8111156129fc576129fb614738565b5b6040519080825280601f01601f191660200182016040528015612a2e5781602001600182028036833780820191505090505b5090505b60008514612abb57600182612a479190614422565b9150600a85612a56919061461c565b6030612a629190614341565b60f81b818381518110612a7857612a77614709565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ab49190614397565b9450612a32565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b3c838383612eb1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7f57612b7a81612eb6565b612bbe565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bbd57612bbc8382612eff565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c0157612bfc8161306c565b612c40565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3f57612c3e828261313d565b5b5b505050565b505050565b60008082905060005b8451811015612cb4576000858281518110612c7157612c70614709565b5b60200260200101519050808311612c9357612c8c83826131bc565b9250612ca0565b612c9d81846131bc565b92505b508080612cac906145af565b915050612c53565b508091505092915050565b612cc983836131d3565b612cd66000848484612d1a565b612d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0c90613fb1565b60405180910390fd5b505050565b6000612d3b8473ffffffffffffffffffffffffffffffffffffffff166133ad565b15612ea4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d6461220a565b8786866040518563ffffffff1660e01b8152600401612d869493929190613e69565b602060405180830381600087803b158015612da057600080fd5b505af1925050508015612dd157506040513d601f19601f82011682018060405250810190612dce91906138c6565b60015b612e54573d8060008114612e01576040519150601f19603f3d011682016040523d82523d6000602084013e612e06565b606091505b50600081511415612e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4390613fb1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ea9565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f0c8461138d565b612f169190614422565b9050600060076000848152602001908152602001600020549050818114612ffb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130809190614422565b90506000600960008481526020019081526020016000205490506000600883815481106130b0576130af614709565b5b9060005260206000200154905080600883815481106130d2576130d1614709565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613121576131206146da565b5b6001900381819060005260206000200160009055905550505050565b60006131488361138d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323a90614111565b60405180910390fd5b61324c8161219e565b1561328c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328390614011565b60405180910390fd5b61329860008383612b31565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132e89190614341565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133a960008383612c45565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546133dc9061454c565b90600052602060002090601f0160209004810192826133fe5760008555613445565b82601f1061341757805160ff1916838001178555613445565b82800160010185558215613445579182015b82811115613444578251825591602001919060010190613429565b5b5090506134529190613456565b5090565b5b8082111561346f576000816000905550600101613457565b5090565b600061348661348184614291565b61426c565b9050828152602081018484840111156134a2576134a1614776565b5b6134ad84828561450a565b509392505050565b60006134c86134c3846142c2565b61426c565b9050828152602081018484840111156134e4576134e3614776565b5b6134ef84828561450a565b509392505050565b60008135905061350681614d92565b92915050565b60008083601f8401126135225761352161476c565b5b8235905067ffffffffffffffff81111561353f5761353e614767565b5b60208301915083602082028301111561355b5761355a614771565b5b9250929050565b60008190508260206003028201111561357e5761357d614771565b5b92915050565b60008135905061359381614da9565b92915050565b6000813590506135a881614dc0565b92915050565b6000813590506135bd81614dd7565b92915050565b6000815190506135d281614dd7565b92915050565b600082601f8301126135ed576135ec61476c565b5b81356135fd848260208601613473565b91505092915050565b600082601f83011261361b5761361a61476c565b5b813561362b8482602086016134b5565b91505092915050565b60008135905061364381614dee565b92915050565b60006020828403121561365f5761365e614780565b5b600061366d848285016134f7565b91505092915050565b6000806040838503121561368d5761368c614780565b5b600061369b858286016134f7565b92505060206136ac858286016134f7565b9150509250929050565b6000806000606084860312156136cf576136ce614780565b5b60006136dd868287016134f7565b93505060206136ee868287016134f7565b92505060406136ff86828701613634565b9150509250925092565b6000806000806080858703121561372357613722614780565b5b6000613731878288016134f7565b9450506020613742878288016134f7565b935050604061375387828801613634565b925050606085013567ffffffffffffffff8111156137745761377361477b565b5b613780878288016135d8565b91505092959194509250565b600080604083850312156137a3576137a2614780565b5b60006137b1858286016134f7565b92505060206137c285828601613584565b9150509250929050565b600080604083850312156137e3576137e2614780565b5b60006137f1858286016134f7565b925050602061380285828601613634565b9150509250929050565b60008060006080848603121561382557613824614780565b5b600061383386828701613562565b935050606084013567ffffffffffffffff8111156138545761385361477b565b5b6138608682870161350c565b92509250509250925092565b60006020828403121561388257613881614780565b5b600061389084828501613599565b91505092915050565b6000602082840312156138af576138ae614780565b5b60006138bd848285016135ae565b91505092915050565b6000602082840312156138dc576138db614780565b5b60006138ea848285016135c3565b91505092915050565b60006020828403121561390957613908614780565b5b600082013567ffffffffffffffff8111156139275761392661477b565b5b61393384828501613606565b91505092915050565b60006020828403121561395257613951614780565b5b600061396084828501613634565b91505092915050565b61397281614456565b82525050565b61398961398482614456565b6145f8565b82525050565b61399b6060838361450a565b5050565b6139a881614468565b82525050565b6139b781614474565b82525050565b60006139c8826142f3565b6139d28185614309565b93506139e2818560208601614519565b6139eb81614785565b840191505092915050565b6139ff816144d4565b82525050565b6000613a10826142fe565b613a1a8185614325565b9350613a2a818560208601614519565b613a3381614785565b840191505092915050565b6000613a49826142fe565b613a538185614336565b9350613a63818560208601614519565b80840191505092915050565b6000613a7c601c83614325565b9150613a87826147a3565b602082019050919050565b6000613a9f601983614325565b9150613aaa826147cc565b602082019050919050565b6000613ac2602b83614325565b9150613acd826147f5565b604082019050919050565b6000613ae5603283614325565b9150613af082614844565b604082019050919050565b6000613b08602683614325565b9150613b1382614893565b604082019050919050565b6000613b2b602583614325565b9150613b36826148e2565b604082019050919050565b6000613b4e601c83614325565b9150613b5982614931565b602082019050919050565b6000613b71602483614325565b9150613b7c8261495a565b604082019050919050565b6000613b94601483614325565b9150613b9f826149a9565b602082019050919050565b6000613bb7601983614325565b9150613bc2826149d2565b602082019050919050565b6000613bda602c83614325565b9150613be5826149fb565b604082019050919050565b6000613bfd603883614325565b9150613c0882614a4a565b604082019050919050565b6000613c20602a83614325565b9150613c2b82614a99565b604082019050919050565b6000613c43602983614325565b9150613c4e82614ae8565b604082019050919050565b6000613c66602083614325565b9150613c7182614b37565b602082019050919050565b6000613c89602c83614325565b9150613c9482614b60565b604082019050919050565b6000613cac602083614325565b9150613cb782614baf565b602082019050919050565b6000613ccf602f83614325565b9150613cda82614bd8565b604082019050919050565b6000613cf2601a83614325565b9150613cfd82614c27565b602082019050919050565b6000613d15602183614325565b9150613d2082614c50565b604082019050919050565b6000613d38600f83614325565b9150613d4382614c9f565b602082019050919050565b6000613d5b60008361431a565b9150613d6682614cc8565b600082019050919050565b6000613d7e603183614325565b9150613d8982614ccb565b604082019050919050565b6000613da1602c83614325565b9150613dac82614d1a565b604082019050919050565b6000613dc4600f83614325565b9150613dcf82614d69565b602082019050919050565b613de3816144ca565b82525050565b6000613df58285613978565b601482019150613e05828461398f565b6060820191508190509392505050565b6000613e218285613a3e565b9150613e2d8284613a3e565b91508190509392505050565b6000613e4482613d4e565b9150819050919050565b6000602082019050613e636000830184613969565b92915050565b6000608082019050613e7e6000830187613969565b613e8b6020830186613969565b613e986040830185613dda565b8181036060830152613eaa81846139bd565b905095945050505050565b6000604082019050613eca6000830185613969565b613ed76020830184613dda565b9392505050565b6000602082019050613ef3600083018461399f565b92915050565b6000602082019050613f0e60008301846139ae565b92915050565b6000602082019050613f2960008301846139f6565b92915050565b60006020820190508181036000830152613f498184613a05565b905092915050565b60006020820190508181036000830152613f6a81613a6f565b9050919050565b60006020820190508181036000830152613f8a81613a92565b9050919050565b60006020820190508181036000830152613faa81613ab5565b9050919050565b60006020820190508181036000830152613fca81613ad8565b9050919050565b60006020820190508181036000830152613fea81613afb565b9050919050565b6000602082019050818103600083015261400a81613b1e565b9050919050565b6000602082019050818103600083015261402a81613b41565b9050919050565b6000602082019050818103600083015261404a81613b64565b9050919050565b6000602082019050818103600083015261406a81613b87565b9050919050565b6000602082019050818103600083015261408a81613baa565b9050919050565b600060208201905081810360008301526140aa81613bcd565b9050919050565b600060208201905081810360008301526140ca81613bf0565b9050919050565b600060208201905081810360008301526140ea81613c13565b9050919050565b6000602082019050818103600083015261410a81613c36565b9050919050565b6000602082019050818103600083015261412a81613c59565b9050919050565b6000602082019050818103600083015261414a81613c7c565b9050919050565b6000602082019050818103600083015261416a81613c9f565b9050919050565b6000602082019050818103600083015261418a81613cc2565b9050919050565b600060208201905081810360008301526141aa81613ce5565b9050919050565b600060208201905081810360008301526141ca81613d08565b9050919050565b600060208201905081810360008301526141ea81613d2b565b9050919050565b6000602082019050818103600083015261420a81613d71565b9050919050565b6000602082019050818103600083015261422a81613d94565b9050919050565b6000602082019050818103600083015261424a81613db7565b9050919050565b60006020820190506142666000830184613dda565b92915050565b6000614276614287565b9050614282828261457e565b919050565b6000604051905090565b600067ffffffffffffffff8211156142ac576142ab614738565b5b6142b582614785565b9050602081019050919050565b600067ffffffffffffffff8211156142dd576142dc614738565b5b6142e682614785565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061434c826144ca565b9150614357836144ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561438c5761438b61464d565b5b828201905092915050565b60006143a2826144ca565b91506143ad836144ca565b9250826143bd576143bc61467c565b5b828204905092915050565b60006143d3826144ca565b91506143de836144ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144175761441661464d565b5b828202905092915050565b600061442d826144ca565b9150614438836144ca565b92508282101561444b5761444a61464d565b5b828203905092915050565b6000614461826144aa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006144df826144e6565b9050919050565b60006144f1826144f8565b9050919050565b6000614503826144aa565b9050919050565b82818337600083830152505050565b60005b8381101561453757808201518184015260208101905061451c565b83811115614546576000848401525b50505050565b6000600282049050600182168061456457607f821691505b60208210811415614578576145776146ab565b5b50919050565b61458782614785565b810181811067ffffffffffffffff821117156145a6576145a5614738565b5b80604052505050565b60006145ba826144ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145ed576145ec61464d565b5b600182019050919050565b60006146038261460a565b9050919050565b600061461582614796565b9050919050565b6000614627826144ca565b9150614632836144ca565b9250826146425761464161467c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f696e76616c69642077686974656c69737420706172616d657465727300000000600082015250565b7f6e6f206d6f726520617661696c61626c6520746f206d696e7400000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f63616c6c6572206973206e6f7420746865207472656173757279000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f6d696e74206f766572206c696d69740000000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b614d9b81614456565b8114614da657600080fd5b50565b614db281614468565b8114614dbd57600080fd5b50565b614dc981614474565b8114614dd457600080fd5b50565b614de08161447e565b8114614deb57600080fd5b50565b614df7816144ca565b8114614e0257600080fd5b5056fea2646970667358221220a577621349c810261a4b92a0cda71beed49fc670a9b37439102d6fe24c2d987064736f6c634300080700330000000000000000000000007163bee2a0a4c75d1236bf053e429f86eb45426e00000000000000000000000051d35a4cfea3e5fb387e467d31cc0c87f6038a1a39c7cc5521703cca3cc2b95d6a7b0caee1ba864bf13b1f007391379a0ce60e9e

Deployed Bytecode

0x6080604052600436106102515760003560e01c806370a0823111610139578063a9abc96e116100b6578063c87b56dd1161007a578063c87b56dd14610891578063d4f83ab7146108ce578063e985e9c5146108f9578063ed5b620714610936578063f0f4426014610952578063f2fde38b1461097b57610251565b8063a9abc96e146107aa578063ad68b20b146107d5578063af63b4fd14610800578063b76568081461082b578063b88d4fde1461086857610251565b80638da5cb5b116100fd5780638da5cb5b146106f357806395d89b411461071e578063a22cb46514610749578063a614f3ea14610772578063a80487571461078e57610251565b806370a0823114610620578063714a6eef1461065d578063715018a6146106885780637cb647591461069f57806387463cc5146106c857610251565b80633201451c116101d257806355f804b31161019657806355f804b31461051d5780635a872bac1461054657806361d027b31461057157806362dc96931461059c5780636352211e146105b85780636c0360eb146105f557610251565b80633201451c1461043657806342842e0e14610461578063439514da1461048a5780634f6ccce7146104b55780635454f5f0146104f257610251565b806318160ddd1161021957806318160ddd1461034f57806323b872dd1461037a5780632c804275146103a35780632eb4a7ab146103ce5780632f745c59146103f957610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806315080c7f14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613899565b6109a4565b60405161028a9190613ede565b60405180910390f35b34801561029f57600080fd5b506102a8610a1e565b6040516102b59190613f2f565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e0919061393c565b610ab0565b6040516102f29190613e4e565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d91906137cc565b610b35565b005b34801561033057600080fd5b50610339610c4d565b6040516103469190614251565b60405180910390f35b34801561035b57600080fd5b50610364610c53565b6040516103719190614251565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c91906136b6565b610c60565b005b3480156103af57600080fd5b506103b8610cc0565b6040516103c59190614251565b60405180910390f35b3480156103da57600080fd5b506103e3610cc6565b6040516103f09190613ef9565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b91906137cc565b610ccc565b60405161042d9190614251565b60405180910390f35b34801561044257600080fd5b5061044b610d71565b6040516104589190614251565b60405180910390f35b34801561046d57600080fd5b50610488600480360381019061048391906136b6565b610d77565b005b34801561049657600080fd5b5061049f610d97565b6040516104ac9190614251565b60405180910390f35b3480156104c157600080fd5b506104dc60048036038101906104d7919061393c565b610d9d565b6040516104e99190614251565b60405180910390f35b3480156104fe57600080fd5b50610507610e0e565b6040516105149190614251565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906138f3565b610e14565b005b34801561055257600080fd5b5061055b610eaa565b6040516105689190613f14565b60405180910390f35b34801561057d57600080fd5b50610586610ed0565b6040516105939190613e4e565b60405180910390f35b6105b660048036038101906105b1919061380c565b610ef6565b005b3480156105c457600080fd5b506105df60048036038101906105da919061393c565b61124d565b6040516105ec9190613e4e565b60405180910390f35b34801561060157600080fd5b5061060a6112ff565b6040516106179190613f2f565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190613649565b61138d565b6040516106549190614251565b60405180910390f35b34801561066957600080fd5b50610672611445565b60405161067f9190614251565b60405180910390f35b34801561069457600080fd5b5061069d61144b565b005b3480156106ab57600080fd5b506106c660048036038101906106c1919061386c565b6114d3565b005b3480156106d457600080fd5b506106dd611559565b6040516106ea9190614251565b60405180910390f35b3480156106ff57600080fd5b5061070861155f565b6040516107159190613e4e565b60405180910390f35b34801561072a57600080fd5b50610733611589565b6040516107409190613f2f565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b919061378c565b61161b565b005b61078c6004803603810190610787919061380c565b611631565b005b6107a860048036038101906107a3919061380c565b611874565b005b3480156107b657600080fd5b506107bf611bcb565b6040516107cc9190614251565b60405180910390f35b3480156107e157600080fd5b506107ea611bd1565b6040516107f79190614251565b60405180910390f35b34801561080c57600080fd5b50610815611bd7565b6040516108229190614251565b60405180910390f35b34801561083757600080fd5b50610852600480360381019061084d91906137cc565b611bdd565b60405161085f9190614251565b60405180910390f35b34801561087457600080fd5b5061088f600480360381019061088a9190613709565b611c02565b005b34801561089d57600080fd5b506108b860048036038101906108b3919061393c565b611c64565b6040516108c59190613f2f565b60405180910390f35b3480156108da57600080fd5b506108e3611d0b565b6040516108f09190614251565b60405180910390f35b34801561090557600080fd5b50610920600480360381019061091b9190613676565b611d11565b60405161092d9190613ede565b60405180910390f35b610950600480360381019061094b919061393c565b611da5565b005b34801561095e57600080fd5b5061097960048036038101906109749190613649565b611ef0565b005b34801561098757600080fd5b506109a2600480360381019061099d9190613649565b611fc4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a175750610a16826120bc565b5b9050919050565b606060008054610a2d9061454c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a599061454c565b8015610aa65780601f10610a7b57610100808354040283529160200191610aa6565b820191906000526020600020905b815481529060010190602001808311610a8957829003601f168201915b5050505050905090565b6000610abb8261219e565b610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190614131565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b408261124d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba8906141b1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd061220a565b73ffffffffffffffffffffffffffffffffffffffff161480610bff5750610bfe81610bf961220a565b611d11565b5b610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906140b1565b60405180910390fd5b610c488383612212565b505050565b60145481565b6000600880549050905090565b610c71610c6b61220a565b826122cb565b610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca7906141f1565b60405180910390fd5b610cbb8383836123a9565b505050565b60195481565b600e5481565b6000610cd78361138d565b8210610d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0f90613f91565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b610d9283838360405180602001604052806000815250611c02565b505050565b60105481565b6000610da7610c53565b8210610de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddf90614211565b60405180910390fd5b60088281548110610dfc57610dfb614709565b5b90600052602060002001549050919050565b60125481565b610e1c61220a565b73ffffffffffffffffffffffffffffffffffffffff16610e3a61155f565b73ffffffffffffffffffffffffffffffffffffffff1614610e90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790614151565b60405180910390fd5b80600b9080519060200190610ea69291906133d0565b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600183838360003384604051602001610f10929190613de9565b604051602081830303815290604052805190602001209050610f76838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612610565b610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac90613f51565b60405180910390fd5b838560038110610fc857610fc7614709565b5b6020020135600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020541061105e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611055906141d1565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008154809291906110bf906145af565b9190505550601354601254111561110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290613f71565b60405180910390fd5b601454341015611150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114790614051565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161119890613e39565b60006040518083038185875af1925050503d80600081146111d5576040519150601f19603f3d011682016040523d82523d6000602084013e6111da565b606091505b505090508061121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590614231565b60405180910390fd5b61122a33601254612627565b6012600081548092919061123d906145af565b9190505550505050505050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed906140f1565b60405180910390fd5b80915050919050565b600b805461130c9061454c565b80601f01602080910402602001604051908101604052809291908181526020018280546113389061454c565b80156113855780601f1061135a57610100808354040283529160200191611385565b820191906000526020600020905b81548152906001019060200180831161136857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f5906140d1565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60175481565b61145361220a565b73ffffffffffffffffffffffffffffffffffffffff1661147161155f565b73ffffffffffffffffffffffffffffffffffffffff16146114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be90614151565b60405180910390fd5b6114d16000612645565b565b6114db61220a565b73ffffffffffffffffffffffffffffffffffffffff166114f961155f565b73ffffffffffffffffffffffffffffffffffffffff161461154f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154690614151565b60405180910390fd5b80600e8190555050565b60185481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115989061454c565b80601f01602080910402602001604051908101604052809291908181526020018280546115c49061454c565b80156116115780601f106115e657610100808354040283529160200191611611565b820191906000526020600020905b8154815290600101906020018083116115f457829003601f168201915b5050505050905090565b61162d61162661220a565b838361270b565b5050565b60008383836000338460405160200161164b929190613de9565b6040516020818303038152906040528051906020012090506116b1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612610565b6116f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e790613f51565b60405180910390fd5b83856003811061170357611702614709565b5b6020020135600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205410611799576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611790906141d1565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060008154809291906117fa906145af565b91905055506011546010541115611846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183d90613f71565b60405180910390fd5b61185233601054612627565b60106000815480929190611865906145af565b91905055505050505050505050565b60028383836000338460405160200161188e929190613de9565b6040516020818303038152906040528051906020012090506118f4838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612610565b611933576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192a90613f51565b60405180910390fd5b83856003811061194657611945614709565b5b6020020135600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002054106119dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d3906141d1565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000206000815480929190611a3d906145af565b91905055506016546015541115611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090613f71565b60405180910390fd5b601754341015611ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac590614051565b60405180910390fd5b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051611b1690613e39565b60006040518083038185875af1925050503d8060008114611b53576040519150601f19603f3d011682016040523d82523d6000602084013e611b58565b606091505b5050905080611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390614231565b60405180910390fd5b611ba833601554612627565b60156000815480929190611bbb906145af565b9190505550505050505050505050565b60135481565b60155481565b60165481565b600f602052816000526040600020602052806000526040600020600091509150505481565b611c13611c0d61220a565b836122cb565b611c52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c49906141f1565b60405180910390fd5b611c5e84848484612878565b50505050565b6060611c6f8261219e565b611cae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca590614171565b60405180910390fd5b6000611cb86128d4565b90506000815111611cd85760405180602001604052806000815250611d03565b80611ce284612966565b604051602001611cf3929190613e15565b6040516020818303038152906040525b915050919050565b601a5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601954600182601854611db89190614341565b611dc29190614422565b1115611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa90613f71565b60405180910390fd5b60006018549050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc67903384601a54611e5791906143c8565b6040518363ffffffff1660e01b8152600401611e74929190613eb5565b600060405180830381600087803b158015611e8e57600080fd5b505af1158015611ea2573d6000803e3d6000fd5b505050508181611eb29190614341565b60188190555060005b82811015611eeb57611ed8338284611ed39190614341565b612627565b8080611ee3906145af565b915050611ebb565b505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7790614191565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611fcc61220a565b73ffffffffffffffffffffffffffffffffffffffff16611fea61155f565b73ffffffffffffffffffffffffffffffffffffffff1614612040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203790614151565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a790613fd1565b60405180910390fd5b6120b981612645565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061218757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612197575061219682612ac7565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122858361124d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122d68261219e565b612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c90614091565b60405180910390fd5b60006123208361124d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061238f57508373ffffffffffffffffffffffffffffffffffffffff1661237784610ab0565b73ffffffffffffffffffffffffffffffffffffffff16145b806123a0575061239f8185611d11565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123c98261124d565b73ffffffffffffffffffffffffffffffffffffffff161461241f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241690613ff1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561248f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248690614031565b60405180910390fd5b61249a838383612b31565b6124a5600082612212565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f59190614422565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461254c9190614341565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461260b838383612c45565b505050565b60008261261d8584612c4a565b1490509392505050565b612641828260405180602001604052806000815250612cbf565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561277a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277190614071565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161286b9190613ede565b60405180910390a3505050565b6128838484846123a9565b61288f84848484612d1a565b6128ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c590613fb1565b60405180910390fd5b50505050565b6060600b80546128e39061454c565b80601f016020809104026020016040519081016040528092919081815260200182805461290f9061454c565b801561295c5780601f106129315761010080835404028352916020019161295c565b820191906000526020600020905b81548152906001019060200180831161293f57829003601f168201915b5050505050905090565b606060008214156129ae576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ac2565b600082905060005b600082146129e05780806129c9906145af565b915050600a826129d99190614397565b91506129b6565b60008167ffffffffffffffff8111156129fc576129fb614738565b5b6040519080825280601f01601f191660200182016040528015612a2e5781602001600182028036833780820191505090505b5090505b60008514612abb57600182612a479190614422565b9150600a85612a56919061461c565b6030612a629190614341565b60f81b818381518110612a7857612a77614709565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ab49190614397565b9450612a32565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612b3c838383612eb1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7f57612b7a81612eb6565b612bbe565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bbd57612bbc8382612eff565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c0157612bfc8161306c565b612c40565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3f57612c3e828261313d565b5b5b505050565b505050565b60008082905060005b8451811015612cb4576000858281518110612c7157612c70614709565b5b60200260200101519050808311612c9357612c8c83826131bc565b9250612ca0565b612c9d81846131bc565b92505b508080612cac906145af565b915050612c53565b508091505092915050565b612cc983836131d3565b612cd66000848484612d1a565b612d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0c90613fb1565b60405180910390fd5b505050565b6000612d3b8473ffffffffffffffffffffffffffffffffffffffff166133ad565b15612ea4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d6461220a565b8786866040518563ffffffff1660e01b8152600401612d869493929190613e69565b602060405180830381600087803b158015612da057600080fd5b505af1925050508015612dd157506040513d601f19601f82011682018060405250810190612dce91906138c6565b60015b612e54573d8060008114612e01576040519150601f19603f3d011682016040523d82523d6000602084013e612e06565b606091505b50600081511415612e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4390613fb1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ea9565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f0c8461138d565b612f169190614422565b9050600060076000848152602001908152602001600020549050818114612ffb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130809190614422565b90506000600960008481526020019081526020016000205490506000600883815481106130b0576130af614709565b5b9060005260206000200154905080600883815481106130d2576130d1614709565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613121576131206146da565b5b6001900381819060005260206000200160009055905550505050565b60006131488361138d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323a90614111565b60405180910390fd5b61324c8161219e565b1561328c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328390614011565b60405180910390fd5b61329860008383612b31565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132e89190614341565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133a960008383612c45565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546133dc9061454c565b90600052602060002090601f0160209004810192826133fe5760008555613445565b82601f1061341757805160ff1916838001178555613445565b82800160010185558215613445579182015b82811115613444578251825591602001919060010190613429565b5b5090506134529190613456565b5090565b5b8082111561346f576000816000905550600101613457565b5090565b600061348661348184614291565b61426c565b9050828152602081018484840111156134a2576134a1614776565b5b6134ad84828561450a565b509392505050565b60006134c86134c3846142c2565b61426c565b9050828152602081018484840111156134e4576134e3614776565b5b6134ef84828561450a565b509392505050565b60008135905061350681614d92565b92915050565b60008083601f8401126135225761352161476c565b5b8235905067ffffffffffffffff81111561353f5761353e614767565b5b60208301915083602082028301111561355b5761355a614771565b5b9250929050565b60008190508260206003028201111561357e5761357d614771565b5b92915050565b60008135905061359381614da9565b92915050565b6000813590506135a881614dc0565b92915050565b6000813590506135bd81614dd7565b92915050565b6000815190506135d281614dd7565b92915050565b600082601f8301126135ed576135ec61476c565b5b81356135fd848260208601613473565b91505092915050565b600082601f83011261361b5761361a61476c565b5b813561362b8482602086016134b5565b91505092915050565b60008135905061364381614dee565b92915050565b60006020828403121561365f5761365e614780565b5b600061366d848285016134f7565b91505092915050565b6000806040838503121561368d5761368c614780565b5b600061369b858286016134f7565b92505060206136ac858286016134f7565b9150509250929050565b6000806000606084860312156136cf576136ce614780565b5b60006136dd868287016134f7565b93505060206136ee868287016134f7565b92505060406136ff86828701613634565b9150509250925092565b6000806000806080858703121561372357613722614780565b5b6000613731878288016134f7565b9450506020613742878288016134f7565b935050604061375387828801613634565b925050606085013567ffffffffffffffff8111156137745761377361477b565b5b613780878288016135d8565b91505092959194509250565b600080604083850312156137a3576137a2614780565b5b60006137b1858286016134f7565b92505060206137c285828601613584565b9150509250929050565b600080604083850312156137e3576137e2614780565b5b60006137f1858286016134f7565b925050602061380285828601613634565b9150509250929050565b60008060006080848603121561382557613824614780565b5b600061383386828701613562565b935050606084013567ffffffffffffffff8111156138545761385361477b565b5b6138608682870161350c565b92509250509250925092565b60006020828403121561388257613881614780565b5b600061389084828501613599565b91505092915050565b6000602082840312156138af576138ae614780565b5b60006138bd848285016135ae565b91505092915050565b6000602082840312156138dc576138db614780565b5b60006138ea848285016135c3565b91505092915050565b60006020828403121561390957613908614780565b5b600082013567ffffffffffffffff8111156139275761392661477b565b5b61393384828501613606565b91505092915050565b60006020828403121561395257613951614780565b5b600061396084828501613634565b91505092915050565b61397281614456565b82525050565b61398961398482614456565b6145f8565b82525050565b61399b6060838361450a565b5050565b6139a881614468565b82525050565b6139b781614474565b82525050565b60006139c8826142f3565b6139d28185614309565b93506139e2818560208601614519565b6139eb81614785565b840191505092915050565b6139ff816144d4565b82525050565b6000613a10826142fe565b613a1a8185614325565b9350613a2a818560208601614519565b613a3381614785565b840191505092915050565b6000613a49826142fe565b613a538185614336565b9350613a63818560208601614519565b80840191505092915050565b6000613a7c601c83614325565b9150613a87826147a3565b602082019050919050565b6000613a9f601983614325565b9150613aaa826147cc565b602082019050919050565b6000613ac2602b83614325565b9150613acd826147f5565b604082019050919050565b6000613ae5603283614325565b9150613af082614844565b604082019050919050565b6000613b08602683614325565b9150613b1382614893565b604082019050919050565b6000613b2b602583614325565b9150613b36826148e2565b604082019050919050565b6000613b4e601c83614325565b9150613b5982614931565b602082019050919050565b6000613b71602483614325565b9150613b7c8261495a565b604082019050919050565b6000613b94601483614325565b9150613b9f826149a9565b602082019050919050565b6000613bb7601983614325565b9150613bc2826149d2565b602082019050919050565b6000613bda602c83614325565b9150613be5826149fb565b604082019050919050565b6000613bfd603883614325565b9150613c0882614a4a565b604082019050919050565b6000613c20602a83614325565b9150613c2b82614a99565b604082019050919050565b6000613c43602983614325565b9150613c4e82614ae8565b604082019050919050565b6000613c66602083614325565b9150613c7182614b37565b602082019050919050565b6000613c89602c83614325565b9150613c9482614b60565b604082019050919050565b6000613cac602083614325565b9150613cb782614baf565b602082019050919050565b6000613ccf602f83614325565b9150613cda82614bd8565b604082019050919050565b6000613cf2601a83614325565b9150613cfd82614c27565b602082019050919050565b6000613d15602183614325565b9150613d2082614c50565b604082019050919050565b6000613d38600f83614325565b9150613d4382614c9f565b602082019050919050565b6000613d5b60008361431a565b9150613d6682614cc8565b600082019050919050565b6000613d7e603183614325565b9150613d8982614ccb565b604082019050919050565b6000613da1602c83614325565b9150613dac82614d1a565b604082019050919050565b6000613dc4600f83614325565b9150613dcf82614d69565b602082019050919050565b613de3816144ca565b82525050565b6000613df58285613978565b601482019150613e05828461398f565b6060820191508190509392505050565b6000613e218285613a3e565b9150613e2d8284613a3e565b91508190509392505050565b6000613e4482613d4e565b9150819050919050565b6000602082019050613e636000830184613969565b92915050565b6000608082019050613e7e6000830187613969565b613e8b6020830186613969565b613e986040830185613dda565b8181036060830152613eaa81846139bd565b905095945050505050565b6000604082019050613eca6000830185613969565b613ed76020830184613dda565b9392505050565b6000602082019050613ef3600083018461399f565b92915050565b6000602082019050613f0e60008301846139ae565b92915050565b6000602082019050613f2960008301846139f6565b92915050565b60006020820190508181036000830152613f498184613a05565b905092915050565b60006020820190508181036000830152613f6a81613a6f565b9050919050565b60006020820190508181036000830152613f8a81613a92565b9050919050565b60006020820190508181036000830152613faa81613ab5565b9050919050565b60006020820190508181036000830152613fca81613ad8565b9050919050565b60006020820190508181036000830152613fea81613afb565b9050919050565b6000602082019050818103600083015261400a81613b1e565b9050919050565b6000602082019050818103600083015261402a81613b41565b9050919050565b6000602082019050818103600083015261404a81613b64565b9050919050565b6000602082019050818103600083015261406a81613b87565b9050919050565b6000602082019050818103600083015261408a81613baa565b9050919050565b600060208201905081810360008301526140aa81613bcd565b9050919050565b600060208201905081810360008301526140ca81613bf0565b9050919050565b600060208201905081810360008301526140ea81613c13565b9050919050565b6000602082019050818103600083015261410a81613c36565b9050919050565b6000602082019050818103600083015261412a81613c59565b9050919050565b6000602082019050818103600083015261414a81613c7c565b9050919050565b6000602082019050818103600083015261416a81613c9f565b9050919050565b6000602082019050818103600083015261418a81613cc2565b9050919050565b600060208201905081810360008301526141aa81613ce5565b9050919050565b600060208201905081810360008301526141ca81613d08565b9050919050565b600060208201905081810360008301526141ea81613d2b565b9050919050565b6000602082019050818103600083015261420a81613d71565b9050919050565b6000602082019050818103600083015261422a81613d94565b9050919050565b6000602082019050818103600083015261424a81613db7565b9050919050565b60006020820190506142666000830184613dda565b92915050565b6000614276614287565b9050614282828261457e565b919050565b6000604051905090565b600067ffffffffffffffff8211156142ac576142ab614738565b5b6142b582614785565b9050602081019050919050565b600067ffffffffffffffff8211156142dd576142dc614738565b5b6142e682614785565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061434c826144ca565b9150614357836144ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561438c5761438b61464d565b5b828201905092915050565b60006143a2826144ca565b91506143ad836144ca565b9250826143bd576143bc61467c565b5b828204905092915050565b60006143d3826144ca565b91506143de836144ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144175761441661464d565b5b828202905092915050565b600061442d826144ca565b9150614438836144ca565b92508282101561444b5761444a61464d565b5b828203905092915050565b6000614461826144aa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006144df826144e6565b9050919050565b60006144f1826144f8565b9050919050565b6000614503826144aa565b9050919050565b82818337600083830152505050565b60005b8381101561453757808201518184015260208101905061451c565b83811115614546576000848401525b50505050565b6000600282049050600182168061456457607f821691505b60208210811415614578576145776146ab565b5b50919050565b61458782614785565b810181811067ffffffffffffffff821117156145a6576145a5614738565b5b80604052505050565b60006145ba826144ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145ed576145ec61464d565b5b600182019050919050565b60006146038261460a565b9050919050565b600061461582614796565b9050919050565b6000614627826144ca565b9150614632836144ca565b9250826146425761464161467c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f696e76616c69642077686974656c69737420706172616d657465727300000000600082015250565b7f6e6f206d6f726520617661696c61626c6520746f206d696e7400000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f696e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f63616c6c6572206973206e6f7420746865207472656173757279000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f6d696e74206f766572206c696d69740000000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b614d9b81614456565b8114614da657600080fd5b50565b614db281614468565b8114614dbd57600080fd5b50565b614dc981614474565b8114614dd457600080fd5b50565b614de08161447e565b8114614deb57600080fd5b50565b614df7816144ca565b8114614e0257600080fd5b5056fea2646970667358221220a577621349c810261a4b92a0cda71beed49fc670a9b37439102d6fe24c2d987064736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000007163bee2a0a4c75d1236bf053e429f86eb45426e00000000000000000000000051d35a4cfea3e5fb387e467d31cc0c87f6038a1a39c7cc5521703cca3cc2b95d6a7b0caee1ba864bf13b1f007391379a0ce60e9e

-----Decoded View---------------
Arg [0] : treasuryAddress (address): 0x7163beE2a0a4C75D1236Bf053E429f86eB45426E
Arg [1] : ketchup (address): 0x51D35A4CFeA3e5FB387e467d31Cc0c87F6038a1A
Arg [2] : root (bytes32): 0x39c7cc5521703cca3cc2b95d6a7b0caee1ba864bf13b1f007391379a0ce60e9e

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007163bee2a0a4c75d1236bf053e429f86eb45426e
Arg [1] : 00000000000000000000000051d35a4cfea3e5fb387e467d31cc0c87f6038a1a
Arg [2] : 39c7cc5521703cca3cc2b95d6a7b0caee1ba864bf13b1f007391379a0ce60e9e


Deployed Bytecode Sourcemap

66456:4072:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36922:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22650:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24209:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23732:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67094:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37562:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24959:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67319:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66837:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37230:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66975:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25369:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66936:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37752:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67016:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69929:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66772:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66807:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68467:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22344:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66710:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22074:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67225:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44789:103;;;;;;;;;;;;;:::i;:::-;;70223:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67277:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44138:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22819:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24502:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68177:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68934:459;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67056:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67146:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67186:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66869:61;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25625:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22994:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67359:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24728:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69401:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70043:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45047:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36922:224;37024:4;37063:35;37048:50;;;:11;:50;;;;:90;;;;37102:36;37126:11;37102:23;:36::i;:::-;37048:90;37041:97;;36922:224;;;:::o;22650:100::-;22704:13;22737:5;22730:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22650:100;:::o;24209:221::-;24285:7;24313:16;24321:7;24313;:16::i;:::-;24305:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24398:15;:24;24414:7;24398:24;;;;;;;;;;;;;;;;;;;;;24391:31;;24209:221;;;:::o;23732:411::-;23813:13;23829:23;23844:7;23829:14;:23::i;:::-;23813:39;;23877:5;23871:11;;:2;:11;;;;23863:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23971:5;23955:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23980:37;23997:5;24004:12;:10;:12::i;:::-;23980:16;:37::i;:::-;23955:62;23933:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24114:21;24123:2;24127:7;24114:8;:21::i;:::-;23802:341;23732:411;;:::o;67094:43::-;;;;:::o;37562:113::-;37623:7;37650:10;:17;;;;37643:24;;37562:113;:::o;24959:339::-;25154:41;25173:12;:10;:12::i;:::-;25187:7;25154:18;:41::i;:::-;25146:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25262:28;25272:4;25278:2;25282:7;25262:9;:28::i;:::-;24959:339;;;:::o;67319:33::-;;;;:::o;66837:25::-;;;;:::o;37230:256::-;37327:7;37363:23;37380:5;37363:16;:23::i;:::-;37355:5;:31;37347:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37452:12;:19;37465:5;37452:19;;;;;;;;;;;;;;;:26;37472:5;37452:26;;;;;;;;;;;;37445:33;;37230:256;;;;:::o;66975:32::-;;;;:::o;25369:185::-;25507:39;25524:4;25530:2;25534:7;25507:39;;;;;;;;;;;;:16;:39::i;:::-;25369:185;;;:::o;66936:32::-;;;;:::o;37752:233::-;37827:7;37863:30;:28;:30::i;:::-;37855:5;:38;37847:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37960:10;37971:5;37960:17;;;;;;;;:::i;:::-;;;;;;;;;;37953:24;;37752:233;;;:::o;67016:33::-;;;;:::o;69929:106::-;44369:12;:10;:12::i;:::-;44358:23;;:7;:5;:7::i;:::-;:23;;;44350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70016:11:::1;70006:7;:21;;;;;;;;;;;;:::i;:::-;;69929:106:::0;:::o;66772:28::-;;;;;;;;;;;;;:::o;66807:23::-;;;;;;;;;;;;;:::o;68467:459::-;68571:1;68574:6;68582:5;;67758:12;67800:10;67812:6;67783:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67773:47;;;;;;67758:62;;67839:43;67858:5;;67839:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67865:10;;67877:4;67839:18;:43::i;:::-;67831:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;67966:6;67973:9;67966:17;;;;;;;:::i;:::-;;;;;;67934:6;:18;67941:10;67934:18;;;;;;;;;;;;;;;:29;67953:9;67934:29;;;;;;;;;;;;:49;67926:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68014:6;:18;68021:10;68014:18;;;;;;;;;;;;;;;:29;68033:9;68014:29;;;;;;;;;;;;:32;;;;;;;;;:::i;:::-;;;;;;68624:10:::1;;68608:12;;:26;;68600:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;68696:15;;68683:9;:28;;68675:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;68748:12;68765:8;;;;;;;;;;;:13;;68786:9;68765:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68747:53;;;68819:7;68811:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;68857;68867:10;68879:12;;68857:9;:35::i;:::-;68903:12;;:15;;;;;;;;;:::i;:::-;;;;;;68589:337;67747:319:::0;68467:459;;;;;;;:::o;22344:239::-;22416:7;22436:13;22452:7;:16;22460:7;22452:16;;;;;;;;;;;;;;;;;;;;;22436:32;;22504:1;22487:19;;:5;:19;;;;22479:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22570:5;22563:12;;;22344:239;;;:::o;66710:53::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22074:208::-;22146:7;22191:1;22174:19;;:5;:19;;;;22166:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22258:9;:16;22268:5;22258:16;;;;;;;;;;;;;;;;22251:23;;22074:208;;;:::o;67225:43::-;;;;:::o;44789:103::-;44369:12;:10;:12::i;:::-;44358:23;;:7;:5;:7::i;:::-;:23;;;44350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44854:30:::1;44881:1;44854:18;:30::i;:::-;44789:103::o:0;70223:92::-;44369:12;:10;:12::i;:::-;44358:23;;:7;:5;:7::i;:::-;:23;;;44350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70303:4:::1;70290:10;:17;;;;70223:92:::0;:::o;67277:35::-;;;;:::o;44138:87::-;44184:7;44211:6;;;;;;;;;;;44204:13;;44138:87;:::o;22819:104::-;22875:13;22908:7;22901:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22819:104;:::o;24502:155::-;24597:52;24616:12;:10;:12::i;:::-;24630:8;24640;24597:18;:52::i;:::-;24502:155;;:::o;68177:282::-;68282:1;68285:6;68293:5;;67758:12;67800:10;67812:6;67783:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67773:47;;;;;;67758:62;;67839:43;67858:5;;67839:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67865:10;;67877:4;67839:18;:43::i;:::-;67831:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;67966:6;67973:9;67966:17;;;;;;;:::i;:::-;;;;;;67934:6;:18;67941:10;67934:18;;;;;;;;;;;;;;;:29;67953:9;67934:29;;;;;;;;;;;;:49;67926:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68014:6;:18;68021:10;68014:18;;;;;;;;;;;;;;;:29;68033:9;68014:29;;;;;;;;;;;;:32;;;;;;;;;:::i;:::-;;;;;;68336:11:::1;;68319:13;;:28;;68311:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;68388:36;68398:10;68410:13;;68388:9;:36::i;:::-;68435:13;;:16;;;;;;;;;:::i;:::-;;;;;;67747:319:::0;68177:282;;;;;;;:::o;68934:459::-;69038:1;69041:6;69049:5;;67758:12;67800:10;67812:6;67783:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67773:47;;;;;;67758:62;;67839:43;67858:5;;67839:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67865:10;;67877:4;67839:18;:43::i;:::-;67831:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;67966:6;67973:9;67966:17;;;;;;;:::i;:::-;;;;;;67934:6;:18;67941:10;67934:18;;;;;;;;;;;;;;;:29;67953:9;67934:29;;;;;;;;;;;;:49;67926:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;68014:6;:18;68021:10;68014:18;;;;;;;;;;;;;;;:29;68033:9;68014:29;;;;;;;;;;;;:32;;;;;;;;;:::i;:::-;;;;;;69091:10:::1;;69075:12;;:26;;69067:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;69163:15;;69150:9;:28;;69142:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;69215:12;69232:8;;;;;;;;;;;:13;;69253:9;69232:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69214:53;;;69286:7;69278:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;69324;69334:10;69346:12;;69324:9;:35::i;:::-;69370:12;;:15;;;;;;;;;:::i;:::-;;;;;;69056:337;67747:319:::0;68934:459;;;;;;;:::o;67056:31::-;;;;:::o;67146:33::-;;;;:::o;67186:32::-;;;;:::o;66869:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25625:328::-;25800:41;25819:12;:10;:12::i;:::-;25833:7;25800:18;:41::i;:::-;25792:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25906:39;25920:4;25926:2;25930:7;25939:5;25906:13;:39::i;:::-;25625:328;;;;:::o;22994:334::-;23067:13;23101:16;23109:7;23101;:16::i;:::-;23093:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23182:21;23206:10;:8;:10::i;:::-;23182:34;;23258:1;23240:7;23234:21;:25;:86;;;;;;;;;;;;;;;;;23286:7;23295:18;:7;:16;:18::i;:::-;23269:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23234:86;23227:93;;;22994:334;;;:::o;67359:55::-;;;;:::o;24728:164::-;24825:4;24849:18;:25;24868:5;24849:25;;;;;;;;;;;;;;;:35;24875:8;24849:35;;;;;;;;;;;;;;;;;;;;;;;;;24842:42;;24728:164;;;;:::o;69401:414::-;69505:11;;69500:1;69491:6;69475:13;;:22;;;;:::i;:::-;:26;;;;:::i;:::-;:41;;69467:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;69551:26;69580:13;;69551:42;;69600:7;;;;;;;;;;;:16;;;69617:10;69652:6;69629:20;;:29;;;;:::i;:::-;69600:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69701:6;69680:18;:27;;;;:::i;:::-;69664:13;:43;;;;69719:9;69714:94;69738:6;69734:1;:10;69714:94;;;69757:45;69767:10;69800:1;69779:18;:22;;;;:::i;:::-;69757:9;:45::i;:::-;69746:3;;;;;:::i;:::-;;;;69714:94;;;;69456:359;69401:414;:::o;70043:172::-;70131:8;;;;;;;;;;;70117:22;;:10;:22;;;70109:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;70192:15;70181:8;;:26;;;;;;;;;;;;;;;;;;70043:172;:::o;45047:201::-;44369:12;:10;:12::i;:::-;44358:23;;:7;:5;:7::i;:::-;:23;;;44350:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45156:1:::1;45136:22;;:8;:22;;;;45128:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45212:28;45231:8;45212:18;:28::i;:::-;45047:201:::0;:::o;21705:305::-;21807:4;21859:25;21844:40;;;:11;:40;;;;:105;;;;21916:33;21901:48;;;:11;:48;;;;21844:105;:158;;;;21966:36;21990:11;21966:23;:36::i;:::-;21844:158;21824:178;;21705:305;;;:::o;27463:127::-;27528:4;27580:1;27552:30;;:7;:16;27560:7;27552:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27545:37;;27463:127;;;:::o;16911:98::-;16964:7;16991:10;16984:17;;16911:98;:::o;31609:174::-;31711:2;31684:15;:24;31700:7;31684:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31767:7;31763:2;31729:46;;31738:23;31753:7;31738:14;:23::i;:::-;31729:46;;;;;;;;;;;;31609:174;;:::o;27757:348::-;27850:4;27875:16;27883:7;27875;:16::i;:::-;27867:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27951:13;27967:23;27982:7;27967:14;:23::i;:::-;27951:39;;28020:5;28009:16;;:7;:16;;;:51;;;;28053:7;28029:31;;:20;28041:7;28029:11;:20::i;:::-;:31;;;28009:51;:87;;;;28064:32;28081:5;28088:7;28064:16;:32::i;:::-;28009:87;28001:96;;;27757:348;;;;:::o;30866:625::-;31025:4;30998:31;;:23;31013:7;30998:14;:23::i;:::-;:31;;;30990:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31104:1;31090:16;;:2;:16;;;;31082:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31160:39;31181:4;31187:2;31191:7;31160:20;:39::i;:::-;31264:29;31281:1;31285:7;31264:8;:29::i;:::-;31325:1;31306:9;:15;31316:4;31306:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31354:1;31337:9;:13;31347:2;31337:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31385:2;31366:7;:16;31374:7;31366:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31424:7;31420:2;31405:27;;31414:4;31405:27;;;;;;;;;;;;31445:38;31465:4;31471:2;31475:7;31445:19;:38::i;:::-;30866:625;;;:::o;64282:190::-;64407:4;64460;64431:25;64444:5;64451:4;64431:12;:25::i;:::-;:33;64424:40;;64282:190;;;;;:::o;28447:110::-;28523:26;28533:2;28537:7;28523:26;;;;;;;;;;;;:9;:26::i;:::-;28447:110;;:::o;45408:191::-;45482:16;45501:6;;;;;;;;;;;45482:25;;45527:8;45518:6;;:17;;;;;;;;;;;;;;;;;;45582:8;45551:40;;45572:8;45551:40;;;;;;;;;;;;45471:128;45408:191;:::o;31925:315::-;32080:8;32071:17;;:5;:17;;;;32063:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32167:8;32129:18;:25;32148:5;32129:25;;;;;;;;;;;;;;;:35;32155:8;32129:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32213:8;32191:41;;32206:5;32191:41;;;32223:8;32191:41;;;;;;:::i;:::-;;;;;;;;31925:315;;;:::o;26835:::-;26992:28;27002:4;27008:2;27012:7;26992:9;:28::i;:::-;27039:48;27062:4;27068:2;27072:7;27081:5;27039:22;:48::i;:::-;27031:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26835:315;;;;:::o;70423:100::-;70475:13;70508:7;70501:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70423:100;:::o;17498:723::-;17554:13;17784:1;17775:5;:10;17771:53;;;17802:10;;;;;;;;;;;;;;;;;;;;;17771:53;17834:12;17849:5;17834:20;;17865:14;17890:78;17905:1;17897:4;:9;17890:78;;17923:8;;;;;:::i;:::-;;;;17954:2;17946:10;;;;;:::i;:::-;;;17890:78;;;17978:19;18010:6;18000:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17978:39;;18028:154;18044:1;18035:5;:10;18028:154;;18072:1;18062:11;;;;;:::i;:::-;;;18139:2;18131:5;:10;;;;:::i;:::-;18118:2;:24;;;;:::i;:::-;18105:39;;18088:6;18095;18088:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18168:2;18159:11;;;;;:::i;:::-;;;18028:154;;;18206:6;18192:21;;;;;17498:723;;;;:::o;20128:157::-;20213:4;20252:25;20237:40;;;:11;:40;;;;20230:47;;20128:157;;;:::o;38598:589::-;38742:45;38769:4;38775:2;38779:7;38742:26;:45::i;:::-;38820:1;38804:18;;:4;:18;;;38800:187;;;38839:40;38871:7;38839:31;:40::i;:::-;38800:187;;;38909:2;38901:10;;:4;:10;;;38897:90;;38928:47;38961:4;38967:7;38928:32;:47::i;:::-;38897:90;38800:187;39015:1;39001:16;;:2;:16;;;38997:183;;;39034:45;39071:7;39034:36;:45::i;:::-;38997:183;;;39107:4;39101:10;;:2;:10;;;39097:83;;39128:40;39156:2;39160:7;39128:27;:40::i;:::-;39097:83;38997:183;38598:589;;;:::o;34687:125::-;;;;:::o;64834:675::-;64917:7;64937:20;64960:4;64937:27;;64980:9;64975:497;64999:5;:12;64995:1;:16;64975:497;;;65033:20;65056:5;65062:1;65056:8;;;;;;;;:::i;:::-;;;;;;;;65033:31;;65099:12;65083;:28;65079:382;;65226:42;65241:12;65255;65226:14;:42::i;:::-;65211:57;;65079:382;;;65403:42;65418:12;65432;65403:14;:42::i;:::-;65388:57;;65079:382;65018:454;65013:3;;;;;:::i;:::-;;;;64975:497;;;;65489:12;65482:19;;;64834:675;;;;:::o;28784:321::-;28914:18;28920:2;28924:7;28914:5;:18::i;:::-;28965:54;28996:1;29000:2;29004:7;29013:5;28965:22;:54::i;:::-;28943:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28784:321;;;:::o;32805:799::-;32960:4;32981:15;:2;:13;;;:15::i;:::-;32977:620;;;33033:2;33017:36;;;33054:12;:10;:12::i;:::-;33068:4;33074:7;33083:5;33017:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33013:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33276:1;33259:6;:13;:18;33255:272;;;33302:60;;;;;;;;;;:::i;:::-;;;;;;;;33255:272;33477:6;33471:13;33462:6;33458:2;33454:15;33447:38;33013:529;33150:41;;;33140:51;;;:6;:51;;;;33133:58;;;;;32977:620;33581:4;33574:11;;32805:799;;;;;;;:::o;34176:126::-;;;;:::o;39910:164::-;40014:10;:17;;;;39987:15;:24;40003:7;39987:24;;;;;;;;;;;:44;;;;40042:10;40058:7;40042:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39910:164;:::o;40701:988::-;40967:22;41017:1;40992:22;41009:4;40992:16;:22::i;:::-;:26;;;;:::i;:::-;40967:51;;41029:18;41050:17;:26;41068:7;41050:26;;;;;;;;;;;;41029:47;;41197:14;41183:10;:28;41179:328;;41228:19;41250:12;:18;41263:4;41250:18;;;;;;;;;;;;;;;:34;41269:14;41250:34;;;;;;;;;;;;41228:56;;41334:11;41301:12;:18;41314:4;41301:18;;;;;;;;;;;;;;;:30;41320:10;41301:30;;;;;;;;;;;:44;;;;41451:10;41418:17;:30;41436:11;41418:30;;;;;;;;;;;:43;;;;41213:294;41179:328;41603:17;:26;41621:7;41603:26;;;;;;;;;;;41596:33;;;41647:12;:18;41660:4;41647:18;;;;;;;;;;;;;;;:34;41666:14;41647:34;;;;;;;;;;;41640:41;;;40782:907;;40701:988;;:::o;41984:1079::-;42237:22;42282:1;42262:10;:17;;;;:21;;;;:::i;:::-;42237:46;;42294:18;42315:15;:24;42331:7;42315:24;;;;;;;;;;;;42294:45;;42666:19;42688:10;42699:14;42688:26;;;;;;;;:::i;:::-;;;;;;;;;;42666:48;;42752:11;42727:10;42738;42727:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42863:10;42832:15;:28;42848:11;42832:28;;;;;;;;;;;:41;;;;43004:15;:24;43020:7;43004:24;;;;;;;;;;;42997:31;;;43039:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;42055:1008;;;41984:1079;:::o;39488:221::-;39573:14;39590:20;39607:2;39590:16;:20::i;:::-;39573:37;;39648:7;39621:12;:16;39634:2;39621:16;;;;;;;;;;;;;;;:24;39638:6;39621:24;;;;;;;;;;;:34;;;;39695:6;39666:17;:26;39684:7;39666:26;;;;;;;;;;;:35;;;;39562:147;39488:221;;:::o;65517:224::-;65585:13;65648:1;65642:4;65635:15;65677:1;65671:4;65664:15;65718:4;65712;65702:21;65693:30;;65517:224;;;;:::o;29441:439::-;29535:1;29521:16;;:2;:16;;;;29513:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29594:16;29602:7;29594;:16::i;:::-;29593:17;29585:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29656:45;29685:1;29689:2;29693:7;29656:20;:45::i;:::-;29731:1;29714:9;:13;29724:2;29714:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29762:2;29743:7;:16;29751:7;29743:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29807:7;29803:2;29782:33;;29799:1;29782:33;;;;;;;;;;;;29828:44;29856:1;29860:2;29864:7;29828:19;:44::i;:::-;29441:439;;:::o;8954:326::-;9014:4;9271:1;9249:7;:19;;;:23;9242:30;;8954:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1595:249::-;1666:8;1697:6;1685:18;;1750:3;1742:4;1736;1732:15;1722:8;1718:30;1715:39;1712:126;;;1757:79;;:::i;:::-;1712:126;1595:249;;;;:::o;1850:133::-;1893:5;1931:6;1918:20;1909:29;;1947:30;1971:5;1947:30;:::i;:::-;1850:133;;;;:::o;1989:139::-;2035:5;2073:6;2060:20;2051:29;;2089:33;2116:5;2089:33;:::i;:::-;1989:139;;;;:::o;2134:137::-;2179:5;2217:6;2204:20;2195:29;;2233:32;2259:5;2233:32;:::i;:::-;2134:137;;;;:::o;2277:141::-;2333:5;2364:6;2358:13;2349:22;;2380:32;2406:5;2380:32;:::i;:::-;2277:141;;;;:::o;2437:338::-;2492:5;2541:3;2534:4;2526:6;2522:17;2518:27;2508:122;;2549:79;;:::i;:::-;2508:122;2666:6;2653:20;2691:78;2765:3;2757:6;2750:4;2742:6;2738:17;2691:78;:::i;:::-;2682:87;;2498:277;2437:338;;;;:::o;2795:340::-;2851:5;2900:3;2893:4;2885:6;2881:17;2877:27;2867:122;;2908:79;;:::i;:::-;2867:122;3025:6;3012:20;3050:79;3125:3;3117:6;3110:4;3102:6;3098:17;3050:79;:::i;:::-;3041:88;;2857:278;2795:340;;;;:::o;3141:139::-;3187:5;3225:6;3212:20;3203:29;;3241:33;3268:5;3241:33;:::i;:::-;3141:139;;;;:::o;3286:329::-;3345:6;3394:2;3382:9;3373:7;3369:23;3365:32;3362:119;;;3400:79;;:::i;:::-;3362:119;3520:1;3545:53;3590:7;3581:6;3570:9;3566:22;3545:53;:::i;:::-;3535:63;;3491:117;3286:329;;;;:::o;3621:474::-;3689:6;3697;3746:2;3734:9;3725:7;3721:23;3717:32;3714:119;;;3752:79;;:::i;:::-;3714:119;3872:1;3897:53;3942:7;3933:6;3922:9;3918:22;3897:53;:::i;:::-;3887:63;;3843:117;3999:2;4025:53;4070:7;4061:6;4050:9;4046:22;4025:53;:::i;:::-;4015:63;;3970:118;3621:474;;;;;:::o;4101:619::-;4178:6;4186;4194;4243:2;4231:9;4222:7;4218:23;4214:32;4211:119;;;4249:79;;:::i;:::-;4211:119;4369:1;4394:53;4439:7;4430:6;4419:9;4415:22;4394:53;:::i;:::-;4384:63;;4340:117;4496:2;4522:53;4567:7;4558:6;4547:9;4543:22;4522:53;:::i;:::-;4512:63;;4467:118;4624:2;4650:53;4695:7;4686:6;4675:9;4671:22;4650:53;:::i;:::-;4640:63;;4595:118;4101:619;;;;;:::o;4726:943::-;4821:6;4829;4837;4845;4894:3;4882:9;4873:7;4869:23;4865:33;4862:120;;;4901:79;;:::i;:::-;4862:120;5021:1;5046:53;5091:7;5082:6;5071:9;5067:22;5046:53;:::i;:::-;5036:63;;4992:117;5148:2;5174:53;5219:7;5210:6;5199:9;5195:22;5174:53;:::i;:::-;5164:63;;5119:118;5276:2;5302:53;5347:7;5338:6;5327:9;5323:22;5302:53;:::i;:::-;5292:63;;5247:118;5432:2;5421:9;5417:18;5404:32;5463:18;5455:6;5452:30;5449:117;;;5485:79;;:::i;:::-;5449:117;5590:62;5644:7;5635:6;5624:9;5620:22;5590:62;:::i;:::-;5580:72;;5375:287;4726:943;;;;;;;:::o;5675:468::-;5740:6;5748;5797:2;5785:9;5776:7;5772:23;5768:32;5765:119;;;5803:79;;:::i;:::-;5765:119;5923:1;5948:53;5993:7;5984:6;5973:9;5969:22;5948:53;:::i;:::-;5938:63;;5894:117;6050:2;6076:50;6118:7;6109:6;6098:9;6094:22;6076:50;:::i;:::-;6066:60;;6021:115;5675:468;;;;;:::o;6149:474::-;6217:6;6225;6274:2;6262:9;6253:7;6249:23;6245:32;6242:119;;;6280:79;;:::i;:::-;6242:119;6400:1;6425:53;6470:7;6461:6;6450:9;6446:22;6425:53;:::i;:::-;6415:63;;6371:117;6527:2;6553:53;6598:7;6589:6;6578:9;6574:22;6553:53;:::i;:::-;6543:63;;6498:118;6149:474;;;;;:::o;6629:755::-;6749:6;6757;6765;6814:3;6802:9;6793:7;6789:23;6785:33;6782:120;;;6821:79;;:::i;:::-;6782:120;6941:1;6966:78;7036:7;7027:6;7016:9;7012:22;6966:78;:::i;:::-;6956:88;;6912:142;7121:2;7110:9;7106:18;7093:32;7152:18;7144:6;7141:30;7138:117;;;7174:79;;:::i;:::-;7138:117;7287:80;7359:7;7350:6;7339:9;7335:22;7287:80;:::i;:::-;7269:98;;;;7064:313;6629:755;;;;;:::o;7390:329::-;7449:6;7498:2;7486:9;7477:7;7473:23;7469:32;7466:119;;;7504:79;;:::i;:::-;7466:119;7624:1;7649:53;7694:7;7685:6;7674:9;7670:22;7649:53;:::i;:::-;7639:63;;7595:117;7390:329;;;;:::o;7725:327::-;7783:6;7832:2;7820:9;7811:7;7807:23;7803:32;7800:119;;;7838:79;;:::i;:::-;7800:119;7958:1;7983:52;8027:7;8018:6;8007:9;8003:22;7983:52;:::i;:::-;7973:62;;7929:116;7725:327;;;;:::o;8058:349::-;8127:6;8176:2;8164:9;8155:7;8151:23;8147:32;8144:119;;;8182:79;;:::i;:::-;8144:119;8302:1;8327:63;8382:7;8373:6;8362:9;8358:22;8327:63;:::i;:::-;8317:73;;8273:127;8058:349;;;;:::o;8413:509::-;8482:6;8531:2;8519:9;8510:7;8506:23;8502:32;8499:119;;;8537:79;;:::i;:::-;8499:119;8685:1;8674:9;8670:17;8657:31;8715:18;8707:6;8704:30;8701:117;;;8737:79;;:::i;:::-;8701:117;8842:63;8897:7;8888:6;8877:9;8873:22;8842:63;:::i;:::-;8832:73;;8628:287;8413:509;;;;:::o;8928:329::-;8987:6;9036:2;9024:9;9015:7;9011:23;9007:32;9004:119;;;9042:79;;:::i;:::-;9004:119;9162:1;9187:53;9232:7;9223:6;9212:9;9208:22;9187:53;:::i;:::-;9177:63;;9133:117;8928:329;;;;:::o;9263:118::-;9350:24;9368:5;9350:24;:::i;:::-;9345:3;9338:37;9263:118;;:::o;9387:157::-;9492:45;9512:24;9530:5;9512:24;:::i;:::-;9492:45;:::i;:::-;9487:3;9480:58;9387:157;;:::o;9582:188::-;9723:41;9759:4;9754:3;9747:5;9723:41;:::i;:::-;9582:188;;:::o;9776:109::-;9857:21;9872:5;9857:21;:::i;:::-;9852:3;9845:34;9776:109;;:::o;9891:118::-;9978:24;9996:5;9978:24;:::i;:::-;9973:3;9966:37;9891:118;;:::o;10015:360::-;10101:3;10129:38;10161:5;10129:38;:::i;:::-;10183:70;10246:6;10241:3;10183:70;:::i;:::-;10176:77;;10262:52;10307:6;10302:3;10295:4;10288:5;10284:16;10262:52;:::i;:::-;10339:29;10361:6;10339:29;:::i;:::-;10334:3;10330:39;10323:46;;10105:270;10015:360;;;;:::o;10381:175::-;10490:59;10543:5;10490:59;:::i;:::-;10485:3;10478:72;10381:175;;:::o;10562:364::-;10650:3;10678:39;10711:5;10678:39;:::i;:::-;10733:71;10797:6;10792:3;10733:71;:::i;:::-;10726:78;;10813:52;10858:6;10853:3;10846:4;10839:5;10835:16;10813:52;:::i;:::-;10890:29;10912:6;10890:29;:::i;:::-;10885:3;10881:39;10874:46;;10654:272;10562:364;;;;:::o;10932:377::-;11038:3;11066:39;11099:5;11066:39;:::i;:::-;11121:89;11203:6;11198:3;11121:89;:::i;:::-;11114:96;;11219:52;11264:6;11259:3;11252:4;11245:5;11241:16;11219:52;:::i;:::-;11296:6;11291:3;11287:16;11280:23;;11042:267;10932:377;;;;:::o;11315:366::-;11457:3;11478:67;11542:2;11537:3;11478:67;:::i;:::-;11471:74;;11554:93;11643:3;11554:93;:::i;:::-;11672:2;11667:3;11663:12;11656:19;;11315:366;;;:::o;11687:::-;11829:3;11850:67;11914:2;11909:3;11850:67;:::i;:::-;11843:74;;11926:93;12015:3;11926:93;:::i;:::-;12044:2;12039:3;12035:12;12028:19;;11687:366;;;:::o;12059:::-;12201:3;12222:67;12286:2;12281:3;12222:67;:::i;:::-;12215:74;;12298:93;12387:3;12298:93;:::i;:::-;12416:2;12411:3;12407:12;12400:19;;12059:366;;;:::o;12431:::-;12573:3;12594:67;12658:2;12653:3;12594:67;:::i;:::-;12587:74;;12670:93;12759:3;12670:93;:::i;:::-;12788:2;12783:3;12779:12;12772:19;;12431:366;;;:::o;12803:::-;12945:3;12966:67;13030:2;13025:3;12966:67;:::i;:::-;12959:74;;13042:93;13131:3;13042:93;:::i;:::-;13160:2;13155:3;13151:12;13144:19;;12803:366;;;:::o;13175:::-;13317:3;13338:67;13402:2;13397:3;13338:67;:::i;:::-;13331:74;;13414:93;13503:3;13414:93;:::i;:::-;13532:2;13527:3;13523:12;13516:19;;13175:366;;;:::o;13547:::-;13689:3;13710:67;13774:2;13769:3;13710:67;:::i;:::-;13703:74;;13786:93;13875:3;13786:93;:::i;:::-;13904:2;13899:3;13895:12;13888:19;;13547:366;;;:::o;13919:::-;14061:3;14082:67;14146:2;14141:3;14082:67;:::i;:::-;14075:74;;14158:93;14247:3;14158:93;:::i;:::-;14276:2;14271:3;14267:12;14260:19;;13919:366;;;:::o;14291:::-;14433:3;14454:67;14518:2;14513:3;14454:67;:::i;:::-;14447:74;;14530:93;14619:3;14530:93;:::i;:::-;14648:2;14643:3;14639:12;14632:19;;14291:366;;;:::o;14663:::-;14805:3;14826:67;14890:2;14885:3;14826:67;:::i;:::-;14819:74;;14902:93;14991:3;14902:93;:::i;:::-;15020:2;15015:3;15011:12;15004:19;;14663:366;;;:::o;15035:::-;15177:3;15198:67;15262:2;15257:3;15198:67;:::i;:::-;15191:74;;15274:93;15363:3;15274:93;:::i;:::-;15392:2;15387:3;15383:12;15376:19;;15035:366;;;:::o;15407:::-;15549:3;15570:67;15634:2;15629:3;15570:67;:::i;:::-;15563:74;;15646:93;15735:3;15646:93;:::i;:::-;15764:2;15759:3;15755:12;15748:19;;15407:366;;;:::o;15779:::-;15921:3;15942:67;16006:2;16001:3;15942:67;:::i;:::-;15935:74;;16018:93;16107:3;16018:93;:::i;:::-;16136:2;16131:3;16127:12;16120:19;;15779:366;;;:::o;16151:::-;16293:3;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16390:93;16479:3;16390:93;:::i;:::-;16508:2;16503:3;16499:12;16492:19;;16151:366;;;:::o;16523:::-;16665:3;16686:67;16750:2;16745:3;16686:67;:::i;:::-;16679:74;;16762:93;16851:3;16762:93;:::i;:::-;16880:2;16875:3;16871:12;16864:19;;16523:366;;;:::o;16895:::-;17037:3;17058:67;17122:2;17117:3;17058:67;:::i;:::-;17051:74;;17134:93;17223:3;17134:93;:::i;:::-;17252:2;17247:3;17243:12;17236:19;;16895:366;;;:::o;17267:::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17267:366;;;:::o;17639:::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17639:366;;;:::o;18011:::-;18153:3;18174:67;18238:2;18233:3;18174:67;:::i;:::-;18167:74;;18250:93;18339:3;18250:93;:::i;:::-;18368:2;18363:3;18359:12;18352:19;;18011:366;;;:::o;18383:::-;18525:3;18546:67;18610:2;18605:3;18546:67;:::i;:::-;18539:74;;18622:93;18711:3;18622:93;:::i;:::-;18740:2;18735:3;18731:12;18724:19;;18383:366;;;:::o;18755:::-;18897:3;18918:67;18982:2;18977:3;18918:67;:::i;:::-;18911:74;;18994:93;19083:3;18994:93;:::i;:::-;19112:2;19107:3;19103:12;19096:19;;18755:366;;;:::o;19127:398::-;19286:3;19307:83;19388:1;19383:3;19307:83;:::i;:::-;19300:90;;19399:93;19488:3;19399:93;:::i;:::-;19517:1;19512:3;19508:11;19501:18;;19127:398;;;:::o;19531:366::-;19673:3;19694:67;19758:2;19753:3;19694:67;:::i;:::-;19687:74;;19770:93;19859:3;19770:93;:::i;:::-;19888:2;19883:3;19879:12;19872:19;;19531:366;;;:::o;19903:::-;20045:3;20066:67;20130:2;20125:3;20066:67;:::i;:::-;20059:74;;20142:93;20231:3;20142:93;:::i;:::-;20260:2;20255:3;20251:12;20244:19;;19903:366;;;:::o;20275:::-;20417:3;20438:67;20502:2;20497:3;20438:67;:::i;:::-;20431:74;;20514:93;20603:3;20514:93;:::i;:::-;20632:2;20627:3;20623:12;20616:19;;20275:366;;;:::o;20647:118::-;20734:24;20752:5;20734:24;:::i;:::-;20729:3;20722:37;20647:118;;:::o;20771:493::-;20959:3;20974:75;21045:3;21036:6;20974:75;:::i;:::-;21074:2;21069:3;21065:12;21058:19;;21087:123;21206:3;21197:6;21087:123;:::i;:::-;21235:2;21230:3;21226:12;21219:19;;21255:3;21248:10;;20771:493;;;;;:::o;21270:435::-;21450:3;21472:95;21563:3;21554:6;21472:95;:::i;:::-;21465:102;;21584:95;21675:3;21666:6;21584:95;:::i;:::-;21577:102;;21696:3;21689:10;;21270:435;;;;;:::o;21711:379::-;21895:3;21917:147;22060:3;21917:147;:::i;:::-;21910:154;;22081:3;22074:10;;21711:379;;;:::o;22096:222::-;22189:4;22227:2;22216:9;22212:18;22204:26;;22240:71;22308:1;22297:9;22293:17;22284:6;22240:71;:::i;:::-;22096:222;;;;:::o;22324:640::-;22519:4;22557:3;22546:9;22542:19;22534:27;;22571:71;22639:1;22628:9;22624:17;22615:6;22571:71;:::i;:::-;22652:72;22720:2;22709:9;22705:18;22696:6;22652:72;:::i;:::-;22734;22802:2;22791:9;22787:18;22778:6;22734:72;:::i;:::-;22853:9;22847:4;22843:20;22838:2;22827:9;22823:18;22816:48;22881:76;22952:4;22943:6;22881:76;:::i;:::-;22873:84;;22324:640;;;;;;;:::o;22970:332::-;23091:4;23129:2;23118:9;23114:18;23106:26;;23142:71;23210:1;23199:9;23195:17;23186:6;23142:71;:::i;:::-;23223:72;23291:2;23280:9;23276:18;23267:6;23223:72;:::i;:::-;22970:332;;;;;:::o;23308:210::-;23395:4;23433:2;23422:9;23418:18;23410:26;;23446:65;23508:1;23497:9;23493:17;23484:6;23446:65;:::i;:::-;23308:210;;;;:::o;23524:222::-;23617:4;23655:2;23644:9;23640:18;23632:26;;23668:71;23736:1;23725:9;23721:17;23712:6;23668:71;:::i;:::-;23524:222;;;;:::o;23752:266::-;23867:4;23905:2;23894:9;23890:18;23882:26;;23918:93;24008:1;23997:9;23993:17;23984:6;23918:93;:::i;:::-;23752:266;;;;:::o;24024:313::-;24137:4;24175:2;24164:9;24160:18;24152:26;;24224:9;24218:4;24214:20;24210:1;24199:9;24195:17;24188:47;24252:78;24325:4;24316:6;24252:78;:::i;:::-;24244:86;;24024:313;;;;:::o;24343:419::-;24509:4;24547:2;24536:9;24532:18;24524:26;;24596:9;24590:4;24586:20;24582:1;24571:9;24567:17;24560:47;24624:131;24750:4;24624:131;:::i;:::-;24616:139;;24343:419;;;:::o;24768:::-;24934:4;24972:2;24961:9;24957:18;24949:26;;25021:9;25015:4;25011:20;25007:1;24996:9;24992:17;24985:47;25049:131;25175:4;25049:131;:::i;:::-;25041:139;;24768:419;;;:::o;25193:::-;25359:4;25397:2;25386:9;25382:18;25374:26;;25446:9;25440:4;25436:20;25432:1;25421:9;25417:17;25410:47;25474:131;25600:4;25474:131;:::i;:::-;25466:139;;25193:419;;;:::o;25618:::-;25784:4;25822:2;25811:9;25807:18;25799:26;;25871:9;25865:4;25861:20;25857:1;25846:9;25842:17;25835:47;25899:131;26025:4;25899:131;:::i;:::-;25891:139;;25618:419;;;:::o;26043:::-;26209:4;26247:2;26236:9;26232:18;26224:26;;26296:9;26290:4;26286:20;26282:1;26271:9;26267:17;26260:47;26324:131;26450:4;26324:131;:::i;:::-;26316:139;;26043:419;;;:::o;26468:::-;26634:4;26672:2;26661:9;26657:18;26649:26;;26721:9;26715:4;26711:20;26707:1;26696:9;26692:17;26685:47;26749:131;26875:4;26749:131;:::i;:::-;26741:139;;26468:419;;;:::o;26893:::-;27059:4;27097:2;27086:9;27082:18;27074:26;;27146:9;27140:4;27136:20;27132:1;27121:9;27117:17;27110:47;27174:131;27300:4;27174:131;:::i;:::-;27166:139;;26893:419;;;:::o;27318:::-;27484:4;27522:2;27511:9;27507:18;27499:26;;27571:9;27565:4;27561:20;27557:1;27546:9;27542:17;27535:47;27599:131;27725:4;27599:131;:::i;:::-;27591:139;;27318:419;;;:::o;27743:::-;27909:4;27947:2;27936:9;27932:18;27924:26;;27996:9;27990:4;27986:20;27982:1;27971:9;27967:17;27960:47;28024:131;28150:4;28024:131;:::i;:::-;28016:139;;27743:419;;;:::o;28168:::-;28334:4;28372:2;28361:9;28357:18;28349:26;;28421:9;28415:4;28411:20;28407:1;28396:9;28392:17;28385:47;28449:131;28575:4;28449:131;:::i;:::-;28441:139;;28168:419;;;:::o;28593:::-;28759:4;28797:2;28786:9;28782:18;28774:26;;28846:9;28840:4;28836:20;28832:1;28821:9;28817:17;28810:47;28874:131;29000:4;28874:131;:::i;:::-;28866:139;;28593:419;;;:::o;29018:::-;29184:4;29222:2;29211:9;29207:18;29199:26;;29271:9;29265:4;29261:20;29257:1;29246:9;29242:17;29235:47;29299:131;29425:4;29299:131;:::i;:::-;29291:139;;29018:419;;;:::o;29443:::-;29609:4;29647:2;29636:9;29632:18;29624:26;;29696:9;29690:4;29686:20;29682:1;29671:9;29667:17;29660:47;29724:131;29850:4;29724:131;:::i;:::-;29716:139;;29443:419;;;:::o;29868:::-;30034:4;30072:2;30061:9;30057:18;30049:26;;30121:9;30115:4;30111:20;30107:1;30096:9;30092:17;30085:47;30149:131;30275:4;30149:131;:::i;:::-;30141:139;;29868:419;;;:::o;30293:::-;30459:4;30497:2;30486:9;30482:18;30474:26;;30546:9;30540:4;30536:20;30532:1;30521:9;30517:17;30510:47;30574:131;30700:4;30574:131;:::i;:::-;30566:139;;30293:419;;;:::o;30718:::-;30884:4;30922:2;30911:9;30907:18;30899:26;;30971:9;30965:4;30961:20;30957:1;30946:9;30942:17;30935:47;30999:131;31125:4;30999:131;:::i;:::-;30991:139;;30718:419;;;:::o;31143:::-;31309:4;31347:2;31336:9;31332:18;31324:26;;31396:9;31390:4;31386:20;31382:1;31371:9;31367:17;31360:47;31424:131;31550:4;31424:131;:::i;:::-;31416:139;;31143:419;;;:::o;31568:::-;31734:4;31772:2;31761:9;31757:18;31749:26;;31821:9;31815:4;31811:20;31807:1;31796:9;31792:17;31785:47;31849:131;31975:4;31849:131;:::i;:::-;31841:139;;31568:419;;;:::o;31993:::-;32159:4;32197:2;32186:9;32182:18;32174:26;;32246:9;32240:4;32236:20;32232:1;32221:9;32217:17;32210:47;32274:131;32400:4;32274:131;:::i;:::-;32266:139;;31993:419;;;:::o;32418:::-;32584:4;32622:2;32611:9;32607:18;32599:26;;32671:9;32665:4;32661:20;32657:1;32646:9;32642:17;32635:47;32699:131;32825:4;32699:131;:::i;:::-;32691:139;;32418:419;;;:::o;32843:::-;33009:4;33047:2;33036:9;33032:18;33024:26;;33096:9;33090:4;33086:20;33082:1;33071:9;33067:17;33060:47;33124:131;33250:4;33124:131;:::i;:::-;33116:139;;32843:419;;;:::o;33268:::-;33434:4;33472:2;33461:9;33457:18;33449:26;;33521:9;33515:4;33511:20;33507:1;33496:9;33492:17;33485:47;33549:131;33675:4;33549:131;:::i;:::-;33541:139;;33268:419;;;:::o;33693:::-;33859:4;33897:2;33886:9;33882:18;33874:26;;33946:9;33940:4;33936:20;33932:1;33921:9;33917:17;33910:47;33974:131;34100:4;33974:131;:::i;:::-;33966:139;;33693:419;;;:::o;34118:::-;34284:4;34322:2;34311:9;34307:18;34299:26;;34371:9;34365:4;34361:20;34357:1;34346:9;34342:17;34335:47;34399:131;34525:4;34399:131;:::i;:::-;34391:139;;34118:419;;;:::o;34543:222::-;34636:4;34674:2;34663:9;34659:18;34651:26;;34687:71;34755:1;34744:9;34740:17;34731:6;34687:71;:::i;:::-;34543:222;;;;:::o;34771:129::-;34805:6;34832:20;;:::i;:::-;34822:30;;34861:33;34889:4;34881:6;34861:33;:::i;:::-;34771:129;;;:::o;34906:75::-;34939:6;34972:2;34966:9;34956:19;;34906:75;:::o;34987:307::-;35048:4;35138:18;35130:6;35127:30;35124:56;;;35160:18;;:::i;:::-;35124:56;35198:29;35220:6;35198:29;:::i;:::-;35190:37;;35282:4;35276;35272:15;35264:23;;34987:307;;;:::o;35300:308::-;35362:4;35452:18;35444:6;35441:30;35438:56;;;35474:18;;:::i;:::-;35438:56;35512:29;35534:6;35512:29;:::i;:::-;35504:37;;35596:4;35590;35586:15;35578:23;;35300:308;;;:::o;35614:98::-;35665:6;35699:5;35693:12;35683:22;;35614:98;;;:::o;35718:99::-;35770:6;35804:5;35798:12;35788:22;;35718:99;;;:::o;35823:168::-;35906:11;35940:6;35935:3;35928:19;35980:4;35975:3;35971:14;35956:29;;35823:168;;;;:::o;35997:147::-;36098:11;36135:3;36120:18;;35997:147;;;;:::o;36150:169::-;36234:11;36268:6;36263:3;36256:19;36308:4;36303:3;36299:14;36284:29;;36150:169;;;;:::o;36325:148::-;36427:11;36464:3;36449:18;;36325:148;;;;:::o;36479:305::-;36519:3;36538:20;36556:1;36538:20;:::i;:::-;36533:25;;36572:20;36590:1;36572:20;:::i;:::-;36567:25;;36726:1;36658:66;36654:74;36651:1;36648:81;36645:107;;;36732:18;;:::i;:::-;36645:107;36776:1;36773;36769:9;36762:16;;36479:305;;;;:::o;36790:185::-;36830:1;36847:20;36865:1;36847:20;:::i;:::-;36842:25;;36881:20;36899:1;36881:20;:::i;:::-;36876:25;;36920:1;36910:35;;36925:18;;:::i;:::-;36910:35;36967:1;36964;36960:9;36955:14;;36790:185;;;;:::o;36981:348::-;37021:7;37044:20;37062:1;37044:20;:::i;:::-;37039:25;;37078:20;37096:1;37078:20;:::i;:::-;37073:25;;37266:1;37198:66;37194:74;37191:1;37188:81;37183:1;37176:9;37169:17;37165:105;37162:131;;;37273:18;;:::i;:::-;37162:131;37321:1;37318;37314:9;37303:20;;36981:348;;;;:::o;37335:191::-;37375:4;37395:20;37413:1;37395:20;:::i;:::-;37390:25;;37429:20;37447:1;37429:20;:::i;:::-;37424:25;;37468:1;37465;37462:8;37459:34;;;37473:18;;:::i;:::-;37459:34;37518:1;37515;37511:9;37503:17;;37335:191;;;;:::o;37532:96::-;37569:7;37598:24;37616:5;37598:24;:::i;:::-;37587:35;;37532:96;;;:::o;37634:90::-;37668:7;37711:5;37704:13;37697:21;37686:32;;37634:90;;;:::o;37730:77::-;37767:7;37796:5;37785:16;;37730:77;;;:::o;37813:149::-;37849:7;37889:66;37882:5;37878:78;37867:89;;37813:149;;;:::o;37968:126::-;38005:7;38045:42;38038:5;38034:54;38023:65;;37968:126;;;:::o;38100:77::-;38137:7;38166:5;38155:16;;38100:77;;;:::o;38183:148::-;38255:9;38288:37;38319:5;38288:37;:::i;:::-;38275:50;;38183:148;;;:::o;38337:126::-;38387:9;38420:37;38451:5;38420:37;:::i;:::-;38407:50;;38337:126;;;:::o;38469:113::-;38519:9;38552:24;38570:5;38552:24;:::i;:::-;38539:37;;38469:113;;;:::o;38588:154::-;38672:6;38667:3;38662;38649:30;38734:1;38725:6;38720:3;38716:16;38709:27;38588:154;;;:::o;38748:307::-;38816:1;38826:113;38840:6;38837:1;38834:13;38826:113;;;38925:1;38920:3;38916:11;38910:18;38906:1;38901:3;38897:11;38890:39;38862:2;38859:1;38855:10;38850:15;;38826:113;;;38957:6;38954:1;38951:13;38948:101;;;39037:1;39028:6;39023:3;39019:16;39012:27;38948:101;38797:258;38748:307;;;:::o;39061:320::-;39105:6;39142:1;39136:4;39132:12;39122:22;;39189:1;39183:4;39179:12;39210:18;39200:81;;39266:4;39258:6;39254:17;39244:27;;39200:81;39328:2;39320:6;39317:14;39297:18;39294:38;39291:84;;;39347:18;;:::i;:::-;39291:84;39112:269;39061:320;;;:::o;39387:281::-;39470:27;39492:4;39470:27;:::i;:::-;39462:6;39458:40;39600:6;39588:10;39585:22;39564:18;39552:10;39549:34;39546:62;39543:88;;;39611:18;;:::i;:::-;39543:88;39651:10;39647:2;39640:22;39430:238;39387:281;;:::o;39674:233::-;39713:3;39736:24;39754:5;39736:24;:::i;:::-;39727:33;;39782:66;39775:5;39772:77;39769:103;;;39852:18;;:::i;:::-;39769:103;39899:1;39892:5;39888:13;39881:20;;39674:233;;;:::o;39913:100::-;39952:7;39981:26;40001:5;39981:26;:::i;:::-;39970:37;;39913:100;;;:::o;40019:94::-;40058:7;40087:20;40101:5;40087:20;:::i;:::-;40076:31;;40019:94;;;:::o;40119:176::-;40151:1;40168:20;40186:1;40168:20;:::i;:::-;40163:25;;40202:20;40220:1;40202:20;:::i;:::-;40197:25;;40241:1;40231:35;;40246:18;;:::i;:::-;40231:35;40287:1;40284;40280:9;40275:14;;40119:176;;;;:::o;40301:180::-;40349:77;40346:1;40339:88;40446:4;40443:1;40436:15;40470:4;40467:1;40460:15;40487:180;40535:77;40532:1;40525:88;40632:4;40629:1;40622:15;40656:4;40653:1;40646:15;40673:180;40721:77;40718:1;40711:88;40818:4;40815:1;40808:15;40842:4;40839:1;40832:15;40859:180;40907:77;40904:1;40897:88;41004:4;41001:1;40994:15;41028:4;41025:1;41018:15;41045:180;41093:77;41090:1;41083:88;41190:4;41187:1;41180:15;41214:4;41211:1;41204:15;41231:180;41279:77;41276:1;41269:88;41376:4;41373:1;41366:15;41400:4;41397:1;41390:15;41417:117;41526:1;41523;41516:12;41540:117;41649:1;41646;41639:12;41663:117;41772:1;41769;41762:12;41786:117;41895:1;41892;41885:12;41909:117;42018:1;42015;42008:12;42032:117;42141:1;42138;42131:12;42155:102;42196:6;42247:2;42243:7;42238:2;42231:5;42227:14;42223:28;42213:38;;42155:102;;;:::o;42263:94::-;42296:8;42344:5;42340:2;42336:14;42315:35;;42263:94;;;:::o;42363:178::-;42503:30;42499:1;42491:6;42487:14;42480:54;42363:178;:::o;42547:175::-;42687:27;42683:1;42675:6;42671:14;42664:51;42547:175;:::o;42728:230::-;42868:34;42864:1;42856:6;42852:14;42845:58;42937:13;42932:2;42924:6;42920:15;42913:38;42728:230;:::o;42964:237::-;43104:34;43100:1;43092:6;43088:14;43081:58;43173:20;43168:2;43160:6;43156:15;43149:45;42964:237;:::o;43207:225::-;43347:34;43343:1;43335:6;43331:14;43324:58;43416:8;43411:2;43403:6;43399:15;43392:33;43207:225;:::o;43438:224::-;43578:34;43574:1;43566:6;43562:14;43555:58;43647:7;43642:2;43634:6;43630:15;43623:32;43438:224;:::o;43668:178::-;43808:30;43804:1;43796:6;43792:14;43785:54;43668:178;:::o;43852:223::-;43992:34;43988:1;43980:6;43976:14;43969:58;44061:6;44056:2;44048:6;44044:15;44037:31;43852:223;:::o;44081:170::-;44221:22;44217:1;44209:6;44205:14;44198:46;44081:170;:::o;44257:175::-;44397:27;44393:1;44385:6;44381:14;44374:51;44257:175;:::o;44438:231::-;44578:34;44574:1;44566:6;44562:14;44555:58;44647:14;44642:2;44634:6;44630:15;44623:39;44438:231;:::o;44675:243::-;44815:34;44811:1;44803:6;44799:14;44792:58;44884:26;44879:2;44871:6;44867:15;44860:51;44675:243;:::o;44924:229::-;45064:34;45060:1;45052:6;45048:14;45041:58;45133:12;45128:2;45120:6;45116:15;45109:37;44924:229;:::o;45159:228::-;45299:34;45295:1;45287:6;45283:14;45276:58;45368:11;45363:2;45355:6;45351:15;45344:36;45159:228;:::o;45393:182::-;45533:34;45529:1;45521:6;45517:14;45510:58;45393:182;:::o;45581:231::-;45721:34;45717:1;45709:6;45705:14;45698:58;45790:14;45785:2;45777:6;45773:15;45766:39;45581:231;:::o;45818:182::-;45958:34;45954:1;45946:6;45942:14;45935:58;45818:182;:::o;46006:234::-;46146:34;46142:1;46134:6;46130:14;46123:58;46215:17;46210:2;46202:6;46198:15;46191:42;46006:234;:::o;46246:176::-;46386:28;46382:1;46374:6;46370:14;46363:52;46246:176;:::o;46428:220::-;46568:34;46564:1;46556:6;46552:14;46545:58;46637:3;46632:2;46624:6;46620:15;46613:28;46428:220;:::o;46654:165::-;46794:17;46790:1;46782:6;46778:14;46771:41;46654:165;:::o;46825:114::-;;:::o;46945:236::-;47085:34;47081:1;47073:6;47069:14;47062:58;47154:19;47149:2;47141:6;47137:15;47130:44;46945:236;:::o;47187:231::-;47327:34;47323:1;47315:6;47311:14;47304:58;47396:14;47391:2;47383:6;47379:15;47372:39;47187:231;:::o;47424:165::-;47564:17;47560:1;47552:6;47548:14;47541:41;47424:165;:::o;47595:122::-;47668:24;47686:5;47668:24;:::i;:::-;47661:5;47658:35;47648:63;;47707:1;47704;47697:12;47648:63;47595:122;:::o;47723:116::-;47793:21;47808:5;47793:21;:::i;:::-;47786:5;47783:32;47773:60;;47829:1;47826;47819:12;47773:60;47723:116;:::o;47845:122::-;47918:24;47936:5;47918:24;:::i;:::-;47911:5;47908:35;47898:63;;47957:1;47954;47947:12;47898:63;47845:122;:::o;47973:120::-;48045:23;48062:5;48045:23;:::i;:::-;48038:5;48035:34;48025:62;;48083:1;48080;48073:12;48025:62;47973:120;:::o;48099:122::-;48172:24;48190:5;48172:24;:::i;:::-;48165:5;48162:35;48152:63;;48211:1;48208;48201:12;48152:63;48099:122;:::o

Swarm Source

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