ETH Price: $3,395.05 (+4.51%)
Gas: 2 Gwei

Token

3877 (TESS)
 

Overview

Max Total Supply

69 TESS

Holders

27

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TESS
0xb5112778b8b562bfbb96c12b7bcfc0c138a7e176
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:
ThreeEightSevenSeven

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-25
*/

// Sources flattened with hardhat v2.10.1 https://hardhat.org
// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC721/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/token/ERC721/[email protected]
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/token/ERC721/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

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

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File @openzeppelin/contracts/utils/cryptography/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

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

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File @openzeppelin/contracts/access/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/security/[email protected]
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File contracts/TESS.sol
pragma solidity ^0.8.9; // solhint-disable-line

contract ThreeEightSevenSeven is ERC721, Ownable, ReentrancyGuard {
    // Using counters diminish gasfees consumption 👉 https://shiny.mirror.xyz/OUampBbIz9ebEicfGnQf5At_ReMHlZy0tB4glb9xQ0E
    using Counters for Counters.Counter;

    // MerkleRoot is used in order to check the allowList
    bytes32 public merkleRoot;
    bool public isAllowListActive;

    bool public isPublicSaleActive;
    bool public reserveClaimed = false;
    uint256 public constant MAX_SUPPLY = 877;
    uint256 public constant RESERVE_SUPPLY = 30;
    uint256 public mintLimit = 3;
    uint256 public tokenPrice;
    string private _baseURIextended;
    Counters.Counter private _tokenSupply;

    constructor() ERC721("3877", "TESS") {}

    function setPrice(uint256 price) public onlyOwner {
        tokenPrice = price;
    }

    function _tokenPrice() public view returns (uint256) {
        return tokenPrice;
    }

    function setMaxMintPerPerson(uint256 numberMax) public onlyOwner {
        mintLimit = numberMax;
    }

    function totalSupply() public view returns (uint256) {
        return _tokenSupply.current();
    }

    function setAllowList(bytes32 merkleRoot_) external onlyOwner {
        merkleRoot = merkleRoot_;
    }

    function setAllowListActive(bool isAllowListActive_) external onlyOwner {
        isAllowListActive = isAllowListActive_;
    }

    /**
     * onAllowList: Check if the 'claimer' address is present in the allow list.
     * In other words, check if a leaf with the 'claimer' value
     * is present in the stored merkle tree.
     *
     * See Open Zeppelin's 'MerkleProof' library implementation.
     */
    function onAllowList(address claimer, bytes32[] memory proof) public view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(claimer));
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }

    function whitelistMint(bytes32[] calldata merkleProof, uint256 numberOfTokens)
        external
        payable
        nonReentrant
    {
        require(isAllowListActive, "Allow list is not active");
        require(onAllowList(msg.sender, merkleProof), "Address not in allow list");
        require(balanceOf(msg.sender) + numberOfTokens <= mintLimit, "Can't min't that much NFTs");
        require(tokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        require(msg.sender == tx.origin, "Bots not allowed");
        require(totalSupply() + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");

        for (uint256 i = 1; i <= numberOfTokens; i++) {
            _tokenSupply.increment();
            _safeMint(msg.sender, totalSupply());
        }
    }

    function reserve() external onlyOwner {
        require(!reserveClaimed, "Reserve already claimed");
        reserveClaimed = true;

        uint256 i;
        for (i = 1; i <= RESERVE_SUPPLY; i++) {
            _tokenSupply.increment();
            _safeMint(msg.sender, totalSupply());
        }
    }

    function setPublicSaleActive(bool isPublicSaleActive_) external onlyOwner {
        isPublicSaleActive = isPublicSaleActive_;
    }

    function mint(uint256 numberOfTokens) external payable nonReentrant {
        require(isPublicSaleActive, "Public sale is not open yet");
        require(balanceOf(msg.sender) + numberOfTokens <= mintLimit, "Can't min't that much NFTs");
        require(tokenPrice * numberOfTokens <= msg.value, "Ether value sent is not correct");
        require(msg.sender == tx.origin, "Bots not allowed");
        require(totalSupply() + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");

        for (uint256 i = 1; i <= numberOfTokens; i++) {
            _tokenSupply.increment();
            _safeMint(msg.sender, totalSupply());
        }
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        _baseURIextended = baseURI_;
    }

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

    /**
     * Optional override for modifying the token URI before return.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override(ERC721)
        returns (string memory)
    {
        string memory uri = super.tokenURI(tokenId);
        return bytes(uri).length > 0 ? string(abi.encodePacked(uri, ".json")) : "";
    }

    function withdraw(address payable to) external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        Address.sendValue(to, balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenPrice","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimer","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"onAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isAllowListActive_","type":"bool"}],"name":"setAllowListActive","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberMax","type":"uint256"}],"name":"setMaxMintPerPerson","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPublicSaleActive_","type":"bool"}],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","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":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600960026101000a81548160ff0219169083151502179055506003600a553480156200003157600080fd5b506040518060400160405280600481526020017f33383737000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f54455353000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b6929190620001ce565b508060019080519060200190620000cf929190620001ce565b505050620000f2620000e66200010060201b60201c565b6200010860201b60201c565b6001600781905550620002e3565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001dc90620002ad565b90600052602060002090601f0160209004810192826200020057600085556200024c565b82601f106200021b57805160ff19168380011785556200024c565b828001600101855582156200024c579182015b828111156200024b5782518255916020019190600101906200022e565b5b5090506200025b91906200025f565b5090565b5b808211156200027a57600081600090555060010162000260565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002c657607f821691505b60208210811415620002dd57620002dc6200027e565b5b50919050565b61428a80620002f36000396000f3fe60806040526004361061021a5760003560e01c806370a0823111610123578063a0712d68116100ab578063c87b56dd1161006f578063c87b56dd14610791578063cd3293de146107ce578063e2e06fa3146107e5578063e985e9c51461080e578063f2fde38b1461084b5761021a565b8063a0712d68146106bb578063a22cb465146106d7578063aa66797b14610700578063b32c56801461072b578063b88d4fde146107685761021a565b80638da5cb5b116100f25780638da5cb5b146105e857806391b7f5ed1461061357806395bd19c21461063c57806395d89b4114610665578063996517cf146106905761021a565b806370a0823114610540578063715018a61461057d5780637ff9b5961461059457806384584d07146105bf5761021a565b80632eb4a7ab116101a657806342842e0e1161017557806342842e0e1461045d57806351cff8d91461048657806355f804b3146104af5780635d3512a9146104d85780636352211e146105035761021a565b80632eb4a7ab146103b357806332cb6b0c146103de5780633a73c58d146104095780633b971f9f146104325761021a565b806318160ddd116101ed57806318160ddd146102ed5780631e84c4131461031857806323b872dd146103435780632904e6d91461036c57806329fc6bae146103885761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906128c2565b610874565b604051610253919061290a565b60405180910390f35b34801561026857600080fd5b50610271610956565b60405161027e91906129be565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612a16565b6109e8565b6040516102bb9190612a84565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190612acb565b610a2e565b005b3480156102f957600080fd5b50610302610b46565b60405161030f9190612b1a565b60405180910390f35b34801561032457600080fd5b5061032d610b57565b60405161033a919061290a565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612b35565b610b6a565b005b61038660048036038101906103819190612bed565b610bca565b005b34801561039457600080fd5b5061039d610ea8565b6040516103aa919061290a565b60405180910390f35b3480156103bf57600080fd5b506103c8610ebb565b6040516103d59190612c66565b60405180910390f35b3480156103ea57600080fd5b506103f3610ec1565b6040516104009190612b1a565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190612cad565b610ec7565b005b34801561043e57600080fd5b50610447610eec565b6040516104549190612b1a565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190612b35565b610ef6565b005b34801561049257600080fd5b506104ad60048036038101906104a89190612d18565b610f16565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190612e75565b610f87565b005b3480156104e457600080fd5b506104ed610fa9565b6040516104fa919061290a565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190612a16565b610fbc565b6040516105379190612a84565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190612ebe565b61106e565b6040516105749190612b1a565b60405180910390f35b34801561058957600080fd5b50610592611126565b005b3480156105a057600080fd5b506105a961113a565b6040516105b69190612b1a565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e19190612f17565b611140565b005b3480156105f457600080fd5b506105fd611152565b60405161060a9190612a84565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190612a16565b61117c565b005b34801561064857600080fd5b50610663600480360381019061065e9190612a16565b61118e565b005b34801561067157600080fd5b5061067a6111a0565b60405161068791906129be565b60405180910390f35b34801561069c57600080fd5b506106a5611232565b6040516106b29190612b1a565b60405180910390f35b6106d560048036038101906106d09190612a16565b611238565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190612f44565b61148a565b005b34801561070c57600080fd5b506107156114a0565b6040516107229190612b1a565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190613047565b6114a5565b60405161075f919061290a565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a9190613144565b6114e7565b005b34801561079d57600080fd5b506107b860048036038101906107b39190612a16565b611549565b6040516107c591906129be565b60405180910390f35b3480156107da57600080fd5b506107e361159f565b005b3480156107f157600080fd5b5061080c60048036038101906108079190612cad565b611652565b005b34801561081a57600080fd5b50610835600480360381019061083091906131c7565b611677565b604051610842919061290a565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190612ebe565b61170b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094f575061094e8261178f565b5b9050919050565b60606000805461096590613236565b80601f016020809104026020016040519081016040528092919081815260200182805461099190613236565b80156109de5780601f106109b3576101008083540402835291602001916109de565b820191906000526020600020905b8154815290600101906020018083116109c157829003601f168201915b5050505050905090565b60006109f3826117f9565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3982610fbc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa1906132da565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac9611844565b73ffffffffffffffffffffffffffffffffffffffff161480610af85750610af781610af2611844565b611677565b5b610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e9061336c565b60405180910390fd5b610b41838361184c565b505050565b6000610b52600d611905565b905090565b600960019054906101000a900460ff1681565b610b7b610b75611844565b82611913565b610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb1906133fe565b60405180910390fd5b610bc58383836119a8565b505050565b60026007541415610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c079061346a565b60405180910390fd5b6002600781905550600960009054906101000a900460ff16610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e906134d6565b60405180910390fd5b610cb233848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506114a5565b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890613542565b60405180910390fd5b600a5481610cfe3361106e565b610d089190613591565b1115610d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4090613633565b60405180910390fd5b3481600b54610d589190613653565b1115610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d90906136f9565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90613765565b60405180910390fd5b61036d81610e13610b46565b610e1d9190613591565b1115610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e55906137d1565b60405180910390fd5b6000600190505b818111610e9a57610e76600d611c0f565b610e8733610e82610b46565b611c25565b8080610e92906137f1565b915050610e65565b506001600781905550505050565b600960009054906101000a900460ff1681565b60085481565b61036d81565b610ecf611c43565b80600960006101000a81548160ff02191690831515021790555050565b6000600b54905090565b610f11838383604051806020016040528060008152506114e7565b505050565b610f1e611c43565b60026007541415610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b9061346a565b60405180910390fd5b60026007819055506000479050610f7b8282611cc1565b50600160078190555050565b610f8f611c43565b80600c9080519060200190610fa59291906127b3565b5050565b600960029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90613886565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690613918565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61112e611c43565b6111386000611db5565b565b600b5481565b611148611c43565b8060088190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611184611c43565b80600b8190555050565b611196611c43565b80600a8190555050565b6060600180546111af90613236565b80601f01602080910402602001604051908101604052809291908181526020018280546111db90613236565b80156112285780601f106111fd57610100808354040283529160200191611228565b820191906000526020600020905b81548152906001019060200180831161120b57829003601f168201915b5050505050905090565b600a5481565b6002600754141561127e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112759061346a565b60405180910390fd5b6002600781905550600960019054906101000a900460ff166112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90613984565b60405180910390fd5b600a54816112e23361106e565b6112ec9190613591565b111561132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132490613633565b60405180910390fd5b3481600b5461133c9190613653565b111561137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374906136f9565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e290613765565b60405180910390fd5b61036d816113f7610b46565b6114019190613591565b1115611442576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611439906137d1565b60405180910390fd5b6000600190505b81811161147e5761145a600d611c0f565b61146b33611466610b46565b611c25565b8080611476906137f1565b915050611449565b50600160078190555050565b61149c611495611844565b8383611e7b565b5050565b601e81565b600080836040516020016114b991906139ec565b6040516020818303038152906040528051906020012090506114de8360085483611fe8565b91505092915050565b6114f86114f2611844565b83611913565b611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e906133fe565b60405180910390fd5b61154384848484611fff565b50505050565b606060006115568361205b565b905060008151116115765760405180602001604052806000815250611597565b806040516020016115879190613a8f565b6040516020818303038152906040525b915050919050565b6115a7611c43565b600960029054906101000a900460ff16156115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90613afd565b60405180910390fd5b6001600960026101000a81548160ff0219169083151502179055506000600190505b601e811161164f5761162b600d611c0f565b61163c33611637610b46565b611c25565b8080611647906137f1565b915050611619565b50565b61165a611c43565b80600960016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611713611c43565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90613b8f565b60405180910390fd5b61178c81611db5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611802816120c3565b611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890613886565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118bf83610fbc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008061191f83610fbc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061196157506119608185611677565b5b8061199f57508373ffffffffffffffffffffffffffffffffffffffff16611987846109e8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119c882610fbc565b73ffffffffffffffffffffffffffffffffffffffff1614611a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1590613c21565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590613cb3565b60405180910390fd5b611a9983838361212f565b611aa460008261184c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611af49190613cd3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b4b9190613591565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c0a838383612134565b505050565b6001816000016000828254019250508190555050565b611c3f828260405180602001604052806000815250612139565b5050565b611c4b611844565b73ffffffffffffffffffffffffffffffffffffffff16611c69611152565b73ffffffffffffffffffffffffffffffffffffffff1614611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690613d53565b60405180910390fd5b565b80471015611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90613dbf565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611d2a90613e10565b60006040518083038185875af1925050503d8060008114611d67576040519150601f19603f3d011682016040523d82523d6000602084013e611d6c565b606091505b5050905080611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da790613e97565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee190613f03565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fdb919061290a565b60405180910390a3505050565b600082611ff58584612194565b1490509392505050565b61200a8484846119a8565b612016848484846121ea565b612055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204c90613f95565b60405180910390fd5b50505050565b6060612066826117f9565b6000612070612381565b9050600081511161209057604051806020016040528060008152506120bb565b8061209a84612413565b6040516020016120ab929190613fb5565b6040516020818303038152906040525b915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6121438383612574565b61215060008484846121ea565b61218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690613f95565b60405180910390fd5b505050565b60008082905060005b84518110156121df576121ca828683815181106121bd576121bc613fd9565b5b602002602001015161274e565b915080806121d7906137f1565b91505061219d565b508091505092915050565b600061220b8473ffffffffffffffffffffffffffffffffffffffff16612779565b15612374578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612234611844565b8786866040518563ffffffff1660e01b8152600401612256949392919061405d565b602060405180830381600087803b15801561227057600080fd5b505af19250505080156122a157506040513d601f19601f8201168201806040525081019061229e91906140be565b60015b612324573d80600081146122d1576040519150601f19603f3d011682016040523d82523d6000602084013e6122d6565b606091505b5060008151141561231c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231390613f95565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612379565b600190505b949350505050565b6060600c805461239090613236565b80601f01602080910402602001604051908101604052809291908181526020018280546123bc90613236565b80156124095780601f106123de57610100808354040283529160200191612409565b820191906000526020600020905b8154815290600101906020018083116123ec57829003601f168201915b5050505050905090565b6060600082141561245b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061256f565b600082905060005b6000821461248d578080612476906137f1565b915050600a82612486919061411a565b9150612463565b60008167ffffffffffffffff8111156124a9576124a8612d4a565b5b6040519080825280601f01601f1916602001820160405280156124db5781602001600182028036833780820191505090505b5090505b60008514612568576001826124f49190613cd3565b9150600a85612503919061414b565b603061250f9190613591565b60f81b81838151811061252557612524613fd9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612561919061411a565b94506124df565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125db906141c8565b60405180910390fd5b6125ed816120c3565b1561262d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262490614234565b60405180910390fd5b6126396000838361212f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126899190613591565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461274a60008383612134565b5050565b600081831061276657612761828461279c565b612771565b612770838361279c565b5b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b8280546127bf90613236565b90600052602060002090601f0160209004810192826127e15760008555612828565b82601f106127fa57805160ff1916838001178555612828565b82800160010185558215612828579182015b8281111561282757825182559160200191906001019061280c565b5b5090506128359190612839565b5090565b5b8082111561285257600081600090555060010161283a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61289f8161286a565b81146128aa57600080fd5b50565b6000813590506128bc81612896565b92915050565b6000602082840312156128d8576128d7612860565b5b60006128e6848285016128ad565b91505092915050565b60008115159050919050565b612904816128ef565b82525050565b600060208201905061291f60008301846128fb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561295f578082015181840152602081019050612944565b8381111561296e576000848401525b50505050565b6000601f19601f8301169050919050565b600061299082612925565b61299a8185612930565b93506129aa818560208601612941565b6129b381612974565b840191505092915050565b600060208201905081810360008301526129d88184612985565b905092915050565b6000819050919050565b6129f3816129e0565b81146129fe57600080fd5b50565b600081359050612a10816129ea565b92915050565b600060208284031215612a2c57612a2b612860565b5b6000612a3a84828501612a01565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a6e82612a43565b9050919050565b612a7e81612a63565b82525050565b6000602082019050612a996000830184612a75565b92915050565b612aa881612a63565b8114612ab357600080fd5b50565b600081359050612ac581612a9f565b92915050565b60008060408385031215612ae257612ae1612860565b5b6000612af085828601612ab6565b9250506020612b0185828601612a01565b9150509250929050565b612b14816129e0565b82525050565b6000602082019050612b2f6000830184612b0b565b92915050565b600080600060608486031215612b4e57612b4d612860565b5b6000612b5c86828701612ab6565b9350506020612b6d86828701612ab6565b9250506040612b7e86828701612a01565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612bad57612bac612b88565b5b8235905067ffffffffffffffff811115612bca57612bc9612b8d565b5b602083019150836020820283011115612be657612be5612b92565b5b9250929050565b600080600060408486031215612c0657612c05612860565b5b600084013567ffffffffffffffff811115612c2457612c23612865565b5b612c3086828701612b97565b93509350506020612c4386828701612a01565b9150509250925092565b6000819050919050565b612c6081612c4d565b82525050565b6000602082019050612c7b6000830184612c57565b92915050565b612c8a816128ef565b8114612c9557600080fd5b50565b600081359050612ca781612c81565b92915050565b600060208284031215612cc357612cc2612860565b5b6000612cd184828501612c98565b91505092915050565b6000612ce582612a43565b9050919050565b612cf581612cda565b8114612d0057600080fd5b50565b600081359050612d1281612cec565b92915050565b600060208284031215612d2e57612d2d612860565b5b6000612d3c84828501612d03565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d8282612974565b810181811067ffffffffffffffff82111715612da157612da0612d4a565b5b80604052505050565b6000612db4612856565b9050612dc08282612d79565b919050565b600067ffffffffffffffff821115612de057612ddf612d4a565b5b612de982612974565b9050602081019050919050565b82818337600083830152505050565b6000612e18612e1384612dc5565b612daa565b905082815260208101848484011115612e3457612e33612d45565b5b612e3f848285612df6565b509392505050565b600082601f830112612e5c57612e5b612b88565b5b8135612e6c848260208601612e05565b91505092915050565b600060208284031215612e8b57612e8a612860565b5b600082013567ffffffffffffffff811115612ea957612ea8612865565b5b612eb584828501612e47565b91505092915050565b600060208284031215612ed457612ed3612860565b5b6000612ee284828501612ab6565b91505092915050565b612ef481612c4d565b8114612eff57600080fd5b50565b600081359050612f1181612eeb565b92915050565b600060208284031215612f2d57612f2c612860565b5b6000612f3b84828501612f02565b91505092915050565b60008060408385031215612f5b57612f5a612860565b5b6000612f6985828601612ab6565b9250506020612f7a85828601612c98565b9150509250929050565b600067ffffffffffffffff821115612f9f57612f9e612d4a565b5b602082029050602081019050919050565b6000612fc3612fbe84612f84565b612daa565b90508083825260208201905060208402830185811115612fe657612fe5612b92565b5b835b8181101561300f5780612ffb8882612f02565b845260208401935050602081019050612fe8565b5050509392505050565b600082601f83011261302e5761302d612b88565b5b813561303e848260208601612fb0565b91505092915050565b6000806040838503121561305e5761305d612860565b5b600061306c85828601612ab6565b925050602083013567ffffffffffffffff81111561308d5761308c612865565b5b61309985828601613019565b9150509250929050565b600067ffffffffffffffff8211156130be576130bd612d4a565b5b6130c782612974565b9050602081019050919050565b60006130e76130e2846130a3565b612daa565b90508281526020810184848401111561310357613102612d45565b5b61310e848285612df6565b509392505050565b600082601f83011261312b5761312a612b88565b5b813561313b8482602086016130d4565b91505092915050565b6000806000806080858703121561315e5761315d612860565b5b600061316c87828801612ab6565b945050602061317d87828801612ab6565b935050604061318e87828801612a01565b925050606085013567ffffffffffffffff8111156131af576131ae612865565b5b6131bb87828801613116565b91505092959194509250565b600080604083850312156131de576131dd612860565b5b60006131ec85828601612ab6565b92505060206131fd85828601612ab6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061324e57607f821691505b6020821081141561326257613261613207565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006132c4602183612930565b91506132cf82613268565b604082019050919050565b600060208201905081810360008301526132f3816132b7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613356603e83612930565b9150613361826132fa565b604082019050919050565b6000602082019050818103600083015261338581613349565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006133e8602e83612930565b91506133f38261338c565b604082019050919050565b60006020820190508181036000830152613417816133db565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613454601f83612930565b915061345f8261341e565b602082019050919050565b6000602082019050818103600083015261348381613447565b9050919050565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b60006134c0601883612930565b91506134cb8261348a565b602082019050919050565b600060208201905081810360008301526134ef816134b3565b9050919050565b7f41646472657373206e6f7420696e20616c6c6f77206c69737400000000000000600082015250565b600061352c601983612930565b9150613537826134f6565b602082019050919050565b6000602082019050818103600083015261355b8161351f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061359c826129e0565b91506135a7836129e0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135dc576135db613562565b5b828201905092915050565b7f43616e2774206d696e27742074686174206d756368204e465473000000000000600082015250565b600061361d601a83612930565b9150613628826135e7565b602082019050919050565b6000602082019050818103600083015261364c81613610565b9050919050565b600061365e826129e0565b9150613669836129e0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136a2576136a1613562565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b60006136e3601f83612930565b91506136ee826136ad565b602082019050919050565b60006020820190508181036000830152613712816136d6565b9050919050565b7f426f7473206e6f7420616c6c6f77656400000000000000000000000000000000600082015250565b600061374f601083612930565b915061375a82613719565b602082019050919050565b6000602082019050818103600083015261377e81613742565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b60006137bb602083612930565b91506137c682613785565b602082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b60006137fc826129e0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561382f5761382e613562565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613870601883612930565b915061387b8261383a565b602082019050919050565b6000602082019050818103600083015261389f81613863565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613902602983612930565b915061390d826138a6565b604082019050919050565b60006020820190508181036000830152613931816138f5565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e207965740000000000600082015250565b600061396e601b83612930565b915061397982613938565b602082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b60008160601b9050919050565b60006139bc826139a4565b9050919050565b60006139ce826139b1565b9050919050565b6139e66139e182612a63565b6139c3565b82525050565b60006139f882846139d5565b60148201915081905092915050565b600081905092915050565b6000613a1d82612925565b613a278185613a07565b9350613a37818560208601612941565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a79600583613a07565b9150613a8482613a43565b600582019050919050565b6000613a9b8284613a12565b9150613aa682613a6c565b915081905092915050565b7f5265736572766520616c726561647920636c61696d6564000000000000000000600082015250565b6000613ae7601783612930565b9150613af282613ab1565b602082019050919050565b60006020820190508181036000830152613b1681613ada565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b79602683612930565b9150613b8482613b1d565b604082019050919050565b60006020820190508181036000830152613ba881613b6c565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c0b602583612930565b9150613c1682613baf565b604082019050919050565b60006020820190508181036000830152613c3a81613bfe565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613c9d602483612930565b9150613ca882613c41565b604082019050919050565b60006020820190508181036000830152613ccc81613c90565b9050919050565b6000613cde826129e0565b9150613ce9836129e0565b925082821015613cfc57613cfb613562565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d3d602083612930565b9150613d4882613d07565b602082019050919050565b60006020820190508181036000830152613d6c81613d30565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613da9601d83612930565b9150613db482613d73565b602082019050919050565b60006020820190508181036000830152613dd881613d9c565b9050919050565b600081905092915050565b50565b6000613dfa600083613ddf565b9150613e0582613dea565b600082019050919050565b6000613e1b82613ded565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613e81603a83612930565b9150613e8c82613e25565b604082019050919050565b60006020820190508181036000830152613eb081613e74565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613eed601983612930565b9150613ef882613eb7565b602082019050919050565b60006020820190508181036000830152613f1c81613ee0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f7f603283612930565b9150613f8a82613f23565b604082019050919050565b60006020820190508181036000830152613fae81613f72565b9050919050565b6000613fc18285613a12565b9150613fcd8284613a12565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061402f82614008565b6140398185614013565b9350614049818560208601612941565b61405281612974565b840191505092915050565b60006080820190506140726000830187612a75565b61407f6020830186612a75565b61408c6040830185612b0b565b818103606083015261409e8184614024565b905095945050505050565b6000815190506140b881612896565b92915050565b6000602082840312156140d4576140d3612860565b5b60006140e2848285016140a9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614125826129e0565b9150614130836129e0565b9250826141405761413f6140eb565b5b828204905092915050565b6000614156826129e0565b9150614161836129e0565b925082614171576141706140eb565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006141b2602083612930565b91506141bd8261417c565b602082019050919050565b600060208201905081810360008301526141e1816141a5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061421e601c83612930565b9150614229826141e8565b602082019050919050565b6000602082019050818103600083015261424d81614211565b905091905056fea2646970667358221220b29bddb1fe337b4c3dc6fc0562430a7a0f121e7ffdba32732a8f09239d8536ef64736f6c63430008090033

Deployed Bytecode

0x60806040526004361061021a5760003560e01c806370a0823111610123578063a0712d68116100ab578063c87b56dd1161006f578063c87b56dd14610791578063cd3293de146107ce578063e2e06fa3146107e5578063e985e9c51461080e578063f2fde38b1461084b5761021a565b8063a0712d68146106bb578063a22cb465146106d7578063aa66797b14610700578063b32c56801461072b578063b88d4fde146107685761021a565b80638da5cb5b116100f25780638da5cb5b146105e857806391b7f5ed1461061357806395bd19c21461063c57806395d89b4114610665578063996517cf146106905761021a565b806370a0823114610540578063715018a61461057d5780637ff9b5961461059457806384584d07146105bf5761021a565b80632eb4a7ab116101a657806342842e0e1161017557806342842e0e1461045d57806351cff8d91461048657806355f804b3146104af5780635d3512a9146104d85780636352211e146105035761021a565b80632eb4a7ab146103b357806332cb6b0c146103de5780633a73c58d146104095780633b971f9f146104325761021a565b806318160ddd116101ed57806318160ddd146102ed5780631e84c4131461031857806323b872dd146103435780632904e6d91461036c57806329fc6bae146103885761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b50610246600480360381019061024191906128c2565b610874565b604051610253919061290a565b60405180910390f35b34801561026857600080fd5b50610271610956565b60405161027e91906129be565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190612a16565b6109e8565b6040516102bb9190612a84565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190612acb565b610a2e565b005b3480156102f957600080fd5b50610302610b46565b60405161030f9190612b1a565b60405180910390f35b34801561032457600080fd5b5061032d610b57565b60405161033a919061290a565b60405180910390f35b34801561034f57600080fd5b5061036a60048036038101906103659190612b35565b610b6a565b005b61038660048036038101906103819190612bed565b610bca565b005b34801561039457600080fd5b5061039d610ea8565b6040516103aa919061290a565b60405180910390f35b3480156103bf57600080fd5b506103c8610ebb565b6040516103d59190612c66565b60405180910390f35b3480156103ea57600080fd5b506103f3610ec1565b6040516104009190612b1a565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190612cad565b610ec7565b005b34801561043e57600080fd5b50610447610eec565b6040516104549190612b1a565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190612b35565b610ef6565b005b34801561049257600080fd5b506104ad60048036038101906104a89190612d18565b610f16565b005b3480156104bb57600080fd5b506104d660048036038101906104d19190612e75565b610f87565b005b3480156104e457600080fd5b506104ed610fa9565b6040516104fa919061290a565b60405180910390f35b34801561050f57600080fd5b5061052a60048036038101906105259190612a16565b610fbc565b6040516105379190612a84565b60405180910390f35b34801561054c57600080fd5b5061056760048036038101906105629190612ebe565b61106e565b6040516105749190612b1a565b60405180910390f35b34801561058957600080fd5b50610592611126565b005b3480156105a057600080fd5b506105a961113a565b6040516105b69190612b1a565b60405180910390f35b3480156105cb57600080fd5b506105e660048036038101906105e19190612f17565b611140565b005b3480156105f457600080fd5b506105fd611152565b60405161060a9190612a84565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190612a16565b61117c565b005b34801561064857600080fd5b50610663600480360381019061065e9190612a16565b61118e565b005b34801561067157600080fd5b5061067a6111a0565b60405161068791906129be565b60405180910390f35b34801561069c57600080fd5b506106a5611232565b6040516106b29190612b1a565b60405180910390f35b6106d560048036038101906106d09190612a16565b611238565b005b3480156106e357600080fd5b506106fe60048036038101906106f99190612f44565b61148a565b005b34801561070c57600080fd5b506107156114a0565b6040516107229190612b1a565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190613047565b6114a5565b60405161075f919061290a565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a9190613144565b6114e7565b005b34801561079d57600080fd5b506107b860048036038101906107b39190612a16565b611549565b6040516107c591906129be565b60405180910390f35b3480156107da57600080fd5b506107e361159f565b005b3480156107f157600080fd5b5061080c60048036038101906108079190612cad565b611652565b005b34801561081a57600080fd5b50610835600480360381019061083091906131c7565b611677565b604051610842919061290a565b60405180910390f35b34801561085757600080fd5b50610872600480360381019061086d9190612ebe565b61170b565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061093f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061094f575061094e8261178f565b5b9050919050565b60606000805461096590613236565b80601f016020809104026020016040519081016040528092919081815260200182805461099190613236565b80156109de5780601f106109b3576101008083540402835291602001916109de565b820191906000526020600020905b8154815290600101906020018083116109c157829003601f168201915b5050505050905090565b60006109f3826117f9565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3982610fbc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa1906132da565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ac9611844565b73ffffffffffffffffffffffffffffffffffffffff161480610af85750610af781610af2611844565b611677565b5b610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e9061336c565b60405180910390fd5b610b41838361184c565b505050565b6000610b52600d611905565b905090565b600960019054906101000a900460ff1681565b610b7b610b75611844565b82611913565b610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb1906133fe565b60405180910390fd5b610bc58383836119a8565b505050565b60026007541415610c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c079061346a565b60405180910390fd5b6002600781905550600960009054906101000a900460ff16610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e906134d6565b60405180910390fd5b610cb233848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506114a5565b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890613542565b60405180910390fd5b600a5481610cfe3361106e565b610d089190613591565b1115610d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4090613633565b60405180910390fd5b3481600b54610d589190613653565b1115610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d90906136f9565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfe90613765565b60405180910390fd5b61036d81610e13610b46565b610e1d9190613591565b1115610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e55906137d1565b60405180910390fd5b6000600190505b818111610e9a57610e76600d611c0f565b610e8733610e82610b46565b611c25565b8080610e92906137f1565b915050610e65565b506001600781905550505050565b600960009054906101000a900460ff1681565b60085481565b61036d81565b610ecf611c43565b80600960006101000a81548160ff02191690831515021790555050565b6000600b54905090565b610f11838383604051806020016040528060008152506114e7565b505050565b610f1e611c43565b60026007541415610f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5b9061346a565b60405180910390fd5b60026007819055506000479050610f7b8282611cc1565b50600160078190555050565b610f8f611c43565b80600c9080519060200190610fa59291906127b3565b5050565b600960029054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105c90613886565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d690613918565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61112e611c43565b6111386000611db5565b565b600b5481565b611148611c43565b8060088190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611184611c43565b80600b8190555050565b611196611c43565b80600a8190555050565b6060600180546111af90613236565b80601f01602080910402602001604051908101604052809291908181526020018280546111db90613236565b80156112285780601f106111fd57610100808354040283529160200191611228565b820191906000526020600020905b81548152906001019060200180831161120b57829003601f168201915b5050505050905090565b600a5481565b6002600754141561127e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112759061346a565b60405180910390fd5b6002600781905550600960019054906101000a900460ff166112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90613984565b60405180910390fd5b600a54816112e23361106e565b6112ec9190613591565b111561132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132490613633565b60405180910390fd5b3481600b5461133c9190613653565b111561137d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611374906136f9565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e290613765565b60405180910390fd5b61036d816113f7610b46565b6114019190613591565b1115611442576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611439906137d1565b60405180910390fd5b6000600190505b81811161147e5761145a600d611c0f565b61146b33611466610b46565b611c25565b8080611476906137f1565b915050611449565b50600160078190555050565b61149c611495611844565b8383611e7b565b5050565b601e81565b600080836040516020016114b991906139ec565b6040516020818303038152906040528051906020012090506114de8360085483611fe8565b91505092915050565b6114f86114f2611844565b83611913565b611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e906133fe565b60405180910390fd5b61154384848484611fff565b50505050565b606060006115568361205b565b905060008151116115765760405180602001604052806000815250611597565b806040516020016115879190613a8f565b6040516020818303038152906040525b915050919050565b6115a7611c43565b600960029054906101000a900460ff16156115f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ee90613afd565b60405180910390fd5b6001600960026101000a81548160ff0219169083151502179055506000600190505b601e811161164f5761162b600d611c0f565b61163c33611637610b46565b611c25565b8080611647906137f1565b915050611619565b50565b61165a611c43565b80600960016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611713611c43565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90613b8f565b60405180910390fd5b61178c81611db5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611802816120c3565b611841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183890613886565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118bf83610fbc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b60008061191f83610fbc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061196157506119608185611677565b5b8061199f57508373ffffffffffffffffffffffffffffffffffffffff16611987846109e8565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119c882610fbc565b73ffffffffffffffffffffffffffffffffffffffff1614611a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1590613c21565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8590613cb3565b60405180910390fd5b611a9983838361212f565b611aa460008261184c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611af49190613cd3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b4b9190613591565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c0a838383612134565b505050565b6001816000016000828254019250508190555050565b611c3f828260405180602001604052806000815250612139565b5050565b611c4b611844565b73ffffffffffffffffffffffffffffffffffffffff16611c69611152565b73ffffffffffffffffffffffffffffffffffffffff1614611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb690613d53565b60405180910390fd5b565b80471015611d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfb90613dbf565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611d2a90613e10565b60006040518083038185875af1925050503d8060008114611d67576040519150601f19603f3d011682016040523d82523d6000602084013e611d6c565b606091505b5050905080611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da790613e97565b60405180910390fd5b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee190613f03565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fdb919061290a565b60405180910390a3505050565b600082611ff58584612194565b1490509392505050565b61200a8484846119a8565b612016848484846121ea565b612055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204c90613f95565b60405180910390fd5b50505050565b6060612066826117f9565b6000612070612381565b9050600081511161209057604051806020016040528060008152506120bb565b8061209a84612413565b6040516020016120ab929190613fb5565b6040516020818303038152906040525b915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b505050565b6121438383612574565b61215060008484846121ea565b61218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690613f95565b60405180910390fd5b505050565b60008082905060005b84518110156121df576121ca828683815181106121bd576121bc613fd9565b5b602002602001015161274e565b915080806121d7906137f1565b91505061219d565b508091505092915050565b600061220b8473ffffffffffffffffffffffffffffffffffffffff16612779565b15612374578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612234611844565b8786866040518563ffffffff1660e01b8152600401612256949392919061405d565b602060405180830381600087803b15801561227057600080fd5b505af19250505080156122a157506040513d601f19601f8201168201806040525081019061229e91906140be565b60015b612324573d80600081146122d1576040519150601f19603f3d011682016040523d82523d6000602084013e6122d6565b606091505b5060008151141561231c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231390613f95565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612379565b600190505b949350505050565b6060600c805461239090613236565b80601f01602080910402602001604051908101604052809291908181526020018280546123bc90613236565b80156124095780601f106123de57610100808354040283529160200191612409565b820191906000526020600020905b8154815290600101906020018083116123ec57829003601f168201915b5050505050905090565b6060600082141561245b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061256f565b600082905060005b6000821461248d578080612476906137f1565b915050600a82612486919061411a565b9150612463565b60008167ffffffffffffffff8111156124a9576124a8612d4a565b5b6040519080825280601f01601f1916602001820160405280156124db5781602001600182028036833780820191505090505b5090505b60008514612568576001826124f49190613cd3565b9150600a85612503919061414b565b603061250f9190613591565b60f81b81838151811061252557612524613fd9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612561919061411a565b94506124df565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125db906141c8565b60405180910390fd5b6125ed816120c3565b1561262d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262490614234565b60405180910390fd5b6126396000838361212f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126899190613591565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461274a60008383612134565b5050565b600081831061276657612761828461279c565b612771565b612770838361279c565b5b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b8280546127bf90613236565b90600052602060002090601f0160209004810192826127e15760008555612828565b82601f106127fa57805160ff1916838001178555612828565b82800160010185558215612828579182015b8281111561282757825182559160200191906001019061280c565b5b5090506128359190612839565b5090565b5b8082111561285257600081600090555060010161283a565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61289f8161286a565b81146128aa57600080fd5b50565b6000813590506128bc81612896565b92915050565b6000602082840312156128d8576128d7612860565b5b60006128e6848285016128ad565b91505092915050565b60008115159050919050565b612904816128ef565b82525050565b600060208201905061291f60008301846128fb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561295f578082015181840152602081019050612944565b8381111561296e576000848401525b50505050565b6000601f19601f8301169050919050565b600061299082612925565b61299a8185612930565b93506129aa818560208601612941565b6129b381612974565b840191505092915050565b600060208201905081810360008301526129d88184612985565b905092915050565b6000819050919050565b6129f3816129e0565b81146129fe57600080fd5b50565b600081359050612a10816129ea565b92915050565b600060208284031215612a2c57612a2b612860565b5b6000612a3a84828501612a01565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a6e82612a43565b9050919050565b612a7e81612a63565b82525050565b6000602082019050612a996000830184612a75565b92915050565b612aa881612a63565b8114612ab357600080fd5b50565b600081359050612ac581612a9f565b92915050565b60008060408385031215612ae257612ae1612860565b5b6000612af085828601612ab6565b9250506020612b0185828601612a01565b9150509250929050565b612b14816129e0565b82525050565b6000602082019050612b2f6000830184612b0b565b92915050565b600080600060608486031215612b4e57612b4d612860565b5b6000612b5c86828701612ab6565b9350506020612b6d86828701612ab6565b9250506040612b7e86828701612a01565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612bad57612bac612b88565b5b8235905067ffffffffffffffff811115612bca57612bc9612b8d565b5b602083019150836020820283011115612be657612be5612b92565b5b9250929050565b600080600060408486031215612c0657612c05612860565b5b600084013567ffffffffffffffff811115612c2457612c23612865565b5b612c3086828701612b97565b93509350506020612c4386828701612a01565b9150509250925092565b6000819050919050565b612c6081612c4d565b82525050565b6000602082019050612c7b6000830184612c57565b92915050565b612c8a816128ef565b8114612c9557600080fd5b50565b600081359050612ca781612c81565b92915050565b600060208284031215612cc357612cc2612860565b5b6000612cd184828501612c98565b91505092915050565b6000612ce582612a43565b9050919050565b612cf581612cda565b8114612d0057600080fd5b50565b600081359050612d1281612cec565b92915050565b600060208284031215612d2e57612d2d612860565b5b6000612d3c84828501612d03565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d8282612974565b810181811067ffffffffffffffff82111715612da157612da0612d4a565b5b80604052505050565b6000612db4612856565b9050612dc08282612d79565b919050565b600067ffffffffffffffff821115612de057612ddf612d4a565b5b612de982612974565b9050602081019050919050565b82818337600083830152505050565b6000612e18612e1384612dc5565b612daa565b905082815260208101848484011115612e3457612e33612d45565b5b612e3f848285612df6565b509392505050565b600082601f830112612e5c57612e5b612b88565b5b8135612e6c848260208601612e05565b91505092915050565b600060208284031215612e8b57612e8a612860565b5b600082013567ffffffffffffffff811115612ea957612ea8612865565b5b612eb584828501612e47565b91505092915050565b600060208284031215612ed457612ed3612860565b5b6000612ee284828501612ab6565b91505092915050565b612ef481612c4d565b8114612eff57600080fd5b50565b600081359050612f1181612eeb565b92915050565b600060208284031215612f2d57612f2c612860565b5b6000612f3b84828501612f02565b91505092915050565b60008060408385031215612f5b57612f5a612860565b5b6000612f6985828601612ab6565b9250506020612f7a85828601612c98565b9150509250929050565b600067ffffffffffffffff821115612f9f57612f9e612d4a565b5b602082029050602081019050919050565b6000612fc3612fbe84612f84565b612daa565b90508083825260208201905060208402830185811115612fe657612fe5612b92565b5b835b8181101561300f5780612ffb8882612f02565b845260208401935050602081019050612fe8565b5050509392505050565b600082601f83011261302e5761302d612b88565b5b813561303e848260208601612fb0565b91505092915050565b6000806040838503121561305e5761305d612860565b5b600061306c85828601612ab6565b925050602083013567ffffffffffffffff81111561308d5761308c612865565b5b61309985828601613019565b9150509250929050565b600067ffffffffffffffff8211156130be576130bd612d4a565b5b6130c782612974565b9050602081019050919050565b60006130e76130e2846130a3565b612daa565b90508281526020810184848401111561310357613102612d45565b5b61310e848285612df6565b509392505050565b600082601f83011261312b5761312a612b88565b5b813561313b8482602086016130d4565b91505092915050565b6000806000806080858703121561315e5761315d612860565b5b600061316c87828801612ab6565b945050602061317d87828801612ab6565b935050604061318e87828801612a01565b925050606085013567ffffffffffffffff8111156131af576131ae612865565b5b6131bb87828801613116565b91505092959194509250565b600080604083850312156131de576131dd612860565b5b60006131ec85828601612ab6565b92505060206131fd85828601612ab6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061324e57607f821691505b6020821081141561326257613261613207565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006132c4602183612930565b91506132cf82613268565b604082019050919050565b600060208201905081810360008301526132f3816132b7565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613356603e83612930565b9150613361826132fa565b604082019050919050565b6000602082019050818103600083015261338581613349565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b60006133e8602e83612930565b91506133f38261338c565b604082019050919050565b60006020820190508181036000830152613417816133db565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613454601f83612930565b915061345f8261341e565b602082019050919050565b6000602082019050818103600083015261348381613447565b9050919050565b7f416c6c6f77206c697374206973206e6f74206163746976650000000000000000600082015250565b60006134c0601883612930565b91506134cb8261348a565b602082019050919050565b600060208201905081810360008301526134ef816134b3565b9050919050565b7f41646472657373206e6f7420696e20616c6c6f77206c69737400000000000000600082015250565b600061352c601983612930565b9150613537826134f6565b602082019050919050565b6000602082019050818103600083015261355b8161351f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061359c826129e0565b91506135a7836129e0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135dc576135db613562565b5b828201905092915050565b7f43616e2774206d696e27742074686174206d756368204e465473000000000000600082015250565b600061361d601a83612930565b9150613628826135e7565b602082019050919050565b6000602082019050818103600083015261364c81613610565b9050919050565b600061365e826129e0565b9150613669836129e0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136a2576136a1613562565b5b828202905092915050565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b60006136e3601f83612930565b91506136ee826136ad565b602082019050919050565b60006020820190508181036000830152613712816136d6565b9050919050565b7f426f7473206e6f7420616c6c6f77656400000000000000000000000000000000600082015250565b600061374f601083612930565b915061375a82613719565b602082019050919050565b6000602082019050818103600083015261377e81613742565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b60006137bb602083612930565b91506137c682613785565b602082019050919050565b600060208201905081810360008301526137ea816137ae565b9050919050565b60006137fc826129e0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561382f5761382e613562565b5b600182019050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613870601883612930565b915061387b8261383a565b602082019050919050565b6000602082019050818103600083015261389f81613863565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613902602983612930565b915061390d826138a6565b604082019050919050565b60006020820190508181036000830152613931816138f5565b9050919050565b7f5075626c69632073616c65206973206e6f74206f70656e207965740000000000600082015250565b600061396e601b83612930565b915061397982613938565b602082019050919050565b6000602082019050818103600083015261399d81613961565b9050919050565b60008160601b9050919050565b60006139bc826139a4565b9050919050565b60006139ce826139b1565b9050919050565b6139e66139e182612a63565b6139c3565b82525050565b60006139f882846139d5565b60148201915081905092915050565b600081905092915050565b6000613a1d82612925565b613a278185613a07565b9350613a37818560208601612941565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613a79600583613a07565b9150613a8482613a43565b600582019050919050565b6000613a9b8284613a12565b9150613aa682613a6c565b915081905092915050565b7f5265736572766520616c726561647920636c61696d6564000000000000000000600082015250565b6000613ae7601783612930565b9150613af282613ab1565b602082019050919050565b60006020820190508181036000830152613b1681613ada565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b79602683612930565b9150613b8482613b1d565b604082019050919050565b60006020820190508181036000830152613ba881613b6c565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000613c0b602583612930565b9150613c1682613baf565b604082019050919050565b60006020820190508181036000830152613c3a81613bfe565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613c9d602483612930565b9150613ca882613c41565b604082019050919050565b60006020820190508181036000830152613ccc81613c90565b9050919050565b6000613cde826129e0565b9150613ce9836129e0565b925082821015613cfc57613cfb613562565b5b828203905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613d3d602083612930565b9150613d4882613d07565b602082019050919050565b60006020820190508181036000830152613d6c81613d30565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b6000613da9601d83612930565b9150613db482613d73565b602082019050919050565b60006020820190508181036000830152613dd881613d9c565b9050919050565b600081905092915050565b50565b6000613dfa600083613ddf565b9150613e0582613dea565b600082019050919050565b6000613e1b82613ded565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613e81603a83612930565b9150613e8c82613e25565b604082019050919050565b60006020820190508181036000830152613eb081613e74565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613eed601983612930565b9150613ef882613eb7565b602082019050919050565b60006020820190508181036000830152613f1c81613ee0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613f7f603283612930565b9150613f8a82613f23565b604082019050919050565b60006020820190508181036000830152613fae81613f72565b9050919050565b6000613fc18285613a12565b9150613fcd8284613a12565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b600061402f82614008565b6140398185614013565b9350614049818560208601612941565b61405281612974565b840191505092915050565b60006080820190506140726000830187612a75565b61407f6020830186612a75565b61408c6040830185612b0b565b818103606083015261409e8184614024565b905095945050505050565b6000815190506140b881612896565b92915050565b6000602082840312156140d4576140d3612860565b5b60006140e2848285016140a9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614125826129e0565b9150614130836129e0565b9250826141405761413f6140eb565b5b828204905092915050565b6000614156826129e0565b9150614161836129e0565b925082614171576141706140eb565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006141b2602083612930565b91506141bd8261417c565b602082019050919050565b600060208201905081810360008301526141e1816141a5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061421e601c83612930565b9150614229826141e8565b602082019050919050565b6000602082019050818103600083015261424d81614211565b905091905056fea2646970667358221220b29bddb1fe337b4c3dc6fc0562430a7a0f121e7ffdba32732a8f09239d8536ef64736f6c63430008090033

Deployed Bytecode Sourcemap

51538:4683:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22199:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23176:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24702:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24219:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52588:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51910:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25452:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53460:818;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51872:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51840:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51988:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52810:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52378:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25896:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56049:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55419:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51947:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22887:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22618:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47881:103;;;;;;;;;;;;;:::i;:::-;;52120:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52697:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47233:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52475:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23345:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52085:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54747:664;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24945:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52035:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53232:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26152:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55748:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54286:312;;;;;;;;;;;;;:::i;:::-;;54606:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25171:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48139:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22199:355;22346:4;22403:25;22388:40;;;:11;:40;;;;:105;;;;22460:33;22445:48;;;:11;:48;;;;22388:105;:158;;;;22510:36;22534:11;22510:23;:36::i;:::-;22388:158;22368:178;;22199:355;;;:::o;23176:100::-;23230:13;23263:5;23256:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23176:100;:::o;24702:171::-;24778:7;24798:23;24813:7;24798:14;:23::i;:::-;24841:15;:24;24857:7;24841:24;;;;;;;;;;;;;;;;;;;;;24834:31;;24702:171;;;:::o;24219:417::-;24300:13;24316:23;24331:7;24316:14;:23::i;:::-;24300:39;;24364:5;24358:11;;:2;:11;;;;24350:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24458:5;24442:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24467:37;24484:5;24491:12;:10;:12::i;:::-;24467:16;:37::i;:::-;24442:62;24420:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;24607:21;24616:2;24620:7;24607:8;:21::i;:::-;24289:347;24219:417;;:::o;52588:101::-;52632:7;52659:22;:12;:20;:22::i;:::-;52652:29;;52588:101;:::o;51910:30::-;;;;;;;;;;;;;:::o;25452:373::-;25661:41;25680:12;:10;:12::i;:::-;25694:7;25661:18;:41::i;:::-;25639:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;25789:28;25799:4;25805:2;25809:7;25789:9;:28::i;:::-;25452:373;;;:::o;53460:818::-;50512:1;51110:7;;:19;;51102:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50512:1;51243:7;:18;;;;53620:17:::1;;;;;;;;;;;53612:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;53685:36;53697:10;53709:11;;53685:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;:36::i;:::-;53677:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;53812:9;;53794:14;53770:21;53780:10;53770:9;:21::i;:::-;:38;;;;:::i;:::-;:51;;53762:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;53902:9;53884:14;53871:10;;:27;;;;:::i;:::-;:40;;53863:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53980:9;53966:23;;:10;:23;;;53958:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52025:3;54045:14;54029:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;54021:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;54128:9;54140:1;54128:13;;54123:148;54148:14;54143:1;:19;54123:148;;54184:24;:12;:22;:24::i;:::-;54223:36;54233:10;54245:13;:11;:13::i;:::-;54223:9;:36::i;:::-;54164:3;;;;;:::i;:::-;;;;54123:148;;;;50468:1:::0;51422:7;:22;;;;53460:818;;;:::o;51872:29::-;;;;;;;;;;;;;:::o;51840:25::-;;;;:::o;51988:40::-;52025:3;51988:40;:::o;52810:129::-;47119:13;:11;:13::i;:::-;52913:18:::1;52893:17;;:38;;;;;;;;;;;;;;;;;;52810:129:::0;:::o;52378:89::-;52422:7;52449:10;;52442:17;;52378:89;:::o;25896:185::-;26034:39;26051:4;26057:2;26061:7;26034:39;;;;;;;;;;;;:16;:39::i;:::-;25896:185;;;:::o;56049:169::-;47119:13;:11;:13::i;:::-;50512:1:::1;51110:7;;:19;;51102:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50512:1;51243:7;:18;;;;56130:15:::2;56148:21;56130:39;;56180:30;56198:2;56202:7;56180:17;:30::i;:::-;56119:99;50468:1:::1;51422:7;:22;;;;56049:169:::0;:::o;55419:109::-;47119:13;:11;:13::i;:::-;55512:8:::1;55493:16;:27;;;;;;;;;;;;:::i;:::-;;55419:109:::0;:::o;51947:34::-;;;;;;;;;;;;;:::o;22887:222::-;22959:7;22979:13;22995:7;:16;23003:7;22995:16;;;;;;;;;;;;;;;;;;;;;22979:32;;23047:1;23030:19;;:5;:19;;;;23022:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;23096:5;23089:12;;;22887:222;;;:::o;22618:207::-;22690:7;22735:1;22718:19;;:5;:19;;;;22710:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22801:9;:16;22811:5;22801:16;;;;;;;;;;;;;;;;22794:23;;22618:207;;;:::o;47881:103::-;47119:13;:11;:13::i;:::-;47946:30:::1;47973:1;47946:18;:30::i;:::-;47881:103::o:0;52120:25::-;;;;:::o;52697:105::-;47119:13;:11;:13::i;:::-;52783:11:::1;52770:10;:24;;;;52697:105:::0;:::o;47233:87::-;47279:7;47306:6;;;;;;;;;;;47299:13;;47233:87;:::o;52283:::-;47119:13;:11;:13::i;:::-;52357:5:::1;52344:10;:18;;;;52283:87:::0;:::o;52475:105::-;47119:13;:11;:13::i;:::-;52563:9:::1;52551;:21;;;;52475:105:::0;:::o;23345:104::-;23401:13;23434:7;23427:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23345:104;:::o;52085:28::-;;;;:::o;54747:664::-;50512:1;51110:7;;:19;;51102:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50512:1;51243:7;:18;;;;54834::::1;;;;;;;;;;;54826:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54945:9;;54927:14;54903:21;54913:10;54903:9;:21::i;:::-;:38;;;;:::i;:::-;:51;;54895:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;55035:9;55017:14;55004:10;;:27;;;;:::i;:::-;:40;;54996:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;55113:9;55099:23;;:10;:23;;;55091:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;52025:3;55178:14;55162:13;:11;:13::i;:::-;:30;;;;:::i;:::-;:44;;55154:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;55261:9;55273:1;55261:13;;55256:148;55281:14;55276:1;:19;55256:148;;55317:24;:12;:22;:24::i;:::-;55356:36;55366:10;55378:13;:11;:13::i;:::-;55356:9;:36::i;:::-;55297:3;;;;;:::i;:::-;;;;55256:148;;;;50468:1:::0;51422:7;:22;;;;54747:664;:::o;24945:155::-;25040:52;25059:12;:10;:12::i;:::-;25073:8;25083;25040:18;:52::i;:::-;24945:155;;:::o;52035:43::-;52076:2;52035:43;:::o;53232:220::-;53315:4;53332:12;53374:7;53357:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;53347:36;;;;;;53332:51;;53401:43;53420:5;53427:10;;53439:4;53401:18;:43::i;:::-;53394:50;;;53232:220;;;;:::o;26152:360::-;26340:41;26359:12;:10;:12::i;:::-;26373:7;26340:18;:41::i;:::-;26318:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;26466:38;26480:4;26486:2;26490:7;26499:4;26466:13;:38::i;:::-;26152:360;;;;:::o;55748:293::-;55874:13;55905:17;55925:23;55940:7;55925:14;:23::i;:::-;55905:43;;55986:1;55972:3;55966:17;:21;:67;;;;;;;;;;;;;;;;;56014:3;55997:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;55966:67;55959:74;;;55748:293;;;:::o;54286:312::-;47119:13;:11;:13::i;:::-;54344:14:::1;;;;;;;;;;;54343:15;54335:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;54414:4;54397:14;;:21;;;;;;;;;;;;;;;;;;54431:9;54460:1;54456:5;;54451:140;52076:2;54463:1;:19;54451:140;;54504:24;:12;:22;:24::i;:::-;54543:36;54553:10;54565:13;:11;:13::i;:::-;54543:9;:36::i;:::-;54484:3;;;;;:::i;:::-;;;;54451:140;;;54324:274;54286:312::o:0;54606:133::-;47119:13;:11;:13::i;:::-;54712:19:::1;54691:18;;:40;;;;;;;;;;;;;;;;;;54606:133:::0;:::o;25171:214::-;25313:4;25342:18;:25;25361:5;25342:25;;;;;;;;;;;;;;;:35;25368:8;25342:35;;;;;;;;;;;;;;;;;;;;;;;;;25335:42;;25171:214;;;;:::o;48139:201::-;47119:13;:11;:13::i;:::-;48248:1:::1;48228:22;;:8;:22;;;;48220:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48304:28;48323:8;48304:18;:28::i;:::-;48139:201:::0;:::o;20640:157::-;20725:4;20764:25;20749:40;;;:11;:40;;;;20742:47;;20640:157;;;:::o;32905:135::-;32987:16;32995:7;32987;:16::i;:::-;32979:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32905:135;:::o;17062:98::-;17115:7;17142:10;17135:17;;17062:98;:::o;32184:174::-;32286:2;32259:15;:24;32275:7;32259:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32342:7;32338:2;32304:46;;32313:23;32328:7;32313:14;:23::i;:::-;32304:46;;;;;;;;;;;;32184:174;;:::o;36578:114::-;36643:7;36670;:14;;;36663:21;;36578:114;;;:::o;28350:331::-;28479:4;28501:13;28517:23;28532:7;28517:14;:23::i;:::-;28501:39;;28570:5;28559:16;;:7;:16;;;:65;;;;28592:32;28609:5;28616:7;28592:16;:32::i;:::-;28559:65;:113;;;;28665:7;28641:31;;:20;28653:7;28641:11;:20::i;:::-;:31;;;28559:113;28551:122;;;28350:331;;;;:::o;31440:625::-;31599:4;31572:31;;:23;31587:7;31572:14;:23::i;:::-;:31;;;31564:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31678:1;31664:16;;:2;:16;;;;31656:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31734:39;31755:4;31761:2;31765:7;31734:20;:39::i;:::-;31838:29;31855:1;31859:7;31838:8;:29::i;:::-;31899:1;31880:9;:15;31890:4;31880:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31928:1;31911:9;:13;31921:2;31911:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31959:2;31940:7;:16;31948:7;31940:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31998:7;31994:2;31979:27;;31988:4;31979:27;;;;;;;;;;;;32019:38;32039:4;32045:2;32049:7;32019:19;:38::i;:::-;31440:625;;;:::o;36700:127::-;36807:1;36789:7;:14;;;:19;;;;;;;;;;;36700:127;:::o;29023:110::-;29099:26;29109:2;29113:7;29099:26;;;;;;;;;;;;:9;:26::i;:::-;29023:110;;:::o;47398:132::-;47473:12;:10;:12::i;:::-;47462:23;;:7;:5;:7::i;:::-;:23;;;47454:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47398:132::o;10254:317::-;10369:6;10344:21;:31;;10336:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10423:12;10441:9;:14;;10463:6;10441:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10422:52;;;10493:7;10485:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10325:246;10254:317;;:::o;48500:191::-;48574:16;48593:6;;;;;;;;;;;48574:25;;48619:8;48610:6;;:17;;;;;;;;;;;;;;;;;;48674:8;48643:40;;48664:8;48643:40;;;;;;;;;;;;48563:128;48500:191;:::o;32501:315::-;32656:8;32647:17;;:5;:17;;;;32639:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32743:8;32705:18;:25;32724:5;32705:25;;;;;;;;;;;;;;;:35;32731:8;32705:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32789:8;32767:41;;32782:5;32767:41;;;32799:8;32767:41;;;;;;:::i;:::-;;;;;;;;32501:315;;;:::o;38392:190::-;38517:4;38570;38541:25;38554:5;38561:4;38541:12;:25::i;:::-;:33;38534:40;;38392:190;;;;;:::o;27393:350::-;27549:28;27559:4;27565:2;27569:7;27549:9;:28::i;:::-;27610:47;27633:4;27639:2;27643:7;27652:4;27610:22;:47::i;:::-;27588:147;;;;;;;;;;;;:::i;:::-;;;;;;;;;27393:350;;;;:::o;23520:294::-;23593:13;23619:23;23634:7;23619:14;:23::i;:::-;23655:21;23679:10;:8;:10::i;:::-;23655:34;;23744:1;23726:7;23720:21;:25;:86;;;;;;;;;;;;;;;;;23772:7;23781:18;:7;:16;:18::i;:::-;23755:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23720:86;23700:106;;;23520:294;;;:::o;28056:127::-;28121:4;28173:1;28145:30;;:7;:16;28153:7;28145:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28138:37;;28056:127;;;:::o;35061:126::-;;;;:::o;35572:125::-;;;;:::o;29360:319::-;29489:18;29495:2;29499:7;29489:5;:18::i;:::-;29540:53;29571:1;29575:2;29579:7;29588:4;29540:22;:53::i;:::-;29518:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;29360:319;;;:::o;39259:296::-;39342:7;39362:20;39385:4;39362:27;;39405:9;39400:118;39424:5;:12;39420:1;:16;39400:118;;;39473:33;39483:12;39497:5;39503:1;39497:8;;;;;;;;:::i;:::-;;;;;;;;39473:9;:33::i;:::-;39458:48;;39438:3;;;;;:::i;:::-;;;;39400:118;;;;39535:12;39528:19;;;39259:296;;;;:::o;33604:885::-;33758:4;33779:15;:2;:13;;;:15::i;:::-;33775:707;;;33831:2;33815:36;;;33852:12;:10;:12::i;:::-;33866:4;33872:7;33881:4;33815:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33811:616;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34105:1;34088:6;:13;:18;34084:328;;;34131:60;;;;;;;;;;:::i;:::-;;;;;;;;34084:328;34362:6;34356:13;34347:6;34343:2;34339:15;34332:38;33811:616;33979:41;;;33969:51;;;:6;:51;;;;33962:58;;;;;33775:707;34466:4;34459:11;;33604:885;;;;;;;:::o;55536:117::-;55596:13;55629:16;55622:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55536:117;:::o;17708:723::-;17764:13;17994:1;17985:5;:10;17981:53;;;18012:10;;;;;;;;;;;;;;;;;;;;;17981:53;18044:12;18059:5;18044:20;;18075:14;18100:78;18115:1;18107:4;:9;18100:78;;18133:8;;;;;:::i;:::-;;;;18164:2;18156:10;;;;;:::i;:::-;;;18100:78;;;18188:19;18220:6;18210:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18188:39;;18238:154;18254:1;18245:5;:10;18238:154;;18282:1;18272:11;;;;;:::i;:::-;;;18349:2;18341:5;:10;;;;:::i;:::-;18328:2;:24;;;;:::i;:::-;18315:39;;18298:6;18305;18298:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18378:2;18369:11;;;;;:::i;:::-;;;18238:154;;;18416:6;18402:21;;;;;17708:723;;;;:::o;30015:439::-;30109:1;30095:16;;:2;:16;;;;30087:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30168:16;30176:7;30168;:16::i;:::-;30167:17;30159:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30230:45;30259:1;30263:2;30267:7;30230:20;:45::i;:::-;30305:1;30288:9;:13;30298:2;30288:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30336:2;30317:7;:16;30325:7;30317:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30381:7;30377:2;30356:33;;30373:1;30356:33;;;;;;;;;;;;30402:44;30430:1;30434:2;30438:7;30402:19;:44::i;:::-;30015:439;;:::o;45566:149::-;45629:7;45660:1;45656;:5;:51;;45687:20;45702:1;45705;45687:14;:20::i;:::-;45656:51;;;45664:20;45679:1;45682;45664:14;:20::i;:::-;45656:51;45649:58;;45566:149;;;;:::o;8993:326::-;9053:4;9310:1;9288:7;:19;;;:23;9281:30;;8993:326;;;:::o;45723:268::-;45791:13;45898:1;45892:4;45885:15;45927:1;45921:4;45914:15;45968:4;45962;45952:21;45943:30;;45723:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6301:568;6374:8;6384:6;6434:3;6427:4;6419:6;6415:17;6411:27;6401:122;;6442:79;;:::i;:::-;6401:122;6555:6;6542:20;6532:30;;6585:18;6577:6;6574:30;6571:117;;;6607:79;;:::i;:::-;6571:117;6721:4;6713:6;6709:17;6697:29;;6775:3;6767:4;6759:6;6755:17;6745:8;6741:32;6738:41;6735:128;;;6782:79;;:::i;:::-;6735:128;6301:568;;;;;:::o;6875:704::-;6970:6;6978;6986;7035:2;7023:9;7014:7;7010:23;7006:32;7003:119;;;7041:79;;:::i;:::-;7003:119;7189:1;7178:9;7174:17;7161:31;7219:18;7211:6;7208:30;7205:117;;;7241:79;;:::i;:::-;7205:117;7354:80;7426:7;7417:6;7406:9;7402:22;7354:80;:::i;:::-;7336:98;;;;7132:312;7483:2;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7454:118;6875:704;;;;;:::o;7585:77::-;7622:7;7651:5;7640:16;;7585:77;;;:::o;7668:118::-;7755:24;7773:5;7755:24;:::i;:::-;7750:3;7743:37;7668:118;;:::o;7792:222::-;7885:4;7923:2;7912:9;7908:18;7900:26;;7936:71;8004:1;7993:9;7989:17;7980:6;7936:71;:::i;:::-;7792:222;;;;:::o;8020:116::-;8090:21;8105:5;8090:21;:::i;:::-;8083:5;8080:32;8070:60;;8126:1;8123;8116:12;8070:60;8020:116;:::o;8142:133::-;8185:5;8223:6;8210:20;8201:29;;8239:30;8263:5;8239:30;:::i;:::-;8142:133;;;;:::o;8281:323::-;8337:6;8386:2;8374:9;8365:7;8361:23;8357:32;8354:119;;;8392:79;;:::i;:::-;8354:119;8512:1;8537:50;8579:7;8570:6;8559:9;8555:22;8537:50;:::i;:::-;8527:60;;8483:114;8281:323;;;;:::o;8610:104::-;8655:7;8684:24;8702:5;8684:24;:::i;:::-;8673:35;;8610:104;;;:::o;8720:138::-;8801:32;8827:5;8801:32;:::i;:::-;8794:5;8791:43;8781:71;;8848:1;8845;8838:12;8781:71;8720:138;:::o;8864:155::-;8918:5;8956:6;8943:20;8934:29;;8972:41;9007:5;8972:41;:::i;:::-;8864:155;;;;:::o;9025:345::-;9092:6;9141:2;9129:9;9120:7;9116:23;9112:32;9109:119;;;9147:79;;:::i;:::-;9109:119;9267:1;9292:61;9345:7;9336:6;9325:9;9321:22;9292:61;:::i;:::-;9282:71;;9238:125;9025:345;;;;:::o;9376:117::-;9485:1;9482;9475:12;9499:180;9547:77;9544:1;9537:88;9644:4;9641:1;9634:15;9668:4;9665:1;9658:15;9685:281;9768:27;9790:4;9768:27;:::i;:::-;9760:6;9756:40;9898:6;9886:10;9883:22;9862:18;9850:10;9847:34;9844:62;9841:88;;;9909:18;;:::i;:::-;9841:88;9949:10;9945:2;9938:22;9728:238;9685:281;;:::o;9972:129::-;10006:6;10033:20;;:::i;:::-;10023:30;;10062:33;10090:4;10082:6;10062:33;:::i;:::-;9972:129;;;:::o;10107:308::-;10169:4;10259:18;10251:6;10248:30;10245:56;;;10281:18;;:::i;:::-;10245:56;10319:29;10341:6;10319:29;:::i;:::-;10311:37;;10403:4;10397;10393:15;10385:23;;10107:308;;;:::o;10421:154::-;10505:6;10500:3;10495;10482:30;10567:1;10558:6;10553:3;10549:16;10542:27;10421:154;;;:::o;10581:412::-;10659:5;10684:66;10700:49;10742:6;10700:49;:::i;:::-;10684:66;:::i;:::-;10675:75;;10773:6;10766:5;10759:21;10811:4;10804:5;10800:16;10849:3;10840:6;10835:3;10831:16;10828:25;10825:112;;;10856:79;;:::i;:::-;10825:112;10946:41;10980:6;10975:3;10970;10946:41;:::i;:::-;10665:328;10581:412;;;;;:::o;11013:340::-;11069:5;11118:3;11111:4;11103:6;11099:17;11095:27;11085:122;;11126:79;;:::i;:::-;11085:122;11243:6;11230:20;11268:79;11343:3;11335:6;11328:4;11320:6;11316:17;11268:79;:::i;:::-;11259:88;;11075:278;11013:340;;;;:::o;11359:509::-;11428:6;11477:2;11465:9;11456:7;11452:23;11448:32;11445:119;;;11483:79;;:::i;:::-;11445:119;11631:1;11620:9;11616:17;11603:31;11661:18;11653:6;11650:30;11647:117;;;11683:79;;:::i;:::-;11647:117;11788:63;11843:7;11834:6;11823:9;11819:22;11788:63;:::i;:::-;11778:73;;11574:287;11359:509;;;;:::o;11874:329::-;11933:6;11982:2;11970:9;11961:7;11957:23;11953:32;11950:119;;;11988:79;;:::i;:::-;11950:119;12108:1;12133:53;12178:7;12169:6;12158:9;12154:22;12133:53;:::i;:::-;12123:63;;12079:117;11874:329;;;;:::o;12209:122::-;12282:24;12300:5;12282:24;:::i;:::-;12275:5;12272:35;12262:63;;12321:1;12318;12311:12;12262:63;12209:122;:::o;12337:139::-;12383:5;12421:6;12408:20;12399:29;;12437:33;12464:5;12437:33;:::i;:::-;12337:139;;;;:::o;12482:329::-;12541:6;12590:2;12578:9;12569:7;12565:23;12561:32;12558:119;;;12596:79;;:::i;:::-;12558:119;12716:1;12741:53;12786:7;12777:6;12766:9;12762:22;12741:53;:::i;:::-;12731:63;;12687:117;12482:329;;;;:::o;12817:468::-;12882:6;12890;12939:2;12927:9;12918:7;12914:23;12910:32;12907:119;;;12945:79;;:::i;:::-;12907:119;13065:1;13090:53;13135:7;13126:6;13115:9;13111:22;13090:53;:::i;:::-;13080:63;;13036:117;13192:2;13218:50;13260:7;13251:6;13240:9;13236:22;13218:50;:::i;:::-;13208:60;;13163:115;12817:468;;;;;:::o;13291:311::-;13368:4;13458:18;13450:6;13447:30;13444:56;;;13480:18;;:::i;:::-;13444:56;13530:4;13522:6;13518:17;13510:25;;13590:4;13584;13580:15;13572:23;;13291:311;;;:::o;13625:710::-;13721:5;13746:81;13762:64;13819:6;13762:64;:::i;:::-;13746:81;:::i;:::-;13737:90;;13847:5;13876:6;13869:5;13862:21;13910:4;13903:5;13899:16;13892:23;;13963:4;13955:6;13951:17;13943:6;13939:30;13992:3;13984:6;13981:15;13978:122;;;14011:79;;:::i;:::-;13978:122;14126:6;14109:220;14143:6;14138:3;14135:15;14109:220;;;14218:3;14247:37;14280:3;14268:10;14247:37;:::i;:::-;14242:3;14235:50;14314:4;14309:3;14305:14;14298:21;;14185:144;14169:4;14164:3;14160:14;14153:21;;14109:220;;;14113:21;13727:608;;13625:710;;;;;:::o;14358:370::-;14429:5;14478:3;14471:4;14463:6;14459:17;14455:27;14445:122;;14486:79;;:::i;:::-;14445:122;14603:6;14590:20;14628:94;14718:3;14710:6;14703:4;14695:6;14691:17;14628:94;:::i;:::-;14619:103;;14435:293;14358:370;;;;:::o;14734:684::-;14827:6;14835;14884:2;14872:9;14863:7;14859:23;14855:32;14852:119;;;14890:79;;:::i;:::-;14852:119;15010:1;15035:53;15080:7;15071:6;15060:9;15056:22;15035:53;:::i;:::-;15025:63;;14981:117;15165:2;15154:9;15150:18;15137:32;15196:18;15188:6;15185:30;15182:117;;;15218:79;;:::i;:::-;15182:117;15323:78;15393:7;15384:6;15373:9;15369:22;15323:78;:::i;:::-;15313:88;;15108:303;14734:684;;;;;:::o;15424:307::-;15485:4;15575:18;15567:6;15564:30;15561:56;;;15597:18;;:::i;:::-;15561:56;15635:29;15657:6;15635:29;:::i;:::-;15627:37;;15719:4;15713;15709:15;15701:23;;15424:307;;;:::o;15737:410::-;15814:5;15839:65;15855:48;15896:6;15855:48;:::i;:::-;15839:65;:::i;:::-;15830:74;;15927:6;15920:5;15913:21;15965:4;15958:5;15954:16;16003:3;15994:6;15989:3;15985:16;15982:25;15979:112;;;16010:79;;:::i;:::-;15979:112;16100:41;16134:6;16129:3;16124;16100:41;:::i;:::-;15820:327;15737:410;;;;;:::o;16166:338::-;16221:5;16270:3;16263:4;16255:6;16251:17;16247:27;16237:122;;16278:79;;:::i;:::-;16237:122;16395:6;16382:20;16420:78;16494:3;16486:6;16479:4;16471:6;16467:17;16420:78;:::i;:::-;16411:87;;16227:277;16166:338;;;;:::o;16510:943::-;16605:6;16613;16621;16629;16678:3;16666:9;16657:7;16653:23;16649:33;16646:120;;;16685:79;;:::i;:::-;16646:120;16805:1;16830:53;16875:7;16866:6;16855:9;16851:22;16830:53;:::i;:::-;16820:63;;16776:117;16932:2;16958:53;17003:7;16994:6;16983:9;16979:22;16958:53;:::i;:::-;16948:63;;16903:118;17060:2;17086:53;17131:7;17122:6;17111:9;17107:22;17086:53;:::i;:::-;17076:63;;17031:118;17216:2;17205:9;17201:18;17188:32;17247:18;17239:6;17236:30;17233:117;;;17269:79;;:::i;:::-;17233:117;17374:62;17428:7;17419:6;17408:9;17404:22;17374:62;:::i;:::-;17364:72;;17159:287;16510:943;;;;;;;:::o;17459:474::-;17527:6;17535;17584:2;17572:9;17563:7;17559:23;17555:32;17552:119;;;17590:79;;:::i;:::-;17552:119;17710:1;17735:53;17780:7;17771:6;17760:9;17756:22;17735:53;:::i;:::-;17725:63;;17681:117;17837:2;17863:53;17908:7;17899:6;17888:9;17884:22;17863:53;:::i;:::-;17853:63;;17808:118;17459:474;;;;;:::o;17939:180::-;17987:77;17984:1;17977:88;18084:4;18081:1;18074:15;18108:4;18105:1;18098:15;18125:320;18169:6;18206:1;18200:4;18196:12;18186:22;;18253:1;18247:4;18243:12;18274:18;18264:81;;18330:4;18322:6;18318:17;18308:27;;18264:81;18392:2;18384:6;18381:14;18361:18;18358:38;18355:84;;;18411:18;;:::i;:::-;18355:84;18176:269;18125:320;;;:::o;18451:220::-;18591:34;18587:1;18579:6;18575:14;18568:58;18660:3;18655:2;18647:6;18643:15;18636:28;18451:220;:::o;18677:366::-;18819:3;18840:67;18904:2;18899:3;18840:67;:::i;:::-;18833:74;;18916:93;19005:3;18916:93;:::i;:::-;19034:2;19029:3;19025:12;19018:19;;18677:366;;;:::o;19049:419::-;19215:4;19253:2;19242:9;19238:18;19230:26;;19302:9;19296:4;19292:20;19288:1;19277:9;19273:17;19266:47;19330:131;19456:4;19330:131;:::i;:::-;19322:139;;19049:419;;;:::o;19474:249::-;19614:34;19610:1;19602:6;19598:14;19591:58;19683:32;19678:2;19670:6;19666:15;19659:57;19474:249;:::o;19729:366::-;19871:3;19892:67;19956:2;19951:3;19892:67;:::i;:::-;19885:74;;19968:93;20057:3;19968:93;:::i;:::-;20086:2;20081:3;20077:12;20070:19;;19729:366;;;:::o;20101:419::-;20267:4;20305:2;20294:9;20290:18;20282:26;;20354:9;20348:4;20344:20;20340:1;20329:9;20325:17;20318:47;20382:131;20508:4;20382:131;:::i;:::-;20374:139;;20101:419;;;:::o;20526:233::-;20666:34;20662:1;20654:6;20650:14;20643:58;20735:16;20730:2;20722:6;20718:15;20711:41;20526:233;:::o;20765:366::-;20907:3;20928:67;20992:2;20987:3;20928:67;:::i;:::-;20921:74;;21004:93;21093:3;21004:93;:::i;:::-;21122:2;21117:3;21113:12;21106:19;;20765:366;;;:::o;21137:419::-;21303:4;21341:2;21330:9;21326:18;21318:26;;21390:9;21384:4;21380:20;21376:1;21365:9;21361:17;21354:47;21418:131;21544:4;21418:131;:::i;:::-;21410:139;;21137:419;;;:::o;21562:181::-;21702:33;21698:1;21690:6;21686:14;21679:57;21562:181;:::o;21749:366::-;21891:3;21912:67;21976:2;21971:3;21912:67;:::i;:::-;21905:74;;21988:93;22077:3;21988:93;:::i;:::-;22106:2;22101:3;22097:12;22090:19;;21749:366;;;:::o;22121:419::-;22287:4;22325:2;22314:9;22310:18;22302:26;;22374:9;22368:4;22364:20;22360:1;22349:9;22345:17;22338:47;22402:131;22528:4;22402:131;:::i;:::-;22394:139;;22121:419;;;:::o;22546:174::-;22686:26;22682:1;22674:6;22670:14;22663:50;22546:174;:::o;22726:366::-;22868:3;22889:67;22953:2;22948:3;22889:67;:::i;:::-;22882:74;;22965:93;23054:3;22965:93;:::i;:::-;23083:2;23078:3;23074:12;23067:19;;22726:366;;;:::o;23098:419::-;23264:4;23302:2;23291:9;23287:18;23279:26;;23351:9;23345:4;23341:20;23337:1;23326:9;23322:17;23315:47;23379:131;23505:4;23379:131;:::i;:::-;23371:139;;23098:419;;;:::o;23523:175::-;23663:27;23659:1;23651:6;23647:14;23640:51;23523:175;:::o;23704:366::-;23846:3;23867:67;23931:2;23926:3;23867:67;:::i;:::-;23860:74;;23943:93;24032:3;23943:93;:::i;:::-;24061:2;24056:3;24052:12;24045:19;;23704:366;;;:::o;24076:419::-;24242:4;24280:2;24269:9;24265:18;24257:26;;24329:9;24323:4;24319:20;24315:1;24304:9;24300:17;24293:47;24357:131;24483:4;24357:131;:::i;:::-;24349:139;;24076:419;;;:::o;24501:180::-;24549:77;24546:1;24539:88;24646:4;24643:1;24636:15;24670:4;24667:1;24660:15;24687:305;24727:3;24746:20;24764:1;24746:20;:::i;:::-;24741:25;;24780:20;24798:1;24780:20;:::i;:::-;24775:25;;24934:1;24866:66;24862:74;24859:1;24856:81;24853:107;;;24940:18;;:::i;:::-;24853:107;24984:1;24981;24977:9;24970:16;;24687:305;;;;:::o;24998:176::-;25138:28;25134:1;25126:6;25122:14;25115:52;24998:176;:::o;25180:366::-;25322:3;25343:67;25407:2;25402:3;25343:67;:::i;:::-;25336:74;;25419:93;25508:3;25419:93;:::i;:::-;25537:2;25532:3;25528:12;25521:19;;25180:366;;;:::o;25552:419::-;25718:4;25756:2;25745:9;25741:18;25733:26;;25805:9;25799:4;25795:20;25791:1;25780:9;25776:17;25769:47;25833:131;25959:4;25833:131;:::i;:::-;25825:139;;25552:419;;;:::o;25977:348::-;26017:7;26040:20;26058:1;26040:20;:::i;:::-;26035:25;;26074:20;26092:1;26074:20;:::i;:::-;26069:25;;26262:1;26194:66;26190:74;26187:1;26184:81;26179:1;26172:9;26165:17;26161:105;26158:131;;;26269:18;;:::i;:::-;26158:131;26317:1;26314;26310:9;26299:20;;25977:348;;;;:::o;26331:181::-;26471:33;26467:1;26459:6;26455:14;26448:57;26331:181;:::o;26518:366::-;26660:3;26681:67;26745:2;26740:3;26681:67;:::i;:::-;26674:74;;26757:93;26846:3;26757:93;:::i;:::-;26875:2;26870:3;26866:12;26859:19;;26518:366;;;:::o;26890:419::-;27056:4;27094:2;27083:9;27079:18;27071:26;;27143:9;27137:4;27133:20;27129:1;27118:9;27114:17;27107:47;27171:131;27297:4;27171:131;:::i;:::-;27163:139;;26890:419;;;:::o;27315:166::-;27455:18;27451:1;27443:6;27439:14;27432:42;27315:166;:::o;27487:366::-;27629:3;27650:67;27714:2;27709:3;27650:67;:::i;:::-;27643:74;;27726:93;27815:3;27726:93;:::i;:::-;27844:2;27839:3;27835:12;27828:19;;27487:366;;;:::o;27859:419::-;28025:4;28063:2;28052:9;28048:18;28040:26;;28112:9;28106:4;28102:20;28098:1;28087:9;28083:17;28076:47;28140:131;28266:4;28140:131;:::i;:::-;28132:139;;27859:419;;;:::o;28284:182::-;28424:34;28420:1;28412:6;28408:14;28401:58;28284:182;:::o;28472:366::-;28614:3;28635:67;28699:2;28694:3;28635:67;:::i;:::-;28628:74;;28711:93;28800:3;28711:93;:::i;:::-;28829:2;28824:3;28820:12;28813:19;;28472:366;;;:::o;28844:419::-;29010:4;29048:2;29037:9;29033:18;29025:26;;29097:9;29091:4;29087:20;29083:1;29072:9;29068:17;29061:47;29125:131;29251:4;29125:131;:::i;:::-;29117:139;;28844:419;;;:::o;29269:233::-;29308:3;29331:24;29349:5;29331:24;:::i;:::-;29322:33;;29377:66;29370:5;29367:77;29364:103;;;29447:18;;:::i;:::-;29364:103;29494:1;29487:5;29483:13;29476:20;;29269:233;;;:::o;29508:174::-;29648:26;29644:1;29636:6;29632:14;29625:50;29508:174;:::o;29688:366::-;29830:3;29851:67;29915:2;29910:3;29851:67;:::i;:::-;29844:74;;29927:93;30016:3;29927:93;:::i;:::-;30045:2;30040:3;30036:12;30029:19;;29688:366;;;:::o;30060:419::-;30226:4;30264:2;30253:9;30249:18;30241:26;;30313:9;30307:4;30303:20;30299:1;30288:9;30284:17;30277:47;30341:131;30467:4;30341:131;:::i;:::-;30333:139;;30060:419;;;:::o;30485:228::-;30625:34;30621:1;30613:6;30609:14;30602:58;30694:11;30689:2;30681:6;30677:15;30670:36;30485:228;:::o;30719:366::-;30861:3;30882:67;30946:2;30941:3;30882:67;:::i;:::-;30875:74;;30958:93;31047:3;30958:93;:::i;:::-;31076:2;31071:3;31067:12;31060:19;;30719:366;;;:::o;31091:419::-;31257:4;31295:2;31284:9;31280:18;31272:26;;31344:9;31338:4;31334:20;31330:1;31319:9;31315:17;31308:47;31372:131;31498:4;31372:131;:::i;:::-;31364:139;;31091:419;;;:::o;31516:177::-;31656:29;31652:1;31644:6;31640:14;31633:53;31516:177;:::o;31699:366::-;31841:3;31862:67;31926:2;31921:3;31862:67;:::i;:::-;31855:74;;31938:93;32027:3;31938:93;:::i;:::-;32056:2;32051:3;32047:12;32040:19;;31699:366;;;:::o;32071:419::-;32237:4;32275:2;32264:9;32260:18;32252:26;;32324:9;32318:4;32314:20;32310:1;32299:9;32295:17;32288:47;32352:131;32478:4;32352:131;:::i;:::-;32344:139;;32071:419;;;:::o;32496:94::-;32529:8;32577:5;32573:2;32569:14;32548:35;;32496:94;;;:::o;32596:::-;32635:7;32664:20;32678:5;32664:20;:::i;:::-;32653:31;;32596:94;;;:::o;32696:100::-;32735:7;32764:26;32784:5;32764:26;:::i;:::-;32753:37;;32696:100;;;:::o;32802:157::-;32907:45;32927:24;32945:5;32927:24;:::i;:::-;32907:45;:::i;:::-;32902:3;32895:58;32802:157;;:::o;32965:256::-;33077:3;33092:75;33163:3;33154:6;33092:75;:::i;:::-;33192:2;33187:3;33183:12;33176:19;;33212:3;33205:10;;32965:256;;;;:::o;33227:148::-;33329:11;33366:3;33351:18;;33227:148;;;;:::o;33381:377::-;33487:3;33515:39;33548:5;33515:39;:::i;:::-;33570:89;33652:6;33647:3;33570:89;:::i;:::-;33563:96;;33668:52;33713:6;33708:3;33701:4;33694:5;33690:16;33668:52;:::i;:::-;33745:6;33740:3;33736:16;33729:23;;33491:267;33381:377;;;;:::o;33764:155::-;33904:7;33900:1;33892:6;33888:14;33881:31;33764:155;:::o;33925:400::-;34085:3;34106:84;34188:1;34183:3;34106:84;:::i;:::-;34099:91;;34199:93;34288:3;34199:93;:::i;:::-;34317:1;34312:3;34308:11;34301:18;;33925:400;;;:::o;34331:541::-;34564:3;34586:95;34677:3;34668:6;34586:95;:::i;:::-;34579:102;;34698:148;34842:3;34698:148;:::i;:::-;34691:155;;34863:3;34856:10;;34331:541;;;;:::o;34878:173::-;35018:25;35014:1;35006:6;35002:14;34995:49;34878:173;:::o;35057:366::-;35199:3;35220:67;35284:2;35279:3;35220:67;:::i;:::-;35213:74;;35296:93;35385:3;35296:93;:::i;:::-;35414:2;35409:3;35405:12;35398:19;;35057:366;;;:::o;35429:419::-;35595:4;35633:2;35622:9;35618:18;35610:26;;35682:9;35676:4;35672:20;35668:1;35657:9;35653:17;35646:47;35710:131;35836:4;35710:131;:::i;:::-;35702:139;;35429:419;;;:::o;35854:225::-;35994:34;35990:1;35982:6;35978:14;35971:58;36063:8;36058:2;36050:6;36046:15;36039:33;35854:225;:::o;36085:366::-;36227:3;36248:67;36312:2;36307:3;36248:67;:::i;:::-;36241:74;;36324:93;36413:3;36324:93;:::i;:::-;36442:2;36437:3;36433:12;36426:19;;36085:366;;;:::o;36457:419::-;36623:4;36661:2;36650:9;36646:18;36638:26;;36710:9;36704:4;36700:20;36696:1;36685:9;36681:17;36674:47;36738:131;36864:4;36738:131;:::i;:::-;36730:139;;36457:419;;;:::o;36882:224::-;37022:34;37018:1;37010:6;37006:14;36999:58;37091:7;37086:2;37078:6;37074:15;37067:32;36882:224;:::o;37112:366::-;37254:3;37275:67;37339:2;37334:3;37275:67;:::i;:::-;37268:74;;37351:93;37440:3;37351:93;:::i;:::-;37469:2;37464:3;37460:12;37453:19;;37112:366;;;:::o;37484:419::-;37650:4;37688:2;37677:9;37673:18;37665:26;;37737:9;37731:4;37727:20;37723:1;37712:9;37708:17;37701:47;37765:131;37891:4;37765:131;:::i;:::-;37757:139;;37484:419;;;:::o;37909:223::-;38049:34;38045:1;38037:6;38033:14;38026:58;38118:6;38113:2;38105:6;38101:15;38094:31;37909:223;:::o;38138:366::-;38280:3;38301:67;38365:2;38360:3;38301:67;:::i;:::-;38294:74;;38377:93;38466:3;38377:93;:::i;:::-;38495:2;38490:3;38486:12;38479:19;;38138:366;;;:::o;38510:419::-;38676:4;38714:2;38703:9;38699:18;38691:26;;38763:9;38757:4;38753:20;38749:1;38738:9;38734:17;38727:47;38791:131;38917:4;38791:131;:::i;:::-;38783:139;;38510:419;;;:::o;38935:191::-;38975:4;38995:20;39013:1;38995:20;:::i;:::-;38990:25;;39029:20;39047:1;39029:20;:::i;:::-;39024:25;;39068:1;39065;39062:8;39059:34;;;39073:18;;:::i;:::-;39059:34;39118:1;39115;39111:9;39103:17;;38935:191;;;;:::o;39132:182::-;39272:34;39268:1;39260:6;39256:14;39249:58;39132:182;:::o;39320:366::-;39462:3;39483:67;39547:2;39542:3;39483:67;:::i;:::-;39476:74;;39559:93;39648:3;39559:93;:::i;:::-;39677:2;39672:3;39668:12;39661:19;;39320:366;;;:::o;39692:419::-;39858:4;39896:2;39885:9;39881:18;39873:26;;39945:9;39939:4;39935:20;39931:1;39920:9;39916:17;39909:47;39973:131;40099:4;39973:131;:::i;:::-;39965:139;;39692:419;;;:::o;40117:179::-;40257:31;40253:1;40245:6;40241:14;40234:55;40117:179;:::o;40302:366::-;40444:3;40465:67;40529:2;40524:3;40465:67;:::i;:::-;40458:74;;40541:93;40630:3;40541:93;:::i;:::-;40659:2;40654:3;40650:12;40643:19;;40302:366;;;:::o;40674:419::-;40840:4;40878:2;40867:9;40863:18;40855:26;;40927:9;40921:4;40917:20;40913:1;40902:9;40898:17;40891:47;40955:131;41081:4;40955:131;:::i;:::-;40947:139;;40674:419;;;:::o;41099:147::-;41200:11;41237:3;41222:18;;41099:147;;;;:::o;41252:114::-;;:::o;41372:398::-;41531:3;41552:83;41633:1;41628:3;41552:83;:::i;:::-;41545:90;;41644:93;41733:3;41644:93;:::i;:::-;41762:1;41757:3;41753:11;41746:18;;41372:398;;;:::o;41776:379::-;41960:3;41982:147;42125:3;41982:147;:::i;:::-;41975:154;;42146:3;42139:10;;41776:379;;;:::o;42161:245::-;42301:34;42297:1;42289:6;42285:14;42278:58;42370:28;42365:2;42357:6;42353:15;42346:53;42161:245;:::o;42412:366::-;42554:3;42575:67;42639:2;42634:3;42575:67;:::i;:::-;42568:74;;42651:93;42740:3;42651:93;:::i;:::-;42769:2;42764:3;42760:12;42753:19;;42412:366;;;:::o;42784:419::-;42950:4;42988:2;42977:9;42973:18;42965:26;;43037:9;43031:4;43027:20;43023:1;43012:9;43008:17;43001:47;43065:131;43191:4;43065:131;:::i;:::-;43057:139;;42784:419;;;:::o;43209:175::-;43349:27;43345:1;43337:6;43333:14;43326:51;43209:175;:::o;43390:366::-;43532:3;43553:67;43617:2;43612:3;43553:67;:::i;:::-;43546:74;;43629:93;43718:3;43629:93;:::i;:::-;43747:2;43742:3;43738:12;43731:19;;43390:366;;;:::o;43762:419::-;43928:4;43966:2;43955:9;43951:18;43943:26;;44015:9;44009:4;44005:20;44001:1;43990:9;43986:17;43979:47;44043:131;44169:4;44043:131;:::i;:::-;44035:139;;43762:419;;;:::o;44187:237::-;44327:34;44323:1;44315:6;44311:14;44304:58;44396:20;44391:2;44383:6;44379:15;44372:45;44187:237;:::o;44430:366::-;44572:3;44593:67;44657:2;44652:3;44593:67;:::i;:::-;44586:74;;44669:93;44758:3;44669:93;:::i;:::-;44787:2;44782:3;44778:12;44771:19;;44430:366;;;:::o;44802:419::-;44968:4;45006:2;44995:9;44991:18;44983:26;;45055:9;45049:4;45045:20;45041:1;45030:9;45026:17;45019:47;45083:131;45209:4;45083:131;:::i;:::-;45075:139;;44802:419;;;:::o;45227:435::-;45407:3;45429:95;45520:3;45511:6;45429:95;:::i;:::-;45422:102;;45541:95;45632:3;45623:6;45541:95;:::i;:::-;45534:102;;45653:3;45646:10;;45227:435;;;;;:::o;45668:180::-;45716:77;45713:1;45706:88;45813:4;45810:1;45803:15;45837:4;45834:1;45827:15;45854:98;45905:6;45939:5;45933:12;45923:22;;45854:98;;;:::o;45958:168::-;46041:11;46075:6;46070:3;46063:19;46115:4;46110:3;46106:14;46091:29;;45958:168;;;;:::o;46132:360::-;46218:3;46246:38;46278:5;46246:38;:::i;:::-;46300:70;46363:6;46358:3;46300:70;:::i;:::-;46293:77;;46379:52;46424:6;46419:3;46412:4;46405:5;46401:16;46379:52;:::i;:::-;46456:29;46478:6;46456:29;:::i;:::-;46451:3;46447:39;46440:46;;46222:270;46132:360;;;;:::o;46498:640::-;46693:4;46731:3;46720:9;46716:19;46708:27;;46745:71;46813:1;46802:9;46798:17;46789:6;46745:71;:::i;:::-;46826:72;46894:2;46883:9;46879:18;46870:6;46826:72;:::i;:::-;46908;46976:2;46965:9;46961:18;46952:6;46908:72;:::i;:::-;47027:9;47021:4;47017:20;47012:2;47001:9;46997:18;46990:48;47055:76;47126:4;47117:6;47055:76;:::i;:::-;47047:84;;46498:640;;;;;;;:::o;47144:141::-;47200:5;47231:6;47225:13;47216:22;;47247:32;47273:5;47247:32;:::i;:::-;47144:141;;;;:::o;47291:349::-;47360:6;47409:2;47397:9;47388:7;47384:23;47380:32;47377:119;;;47415:79;;:::i;:::-;47377:119;47535:1;47560:63;47615:7;47606:6;47595:9;47591:22;47560:63;:::i;:::-;47550:73;;47506:127;47291:349;;;;:::o;47646:180::-;47694:77;47691:1;47684:88;47791:4;47788:1;47781:15;47815:4;47812:1;47805:15;47832:185;47872:1;47889:20;47907:1;47889:20;:::i;:::-;47884:25;;47923:20;47941:1;47923:20;:::i;:::-;47918:25;;47962:1;47952:35;;47967:18;;:::i;:::-;47952:35;48009:1;48006;48002:9;47997:14;;47832:185;;;;:::o;48023:176::-;48055:1;48072:20;48090:1;48072:20;:::i;:::-;48067:25;;48106:20;48124:1;48106:20;:::i;:::-;48101:25;;48145:1;48135:35;;48150:18;;:::i;:::-;48135:35;48191:1;48188;48184:9;48179:14;;48023:176;;;;:::o;48205:182::-;48345:34;48341:1;48333:6;48329:14;48322:58;48205:182;:::o;48393:366::-;48535:3;48556:67;48620:2;48615:3;48556:67;:::i;:::-;48549:74;;48632:93;48721:3;48632:93;:::i;:::-;48750:2;48745:3;48741:12;48734:19;;48393:366;;;:::o;48765:419::-;48931:4;48969:2;48958:9;48954:18;48946:26;;49018:9;49012:4;49008:20;49004:1;48993:9;48989:17;48982:47;49046:131;49172:4;49046:131;:::i;:::-;49038:139;;48765:419;;;:::o;49190:178::-;49330:30;49326:1;49318:6;49314:14;49307:54;49190:178;:::o;49374:366::-;49516:3;49537:67;49601:2;49596:3;49537:67;:::i;:::-;49530:74;;49613:93;49702:3;49613:93;:::i;:::-;49731:2;49726:3;49722:12;49715:19;;49374:366;;;:::o;49746:419::-;49912:4;49950:2;49939:9;49935:18;49927:26;;49999:9;49993:4;49989:20;49985:1;49974:9;49970:17;49963:47;50027:131;50153:4;50027:131;:::i;:::-;50019:139;;49746:419;;;:::o

Swarm Source

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