ETH Price: $2,360.31 (+0.82%)

Token

SBS Draft Token Season 2 (SBS)
 

Overview

Max Total Supply

5,133 SBS

Holders

663

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SBS
0xacad1fbd4b2180e7bae87ca459b342551e71b460
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:
SBSDraftTokenSeasonTwo

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-07-15
*/

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


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

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts (last updated v4.6.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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

    /**
     * @dev 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/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || 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 a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

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

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

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

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


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

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

    bool private _paused;

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

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

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

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

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


// OpenZeppelin Contracts (last updated v4.9.0) (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() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: hardhat/console.sol


pragma solidity >=0.4.22 <0.9.0;

library console {
    address constant CONSOLE_ADDRESS =
        0x000000000000000000636F6e736F6c652e6c6f67;

    function _sendLogPayloadImplementation(bytes memory payload) internal view {
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            pop(
                staticcall(
                    gas(),
                    consoleAddress,
                    add(payload, 32),
                    mload(payload),
                    0,
                    0
                )
            )
        }
    }

    function _castToPure(
      function(bytes memory) internal view fnIn
    ) internal pure returns (function(bytes memory) pure fnOut) {
        assembly {
            fnOut := fnIn
        }
    }

    function _sendLogPayload(bytes memory payload) internal pure {
        _castToPure(_sendLogPayloadImplementation)(payload);
    }

    function log() internal pure {
        _sendLogPayload(abi.encodeWithSignature("log()"));
    }
    function logInt(int256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
    }

    function logUint(uint256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
    }

    function logString(string memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function logBool(bool p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function logAddress(address p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function logBytes(bytes memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
    }

    function logBytes1(bytes1 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
    }

    function logBytes2(bytes2 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
    }

    function logBytes3(bytes3 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
    }

    function logBytes4(bytes4 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
    }

    function logBytes5(bytes5 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
    }

    function logBytes6(bytes6 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
    }

    function logBytes7(bytes7 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
    }

    function logBytes8(bytes8 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
    }

    function logBytes9(bytes9 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
    }

    function logBytes10(bytes10 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
    }

    function logBytes11(bytes11 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
    }

    function logBytes12(bytes12 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
    }

    function logBytes13(bytes13 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
    }

    function logBytes14(bytes14 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
    }

    function logBytes15(bytes15 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
    }

    function logBytes16(bytes16 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
    }

    function logBytes17(bytes17 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
    }

    function logBytes18(bytes18 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
    }

    function logBytes19(bytes19 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
    }

    function logBytes20(bytes20 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
    }

    function logBytes21(bytes21 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
    }

    function logBytes22(bytes22 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
    }

    function logBytes23(bytes23 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
    }

    function logBytes24(bytes24 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
    }

    function logBytes25(bytes25 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
    }

    function logBytes26(bytes26 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
    }

    function logBytes27(bytes27 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
    }

    function logBytes28(bytes28 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
    }

    function logBytes29(bytes29 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
    }

    function logBytes30(bytes30 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
    }

    function logBytes31(bytes31 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
    }

    function logBytes32(bytes32 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
    }

    function log(uint256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
    }

    function log(string memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function log(bool p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function log(address p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function log(uint256 p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
    }

    function log(uint256 p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
    }

    function log(uint256 p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
    }

    function log(uint256 p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
    }

    function log(string memory p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
    }

    function log(string memory p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
    }

    function log(string memory p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
    }

    function log(string memory p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
    }

    function log(bool p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
    }

    function log(bool p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
    }

    function log(bool p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    }

    function log(bool p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
    }

    function log(address p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
    }

    function log(address p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
    }

    function log(address p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
    }

    function log(address p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
    }

    function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    }

    function log(string memory p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
    }

    function log(string memory p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    }

    function log(string memory p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    }

    function log(string memory p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    }

    function log(bool p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
    }

    function log(bool p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    }

    function log(bool p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    }

    function log(bool p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    }

    function log(bool p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
    }

    function log(bool p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    }

    function log(bool p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    }

    function log(bool p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
    }

    function log(address p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
    }

    function log(address p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    }

    function log(address p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    }

    function log(address p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    }

    function log(address p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
    }

    function log(address p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    }

    function log(address p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    }

    function log(address p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    }

    function log(address p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
    }

    function log(address p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    }

    function log(address p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    }

    function log(address p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    }

}

// File: contracts/SBSDraftTokenSeasonTwo.sol


pragma solidity ^0.8.19;






/**
 *    .--.--.       ,---,.   .--.--.
 *   /  /    '.   ,'  .'  \ /  /    '.
 *  |  :  /`. / ,---.' .' ||  :  /`. /
 *  ;  |  |--`  |   |  |: |;  |  |--`
 *  |  :  ;_    :   :  :  /|  :  ;_
 *   \  \    `. :   |    ;  \  \    `.
 *    `----.   \|   :     \  `----.   \
 *    __ \  \  ||   |   . |  __ \  \  |
 *   /  /`--'  /'   :  '; | /  /`--'  /
 *  '--'.     / |   |  | ; '--'.     /
 *    `--'---'  |   :   /    `--'---'
 *              |   | ,'
 *              `----'
 * @title Spoiled Banana Society Season 2 Draft Token ERC-721 Smart Contract
 */

contract SBSDraftTokenSeasonTwo is ERC721, Ownable, Pausable, ReentrancyGuard {

    constructor() ERC721("SBS Draft Token Season 2", "SBS") Ownable(msg.sender) {}

    string public SPOILEDBANANASOCIETY_PROVENANCE = "";
    string private baseURI;
    uint256 public constant RESERVED_TOKENS = 20;
    uint256 public constant TOKEN_PRICE = 10000000000000000;
    uint256 public constant MAX_TOKENS_PURCHASE = 20;
    uint256 public numTokensMinted = 0;
    uint256 public numTokensBurned = 0;

    // PUBLIC MINT
    bool public mintIsActive = false;

    // WALLET BASED PRESALE MINT
    bool public presaleIsActive = false;
    mapping (address => bool) public presaleWalletList;

    // FREE WALLET BASED MINT
    bool public freeWalletIsActive = false;
    mapping (address => bool) public freeWalletList;

    // PUBLIC MINT
    function flipMintState() external onlyOwner {
        mintIsActive = !mintIsActive;
    }

    function mint(uint256 numberOfTokens) external payable nonReentrant {
        require(mintIsActive, "Mint is not active");
        require(numberOfTokens <= MAX_TOKENS_PURCHASE, "You went over max tokens per transaction");
        require(TOKEN_PRICE * numberOfTokens <= msg.value, "You sent the incorrect amount of ETH");
        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 mintIndex = numTokensMinted;
            numTokensMinted++;
            _safeMint(msg.sender, mintIndex);
        }
    }

    // WALLET BASED PRESALE MINT
    function flipPresaleState() external onlyOwner {
	    presaleIsActive = !presaleIsActive;
    }

    function initPresaleWalletList(address[] memory walletList) external onlyOwner {
	    for (uint256 i = 0; i < walletList.length; i++) {
		    presaleWalletList[walletList[i]] = true;
	    }
    }

    function mintPresaleWalletList(uint256 numberOfTokens) external payable nonReentrant {
        require(presaleIsActive, "Mint is not active");
	    require(numberOfTokens <= MAX_TOKENS_PURCHASE, "You went over max tokens per transaction");
	    require(presaleWalletList[msg.sender] == true, "You are not on the presale wallet list or have already minted");
        require(TOKEN_PRICE * numberOfTokens <= msg.value, "You sent the incorrect amount of ETH");
	    for (uint256 i = 0; i < numberOfTokens; i++) {
		    uint256 mintIndex = numTokensMinted;
			numTokensMinted++;
			_safeMint(msg.sender, mintIndex);
	    }
	    presaleWalletList[msg.sender] = false;
    }

    // FREE WALLET BASED GIVEAWAY MINT - Only Mint One
    function flipFreeWalletState() external onlyOwner {
	    freeWalletIsActive = !freeWalletIsActive;
    }

    function initFreeWalletList(address[] memory walletList) external onlyOwner {
	    for (uint256 i = 0; i < walletList.length; i++) {
		    freeWalletList[walletList[i]] = true;
	    }
    }

    function mintFreeWalletList() external nonReentrant {
        require(freeWalletIsActive, "Mint is not active");
	    require(freeWalletList[msg.sender] == true, "You are not on the free wallet list or have already minted");

        uint256 mintIndex = numTokensMinted;
        numTokensMinted++;
        _safeMint(msg.sender, mintIndex);

	    freeWalletList[msg.sender] = false;
    }

    // TOTAL SUPPLY
    function totalSupply() external view returns (uint) { 
        return numTokensMinted - numTokensBurned;
    }

    // BURN IT 
    function burn(uint256 tokenId) public virtual {
	    require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
	    _burn(tokenId);
        numTokensBurned++;
    }

    // OWNER FUNCTIONS
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        Address.sendValue(payable(owner()), balance);
    }

    function reserveTokens() external onlyOwner {
        uint256 mintIndex = numTokensMinted;
        for (uint256 i = 0; i < RESERVED_TOKENS; i++) {
            numTokensMinted++;
            _safeMint(msg.sender, mintIndex + i);
        }
    }

    function setPaused(bool _setPaused) external onlyOwner {
	    return (_setPaused) ? _pause() : _unpause();
    }

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

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

    function setProvenanceHash(string memory provenanceHash) external onlyOwner {
        SPOILEDBANANASOCIETY_PROVENANCE = provenanceHash;
    }

    // function _beforeTokenTransfer(
	//     address from,
	//     address to,
	//     uint256 tokenId
    // ) internal virtual override(ERC721) {
	//     require(!paused(), "Pausable: paused");
	//     super._beforeTokenTransfer(from, to, tokenId);
    // }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_TOKENS_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SPOILEDBANANASOCIETY_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipFreeWalletState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeWalletIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeWalletList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"walletList","type":"address[]"}],"name":"initFreeWalletList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"walletList","type":"address[]"}],"name":"initPresaleWalletList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFreeWalletList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPresaleWalletList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleWalletList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setPaused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052805f8152506008908161002191906104b4565b505f600a555f600b555f600c5f6101000a81548160ff0219169083151502179055505f600c60016101000a81548160ff0219169083151502179055505f600e5f6101000a81548160ff021916908315150217905550348015610081575f80fd5b50336040518060400160405280601881526020017f53425320447261667420546f6b656e20536561736f6e203200000000000000008152506040518060400160405280600381526020017f5342530000000000000000000000000000000000000000000000000000000000815250815f90816100fd91906104b4565b50806001908161010d91906104b4565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610180575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161017791906105c2565b60405180910390fd5b61018f816101b760201b60201c565b505f600660146101000a81548160ff02191690831515021790555060016007819055506105db565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806102f557607f821691505b602082108103610308576103076102b1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261036a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261032f565b610374868361032f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6103b86103b36103ae8461038c565b610395565b61038c565b9050919050565b5f819050919050565b6103d18361039e565b6103e56103dd826103bf565b84845461033b565b825550505050565b5f90565b6103f96103ed565b6104048184846103c8565b505050565b5b818110156104275761041c5f826103f1565b60018101905061040a565b5050565b601f82111561046c5761043d8161030e565b61044684610320565b81016020851015610455578190505b61046961046185610320565b830182610409565b50505b505050565b5f82821c905092915050565b5f61048c5f1984600802610471565b1980831691505092915050565b5f6104a4838361047d565b9150826002028217905092915050565b6104bd8261027a565b67ffffffffffffffff8111156104d6576104d5610284565b5b6104e082546102de565b6104eb82828561042b565b5f60209050601f83116001811461051c575f841561050a578287015190505b6105148582610499565b86555061057b565b601f19841661052a8661030e565b5f5b828110156105515784890151825560018201915060208501945060208101905061052c565b8683101561056e578489015161056a601f89168261047d565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6105ac82610583565b9050919050565b6105bc816105a2565b82525050565b5f6020820190506105d55f8301846105b3565b92915050565b61460d806105e85f395ff3fe60806040526004361061025b575f3560e01c80635c975abb11610143578063a0712d68116100b5578063d2d8cb6711610079578063d2d8cb6714610845578063daefe6d21461086f578063e985e9c514610899578063f2fde38b146108d5578063f81227d4146108fd578063fdc9b483146109135761025b565b8063a0712d6814610787578063a22cb465146107a3578063b88d4fde146107cb578063c87b56dd146107f3578063cca979111461082f5761025b565b8063715018a611610107578063715018a6146106a1578063748c4557146106b75780637b51715d146106f3578063894a8cac1461071d5780638da5cb5b1461073357806395d89b411461075d5761025b565b80635c975abb146105ad5780635d04aeab146105d75780636352211e146105ff57806368fc68c71461063b57806370a08231146106655761025b565b806327ac36c4116101dc57806342966c68116101a057806342966c68146104d9578063452b67cb14610501578063471a42941461051d5780634f699a431461054757806355f804b31461056f57806359c74f29146105975761025b565b806327ac36c41461043157806330f72cd4146104475780633ccfd60b146104715780634230baee1461048757806342842e0e146104b15761025b565b80631096952311610223578063109695231461036557806316c38b3c1461038d57806318160ddd146103b557806323b872dd146103df57806323eb0032146104075761025b565b806301ffc9a71461025f57806306fdde031461029b578063081812fc146102c5578063095ea7b3146103015780630c9a631314610329575b5f80fd5b34801561026a575f80fd5b5061028560048036038101906102809190612bf6565b61093d565b6040516102929190612c3b565b60405180910390f35b3480156102a6575f80fd5b506102af610a1e565b6040516102bc9190612cc4565b60405180910390f35b3480156102d0575f80fd5b506102eb60048036038101906102e69190612d17565b610aad565b6040516102f89190612d81565b60405180910390f35b34801561030c575f80fd5b5061032760048036038101906103229190612dc4565b610b2e565b005b348015610334575f80fd5b5061034f600480360381019061034a9190612e02565b610c44565b60405161035c9190612c3b565b60405180910390f35b348015610370575f80fd5b5061038b60048036038101906103869190612f59565b610c61565b005b348015610398575f80fd5b506103b360048036038101906103ae9190612fca565b610c7c565b005b3480156103c0575f80fd5b506103c9610ca2565b6040516103d69190613004565b60405180910390f35b3480156103ea575f80fd5b506104056004803603810190610400919061301d565b610cb8565b005b348015610412575f80fd5b5061041b610d18565b6040516104289190613004565b60405180910390f35b34801561043c575f80fd5b50610445610d1d565b005b348015610452575f80fd5b5061045b610d73565b6040516104689190612c3b565b60405180910390f35b34801561047c575f80fd5b50610485610d86565b005b348015610492575f80fd5b5061049b610da6565b6040516104a89190613004565b60405180910390f35b3480156104bc575f80fd5b506104d760048036038101906104d2919061301d565b610dac565b005b3480156104e4575f80fd5b506104ff60048036038101906104fa9190612d17565b610dcb565b005b61051b60048036038101906105169190612d17565b610e3e565b005b348015610528575f80fd5b5061053161105d565b60405161053e9190612c3b565b60405180910390f35b348015610552575f80fd5b5061056d60048036038101906105689190613131565b61106f565b005b34801561057a575f80fd5b5061059560048036038101906105909190612f59565b611102565b005b3480156105a2575f80fd5b506105ab61111d565b005b3480156105b8575f80fd5b506105c161114f565b6040516105ce9190612c3b565b60405180910390f35b3480156105e2575f80fd5b506105fd60048036038101906105f89190613131565b611165565b005b34801561060a575f80fd5b5061062560048036038101906106209190612d17565b6111f8565b6040516106329190612d81565b60405180910390f35b348015610646575f80fd5b5061064f6112a4565b60405161065c9190613004565b60405180910390f35b348015610670575f80fd5b5061068b60048036038101906106869190612e02565b6112a9565b6040516106989190613004565b60405180910390f35b3480156106ac575f80fd5b506106b561135d565b005b3480156106c2575f80fd5b506106dd60048036038101906106d89190612e02565b611370565b6040516106ea9190612c3b565b60405180910390f35b3480156106fe575f80fd5b5061070761138d565b6040516107149190613004565b60405180910390f35b348015610728575f80fd5b50610731611393565b005b34801561073e575f80fd5b506107476113c5565b6040516107549190612d81565b60405180910390f35b348015610768575f80fd5b506107716113ed565b60405161077e9190612cc4565b60405180910390f35b6107a1600480360381019061079c9190612d17565b61147d565b005b3480156107ae575f80fd5b506107c960048036038101906107c49190613178565b6115b7565b005b3480156107d6575f80fd5b506107f160048036038101906107ec9190613254565b6115cd565b005b3480156107fe575f80fd5b5061081960048036038101906108149190612d17565b61162f565b6040516108269190612cc4565b60405180910390f35b34801561083a575f80fd5b506108436116d3565b005b348015610850575f80fd5b5061085961183f565b6040516108669190613004565b60405180910390f35b34801561087a575f80fd5b5061088361184a565b6040516108909190612cc4565b60405180910390f35b3480156108a4575f80fd5b506108bf60048036038101906108ba91906132d4565b6118d6565b6040516108cc9190612c3b565b60405180910390f35b3480156108e0575f80fd5b506108fb60048036038101906108f69190612e02565b611964565b005b348015610908575f80fd5b506109116119e8565b005b34801561091e575f80fd5b50610927611a1c565b6040516109349190612c3b565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a175750610a1682611a2e565b5b9050919050565b60605f8054610a2c9061333f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a589061333f565b8015610aa35780601f10610a7a57610100808354040283529160200191610aa3565b820191905f5260205f20905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b5f610ab782611a97565b610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed906133df565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610b38826111f8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f9061346d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc7611aff565b73ffffffffffffffffffffffffffffffffffffffff161480610bf65750610bf581610bf0611aff565b6118d6565b5b610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c906134fb565b60405180910390fd5b610c3f8383611b06565b505050565b600f602052805f5260405f205f915054906101000a900460ff1681565b610c69611bbc565b8060089081610c7891906136b6565b5050565b610c84611bbc565b80610c9657610c91611c43565b610c9f565b610c9e611ca5565b5b50565b5f600b54600a54610cb391906137b2565b905090565b610cc9610cc3611aff565b82611d08565b610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90613855565b60405180910390fd5b610d13838383611de4565b505050565b601481565b610d25611bbc565b5f600a5490505f5b6014811015610d6f57600a5f815480929190610d4890613873565b9190505550610d62338284610d5d91906138ba565b61203f565b8080600101915050610d2d565b5050565b600c60019054906101000a900460ff1681565b610d8e611bbc565b5f479050610da3610d9d6113c5565b8261205c565b50565b600a5481565b610dc683838360405180602001604052805f8152506115cd565b505050565b610ddc610dd6611aff565b82611d08565b610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e129061395d565b60405180910390fd5b610e248161214c565b600b5f815480929190610e3690613873565b919050555050565b610e4661225e565b600c60019054906101000a900460ff16610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c906139c5565b60405180910390fd5b6014811115610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090613a53565b60405180910390fd5b60011515600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090613ae1565b60405180910390fd5b3481662386f26fc10000610f7d9190613aff565b1115610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590613bb0565b60405180910390fd5b5f5b81811015610ffd575f600a549050600a5f815480929190610fe090613873565b9190505550610fef338261203f565b508080600101915050610fc0565b505f600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061105a6122ad565b50565b600c5f9054906101000a900460ff1681565b611077611bbc565b5f5b81518110156110fe576001600d5f84848151811061109a57611099613bce565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050611079565b5050565b61110a611bbc565b806009908161111991906136b6565b5050565b611125611bbc565b600c5f9054906101000a900460ff1615600c5f6101000a81548160ff021916908315150217905550565b5f600660149054906101000a900460ff16905090565b61116d611bbc565b5f5b81518110156111f4576001600f5f8484815181106111905761118f613bce565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550808060010191505061116f565b5050565b5f8060025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361129b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129290613c6b565b60405180910390fd5b80915050919050565b601481565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90613cf9565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611365611bbc565b61136e5f6122b7565b565b600d602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61139b611bbc565b600e5f9054906101000a900460ff1615600e5f6101000a81548160ff021916908315150217905550565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113fc9061333f565b80601f01602080910402602001604051908101604052809291908181526020018280546114289061333f565b80156114735780601f1061144a57610100808354040283529160200191611473565b820191905f5260205f20905b81548152906001019060200180831161145657829003601f168201915b5050505050905090565b61148561225e565b600c5f9054906101000a900460ff166114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca906139c5565b60405180910390fd5b6014811115611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e90613a53565b60405180910390fd5b3481662386f26fc1000061152b9190613aff565b111561156c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156390613bb0565b60405180910390fd5b5f5b818110156115ab575f600a549050600a5f81548092919061158e90613873565b919050555061159d338261203f565b50808060010191505061156e565b506115b46122ad565b50565b6115c96115c2611aff565b838361237a565b5050565b6115de6115d8611aff565b83611d08565b61161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490613855565b60405180910390fd5b611629848484846124e1565b50505050565b606061163a82611a97565b611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167090613d87565b60405180910390fd5b5f61168261253d565b90505f8151116116a05760405180602001604052805f8152506116cb565b806116aa846125cd565b6040516020016116bb929190613ddf565b6040516020818303038152906040525b915050919050565b6116db61225e565b600e5f9054906101000a900460ff16611729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611720906139c5565b60405180910390fd5b60011515600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b090613e72565b60405180910390fd5b5f600a549050600a5f8154809291906117d190613873565b91905055506117e0338261203f565b5f600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505061183d6122ad565b565b662386f26fc1000081565b600880546118579061333f565b80601f01602080910402602001604051908101604052809291908181526020018280546118839061333f565b80156118ce5780601f106118a5576101008083540402835291602001916118ce565b820191905f5260205f20905b8154815290600101906020018083116118b157829003601f168201915b505050505081565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b61196c611bbc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119dc575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016119d39190612d81565b60405180910390fd5b6119e5816122b7565b50565b6119f0611bbc565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b600e5f9054906101000a900460ff1681565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b76836111f8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611bc4611aff565b73ffffffffffffffffffffffffffffffffffffffff16611be26113c5565b73ffffffffffffffffffffffffffffffffffffffff1614611c4157611c05611aff565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611c389190612d81565b60405180910390fd5b565b611c4b612726565b5f600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c8e611aff565b604051611c9b9190612d81565b60405180910390a1565b611cad61276f565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cf1611aff565b604051611cfe9190612d81565b60405180910390a1565b5f611d1282611a97565b611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613f00565b60405180910390fd5b5f611d5b836111f8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d9d5750611d9c81856118d6565b5b80611ddb57508373ffffffffffffffffffffffffffffffffffffffff16611dc384610aad565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e04826111f8565b73ffffffffffffffffffffffffffffffffffffffff1614611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5190613f8e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf9061401c565b60405180910390fd5b611ed38383836127b9565b611edd5f82611b06565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f2a91906137b2565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f7e91906138ba565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461203a8383836127be565b505050565b612058828260405180602001604052805f8152506127c3565b5050565b8047101561209f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209690614084565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16826040516120c4906140cf565b5f6040518083038185875af1925050503d805f81146120fe576040519150601f19603f3d011682016040523d82523d5f602084013e612103565b606091505b5050905080612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e90614153565b60405180910390fd5b505050565b5f612156826111f8565b9050612163815f846127b9565b61216d5f83611b06565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546121ba91906137b2565b9250508190555060025f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055815f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461225a815f846127be565b5050565b6002600754036122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906141bb565b60405180910390fd5b6002600781905550565b6001600781905550565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df90614223565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124d49190612c3b565b60405180910390a3505050565b6124ec848484611de4565b6124f88484848461281d565b612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252e906142b1565b60405180910390fd5b50505050565b60606009805461254c9061333f565b80601f01602080910402602001604051908101604052809291908181526020018280546125789061333f565b80156125c35780601f1061259a576101008083540402835291602001916125c3565b820191905f5260205f20905b8154815290600101906020018083116125a657829003601f168201915b5050505050905090565b60605f8203612613576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612721565b5f8290505f5b5f821461264257808061262b90613873565b915050600a8261263b91906142fc565b9150612619565b5f8167ffffffffffffffff81111561265d5761265c612e35565b5b6040519080825280601f01601f19166020018201604052801561268f5781602001600182028036833780820191505090505b5090505b5f851461271a576001826126a791906137b2565b9150600a856126b6919061432c565b60306126c291906138ba565b60f81b8183815181106126d8576126d7613bce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561271391906142fc565b9450612693565b8093505050505b919050565b61272e61114f565b61276d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612764906143a6565b60405180910390fd5b565b61277761114f565b156127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae9061440e565b60405180910390fd5b565b505050565b505050565b6127cd838361299f565b6127d95f84848461281d565b612818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280f906142b1565b60405180910390fd5b505050565b5f61283d8473ffffffffffffffffffffffffffffffffffffffff16612b6e565b15612992578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612866611aff565b8786866040518563ffffffff1660e01b8152600401612888949392919061447e565b6020604051808303815f875af19250505080156128c357506040513d601f19601f820116820180604052508101906128c091906144dc565b60015b612942573d805f81146128f1576040519150601f19603f3d011682016040523d82523d5f602084013e6128f6565b606091505b505f81510361293a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612931906142b1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612997565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0490614551565b60405180910390fd5b612a1681611a97565b15612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d906145b9565b60405180910390fd5b612a615f83836127b9565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612aae91906138ba565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6a5f83836127be565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bd581612ba1565b8114612bdf575f80fd5b50565b5f81359050612bf081612bcc565b92915050565b5f60208284031215612c0b57612c0a612b99565b5b5f612c1884828501612be2565b91505092915050565b5f8115159050919050565b612c3581612c21565b82525050565b5f602082019050612c4e5f830184612c2c565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612c9682612c54565b612ca08185612c5e565b9350612cb0818560208601612c6e565b612cb981612c7c565b840191505092915050565b5f6020820190508181035f830152612cdc8184612c8c565b905092915050565b5f819050919050565b612cf681612ce4565b8114612d00575f80fd5b50565b5f81359050612d1181612ced565b92915050565b5f60208284031215612d2c57612d2b612b99565b5b5f612d3984828501612d03565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d6b82612d42565b9050919050565b612d7b81612d61565b82525050565b5f602082019050612d945f830184612d72565b92915050565b612da381612d61565b8114612dad575f80fd5b50565b5f81359050612dbe81612d9a565b92915050565b5f8060408385031215612dda57612dd9612b99565b5b5f612de785828601612db0565b9250506020612df885828601612d03565b9150509250929050565b5f60208284031215612e1757612e16612b99565b5b5f612e2484828501612db0565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612e6b82612c7c565b810181811067ffffffffffffffff82111715612e8a57612e89612e35565b5b80604052505050565b5f612e9c612b90565b9050612ea88282612e62565b919050565b5f67ffffffffffffffff821115612ec757612ec6612e35565b5b612ed082612c7c565b9050602081019050919050565b828183375f83830152505050565b5f612efd612ef884612ead565b612e93565b905082815260208101848484011115612f1957612f18612e31565b5b612f24848285612edd565b509392505050565b5f82601f830112612f4057612f3f612e2d565b5b8135612f50848260208601612eeb565b91505092915050565b5f60208284031215612f6e57612f6d612b99565b5b5f82013567ffffffffffffffff811115612f8b57612f8a612b9d565b5b612f9784828501612f2c565b91505092915050565b612fa981612c21565b8114612fb3575f80fd5b50565b5f81359050612fc481612fa0565b92915050565b5f60208284031215612fdf57612fde612b99565b5b5f612fec84828501612fb6565b91505092915050565b612ffe81612ce4565b82525050565b5f6020820190506130175f830184612ff5565b92915050565b5f805f6060848603121561303457613033612b99565b5b5f61304186828701612db0565b935050602061305286828701612db0565b925050604061306386828701612d03565b9150509250925092565b5f67ffffffffffffffff82111561308757613086612e35565b5b602082029050602081019050919050565b5f80fd5b5f6130ae6130a98461306d565b612e93565b905080838252602082019050602084028301858111156130d1576130d0613098565b5b835b818110156130fa57806130e68882612db0565b8452602084019350506020810190506130d3565b5050509392505050565b5f82601f83011261311857613117612e2d565b5b813561312884826020860161309c565b91505092915050565b5f6020828403121561314657613145612b99565b5b5f82013567ffffffffffffffff81111561316357613162612b9d565b5b61316f84828501613104565b91505092915050565b5f806040838503121561318e5761318d612b99565b5b5f61319b85828601612db0565b92505060206131ac85828601612fb6565b9150509250929050565b5f67ffffffffffffffff8211156131d0576131cf612e35565b5b6131d982612c7c565b9050602081019050919050565b5f6131f86131f3846131b6565b612e93565b90508281526020810184848401111561321457613213612e31565b5b61321f848285612edd565b509392505050565b5f82601f83011261323b5761323a612e2d565b5b813561324b8482602086016131e6565b91505092915050565b5f805f806080858703121561326c5761326b612b99565b5b5f61327987828801612db0565b945050602061328a87828801612db0565b935050604061329b87828801612d03565b925050606085013567ffffffffffffffff8111156132bc576132bb612b9d565b5b6132c887828801613227565b91505092959194509250565b5f80604083850312156132ea576132e9612b99565b5b5f6132f785828601612db0565b925050602061330885828601612db0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061335657607f821691505b60208210810361336957613368613312565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f6133c9602c83612c5e565b91506133d48261336f565b604082019050919050565b5f6020820190508181035f8301526133f6816133bd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f613457602183612c5e565b9150613462826133fd565b604082019050919050565b5f6020820190508181035f8301526134848161344b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f6134e5603883612c5e565b91506134f08261348b565b604082019050919050565b5f6020820190508181035f830152613512816134d9565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026135757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261353a565b61357f868361353a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6135ba6135b56135b084612ce4565b613597565b612ce4565b9050919050565b5f819050919050565b6135d3836135a0565b6135e76135df826135c1565b848454613546565b825550505050565b5f90565b6135fb6135ef565b6136068184846135ca565b505050565b5b818110156136295761361e5f826135f3565b60018101905061360c565b5050565b601f82111561366e5761363f81613519565b6136488461352b565b81016020851015613657578190505b61366b6136638561352b565b83018261360b565b50505b505050565b5f82821c905092915050565b5f61368e5f1984600802613673565b1980831691505092915050565b5f6136a6838361367f565b9150826002028217905092915050565b6136bf82612c54565b67ffffffffffffffff8111156136d8576136d7612e35565b5b6136e2825461333f565b6136ed82828561362d565b5f60209050601f83116001811461371e575f841561370c578287015190505b613716858261369b565b86555061377d565b601f19841661372c86613519565b5f5b828110156137535784890151825560018201915060208501945060208101905061372e565b86831015613770578489015161376c601f89168261367f565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6137bc82612ce4565b91506137c783612ce4565b92508282039050818111156137df576137de613785565b5b92915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f61383f603183612c5e565b915061384a826137e5565b604082019050919050565b5f6020820190508181035f83015261386c81613833565b9050919050565b5f61387d82612ce4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138af576138ae613785565b5b600182019050919050565b5f6138c482612ce4565b91506138cf83612ce4565b92508282019050808211156138e7576138e6613785565b5b92915050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b5f613947603083612c5e565b9150613952826138ed565b604082019050919050565b5f6020820190508181035f8301526139748161393b565b9050919050565b7f4d696e74206973206e6f742061637469766500000000000000000000000000005f82015250565b5f6139af601283612c5e565b91506139ba8261397b565b602082019050919050565b5f6020820190508181035f8301526139dc816139a3565b9050919050565b7f596f752077656e74206f766572206d617820746f6b656e7320706572207472615f8201527f6e73616374696f6e000000000000000000000000000000000000000000000000602082015250565b5f613a3d602883612c5e565b9150613a48826139e3565b604082019050919050565b5f6020820190508181035f830152613a6a81613a31565b9050919050565b7f596f7520617265206e6f74206f6e207468652070726573616c652077616c6c655f8201527f74206c697374206f72206861766520616c7265616479206d696e746564000000602082015250565b5f613acb603d83612c5e565b9150613ad682613a71565b604082019050919050565b5f6020820190508181035f830152613af881613abf565b9050919050565b5f613b0982612ce4565b9150613b1483612ce4565b9250828202613b2281612ce4565b91508282048414831517613b3957613b38613785565b5b5092915050565b7f596f752073656e742074686520696e636f727265637420616d6f756e74206f665f8201527f2045544800000000000000000000000000000000000000000000000000000000602082015250565b5f613b9a602483612c5e565b9150613ba582613b40565b604082019050919050565b5f6020820190508181035f830152613bc781613b8e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f613c55602983612c5e565b9150613c6082613bfb565b604082019050919050565b5f6020820190508181035f830152613c8281613c49565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f613ce3602a83612c5e565b9150613cee82613c89565b604082019050919050565b5f6020820190508181035f830152613d1081613cd7565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f613d71602f83612c5e565b9150613d7c82613d17565b604082019050919050565b5f6020820190508181035f830152613d9e81613d65565b9050919050565b5f81905092915050565b5f613db982612c54565b613dc38185613da5565b9350613dd3818560208601612c6e565b80840191505092915050565b5f613dea8285613daf565b9150613df68284613daf565b91508190509392505050565b7f596f7520617265206e6f74206f6e2074686520667265652077616c6c6574206c5f8201527f697374206f72206861766520616c7265616479206d696e746564000000000000602082015250565b5f613e5c603a83612c5e565b9150613e6782613e02565b604082019050919050565b5f6020820190508181035f830152613e8981613e50565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f613eea602c83612c5e565b9150613ef582613e90565b604082019050919050565b5f6020820190508181035f830152613f1781613ede565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f613f78602583612c5e565b9150613f8382613f1e565b604082019050919050565b5f6020820190508181035f830152613fa581613f6c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614006602483612c5e565b915061401182613fac565b604082019050919050565b5f6020820190508181035f83015261403381613ffa565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e63650000005f82015250565b5f61406e601d83612c5e565b91506140798261403a565b602082019050919050565b5f6020820190508181035f83015261409b81614062565b9050919050565b5f81905092915050565b50565b5f6140ba5f836140a2565b91506140c5826140ac565b5f82019050919050565b5f6140d9826140af565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c20725f8201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b5f61413d603a83612c5e565b9150614148826140e3565b604082019050919050565b5f6020820190508181035f83015261416a81614131565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6141a5601f83612c5e565b91506141b082614171565b602082019050919050565b5f6020820190508181035f8301526141d281614199565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f61420d601983612c5e565b9150614218826141d9565b602082019050919050565b5f6020820190508181035f83015261423a81614201565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f61429b603283612c5e565b91506142a682614241565b604082019050919050565b5f6020820190508181035f8301526142c88161428f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61430682612ce4565b915061431183612ce4565b925082614321576143206142cf565b5b828204905092915050565b5f61433682612ce4565b915061434183612ce4565b925082614351576143506142cf565b5b828206905092915050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f614390601483612c5e565b915061439b8261435c565b602082019050919050565b5f6020820190508181035f8301526143bd81614384565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f6143f8601083612c5e565b9150614403826143c4565b602082019050919050565b5f6020820190508181035f830152614425816143ec565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6144508261442c565b61445a8185614436565b935061446a818560208601612c6e565b61447381612c7c565b840191505092915050565b5f6080820190506144915f830187612d72565b61449e6020830186612d72565b6144ab6040830185612ff5565b81810360608301526144bd8184614446565b905095945050505050565b5f815190506144d681612bcc565b92915050565b5f602082840312156144f1576144f0612b99565b5b5f6144fe848285016144c8565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f61453b602083612c5e565b915061454682614507565b602082019050919050565b5f6020820190508181035f8301526145688161452f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f6145a3601c83612c5e565b91506145ae8261456f565b602082019050919050565b5f6020820190508181035f8301526145d081614597565b905091905056fea2646970667358221220826b340d56c90113648a161626305833bebc9024e5aef55b4e517b8b37811fb764736f6c634300081a0033

