ETH Price: $3,335.54 (-1.17%)
Gas: 3.01 Gwei

Token

Cascade (CAS)
 

Overview

Max Total Supply

1,000 CAS

Holders

528

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
chiapudding.eth
Balance
1 CAS
0xd7efae6e8e0556ebb5e77a499a34fce6a4d8c722
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Cascade

Compiler Version
v0.8.5+commit.a4f2e591

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT
// 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/IERC721.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// 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: @openzeppelin/contracts/access/Ownable.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: src/contracts/Cascade.sol

// Cascade by TinkRNG, launched on April 6, 2022
pragma solidity ^0.8.4;



contract Cascade is ERC721Enumerable, Ownable {
    enum Status {
        NOT_LIVE,
        PRESALE,
        PUBLIC_MINT
    }
    Status public state = Status.NOT_LIVE;

    uint256 private _tokenIds = 0;

    uint256 public constant MAX_MINT = 1000;

    uint256 public constant mintPrice = .1 ether;
    uint256 public constant maxMintAmountFoundation = 6;

    string public baseURI;
    string public metadataURI;

    //Use Merkletree for whitelist because high number of addresses
    //Using mappings for rest because n <= ~10
    bytes32 private constant whitelistRoot =
        0xf7cb41ba0b969122985f7cf8f63520950b2cdb4f3bd2654c233b6a0cc55af913;
    mapping(address => bool) foundationHolderWallets;
    mapping(address => uint256) modAllocation;

    mapping(address => bool) _presaleAccountClaimed;

    //**************************************************************************
    //Constructor
    //**************************************************************************
    constructor() payable ERC721("Cascade", "CAS") {
        //Hardcode foundation piece owner addresses
        foundationHolderWallets[
            0xdb27B0b5dE1a7e84ce6c677d70D0Be015431FF8a
        ] = true;
        foundationHolderWallets[
            0xfAB22550fcD520A7eCED27414CD74Bc70a6ac1a9
        ] = true;
        foundationHolderWallets[
            0x646F2CD15D6f270DcF710f554D826aaaAa068cF5
        ] = true;
        foundationHolderWallets[
            0xDE8A37645bc06D318a7120F56e72ad5de877760a
        ] = true;
        foundationHolderWallets[
            0xECC311409A5F02148FD6a41f2e25e863D3D6998A
        ] = true;
        foundationHolderWallets[
            0x0000a83Deaa073245cfbdE660FD8dAf09d78de00
        ] = true;
        foundationHolderWallets[
            0x701Ab5e96C054E7aea144ba3430b7Ff55E5986b6
        ] = true;

        //Hardcode mods mints allowed
        modAllocation[0xe6B9F6b9cC3DAC911976008b131c2Ca634D576c5] = 15;
        modAllocation[0xd576374cDBa84D3a9e4fa28F5Fe3945D8469D275] = 10;
        modAllocation[0xFB7Bd40d9CB6bC167b938adD3218188ECf064584] = 10;

        modAllocation[0xf3e2Db992d3f5E5eC6671680Ac23BF6e01CE1F05] = 4;
        modAllocation[0xf506423A1D4aC3a7CECD4c290cf94f5a577A9cF0] = 3;
        modAllocation[0xEE0db089D98DAFa516538b336184cf6B135a8Be0] = 2;
        modAllocation[0x9b9CE21a0947C6C7bc71809095f0548a188B65ff] = 1;
        modAllocation[0xC7C6C02d917a3e97cefd695CeB6676C07db1748F] = 1;
        modAllocation[0x81D1f53417B9b4828206FCA420bf49b17fE0814D] = 1;
        modAllocation[0x0BF3f0Ea42C77bfC2900217eE99001c1Fcd101c0] = 1;
        modAllocation[0x35cd8257A8Aa2797aD8760136c54D012629E074E] = 1;
        modAllocation[0x888f8AA938dbb18b28bdD111fa4A0D3B8e10C871] = 2;
        modAllocation[0xAebD74660a350879Ffd6a2BD72A1Cf22B9d5e686] = 1;
        modAllocation[0xf2d696E7b3e040B160D658dE02C00A4Ef5Be1bC0] = 1;
        modAllocation[0x4d5F10aD4a576a0A5C387C6d77779E3079566f16] = 1;
    }

    //**************************************************************************
    //URI Functions
    //**************************************************************************

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

    function contractURI() public view returns (string memory) {
        return metadataURI;
    }

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

    function setMetadataURI(string memory _newMetadataURI) public onlyOwner {
        metadataURI = _newMetadataURI;
    }

    //**************************************************************************
    //State Functions
    //**************************************************************************
    function setSaleState(Status _state) external onlyOwner {
        state = _state;
    }

    //**************************************************************************
    //Security Functions
    //**************************************************************************
    function _verifyWhitelist(bytes32 _leafNode, bytes32[] memory proof)
        internal
        pure
        returns (bool)
    {
        return MerkleProof.verify(proof, whitelistRoot, _leafNode);
    }

    function _leaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    //**************************************************************************
    //Modifiers
    //**************************************************************************
    modifier presaleCheck() {
        require(state == Status.PRESALE, "Presale not live");
        require(!_presaleAccountClaimed[msg.sender], "Already minted presale");
        _;
    }

    //**************************************************************************
    //Minting Functions
    //**************************************************************************
    function _mintInternal(uint256 quantity) internal {
        require(msg.sender == tx.origin, "Contract Interaction Not Allowed");
        require(totalSupply() + quantity <= MAX_MINT, "Exceed Max Supply");

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

    function mintFree() external payable presaleCheck {
        uint256 availableMintForMod = modAllocation[msg.sender];
        require(availableMintForMod > 0, "Not mod");

        _presaleAccountClaimed[msg.sender] = true;
        _mintInternal(availableMintForMod);
    }

    function mintFoundation(uint256 quantity) external payable presaleCheck {
        require(
            foundationHolderWallets[msg.sender],
            "Not foundation piece owner"
        );
        require(quantity > 0, "Invalid quantity");
        require(quantity <= maxMintAmountFoundation, "Invalid quantity");
        require(
            msg.value >= mintPrice * (quantity - 1),
            "Insufficient funds"
        );

        _presaleAccountClaimed[msg.sender] = true;
        _mintInternal(quantity);
    }

    function mintWhitelist(bytes32[] calldata _whitelistProof)
        external
        payable
        presaleCheck
    {
        bytes32 leaf = _leaf(msg.sender);
        require(_verifyWhitelist(leaf, _whitelistProof), "Not on whitelist");
        require(msg.value >= mintPrice, "Insufficient funds");

        _presaleAccountClaimed[msg.sender] = true;
        _mintInternal(1);
    }

    function mintPublic() external payable {
        require(state == Status.PUBLIC_MINT, "Public mint not live");
        require(msg.value >= mintPrice, "Insufficient funds");

        _mintInternal(1);
    }

    //**************************************************************************
    //Withdraw Functions
    //**************************************************************************
    function withdraw(address payable _to, uint256 _amount) public onlyOwner {
        _to.transfer(_amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"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":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAmountFoundation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintFoundation","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFree","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_whitelistProof","type":"bytes32[]"}],"name":"mintWhitelist","outputs":[],"stateMutability":"payable","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newMetadataURI","type":"string"}],"name":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Cascade.Status","name":"_state","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"enum Cascade.Status","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff021916908360028111156200002d576200002c62000ad9565b5b02179055506000600b556040518060400160405280600781526020017f43617363616465000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f43415300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620009f3565b508060019080519060200190620000d4929190620009f3565b505050620000f7620000eb6200092560201b60201c565b6200092d60201b60201c565b6001600e600073db27b0b5de1a7e84ce6c677d70d0be015431ff8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e600073fab22550fcd520a7eced27414cd74bc70a6ac1a973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e600073646f2cd15d6f270dcf710f554d826aaaaa068cf573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e600073de8a37645bc06d318a7120f56e72ad5de877760a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e600073ecc311409a5f02148fd6a41f2e25e863d3d6998a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e600071a83deaa073245cfbde660fd8daf09d78de0073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600e600073701ab5e96c054e7aea144ba3430b7ff55e5986b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600f80600073e6b9f6b9cc3dac911976008b131c2ca634d576c573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600a600f600073d576374cdba84d3a9e4fa28f5fe3945d8469d27573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600a600f600073fb7bd40d9cb6bc167b938add3218188ecf06458473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506004600f600073f3e2db992d3f5e5ec6671680ac23bf6e01ce1f0573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506003600f600073f506423a1d4ac3a7cecd4c290cf94f5a577a9cf073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506002600f600073ee0db089d98dafa516538b336184cf6b135a8be073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600f6000739b9ce21a0947c6c7bc71809095f0548a188b65ff73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600f600073c7c6c02d917a3e97cefd695ceb6676c07db1748f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600f60007381d1f53417b9b4828206fca420bf49b17fe0814d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600f6000730bf3f0ea42c77bfc2900217ee99001c1fcd101c073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600f60007335cd8257a8aa2797ad8760136c54d012629e074e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506002600f600073888f8aa938dbb18b28bdd111fa4a0d3b8e10c87173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600f600073aebd74660a350879ffd6a2bd72a1cf22b9d5e68673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600f600073f2d696e7b3e040b160d658de02c00a4ef5be1bc073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600f6000734d5f10ad4a576a0a5c387c6d77779e3079566f1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555062000b37565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000a019062000aa3565b90600052602060002090601f01602090048101928262000a25576000855562000a71565b82601f1062000a4057805160ff191683800117855562000a71565b8280016001018555821562000a71579182015b8281111562000a7057825182559160200191906001019062000a53565b5b50905062000a80919062000a84565b5090565b5b8082111562000a9f57600081600090555060010162000a85565b5090565b6000600282049050600182168062000abc57607f821691505b6020821081141562000ad35762000ad262000b08565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614e098062000b476000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063b88d4fde116100a0578063e8a3d4851161006f578063e8a3d485146106d7578063e985e9c514610702578063f0292a031461073f578063f2fde38b1461076a578063f3fef3a314610793576101f9565b8063b88d4fde1461062a578063c19d93fb14610653578063c87b56dd1461067e578063d6ef3710146106bb576101f9565b80638c874ebd116100dc5780638c874ebd146105a15780638da5cb5b146105ab57806395d89b41146105d6578063a22cb46514610601576101f9565b806370a082311461051a578063715018a614610557578063750521f51461056e5780638ab5344714610597576101f9565b80632f745c591161019057806355f804b31161015f57806355f804b3146104355780635a67de071461045e5780636352211e146104875780636817c76c146104c45780636c0360eb146104ef576101f9565b80632f745c591461037657806342842e0e146103b357806344d84381146103dc5780634f6ccce7146103f8576101f9565b8063081812fc116101cc578063081812fc146102bc578063095ea7b3146102f957806318160ddd1461032257806323b872dd1461034d576101f9565b806301ffc9a7146101fe57806303ee438c1461023b5780630479876c1461026657806306fdde0314610291575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906136fa565b6107bc565b6040516102329190613d67565b60405180910390f35b34801561024757600080fd5b50610250610836565b60405161025d9190613d9d565b60405180910390f35b34801561027257600080fd5b5061027b6108c4565b604051610288919061413f565b60405180910390f35b34801561029d57600080fd5b506102a66108c9565b6040516102b39190613d9d565b60405180910390f35b3480156102c857600080fd5b506102e360048036038101906102de91906137ca565b61095b565b6040516102f09190613d00565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061366d565b6109e0565b005b34801561032e57600080fd5b50610337610af8565b604051610344919061413f565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190613557565b610b05565b005b34801561038257600080fd5b5061039d6004803603810190610398919061366d565b610b65565b6040516103aa919061413f565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190613557565b610c0a565b005b6103f660048036038101906103f191906136ad565b610c2a565b005b34801561040457600080fd5b5061041f600480360381019061041a91906137ca565b610e76565b60405161042c919061413f565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190613781565b610ee7565b005b34801561046a57600080fd5b5061048560048036038101906104809190613754565b610f7d565b005b34801561049357600080fd5b506104ae60048036038101906104a991906137ca565b611026565b6040516104bb9190613d00565b60405180910390f35b3480156104d057600080fd5b506104d96110d8565b6040516104e6919061413f565b60405180910390f35b3480156104fb57600080fd5b506105046110e4565b6040516105119190613d9d565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c91906134aa565b611172565b60405161054e919061413f565b60405180910390f35b34801561056357600080fd5b5061056c61122a565b005b34801561057a57600080fd5b5061059560048036038101906105909190613781565b6112b2565b005b61059f611348565b005b6105a9611536565b005b3480156105b757600080fd5b506105c0611602565b6040516105cd9190613d00565b60405180910390f35b3480156105e257600080fd5b506105eb61162c565b6040516105f89190613d9d565b60405180910390f35b34801561060d57600080fd5b506106286004803603810190610623919061362d565b6116be565b005b34801561063657600080fd5b50610651600480360381019061064c91906135aa565b6116d4565b005b34801561065f57600080fd5b50610668611736565b6040516106759190613d82565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a091906137ca565b611749565b6040516106b29190613d9d565b60405180910390f35b6106d560048036038101906106d091906137ca565b6117f0565b005b3480156106e357600080fd5b506106ec611acc565b6040516106f99190613d9d565b60405180910390f35b34801561070e57600080fd5b5061072960048036038101906107249190613517565b611b5e565b6040516107369190613d67565b60405180910390f35b34801561074b57600080fd5b50610754611bf2565b604051610761919061413f565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906134aa565b611bf8565b005b34801561079f57600080fd5b506107ba60048036038101906107b591906134d7565b611cf0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082f575061082e82611db7565b5b9050919050565b600d805461084390614426565b80601f016020809104026020016040519081016040528092919081815260200182805461086f90614426565b80156108bc5780601f10610891576101008083540402835291602001916108bc565b820191906000526020600020905b81548152906001019060200180831161089f57829003601f168201915b505050505081565b600681565b6060600080546108d890614426565b80601f016020809104026020016040519081016040528092919081815260200182805461090490614426565b80156109515780601f1061092657610100808354040283529160200191610951565b820191906000526020600020905b81548152906001019060200180831161093457829003601f168201915b5050505050905090565b600061096682611e99565b6109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c9061401f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109eb82611026565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a539061407f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a7b611f05565b73ffffffffffffffffffffffffffffffffffffffff161480610aaa5750610aa981610aa4611f05565b611b5e565b5b610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613f5f565b60405180910390fd5b610af38383611f0d565b505050565b6000600880549050905090565b610b16610b10611f05565b82611fc6565b610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c906140bf565b60405180910390fd5b610b608383836120a4565b505050565b6000610b7083611172565b8210610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890613dff565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c25838383604051806020016040528060008152506116d4565b505050565b60016002811115610c3e57610c3d614585565b5b600a60149054906101000a900460ff166002811115610c6057610c5f614585565b5b14610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c979061409f565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2490613f1f565b60405180910390fd5b6000610d383361230b565b9050610d8581848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061233b565b610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90613ddf565b60405180910390fd5b67016345785d8a0000341015610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0690613f3f565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e716001612373565b505050565b6000610e80610af8565b8210610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb8906140df565b60405180910390fd5b60088281548110610ed557610ed4614612565b5b90600052602060002001549050919050565b610eef611f05565b73ffffffffffffffffffffffffffffffffffffffff16610f0d611602565b73ffffffffffffffffffffffffffffffffffffffff1614610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a9061403f565b60405180910390fd5b80600c9080519060200190610f7992919061323e565b5050565b610f85611f05565b73ffffffffffffffffffffffffffffffffffffffff16610fa3611602565b73ffffffffffffffffffffffffffffffffffffffff1614610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff09061403f565b60405180910390fd5b80600a60146101000a81548160ff0219169083600281111561101e5761101d614585565b5b021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690613fbf565b60405180910390fd5b80915050919050565b67016345785d8a000081565b600c80546110f190614426565b80601f016020809104026020016040519081016040528092919081815260200182805461111d90614426565b801561116a5780601f1061113f5761010080835404028352916020019161116a565b820191906000526020600020905b81548152906001019060200180831161114d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da90613f9f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611232611f05565b73ffffffffffffffffffffffffffffffffffffffff16611250611602565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d9061403f565b60405180910390fd5b6112b0600061247e565b565b6112ba611f05565b73ffffffffffffffffffffffffffffffffffffffff166112d8611602565b73ffffffffffffffffffffffffffffffffffffffff161461132e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113259061403f565b60405180910390fd5b80600d908051906020019061134492919061323e565b5050565b6001600281111561135c5761135b614585565b5b600a60149054906101000a900460ff16600281111561137e5761137d614585565b5b146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b59061409f565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290613f1f565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906140ff565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061153381612373565b50565b60028081111561154957611548614585565b5b600a60149054906101000a900460ff16600281111561156b5761156a614585565b5b146115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290613dbf565b60405180910390fd5b67016345785d8a00003410156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90613f3f565b60405180910390fd5b6116006001612373565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461163b90614426565b80601f016020809104026020016040519081016040528092919081815260200182805461166790614426565b80156116b45780601f10611689576101008083540402835291602001916116b4565b820191906000526020600020905b81548152906001019060200180831161169757829003601f168201915b5050505050905090565b6116d06116c9611f05565b8383612544565b5050565b6116e56116df611f05565b83611fc6565b611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b906140bf565b60405180910390fd5b611730848484846126b1565b50505050565b600a60149054906101000a900460ff1681565b606061175482611e99565b611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a9061405f565b60405180910390fd5b600061179d61270d565b905060008151116117bd57604051806020016040528060008152506117e8565b806117c78461279f565b6040516020016117d8929190613cdc565b6040516020818303038152906040525b915050919050565b6001600281111561180457611803614585565b5b600a60149054906101000a900460ff16600281111561182657611825614585565b5b14611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d9061409f565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90613f1f565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661197f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119769061411f565b60405180910390fd5b600081116119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990613f7f565b60405180910390fd5b6006811115611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd90613f7f565b60405180910390fd5b600181611a139190614305565b67016345785d8a0000611a2691906142ab565b341015611a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5f90613f3f565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ac981612373565b50565b6060600d8054611adb90614426565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0790614426565b8015611b545780601f10611b2957610100808354040283529160200191611b54565b820191906000526020600020905b815481529060010190602001808311611b3757829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6103e881565b611c00611f05565b73ffffffffffffffffffffffffffffffffffffffff16611c1e611602565b73ffffffffffffffffffffffffffffffffffffffff1614611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b9061403f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdb90613e3f565b60405180910390fd5b611ced8161247e565b50565b611cf8611f05565b73ffffffffffffffffffffffffffffffffffffffff16611d16611602565b73ffffffffffffffffffffffffffffffffffffffff1614611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d639061403f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611db2573d6000803e3d6000fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e8257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e925750611e9182612900565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f8083611026565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fd182611e99565b612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790613edf565b60405180910390fd5b600061201b83611026565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061208a57508373ffffffffffffffffffffffffffffffffffffffff166120728461095b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061209b575061209a8185611b5e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120c482611026565b73ffffffffffffffffffffffffffffffffffffffff161461211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190613e5f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561218a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218190613e9f565b60405180910390fd5b61219583838361296a565b6121a0600082611f0d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f09190614305565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122479190614224565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612306838383612a7e565b505050565b60008160405160200161231e9190613cc1565b604051602081830303815290604052805190602001209050919050565b600061236b827ff7cb41ba0b969122985f7cf8f63520950b2cdb4f3bd2654c233b6a0cc55af91360001b85612a83565b905092915050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d890613fdf565b60405180910390fd5b6103e8816123ed610af8565b6123f79190614224565b1115612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90613eff565b60405180910390fd5b60005b8181101561247a5761244f33600b54612a9a565b600b600081548092919061246290614489565b9190505550808061247290614489565b91505061243b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90613ebf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126a49190613d67565b60405180910390a3505050565b6126bc8484846120a4565b6126c884848484612ab8565b612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90613e1f565b60405180910390fd5b50505050565b6060600c805461271c90614426565b80601f016020809104026020016040519081016040528092919081815260200182805461274890614426565b80156127955780601f1061276a57610100808354040283529160200191612795565b820191906000526020600020905b81548152906001019060200180831161277857829003601f168201915b5050505050905090565b606060008214156127e7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128fb565b600082905060005b6000821461281957808061280290614489565b915050600a82612812919061427a565b91506127ef565b60008167ffffffffffffffff81111561283557612834614641565b5b6040519080825280601f01601f1916602001820160405280156128675781602001600182028036833780820191505090505b5090505b600085146128f4576001826128809190614305565b9150600a8561288f91906144f6565b603061289b9190614224565b60f81b8183815181106128b1576128b0614612565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128ed919061427a565b945061286b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612975838383612c4f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129b8576129b381612c54565b6129f7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129f6576129f58382612c9d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a3a57612a3581612e0a565b612a79565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a7857612a778282612edb565b5b5b505050565b505050565b600082612a908584612f5a565b1490509392505050565b612ab4828260405180602001604052806000815250612fcf565b5050565b6000612ad98473ffffffffffffffffffffffffffffffffffffffff1661302a565b15612c42578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b02611f05565b8786866040518563ffffffff1660e01b8152600401612b249493929190613d1b565b602060405180830381600087803b158015612b3e57600080fd5b505af1925050508015612b6f57506040513d601f19601f82011682018060405250810190612b6c9190613727565b60015b612bf2573d8060008114612b9f576040519150601f19603f3d011682016040523d82523d6000602084013e612ba4565b606091505b50600081511415612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be190613e1f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c47565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612caa84611172565b612cb49190614305565b9050600060076000848152602001908152602001600020549050818114612d99576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e1e9190614305565b9050600060096000848152602001908152602001600020549050600060088381548110612e4e57612e4d614612565b5b906000526020600020015490508060088381548110612e7057612e6f614612565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ebf57612ebe6145e3565b5b6001900381819060005260206000200160009055905550505050565b6000612ee683611172565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008082905060005b8451811015612fc4576000858281518110612f8157612f80614612565b5b60200260200101519050808311612fa357612f9c838261304d565b9250612fb0565b612fad818461304d565b92505b508080612fbc90614489565b915050612f63565b508091505092915050565b612fd98383613064565b612fe66000848484612ab8565b613025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301c90613e1f565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cb90613fff565b60405180910390fd5b6130dd81611e99565b1561311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311490613e7f565b60405180910390fd5b6131296000838361296a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131799190614224565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461323a60008383612a7e565b5050565b82805461324a90614426565b90600052602060002090601f01602090048101928261326c57600085556132b3565b82601f1061328557805160ff19168380011785556132b3565b828001600101855582156132b3579182015b828111156132b2578251825591602001919060010190613297565b5b5090506132c091906132c4565b5090565b5b808211156132dd5760008160009055506001016132c5565b5090565b60006132f46132ef8461417f565b61415a565b9050828152602081018484840111156133105761330f61467f565b5b61331b8482856143e4565b509392505050565b6000613336613331846141b0565b61415a565b9050828152602081018484840111156133525761335161467f565b5b61335d8482856143e4565b509392505050565b60008135905061337481614d50565b92915050565b60008135905061338981614d67565b92915050565b60008083601f8401126133a5576133a4614675565b5b8235905067ffffffffffffffff8111156133c2576133c1614670565b5b6020830191508360208202830111156133de576133dd61467a565b5b9250929050565b6000813590506133f481614d7e565b92915050565b60008135905061340981614d95565b92915050565b60008151905061341e81614d95565b92915050565b600082601f83011261343957613438614675565b5b81356134498482602086016132e1565b91505092915050565b60008135905061346181614dac565b92915050565b600082601f83011261347c5761347b614675565b5b813561348c848260208601613323565b91505092915050565b6000813590506134a481614dbc565b92915050565b6000602082840312156134c0576134bf614689565b5b60006134ce84828501613365565b91505092915050565b600080604083850312156134ee576134ed614689565b5b60006134fc8582860161337a565b925050602061350d85828601613495565b9150509250929050565b6000806040838503121561352e5761352d614689565b5b600061353c85828601613365565b925050602061354d85828601613365565b9150509250929050565b6000806000606084860312156135705761356f614689565b5b600061357e86828701613365565b935050602061358f86828701613365565b92505060406135a086828701613495565b9150509250925092565b600080600080608085870312156135c4576135c3614689565b5b60006135d287828801613365565b94505060206135e387828801613365565b93505060406135f487828801613495565b925050606085013567ffffffffffffffff81111561361557613614614684565b5b61362187828801613424565b91505092959194509250565b6000806040838503121561364457613643614689565b5b600061365285828601613365565b9250506020613663858286016133e5565b9150509250929050565b6000806040838503121561368457613683614689565b5b600061369285828601613365565b92505060206136a385828601613495565b9150509250929050565b600080602083850312156136c4576136c3614689565b5b600083013567ffffffffffffffff8111156136e2576136e1614684565b5b6136ee8582860161338f565b92509250509250929050565b6000602082840312156137105761370f614689565b5b600061371e848285016133fa565b91505092915050565b60006020828403121561373d5761373c614689565b5b600061374b8482850161340f565b91505092915050565b60006020828403121561376a57613769614689565b5b600061377884828501613452565b91505092915050565b60006020828403121561379757613796614689565b5b600082013567ffffffffffffffff8111156137b5576137b4614684565b5b6137c184828501613467565b91505092915050565b6000602082840312156137e0576137df614689565b5b60006137ee84828501613495565b91505092915050565b61380081614339565b82525050565b61381761381282614339565b6144d2565b82525050565b6138268161435d565b82525050565b6000613837826141e1565b61384181856141f7565b93506138518185602086016143f3565b61385a8161468e565b840191505092915050565b61386e816143d2565b82525050565b600061387f826141ec565b6138898185614208565b93506138998185602086016143f3565b6138a28161468e565b840191505092915050565b60006138b8826141ec565b6138c28185614219565b93506138d28185602086016143f3565b80840191505092915050565b60006138eb601483614208565b91506138f6826146ac565b602082019050919050565b600061390e601083614208565b9150613919826146d5565b602082019050919050565b6000613931602b83614208565b915061393c826146fe565b604082019050919050565b6000613954603283614208565b915061395f8261474d565b604082019050919050565b6000613977602683614208565b91506139828261479c565b604082019050919050565b600061399a602583614208565b91506139a5826147eb565b604082019050919050565b60006139bd601c83614208565b91506139c88261483a565b602082019050919050565b60006139e0602483614208565b91506139eb82614863565b604082019050919050565b6000613a03601983614208565b9150613a0e826148b2565b602082019050919050565b6000613a26602c83614208565b9150613a31826148db565b604082019050919050565b6000613a49601183614208565b9150613a548261492a565b602082019050919050565b6000613a6c601683614208565b9150613a7782614953565b602082019050919050565b6000613a8f601283614208565b9150613a9a8261497c565b602082019050919050565b6000613ab2603883614208565b9150613abd826149a5565b604082019050919050565b6000613ad5601083614208565b9150613ae0826149f4565b602082019050919050565b6000613af8602a83614208565b9150613b0382614a1d565b604082019050919050565b6000613b1b602983614208565b9150613b2682614a6c565b604082019050919050565b6000613b3e602083614208565b9150613b4982614abb565b602082019050919050565b6000613b61602083614208565b9150613b6c82614ae4565b602082019050919050565b6000613b84602c83614208565b9150613b8f82614b0d565b604082019050919050565b6000613ba7602083614208565b9150613bb282614b5c565b602082019050919050565b6000613bca602f83614208565b9150613bd582614b85565b604082019050919050565b6000613bed602183614208565b9150613bf882614bd4565b604082019050919050565b6000613c10601083614208565b9150613c1b82614c23565b602082019050919050565b6000613c33603183614208565b9150613c3e82614c4c565b604082019050919050565b6000613c56602c83614208565b9150613c6182614c9b565b604082019050919050565b6000613c79600783614208565b9150613c8482614cea565b602082019050919050565b6000613c9c601a83614208565b9150613ca782614d13565b602082019050919050565b613cbb816143c8565b82525050565b6000613ccd8284613806565b60148201915081905092915050565b6000613ce882856138ad565b9150613cf482846138ad565b91508190509392505050565b6000602082019050613d1560008301846137f7565b92915050565b6000608082019050613d3060008301876137f7565b613d3d60208301866137f7565b613d4a6040830185613cb2565b8181036060830152613d5c818461382c565b905095945050505050565b6000602082019050613d7c600083018461381d565b92915050565b6000602082019050613d976000830184613865565b92915050565b60006020820190508181036000830152613db78184613874565b905092915050565b60006020820190508181036000830152613dd8816138de565b9050919050565b60006020820190508181036000830152613df881613901565b9050919050565b60006020820190508181036000830152613e1881613924565b9050919050565b60006020820190508181036000830152613e3881613947565b9050919050565b60006020820190508181036000830152613e588161396a565b9050919050565b60006020820190508181036000830152613e788161398d565b9050919050565b60006020820190508181036000830152613e98816139b0565b9050919050565b60006020820190508181036000830152613eb8816139d3565b9050919050565b60006020820190508181036000830152613ed8816139f6565b9050919050565b60006020820190508181036000830152613ef881613a19565b9050919050565b60006020820190508181036000830152613f1881613a3c565b9050919050565b60006020820190508181036000830152613f3881613a5f565b9050919050565b60006020820190508181036000830152613f5881613a82565b9050919050565b60006020820190508181036000830152613f7881613aa5565b9050919050565b60006020820190508181036000830152613f9881613ac8565b9050919050565b60006020820190508181036000830152613fb881613aeb565b9050919050565b60006020820190508181036000830152613fd881613b0e565b9050919050565b60006020820190508181036000830152613ff881613b31565b9050919050565b6000602082019050818103600083015261401881613b54565b9050919050565b6000602082019050818103600083015261403881613b77565b9050919050565b6000602082019050818103600083015261405881613b9a565b9050919050565b6000602082019050818103600083015261407881613bbd565b9050919050565b6000602082019050818103600083015261409881613be0565b9050919050565b600060208201905081810360008301526140b881613c03565b9050919050565b600060208201905081810360008301526140d881613c26565b9050919050565b600060208201905081810360008301526140f881613c49565b9050919050565b6000602082019050818103600083015261411881613c6c565b9050919050565b6000602082019050818103600083015261413881613c8f565b9050919050565b60006020820190506141546000830184613cb2565b92915050565b6000614164614175565b90506141708282614458565b919050565b6000604051905090565b600067ffffffffffffffff82111561419a57614199614641565b5b6141a38261468e565b9050602081019050919050565b600067ffffffffffffffff8211156141cb576141ca614641565b5b6141d48261468e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061422f826143c8565b915061423a836143c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561426f5761426e614527565b5b828201905092915050565b6000614285826143c8565b9150614290836143c8565b9250826142a05761429f614556565b5b828204905092915050565b60006142b6826143c8565b91506142c1836143c8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142fa576142f9614527565b5b828202905092915050565b6000614310826143c8565b915061431b836143c8565b92508282101561432e5761432d614527565b5b828203905092915050565b6000614344826143a8565b9050919050565b6000614356826143a8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506143a382614d3c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006143dd82614395565b9050919050565b82818337600083830152505050565b60005b838110156144115780820151818401526020810190506143f6565b83811115614420576000848401525b50505050565b6000600282049050600182168061443e57607f821691505b60208210811415614452576144516145b4565b5b50919050565b6144618261468e565b810181811067ffffffffffffffff821117156144805761447f614641565b5b80604052505050565b6000614494826143c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144c7576144c6614527565b5b600182019050919050565b60006144dd826144e4565b9050919050565b60006144ef8261469f565b9050919050565b6000614501826143c8565b915061450c836143c8565b92508261451c5761451b614556565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c6963206d696e74206e6f74206c697665000000000000000000000000600082015250565b7f4e6f74206f6e2077686974656c69737400000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f457863656564204d617820537570706c79000000000000000000000000000000600082015250565b7f416c7265616479206d696e7465642070726573616c6500000000000000000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f436f6e747261637420496e746572616374696f6e204e6f7420416c6c6f776564600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206e6f74206c69766500000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f74206d6f6400000000000000000000000000000000000000000000000000600082015250565b7f4e6f7420666f756e646174696f6e207069656365206f776e6572000000000000600082015250565b60038110614d4d57614d4c614585565b5b50565b614d5981614339565b8114614d6457600080fd5b50565b614d708161434b565b8114614d7b57600080fd5b50565b614d878161435d565b8114614d9257600080fd5b50565b614d9e81614369565b8114614da957600080fd5b50565b60038110614db957600080fd5b50565b614dc5816143c8565b8114614dd057600080fd5b5056fea2646970667358221220c5eab65b17f8af86bbbf4c877a745450caf10d962c024ed75bf7bae7641225ca64736f6c63430008050033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063b88d4fde116100a0578063e8a3d4851161006f578063e8a3d485146106d7578063e985e9c514610702578063f0292a031461073f578063f2fde38b1461076a578063f3fef3a314610793576101f9565b8063b88d4fde1461062a578063c19d93fb14610653578063c87b56dd1461067e578063d6ef3710146106bb576101f9565b80638c874ebd116100dc5780638c874ebd146105a15780638da5cb5b146105ab57806395d89b41146105d6578063a22cb46514610601576101f9565b806370a082311461051a578063715018a614610557578063750521f51461056e5780638ab5344714610597576101f9565b80632f745c591161019057806355f804b31161015f57806355f804b3146104355780635a67de071461045e5780636352211e146104875780636817c76c146104c45780636c0360eb146104ef576101f9565b80632f745c591461037657806342842e0e146103b357806344d84381146103dc5780634f6ccce7146103f8576101f9565b8063081812fc116101cc578063081812fc146102bc578063095ea7b3146102f957806318160ddd1461032257806323b872dd1461034d576101f9565b806301ffc9a7146101fe57806303ee438c1461023b5780630479876c1461026657806306fdde0314610291575b600080fd5b34801561020a57600080fd5b50610225600480360381019061022091906136fa565b6107bc565b6040516102329190613d67565b60405180910390f35b34801561024757600080fd5b50610250610836565b60405161025d9190613d9d565b60405180910390f35b34801561027257600080fd5b5061027b6108c4565b604051610288919061413f565b60405180910390f35b34801561029d57600080fd5b506102a66108c9565b6040516102b39190613d9d565b60405180910390f35b3480156102c857600080fd5b506102e360048036038101906102de91906137ca565b61095b565b6040516102f09190613d00565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061366d565b6109e0565b005b34801561032e57600080fd5b50610337610af8565b604051610344919061413f565b60405180910390f35b34801561035957600080fd5b50610374600480360381019061036f9190613557565b610b05565b005b34801561038257600080fd5b5061039d6004803603810190610398919061366d565b610b65565b6040516103aa919061413f565b60405180910390f35b3480156103bf57600080fd5b506103da60048036038101906103d59190613557565b610c0a565b005b6103f660048036038101906103f191906136ad565b610c2a565b005b34801561040457600080fd5b5061041f600480360381019061041a91906137ca565b610e76565b60405161042c919061413f565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190613781565b610ee7565b005b34801561046a57600080fd5b5061048560048036038101906104809190613754565b610f7d565b005b34801561049357600080fd5b506104ae60048036038101906104a991906137ca565b611026565b6040516104bb9190613d00565b60405180910390f35b3480156104d057600080fd5b506104d96110d8565b6040516104e6919061413f565b60405180910390f35b3480156104fb57600080fd5b506105046110e4565b6040516105119190613d9d565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c91906134aa565b611172565b60405161054e919061413f565b60405180910390f35b34801561056357600080fd5b5061056c61122a565b005b34801561057a57600080fd5b5061059560048036038101906105909190613781565b6112b2565b005b61059f611348565b005b6105a9611536565b005b3480156105b757600080fd5b506105c0611602565b6040516105cd9190613d00565b60405180910390f35b3480156105e257600080fd5b506105eb61162c565b6040516105f89190613d9d565b60405180910390f35b34801561060d57600080fd5b506106286004803603810190610623919061362d565b6116be565b005b34801561063657600080fd5b50610651600480360381019061064c91906135aa565b6116d4565b005b34801561065f57600080fd5b50610668611736565b6040516106759190613d82565b60405180910390f35b34801561068a57600080fd5b506106a560048036038101906106a091906137ca565b611749565b6040516106b29190613d9d565b60405180910390f35b6106d560048036038101906106d091906137ca565b6117f0565b005b3480156106e357600080fd5b506106ec611acc565b6040516106f99190613d9d565b60405180910390f35b34801561070e57600080fd5b5061072960048036038101906107249190613517565b611b5e565b6040516107369190613d67565b60405180910390f35b34801561074b57600080fd5b50610754611bf2565b604051610761919061413f565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906134aa565b611bf8565b005b34801561079f57600080fd5b506107ba60048036038101906107b591906134d7565b611cf0565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082f575061082e82611db7565b5b9050919050565b600d805461084390614426565b80601f016020809104026020016040519081016040528092919081815260200182805461086f90614426565b80156108bc5780601f10610891576101008083540402835291602001916108bc565b820191906000526020600020905b81548152906001019060200180831161089f57829003601f168201915b505050505081565b600681565b6060600080546108d890614426565b80601f016020809104026020016040519081016040528092919081815260200182805461090490614426565b80156109515780601f1061092657610100808354040283529160200191610951565b820191906000526020600020905b81548152906001019060200180831161093457829003601f168201915b5050505050905090565b600061096682611e99565b6109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c9061401f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109eb82611026565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a539061407f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a7b611f05565b73ffffffffffffffffffffffffffffffffffffffff161480610aaa5750610aa981610aa4611f05565b611b5e565b5b610ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae090613f5f565b60405180910390fd5b610af38383611f0d565b505050565b6000600880549050905090565b610b16610b10611f05565b82611fc6565b610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c906140bf565b60405180910390fd5b610b608383836120a4565b505050565b6000610b7083611172565b8210610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890613dff565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c25838383604051806020016040528060008152506116d4565b505050565b60016002811115610c3e57610c3d614585565b5b600a60149054906101000a900460ff166002811115610c6057610c5f614585565b5b14610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c979061409f565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2490613f1f565b60405180910390fd5b6000610d383361230b565b9050610d8581848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061233b565b610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90613ddf565b60405180910390fd5b67016345785d8a0000341015610e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0690613f3f565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610e716001612373565b505050565b6000610e80610af8565b8210610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb8906140df565b60405180910390fd5b60088281548110610ed557610ed4614612565b5b90600052602060002001549050919050565b610eef611f05565b73ffffffffffffffffffffffffffffffffffffffff16610f0d611602565b73ffffffffffffffffffffffffffffffffffffffff1614610f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5a9061403f565b60405180910390fd5b80600c9080519060200190610f7992919061323e565b5050565b610f85611f05565b73ffffffffffffffffffffffffffffffffffffffff16610fa3611602565b73ffffffffffffffffffffffffffffffffffffffff1614610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff09061403f565b60405180910390fd5b80600a60146101000a81548160ff0219169083600281111561101e5761101d614585565b5b021790555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c690613fbf565b60405180910390fd5b80915050919050565b67016345785d8a000081565b600c80546110f190614426565b80601f016020809104026020016040519081016040528092919081815260200182805461111d90614426565b801561116a5780601f1061113f5761010080835404028352916020019161116a565b820191906000526020600020905b81548152906001019060200180831161114d57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111da90613f9f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611232611f05565b73ffffffffffffffffffffffffffffffffffffffff16611250611602565b73ffffffffffffffffffffffffffffffffffffffff16146112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d9061403f565b60405180910390fd5b6112b0600061247e565b565b6112ba611f05565b73ffffffffffffffffffffffffffffffffffffffff166112d8611602565b73ffffffffffffffffffffffffffffffffffffffff161461132e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113259061403f565b60405180910390fd5b80600d908051906020019061134492919061323e565b5050565b6001600281111561135c5761135b614585565b5b600a60149054906101000a900460ff16600281111561137e5761137d614585565b5b146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b59061409f565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144290613f1f565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906140ff565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061153381612373565b50565b60028081111561154957611548614585565b5b600a60149054906101000a900460ff16600281111561156b5761156a614585565b5b146115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a290613dbf565b60405180910390fd5b67016345785d8a00003410156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90613f3f565b60405180910390fd5b6116006001612373565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461163b90614426565b80601f016020809104026020016040519081016040528092919081815260200182805461166790614426565b80156116b45780601f10611689576101008083540402835291602001916116b4565b820191906000526020600020905b81548152906001019060200180831161169757829003601f168201915b5050505050905090565b6116d06116c9611f05565b8383612544565b5050565b6116e56116df611f05565b83611fc6565b611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b906140bf565b60405180910390fd5b611730848484846126b1565b50505050565b600a60149054906101000a900460ff1681565b606061175482611e99565b611793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178a9061405f565b60405180910390fd5b600061179d61270d565b905060008151116117bd57604051806020016040528060008152506117e8565b806117c78461279f565b6040516020016117d8929190613cdc565b6040516020818303038152906040525b915050919050565b6001600281111561180457611803614585565b5b600a60149054906101000a900460ff16600281111561182657611825614585565b5b14611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d9061409f565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ea90613f1f565b60405180910390fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661197f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119769061411f565b60405180910390fd5b600081116119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990613f7f565b60405180910390fd5b6006811115611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd90613f7f565b60405180910390fd5b600181611a139190614305565b67016345785d8a0000611a2691906142ab565b341015611a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5f90613f3f565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ac981612373565b50565b6060600d8054611adb90614426565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0790614426565b8015611b545780601f10611b2957610100808354040283529160200191611b54565b820191906000526020600020905b815481529060010190602001808311611b3757829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6103e881565b611c00611f05565b73ffffffffffffffffffffffffffffffffffffffff16611c1e611602565b73ffffffffffffffffffffffffffffffffffffffff1614611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b9061403f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdb90613e3f565b60405180910390fd5b611ced8161247e565b50565b611cf8611f05565b73ffffffffffffffffffffffffffffffffffffffff16611d16611602565b73ffffffffffffffffffffffffffffffffffffffff1614611d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d639061403f565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611db2573d6000803e3d6000fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e8257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e925750611e9182612900565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f8083611026565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fd182611e99565b612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790613edf565b60405180910390fd5b600061201b83611026565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061208a57508373ffffffffffffffffffffffffffffffffffffffff166120728461095b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061209b575061209a8185611b5e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120c482611026565b73ffffffffffffffffffffffffffffffffffffffff161461211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190613e5f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561218a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218190613e9f565b60405180910390fd5b61219583838361296a565b6121a0600082611f0d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f09190614305565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122479190614224565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612306838383612a7e565b505050565b60008160405160200161231e9190613cc1565b604051602081830303815290604052805190602001209050919050565b600061236b827ff7cb41ba0b969122985f7cf8f63520950b2cdb4f3bd2654c233b6a0cc55af91360001b85612a83565b905092915050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d890613fdf565b60405180910390fd5b6103e8816123ed610af8565b6123f79190614224565b1115612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242f90613eff565b60405180910390fd5b60005b8181101561247a5761244f33600b54612a9a565b600b600081548092919061246290614489565b9190505550808061247290614489565b91505061243b565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90613ebf565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126a49190613d67565b60405180910390a3505050565b6126bc8484846120a4565b6126c884848484612ab8565b612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe90613e1f565b60405180910390fd5b50505050565b6060600c805461271c90614426565b80601f016020809104026020016040519081016040528092919081815260200182805461274890614426565b80156127955780601f1061276a57610100808354040283529160200191612795565b820191906000526020600020905b81548152906001019060200180831161277857829003601f168201915b5050505050905090565b606060008214156127e7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128fb565b600082905060005b6000821461281957808061280290614489565b915050600a82612812919061427a565b91506127ef565b60008167ffffffffffffffff81111561283557612834614641565b5b6040519080825280601f01601f1916602001820160405280156128675781602001600182028036833780820191505090505b5090505b600085146128f4576001826128809190614305565b9150600a8561288f91906144f6565b603061289b9190614224565b60f81b8183815181106128b1576128b0614612565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128ed919061427a565b945061286b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612975838383612c4f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129b8576129b381612c54565b6129f7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146129f6576129f58382612c9d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a3a57612a3581612e0a565b612a79565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a7857612a778282612edb565b5b5b505050565b505050565b600082612a908584612f5a565b1490509392505050565b612ab4828260405180602001604052806000815250612fcf565b5050565b6000612ad98473ffffffffffffffffffffffffffffffffffffffff1661302a565b15612c42578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b02611f05565b8786866040518563ffffffff1660e01b8152600401612b249493929190613d1b565b602060405180830381600087803b158015612b3e57600080fd5b505af1925050508015612b6f57506040513d601f19601f82011682018060405250810190612b6c9190613727565b60015b612bf2573d8060008114612b9f576040519150601f19603f3d011682016040523d82523d6000602084013e612ba4565b606091505b50600081511415612bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be190613e1f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c47565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612caa84611172565b612cb49190614305565b9050600060076000848152602001908152602001600020549050818114612d99576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e1e9190614305565b9050600060096000848152602001908152602001600020549050600060088381548110612e4e57612e4d614612565b5b906000526020600020015490508060088381548110612e7057612e6f614612565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ebf57612ebe6145e3565b5b6001900381819060005260206000200160009055905550505050565b6000612ee683611172565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008082905060005b8451811015612fc4576000858281518110612f8157612f80614612565b5b60200260200101519050808311612fa357612f9c838261304d565b9250612fb0565b612fad818461304d565b92505b508080612fbc90614489565b915050612f63565b508091505092915050565b612fd98383613064565b612fe66000848484612ab8565b613025576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301c90613e1f565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cb90613fff565b60405180910390fd5b6130dd81611e99565b1561311d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311490613e7f565b60405180910390fd5b6131296000838361296a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131799190614224565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461323a60008383612a7e565b5050565b82805461324a90614426565b90600052602060002090601f01602090048101928261326c57600085556132b3565b82601f1061328557805160ff19168380011785556132b3565b828001600101855582156132b3579182015b828111156132b2578251825591602001919060010190613297565b5b5090506132c091906132c4565b5090565b5b808211156132dd5760008160009055506001016132c5565b5090565b60006132f46132ef8461417f565b61415a565b9050828152602081018484840111156133105761330f61467f565b5b61331b8482856143e4565b509392505050565b6000613336613331846141b0565b61415a565b9050828152602081018484840111156133525761335161467f565b5b61335d8482856143e4565b509392505050565b60008135905061337481614d50565b92915050565b60008135905061338981614d67565b92915050565b60008083601f8401126133a5576133a4614675565b5b8235905067ffffffffffffffff8111156133c2576133c1614670565b5b6020830191508360208202830111156133de576133dd61467a565b5b9250929050565b6000813590506133f481614d7e565b92915050565b60008135905061340981614d95565b92915050565b60008151905061341e81614d95565b92915050565b600082601f83011261343957613438614675565b5b81356134498482602086016132e1565b91505092915050565b60008135905061346181614dac565b92915050565b600082601f83011261347c5761347b614675565b5b813561348c848260208601613323565b91505092915050565b6000813590506134a481614dbc565b92915050565b6000602082840312156134c0576134bf614689565b5b60006134ce84828501613365565b91505092915050565b600080604083850312156134ee576134ed614689565b5b60006134fc8582860161337a565b925050602061350d85828601613495565b9150509250929050565b6000806040838503121561352e5761352d614689565b5b600061353c85828601613365565b925050602061354d85828601613365565b9150509250929050565b6000806000606084860312156135705761356f614689565b5b600061357e86828701613365565b935050602061358f86828701613365565b92505060406135a086828701613495565b9150509250925092565b600080600080608085870312156135c4576135c3614689565b5b60006135d287828801613365565b94505060206135e387828801613365565b93505060406135f487828801613495565b925050606085013567ffffffffffffffff81111561361557613614614684565b5b61362187828801613424565b91505092959194509250565b6000806040838503121561364457613643614689565b5b600061365285828601613365565b9250506020613663858286016133e5565b9150509250929050565b6000806040838503121561368457613683614689565b5b600061369285828601613365565b92505060206136a385828601613495565b9150509250929050565b600080602083850312156136c4576136c3614689565b5b600083013567ffffffffffffffff8111156136e2576136e1614684565b5b6136ee8582860161338f565b92509250509250929050565b6000602082840312156137105761370f614689565b5b600061371e848285016133fa565b91505092915050565b60006020828403121561373d5761373c614689565b5b600061374b8482850161340f565b91505092915050565b60006020828403121561376a57613769614689565b5b600061377884828501613452565b91505092915050565b60006020828403121561379757613796614689565b5b600082013567ffffffffffffffff8111156137b5576137b4614684565b5b6137c184828501613467565b91505092915050565b6000602082840312156137e0576137df614689565b5b60006137ee84828501613495565b91505092915050565b61380081614339565b82525050565b61381761381282614339565b6144d2565b82525050565b6138268161435d565b82525050565b6000613837826141e1565b61384181856141f7565b93506138518185602086016143f3565b61385a8161468e565b840191505092915050565b61386e816143d2565b82525050565b600061387f826141ec565b6138898185614208565b93506138998185602086016143f3565b6138a28161468e565b840191505092915050565b60006138b8826141ec565b6138c28185614219565b93506138d28185602086016143f3565b80840191505092915050565b60006138eb601483614208565b91506138f6826146ac565b602082019050919050565b600061390e601083614208565b9150613919826146d5565b602082019050919050565b6000613931602b83614208565b915061393c826146fe565b604082019050919050565b6000613954603283614208565b915061395f8261474d565b604082019050919050565b6000613977602683614208565b91506139828261479c565b604082019050919050565b600061399a602583614208565b91506139a5826147eb565b604082019050919050565b60006139bd601c83614208565b91506139c88261483a565b602082019050919050565b60006139e0602483614208565b91506139eb82614863565b604082019050919050565b6000613a03601983614208565b9150613a0e826148b2565b602082019050919050565b6000613a26602c83614208565b9150613a31826148db565b604082019050919050565b6000613a49601183614208565b9150613a548261492a565b602082019050919050565b6000613a6c601683614208565b9150613a7782614953565b602082019050919050565b6000613a8f601283614208565b9150613a9a8261497c565b602082019050919050565b6000613ab2603883614208565b9150613abd826149a5565b604082019050919050565b6000613ad5601083614208565b9150613ae0826149f4565b602082019050919050565b6000613af8602a83614208565b9150613b0382614a1d565b604082019050919050565b6000613b1b602983614208565b9150613b2682614a6c565b604082019050919050565b6000613b3e602083614208565b9150613b4982614abb565b602082019050919050565b6000613b61602083614208565b9150613b6c82614ae4565b602082019050919050565b6000613b84602c83614208565b9150613b8f82614b0d565b604082019050919050565b6000613ba7602083614208565b9150613bb282614b5c565b602082019050919050565b6000613bca602f83614208565b9150613bd582614b85565b604082019050919050565b6000613bed602183614208565b9150613bf882614bd4565b604082019050919050565b6000613c10601083614208565b9150613c1b82614c23565b602082019050919050565b6000613c33603183614208565b9150613c3e82614c4c565b604082019050919050565b6000613c56602c83614208565b9150613c6182614c9b565b604082019050919050565b6000613c79600783614208565b9150613c8482614cea565b602082019050919050565b6000613c9c601a83614208565b9150613ca782614d13565b602082019050919050565b613cbb816143c8565b82525050565b6000613ccd8284613806565b60148201915081905092915050565b6000613ce882856138ad565b9150613cf482846138ad565b91508190509392505050565b6000602082019050613d1560008301846137f7565b92915050565b6000608082019050613d3060008301876137f7565b613d3d60208301866137f7565b613d4a6040830185613cb2565b8181036060830152613d5c818461382c565b905095945050505050565b6000602082019050613d7c600083018461381d565b92915050565b6000602082019050613d976000830184613865565b92915050565b60006020820190508181036000830152613db78184613874565b905092915050565b60006020820190508181036000830152613dd8816138de565b9050919050565b60006020820190508181036000830152613df881613901565b9050919050565b60006020820190508181036000830152613e1881613924565b9050919050565b60006020820190508181036000830152613e3881613947565b9050919050565b60006020820190508181036000830152613e588161396a565b9050919050565b60006020820190508181036000830152613e788161398d565b9050919050565b60006020820190508181036000830152613e98816139b0565b9050919050565b60006020820190508181036000830152613eb8816139d3565b9050919050565b60006020820190508181036000830152613ed8816139f6565b9050919050565b60006020820190508181036000830152613ef881613a19565b9050919050565b60006020820190508181036000830152613f1881613a3c565b9050919050565b60006020820190508181036000830152613f3881613a5f565b9050919050565b60006020820190508181036000830152613f5881613a82565b9050919050565b60006020820190508181036000830152613f7881613aa5565b9050919050565b60006020820190508181036000830152613f9881613ac8565b9050919050565b60006020820190508181036000830152613fb881613aeb565b9050919050565b60006020820190508181036000830152613fd881613b0e565b9050919050565b60006020820190508181036000830152613ff881613b31565b9050919050565b6000602082019050818103600083015261401881613b54565b9050919050565b6000602082019050818103600083015261403881613b77565b9050919050565b6000602082019050818103600083015261405881613b9a565b9050919050565b6000602082019050818103600083015261407881613bbd565b9050919050565b6000602082019050818103600083015261409881613be0565b9050919050565b600060208201905081810360008301526140b881613c03565b9050919050565b600060208201905081810360008301526140d881613c26565b9050919050565b600060208201905081810360008301526140f881613c49565b9050919050565b6000602082019050818103600083015261411881613c6c565b9050919050565b6000602082019050818103600083015261413881613c8f565b9050919050565b60006020820190506141546000830184613cb2565b92915050565b6000614164614175565b90506141708282614458565b919050565b6000604051905090565b600067ffffffffffffffff82111561419a57614199614641565b5b6141a38261468e565b9050602081019050919050565b600067ffffffffffffffff8211156141cb576141ca614641565b5b6141d48261468e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061422f826143c8565b915061423a836143c8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561426f5761426e614527565b5b828201905092915050565b6000614285826143c8565b9150614290836143c8565b9250826142a05761429f614556565b5b828204905092915050565b60006142b6826143c8565b91506142c1836143c8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142fa576142f9614527565b5b828202905092915050565b6000614310826143c8565b915061431b836143c8565b92508282101561432e5761432d614527565b5b828203905092915050565b6000614344826143a8565b9050919050565b6000614356826143a8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506143a382614d3c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006143dd82614395565b9050919050565b82818337600083830152505050565b60005b838110156144115780820151818401526020810190506143f6565b83811115614420576000848401525b50505050565b6000600282049050600182168061443e57607f821691505b60208210811415614452576144516145b4565b5b50919050565b6144618261468e565b810181811067ffffffffffffffff821117156144805761447f614641565b5b80604052505050565b6000614494826143c8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144c7576144c6614527565b5b600182019050919050565b60006144dd826144e4565b9050919050565b60006144ef8261469f565b9050919050565b6000614501826143c8565b915061450c836143c8565b92508261451c5761451b614556565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f5075626c6963206d696e74206e6f74206c697665000000000000000000000000600082015250565b7f4e6f74206f6e2077686974656c69737400000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f457863656564204d617820537570706c79000000000000000000000000000000600082015250565b7f416c7265616479206d696e7465642070726573616c6500000000000000000000600082015250565b7f496e73756666696369656e742066756e64730000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f496e76616c6964207175616e7469747900000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f436f6e747261637420496e746572616374696f6e204e6f7420416c6c6f776564600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206e6f74206c69766500000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f74206d6f6400000000000000000000000000000000000000000000000000600082015250565b7f4e6f7420666f756e646174696f6e207069656365206f776e6572000000000000600082015250565b60038110614d4d57614d4c614585565b5b50565b614d5981614339565b8114614d6457600080fd5b50565b614d708161434b565b8114614d7b57600080fd5b50565b614d878161435d565b8114614d9257600080fd5b50565b614d9e81614369565b8114614da957600080fd5b50565b60038110614db957600080fd5b50565b614dc5816143c8565b8114614dd057600080fd5b5056fea2646970667358221220c5eab65b17f8af86bbbf4c877a745450caf10d962c024ed75bf7bae7641225ca64736f6c63430008050033

Deployed Bytecode Sourcemap

47963:7182:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36783:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48371:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48283:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22531:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24090:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23613:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37423:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24840:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37091:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25250:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54216:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37613:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51401:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51828:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22225:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48232:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48343:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21955:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47027:103;;;;;;;;;;;;;:::i;:::-;;51513:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53388:277;;;:::i;:::-;;54620:211;;;:::i;:::-;;46376:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22700:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24383:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25506:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48100:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22875:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53673:535;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51297:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24609:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48184:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47285:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55029:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36783:224;36885:4;36924:35;36909:50;;;:11;:50;;;;:90;;;;36963:36;36987:11;36963:23;:36::i;:::-;36909:90;36902:97;;36783:224;;;:::o;48371:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48283:51::-;48333:1;48283:51;:::o;22531:100::-;22585:13;22618:5;22611:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22531:100;:::o;24090:221::-;24166:7;24194:16;24202:7;24194;:16::i;:::-;24186:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24279:15;:24;24295:7;24279:24;;;;;;;;;;;;;;;;;;;;;24272:31;;24090:221;;;:::o;23613:411::-;23694:13;23710:23;23725:7;23710:14;:23::i;:::-;23694:39;;23758:5;23752:11;;:2;:11;;;;23744:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23852:5;23836:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23861:37;23878:5;23885:12;:10;:12::i;:::-;23861:16;:37::i;:::-;23836:62;23814:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23995:21;24004:2;24008:7;23995:8;:21::i;:::-;23683:341;23613:411;;:::o;37423:113::-;37484:7;37511:10;:17;;;;37504:24;;37423:113;:::o;24840:339::-;25035:41;25054:12;:10;:12::i;:::-;25068:7;25035:18;:41::i;:::-;25027:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25143:28;25153:4;25159:2;25163:7;25143:9;:28::i;:::-;24840:339;;;:::o;37091:256::-;37188:7;37224:23;37241:5;37224:16;:23::i;:::-;37216:5;:31;37208:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37313:12;:19;37326:5;37313:19;;;;;;;;;;;;;;;:26;37333:5;37313:26;;;;;;;;;;;;37306:33;;37091:256;;;;:::o;25250:185::-;25388:39;25405:4;25411:2;25415:7;25388:39;;;;;;;;;;;;:16;:39::i;:::-;25250:185;;;:::o;54216:396::-;52697:14;52688:23;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;52680:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52752:22;:34;52775:10;52752:34;;;;;;;;;;;;;;;;;;;;;;;;;52751:35;52743:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54348:12:::1;54363:17;54369:10;54363:5;:17::i;:::-;54348:32;;54399:39;54416:4;54422:15;;54399:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:39::i;:::-;54391:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48268:8;54478:9;:22;;54470:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;54573:4;54536:22;:34;54559:10;54536:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;54588:16;54602:1;54588:13;:16::i;:::-;54337:275;54216:396:::0;;:::o;37613:233::-;37688:7;37724:30;:28;:30::i;:::-;37716:5;:38;37708:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37821:10;37832:5;37821:17;;;;;;;;:::i;:::-;;;;;;;;;;37814:24;;37613:233;;;:::o;51401:104::-;46607:12;:10;:12::i;:::-;46596:23;;:7;:5;:7::i;:::-;:23;;;46588:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51486:11:::1;51476:7;:21;;;;;;;;;;;;:::i;:::-;;51401:104:::0;:::o;51828:89::-;46607:12;:10;:12::i;:::-;46596:23;;:7;:5;:7::i;:::-;:23;;;46588:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51903:6:::1;51895:5;;:14;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;51828:89:::0;:::o;22225:239::-;22297:7;22317:13;22333:7;:16;22341:7;22333:16;;;;;;;;;;;;;;;;;;;;;22317:32;;22385:1;22368:19;;:5;:19;;;;22360:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22451:5;22444:12;;;22225:239;;;:::o;48232:44::-;48268:8;48232:44;:::o;48343:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21955:208::-;22027:7;22072:1;22055:19;;:5;:19;;;;22047:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22139:9;:16;22149:5;22139:16;;;;;;;;;;;;;;;;22132:23;;21955:208;;;:::o;47027:103::-;46607:12;:10;:12::i;:::-;46596:23;;:7;:5;:7::i;:::-;:23;;;46588:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47092:30:::1;47119:1;47092:18;:30::i;:::-;47027:103::o:0;51513:120::-;46607:12;:10;:12::i;:::-;46596:23;;:7;:5;:7::i;:::-;:23;;;46588:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51610:15:::1;51596:11;:29;;;;;;;;;;;;:::i;:::-;;51513:120:::0;:::o;53388:277::-;52697:14;52688:23;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;52680:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52752:22;:34;52775:10;52752:34;;;;;;;;;;;;;;;;;;;;;;;;;52751:35;52743:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53449:27:::1;53479:13;:25;53493:10;53479:25;;;;;;;;;;;;;;;;53449:55;;53545:1;53523:19;:23;53515:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;53608:4;53571:22;:34;53594:10;53571:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;53623:34;53637:19;53623:13;:34::i;:::-;53438:227;53388:277::o:0;54620:211::-;54687:18;54678:27;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:27;;;;;;;;:::i;:::-;;;54670:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;48268:8;54749:9;:22;;54741:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;54807:16;54821:1;54807:13;:16::i;:::-;54620:211::o;46376:87::-;46422:7;46449:6;;;;;;;;;;;46442:13;;46376:87;:::o;22700:104::-;22756:13;22789:7;22782:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22700:104;:::o;24383:155::-;24478:52;24497:12;:10;:12::i;:::-;24511:8;24521;24478:18;:52::i;:::-;24383:155;;:::o;25506:328::-;25681:41;25700:12;:10;:12::i;:::-;25714:7;25681:18;:41::i;:::-;25673:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25787:39;25801:4;25807:2;25811:7;25820:5;25787:13;:39::i;:::-;25506:328;;;;:::o;48100:37::-;;;;;;;;;;;;;:::o;22875:334::-;22948:13;22982:16;22990:7;22982;:16::i;:::-;22974:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23063:21;23087:10;:8;:10::i;:::-;23063:34;;23139:1;23121:7;23115:21;:25;:86;;;;;;;;;;;;;;;;;23167:7;23176:18;:7;:16;:18::i;:::-;23150:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23115:86;23108:93;;;22875:334;;;:::o;53673:535::-;52697:14;52688:23;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;52680:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52752:22;:34;52775:10;52752:34;;;;;;;;;;;;;;;;;;;;;;;;;52751:35;52743:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53778:23:::1;:35;53802:10;53778:35;;;;;;;;;;;;;;;;;;;;;;;;;53756:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;53897:1;53886:8;:12;53878:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;48333:1;53938:8;:35;;53930:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54064:1;54053:8;:12;;;;:::i;:::-;48268:8;54040:26;;;;:::i;:::-;54027:9;:39;;54005:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;54162:4;54125:22;:34;54148:10;54125:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;54177:23;54191:8;54177:13;:23::i;:::-;53673:535:::0;:::o;51297:96::-;51341:13;51374:11;51367:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51297:96;:::o;24609:164::-;24706:4;24730:18;:25;24749:5;24730:25;;;;;;;;;;;;;;;:35;24756:8;24730:35;;;;;;;;;;;;;;;;;;;;;;;;;24723:42;;24609:164;;;;:::o;48184:39::-;48219:4;48184:39;:::o;47285:201::-;46607:12;:10;:12::i;:::-;46596:23;;:7;:5;:7::i;:::-;:23;;;46588:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47394:1:::1;47374:22;;:8;:22;;;;47366:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47450:28;47469:8;47450:18;:28::i;:::-;47285:201:::0;:::o;55029:113::-;46607:12;:10;:12::i;:::-;46596:23;;:7;:5;:7::i;:::-;:23;;;46588:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55113:3:::1;:12;;:21;55126:7;55113:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;55029:113:::0;;:::o;21586:305::-;21688:4;21740:25;21725:40;;;:11;:40;;;;:105;;;;21797:33;21782:48;;;:11;:48;;;;21725:105;:158;;;;21847:36;21871:11;21847:23;:36::i;:::-;21725:158;21705:178;;21586:305;;;:::o;27344:127::-;27409:4;27461:1;27433:30;;:7;:16;27441:7;27433:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27426:37;;27344:127;;;:::o;16822:98::-;16875:7;16902:10;16895:17;;16822:98;:::o;31490:174::-;31592:2;31565:15;:24;31581:7;31565:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31648:7;31644:2;31610:46;;31619:23;31634:7;31619:14;:23::i;:::-;31610:46;;;;;;;;;;;;31490:174;;:::o;27638:348::-;27731:4;27756:16;27764:7;27756;:16::i;:::-;27748:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27832:13;27848:23;27863:7;27848:14;:23::i;:::-;27832:39;;27901:5;27890:16;;:7;:16;;;:51;;;;27934:7;27910:31;;:20;27922:7;27910:11;:20::i;:::-;:31;;;27890:51;:87;;;;27945:32;27962:5;27969:7;27945:16;:32::i;:::-;27890:87;27882:96;;;27638:348;;;;:::o;30747:625::-;30906:4;30879:31;;:23;30894:7;30879:14;:23::i;:::-;:31;;;30871:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30985:1;30971:16;;:2;:16;;;;30963:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31041:39;31062:4;31068:2;31072:7;31041:20;:39::i;:::-;31145:29;31162:1;31166:7;31145:8;:29::i;:::-;31206:1;31187:9;:15;31197:4;31187:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31235:1;31218:9;:13;31228:2;31218:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31266:2;31247:7;:16;31255:7;31247:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31305:7;31301:2;31286:27;;31295:4;31286:27;;;;;;;;;;;;31326:38;31346:4;31352:2;31356:7;31326:19;:38::i;:::-;30747:625;;;:::o;52330:126::-;52385:7;52439;52422:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;52412:36;;;;;;52405:43;;52330:126;;;:::o;52115:207::-;52234:4;52263:51;52282:5;48572:66;52289:13;;52304:9;52263:18;:51::i;:::-;52256:58;;52115:207;;;;:::o;53030:350::-;53113:9;53099:23;;:10;:23;;;53091:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48219:4;53194:8;53178:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:36;;53170:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53254:9;53249:124;53273:8;53269:1;:12;53249:124;;;53303:32;53313:10;53325:9;;53303;:32::i;:::-;53350:9;;:11;;;;;;;;;:::i;:::-;;;;;;53283:3;;;;;:::i;:::-;;;;53249:124;;;;53030:350;:::o;47646:191::-;47720:16;47739:6;;;;;;;;;;;47720:25;;47765:8;47756:6;;:17;;;;;;;;;;;;;;;;;;47820:8;47789:40;;47810:8;47789:40;;;;;;;;;;;;47709:128;47646:191;:::o;31806:315::-;31961:8;31952:17;;:5;:17;;;;31944:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32048:8;32010:18;:25;32029:5;32010:25;;;;;;;;;;;;;;;:35;32036:8;32010:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32094:8;32072:41;;32087:5;32072:41;;;32104:8;32072:41;;;;;;:::i;:::-;;;;;;;;31806:315;;;:::o;26716:::-;26873:28;26883:4;26889:2;26893:7;26873:9;:28::i;:::-;26920:48;26943:4;26949:2;26953:7;26962:5;26920:22;:48::i;:::-;26912:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26716:315;;;;:::o;51181:108::-;51241:13;51274:7;51267:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51181:108;:::o;17399:723::-;17455:13;17685:1;17676:5;:10;17672:53;;;17703:10;;;;;;;;;;;;;;;;;;;;;17672:53;17735:12;17750:5;17735:20;;17766:14;17791:78;17806:1;17798:4;:9;17791:78;;17824:8;;;;;:::i;:::-;;;;17855:2;17847:10;;;;;:::i;:::-;;;17791:78;;;17879:19;17911:6;17901:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17879:39;;17929:154;17945:1;17936:5;:10;17929:154;;17973:1;17963:11;;;;;:::i;:::-;;;18040:2;18032:5;:10;;;;:::i;:::-;18019:2;:24;;;;:::i;:::-;18006:39;;17989:6;17996;17989:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18069:2;18060:11;;;;;:::i;:::-;;;17929:154;;;18107:6;18093:21;;;;;17399:723;;;;:::o;20019:157::-;20104:4;20143:25;20128:40;;;:11;:40;;;;20121:47;;20019:157;;;:::o;38459:589::-;38603:45;38630:4;38636:2;38640:7;38603:26;:45::i;:::-;38681:1;38665:18;;:4;:18;;;38661:187;;;38700:40;38732:7;38700:31;:40::i;:::-;38661:187;;;38770:2;38762:10;;:4;:10;;;38758:90;;38789:47;38822:4;38828:7;38789:32;:47::i;:::-;38758:90;38661:187;38876:1;38862:16;;:2;:16;;;38858:183;;;38895:45;38932:7;38895:36;:45::i;:::-;38858:183;;;38968:4;38962:10;;:2;:10;;;38958:83;;38989:40;39017:2;39021:7;38989:27;:40::i;:::-;38958:83;38858:183;38459:589;;;:::o;34568:125::-;;;;:::o;43852:190::-;43977:4;44030;44001:25;44014:5;44021:4;44001:12;:25::i;:::-;:33;43994:40;;43852:190;;;;;:::o;28328:110::-;28404:26;28414:2;28418:7;28404:26;;;;;;;;;;;;:9;:26::i;:::-;28328:110;;:::o;32686:799::-;32841:4;32862:15;:2;:13;;;:15::i;:::-;32858:620;;;32914:2;32898:36;;;32935:12;:10;:12::i;:::-;32949:4;32955:7;32964:5;32898:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32894:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33157:1;33140:6;:13;:18;33136:272;;;33183:60;;;;;;;;;;:::i;:::-;;;;;;;;33136:272;33358:6;33352:13;33343:6;33339:2;33335:15;33328:38;32894:529;33031:41;;;33021:51;;;:6;:51;;;;33014:58;;;;;32858:620;33462:4;33455:11;;32686:799;;;;;;;:::o;34057:126::-;;;;:::o;39771:164::-;39875:10;:17;;;;39848:15;:24;39864:7;39848:24;;;;;;;;;;;:44;;;;39903:10;39919:7;39903:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39771:164;:::o;40562:988::-;40828:22;40878:1;40853:22;40870:4;40853:16;:22::i;:::-;:26;;;;:::i;:::-;40828:51;;40890:18;40911:17;:26;40929:7;40911:26;;;;;;;;;;;;40890:47;;41058:14;41044:10;:28;41040:328;;41089:19;41111:12;:18;41124:4;41111:18;;;;;;;;;;;;;;;:34;41130:14;41111:34;;;;;;;;;;;;41089:56;;41195:11;41162:12;:18;41175:4;41162:18;;;;;;;;;;;;;;;:30;41181:10;41162:30;;;;;;;;;;;:44;;;;41312:10;41279:17;:30;41297:11;41279:30;;;;;;;;;;;:43;;;;41074:294;41040:328;41464:17;:26;41482:7;41464:26;;;;;;;;;;;41457:33;;;41508:12;:18;41521:4;41508:18;;;;;;;;;;;;;;;:34;41527:14;41508:34;;;;;;;;;;;41501:41;;;40643:907;;40562:988;;:::o;41845:1079::-;42098:22;42143:1;42123:10;:17;;;;:21;;;;:::i;:::-;42098:46;;42155:18;42176:15;:24;42192:7;42176:24;;;;;;;;;;;;42155:45;;42527:19;42549:10;42560:14;42549:26;;;;;;;;:::i;:::-;;;;;;;;;;42527:48;;42613:11;42588:10;42599;42588:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;42724:10;42693:15;:28;42709:11;42693:28;;;;;;;;;;;:41;;;;42865:15;:24;42881:7;42865:24;;;;;;;;;;;42858:31;;;42900:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41916:1008;;;41845:1079;:::o;39349:221::-;39434:14;39451:20;39468:2;39451:16;:20::i;:::-;39434:37;;39509:7;39482:12;:16;39495:2;39482:16;;;;;;;;;;;;;;;:24;39499:6;39482:24;;;;;;;;;;;:34;;;;39556:6;39527:17;:26;39545:7;39527:26;;;;;;;;;;;:35;;;;39423:147;39349:221;;:::o;44404:675::-;44487:7;44507:20;44530:4;44507:27;;44550:9;44545:497;44569:5;:12;44565:1;:16;44545:497;;;44603:20;44626:5;44632:1;44626:8;;;;;;;;:::i;:::-;;;;;;;;44603:31;;44669:12;44653;:28;44649:382;;44796:42;44811:12;44825;44796:14;:42::i;:::-;44781:57;;44649:382;;;44973:42;44988:12;45002;44973:14;:42::i;:::-;44958:57;;44649:382;44588:454;44583:3;;;;;:::i;:::-;;;;44545:497;;;;45059:12;45052:19;;;44404:675;;;;:::o;28665:321::-;28795:18;28801:2;28805:7;28795:5;:18::i;:::-;28846:54;28877:1;28881:2;28885:7;28894:5;28846:22;:54::i;:::-;28824:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28665:321;;;:::o;8875:326::-;8935:4;9192:1;9170:7;:19;;;:23;9163:30;;8875:326;;;:::o;45087:224::-;45155:13;45218:1;45212:4;45205:15;45247:1;45241:4;45234:15;45288:4;45282;45272:21;45263:30;;45087:224;;;;:::o;29322:439::-;29416:1;29402:16;;:2;:16;;;;29394:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29475:16;29483:7;29475;:16::i;:::-;29474:17;29466:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29537:45;29566:1;29570:2;29574:7;29537:20;:45::i;:::-;29612:1;29595:9;:13;29605:2;29595:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29643:2;29624:7;:16;29632:7;29624:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29688:7;29684:2;29663:33;;29680:1;29663:33;;;;;;;;;;;;29709:44;29737:1;29741:2;29745:7;29709:19;:44::i;:::-;29322:439;;:::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:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::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:2;;;698:79;;:::i;:::-;667:2;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;893:87;;;;:::o;986:155::-;1040:5;1078:6;1065:20;1056:29;;1094:41;1129:5;1094:41;:::i;:::-;1046:95;;;;:::o;1164:568::-;1237:8;1247:6;1297:3;1290:4;1282:6;1278:17;1274:27;1264:2;;1305:79;;:::i;:::-;1264:2;1418:6;1405:20;1395:30;;1448:18;1440:6;1437:30;1434:2;;;1470:79;;:::i;:::-;1434:2;1584:4;1576:6;1572:17;1560:29;;1638:3;1630:4;1622:6;1618:17;1608:8;1604:32;1601:41;1598:2;;;1645:79;;:::i;:::-;1598:2;1254:478;;;;;:::o;1738:133::-;1781:5;1819:6;1806:20;1797:29;;1835:30;1859:5;1835:30;:::i;:::-;1787:84;;;;:::o;1877:137::-;1922:5;1960:6;1947:20;1938:29;;1976:32;2002:5;1976:32;:::i;:::-;1928:86;;;;:::o;2020:141::-;2076:5;2107:6;2101:13;2092:22;;2123:32;2149:5;2123:32;:::i;:::-;2082:79;;;;:::o;2180:338::-;2235:5;2284:3;2277:4;2269:6;2265:17;2261:27;2251:2;;2292:79;;:::i;:::-;2251:2;2409:6;2396:20;2434:78;2508:3;2500:6;2493:4;2485:6;2481:17;2434:78;:::i;:::-;2425:87;;2241:277;;;;;:::o;2524:161::-;2581:5;2619:6;2606:20;2597:29;;2635:44;2673:5;2635:44;:::i;:::-;2587:98;;;;:::o;2705:340::-;2761:5;2810:3;2803:4;2795:6;2791:17;2787:27;2777:2;;2818:79;;:::i;:::-;2777:2;2935:6;2922:20;2960:79;3035:3;3027:6;3020:4;3012:6;3008:17;2960:79;:::i;:::-;2951:88;;2767:278;;;;;:::o;3051:139::-;3097:5;3135:6;3122:20;3113:29;;3151:33;3178:5;3151:33;:::i;:::-;3103:87;;;;:::o;3196:329::-;3255:6;3304:2;3292:9;3283:7;3279:23;3275:32;3272:2;;;3310:79;;:::i;:::-;3272:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3262:263;;;;:::o;3531:490::-;3607:6;3615;3664:2;3652:9;3643:7;3639:23;3635:32;3632:2;;;3670:79;;:::i;:::-;3632:2;3790:1;3815:61;3868:7;3859:6;3848:9;3844:22;3815:61;:::i;:::-;3805:71;;3761:125;3925:2;3951:53;3996:7;3987:6;3976:9;3972:22;3951:53;:::i;:::-;3941:63;;3896:118;3622:399;;;;;:::o;4027:474::-;4095:6;4103;4152:2;4140:9;4131:7;4127:23;4123:32;4120:2;;;4158:79;;:::i;:::-;4120:2;4278:1;4303:53;4348:7;4339:6;4328:9;4324:22;4303:53;:::i;:::-;4293:63;;4249:117;4405:2;4431:53;4476:7;4467:6;4456:9;4452:22;4431:53;:::i;:::-;4421:63;;4376:118;4110:391;;;;;:::o;4507:619::-;4584:6;4592;4600;4649:2;4637:9;4628:7;4624:23;4620:32;4617:2;;;4655:79;;:::i;:::-;4617:2;4775:1;4800:53;4845:7;4836:6;4825:9;4821:22;4800:53;:::i;:::-;4790:63;;4746:117;4902:2;4928:53;4973:7;4964:6;4953:9;4949:22;4928:53;:::i;:::-;4918:63;;4873:118;5030:2;5056:53;5101:7;5092:6;5081:9;5077:22;5056:53;:::i;:::-;5046:63;;5001:118;4607:519;;;;;:::o;5132:943::-;5227:6;5235;5243;5251;5300:3;5288:9;5279:7;5275:23;5271:33;5268:2;;;5307:79;;:::i;:::-;5268:2;5427:1;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5398:117;5554:2;5580:53;5625:7;5616:6;5605:9;5601:22;5580:53;:::i;:::-;5570:63;;5525:118;5682:2;5708:53;5753:7;5744:6;5733:9;5729:22;5708:53;:::i;:::-;5698:63;;5653:118;5838:2;5827:9;5823:18;5810:32;5869:18;5861:6;5858:30;5855:2;;;5891:79;;:::i;:::-;5855:2;5996:62;6050:7;6041:6;6030:9;6026:22;5996:62;:::i;:::-;5986:72;;5781:287;5258:817;;;;;;;:::o;6081:468::-;6146:6;6154;6203:2;6191:9;6182:7;6178:23;6174:32;6171:2;;;6209:79;;:::i;:::-;6171:2;6329:1;6354:53;6399:7;6390:6;6379:9;6375:22;6354:53;:::i;:::-;6344:63;;6300:117;6456:2;6482:50;6524:7;6515:6;6504:9;6500:22;6482:50;:::i;:::-;6472:60;;6427:115;6161:388;;;;;:::o;6555:474::-;6623:6;6631;6680:2;6668:9;6659:7;6655:23;6651:32;6648:2;;;6686:79;;:::i;:::-;6648:2;6806:1;6831:53;6876:7;6867:6;6856:9;6852:22;6831:53;:::i;:::-;6821:63;;6777:117;6933:2;6959:53;7004:7;6995:6;6984:9;6980:22;6959:53;:::i;:::-;6949:63;;6904:118;6638:391;;;;;:::o;7035:559::-;7121:6;7129;7178:2;7166:9;7157:7;7153:23;7149:32;7146:2;;;7184:79;;:::i;:::-;7146:2;7332:1;7321:9;7317:17;7304:31;7362:18;7354:6;7351:30;7348:2;;;7384:79;;:::i;:::-;7348:2;7497:80;7569:7;7560:6;7549:9;7545:22;7497:80;:::i;:::-;7479:98;;;;7275:312;7136:458;;;;;:::o;7600:327::-;7658:6;7707:2;7695:9;7686:7;7682:23;7678:32;7675:2;;;7713:79;;:::i;:::-;7675:2;7833:1;7858:52;7902:7;7893:6;7882:9;7878:22;7858:52;:::i;:::-;7848:62;;7804:116;7665:262;;;;:::o;7933:349::-;8002:6;8051:2;8039:9;8030:7;8026:23;8022:32;8019:2;;;8057:79;;:::i;:::-;8019:2;8177:1;8202:63;8257:7;8248:6;8237:9;8233:22;8202:63;:::i;:::-;8192:73;;8148:127;8009:273;;;;:::o;8288:351::-;8358:6;8407:2;8395:9;8386:7;8382:23;8378:32;8375:2;;;8413:79;;:::i;:::-;8375:2;8533:1;8558:64;8614:7;8605:6;8594:9;8590:22;8558:64;:::i;:::-;8548:74;;8504:128;8365:274;;;;:::o;8645:509::-;8714:6;8763:2;8751:9;8742:7;8738:23;8734:32;8731:2;;;8769:79;;:::i;:::-;8731:2;8917:1;8906:9;8902:17;8889:31;8947:18;8939:6;8936:30;8933:2;;;8969:79;;:::i;:::-;8933:2;9074:63;9129:7;9120:6;9109:9;9105:22;9074:63;:::i;:::-;9064:73;;8860:287;8721:433;;;;:::o;9160:329::-;9219:6;9268:2;9256:9;9247:7;9243:23;9239:32;9236:2;;;9274:79;;:::i;:::-;9236:2;9394:1;9419:53;9464:7;9455:6;9444:9;9440:22;9419:53;:::i;:::-;9409:63;;9365:117;9226:263;;;;:::o;9495:118::-;9582:24;9600:5;9582:24;:::i;:::-;9577:3;9570:37;9560:53;;:::o;9619:157::-;9724:45;9744:24;9762:5;9744:24;:::i;:::-;9724:45;:::i;:::-;9719:3;9712:58;9702:74;;:::o;9782:109::-;9863:21;9878:5;9863:21;:::i;:::-;9858:3;9851:34;9841:50;;:::o;9897:360::-;9983:3;10011:38;10043:5;10011:38;:::i;:::-;10065:70;10128:6;10123:3;10065:70;:::i;:::-;10058:77;;10144:52;10189:6;10184:3;10177:4;10170:5;10166:16;10144:52;:::i;:::-;10221:29;10243:6;10221:29;:::i;:::-;10216:3;10212:39;10205:46;;9987:270;;;;;:::o;10263:149::-;10359:46;10399:5;10359:46;:::i;:::-;10354:3;10347:59;10337:75;;:::o;10418:364::-;10506:3;10534:39;10567:5;10534:39;:::i;:::-;10589:71;10653:6;10648:3;10589:71;:::i;:::-;10582:78;;10669:52;10714:6;10709:3;10702:4;10695:5;10691:16;10669:52;:::i;:::-;10746:29;10768:6;10746:29;:::i;:::-;10741:3;10737:39;10730:46;;10510:272;;;;;:::o;10788:377::-;10894:3;10922:39;10955:5;10922:39;:::i;:::-;10977:89;11059:6;11054:3;10977:89;:::i;:::-;10970:96;;11075:52;11120:6;11115:3;11108:4;11101:5;11097:16;11075:52;:::i;:::-;11152:6;11147:3;11143:16;11136:23;;10898:267;;;;;:::o;11171:366::-;11313:3;11334:67;11398:2;11393:3;11334:67;:::i;:::-;11327:74;;11410:93;11499:3;11410:93;:::i;:::-;11528:2;11523:3;11519:12;11512:19;;11317:220;;;:::o;11543:366::-;11685:3;11706:67;11770:2;11765:3;11706:67;:::i;:::-;11699:74;;11782:93;11871:3;11782:93;:::i;:::-;11900:2;11895:3;11891:12;11884:19;;11689:220;;;:::o;11915:366::-;12057:3;12078:67;12142:2;12137:3;12078:67;:::i;:::-;12071:74;;12154:93;12243:3;12154:93;:::i;:::-;12272:2;12267:3;12263:12;12256:19;;12061:220;;;:::o;12287:366::-;12429:3;12450:67;12514:2;12509:3;12450:67;:::i;:::-;12443:74;;12526:93;12615:3;12526:93;:::i;:::-;12644:2;12639:3;12635:12;12628:19;;12433:220;;;:::o;12659:366::-;12801:3;12822:67;12886:2;12881:3;12822:67;:::i;:::-;12815:74;;12898:93;12987:3;12898:93;:::i;:::-;13016:2;13011:3;13007:12;13000:19;;12805:220;;;:::o;13031:366::-;13173:3;13194:67;13258:2;13253:3;13194:67;:::i;:::-;13187:74;;13270:93;13359:3;13270:93;:::i;:::-;13388:2;13383:3;13379:12;13372:19;;13177:220;;;:::o;13403:366::-;13545:3;13566:67;13630:2;13625:3;13566:67;:::i;:::-;13559:74;;13642:93;13731:3;13642:93;:::i;:::-;13760:2;13755:3;13751:12;13744:19;;13549:220;;;:::o;13775:366::-;13917:3;13938:67;14002:2;13997:3;13938:67;:::i;:::-;13931:74;;14014:93;14103:3;14014:93;:::i;:::-;14132:2;14127:3;14123:12;14116:19;;13921:220;;;:::o;14147:366::-;14289:3;14310:67;14374:2;14369:3;14310:67;:::i;:::-;14303:74;;14386:93;14475:3;14386:93;:::i;:::-;14504:2;14499:3;14495:12;14488:19;;14293:220;;;:::o;14519:366::-;14661:3;14682:67;14746:2;14741:3;14682:67;:::i;:::-;14675:74;;14758:93;14847:3;14758:93;:::i;:::-;14876:2;14871:3;14867:12;14860:19;;14665:220;;;:::o;14891:366::-;15033:3;15054:67;15118:2;15113:3;15054:67;:::i;:::-;15047:74;;15130:93;15219:3;15130:93;:::i;:::-;15248:2;15243:3;15239:12;15232:19;;15037:220;;;:::o;15263:366::-;15405:3;15426:67;15490:2;15485:3;15426:67;:::i;:::-;15419:74;;15502:93;15591:3;15502:93;:::i;:::-;15620:2;15615:3;15611:12;15604:19;;15409:220;;;:::o;15635:366::-;15777:3;15798:67;15862:2;15857:3;15798:67;:::i;:::-;15791:74;;15874:93;15963:3;15874:93;:::i;:::-;15992:2;15987:3;15983:12;15976:19;;15781:220;;;:::o;16007:366::-;16149:3;16170:67;16234:2;16229:3;16170:67;:::i;:::-;16163:74;;16246:93;16335:3;16246:93;:::i;:::-;16364:2;16359:3;16355:12;16348:19;;16153:220;;;:::o;16379:366::-;16521:3;16542:67;16606:2;16601:3;16542:67;:::i;:::-;16535:74;;16618:93;16707:3;16618:93;:::i;:::-;16736:2;16731:3;16727:12;16720:19;;16525:220;;;:::o;16751:366::-;16893:3;16914:67;16978:2;16973:3;16914:67;:::i;:::-;16907:74;;16990:93;17079:3;16990:93;:::i;:::-;17108:2;17103:3;17099:12;17092:19;;16897:220;;;:::o;17123:366::-;17265:3;17286:67;17350:2;17345:3;17286:67;:::i;:::-;17279:74;;17362:93;17451:3;17362:93;:::i;:::-;17480:2;17475:3;17471:12;17464:19;;17269:220;;;:::o;17495:366::-;17637:3;17658:67;17722:2;17717:3;17658:67;:::i;:::-;17651:74;;17734:93;17823:3;17734:93;:::i;:::-;17852:2;17847:3;17843:12;17836:19;;17641:220;;;:::o;17867:366::-;18009:3;18030:67;18094:2;18089:3;18030:67;:::i;:::-;18023:74;;18106:93;18195:3;18106:93;:::i;:::-;18224:2;18219:3;18215:12;18208:19;;18013:220;;;:::o;18239:366::-;18381:3;18402:67;18466:2;18461:3;18402:67;:::i;:::-;18395:74;;18478:93;18567:3;18478:93;:::i;:::-;18596:2;18591:3;18587:12;18580:19;;18385:220;;;:::o;18611:366::-;18753:3;18774:67;18838:2;18833:3;18774:67;:::i;:::-;18767:74;;18850:93;18939:3;18850:93;:::i;:::-;18968:2;18963:3;18959:12;18952:19;;18757:220;;;:::o;18983:366::-;19125:3;19146:67;19210:2;19205:3;19146:67;:::i;:::-;19139:74;;19222:93;19311:3;19222:93;:::i;:::-;19340:2;19335:3;19331:12;19324:19;;19129:220;;;:::o;19355:366::-;19497:3;19518:67;19582:2;19577:3;19518:67;:::i;:::-;19511:74;;19594:93;19683:3;19594:93;:::i;:::-;19712:2;19707:3;19703:12;19696:19;;19501:220;;;:::o;19727:366::-;19869:3;19890:67;19954:2;19949:3;19890:67;:::i;:::-;19883:74;;19966:93;20055:3;19966:93;:::i;:::-;20084:2;20079:3;20075:12;20068:19;;19873:220;;;:::o;20099:366::-;20241:3;20262:67;20326:2;20321:3;20262:67;:::i;:::-;20255:74;;20338:93;20427:3;20338:93;:::i;:::-;20456:2;20451:3;20447:12;20440:19;;20245:220;;;:::o;20471:366::-;20613:3;20634:67;20698:2;20693:3;20634:67;:::i;:::-;20627:74;;20710:93;20799:3;20710:93;:::i;:::-;20828:2;20823:3;20819:12;20812:19;;20617:220;;;:::o;20843:365::-;20985:3;21006:66;21070:1;21065:3;21006:66;:::i;:::-;20999:73;;21081:93;21170:3;21081:93;:::i;:::-;21199:2;21194:3;21190:12;21183:19;;20989:219;;;:::o;21214:366::-;21356:3;21377:67;21441:2;21436:3;21377:67;:::i;:::-;21370:74;;21453:93;21542:3;21453:93;:::i;:::-;21571:2;21566:3;21562:12;21555:19;;21360:220;;;:::o;21586:118::-;21673:24;21691:5;21673:24;:::i;:::-;21668:3;21661:37;21651:53;;:::o;21710:256::-;21822:3;21837:75;21908:3;21899:6;21837:75;:::i;:::-;21937:2;21932:3;21928:12;21921:19;;21957:3;21950:10;;21826:140;;;;:::o;21972:435::-;22152:3;22174:95;22265:3;22256:6;22174:95;:::i;:::-;22167:102;;22286:95;22377:3;22368:6;22286:95;:::i;:::-;22279:102;;22398:3;22391:10;;22156:251;;;;;:::o;22413:222::-;22506:4;22544:2;22533:9;22529:18;22521:26;;22557:71;22625:1;22614:9;22610:17;22601:6;22557:71;:::i;:::-;22511:124;;;;:::o;22641:640::-;22836:4;22874:3;22863:9;22859:19;22851:27;;22888:71;22956:1;22945:9;22941:17;22932:6;22888:71;:::i;:::-;22969:72;23037:2;23026:9;23022:18;23013:6;22969:72;:::i;:::-;23051;23119:2;23108:9;23104:18;23095:6;23051:72;:::i;:::-;23170:9;23164:4;23160:20;23155:2;23144:9;23140:18;23133:48;23198:76;23269:4;23260:6;23198:76;:::i;:::-;23190:84;;22841:440;;;;;;;:::o;23287:210::-;23374:4;23412:2;23401:9;23397:18;23389:26;;23425:65;23487:1;23476:9;23472:17;23463:6;23425:65;:::i;:::-;23379:118;;;;:::o;23503:240::-;23605:4;23643:2;23632:9;23628:18;23620:26;;23656:80;23733:1;23722:9;23718:17;23709:6;23656:80;:::i;:::-;23610:133;;;;:::o;23749:313::-;23862:4;23900:2;23889:9;23885:18;23877:26;;23949:9;23943:4;23939:20;23935:1;23924:9;23920:17;23913:47;23977:78;24050:4;24041:6;23977:78;:::i;:::-;23969:86;;23867:195;;;;:::o;24068:419::-;24234:4;24272:2;24261:9;24257:18;24249:26;;24321:9;24315:4;24311:20;24307:1;24296:9;24292:17;24285:47;24349:131;24475:4;24349:131;:::i;:::-;24341:139;;24239:248;;;:::o;24493:419::-;24659:4;24697:2;24686:9;24682:18;24674:26;;24746:9;24740:4;24736:20;24732:1;24721:9;24717:17;24710:47;24774:131;24900:4;24774:131;:::i;:::-;24766:139;;24664:248;;;:::o;24918:419::-;25084:4;25122:2;25111:9;25107:18;25099:26;;25171:9;25165:4;25161:20;25157:1;25146:9;25142:17;25135:47;25199:131;25325:4;25199:131;:::i;:::-;25191:139;;25089:248;;;:::o;25343:419::-;25509:4;25547:2;25536:9;25532:18;25524:26;;25596:9;25590:4;25586:20;25582:1;25571:9;25567:17;25560:47;25624:131;25750:4;25624:131;:::i;:::-;25616:139;;25514:248;;;:::o;25768:419::-;25934:4;25972:2;25961:9;25957:18;25949:26;;26021:9;26015:4;26011:20;26007:1;25996:9;25992:17;25985:47;26049:131;26175:4;26049:131;:::i;:::-;26041:139;;25939:248;;;:::o;26193:419::-;26359:4;26397:2;26386:9;26382:18;26374:26;;26446:9;26440:4;26436:20;26432:1;26421:9;26417:17;26410:47;26474:131;26600:4;26474:131;:::i;:::-;26466:139;;26364:248;;;:::o;26618:419::-;26784:4;26822:2;26811:9;26807:18;26799:26;;26871:9;26865:4;26861:20;26857:1;26846:9;26842:17;26835:47;26899:131;27025:4;26899:131;:::i;:::-;26891:139;;26789:248;;;:::o;27043:419::-;27209:4;27247:2;27236:9;27232:18;27224:26;;27296:9;27290:4;27286:20;27282:1;27271:9;27267:17;27260:47;27324:131;27450:4;27324:131;:::i;:::-;27316:139;;27214:248;;;:::o;27468:419::-;27634:4;27672:2;27661:9;27657:18;27649:26;;27721:9;27715:4;27711:20;27707:1;27696:9;27692:17;27685:47;27749:131;27875:4;27749:131;:::i;:::-;27741:139;;27639:248;;;:::o;27893:419::-;28059:4;28097:2;28086:9;28082:18;28074:26;;28146:9;28140:4;28136:20;28132:1;28121:9;28117:17;28110:47;28174:131;28300:4;28174:131;:::i;:::-;28166:139;;28064:248;;;:::o;28318:419::-;28484:4;28522:2;28511:9;28507:18;28499:26;;28571:9;28565:4;28561:20;28557:1;28546:9;28542:17;28535:47;28599:131;28725:4;28599:131;:::i;:::-;28591:139;;28489:248;;;:::o;28743:419::-;28909:4;28947:2;28936:9;28932:18;28924:26;;28996:9;28990:4;28986:20;28982:1;28971:9;28967:17;28960:47;29024:131;29150:4;29024:131;:::i;:::-;29016:139;;28914:248;;;:::o;29168:419::-;29334:4;29372:2;29361:9;29357:18;29349:26;;29421:9;29415:4;29411:20;29407:1;29396:9;29392:17;29385:47;29449:131;29575:4;29449:131;:::i;:::-;29441:139;;29339:248;;;:::o;29593:419::-;29759:4;29797:2;29786:9;29782:18;29774:26;;29846:9;29840:4;29836:20;29832:1;29821:9;29817:17;29810:47;29874:131;30000:4;29874:131;:::i;:::-;29866:139;;29764:248;;;:::o;30018:419::-;30184:4;30222:2;30211:9;30207:18;30199:26;;30271:9;30265:4;30261:20;30257:1;30246:9;30242:17;30235:47;30299:131;30425:4;30299:131;:::i;:::-;30291:139;;30189:248;;;:::o;30443:419::-;30609:4;30647:2;30636:9;30632:18;30624:26;;30696:9;30690:4;30686:20;30682:1;30671:9;30667:17;30660:47;30724:131;30850:4;30724:131;:::i;:::-;30716:139;;30614:248;;;:::o;30868:419::-;31034:4;31072:2;31061:9;31057:18;31049:26;;31121:9;31115:4;31111:20;31107:1;31096:9;31092:17;31085:47;31149:131;31275:4;31149:131;:::i;:::-;31141:139;;31039:248;;;:::o;31293:419::-;31459:4;31497:2;31486:9;31482:18;31474:26;;31546:9;31540:4;31536:20;31532:1;31521:9;31517:17;31510:47;31574:131;31700:4;31574:131;:::i;:::-;31566:139;;31464:248;;;:::o;31718:419::-;31884:4;31922:2;31911:9;31907:18;31899:26;;31971:9;31965:4;31961:20;31957:1;31946:9;31942:17;31935:47;31999:131;32125:4;31999:131;:::i;:::-;31991:139;;31889:248;;;:::o;32143:419::-;32309:4;32347:2;32336:9;32332:18;32324:26;;32396:9;32390:4;32386:20;32382:1;32371:9;32367:17;32360:47;32424:131;32550:4;32424:131;:::i;:::-;32416:139;;32314:248;;;:::o;32568:419::-;32734:4;32772:2;32761:9;32757:18;32749:26;;32821:9;32815:4;32811:20;32807:1;32796:9;32792:17;32785:47;32849:131;32975:4;32849:131;:::i;:::-;32841:139;;32739:248;;;:::o;32993:419::-;33159:4;33197:2;33186:9;33182:18;33174:26;;33246:9;33240:4;33236:20;33232:1;33221:9;33217:17;33210:47;33274:131;33400:4;33274:131;:::i;:::-;33266:139;;33164:248;;;:::o;33418:419::-;33584:4;33622:2;33611:9;33607:18;33599:26;;33671:9;33665:4;33661:20;33657:1;33646:9;33642:17;33635:47;33699:131;33825:4;33699:131;:::i;:::-;33691:139;;33589:248;;;:::o;33843:419::-;34009:4;34047:2;34036:9;34032:18;34024:26;;34096:9;34090:4;34086:20;34082:1;34071:9;34067:17;34060:47;34124:131;34250:4;34124:131;:::i;:::-;34116:139;;34014:248;;;:::o;34268:419::-;34434:4;34472:2;34461:9;34457:18;34449:26;;34521:9;34515:4;34511:20;34507:1;34496:9;34492:17;34485:47;34549:131;34675:4;34549:131;:::i;:::-;34541:139;;34439:248;;;:::o;34693:419::-;34859:4;34897:2;34886:9;34882:18;34874:26;;34946:9;34940:4;34936:20;34932:1;34921:9;34917:17;34910:47;34974:131;35100:4;34974:131;:::i;:::-;34966:139;;34864:248;;;:::o;35118:419::-;35284:4;35322:2;35311:9;35307:18;35299:26;;35371:9;35365:4;35361:20;35357:1;35346:9;35342:17;35335:47;35399:131;35525:4;35399:131;:::i;:::-;35391:139;;35289:248;;;:::o;35543:419::-;35709:4;35747:2;35736:9;35732:18;35724:26;;35796:9;35790:4;35786:20;35782:1;35771:9;35767:17;35760:47;35824:131;35950:4;35824:131;:::i;:::-;35816:139;;35714:248;;;:::o;35968:222::-;36061:4;36099:2;36088:9;36084:18;36076:26;;36112:71;36180:1;36169:9;36165:17;36156:6;36112:71;:::i;:::-;36066:124;;;;:::o;36196:129::-;36230:6;36257:20;;:::i;:::-;36247:30;;36286:33;36314:4;36306:6;36286:33;:::i;:::-;36237:88;;;:::o;36331:75::-;36364:6;36397:2;36391:9;36381:19;;36371:35;:::o;36412:307::-;36473:4;36563:18;36555:6;36552:30;36549:2;;;36585:18;;:::i;:::-;36549:2;36623:29;36645:6;36623:29;:::i;:::-;36615:37;;36707:4;36701;36697:15;36689:23;;36478:241;;;:::o;36725:308::-;36787:4;36877:18;36869:6;36866:30;36863:2;;;36899:18;;:::i;:::-;36863:2;36937:29;36959:6;36937:29;:::i;:::-;36929:37;;37021:4;37015;37011:15;37003:23;;36792:241;;;:::o;37039:98::-;37090:6;37124:5;37118:12;37108:22;;37097:40;;;:::o;37143:99::-;37195:6;37229:5;37223:12;37213:22;;37202:40;;;:::o;37248:168::-;37331:11;37365:6;37360:3;37353:19;37405:4;37400:3;37396:14;37381:29;;37343:73;;;;:::o;37422:169::-;37506:11;37540:6;37535:3;37528:19;37580:4;37575:3;37571:14;37556:29;;37518:73;;;;:::o;37597:148::-;37699:11;37736:3;37721:18;;37711:34;;;;:::o;37751:305::-;37791:3;37810:20;37828:1;37810:20;:::i;:::-;37805:25;;37844:20;37862:1;37844:20;:::i;:::-;37839:25;;37998:1;37930:66;37926:74;37923:1;37920:81;37917:2;;;38004:18;;:::i;:::-;37917:2;38048:1;38045;38041:9;38034:16;;37795:261;;;;:::o;38062:185::-;38102:1;38119:20;38137:1;38119:20;:::i;:::-;38114:25;;38153:20;38171:1;38153:20;:::i;:::-;38148:25;;38192:1;38182:2;;38197:18;;:::i;:::-;38182:2;38239:1;38236;38232:9;38227:14;;38104:143;;;;:::o;38253:348::-;38293:7;38316:20;38334:1;38316:20;:::i;:::-;38311:25;;38350:20;38368:1;38350:20;:::i;:::-;38345:25;;38538:1;38470:66;38466:74;38463:1;38460:81;38455:1;38448:9;38441:17;38437:105;38434:2;;;38545:18;;:::i;:::-;38434:2;38593:1;38590;38586:9;38575:20;;38301:300;;;;:::o;38607:191::-;38647:4;38667:20;38685:1;38667:20;:::i;:::-;38662:25;;38701:20;38719:1;38701:20;:::i;:::-;38696:25;;38740:1;38737;38734:8;38731:2;;;38745:18;;:::i;:::-;38731:2;38790:1;38787;38783:9;38775:17;;38652:146;;;;:::o;38804:96::-;38841:7;38870:24;38888:5;38870:24;:::i;:::-;38859:35;;38849:51;;;:::o;38906:104::-;38951:7;38980:24;38998:5;38980:24;:::i;:::-;38969:35;;38959:51;;;:::o;39016:90::-;39050:7;39093:5;39086:13;39079:21;39068:32;;39058:48;;;:::o;39112:149::-;39148:7;39188:66;39181:5;39177:78;39166:89;;39156:105;;;:::o;39267:133::-;39315:7;39344:5;39333:16;;39350:44;39388:5;39350:44;:::i;:::-;39323:77;;;:::o;39406:126::-;39443:7;39483:42;39476:5;39472:54;39461:65;;39451:81;;;:::o;39538:77::-;39575:7;39604:5;39593:16;;39583:32;;;:::o;39621:133::-;39680:9;39713:35;39742:5;39713:35;:::i;:::-;39700:48;;39690:64;;;:::o;39760:154::-;39844:6;39839:3;39834;39821:30;39906:1;39897:6;39892:3;39888:16;39881:27;39811:103;;;:::o;39920:307::-;39988:1;39998:113;40012:6;40009:1;40006:13;39998:113;;;40097:1;40092:3;40088:11;40082:18;40078:1;40073:3;40069:11;40062:39;40034:2;40031:1;40027:10;40022:15;;39998:113;;;40129:6;40126:1;40123:13;40120:2;;;40209:1;40200:6;40195:3;40191:16;40184:27;40120:2;39969:258;;;;:::o;40233:320::-;40277:6;40314:1;40308:4;40304:12;40294:22;;40361:1;40355:4;40351:12;40382:18;40372:2;;40438:4;40430:6;40426:17;40416:27;;40372:2;40500;40492:6;40489:14;40469:18;40466:38;40463:2;;;40519:18;;:::i;:::-;40463:2;40284:269;;;;:::o;40559:281::-;40642:27;40664:4;40642:27;:::i;:::-;40634:6;40630:40;40772:6;40760:10;40757:22;40736:18;40724:10;40721:34;40718:62;40715:2;;;40783:18;;:::i;:::-;40715:2;40823:10;40819:2;40812:22;40602:238;;;:::o;40846:233::-;40885:3;40908:24;40926:5;40908:24;:::i;:::-;40899:33;;40954:66;40947:5;40944:77;40941:2;;;41024:18;;:::i;:::-;40941:2;41071:1;41064:5;41060:13;41053:20;;40889:190;;;:::o;41085:100::-;41124:7;41153:26;41173:5;41153:26;:::i;:::-;41142:37;;41132:53;;;:::o;41191:94::-;41230:7;41259:20;41273:5;41259:20;:::i;:::-;41248:31;;41238:47;;;:::o;41291:176::-;41323:1;41340:20;41358:1;41340:20;:::i;:::-;41335:25;;41374:20;41392:1;41374:20;:::i;:::-;41369:25;;41413:1;41403:2;;41418:18;;:::i;:::-;41403:2;41459:1;41456;41452:9;41447:14;;41325:142;;;;:::o;41473:180::-;41521:77;41518:1;41511:88;41618:4;41615:1;41608:15;41642:4;41639:1;41632:15;41659:180;41707:77;41704:1;41697:88;41804:4;41801:1;41794:15;41828:4;41825:1;41818:15;41845:180;41893:77;41890:1;41883:88;41990:4;41987:1;41980:15;42014:4;42011:1;42004:15;42031:180;42079:77;42076:1;42069:88;42176:4;42173:1;42166:15;42200:4;42197:1;42190:15;42217:180;42265:77;42262:1;42255:88;42362:4;42359:1;42352:15;42386:4;42383:1;42376:15;42403:180;42451:77;42448:1;42441:88;42548:4;42545:1;42538:15;42572:4;42569:1;42562:15;42589:180;42637:77;42634:1;42627:88;42734:4;42731:1;42724:15;42758:4;42755:1;42748:15;42775:117;42884:1;42881;42874:12;42898:117;43007:1;43004;42997:12;43021:117;43130:1;43127;43120:12;43144:117;43253:1;43250;43243:12;43267:117;43376:1;43373;43366:12;43390:117;43499:1;43496;43489:12;43513:102;43554:6;43605:2;43601:7;43596:2;43589:5;43585:14;43581:28;43571:38;;43561:54;;;:::o;43621:94::-;43654:8;43702:5;43698:2;43694:14;43673:35;;43663:52;;;:::o;43721:170::-;43861:22;43857:1;43849:6;43845:14;43838:46;43827:64;:::o;43897:166::-;44037:18;44033:1;44025:6;44021:14;44014:42;44003:60;:::o;44069:230::-;44209:34;44205:1;44197:6;44193:14;44186:58;44278:13;44273:2;44265:6;44261:15;44254:38;44175:124;:::o;44305:237::-;44445:34;44441:1;44433:6;44429:14;44422:58;44514:20;44509:2;44501:6;44497:15;44490:45;44411:131;:::o;44548:225::-;44688:34;44684:1;44676:6;44672:14;44665:58;44757:8;44752:2;44744:6;44740:15;44733:33;44654:119;:::o;44779:224::-;44919:34;44915:1;44907:6;44903:14;44896:58;44988:7;44983:2;44975:6;44971:15;44964:32;44885:118;:::o;45009:178::-;45149:30;45145:1;45137:6;45133:14;45126:54;45115:72;:::o;45193:223::-;45333:34;45329:1;45321:6;45317:14;45310:58;45402:6;45397:2;45389:6;45385:15;45378:31;45299:117;:::o;45422:175::-;45562:27;45558:1;45550:6;45546:14;45539:51;45528:69;:::o;45603:231::-;45743:34;45739:1;45731:6;45727:14;45720:58;45812:14;45807:2;45799:6;45795:15;45788:39;45709:125;:::o;45840:167::-;45980:19;45976:1;45968:6;45964:14;45957:43;45946:61;:::o;46013:172::-;46153:24;46149:1;46141:6;46137:14;46130:48;46119:66;:::o;46191:168::-;46331:20;46327:1;46319:6;46315:14;46308:44;46297:62;:::o;46365:243::-;46505:34;46501:1;46493:6;46489:14;46482:58;46574:26;46569:2;46561:6;46557:15;46550:51;46471:137;:::o;46614:166::-;46754:18;46750:1;46742:6;46738:14;46731:42;46720:60;:::o;46786:229::-;46926:34;46922:1;46914:6;46910:14;46903:58;46995:12;46990:2;46982:6;46978:15;46971:37;46892:123;:::o;47021:228::-;47161:34;47157:1;47149:6;47145:14;47138:58;47230:11;47225:2;47217:6;47213:15;47206:36;47127:122;:::o;47255:182::-;47395:34;47391:1;47383:6;47379:14;47372:58;47361:76;:::o;47443:182::-;47583:34;47579:1;47571:6;47567:14;47560:58;47549:76;:::o;47631:231::-;47771:34;47767:1;47759:6;47755:14;47748:58;47840:14;47835:2;47827:6;47823:15;47816:39;47737:125;:::o;47868:182::-;48008:34;48004:1;47996:6;47992:14;47985:58;47974:76;:::o;48056:234::-;48196:34;48192:1;48184:6;48180:14;48173:58;48265:17;48260:2;48252:6;48248:15;48241:42;48162:128;:::o;48296:220::-;48436:34;48432:1;48424:6;48420:14;48413:58;48505:3;48500:2;48492:6;48488:15;48481:28;48402:114;:::o;48522:166::-;48662:18;48658:1;48650:6;48646:14;48639:42;48628:60;:::o;48694:236::-;48834:34;48830:1;48822:6;48818:14;48811:58;48903:19;48898:2;48890:6;48886:15;48879:44;48800:130;:::o;48936:231::-;49076:34;49072:1;49064:6;49060:14;49053:58;49145:14;49140:2;49132:6;49128:15;49121:39;49042:125;:::o;49173:157::-;49313:9;49309:1;49301:6;49297:14;49290:33;49279:51;:::o;49336:176::-;49476:28;49472:1;49464:6;49460:14;49453:52;49442:70;:::o;49518:116::-;49602:1;49595:5;49592:12;49582:2;;49608:18;;:::i;:::-;49582:2;49572:62;:::o;49640:122::-;49713:24;49731:5;49713:24;:::i;:::-;49706:5;49703:35;49693:2;;49752:1;49749;49742:12;49693:2;49683:79;:::o;49768:138::-;49849:32;49875:5;49849:32;:::i;:::-;49842:5;49839:43;49829:2;;49896:1;49893;49886:12;49829:2;49819:87;:::o;49912:116::-;49982:21;49997:5;49982:21;:::i;:::-;49975:5;49972:32;49962:2;;50018:1;50015;50008:12;49962:2;49952:76;:::o;50034:120::-;50106:23;50123:5;50106:23;:::i;:::-;50099:5;50096:34;50086:2;;50144:1;50141;50134:12;50086:2;50076:78;:::o;50160:110::-;50244:1;50237:5;50234:12;50224:2;;50260:1;50257;50250:12;50224:2;50214:56;:::o;50276:122::-;50349:24;50367:5;50349:24;:::i;:::-;50342:5;50339:35;50329:2;;50388:1;50385;50378:12;50329:2;50319:79;:::o

Swarm Source

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