Deployed Bytecode

0x60806040526004361061025b575f3560e01c80635c975abb11610143578063a0712d68116100b5578063d2d8cb6711610079578063d2d8cb6714610845578063daefe6d21461086f578063e985e9c514610899578063f2fde38b146108d5578063f81227d4146108fd578063fdc9b483146109135761025b565b8063a0712d6814610787578063a22cb465146107a3578063b88d4fde146107cb578063c87b56dd146107f3578063cca979111461082f5761025b565b8063715018a611610107578063715018a6146106a1578063748c4557146106b75780637b51715d146106f3578063894a8cac1461071d5780638da5cb5b1461073357806395d89b411461075d5761025b565b80635c975abb146105ad5780635d04aeab146105d75780636352211e146105ff57806368fc68c71461063b57806370a08231146106655761025b565b806327ac36c4116101dc57806342966c68116101a057806342966c68146104d9578063452b67cb14610501578063471a42941461051d5780634f699a431461054757806355f804b31461056f57806359c74f29146105975761025b565b806327ac36c41461043157806330f72cd4146104475780633ccfd60b146104715780634230baee1461048757806342842e0e146104b15761025b565b80631096952311610223578063109695231461036557806316c38b3c1461038d57806318160ddd146103b557806323b872dd146103df57806323eb0032146104075761025b565b806301ffc9a71461025f57806306fdde031461029b578063081812fc146102c5578063095ea7b3146103015780630c9a631314610329575b5f80fd5b34801561026a575f80fd5b5061028560048036038101906102809190612bf6565b61093d565b6040516102929190612c3b565b60405180910390f35b3480156102a6575f80fd5b506102af610a1e565b6040516102bc9190612cc4565b60405180910390f35b3480156102d0575f80fd5b506102eb60048036038101906102e69190612d17565b610aad565b6040516102f89190612d81565b60405180910390f35b34801561030c575f80fd5b5061032760048036038101906103229190612dc4565b610b2e565b005b348015610334575f80fd5b5061034f600480360381019061034a9190612e02565b610c44565b60405161035c9190612c3b565b60405180910390f35b348015610370575f80fd5b5061038b60048036038101906103869190612f59565b610c61565b005b348015610398575f80fd5b506103b360048036038101906103ae9190612fca565b610c7c565b005b3480156103c0575f80fd5b506103c9610ca2565b6040516103d69190613004565b60405180910390f35b3480156103ea575f80fd5b506104056004803603810190610400919061301d565b610cb8565b005b348015610412575f80fd5b5061041b610d18565b6040516104289190613004565b60405180910390f35b34801561043c575f80fd5b50610445610d1d565b005b348015610452575f80fd5b5061045b610d73565b6040516104689190612c3b565b60405180910390f35b34801561047c575f80fd5b50610485610d86565b005b348015610492575f80fd5b5061049b610da6565b6040516104a89190613004565b60405180910390f35b3480156104bc575f80fd5b506104d760048036038101906104d2919061301d565b610dac565b005b3480156104e4575f80fd5b506104ff60048036038101906104fa9190612d17565b610dcb565b005b61051b60048036038101906105169190612d17565b610e3e565b005b348015610528575f80fd5b5061053161105d565b60405161053e9190612c3b565b60405180910390f35b348015610552575f80fd5b5061056d60048036038101906105689190613131565b61106f565b005b34801561057a575f80fd5b5061059560048036038101906105909190612f59565b611102565b005b3480156105a2575f80fd5b506105ab61111d565b005b3480156105b8575f80fd5b506105c161114f565b6040516105ce9190612c3b565b60405180910390f35b3480156105e2575f80fd5b506105fd60048036038101906105f89190613131565b611165565b005b34801561060a575f80fd5b5061062560048036038101906106209190612d17565b6111f8565b6040516106329190612d81565b60405180910390f35b348015610646575f80fd5b5061064f6112a4565b60405161065c9190613004565b60405180910390f35b348015610670575f80fd5b5061068b60048036038101906106869190612e02565b6112a9565b6040516106989190613004565b60405180910390f35b3480156106ac575f80fd5b506106b561135d565b005b3480156106c2575f80fd5b506106dd60048036038101906106d89190612e02565b611370565b6040516106ea9190612c3b565b60405180910390f35b3480156106fe575f80fd5b5061070761138d565b6040516107149190613004565b60405180910390f35b348015610728575f80fd5b50610731611393565b005b34801561073e575f80fd5b506107476113c5565b6040516107549190612d81565b60405180910390f35b348015610768575f80fd5b506107716113ed565b60405161077e9190612cc4565b60405180910390f35b6107a1600480360381019061079c9190612d17565b61147d565b005b3480156107ae575f80fd5b506107c960048036038101906107c49190613178565b6115b7565b005b3480156107d6575f80fd5b506107f160048036038101906107ec9190613254565b6115cd565b005b3480156107fe575f80fd5b5061081960048036038101906108149190612d17565b61162f565b6040516108269190612cc4565b60405180910390f35b34801561083a575f80fd5b506108436116d3565b005b348015610850575f80fd5b5061085961183f565b6040516108669190613004565b60405180910390f35b34801561087a575f80fd5b5061088361184a565b6040516108909190612cc4565b60405180910390f35b3480156108a4575f80fd5b506108bf60048036038101906108ba91906132d4565b6118d6565b6040516108cc9190612c3b565b60405180910390f35b3480156108e0575f80fd5b506108fb60048036038101906108f69190612e02565b611964565b005b348015610908575f80fd5b506109116119e8565b005b34801561091e575f80fd5b50610927611a1c565b6040516109349190612c3b565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a175750610a1682611a2e565b5b9050919050565b60605f8054610a2c9061333f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a589061333f565b8015610aa35780601f10610a7a57610100808354040283529160200191610aa3565b820191905f5260205f20905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b5f610ab782611a97565b610af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aed906133df565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610b38826111f8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ba8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9f9061346d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc7611aff565b73ffffffffffffffffffffffffffffffffffffffff161480610bf65750610bf581610bf0611aff565b6118d6565b5b610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c906134fb565b60405180910390fd5b610c3f8383611b06565b505050565b600f602052805f5260405f205f915054906101000a900460ff1681565b610c69611bbc565b8060089081610c7891906136b6565b5050565b610c84611bbc565b80610c9657610c91611c43565b610c9f565b610c9e611ca5565b5b50565b5f600b54600a54610cb391906137b2565b905090565b610cc9610cc3611aff565b82611d08565b610d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cff90613855565b60405180910390fd5b610d13838383611de4565b505050565b601481565b610d25611bbc565b5f600a5490505f5b6014811015610d6f57600a5f815480929190610d4890613873565b9190505550610d62338284610d5d91906138ba565b61203f565b8080600101915050610d2d565b5050565b600c60019054906101000a900460ff1681565b610d8e611bbc565b5f479050610da3610d9d6113c5565b8261205c565b50565b600a5481565b610dc683838360405180602001604052805f8152506115cd565b505050565b610ddc610dd6611aff565b82611d08565b610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e129061395d565b60405180910390fd5b610e248161214c565b600b5f815480929190610e3690613873565b919050555050565b610e4661225e565b600c60019054906101000a900460ff16610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c906139c5565b60405180910390fd5b6014811115610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090613a53565b60405180910390fd5b60011515600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151514610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090613ae1565b60405180910390fd5b3481662386f26fc10000610f7d9190613aff565b1115610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590613bb0565b60405180910390fd5b5f5b81811015610ffd575f600a549050600a5f815480929190610fe090613873565b9190505550610fef338261203f565b508080600101915050610fc0565b505f600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061105a6122ad565b50565b600c5f9054906101000a900460ff1681565b611077611bbc565b5f5b81518110156110fe576001600d5f84848151811061109a57611099613bce565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508080600101915050611079565b5050565b61110a611bbc565b806009908161111991906136b6565b5050565b611125611bbc565b600c5f9054906101000a900460ff1615600c5f6101000a81548160ff021916908315150217905550565b5f600660149054906101000a900460ff16905090565b61116d611bbc565b5f5b81518110156111f4576001600f5f8484815181106111905761118f613bce565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550808060010191505061116f565b5050565b5f8060025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361129b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129290613c6b565b60405180910390fd5b80915050919050565b601481565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f90613cf9565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611365611bbc565b61136e5f6122b7565b565b600d602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61139b611bbc565b600e5f9054906101000a900460ff1615600e5f6101000a81548160ff021916908315150217905550565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113fc9061333f565b80601f01602080910402602001604051908101604052809291908181526020018280546114289061333f565b80156114735780601f1061144a57610100808354040283529160200191611473565b820191905f5260205f20905b81548152906001019060200180831161145657829003601f168201915b5050505050905090565b61148561225e565b600c5f9054906101000a900460ff166114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca906139c5565b60405180910390fd5b6014811115611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e90613a53565b60405180910390fd5b3481662386f26fc1000061152b9190613aff565b111561156c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156390613bb0565b60405180910390fd5b5f5b818110156115ab575f600a549050600a5f81548092919061158e90613873565b919050555061159d338261203f565b50808060010191505061156e565b506115b46122ad565b50565b6115c96115c2611aff565b838361237a565b5050565b6115de6115d8611aff565b83611d08565b61161d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161490613855565b60405180910390fd5b611629848484846124e1565b50505050565b606061163a82611a97565b611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167090613d87565b60405180910390fd5b5f61168261253d565b90505f8151116116a05760405180602001604052805f8152506116cb565b806116aa846125cd565b6040516020016116bb929190613ddf565b6040516020818303038152906040525b915050919050565b6116db61225e565b600e5f9054906101000a900460ff16611729576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611720906139c5565b60405180910390fd5b60011515600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515146117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b090613e72565b60405180910390fd5b5f600a549050600a5f8154809291906117d190613873565b91905055506117e0338261203f565b5f600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505061183d6122ad565b565b662386f26fc1000081565b600880546118579061333f565b80601f01602080910402602001604051908101604052809291908181526020018280546118839061333f565b80156118ce5780601f106118a5576101008083540402835291602001916118ce565b820191905f5260205f20905b8154815290600101906020018083116118b157829003601f168201915b505050505081565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b61196c611bbc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119dc575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016119d39190612d81565b60405180910390fd5b6119e5816122b7565b50565b6119f0611bbc565b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b600e5f9054906101000a900460ff1681565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b76836111f8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611bc4611aff565b73ffffffffffffffffffffffffffffffffffffffff16611be26113c5565b73ffffffffffffffffffffffffffffffffffffffff1614611c4157611c05611aff565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611c389190612d81565b60405180910390fd5b565b611c4b612726565b5f600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c8e611aff565b604051611c9b9190612d81565b60405180910390a1565b611cad61276f565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cf1611aff565b604051611cfe9190612d81565b60405180910390a1565b5f611d1282611a97565b611d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4890613f00565b60405180910390fd5b5f611d5b836111f8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d9d5750611d9c81856118d6565b5b80611ddb57508373ffffffffffffffffffffffffffffffffffffffff16611dc384610aad565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e04826111f8565b73ffffffffffffffffffffffffffffffffffffffff1614611e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5190613f8e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf9061401c565b60405180910390fd5b611ed38383836127b9565b611edd5f82611b06565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f2a91906137b2565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611f7e91906138ba565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461203a8383836127be565b505050565b612058828260405180602001604052805f8152506127c3565b5050565b8047101561209f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209690614084565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16826040516120c4906140cf565b5f6040518083038185875af1925050503d805f81146120fe576040519150601f19603f3d011682016040523d82523d5f602084013e612103565b606091505b5050905080612147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213e90614153565b60405180910390fd5b505050565b5f612156826111f8565b9050612163815f846127b9565b61216d5f83611b06565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546121ba91906137b2565b9250508190555060025f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055815f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461225a815f846127be565b5050565b6002600754036122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906141bb565b60405180910390fd5b6002600781905550565b6001600781905550565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123df90614223565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124d49190612c3b565b60405180910390a3505050565b6124ec848484611de4565b6124f88484848461281d565b612537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252e906142b1565b60405180910390fd5b50505050565b60606009805461254c9061333f565b80601f01602080910402602001604051908101604052809291908181526020018280546125789061333f565b80156125c35780601f1061259a576101008083540402835291602001916125c3565b820191905f5260205f20905b8154815290600101906020018083116125a657829003601f168201915b5050505050905090565b60605f8203612613576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612721565b5f8290505f5b5f821461264257808061262b90613873565b915050600a8261263b91906142fc565b9150612619565b5f8167ffffffffffffffff81111561265d5761265c612e35565b5b6040519080825280601f01601f19166020018201604052801561268f5781602001600182028036833780820191505090505b5090505b5f851461271a576001826126a791906137b2565b9150600a856126b6919061432c565b60306126c291906138ba565b60f81b8183815181106126d8576126d7613bce565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561271391906142fc565b9450612693565b8093505050505b919050565b61272e61114f565b61276d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612764906143a6565b60405180910390fd5b565b61277761114f565b156127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae9061440e565b60405180910390fd5b565b505050565b505050565b6127cd838361299f565b6127d95f84848461281d565b612818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280f906142b1565b60405180910390fd5b505050565b5f61283d8473ffffffffffffffffffffffffffffffffffffffff16612b6e565b15612992578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612866611aff565b8786866040518563ffffffff1660e01b8152600401612888949392919061447e565b6020604051808303815f875af19250505080156128c357506040513d601f19601f820116820180604052508101906128c091906144dc565b60015b612942573d805f81146128f1576040519150601f19603f3d011682016040523d82523d5f602084013e6128f6565b606091505b505f81510361293a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612931906142b1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612997565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0490614551565b60405180910390fd5b612a1681611a97565b15612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d906145b9565b60405180910390fd5b612a615f83836127b9565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612aae91906138ba565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b6a5f83836127be565b5050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612bd581612ba1565b8114612bdf575f80fd5b50565b5f81359050612bf081612bcc565b92915050565b5f60208284031215612c0b57612c0a612b99565b5b5f612c1884828501612be2565b91505092915050565b5f8115159050919050565b612c3581612c21565b82525050565b5f602082019050612c4e5f830184612c2c565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612c9682612c54565b612ca08185612c5e565b9350612cb0818560208601612c6e565b612cb981612c7c565b840191505092915050565b5f6020820190508181035f830152612cdc8184612c8c565b905092915050565b5f819050919050565b612cf681612ce4565b8114612d00575f80fd5b50565b5f81359050612d1181612ced565b92915050565b5f60208284031215612d2c57612d2b612b99565b5b5f612d3984828501612d03565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612d6b82612d42565b9050919050565b612d7b81612d61565b82525050565b5f602082019050612d945f830184612d72565b92915050565b612da381612d61565b8114612dad575f80fd5b50565b5f81359050612dbe81612d9a565b92915050565b5f8060408385031215612dda57612dd9612b99565b5b5f612de785828601612db0565b9250506020612df885828601612d03565b9150509250929050565b5f60208284031215612e1757612e16612b99565b5b5f612e2484828501612db0565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612e6b82612c7c565b810181811067ffffffffffffffff82111715612e8a57612e89612e35565b5b80604052505050565b5f612e9c612b90565b9050612ea88282612e62565b919050565b5f67ffffffffffffffff821115612ec757612ec6612e35565b5b612ed082612c7c565b9050602081019050919050565b828183375f83830152505050565b5f612efd612ef884612ead565b612e93565b905082815260208101848484011115612f1957612f18612e31565b5b612f24848285612edd565b509392505050565b5f82601f830112612f4057612f3f612e2d565b5b8135612f50848260208601612eeb565b91505092915050565b5f60208284031215612f6e57612f6d612b99565b5b5f82013567ffffffffffffffff811115612f8b57612f8a612b9d565b5b612f9784828501612f2c565b91505092915050565b612fa981612c21565b8114612fb3575f80fd5b50565b5f81359050612fc481612fa0565b92915050565b5f60208284031215612fdf57612fde612b99565b5b5f612fec84828501612fb6565b91505092915050565b612ffe81612ce4565b82525050565b5f6020820190506130175f830184612ff5565b92915050565b5f805f6060848603121561303457613033612b99565b5b5f61304186828701612db0565b935050602061305286828701612db0565b925050604061306386828701612d03565b9150509250925092565b5f67ffffffffffffffff82111561308757613086612e35565b5b602082029050602081019050919050565b5f80fd5b5f6130ae6130a98461306d565b612e93565b905080838252602082019050602084028301858111156130d1576130d0613098565b5b835b818110156130fa57806130e68882612db0565b8452602084019350506020810190506130d3565b5050509392505050565b5f82601f83011261311857613117612e2d565b5b813561312884826020860161309c565b91505092915050565b5f6020828403121561314657613145612b99565b5b5f82013567ffffffffffffffff81111561316357613162612b9d565b5b61316f84828501613104565b91505092915050565b5f806040838503121561318e5761318d612b99565b5b5f61319b85828601612db0565b92505060206131ac85828601612fb6565b9150509250929050565b5f67ffffffffffffffff8211156131d0576131cf612e35565b5b6131d982612c7c565b9050602081019050919050565b5f6131f86131f3846131b6565b612e93565b90508281526020810184848401111561321457613213612e31565b5b61321f848285612edd565b509392505050565b5f82601f83011261323b5761323a612e2d565b5b813561324b8482602086016131e6565b91505092915050565b5f805f806080858703121561326c5761326b612b99565b5b5f61327987828801612db0565b945050602061328a87828801612db0565b935050604061329b87828801612d03565b925050606085013567ffffffffffffffff8111156132bc576132bb612b9d565b5b6132c887828801613227565b91505092959194509250565b5f80604083850312156132ea576132e9612b99565b5b5f6132f785828601612db0565b925050602061330885828601612db0565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061335657607f821691505b60208210810361336957613368613312565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f6133c9602c83612c5e565b91506133d48261336f565b604082019050919050565b5f6020820190508181035f8301526133f6816133bd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f613457602183612c5e565b9150613462826133fd565b604082019050919050565b5f6020820190508181035f8301526134848161344b565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f6134e5603883612c5e565b91506134f08261348b565b604082019050919050565b5f6020820190508181035f830152613512816134d9565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026135757fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261353a565b61357f868361353a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6135ba6135b56135b084612ce4565b613597565b612ce4565b9050919050565b5f819050919050565b6135d3836135a0565b6135e76135df826135c1565b848454613546565b825550505050565b5f90565b6135fb6135ef565b6136068184846135ca565b505050565b5b818110156136295761361e5f826135f3565b60018101905061360c565b5050565b601f82111561366e5761363f81613519565b6136488461352b565b81016020851015613657578190505b61366b6136638561352b565b83018261360b565b50505b505050565b5f82821c905092915050565b5f61368e5f1984600802613673565b1980831691505092915050565b5f6136a6838361367f565b9150826002028217905092915050565b6136bf82612c54565b67ffffffffffffffff8111156136d8576136d7612e35565b5b6136e2825461333f565b6136ed82828561362d565b5f60209050601f83116001811461371e575f841561370c578287015190505b613716858261369b565b86555061377d565b601f19841661372c86613519565b5f5b828110156137535784890151825560018201915060208501945060208101905061372e565b86831015613770578489015161376c601f89168261367f565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6137bc82612ce4565b91506137c783612ce4565b92508282039050818111156137df576137de613785565b5b92915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f61383f603183612c5e565b915061384a826137e5565b604082019050919050565b5f6020820190508181035f83015261386c81613833565b9050919050565b5f61387d82612ce4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138af576138ae613785565b5b600182019050919050565b5f6138c482612ce4565b91506138cf83612ce4565b92508282019050808211156138e7576138e6613785565b5b92915050565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b5f613947603083612c5e565b9150613952826138ed565b604082019050919050565b5f6020820190508181035f8301526139748161393b565b9050919050565b7f4d696e74206973206e6f742061637469766500000000000000000000000000005f82015250565b5f6139af601283612c5e565b91506139ba8261397b565b602082019050919050565b5f6020820190508181035f8301526139dc816139a3565b9050919050565b7f596f752077656e74206f766572206d617820746f6b656e7320706572207472615f8201527f6e73616374696f6e000000000000000000000000000000000000000000000000602082015250565b5f613a3d602883612c5e565b9150613a48826139e3565b604082019050919050565b5f6020820190508181035f830152613a6a81613a31565b9050919050565b7f596f7520617265206e6f74206f6e207468652070726573616c652077616c6c655f8201527f74206c697374206f72206861766520616c7265616479206d696e746564000000602082015250565b5f613acb603d83612c5e565b9150613ad682613a71565b604082019050919050565b5f6020820190508181035f830152613af881613abf565b9050919050565b5f613b0982612ce4565b9150613b1483612ce4565b9250828202613b2281612ce4565b91508282048414831517613b3957613b38613785565b5b5092915050565b7f596f752073656e742074686520696e636f727265637420616d6f756e74206f665f8201527f2045544800000000000000000000000000000000000000000000000000000000602082015250565b5f613b9a602483612c5e565b9150613ba582613b40565b604082019050919050565b5f6020820190508181035f830152613bc781613b8e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f613c55602983612c5e565b9150613c6082613bfb565b604082019050919050565b5f6020820190508181035f830152613c8281613c49565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f613ce3602a83612c5e565b9150613cee82613c89565b604082019050919050565b5f6020820190508181035f830152613d1081613cd7565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f613d71602f83612c5e565b9150613d7c82613d17565b604082019050919050565b5f6020820190508181035f830152613d9e81613d65565b9050919050565b5f81905092915050565b5f613db982612c54565b613dc38185613da5565b9350613dd3818560208601612c6e565b80840191505092915050565b5f613dea8285613daf565b9150613df68284613daf565b91508190509392505050565b7f596f7520617265206e6f74206f6e2074686520667265652077616c6c6574206c5f8201527f697374206f72206861766520616c7265616479206d696e746564000000000000602082015250565b5f613e5c603a83612c5e565b9150613e6782613e02565b604082019050919050565b5f6020820190508181035f830152613e8981613e50565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f613eea602c83612c5e565b9150613ef582613e90565b604082019050919050565b5f6020820190508181035f830152613f1781613ede565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f7272656374205f8201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b5f613f78602583612c5e565b9150613f8382613f1e565b604082019050919050565b5f6020820190508181035f830152613fa581613f6c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614006602483612c5e565b915061401182613fac565b604082019050919050565b5f6020820190508181035f83015261403381613ffa565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e63650000005f82015250565b5f61406e601d83612c5e565b91506140798261403a565b602082019050919050565b5f6020820190508181035f83015261409b81614062565b9050919050565b5f81905092915050565b50565b5f6140ba5f836140a2565b91506140c5826140ac565b5f82019050919050565b5f6140d9826140af565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c20725f8201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b5f61413d603a83612c5e565b9150614148826140e3565b604082019050919050565b5f6020820190508181035f83015261416a81614131565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f6141a5601f83612c5e565b91506141b082614171565b602082019050919050565b5f6020820190508181035f8301526141d281614199565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f61420d601983612c5e565b9150614218826141d9565b602082019050919050565b5f6020820190508181035f83015261423a81614201565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f61429b603283612c5e565b91506142a682614241565b604082019050919050565b5f6020820190508181035f8301526142c88161428f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61430682612ce4565b915061431183612ce4565b925082614321576143206142cf565b5b828204905092915050565b5f61433682612ce4565b915061434183612ce4565b925082614351576143506142cf565b5b828206905092915050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f614390601483612c5e565b915061439b8261435c565b602082019050919050565b5f6020820190508181035f8301526143bd81614384565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f6143f8601083612c5e565b9150614403826143c4565b602082019050919050565b5f6020820190508181035f830152614425816143ec565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6144508261442c565b61445a8185614436565b935061446a818560208601612c6e565b61447381612c7c565b840191505092915050565b5f6080820190506144915f830187612d72565b61449e6020830186612d72565b6144ab6040830185612ff5565b81810360608301526144bd8184614446565b905095945050505050565b5f815190506144d681612bcc565b92915050565b5f602082840312156144f1576144f0612b99565b5b5f6144fe848285016144c8565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f61453b602083612c5e565b915061454682614507565b602082019050919050565b5f6020820190508181035f8301526145688161452f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f6145a3601c83612c5e565b91506145ae8261456f565b602082019050919050565b5f6020820190508181035f8301526145d081614597565b905091905056fea2646970667358221220826b340d56c90113648a161626305833bebc9024e5aef55b4e517b8b37811fb764736f6c634300081a0033

Deployed Bytecode Sourcemap

115029:4870:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21617:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22562:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24122:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23645:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115812:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;119480:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119152:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118352:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24872:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115401:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118895:249;;;;;;;;;;;;;:::i;:::-;;115635:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118735:152;;;;;;;;;;;;;:::i;:::-;;115456:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25282:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118489:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;116869:679;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115560:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116662:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119382:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115888:91;;;;;;;;;;;;;:::i;:::-;;39586:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117726:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22256:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115288:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21986:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37077:103;;;;;;;;;;;;;:::i;:::-;;115677:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115497:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117612:106;;;;;;;;;;;;;:::i;:::-;;36402:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22731:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115987:528;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24415:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25538:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22906:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117927:396;;;;;;;;;;;;;:::i;:::-;;115339:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115202:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24641:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37335:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;116557:97;;;;;;;;;;;;;:::i;:::-;;115767:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21617:305;21719:4;21771:25;21756:40;;;:11;:40;;;;:105;;;;21828:33;21813:48;;;:11;:48;;;;21756:105;:158;;;;21878:36;21902:11;21878:23;:36::i;:::-;21756:158;21736:178;;21617:305;;;:::o;22562:100::-;22616:13;22649:5;22642:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22562:100;:::o;24122:221::-;24198:7;24226:16;24234:7;24226;:16::i;:::-;24218:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24311:15;:24;24327:7;24311:24;;;;;;;;;;;;;;;;;;;;;24304:31;;24122:221;;;:::o;23645:411::-;23726:13;23742:23;23757:7;23742:14;:23::i;:::-;23726:39;;23790:5;23784:11;;:2;:11;;;23776:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23884:5;23868:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23893:37;23910:5;23917:12;:10;:12::i;:::-;23893:16;:37::i;:::-;23868:62;23846:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24027:21;24036:2;24040:7;24027:8;:21::i;:::-;23715:341;23645:411;;:::o;115812:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;119480:143::-;36288:13;:11;:13::i;:::-;119601:14:::1;119567:31;:48;;;;;;:::i;:::-;;119480:143:::0;:::o;119152:114::-;36288:13;:11;:13::i;:::-;119223:10:::1;119222:36;;119248:10;:8;:10::i;:::-;119222:36;;;119237:8;:6;:8::i;:::-;119222:36;119152:114:::0;:::o;118352:112::-;118398:4;118441:15;;118423;;:33;;;;:::i;:::-;118416:40;;118352:112;:::o;24872:339::-;25067:41;25086:12;:10;:12::i;:::-;25100:7;25067:18;:41::i;:::-;25059:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25175:28;25185:4;25191:2;25195:7;25175:9;:28::i;:::-;24872:339;;;:::o;115401:48::-;115447:2;115401:48;:::o;118895:249::-;36288:13;:11;:13::i;:::-;118950:17:::1;118970:15;;118950:35;;119001:9;118996:141;115330:2;119016:1;:19;118996:141;;;119057:15;;:17;;;;;;;;;:::i;:::-;;;;;;119089:36;119099:10;119123:1;119111:9;:13;;;;:::i;:::-;119089:9;:36::i;:::-;119037:3;;;;;;;118996:141;;;;118939:205;118895:249::o:0;115635:35::-;;;;;;;;;;;;;:::o;118735:152::-;36288:13;:11;:13::i;:::-;118785:15:::1;118803:21;118785:39;;118835:44;118861:7;:5;:7::i;:::-;118871;118835:17;:44::i;:::-;118774:113;118735:152::o:0;115456:34::-;;;;:::o;25282:185::-;25420:39;25437:4;25443:2;25447:7;25420:39;;;;;;;;;;;;:16;:39::i;:::-;25282:185;;;:::o;118489:214::-;118551:41;118570:12;:10;:12::i;:::-;118584:7;118551:18;:41::i;:::-;118543:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;118653:14;118659:7;118653:5;:14::i;:::-;118678:15;;:17;;;;;;;;;:::i;:::-;;;;;;118489:214;:::o;116869:679::-;42913:21;:19;:21::i;:::-;116973:15:::1;;;;;;;;;;;116965:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;115447:2;117027:14;:37;;117019:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;117158:4;117125:37;;:17;:29;117143:10;117125:29;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;117117:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;117279:9;117261:14;115377:17;117247:28;;;;:::i;:::-;:41;;117239:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;117342:9;117337:159;117361:14;117357:1;:18;117337:159;;;117391:17;117411:15;;117391:35;;117432:15;;:17;;;;;;;;;:::i;:::-;;;;;;117455:32;117465:10;117477:9;117455;:32::i;:::-;117382:114;117377:3;;;;;;;117337:159;;;;117535:5;117503:17;:29;117521:10;117503:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;42957:20:::0;:18;:20::i;:::-;116869:679;:::o;115560:32::-;;;;;;;;;;;;;:::o;116662:199::-;36288:13;:11;:13::i;:::-;116754:9:::1;116749:105;116773:10;:17;116769:1;:21;116749:105;;;116841:4;116806:17;:32;116824:10;116835:1;116824:13;;;;;;;;:::i;:::-;;;;;;;;116806:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;116792:3;;;;;;;116749:105;;;;116662:199:::0;:::o;119382:90::-;36288:13;:11;:13::i;:::-;119461:3:::1;119451:7;:13;;;;;;:::i;:::-;;119382:90:::0;:::o;115888:91::-;36288:13;:11;:13::i;:::-;115959:12:::1;;;;;;;;;;;115958:13;115943:12;;:28;;;;;;;;;;;;;;;;;;115888:91::o:0;39586:86::-;39633:4;39657:7;;;;;;;;;;;39650:14;;39586:86;:::o;117726:193::-;36288:13;:11;:13::i;:::-;117815:9:::1;117810:102;117834:10;:17;117830:1;:21;117810:102;;;117899:4;117867:14;:29;117882:10;117893:1;117882:13;;;;;;;;:::i;:::-;;;;;;;;117867:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;117853:3;;;;;;;117810:102;;;;117726:193:::0;:::o;22256:239::-;22328:7;22348:13;22364:7;:16;22372:7;22364:16;;;;;;;;;;;;;;;;;;;;;22348:32;;22416:1;22399:19;;:5;:19;;;22391:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22482:5;22475:12;;;22256:239;;;:::o;115288:44::-;115330:2;115288:44;:::o;21986:208::-;22058:7;22103:1;22086:19;;:5;:19;;;22078:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22170:9;:16;22180:5;22170:16;;;;;;;;;;;;;;;;22163:23;;21986:208;;;:::o;37077:103::-;36288:13;:11;:13::i;:::-;37142:30:::1;37169:1;37142:18;:30::i;:::-;37077:103::o:0;115677:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;115497:34::-;;;;:::o;117612:106::-;36288:13;:11;:13::i;:::-;117692:18:::1;;;;;;;;;;;117691:19;117670:18;;:40;;;;;;;;;;;;;;;;;;117612:106::o:0;36402:87::-;36448:7;36475:6;;;;;;;;;;;36468:13;;36402:87;:::o;22731:104::-;22787:13;22820:7;22813:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22731:104;:::o;115987:528::-;42913:21;:19;:21::i;:::-;116074:12:::1;;;;;;;;;;;116066:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;115447:2;116128:14;:37;;116120:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;116261:9;116243:14;115377:17;116229:28;;;;:::i;:::-;:41;;116221:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;116327:9;116322:186;116346:14;116342:1;:18;116322:186;;;116382:17;116402:15;;116382:35;;116432:15;;:17;;;;;;;;;:::i;:::-;;;;;;116464:32;116474:10;116486:9;116464;:32::i;:::-;116367:141;116362:3;;;;;;;116322:186;;;;42957:20:::0;:18;:20::i;:::-;115987:528;:::o;24415:155::-;24510:52;24529:12;:10;:12::i;:::-;24543:8;24553;24510:18;:52::i;:::-;24415:155;;:::o;25538:328::-;25713:41;25732:12;:10;:12::i;:::-;25746:7;25713:18;:41::i;:::-;25705:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25819:39;25833:4;25839:2;25843:7;25852:5;25819:13;:39::i;:::-;25538:328;;;;:::o;22906:334::-;22979:13;23013:16;23021:7;23013;:16::i;:::-;23005:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23094:21;23118:10;:8;:10::i;:::-;23094:34;;23170:1;23152:7;23146:21;:25;:86;;;;;;;;;;;;;;;;;23198:7;23207:18;:7;:16;:18::i;:::-;23181:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23146:86;23139:93;;;22906:334;;;:::o;117927:396::-;42913:21;:19;:21::i;:::-;117998:18:::1;;;;;;;;;;;117990:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;118085:4;118055:34;;:14;:26;118070:10;118055:26;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;118047:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;118165:17;118185:15;;118165:35;;118211:15;;:17;;;;;;;;;:::i;:::-;;;;;;118239:32;118249:10;118261:9;118239;:32::i;:::-;118310:5;118281:14;:26;118296:10;118281:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;117979:344;42957:20:::0;:18;:20::i;:::-;117927:396::o;115339:55::-;115377:17;115339:55;:::o;115202:50::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24641:164::-;24738:4;24762:18;:25;24781:5;24762:25;;;;;;;;;;;;;;;:35;24788:8;24762:35;;;;;;;;;;;;;;;;;;;;;;;;;24755:42;;24641:164;;;;:::o;37335:220::-;36288:13;:11;:13::i;:::-;37440:1:::1;37420:22;;:8;:22;;::::0;37416:93:::1;;37494:1;37466:31;;;;;;;;;;;:::i;:::-;;;;;;;;37416:93;37519:28;37538:8;37519:18;:28::i;:::-;37335:220:::0;:::o;116557:97::-;36288:13;:11;:13::i;:::-;116631:15:::1;;;;;;;;;;;116630:16;116612:15;;:34;;;;;;;;;;;;;;;;;;116557:97::o:0;115767:38::-;;;;;;;;;;;;;:::o;20046:157::-;20131:4;20170:25;20155:40;;;:11;:40;;;;20148:47;;20046:157;;;:::o;27376:127::-;27441:4;27493:1;27465:30;;:7;:16;27473:7;27465:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27458:37;;27376:127;;;:::o;16843:98::-;16896:7;16923:10;16916:17;;16843:98;:::o;31522:174::-;31624:2;31597:15;:24;31613:7;31597:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31680:7;31676:2;31642:46;;31651:23;31666:7;31651:14;:23::i;:::-;31642:46;;;;;;;;;;;;31522:174;;:::o;36567:166::-;36638:12;:10;:12::i;:::-;36627:23;;:7;:5;:7::i;:::-;:23;;;36623:103;;36701:12;:10;:12::i;:::-;36674:40;;;;;;;;;;;:::i;:::-;;;;;;;;36623:103;36567:166::o;40441:120::-;39450:16;:14;:16::i;:::-;40510:5:::1;40500:7;;:15;;;;;;;;;;;;;;;;;;40531:22;40540:12;:10;:12::i;:::-;40531:22;;;;;;:::i;:::-;;;;;;;;40441:120::o:0;40182:118::-;39191:19;:17;:19::i;:::-;40252:4:::1;40242:7;;:14;;;;;;;;;;;;;;;;;;40272:20;40279:12;:10;:12::i;:::-;40272:20;;;;;;:::i;:::-;;;;;;;;40182:118::o:0;27670:348::-;27763:4;27788:16;27796:7;27788;:16::i;:::-;27780:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27864:13;27880:23;27895:7;27880:14;:23::i;:::-;27864:39;;27933:5;27922:16;;:7;:16;;;:52;;;;27942:32;27959:5;27966:7;27942:16;:32::i;:::-;27922:52;:87;;;;28002:7;27978:31;;:20;27990:7;27978:11;:20::i;:::-;:31;;;27922:87;27914:96;;;27670:348;;;;:::o;30779:625::-;30938:4;30911:31;;:23;30926:7;30911:14;:23::i;:::-;:31;;;30903:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31017:1;31003:16;;:2;:16;;;30995:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31073:39;31094:4;31100:2;31104:7;31073:20;:39::i;:::-;31177:29;31194:1;31198:7;31177:8;:29::i;:::-;31238:1;31219:9;:15;31229:4;31219:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31267:1;31250:9;:13;31260:2;31250:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31298:2;31279:7;:16;31287:7;31279:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31337:7;31333:2;31318:27;;31327:4;31318:27;;;;;;;;;;;;31358:38;31378:4;31384:2;31388:7;31358:19;:38::i;:::-;30779:625;;;:::o;28360:110::-;28436:26;28446:2;28450:7;28436:26;;;;;;;;;;;;:9;:26::i;:::-;28360:110;;:::o;10155:317::-;10270:6;10245:21;:31;;10237:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10324:12;10342:9;:14;;10364:6;10342:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10323:52;;;10394:7;10386:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;10226:246;10155:317;;:::o;30022:420::-;30082:13;30098:23;30113:7;30098:14;:23::i;:::-;30082:39;;30134:48;30155:5;30170:1;30174:7;30134:20;:48::i;:::-;30223:29;30240:1;30244:7;30223:8;:29::i;:::-;30285:1;30265:9;:16;30275:5;30265:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;30304:7;:16;30312:7;30304:16;;;;;;;;;;;;30297:23;;;;;;;;;;;30366:7;30362:1;30338:36;;30347:5;30338:36;;;;;;;;;;;;30387:47;30407:5;30422:1;30426:7;30387:19;:47::i;:::-;30071:371;30022:420;:::o;42993:293::-;42395:1;43127:7;;:19;43119:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;42395:1;43260:7;:18;;;;42993:293::o;43294:213::-;42351:1;43477:7;:22;;;;43294:213::o;37715:191::-;37789:16;37808:6;;;;;;;;;;;37789:25;;37834:8;37825:6;;:17;;;;;;;;;;;;;;;;;;37889:8;37858:40;;37879:8;37858:40;;;;;;;;;;;;37778:128;37715:191;:::o;31838:315::-;31993:8;31984:17;;:5;:17;;;31976:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32080:8;32042:18;:25;32061:5;32042:25;;;;;;;;;;;;;;;:35;32068:8;32042:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32126:8;32104:41;;32119:5;32104:41;;;32136:8;32104:41;;;;;;:::i;:::-;;;;;;;;31838:315;;;:::o;26748:::-;26905:28;26915:4;26921:2;26925:7;26905:9;:28::i;:::-;26952:48;26975:4;26981:2;26985:7;26994:5;26952:22;:48::i;:::-;26944:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26748:315;;;;:::o;119274:100::-;119326:13;119359:7;119352:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119274:100;:::o;17422:723::-;17478:13;17708:1;17699:5;:10;17695:53;;17726:10;;;;;;;;;;;;;;;;;;;;;17695:53;17758:12;17773:5;17758:20;;17789:14;17814:78;17829:1;17821:4;:9;17814:78;;17847:8;;;;;:::i;:::-;;;;17878:2;17870:10;;;;;:::i;:::-;;;17814:78;;;17902:19;17934:6;17924:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17902:39;;17952:154;17968:1;17959:5;:10;17952:154;;17996:1;17986:11;;;;;:::i;:::-;;;18063:2;18055:5;:10;;;;:::i;:::-;18042:2;:24;;;;:::i;:::-;18029:39;;18012:6;18019;18012:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;18092:2;18083:11;;;;;:::i;:::-;;;17952:154;;;18130:6;18116:21;;;;;17422:723;;;;:::o;39930:108::-;39997:8;:6;:8::i;:::-;39989:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;39930:108::o;39745:::-;39816:8;:6;:8::i;:::-;39815:9;39807:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;39745:108::o;34089:126::-;;;;:::o;34600:125::-;;;;:::o;28697:321::-;28827:18;28833:2;28837:7;28827:5;:18::i;:::-;28878:54;28909:1;28913:2;28917:7;28926:5;28878:22;:54::i;:::-;28856:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28697:321;;;:::o;32718:799::-;32873:4;32894:15;:2;:13;;;:15::i;:::-;32890:620;;;32946:2;32930:36;;;32967:12;:10;:12::i;:::-;32981:4;32987:7;32996:5;32930:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32926:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33189:1;33172:6;:13;:18;33168:272;;33215:60;;;;;;;;;;:::i;:::-;;;;;;;;33168:272;33390:6;33384:13;33375:6;33371:2;33367:15;33360:38;32926:529;33063:41;;;33053:51;;;:6;:51;;;;33046:58;;;;;32890:620;33494:4;33487:11;;32718:799;;;;;;;:::o;29354:439::-;29448:1;29434:16;;:2;:16;;;29426:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29507:16;29515:7;29507;:16::i;:::-;29506:17;29498:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29569:45;29598:1;29602:2;29606:7;29569:20;:45::i;:::-;29644:1;29627:9;:13;29637:2;29627:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29675:2;29656:7;:16;29664:7;29656:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29720:7;29716:2;29695:33;;29712:1;29695:33;;;;;;;;;;;;29741:44;29769:1;29773:2;29777:7;29741:19;:44::i;:::-;29354:439;;:::o;8894:326::-;8954:4;9211:1;9189:7;:19;;;:23;9182:30;;8894:326;;;:::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:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:77::-;2790:7;2819:5;2808:16;;2753:77;;;:::o;2836:122::-;2909:24;2927:5;2909:24;:::i;:::-;2902:5;2899:35;2889:63;;2948:1;2945;2938:12;2889:63;2836:122;:::o;2964:139::-;3010:5;3048:6;3035:20;3026:29;;3064:33;3091:5;3064:33;:::i;:::-;2964:139;;;;:::o;3109:329::-;3168:6;3217:2;3205:9;3196:7;3192:23;3188:32;3185:119;;;3223:79;;:::i;:::-;3185:119;3343:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;:::i;:::-;3358:63;;3314:117;3109:329;;;;:::o;3444:126::-;3481:7;3521:42;3514:5;3510:54;3499:65;;3444:126;;;:::o;3576:96::-;3613:7;3642:24;3660:5;3642:24;:::i;:::-;3631:35;;3576:96;;;:::o;3678:118::-;3765:24;3783:5;3765:24;:::i;:::-;3760:3;3753:37;3678:118;;:::o;3802:222::-;3895:4;3933:2;3922:9;3918:18;3910:26;;3946:71;4014:1;4003:9;3999:17;3990:6;3946:71;:::i;:::-;3802:222;;;;:::o;4030:122::-;4103:24;4121:5;4103:24;:::i;:::-;4096:5;4093:35;4083:63;;4142:1;4139;4132:12;4083:63;4030:122;:::o;4158:139::-;4204:5;4242:6;4229:20;4220:29;;4258:33;4285:5;4258:33;:::i;:::-;4158:139;;;;:::o;4303:474::-;4371:6;4379;4428:2;4416:9;4407:7;4403:23;4399:32;4396:119;;;4434:79;;:::i;:::-;4396:119;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4303:474;;;;;:::o;4783:329::-;4842:6;4891:2;4879:9;4870:7;4866:23;4862:32;4859:119;;;4897:79;;:::i;:::-;4859:119;5017:1;5042:53;5087:7;5078:6;5067:9;5063:22;5042:53;:::i;:::-;5032:63;;4988:117;4783:329;;;;:::o;5118:117::-;5227:1;5224;5217:12;5241:117;5350:1;5347;5340:12;5364:180;5412:77;5409:1;5402:88;5509:4;5506:1;5499:15;5533:4;5530:1;5523:15;5550:281;5633:27;5655:4;5633:27;:::i;:::-;5625:6;5621:40;5763:6;5751:10;5748:22;5727:18;5715:10;5712:34;5709:62;5706:88;;;5774:18;;:::i;:::-;5706:88;5814:10;5810:2;5803:22;5593:238;5550:281;;:::o;5837:129::-;5871:6;5898:20;;:::i;:::-;5888:30;;5927:33;5955:4;5947:6;5927:33;:::i;:::-;5837:129;;;:::o;5972:308::-;6034:4;6124:18;6116:6;6113:30;6110:56;;;6146:18;;:::i;:::-;6110:56;6184:29;6206:6;6184:29;:::i;:::-;6176:37;;6268:4;6262;6258:15;6250:23;;5972:308;;;:::o;6286:148::-;6384:6;6379:3;6374;6361:30;6425:1;6416:6;6411:3;6407:16;6400:27;6286:148;;;:::o;6440:425::-;6518:5;6543:66;6559:49;6601:6;6559:49;:::i;:::-;6543:66;:::i;:::-;6534:75;;6632:6;6625:5;6618:21;6670:4;6663:5;6659:16;6708:3;6699:6;6694:3;6690:16;6687:25;6684:112;;;6715:79;;:::i;:::-;6684:112;6805:54;6852:6;6847:3;6842;6805:54;:::i;:::-;6524:341;6440:425;;;;;:::o;6885:340::-;6941:5;6990:3;6983:4;6975:6;6971:17;6967:27;6957:122;;6998:79;;:::i;:::-;6957:122;7115:6;7102:20;7140:79;7215:3;7207:6;7200:4;7192:6;7188:17;7140:79;:::i;:::-;7131:88;;6947:278;6885:340;;;;:::o;7231:509::-;7300:6;7349:2;7337:9;7328:7;7324:23;7320:32;7317:119;;;7355:79;;:::i;:::-;7317:119;7503:1;7492:9;7488:17;7475:31;7533:18;7525:6;7522:30;7519:117;;;7555:79;;:::i;:::-;7519:117;7660:63;7715:7;7706:6;7695:9;7691:22;7660:63;:::i;:::-;7650:73;;7446:287;7231:509;;;;:::o;7746:116::-;7816:21;7831:5;7816:21;:::i;:::-;7809:5;7806:32;7796:60;;7852:1;7849;7842:12;7796:60;7746:116;:::o;7868:133::-;7911:5;7949:6;7936:20;7927:29;;7965:30;7989:5;7965:30;:::i;:::-;7868:133;;;;:::o;8007:323::-;8063:6;8112:2;8100:9;8091:7;8087:23;8083:32;8080:119;;;8118:79;;:::i;:::-;8080:119;8238:1;8263:50;8305:7;8296:6;8285:9;8281:22;8263:50;:::i;:::-;8253:60;;8209:114;8007:323;;;;:::o;8336:118::-;8423:24;8441:5;8423:24;:::i;:::-;8418:3;8411:37;8336:118;;:::o;8460:222::-;8553:4;8591:2;8580:9;8576:18;8568:26;;8604:71;8672:1;8661:9;8657:17;8648:6;8604:71;:::i;:::-;8460:222;;;;:::o;8688:619::-;8765:6;8773;8781;8830:2;8818:9;8809:7;8805:23;8801:32;8798:119;;;8836:79;;:::i;:::-;8798:119;8956:1;8981:53;9026:7;9017:6;9006:9;9002:22;8981:53;:::i;:::-;8971:63;;8927:117;9083:2;9109:53;9154:7;9145:6;9134:9;9130:22;9109:53;:::i;:::-;9099:63;;9054:118;9211:2;9237:53;9282:7;9273:6;9262:9;9258:22;9237:53;:::i;:::-;9227:63;;9182:118;8688:619;;;;;:::o;9313:311::-;9390:4;9480:18;9472:6;9469:30;9466:56;;;9502:18;;:::i;:::-;9466:56;9552:4;9544:6;9540:17;9532:25;;9612:4;9606;9602:15;9594:23;;9313:311;;;:::o;9630:117::-;9739:1;9736;9729:12;9770:710;9866:5;9891:81;9907:64;9964:6;9907:64;:::i;:::-;9891:81;:::i;:::-;9882:90;;9992:5;10021:6;10014:5;10007:21;10055:4;10048:5;10044:16;10037:23;;10108:4;10100:6;10096:17;10088:6;10084:30;10137:3;10129:6;10126:15;10123:122;;;10156:79;;:::i;:::-;10123:122;10271:6;10254:220;10288:6;10283:3;10280:15;10254:220;;;10363:3;10392:37;10425:3;10413:10;10392:37;:::i;:::-;10387:3;10380:50;10459:4;10454:3;10450:14;10443:21;;10330:144;10314:4;10309:3;10305:14;10298:21;;10254:220;;;10258:21;9872:608;;9770:710;;;;;:::o;10503:370::-;10574:5;10623:3;10616:4;10608:6;10604:17;10600:27;10590:122;;10631:79;;:::i;:::-;10590:122;10748:6;10735:20;10773:94;10863:3;10855:6;10848:4;10840:6;10836:17;10773:94;:::i;:::-;10764:103;;10580:293;10503:370;;;;:::o;10879:539::-;10963:6;11012:2;11000:9;10991:7;10987:23;10983:32;10980:119;;;11018:79;;:::i;:::-;10980:119;11166:1;11155:9;11151:17;11138:31;11196:18;11188:6;11185:30;11182:117;;;11218:79;;:::i;:::-;11182:117;11323:78;11393:7;11384:6;11373:9;11369:22;11323:78;:::i;:::-;11313:88;;11109:302;10879:539;;;;:::o;11424:468::-;11489:6;11497;11546:2;11534:9;11525:7;11521:23;11517:32;11514:119;;;11552:79;;:::i;:::-;11514:119;11672:1;11697:53;11742:7;11733:6;11722:9;11718:22;11697:53;:::i;:::-;11687:63;;11643:117;11799:2;11825:50;11867:7;11858:6;11847:9;11843:22;11825:50;:::i;:::-;11815:60;;11770:115;11424:468;;;;;:::o;11898:307::-;11959:4;12049:18;12041:6;12038:30;12035:56;;;12071:18;;:::i;:::-;12035:56;12109:29;12131:6;12109:29;:::i;:::-;12101:37;;12193:4;12187;12183:15;12175:23;;11898:307;;;:::o;12211:423::-;12288:5;12313:65;12329:48;12370:6;12329:48;:::i;:::-;12313:65;:::i;:::-;12304:74;;12401:6;12394:5;12387:21;12439:4;12432:5;12428:16;12477:3;12468:6;12463:3;12459:16;12456:25;12453:112;;;12484:79;;:::i;:::-;12453:112;12574:54;12621:6;12616:3;12611;12574:54;:::i;:::-;12294:340;12211:423;;;;;:::o;12653:338::-;12708:5;12757:3;12750:4;12742:6;12738:17;12734:27;12724:122;;12765:79;;:::i;:::-;12724:122;12882:6;12869:20;12907:78;12981:3;12973:6;12966:4;12958:6;12954:17;12907:78;:::i;:::-;12898:87;;12714:277;12653:338;;;;:::o;12997:943::-;13092:6;13100;13108;13116;13165:3;13153:9;13144:7;13140:23;13136:33;13133:120;;;13172:79;;:::i;:::-;13133:120;13292:1;13317:53;13362:7;13353:6;13342:9;13338:22;13317:53;:::i;:::-;13307:63;;13263:117;13419:2;13445:53;13490:7;13481:6;13470:9;13466:22;13445:53;:::i;:::-;13435:63;;13390:118;13547:2;13573:53;13618:7;13609:6;13598:9;13594:22;13573:53;:::i;:::-;13563:63;;13518:118;13703:2;13692:9;13688:18;13675:32;13734:18;13726:6;13723:30;13720:117;;;13756:79;;:::i;:::-;13720:117;13861:62;13915:7;13906:6;13895:9;13891:22;13861:62;:::i;:::-;13851:72;;13646:287;12997:943;;;;;;;:::o;13946:474::-;14014:6;14022;14071:2;14059:9;14050:7;14046:23;14042:32;14039:119;;;14077:79;;:::i;:::-;14039:119;14197:1;14222:53;14267:7;14258:6;14247:9;14243:22;14222:53;:::i;:::-;14212:63;;14168:117;14324:2;14350:53;14395:7;14386:6;14375:9;14371:22;14350:53;:::i;:::-;14340:63;;14295:118;13946:474;;;;;:::o;14426:180::-;14474:77;14471:1;14464:88;14571:4;14568:1;14561:15;14595:4;14592:1;14585:15;14612:320;14656:6;14693:1;14687:4;14683:12;14673:22;;14740:1;14734:4;14730:12;14761:18;14751:81;;14817:4;14809:6;14805:17;14795:27;;14751:81;14879:2;14871:6;14868:14;14848:18;14845:38;14842:84;;14898:18;;:::i;:::-;14842:84;14663:269;14612:320;;;:::o;14938:231::-;15078:34;15074:1;15066:6;15062:14;15055:58;15147:14;15142:2;15134:6;15130:15;15123:39;14938:231;:::o;15175:366::-;15317:3;15338:67;15402:2;15397:3;15338:67;:::i;:::-;15331:74;;15414:93;15503:3;15414:93;:::i;:::-;15532:2;15527:3;15523:12;15516:19;;15175:366;;;:::o;15547:419::-;15713:4;15751:2;15740:9;15736:18;15728:26;;15800:9;15794:4;15790:20;15786:1;15775:9;15771:17;15764:47;15828:131;15954:4;15828:131;:::i;:::-;15820:139;;15547:419;;;:::o;15972:220::-;16112:34;16108:1;16100:6;16096:14;16089:58;16181:3;16176:2;16168:6;16164:15;16157:28;15972:220;:::o;16198:366::-;16340:3;16361:67;16425:2;16420:3;16361:67;:::i;:::-;16354:74;;16437:93;16526:3;16437:93;:::i;:::-;16555:2;16550:3;16546:12;16539:19;;16198:366;;;:::o;16570:419::-;16736:4;16774:2;16763:9;16759:18;16751:26;;16823:9;16817:4;16813:20;16809:1;16798:9;16794:17;16787:47;16851:131;16977:4;16851:131;:::i;:::-;16843:139;;16570:419;;;:::o;16995:243::-;17135:34;17131:1;17123:6;17119:14;17112:58;17204:26;17199:2;17191:6;17187:15;17180:51;16995:243;:::o;17244:366::-;17386:3;17407:67;17471:2;17466:3;17407:67;:::i;:::-;17400:74;;17483:93;17572:3;17483:93;:::i;:::-;17601:2;17596:3;17592:12;17585:19;;17244:366;;;:::o;17616:419::-;17782:4;17820:2;17809:9;17805:18;17797:26;;17869:9;17863:4;17859:20;17855:1;17844:9;17840:17;17833:47;17897:131;18023:4;17897:131;:::i;:::-;17889:139;;17616:419;;;:::o;18041:141::-;18090:4;18113:3;18105:11;;18136:3;18133:1;18126:14;18170:4;18167:1;18157:18;18149:26;;18041:141;;;:::o;18188:93::-;18225:6;18272:2;18267;18260:5;18256:14;18252:23;18242:33;;18188:93;;;:::o;18287:107::-;18331:8;18381:5;18375:4;18371:16;18350:37;;18287:107;;;;:::o;18400:393::-;18469:6;18519:1;18507:10;18503:18;18542:97;18572:66;18561:9;18542:97;:::i;:::-;18660:39;18690:8;18679:9;18660:39;:::i;:::-;18648:51;;18732:4;18728:9;18721:5;18717:21;18708:30;;18781:4;18771:8;18767:19;18760:5;18757:30;18747:40;;18476:317;;18400:393;;;;;:::o;18799:60::-;18827:3;18848:5;18841:12;;18799:60;;;:::o;18865:142::-;18915:9;18948:53;18966:34;18975:24;18993:5;18975:24;:::i;:::-;18966:34;:::i;:::-;18948:53;:::i;:::-;18935:66;;18865:142;;;:::o;19013:75::-;19056:3;19077:5;19070:12;;19013:75;;;:::o;19094:269::-;19204:39;19235:7;19204:39;:::i;:::-;19265:91;19314:41;19338:16;19314:41;:::i;:::-;19306:6;19299:4;19293:11;19265:91;:::i;:::-;19259:4;19252:105;19170:193;19094:269;;;:::o;19369:73::-;19414:3;19369:73;:::o;19448:189::-;19525:32;;:::i;:::-;19566:65;19624:6;19616;19610:4;19566:65;:::i;:::-;19501:136;19448:189;;:::o;19643:186::-;19703:120;19720:3;19713:5;19710:14;19703:120;;;19774:39;19811:1;19804:5;19774:39;:::i;:::-;19747:1;19740:5;19736:13;19727:22;;19703:120;;;19643:186;;:::o;19835:543::-;19936:2;19931:3;19928:11;19925:446;;;19970:38;20002:5;19970:38;:::i;:::-;20054:29;20072:10;20054:29;:::i;:::-;20044:8;20040:44;20237:2;20225:10;20222:18;20219:49;;;20258:8;20243:23;;20219:49;20281:80;20337:22;20355:3;20337:22;:::i;:::-;20327:8;20323:37;20310:11;20281:80;:::i;:::-;19940:431;;19925:446;19835:543;;;:::o;20384:117::-;20438:8;20488:5;20482:4;20478:16;20457:37;;20384:117;;;;:::o;20507:169::-;20551:6;20584:51;20632:1;20628:6;20620:5;20617:1;20613:13;20584:51;:::i;:::-;20580:56;20665:4;20659;20655:15;20645:25;;20558:118;20507:169;;;;:::o;20681:295::-;20757:4;20903:29;20928:3;20922:4;20903:29;:::i;:::-;20895:37;;20965:3;20962:1;20958:11;20952:4;20949:21;20941:29;;20681:295;;;;:::o;20981:1395::-;21098:37;21131:3;21098:37;:::i;:::-;21200:18;21192:6;21189:30;21186:56;;;21222:18;;:::i;:::-;21186:56;21266:38;21298:4;21292:11;21266:38;:::i;:::-;21351:67;21411:6;21403;21397:4;21351:67;:::i;:::-;21445:1;21469:4;21456:17;;21501:2;21493:6;21490:14;21518:1;21513:618;;;;22175:1;22192:6;22189:77;;;22241:9;22236:3;22232:19;22226:26;22217:35;;22189:77;22292:67;22352:6;22345:5;22292:67;:::i;:::-;22286:4;22279:81;22148:222;21483:887;;21513:618;21565:4;21561:9;21553:6;21549:22;21599:37;21631:4;21599:37;:::i;:::-;21658:1;21672:208;21686:7;21683:1;21680:14;21672:208;;;21765:9;21760:3;21756:19;21750:26;21742:6;21735:42;21816:1;21808:6;21804:14;21794:24;;21863:2;21852:9;21848:18;21835:31;;21709:4;21706:1;21702:12;21697:17;;21672:208;;;21908:6;21899:7;21896:19;21893:179;;;21966:9;21961:3;21957:19;21951:26;22009:48;22051:4;22043:6;22039:17;22028:9;22009:48;:::i;:::-;22001:6;21994:64;21916:156;21893:179;22118:1;22114;22106:6;22102:14;22098:22;22092:4;22085:36;21520:611;;;21483:887;;21073:1303;;;20981:1395;;:::o;22382:180::-;22430:77;22427:1;22420:88;22527:4;22524:1;22517:15;22551:4;22548:1;22541:15;22568:194;22608:4;22628:20;22646:1;22628:20;:::i;:::-;22623:25;;22662:20;22680:1;22662:20;:::i;:::-;22657:25;;22706:1;22703;22699:9;22691:17;;22730:1;22724:4;22721:11;22718:37;;;22735:18;;:::i;:::-;22718:37;22568:194;;;;:::o;22768:236::-;22908:34;22904:1;22896:6;22892:14;22885:58;22977:19;22972:2;22964:6;22960:15;22953:44;22768:236;:::o;23010:366::-;23152:3;23173:67;23237:2;23232:3;23173:67;:::i;:::-;23166:74;;23249:93;23338:3;23249:93;:::i;:::-;23367:2;23362:3;23358:12;23351:19;;23010:366;;;:::o;23382:419::-;23548:4;23586:2;23575:9;23571:18;23563:26;;23635:9;23629:4;23625:20;23621:1;23610:9;23606:17;23599:47;23663:131;23789:4;23663:131;:::i;:::-;23655:139;;23382:419;;;:::o;23807:233::-;23846:3;23869:24;23887:5;23869:24;:::i;:::-;23860:33;;23915:66;23908:5;23905:77;23902:103;;23985:18;;:::i;:::-;23902:103;24032:1;24025:5;24021:13;24014:20;;23807:233;;;:::o;24046:191::-;24086:3;24105:20;24123:1;24105:20;:::i;:::-;24100:25;;24139:20;24157:1;24139:20;:::i;:::-;24134:25;;24182:1;24179;24175:9;24168:16;;24203:3;24200:1;24197:10;24194:36;;;24210:18;;:::i;:::-;24194:36;24046:191;;;;:::o;24243:235::-;24383:34;24379:1;24371:6;24367:14;24360:58;24452:18;24447:2;24439:6;24435:15;24428:43;24243:235;:::o;24484:366::-;24626:3;24647:67;24711:2;24706:3;24647:67;:::i;:::-;24640:74;;24723:93;24812:3;24723:93;:::i;:::-;24841:2;24836:3;24832:12;24825:19;;24484:366;;;:::o;24856:419::-;25022:4;25060:2;25049:9;25045:18;25037:26;;25109:9;25103:4;25099:20;25095:1;25084:9;25080:17;25073:47;25137:131;25263:4;25137:131;:::i;:::-;25129:139;;24856:419;;;:::o;25281:168::-;25421:20;25417:1;25409:6;25405:14;25398:44;25281:168;:::o;25455:366::-;25597:3;25618:67;25682:2;25677:3;25618:67;:::i;:::-;25611:74;;25694:93;25783:3;25694:93;:::i;:::-;25812:2;25807:3;25803:12;25796:19;;25455:366;;;:::o;25827:419::-;25993:4;26031:2;26020:9;26016:18;26008:26;;26080:9;26074:4;26070:20;26066:1;26055:9;26051:17;26044:47;26108:131;26234:4;26108:131;:::i;:::-;26100:139;;25827:419;;;:::o;26252:227::-;26392:34;26388:1;26380:6;26376:14;26369:58;26461:10;26456:2;26448:6;26444:15;26437:35;26252:227;:::o;26485:366::-;26627:3;26648:67;26712:2;26707:3;26648:67;:::i;:::-;26641:74;;26724:93;26813:3;26724:93;:::i;:::-;26842:2;26837:3;26833:12;26826:19;;26485:366;;;:::o;26857:419::-;27023:4;27061:2;27050:9;27046:18;27038:26;;27110:9;27104:4;27100:20;27096:1;27085:9;27081:17;27074:47;27138:131;27264:4;27138:131;:::i;:::-;27130:139;;26857:419;;;:::o;27282:248::-;27422:34;27418:1;27410:6;27406:14;27399:58;27491:31;27486:2;27478:6;27474:15;27467:56;27282:248;:::o;27536:366::-;27678:3;27699:67;27763:2;27758:3;27699:67;:::i;:::-;27692:74;;27775:93;27864:3;27775:93;:::i;:::-;27893:2;27888:3;27884:12;27877:19;;27536:366;;;:::o;27908:419::-;28074:4;28112:2;28101:9;28097:18;28089:26;;28161:9;28155:4;28151:20;28147:1;28136:9;28132:17;28125:47;28189:131;28315:4;28189:131;:::i;:::-;28181:139;;27908:419;;;:::o;28333:410::-;28373:7;28396:20;28414:1;28396:20;:::i;:::-;28391:25;;28430:20;28448:1;28430:20;:::i;:::-;28425:25;;28485:1;28482;28478:9;28507:30;28525:11;28507:30;:::i;:::-;28496:41;;28686:1;28677:7;28673:15;28670:1;28667:22;28647:1;28640:9;28620:83;28597:139;;28716:18;;:::i;:::-;28597:139;28381:362;28333:410;;;;:::o;28749:223::-;28889:34;28885:1;28877:6;28873:14;28866:58;28958:6;28953:2;28945:6;28941:15;28934:31;28749:223;:::o;28978:366::-;29120:3;29141:67;29205:2;29200:3;29141:67;:::i;:::-;29134:74;;29217:93;29306:3;29217:93;:::i;:::-;29335:2;29330:3;29326:12;29319:19;;28978:366;;;:::o;29350:419::-;29516:4;29554:2;29543:9;29539:18;29531:26;;29603:9;29597:4;29593:20;29589:1;29578:9;29574:17;29567:47;29631:131;29757:4;29631:131;:::i;:::-;29623:139;;29350:419;;;:::o;29775:180::-;29823:77;29820:1;29813:88;29920:4;29917:1;29910:15;29944:4;29941:1;29934:15;29961:228;30101:34;30097:1;30089:6;30085:14;30078:58;30170:11;30165:2;30157:6;30153:15;30146:36;29961:228;:::o;30195:366::-;30337:3;30358:67;30422:2;30417:3;30358:67;:::i;:::-;30351:74;;30434:93;30523:3;30434:93;:::i;:::-;30552:2;30547:3;30543:12;30536:19;;30195:366;;;:::o;30567:419::-;30733:4;30771:2;30760:9;30756:18;30748:26;;30820:9;30814:4;30810:20;30806:1;30795:9;30791:17;30784:47;30848:131;30974:4;30848:131;:::i;:::-;30840:139;;30567:419;;;:::o;30992:229::-;31132:34;31128:1;31120:6;31116:14;31109:58;31201:12;31196:2;31188:6;31184:15;31177:37;30992:229;:::o;31227:366::-;31369:3;31390:67;31454:2;31449:3;31390:67;:::i;:::-;31383:74;;31466:93;31555:3;31466:93;:::i;:::-;31584:2;31579:3;31575:12;31568:19;;31227:366;;;:::o;31599:419::-;31765:4;31803:2;31792:9;31788:18;31780:26;;31852:9;31846:4;31842:20;31838:1;31827:9;31823:17;31816:47;31880:131;32006:4;31880:131;:::i;:::-;31872:139;;31599:419;;;:::o;32024:234::-;32164:34;32160:1;32152:6;32148:14;32141:58;32233:17;32228:2;32220:6;32216:15;32209:42;32024:234;:::o;32264:366::-;32406:3;32427:67;32491:2;32486:3;32427:67;:::i;:::-;32420:74;;32503:93;32592:3;32503:93;:::i;:::-;32621:2;32616:3;32612:12;32605:19;;32264:366;;;:::o;32636:419::-;32802:4;32840:2;32829:9;32825:18;32817:26;;32889:9;32883:4;32879:20;32875:1;32864:9;32860:17;32853:47;32917:131;33043:4;32917:131;:::i;:::-;32909:139;;32636:419;;;:::o;33061:148::-;33163:11;33200:3;33185:18;;33061:148;;;;:::o;33215:390::-;33321:3;33349:39;33382:5;33349:39;:::i;:::-;33404:89;33486:6;33481:3;33404:89;:::i;:::-;33397:96;;33502:65;33560:6;33555:3;33548:4;33541:5;33537:16;33502:65;:::i;:::-;33592:6;33587:3;33583:16;33576:23;;33325:280;33215:390;;;;:::o;33611:435::-;33791:3;33813:95;33904:3;33895:6;33813:95;:::i;:::-;33806:102;;33925:95;34016:3;34007:6;33925:95;:::i;:::-;33918:102;;34037:3;34030:10;;33611:435;;;;;:::o;34052:245::-;34192:34;34188:1;34180:6;34176:14;34169:58;34261:28;34256:2;34248:6;34244:15;34237:53;34052:245;:::o;34303:366::-;34445:3;34466:67;34530:2;34525:3;34466:67;:::i;:::-;34459:74;;34542:93;34631:3;34542:93;:::i;:::-;34660:2;34655:3;34651:12;34644:19;;34303:366;;;:::o;34675:419::-;34841:4;34879:2;34868:9;34864:18;34856:26;;34928:9;34922:4;34918:20;34914:1;34903:9;34899:17;34892:47;34956:131;35082:4;34956:131;:::i;:::-;34948:139;;34675:419;;;:::o;35100:231::-;35240:34;35236:1;35228:6;35224:14;35217:58;35309:14;35304:2;35296:6;35292:15;35285:39;35100:231;:::o;35337:366::-;35479:3;35500:67;35564:2;35559:3;35500:67;:::i;:::-;35493:74;;35576:93;35665:3;35576:93;:::i;:::-;35694:2;35689:3;35685:12;35678:19;;35337:366;;;:::o;35709:419::-;35875:4;35913:2;35902:9;35898:18;35890:26;;35962:9;35956:4;35952:20;35948:1;35937:9;35933:17;35926:47;35990:131;36116:4;35990:131;:::i;:::-;35982:139;;35709:419;;;:::o;36134:224::-;36274:34;36270:1;36262:6;36258:14;36251:58;36343:7;36338:2;36330:6;36326:15;36319:32;36134:224;:::o;36364:366::-;36506:3;36527:67;36591:2;36586:3;36527:67;:::i;:::-;36520:74;;36603:93;36692:3;36603:93;:::i;:::-;36721:2;36716:3;36712:12;36705:19;;36364:366;;;:::o;36736:419::-;36902:4;36940:2;36929:9;36925:18;36917:26;;36989:9;36983:4;36979:20;36975:1;36964:9;36960:17;36953:47;37017:131;37143:4;37017:131;:::i;:::-;37009:139;;36736:419;;;:::o;37161:223::-;37301:34;37297:1;37289:6;37285:14;37278:58;37370:6;37365:2;37357:6;37353:15;37346:31;37161:223;:::o;37390:366::-;37532:3;37553:67;37617:2;37612:3;37553:67;:::i;:::-;37546:74;;37629:93;37718:3;37629:93;:::i;:::-;37747:2;37742:3;37738:12;37731:19;;37390:366;;;:::o;37762:419::-;37928:4;37966:2;37955:9;37951:18;37943:26;;38015:9;38009:4;38005:20;38001:1;37990:9;37986:17;37979:47;38043:131;38169:4;38043:131;:::i;:::-;38035:139;;37762:419;;;:::o;38187:179::-;38327:31;38323:1;38315:6;38311:14;38304:55;38187:179;:::o;38372:366::-;38514:3;38535:67;38599:2;38594:3;38535:67;:::i;:::-;38528:74;;38611:93;38700:3;38611:93;:::i;:::-;38729:2;38724:3;38720:12;38713:19;;38372:366;;;:::o;38744:419::-;38910:4;38948:2;38937:9;38933:18;38925:26;;38997:9;38991:4;38987:20;38983:1;38972:9;38968:17;38961:47;39025:131;39151:4;39025:131;:::i;:::-;39017:139;;38744:419;;;:::o;39169:147::-;39270:11;39307:3;39292:18;;39169:147;;;;:::o;39322:114::-;;:::o;39442:398::-;39601:3;39622:83;39703:1;39698:3;39622:83;:::i;:::-;39615:90;;39714:93;39803:3;39714:93;:::i;:::-;39832:1;39827:3;39823:11;39816:18;;39442:398;;;:::o;39846:379::-;40030:3;40052:147;40195:3;40052:147;:::i;:::-;40045:154;;40216:3;40209:10;;39846:379;;;:::o;40231:245::-;40371:34;40367:1;40359:6;40355:14;40348:58;40440:28;40435:2;40427:6;40423:15;40416:53;40231:245;:::o;40482:366::-;40624:3;40645:67;40709:2;40704:3;40645:67;:::i;:::-;40638:74;;40721:93;40810:3;40721:93;:::i;:::-;40839:2;40834:3;40830:12;40823:19;;40482:366;;;:::o;40854:419::-;41020:4;41058:2;41047:9;41043:18;41035:26;;41107:9;41101:4;41097:20;41093:1;41082:9;41078:17;41071:47;41135:131;41261:4;41135:131;:::i;:::-;41127:139;;40854:419;;;:::o;41279:181::-;41419:33;41415:1;41407:6;41403:14;41396:57;41279:181;:::o;41466:366::-;41608:3;41629:67;41693:2;41688:3;41629:67;:::i;:::-;41622:74;;41705:93;41794:3;41705:93;:::i;:::-;41823:2;41818:3;41814:12;41807:19;;41466:366;;;:::o;41838:419::-;42004:4;42042:2;42031:9;42027:18;42019:26;;42091:9;42085:4;42081:20;42077:1;42066:9;42062:17;42055:47;42119:131;42245:4;42119:131;:::i;:::-;42111:139;;41838:419;;;:::o;42263:175::-;42403:27;42399:1;42391:6;42387:14;42380:51;42263:175;:::o;42444:366::-;42586:3;42607:67;42671:2;42666:3;42607:67;:::i;:::-;42600:74;;42683:93;42772:3;42683:93;:::i;:::-;42801:2;42796:3;42792:12;42785:19;;42444:366;;;:::o;42816:419::-;42982:4;43020:2;43009:9;43005:18;42997:26;;43069:9;43063:4;43059:20;43055:1;43044:9;43040:17;43033:47;43097:131;43223:4;43097:131;:::i;:::-;43089:139;;42816:419;;;:::o;43241:237::-;43381:34;43377:1;43369:6;43365:14;43358:58;43450:20;43445:2;43437:6;43433:15;43426:45;43241:237;:::o;43484:366::-;43626:3;43647:67;43711:2;43706:3;43647:67;:::i;:::-;43640:74;;43723:93;43812:3;43723:93;:::i;:::-;43841:2;43836:3;43832:12;43825:19;;43484:366;;;:::o;43856:419::-;44022:4;44060:2;44049:9;44045:18;44037:26;;44109:9;44103:4;44099:20;44095:1;44084:9;44080:17;44073:47;44137:131;44263:4;44137:131;:::i;:::-;44129:139;;43856:419;;;:::o;44281:180::-;44329:77;44326:1;44319:88;44426:4;44423:1;44416:15;44450:4;44447:1;44440:15;44467:185;44507:1;44524:20;44542:1;44524:20;:::i;:::-;44519:25;;44558:20;44576:1;44558:20;:::i;:::-;44553:25;;44597:1;44587:35;;44602:18;;:::i;:::-;44587:35;44644:1;44641;44637:9;44632:14;;44467:185;;;;:::o;44658:176::-;44690:1;44707:20;44725:1;44707:20;:::i;:::-;44702:25;;44741:20;44759:1;44741:20;:::i;:::-;44736:25;;44780:1;44770:35;;44785:18;;:::i;:::-;44770:35;44826:1;44823;44819:9;44814:14;;44658:176;;;;:::o;44840:170::-;44980:22;44976:1;44968:6;44964:14;44957:46;44840:170;:::o;45016:366::-;45158:3;45179:67;45243:2;45238:3;45179:67;:::i;:::-;45172:74;;45255:93;45344:3;45255:93;:::i;:::-;45373:2;45368:3;45364:12;45357:19;;45016:366;;;:::o;45388:419::-;45554:4;45592:2;45581:9;45577:18;45569:26;;45641:9;45635:4;45631:20;45627:1;45616:9;45612:17;45605:47;45669:131;45795:4;45669:131;:::i;:::-;45661:139;;45388:419;;;:::o;45813:166::-;45953:18;45949:1;45941:6;45937:14;45930:42;45813:166;:::o;45985:366::-;46127:3;46148:67;46212:2;46207:3;46148:67;:::i;:::-;46141:74;;46224:93;46313:3;46224:93;:::i;:::-;46342:2;46337:3;46333:12;46326:19;;45985:366;;;:::o;46357:419::-;46523:4;46561:2;46550:9;46546:18;46538:26;;46610:9;46604:4;46600:20;46596:1;46585:9;46581:17;46574:47;46638:131;46764:4;46638:131;:::i;:::-;46630:139;;46357:419;;;:::o;46782:98::-;46833:6;46867:5;46861:12;46851:22;;46782:98;;;:::o;46886:168::-;46969:11;47003:6;46998:3;46991:19;47043:4;47038:3;47034:14;47019:29;;46886:168;;;;:::o;47060:373::-;47146:3;47174:38;47206:5;47174:38;:::i;:::-;47228:70;47291:6;47286:3;47228:70;:::i;:::-;47221:77;;47307:65;47365:6;47360:3;47353:4;47346:5;47342:16;47307:65;:::i;:::-;47397:29;47419:6;47397:29;:::i;:::-;47392:3;47388:39;47381:46;;47150:283;47060:373;;;;:::o;47439:640::-;47634:4;47672:3;47661:9;47657:19;47649:27;;47686:71;47754:1;47743:9;47739:17;47730:6;47686:71;:::i;:::-;47767:72;47835:2;47824:9;47820:18;47811:6;47767:72;:::i;:::-;47849;47917:2;47906:9;47902:18;47893:6;47849:72;:::i;:::-;47968:9;47962:4;47958:20;47953:2;47942:9;47938:18;47931:48;47996:76;48067:4;48058:6;47996:76;:::i;:::-;47988:84;;47439:640;;;;;;;:::o;48085:141::-;48141:5;48172:6;48166:13;48157:22;;48188:32;48214:5;48188:32;:::i;:::-;48085:141;;;;:::o;48232:349::-;48301:6;48350:2;48338:9;48329:7;48325:23;48321:32;48318:119;;;48356:79;;:::i;:::-;48318:119;48476:1;48501:63;48556:7;48547:6;48536:9;48532:22;48501:63;:::i;:::-;48491:73;;48447:127;48232:349;;;;:::o;48587:182::-;48727:34;48723:1;48715:6;48711:14;48704:58;48587:182;:::o;48775:366::-;48917:3;48938:67;49002:2;48997:3;48938:67;:::i;:::-;48931:74;;49014:93;49103:3;49014:93;:::i;:::-;49132:2;49127:3;49123:12;49116:19;;48775:366;;;:::o;49147:419::-;49313:4;49351:2;49340:9;49336:18;49328:26;;49400:9;49394:4;49390:20;49386:1;49375:9;49371:17;49364:47;49428:131;49554:4;49428:131;:::i;:::-;49420:139;;49147:419;;;:::o;49572:178::-;49712:30;49708:1;49700:6;49696:14;49689:54;49572:178;:::o;49756:366::-;49898:3;49919:67;49983:2;49978:3;49919:67;:::i;:::-;49912:74;;49995:93;50084:3;49995:93;:::i;:::-;50113:2;50108:3;50104:12;50097:19;;49756:366;;;:::o;50128:419::-;50294:4;50332:2;50321:9;50317:18;50309:26;;50381:9;50375:4;50371:20;50367:1;50356:9;50352:17;50345:47;50409:131;50535:4;50409:131;:::i;:::-;50401:139;;50128:419;;;:::o

Swarm Source

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