ETH Price: $3,183.78 (+0.88%)
 

Overview

Max Total Supply

118 FS360

Holders

108

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FS360
0x13A37FEa8B4A55D7E9bd7b61AC80dDA496F9EC56
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:
Metanoise

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-17
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

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


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


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



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

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

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

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

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

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

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

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

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

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

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

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


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


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



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


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


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



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

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

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


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


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



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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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



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

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


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


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



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

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

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

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

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


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


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



/**
 * @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 erc721a/contracts/[email protected]


// Creator: Chiru Labs









error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


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


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



/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


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


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)






/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


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


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



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

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

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

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

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


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


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



/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


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


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)



/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}


// File hardhat/[email protected]




library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

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

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

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

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

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

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

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

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

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

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_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 view {
		_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 view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}


// File contracts/Metanoise.sol









contract Metanoise is ERC721A, AccessControl, EIP712 {
    enum State {
        PublicMint,
        Paused,
        SoldOut
    }

    //PUBLIC
    State public STATE;
    uint256 public MAX_SUPPLY = 360;
    uint256 public MAX_PER_WALLET = 10;
    uint256 public MINT_PRICE = 5 ether;

    //MAPPINGS
    mapping(bytes32 => address) private _hashes;
    mapping(address => uint256) private _maxPerWallet;

    //ROLES
    bytes32 public constant MINTER_ROLE = keccak256('MINTER_ROLE');
    bytes32 public constant OPERATOR_ROLE = keccak256('OPERATOR_ROLE');
    bytes32 public constant SIGNER_ROLE = keccak256('SIGNER_ROLE');
    bytes32 public constant WITHDRAWER_ROLE = keccak256('WITHDRAWER_ROLE');

    //PRIVATE
    string private baseURI = '';
    string private _contractURI;

    //Errors
    error StateError(State actual, State expected);
    error AmountError();
    error MaxPerWalletError();
    error ValueBelowPriceError();
    error MaxSupplyError();
    error SignatureError();
    error HashAlreadyUsedError();
    error ArraySizeError();
    error BalanceError();
    error WithdrawError();

    constructor(
        string memory name,
        string memory symbol,
        string memory version
    ) ERC721A(name, symbol) EIP712(name, version) {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
        _grantRole(OPERATOR_ROLE, msg.sender);
    }

    function safeMintArray(address[] calldata to, uint256[] calldata amount) external onlyRole(MINTER_ROLE) {
        if (to.length != amount.length) {
            revert ArraySizeError();
        }

        for (uint256 i = 0; i < to.length; i++) {
            _safeMint(to[i], amount[i], '');
        }
    }

    function safeMint(address to, uint256 amount) external onlyRole(MINTER_ROLE) {
        _safeMint(to, amount, '');
    }

    function getSigner(
        address account,
        uint256 amount,
        uint256 nonce,
        bytes calldata signature
    ) external view returns (address) {
        bytes32 hash = _hash(account, amount, nonce);
        return ECDSA.recover(hash, signature);
    }

    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function mint(
        uint256 amount,
        uint256 nonce,
        bytes calldata signature
    ) external payable {
        if (STATE != State.PublicMint) {
            revert StateError(STATE, State.PublicMint);
        }

        if (amount == 0) {
            revert AmountError();
        }

        if (msg.value < (MINT_PRICE * amount)) {
            revert ValueBelowPriceError();
        }

        if (_maxPerWallet[msg.sender] + amount > MAX_PER_WALLET) {
            revert MaxPerWalletError();
        }

        uint256 currentSupply = totalSupply();

        if ((currentSupply + amount) > MAX_SUPPLY) {
            revert MaxSupplyError();
        }

        bytes32 hash = _hash(msg.sender, amount, nonce);
        if (!_verify(hash, signature)) {
            revert SignatureError();
        }

        if (!_verify(hash, signature)) {
            revert SignatureError();
        }

        if (_hashes[hash] != address(0)) {
            revert HashAlreadyUsedError();
        }
        _safeMint(msg.sender, amount);
        _maxPerWallet[msg.sender] = _maxPerWallet[msg.sender] + amount;
        _hashes[hash] = msg.sender;
    }

    function setPrice(uint256 price) external onlyRole(OPERATOR_ROLE) {
        MINT_PRICE = price;
    }

    function setMaxSupply(uint256 maxSupply) external onlyRole(OPERATOR_ROLE) {
        MAX_SUPPLY = maxSupply;
    }

    function getMaxPerWalletPerAccount(address account) external view returns (uint256) {
        return _maxPerWallet[account];
    }

    function setMaxPerWallet(uint256 maxPerWallet) external onlyRole(OPERATOR_ROLE) {
        MAX_PER_WALLET = maxPerWallet;
    }

    function exists(uint256 tokenId) public view returns (bool) {
        return super._exists(tokenId);
    }

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

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

    function setContractURI(string memory newContractURI) external onlyRole(OPERATOR_ROLE) {
        _contractURI = newContractURI;
    }

    ///Returns the contract URI for OpenSea
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function _hash(
        address account,
        uint256 amount,
        uint256 nonce
    ) internal view returns (bytes32) {
        return
            _hashTypedDataV4(keccak256(abi.encode(keccak256('NFT(address account,uint256 amount,uint256 nonce)'), account, amount, nonce)));
    }

    function _verify(bytes32 digest, bytes memory signature) internal view returns (bool) {
        return hasRole(SIGNER_ROLE, ECDSA.recover(digest, signature));
    }

    function withdraw() external onlyRole(WITHDRAWER_ROLE) {
        uint256 balance = address(this).balance;
        if (balance == 0) {
            revert BalanceError();
        }

        (bool sent, ) = payable(msg.sender).call{value: balance}('');
        if (!sent) {
            revert WithdrawError();
        }
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721A, AccessControl) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountError","type":"error"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"ArraySizeError","type":"error"},{"inputs":[],"name":"BalanceError","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"HashAlreadyUsedError","type":"error"},{"inputs":[],"name":"MaxPerWalletError","type":"error"},{"inputs":[],"name":"MaxSupplyError","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"SignatureError","type":"error"},{"inputs":[{"internalType":"enum Metanoise.State","name":"actual","type":"uint8"},{"internalType":"enum Metanoise.State","name":"expected","type":"uint8"}],"name":"StateError","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ValueBelowPriceError","type":"error"},{"inputs":[],"name":"WithdrawError","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STATE","outputs":[{"internalType":"enum Metanoise.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAWER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","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":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getMaxPerWalletPerAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"safeMintArray","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610140604052610168600a55600a600b55674563918244f40000600c5560405180602001604052806000815250600f9080519060200190620000439291906200039f565b503480156200005157600080fd5b5060405162005681380380620056818339818101604052810190620000779190620005ec565b828184848160029080519060200190620000939291906200039f565b508060039080519060200190620000ac9291906200039f565b50620000bd620001f960201b60201c565b600081905550505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200012e818484620001fe60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505080610120818152505050505050506200018c6000801b336200023a60201b60201c565b620001be7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200023a60201b60201c565b620001f07f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929336200023a60201b60201c565b505050620007e1565b600090565b600083838346306040516020016200021b95949392919062000720565b6040516020818303038152906040528051906020012090509392505050565b6200024c82826200032c60201b60201c565b620003285760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002cd6200039760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620003ad90620007ac565b90600052602060002090601f016020900481019282620003d157600085556200041d565b82601f10620003ec57805160ff19168380011785556200041d565b828001600101855582156200041d579182015b828111156200041c578251825591602001919060010190620003ff565b5b5090506200042c919062000430565b5090565b5b808211156200044b57600081600090555060010162000431565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004b8826200046d565b810181811067ffffffffffffffff82111715620004da57620004d96200047e565b5b80604052505050565b6000620004ef6200044f565b9050620004fd8282620004ad565b919050565b600067ffffffffffffffff82111562000520576200051f6200047e565b5b6200052b826200046d565b9050602081019050919050565b60005b83811015620005585780820151818401526020810190506200053b565b8381111562000568576000848401525b50505050565b6000620005856200057f8462000502565b620004e3565b905082815260208101848484011115620005a457620005a362000468565b5b620005b184828562000538565b509392505050565b600082601f830112620005d157620005d062000463565b5b8151620005e38482602086016200056e565b91505092915050565b60008060006060848603121562000608576200060762000459565b5b600084015167ffffffffffffffff8111156200062957620006286200045e565b5b6200063786828701620005b9565b935050602084015167ffffffffffffffff8111156200065b576200065a6200045e565b5b6200066986828701620005b9565b925050604084015167ffffffffffffffff8111156200068d576200068c6200045e565b5b6200069b86828701620005b9565b9150509250925092565b6000819050919050565b620006ba81620006a5565b82525050565b6000819050919050565b620006d581620006c0565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070882620006db565b9050919050565b6200071a81620006fb565b82525050565b600060a082019050620007376000830188620006af565b620007466020830187620006af565b620007556040830186620006af565b620007646060830185620006ca565b6200077360808301846200070f565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007c557607f821691505b602082108103620007db57620007da6200077d565b5b50919050565b60805160a05160c05160e0516101005161012051614e5062000831600039600061369c015260006136de015260006136bd015260006135f201526000613648015260006136710152614e506000f3fe6080604052600436106102515760003560e01c806385f438c111610139578063c002d23d116100b6578063d53913931161007a578063d5391393146108d9578063d547741f14610904578063e268e4d31461092d578063e8a3d48514610956578063e985e9c514610981578063f5b541a6146109be57610251565b8063c002d23d146107cc578063c486456c146107f7578063c87b56dd14610822578063cb204c5e1461085f578063cd5d49741461089c57610251565b8063a1448194116100fd578063a1448194146106fb578063a1ebf35d14610724578063a217fddf1461074f578063a22cb4651461077a578063b88d4fde146107a357610251565b806385f438c11461061657806391b7f5ed1461064157806391d148541461066a578063938e3d7b146106a757806395d89b41146106d057610251565b80632f2ff15d116101d257806348d6010d1161019657806348d6010d146104e45780634f558e791461050d57806355f804b31461054a5780636352211e146105735780636f8b44b0146105b057806370a08231146105d957610251565b80632f2ff15d1461042757806332cb6b0c1461045057806336568abe1461047b5780633ccfd60b146104a457806342842e0e146104bb57610251565b80630f2cdd6c116102195780630f2cdd6c1461034057806312065fe01461036b57806318160ddd1461039657806323b872dd146103c1578063248a9ca3146103ea57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be57806308dc9f42146102fb578063095ea7b314610317575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613a32565b6109e9565b60405161028a9190613a7a565b60405180910390f35b34801561029f57600080fd5b506102a86109fb565b6040516102b59190613b2e565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613b86565b610a8d565b6040516102f29190613bf4565b60405180910390f35b61031560048036038101906103109190613c74565b610b09565b005b34801561032357600080fd5b5061033e60048036038101906103399190613d14565b610f8f565b005b34801561034c57600080fd5b50610355611099565b6040516103629190613d63565b60405180910390f35b34801561037757600080fd5b5061038061109f565b60405161038d9190613d63565b60405180910390f35b3480156103a257600080fd5b506103ab6110a7565b6040516103b89190613d63565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613d7e565b6110be565b005b3480156103f657600080fd5b50610411600480360381019061040c9190613e07565b6110ce565b60405161041e9190613e43565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190613e5e565b6110ee565b005b34801561045c57600080fd5b50610465611117565b6040516104729190613d63565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613e5e565b61111d565b005b3480156104b057600080fd5b506104b96111a0565b005b3480156104c757600080fd5b506104e260048036038101906104dd9190613d7e565b6112b9565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613f4a565b6112d9565b005b34801561051957600080fd5b50610534600480360381019061052f9190613b86565b6113cd565b6040516105419190613a7a565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906140fb565b6113df565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613b86565b61142c565b6040516105a79190613bf4565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613b86565b611442565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190614144565b61147f565b60405161060d9190613d63565b60405180910390f35b34801561062257600080fd5b5061062b61154e565b6040516106389190613e43565b60405180910390f35b34801561064d57600080fd5b5061066860048036038101906106639190613b86565b611572565b005b34801561067657600080fd5b50610691600480360381019061068c9190613e5e565b6115af565b60405161069e9190613a7a565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c991906140fb565b61161a565b005b3480156106dc57600080fd5b506106e5611667565b6040516106f29190613b2e565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190613d14565b6116f9565b005b34801561073057600080fd5b5061073961174a565b6040516107469190613e43565b60405180910390f35b34801561075b57600080fd5b5061076461176e565b6040516107719190613e43565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c919061419d565b611775565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061427e565b6118ec565b005b3480156107d857600080fd5b506107e1611968565b6040516107ee9190613d63565b60405180910390f35b34801561080357600080fd5b5061080c61196e565b6040516108199190614378565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190613b86565b611981565b6040516108569190613b2e565b60405180910390f35b34801561086b57600080fd5b5061088660048036038101906108819190614144565b611a1f565b6040516108939190613d63565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be9190614393565b611a68565b6040516108d09190613bf4565b60405180910390f35b3480156108e557600080fd5b506108ee611ad2565b6040516108fb9190613e43565b60405180910390f35b34801561091057600080fd5b5061092b60048036038101906109269190613e5e565b611af6565b005b34801561093957600080fd5b50610954600480360381019061094f9190613b86565b611b1f565b005b34801561096257600080fd5b5061096b611b5c565b6040516109789190613b2e565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a3919061441b565b611bee565b6040516109b59190613a7a565b60405180910390f35b3480156109ca57600080fd5b506109d3611c82565b6040516109e09190613e43565b60405180910390f35b60006109f482611ca6565b9050919050565b606060028054610a0a9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a369061448a565b8015610a835780601f10610a5857610100808354040283529160200191610a83565b820191906000526020600020905b815481529060010190602001808311610a6657829003601f168201915b5050505050905090565b6000610a9882611d20565b610ace576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006002811115610b1d57610b1c614301565b5b600960009054906101000a900460ff166002811115610b3f57610b3e614301565b5b14610b9357600960009054906101000a900460ff1660006040517fca8dc8ed000000000000000000000000000000000000000000000000000000008152600401610b8a9291906144bb565b60405180910390fd5b60008403610bcd576040517f4ff64a9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600c54610bdb9190614513565b341015610c14576040517f64975f7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5484600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c62919061456d565b1115610c9a576040517f916dd30800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ca46110a7565b9050600a548582610cb5919061456d565b1115610ced576040517ffb72321800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610cfa338787611d6e565b9050610d4a8185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611dce565b610d80576040517fcd2467c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dce8185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611dce565b610e04576040517fcd2467c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9d576040517f85ee5abf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea73387611e0b565b85600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef2919061456d565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555033600d600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b6000610f9a8261142c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611001576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611020611e29565b73ffffffffffffffffffffffffffffffffffffffff161415801561105257506110508161104b611e29565b611bee565b155b15611089576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611094838383611e31565b505050565b600b5481565b600047905090565b60006110b1611ee3565b6001546000540303905090565b6110c9838383611ee8565b505050565b600060086000838152602001908152602001600020600101549050919050565b6110f7826110ce565b61110881611103611e29565b61239c565b6111128383612439565b505050565b600a5481565b611125611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990614635565b60405180910390fd5b61119c828261251a565b5050565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46111d2816111cd611e29565b61239c565b600047905060008103611211576040517fad4ea8a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff168260405161123790614686565b60006040518083038185875af1925050503d8060008114611274576040519150601f19603f3d011682016040523d82523d6000602084013e611279565b606091505b50509050806112b4576040517fd477157400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6112d4838383604051806020016040528060008152506118ec565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661130b81611306611e29565b61239c565b82829050858590501461134a576040517f7ae8a45c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b858590508110156113c5576113b286868381811061136e5761136d61469b565b5b90506020020160208101906113839190614144565b8585848181106113965761139561469b565b5b90506020020135604051806020016040528060008152506125fc565b80806113bd906146ca565b91505061134d565b505050505050565b60006113d882611d20565b9050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296114118161140c611e29565b61239c565b81600f90805190602001906114279291906138e0565b505050565b60006114378261260e565b600001519050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296114748161146f611e29565b61239c565b81600a819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114e6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296115a48161159f611e29565b61239c565b81600c819055505050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961164c81611647611e29565b61239c565b81601090805190602001906116629291906138e0565b505050565b6060600380546116769061448a565b80601f01602080910402602001604051908101604052809291908181526020018280546116a29061448a565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661172b81611726611e29565b61239c565b6117458383604051806020016040528060008152506125fc565b505050565b7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7081565b6000801b81565b61177d611e29565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117ee611e29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661189b611e29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e09190613a7a565b60405180910390a35050565b6118f7848484611ee8565b6119168373ffffffffffffffffffffffffffffffffffffffff1661289d565b801561192b5750611929848484846128c0565b155b15611962576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b600960009054906101000a900460ff1681565b606061198c82611d20565b6119c2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119cc612a10565b905060008151036119ec5760405180602001604052806000815250611a17565b806119f684612aa2565b604051602001611a0792919061474e565b6040516020818303038152906040525b915050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080611a76878787611d6e565b9050611ac68185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612c02565b91505095945050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611aff826110ce565b611b1081611b0b611e29565b61239c565b611b1a838361251a565b505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611b5181611b4c611e29565b61239c565b81600b819055505050565b606060108054611b6b9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b979061448a565b8015611be45780601f10611bb957610100808354040283529160200191611be4565b820191906000526020600020905b815481529060010190602001808311611bc757829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d195750611d1882612c29565b5b9050919050565b600081611d2b611ee3565b11158015611d3a575060005482105b8015611d67575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b6000611dc57f9a7c5cc02e83ca93d4cb86c8007b00922a3b7b815c917377d84c06bbd7cf8397858585604051602001611daa9493929190614772565b60405160208183030381529060405280519060200120612d0b565b90509392505050565b6000611e037fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f70611dfe8585612c02565b6115af565b905092915050565b611e258282604051806020016040528060008152506125fc565b5050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611ef38261260e565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f5e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f7f611e29565b73ffffffffffffffffffffffffffffffffffffffff161480611fae5750611fad85611fa8611e29565b611bee565b5b80611ff35750611fbc611e29565b73ffffffffffffffffffffffffffffffffffffffff16611fdb84610a8d565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061202c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612092576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61209f8585856001612d25565b6120ab60008487611e31565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361232a57600054821461232957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123958585856001612d2b565b5050505050565b6123a682826115af565b612435576123cb8173ffffffffffffffffffffffffffffffffffffffff166014612d31565b6123d98360001c6020612d31565b6040516020016123ea92919061484f565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c9190613b2e565b60405180910390fd5b5050565b61244382826115af565b6125165760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124bb611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61252482826115af565b156125f85760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061259d611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6126098383836001612f6d565b505050565b612616613966565b600082905080612624611ee3565b11158015612633575060005481105b15612866576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161286457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612748578092505050612898565b5b60011561286357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461285e578092505050612898565b612749565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128e6611e29565b8786866040518563ffffffff1660e01b815260040161290894939291906148de565b6020604051808303816000875af192505050801561294457506040513d601f19601f82011682018060405250810190612941919061493f565b60015b6129bd573d8060008114612974576040519150601f19603f3d011682016040523d82523d6000602084013e612979565b606091505b5060008151036129b5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054612a1f9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054612a4b9061448a565b8015612a985780601f10612a6d57610100808354040283529160200191612a98565b820191906000526020600020905b815481529060010190602001808311612a7b57829003601f168201915b5050505050905090565b606060008203612ae9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bfd565b600082905060005b60008214612b1b578080612b04906146ca565b915050600a82612b14919061499b565b9150612af1565b60008167ffffffffffffffff811115612b3757612b36613fd0565b5b6040519080825280601f01601f191660200182016040528015612b695781602001600182028036833780820191505090505b5090505b60008514612bf657600182612b8291906149cc565b9150600a85612b919190614a00565b6030612b9d919061456d565b60f81b818381518110612bb357612bb261469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bef919061499b565b9450612b6d565b8093505050505b919050565b6000806000612c118585613337565b91509150612c1e816133b8565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d045750612d0382613584565b5b9050919050565b6000612d1e612d186135ee565b83613708565b9050919050565b50505050565b50505050565b606060006002836002612d449190614513565b612d4e919061456d565b67ffffffffffffffff811115612d6757612d66613fd0565b5b6040519080825280601f01601f191660200182016040528015612d995781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612dd157612dd061469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e3557612e3461469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612e759190614513565b612e7f919061456d565b90505b6001811115612f1f577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ec157612ec061469b565b5b1a60f81b828281518110612ed857612ed761469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f1890614a31565b9050612e82565b5060008414612f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5a90614aa6565b60405180910390fd5b8091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612fd9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613013576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130206000868387612d25565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156131ea57506131e98773ffffffffffffffffffffffffffffffffffffffff1661289d565b5b156132af575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325f60008884806001019550886128c0565b613295576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036131f05782600054146132aa57600080fd5b61331a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036132b0575b8160008190555050506133306000868387612d2b565b5050505050565b60008060418351036133785760008060006020860151925060408601519150606086015160001a905061336c8782858561373b565b945094505050506133b1565b60408351036133a857600080602085015191506040850151905061339d868383613847565b9350935050506133b1565b60006002915091505b9250929050565b600060048111156133cc576133cb614301565b5b8160048111156133df576133de614301565b5b031561358157600160048111156133f9576133f8614301565b5b81600481111561340c5761340b614301565b5b0361344c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344390614b12565b60405180910390fd5b600260048111156134605761345f614301565b5b81600481111561347357613472614301565b5b036134b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134aa90614b7e565b60405180910390fd5b600360048111156134c7576134c6614301565b5b8160048111156134da576134d9614301565b5b0361351a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351190614c10565b60405180910390fd5b60048081111561352d5761352c614301565b5b8160048111156135405761353f614301565b5b03613580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357790614ca2565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561366a57507f000000000000000000000000000000000000000000000000000000000000000046145b15613697577f00000000000000000000000000000000000000000000000000000000000000009050613705565b6137027f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006138a6565b90505b90565b6000828260405160200161371d929190614d2f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561377657600060039150915061383e565b601b8560ff161415801561378e5750601c8560ff1614155b156137a057600060049150915061383e565b6000600187878787604051600081526020016040526040516137c59493929190614d82565b6020604051602081039080840390855afa1580156137e7573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036138355760006001925092505061383e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61388a919061456d565b90506138988782888561373b565b935093505050935093915050565b600083838346306040516020016138c1959493929190614dc7565b6040516020818303038152906040528051906020012090509392505050565b8280546138ec9061448a565b90600052602060002090601f01602090048101928261390e5760008555613955565b82601f1061392757805160ff1916838001178555613955565b82800160010185558215613955579182015b82811115613954578251825591602001919060010190613939565b5b50905061396291906139a9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139c25760008160009055506001016139aa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a0f816139da565b8114613a1a57600080fd5b50565b600081359050613a2c81613a06565b92915050565b600060208284031215613a4857613a476139d0565b5b6000613a5684828501613a1d565b91505092915050565b60008115159050919050565b613a7481613a5f565b82525050565b6000602082019050613a8f6000830184613a6b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613acf578082015181840152602081019050613ab4565b83811115613ade576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b0082613a95565b613b0a8185613aa0565b9350613b1a818560208601613ab1565b613b2381613ae4565b840191505092915050565b60006020820190508181036000830152613b488184613af5565b905092915050565b6000819050919050565b613b6381613b50565b8114613b6e57600080fd5b50565b600081359050613b8081613b5a565b92915050565b600060208284031215613b9c57613b9b6139d0565b5b6000613baa84828501613b71565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bde82613bb3565b9050919050565b613bee81613bd3565b82525050565b6000602082019050613c096000830184613be5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c3457613c33613c0f565b5b8235905067ffffffffffffffff811115613c5157613c50613c14565b5b602083019150836001820283011115613c6d57613c6c613c19565b5b9250929050565b60008060008060608587031215613c8e57613c8d6139d0565b5b6000613c9c87828801613b71565b9450506020613cad87828801613b71565b935050604085013567ffffffffffffffff811115613cce57613ccd6139d5565b5b613cda87828801613c1e565b925092505092959194509250565b613cf181613bd3565b8114613cfc57600080fd5b50565b600081359050613d0e81613ce8565b92915050565b60008060408385031215613d2b57613d2a6139d0565b5b6000613d3985828601613cff565b9250506020613d4a85828601613b71565b9150509250929050565b613d5d81613b50565b82525050565b6000602082019050613d786000830184613d54565b92915050565b600080600060608486031215613d9757613d966139d0565b5b6000613da586828701613cff565b9350506020613db686828701613cff565b9250506040613dc786828701613b71565b9150509250925092565b6000819050919050565b613de481613dd1565b8114613def57600080fd5b50565b600081359050613e0181613ddb565b92915050565b600060208284031215613e1d57613e1c6139d0565b5b6000613e2b84828501613df2565b91505092915050565b613e3d81613dd1565b82525050565b6000602082019050613e586000830184613e34565b92915050565b60008060408385031215613e7557613e746139d0565b5b6000613e8385828601613df2565b9250506020613e9485828601613cff565b9150509250929050565b60008083601f840112613eb457613eb3613c0f565b5b8235905067ffffffffffffffff811115613ed157613ed0613c14565b5b602083019150836020820283011115613eed57613eec613c19565b5b9250929050565b60008083601f840112613f0a57613f09613c0f565b5b8235905067ffffffffffffffff811115613f2757613f26613c14565b5b602083019150836020820283011115613f4357613f42613c19565b5b9250929050565b60008060008060408587031215613f6457613f636139d0565b5b600085013567ffffffffffffffff811115613f8257613f816139d5565b5b613f8e87828801613e9e565b9450945050602085013567ffffffffffffffff811115613fb157613fb06139d5565b5b613fbd87828801613ef4565b925092505092959194509250565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61400882613ae4565b810181811067ffffffffffffffff8211171561402757614026613fd0565b5b80604052505050565b600061403a6139c6565b90506140468282613fff565b919050565b600067ffffffffffffffff82111561406657614065613fd0565b5b61406f82613ae4565b9050602081019050919050565b82818337600083830152505050565b600061409e6140998461404b565b614030565b9050828152602081018484840111156140ba576140b9613fcb565b5b6140c584828561407c565b509392505050565b600082601f8301126140e2576140e1613c0f565b5b81356140f284826020860161408b565b91505092915050565b600060208284031215614111576141106139d0565b5b600082013567ffffffffffffffff81111561412f5761412e6139d5565b5b61413b848285016140cd565b91505092915050565b60006020828403121561415a576141596139d0565b5b600061416884828501613cff565b91505092915050565b61417a81613a5f565b811461418557600080fd5b50565b60008135905061419781614171565b92915050565b600080604083850312156141b4576141b36139d0565b5b60006141c285828601613cff565b92505060206141d385828601614188565b9150509250929050565b600067ffffffffffffffff8211156141f8576141f7613fd0565b5b61420182613ae4565b9050602081019050919050565b600061422161421c846141dd565b614030565b90508281526020810184848401111561423d5761423c613fcb565b5b61424884828561407c565b509392505050565b600082601f83011261426557614264613c0f565b5b813561427584826020860161420e565b91505092915050565b60008060008060808587031215614298576142976139d0565b5b60006142a687828801613cff565b94505060206142b787828801613cff565b93505060406142c887828801613b71565b925050606085013567ffffffffffffffff8111156142e9576142e86139d5565b5b6142f587828801614250565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061434157614340614301565b5b50565b600081905061435282614330565b919050565b600061436282614344565b9050919050565b61437281614357565b82525050565b600060208201905061438d6000830184614369565b92915050565b6000806000806000608086880312156143af576143ae6139d0565b5b60006143bd88828901613cff565b95505060206143ce88828901613b71565b94505060406143df88828901613b71565b935050606086013567ffffffffffffffff811115614400576143ff6139d5565b5b61440c88828901613c1e565b92509250509295509295909350565b60008060408385031215614432576144316139d0565b5b600061444085828601613cff565b925050602061445185828601613cff565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144a257607f821691505b6020821081036144b5576144b461445b565b5b50919050565b60006040820190506144d06000830185614369565b6144dd6020830184614369565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061451e82613b50565b915061452983613b50565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614562576145616144e4565b5b828202905092915050565b600061457882613b50565b915061458383613b50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145b8576145b76144e4565b5b828201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061461f602f83613aa0565b915061462a826145c3565b604082019050919050565b6000602082019050818103600083015261464e81614612565b9050919050565b600081905092915050565b50565b6000614670600083614655565b915061467b82614660565b600082019050919050565b600061469182614663565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006146d582613b50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614707576147066144e4565b5b600182019050919050565b600081905092915050565b600061472882613a95565b6147328185614712565b9350614742818560208601613ab1565b80840191505092915050565b600061475a828561471d565b9150614766828461471d565b91508190509392505050565b60006080820190506147876000830187613e34565b6147946020830186613be5565b6147a16040830185613d54565b6147ae6060830184613d54565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006147ed601783614712565b91506147f8826147b7565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614839601183614712565b915061484482614803565b601182019050919050565b600061485a826147e0565b9150614866828561471d565b91506148718261482c565b915061487d828461471d565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006148b082614889565b6148ba8185614894565b93506148ca818560208601613ab1565b6148d381613ae4565b840191505092915050565b60006080820190506148f36000830187613be5565b6149006020830186613be5565b61490d6040830185613d54565b818103606083015261491f81846148a5565b905095945050505050565b60008151905061493981613a06565b92915050565b600060208284031215614955576149546139d0565b5b60006149638482850161492a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149a682613b50565b91506149b183613b50565b9250826149c1576149c061496c565b5b828204905092915050565b60006149d782613b50565b91506149e283613b50565b9250828210156149f5576149f46144e4565b5b828203905092915050565b6000614a0b82613b50565b9150614a1683613b50565b925082614a2657614a2561496c565b5b828206905092915050565b6000614a3c82613b50565b915060008203614a4f57614a4e6144e4565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614a90602083613aa0565b9150614a9b82614a5a565b602082019050919050565b60006020820190508181036000830152614abf81614a83565b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614afc601883613aa0565b9150614b0782614ac6565b602082019050919050565b60006020820190508181036000830152614b2b81614aef565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614b68601f83613aa0565b9150614b7382614b32565b602082019050919050565b60006020820190508181036000830152614b9781614b5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bfa602283613aa0565b9150614c0582614b9e565b604082019050919050565b60006020820190508181036000830152614c2981614bed565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c8c602283613aa0565b9150614c9782614c30565b604082019050919050565b60006020820190508181036000830152614cbb81614c7f565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614cf8600283614712565b9150614d0382614cc2565b600282019050919050565b6000819050919050565b614d29614d2482613dd1565b614d0e565b82525050565b6000614d3a82614ceb565b9150614d468285614d18565b602082019150614d568284614d18565b6020820191508190509392505050565b600060ff82169050919050565b614d7c81614d66565b82525050565b6000608082019050614d976000830187613e34565b614da46020830186614d73565b614db16040830185613e34565b614dbe6060830184613e34565b95945050505050565b600060a082019050614ddc6000830188613e34565b614de96020830187613e34565b614df66040830186613e34565b614e036060830185613d54565b614e106080830184613be5565b969550505050505056fea2646970667358221220a0cf5b986d890096288cc6d9646e47512ea381bf8eea8c8c339d613722dcbafc64736f6c634300080d0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000094d4554414e4f4953450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000546533336300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005312e302e30000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c806385f438c111610139578063c002d23d116100b6578063d53913931161007a578063d5391393146108d9578063d547741f14610904578063e268e4d31461092d578063e8a3d48514610956578063e985e9c514610981578063f5b541a6146109be57610251565b8063c002d23d146107cc578063c486456c146107f7578063c87b56dd14610822578063cb204c5e1461085f578063cd5d49741461089c57610251565b8063a1448194116100fd578063a1448194146106fb578063a1ebf35d14610724578063a217fddf1461074f578063a22cb4651461077a578063b88d4fde146107a357610251565b806385f438c11461061657806391b7f5ed1461064157806391d148541461066a578063938e3d7b146106a757806395d89b41146106d057610251565b80632f2ff15d116101d257806348d6010d1161019657806348d6010d146104e45780634f558e791461050d57806355f804b31461054a5780636352211e146105735780636f8b44b0146105b057806370a08231146105d957610251565b80632f2ff15d1461042757806332cb6b0c1461045057806336568abe1461047b5780633ccfd60b146104a457806342842e0e146104bb57610251565b80630f2cdd6c116102195780630f2cdd6c1461034057806312065fe01461036b57806318160ddd1461039657806323b872dd146103c1578063248a9ca3146103ea57610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be57806308dc9f42146102fb578063095ea7b314610317575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613a32565b6109e9565b60405161028a9190613a7a565b60405180910390f35b34801561029f57600080fd5b506102a86109fb565b6040516102b59190613b2e565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190613b86565b610a8d565b6040516102f29190613bf4565b60405180910390f35b61031560048036038101906103109190613c74565b610b09565b005b34801561032357600080fd5b5061033e60048036038101906103399190613d14565b610f8f565b005b34801561034c57600080fd5b50610355611099565b6040516103629190613d63565b60405180910390f35b34801561037757600080fd5b5061038061109f565b60405161038d9190613d63565b60405180910390f35b3480156103a257600080fd5b506103ab6110a7565b6040516103b89190613d63565b60405180910390f35b3480156103cd57600080fd5b506103e860048036038101906103e39190613d7e565b6110be565b005b3480156103f657600080fd5b50610411600480360381019061040c9190613e07565b6110ce565b60405161041e9190613e43565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190613e5e565b6110ee565b005b34801561045c57600080fd5b50610465611117565b6040516104729190613d63565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613e5e565b61111d565b005b3480156104b057600080fd5b506104b96111a0565b005b3480156104c757600080fd5b506104e260048036038101906104dd9190613d7e565b6112b9565b005b3480156104f057600080fd5b5061050b60048036038101906105069190613f4a565b6112d9565b005b34801561051957600080fd5b50610534600480360381019061052f9190613b86565b6113cd565b6040516105419190613a7a565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c91906140fb565b6113df565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613b86565b61142c565b6040516105a79190613bf4565b60405180910390f35b3480156105bc57600080fd5b506105d760048036038101906105d29190613b86565b611442565b005b3480156105e557600080fd5b5061060060048036038101906105fb9190614144565b61147f565b60405161060d9190613d63565b60405180910390f35b34801561062257600080fd5b5061062b61154e565b6040516106389190613e43565b60405180910390f35b34801561064d57600080fd5b5061066860048036038101906106639190613b86565b611572565b005b34801561067657600080fd5b50610691600480360381019061068c9190613e5e565b6115af565b60405161069e9190613a7a565b60405180910390f35b3480156106b357600080fd5b506106ce60048036038101906106c991906140fb565b61161a565b005b3480156106dc57600080fd5b506106e5611667565b6040516106f29190613b2e565b60405180910390f35b34801561070757600080fd5b50610722600480360381019061071d9190613d14565b6116f9565b005b34801561073057600080fd5b5061073961174a565b6040516107469190613e43565b60405180910390f35b34801561075b57600080fd5b5061076461176e565b6040516107719190613e43565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c919061419d565b611775565b005b3480156107af57600080fd5b506107ca60048036038101906107c5919061427e565b6118ec565b005b3480156107d857600080fd5b506107e1611968565b6040516107ee9190613d63565b60405180910390f35b34801561080357600080fd5b5061080c61196e565b6040516108199190614378565b60405180910390f35b34801561082e57600080fd5b5061084960048036038101906108449190613b86565b611981565b6040516108569190613b2e565b60405180910390f35b34801561086b57600080fd5b5061088660048036038101906108819190614144565b611a1f565b6040516108939190613d63565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be9190614393565b611a68565b6040516108d09190613bf4565b60405180910390f35b3480156108e557600080fd5b506108ee611ad2565b6040516108fb9190613e43565b60405180910390f35b34801561091057600080fd5b5061092b60048036038101906109269190613e5e565b611af6565b005b34801561093957600080fd5b50610954600480360381019061094f9190613b86565b611b1f565b005b34801561096257600080fd5b5061096b611b5c565b6040516109789190613b2e565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a3919061441b565b611bee565b6040516109b59190613a7a565b60405180910390f35b3480156109ca57600080fd5b506109d3611c82565b6040516109e09190613e43565b60405180910390f35b60006109f482611ca6565b9050919050565b606060028054610a0a9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a369061448a565b8015610a835780601f10610a5857610100808354040283529160200191610a83565b820191906000526020600020905b815481529060010190602001808311610a6657829003601f168201915b5050505050905090565b6000610a9882611d20565b610ace576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006002811115610b1d57610b1c614301565b5b600960009054906101000a900460ff166002811115610b3f57610b3e614301565b5b14610b9357600960009054906101000a900460ff1660006040517fca8dc8ed000000000000000000000000000000000000000000000000000000008152600401610b8a9291906144bb565b60405180910390fd5b60008403610bcd576040517f4ff64a9f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600c54610bdb9190614513565b341015610c14576040517f64975f7000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5484600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c62919061456d565b1115610c9a576040517f916dd30800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610ca46110a7565b9050600a548582610cb5919061456d565b1115610ced576040517ffb72321800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610cfa338787611d6e565b9050610d4a8185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611dce565b610d80576040517fcd2467c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dce8185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611dce565b610e04576040517fcd2467c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e9d576040517f85ee5abf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ea73387611e0b565b85600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ef2919061456d565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555033600d600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b6000610f9a8261142c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611001576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611020611e29565b73ffffffffffffffffffffffffffffffffffffffff161415801561105257506110508161104b611e29565b611bee565b155b15611089576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611094838383611e31565b505050565b600b5481565b600047905090565b60006110b1611ee3565b6001546000540303905090565b6110c9838383611ee8565b505050565b600060086000838152602001908152602001600020600101549050919050565b6110f7826110ce565b61110881611103611e29565b61239c565b6111128383612439565b505050565b600a5481565b611125611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990614635565b60405180910390fd5b61119c828261251a565b5050565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e46111d2816111cd611e29565b61239c565b600047905060008103611211576040517fad4ea8a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff168260405161123790614686565b60006040518083038185875af1925050503d8060008114611274576040519150601f19603f3d011682016040523d82523d6000602084013e611279565b606091505b50509050806112b4576040517fd477157400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b6112d4838383604051806020016040528060008152506118ec565b505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661130b81611306611e29565b61239c565b82829050858590501461134a576040517f7ae8a45c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b858590508110156113c5576113b286868381811061136e5761136d61469b565b5b90506020020160208101906113839190614144565b8585848181106113965761139561469b565b5b90506020020135604051806020016040528060008152506125fc565b80806113bd906146ca565b91505061134d565b505050505050565b60006113d882611d20565b9050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296114118161140c611e29565b61239c565b81600f90805190602001906114279291906138e0565b505050565b60006114378261260e565b600001519050919050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296114748161146f611e29565b61239c565b81600a819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114e6576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b7f10dac8c06a04bec0b551627dad28bc00d6516b0caacd1c7b345fcdb5211334e481565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296115a48161159f611e29565b61239c565b81600c819055505050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92961164c81611647611e29565b61239c565b81601090805190602001906116629291906138e0565b505050565b6060600380546116769061448a565b80601f01602080910402602001604051908101604052809291908181526020018280546116a29061448a565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661172b81611726611e29565b61239c565b6117458383604051806020016040528060008152506125fc565b505050565b7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7081565b6000801b81565b61177d611e29565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117e1576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006117ee611e29565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661189b611e29565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118e09190613a7a565b60405180910390a35050565b6118f7848484611ee8565b6119168373ffffffffffffffffffffffffffffffffffffffff1661289d565b801561192b5750611929848484846128c0565b155b15611962576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c5481565b600960009054906101000a900460ff1681565b606061198c82611d20565b6119c2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006119cc612a10565b905060008151036119ec5760405180602001604052806000815250611a17565b806119f684612aa2565b604051602001611a0792919061474e565b6040516020818303038152906040525b915050919050565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080611a76878787611d6e565b9050611ac68185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612c02565b91505095945050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611aff826110ce565b611b1081611b0b611e29565b61239c565b611b1a838361251a565b505050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929611b5181611b4c611e29565b61239c565b81600b819055505050565b606060108054611b6b9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054611b979061448a565b8015611be45780601f10611bb957610100808354040283529160200191611be4565b820191906000526020600020905b815481529060010190602001808311611bc757829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92981565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d195750611d1882612c29565b5b9050919050565b600081611d2b611ee3565b11158015611d3a575060005482105b8015611d67575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b6000611dc57f9a7c5cc02e83ca93d4cb86c8007b00922a3b7b815c917377d84c06bbd7cf8397858585604051602001611daa9493929190614772565b60405160208183030381529060405280519060200120612d0b565b90509392505050565b6000611e037fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f70611dfe8585612c02565b6115af565b905092915050565b611e258282604051806020016040528060008152506125fc565b5050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611ef38261260e565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f5e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f7f611e29565b73ffffffffffffffffffffffffffffffffffffffff161480611fae5750611fad85611fa8611e29565b611bee565b5b80611ff35750611fbc611e29565b73ffffffffffffffffffffffffffffffffffffffff16611fdb84610a8d565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061202c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612092576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61209f8585856001612d25565b6120ab60008487611e31565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361232a57600054821461232957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123958585856001612d2b565b5050505050565b6123a682826115af565b612435576123cb8173ffffffffffffffffffffffffffffffffffffffff166014612d31565b6123d98360001c6020612d31565b6040516020016123ea92919061484f565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242c9190613b2e565b60405180910390fd5b5050565b61244382826115af565b6125165760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124bb611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61252482826115af565b156125f85760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061259d611e29565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6126098383836001612f6d565b505050565b612616613966565b600082905080612624611ee3565b11158015612633575060005481105b15612866576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161286457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612748578092505050612898565b5b60011561286357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461285e578092505050612898565b612749565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128e6611e29565b8786866040518563ffffffff1660e01b815260040161290894939291906148de565b6020604051808303816000875af192505050801561294457506040513d601f19601f82011682018060405250810190612941919061493f565b60015b6129bd573d8060008114612974576040519150601f19603f3d011682016040523d82523d6000602084013e612979565b606091505b5060008151036129b5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f8054612a1f9061448a565b80601f0160208091040260200160405190810160405280929190818152602001828054612a4b9061448a565b8015612a985780601f10612a6d57610100808354040283529160200191612a98565b820191906000526020600020905b815481529060010190602001808311612a7b57829003601f168201915b5050505050905090565b606060008203612ae9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bfd565b600082905060005b60008214612b1b578080612b04906146ca565b915050600a82612b14919061499b565b9150612af1565b60008167ffffffffffffffff811115612b3757612b36613fd0565b5b6040519080825280601f01601f191660200182016040528015612b695781602001600182028036833780820191505090505b5090505b60008514612bf657600182612b8291906149cc565b9150600a85612b919190614a00565b6030612b9d919061456d565b60f81b818381518110612bb357612bb261469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bef919061499b565b9450612b6d565b8093505050505b919050565b6000806000612c118585613337565b91509150612c1e816133b8565b819250505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cf457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d045750612d0382613584565b5b9050919050565b6000612d1e612d186135ee565b83613708565b9050919050565b50505050565b50505050565b606060006002836002612d449190614513565b612d4e919061456d565b67ffffffffffffffff811115612d6757612d66613fd0565b5b6040519080825280601f01601f191660200182016040528015612d995781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612dd157612dd061469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e3557612e3461469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612e759190614513565b612e7f919061456d565b90505b6001811115612f1f577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ec157612ec061469b565b5b1a60f81b828281518110612ed857612ed761469b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f1890614a31565b9050612e82565b5060008414612f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5a90614aa6565b60405180910390fd5b8091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612fd9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613013576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130206000868387612d25565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156131ea57506131e98773ffffffffffffffffffffffffffffffffffffffff1661289d565b5b156132af575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461325f60008884806001019550886128c0565b613295576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036131f05782600054146132aa57600080fd5b61331a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036132b0575b8160008190555050506133306000868387612d2b565b5050505050565b60008060418351036133785760008060006020860151925060408601519150606086015160001a905061336c8782858561373b565b945094505050506133b1565b60408351036133a857600080602085015191506040850151905061339d868383613847565b9350935050506133b1565b60006002915091505b9250929050565b600060048111156133cc576133cb614301565b5b8160048111156133df576133de614301565b5b031561358157600160048111156133f9576133f8614301565b5b81600481111561340c5761340b614301565b5b0361344c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344390614b12565b60405180910390fd5b600260048111156134605761345f614301565b5b81600481111561347357613472614301565b5b036134b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134aa90614b7e565b60405180910390fd5b600360048111156134c7576134c6614301565b5b8160048111156134da576134d9614301565b5b0361351a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351190614c10565b60405180910390fd5b60048081111561352d5761352c614301565b5b8160048111156135405761353f614301565b5b03613580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357790614ca2565b60405180910390fd5b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60007f000000000000000000000000638590d2b73f975a4bb5d9f2f93b69bf3422159c73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561366a57507f000000000000000000000000000000000000000000000000000000000000000146145b15613697577fbdd5ab4952b0c4282ffb41c1716433b0e688108e6e6a5d95783f5c75ed6b1ede9050613705565b6137027f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f5f7a2f72ac220b8a913f2555f054d49aa4e67a91624ca858a955262492280b397f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c6138a6565b90505b90565b6000828260405160200161371d929190614d2f565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561377657600060039150915061383e565b601b8560ff161415801561378e5750601c8560ff1614155b156137a057600060049150915061383e565b6000600187878787604051600081526020016040526040516137c59493929190614d82565b6020604051602081039080840390855afa1580156137e7573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036138355760006001925092505061383e565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61388a919061456d565b90506138988782888561373b565b935093505050935093915050565b600083838346306040516020016138c1959493929190614dc7565b6040516020818303038152906040528051906020012090509392505050565b8280546138ec9061448a565b90600052602060002090601f01602090048101928261390e5760008555613955565b82601f1061392757805160ff1916838001178555613955565b82800160010185558215613955579182015b82811115613954578251825591602001919060010190613939565b5b50905061396291906139a9565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156139c25760008160009055506001016139aa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a0f816139da565b8114613a1a57600080fd5b50565b600081359050613a2c81613a06565b92915050565b600060208284031215613a4857613a476139d0565b5b6000613a5684828501613a1d565b91505092915050565b60008115159050919050565b613a7481613a5f565b82525050565b6000602082019050613a8f6000830184613a6b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613acf578082015181840152602081019050613ab4565b83811115613ade576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b0082613a95565b613b0a8185613aa0565b9350613b1a818560208601613ab1565b613b2381613ae4565b840191505092915050565b60006020820190508181036000830152613b488184613af5565b905092915050565b6000819050919050565b613b6381613b50565b8114613b6e57600080fd5b50565b600081359050613b8081613b5a565b92915050565b600060208284031215613b9c57613b9b6139d0565b5b6000613baa84828501613b71565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bde82613bb3565b9050919050565b613bee81613bd3565b82525050565b6000602082019050613c096000830184613be5565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613c3457613c33613c0f565b5b8235905067ffffffffffffffff811115613c5157613c50613c14565b5b602083019150836001820283011115613c6d57613c6c613c19565b5b9250929050565b60008060008060608587031215613c8e57613c8d6139d0565b5b6000613c9c87828801613b71565b9450506020613cad87828801613b71565b935050604085013567ffffffffffffffff811115613cce57613ccd6139d5565b5b613cda87828801613c1e565b925092505092959194509250565b613cf181613bd3565b8114613cfc57600080fd5b50565b600081359050613d0e81613ce8565b92915050565b60008060408385031215613d2b57613d2a6139d0565b5b6000613d3985828601613cff565b9250506020613d4a85828601613b71565b9150509250929050565b613d5d81613b50565b82525050565b6000602082019050613d786000830184613d54565b92915050565b600080600060608486031215613d9757613d966139d0565b5b6000613da586828701613cff565b9350506020613db686828701613cff565b9250506040613dc786828701613b71565b9150509250925092565b6000819050919050565b613de481613dd1565b8114613def57600080fd5b50565b600081359050613e0181613ddb565b92915050565b600060208284031215613e1d57613e1c6139d0565b5b6000613e2b84828501613df2565b91505092915050565b613e3d81613dd1565b82525050565b6000602082019050613e586000830184613e34565b92915050565b60008060408385031215613e7557613e746139d0565b5b6000613e8385828601613df2565b9250506020613e9485828601613cff565b9150509250929050565b60008083601f840112613eb457613eb3613c0f565b5b8235905067ffffffffffffffff811115613ed157613ed0613c14565b5b602083019150836020820283011115613eed57613eec613c19565b5b9250929050565b60008083601f840112613f0a57613f09613c0f565b5b8235905067ffffffffffffffff811115613f2757613f26613c14565b5b602083019150836020820283011115613f4357613f42613c19565b5b9250929050565b60008060008060408587031215613f6457613f636139d0565b5b600085013567ffffffffffffffff811115613f8257613f816139d5565b5b613f8e87828801613e9e565b9450945050602085013567ffffffffffffffff811115613fb157613fb06139d5565b5b613fbd87828801613ef4565b925092505092959194509250565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61400882613ae4565b810181811067ffffffffffffffff8211171561402757614026613fd0565b5b80604052505050565b600061403a6139c6565b90506140468282613fff565b919050565b600067ffffffffffffffff82111561406657614065613fd0565b5b61406f82613ae4565b9050602081019050919050565b82818337600083830152505050565b600061409e6140998461404b565b614030565b9050828152602081018484840111156140ba576140b9613fcb565b5b6140c584828561407c565b509392505050565b600082601f8301126140e2576140e1613c0f565b5b81356140f284826020860161408b565b91505092915050565b600060208284031215614111576141106139d0565b5b600082013567ffffffffffffffff81111561412f5761412e6139d5565b5b61413b848285016140cd565b91505092915050565b60006020828403121561415a576141596139d0565b5b600061416884828501613cff565b91505092915050565b61417a81613a5f565b811461418557600080fd5b50565b60008135905061419781614171565b92915050565b600080604083850312156141b4576141b36139d0565b5b60006141c285828601613cff565b92505060206141d385828601614188565b9150509250929050565b600067ffffffffffffffff8211156141f8576141f7613fd0565b5b61420182613ae4565b9050602081019050919050565b600061422161421c846141dd565b614030565b90508281526020810184848401111561423d5761423c613fcb565b5b61424884828561407c565b509392505050565b600082601f83011261426557614264613c0f565b5b813561427584826020860161420e565b91505092915050565b60008060008060808587031215614298576142976139d0565b5b60006142a687828801613cff565b94505060206142b787828801613cff565b93505060406142c887828801613b71565b925050606085013567ffffffffffffffff8111156142e9576142e86139d5565b5b6142f587828801614250565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061434157614340614301565b5b50565b600081905061435282614330565b919050565b600061436282614344565b9050919050565b61437281614357565b82525050565b600060208201905061438d6000830184614369565b92915050565b6000806000806000608086880312156143af576143ae6139d0565b5b60006143bd88828901613cff565b95505060206143ce88828901613b71565b94505060406143df88828901613b71565b935050606086013567ffffffffffffffff811115614400576143ff6139d5565b5b61440c88828901613c1e565b92509250509295509295909350565b60008060408385031215614432576144316139d0565b5b600061444085828601613cff565b925050602061445185828601613cff565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806144a257607f821691505b6020821081036144b5576144b461445b565b5b50919050565b60006040820190506144d06000830185614369565b6144dd6020830184614369565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061451e82613b50565b915061452983613b50565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614562576145616144e4565b5b828202905092915050565b600061457882613b50565b915061458383613b50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156145b8576145b76144e4565b5b828201905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600061461f602f83613aa0565b915061462a826145c3565b604082019050919050565b6000602082019050818103600083015261464e81614612565b9050919050565b600081905092915050565b50565b6000614670600083614655565b915061467b82614660565b600082019050919050565b600061469182614663565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006146d582613b50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614707576147066144e4565b5b600182019050919050565b600081905092915050565b600061472882613a95565b6147328185614712565b9350614742818560208601613ab1565b80840191505092915050565b600061475a828561471d565b9150614766828461471d565b91508190509392505050565b60006080820190506147876000830187613e34565b6147946020830186613be5565b6147a16040830185613d54565b6147ae6060830184613d54565b95945050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b60006147ed601783614712565b91506147f8826147b7565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614839601183614712565b915061484482614803565b601182019050919050565b600061485a826147e0565b9150614866828561471d565b91506148718261482c565b915061487d828461471d565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006148b082614889565b6148ba8185614894565b93506148ca818560208601613ab1565b6148d381613ae4565b840191505092915050565b60006080820190506148f36000830187613be5565b6149006020830186613be5565b61490d6040830185613d54565b818103606083015261491f81846148a5565b905095945050505050565b60008151905061493981613a06565b92915050565b600060208284031215614955576149546139d0565b5b60006149638482850161492a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006149a682613b50565b91506149b183613b50565b9250826149c1576149c061496c565b5b828204905092915050565b60006149d782613b50565b91506149e283613b50565b9250828210156149f5576149f46144e4565b5b828203905092915050565b6000614a0b82613b50565b9150614a1683613b50565b925082614a2657614a2561496c565b5b828206905092915050565b6000614a3c82613b50565b915060008203614a4f57614a4e6144e4565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614a90602083613aa0565b9150614a9b82614a5a565b602082019050919050565b60006020820190508181036000830152614abf81614a83565b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000614afc601883613aa0565b9150614b0782614ac6565b602082019050919050565b60006020820190508181036000830152614b2b81614aef565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000614b68601f83613aa0565b9150614b7382614b32565b602082019050919050565b60006020820190508181036000830152614b9781614b5b565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bfa602283613aa0565b9150614c0582614b9e565b604082019050919050565b60006020820190508181036000830152614c2981614bed565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000614c8c602283613aa0565b9150614c9782614c30565b604082019050919050565b60006020820190508181036000830152614cbb81614c7f565b9050919050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000614cf8600283614712565b9150614d0382614cc2565b600282019050919050565b6000819050919050565b614d29614d2482613dd1565b614d0e565b82525050565b6000614d3a82614ceb565b9150614d468285614d18565b602082019150614d568284614d18565b6020820191508190509392505050565b600060ff82169050919050565b614d7c81614d66565b82525050565b6000608082019050614d976000830187613e34565b614da46020830186614d73565b614db16040830185613e34565b614dbe6060830184613e34565b95945050505050565b600060a082019050614ddc6000830188613e34565b614de96020830187613e34565b614df66040830186613e34565b614e036060830185613d54565b614e106080830184613be5565b969550505050505056fea2646970667358221220a0cf5b986d890096288cc6d9646e47512ea381bf8eea8c8c339d613722dcbafc64736f6c634300080d0033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000094d4554414e4f4953450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000546533336300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005312e302e30000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): METANOISE
Arg [1] : symbol (string): FS360
Arg [2] : version (string): 1.0.0

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 4d4554414e4f4953450000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 4653333630000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [8] : 312e302e30000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

131730:5665:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137223:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27321:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28824:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;134050:1195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28387:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;131949:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133941:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23457:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29689:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48980:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49373:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;131911:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50421:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;136883:332;;;;;;;;;;;;;:::i;:::-;;29930:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;133203:314;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;135763:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;135987:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27129:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;135364:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24577:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132382:70;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;135253:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47849:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;136113:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27490:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133525:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;132313:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46940:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29100:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30186:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;131990:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;131886:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27665:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;135487:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;133654:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132171:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49765:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;135627:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;136301:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29458:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;132240:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;137223:169;137324:4;137348:36;137372:11;137348:23;:36::i;:::-;137341:43;;137223:169;;;:::o;27321:100::-;27375:13;27408:5;27401:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27321:100;:::o;28824:204::-;28892:7;28917:16;28925:7;28917;:16::i;:::-;28912:64;;28942:34;;;;;;;;;;;;;;28912:64;28996:15;:24;29012:7;28996:24;;;;;;;;;;;;;;;;;;;;;28989:31;;28824:204;;;:::o;134050:1195::-;134196:16;134187:25;;;;;;;;:::i;:::-;;:5;;;;;;;;;;;:25;;;;;;;;:::i;:::-;;;134183:100;;134247:5;;;;;;;;;;;134254:16;134236:35;;;;;;;;;;;;:::i;:::-;;;;;;;;134183:100;134309:1;134299:6;:11;134295:64;;134334:13;;;;;;;;;;;;;;134295:64;134401:6;134388:10;;:19;;;;:::i;:::-;134375:9;:33;134371:95;;;134432:22;;;;;;;;;;;;;;134371:95;134519:14;;134510:6;134482:13;:25;134496:10;134482:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:51;134478:110;;;134557:19;;;;;;;;;;;;;;134478:110;134600:21;134624:13;:11;:13::i;:::-;134600:37;;134681:10;;134671:6;134655:13;:22;;;;:::i;:::-;134654:37;134650:93;;;134715:16;;;;;;;;;;;;;;134650:93;134755:12;134770:32;134776:10;134788:6;134796:5;134770;:32::i;:::-;134755:47;;134818:24;134826:4;134832:9;;134818:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:24::i;:::-;134813:81;;134866:16;;;;;;;;;;;;;;134813:81;134911:24;134919:4;134925:9;;134911:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:24::i;:::-;134906:81;;134959:16;;;;;;;;;;;;;;134906:81;135028:1;135003:27;;:7;:13;135011:4;135003:13;;;;;;;;;;;;;;;;;;;;;:27;;;134999:89;;135054:22;;;;;;;;;;;;;;134999:89;135098:29;135108:10;135120:6;135098:9;:29::i;:::-;135194:6;135166:13;:25;135180:10;135166:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;135138:13;:25;135152:10;135138:25;;;;;;;;;;;;;;;:62;;;;135227:10;135211:7;:13;135219:4;135211:13;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;134172:1073;;134050:1195;;;;:::o;28387:371::-;28460:13;28476:24;28492:7;28476:15;:24::i;:::-;28460:40;;28521:5;28515:11;;:2;:11;;;28511:48;;28535:24;;;;;;;;;;;;;;28511:48;28592:5;28576:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28602:37;28619:5;28626:12;:10;:12::i;:::-;28602:16;:37::i;:::-;28601:38;28576:63;28572:138;;;28663:35;;;;;;;;;;;;;;28572:138;28722:28;28731:2;28735:7;28744:5;28722:8;:28::i;:::-;28449:309;28387:371;;:::o;131949:34::-;;;;:::o;133941:101::-;133986:7;134013:21;134006:28;;133941:101;:::o;23457:303::-;23501:7;23726:15;:13;:15::i;:::-;23711:12;;23695:13;;:28;:46;23688:53;;23457:303;:::o;29689:170::-;29823:28;29833:4;29839:2;29843:7;29823:9;:28::i;:::-;29689:170;;;:::o;48980:131::-;49054:7;49081:6;:12;49088:4;49081:12;;;;;;;;;;;:22;;;49074:29;;48980:131;;;:::o;49373:147::-;49456:18;49469:4;49456:12;:18::i;:::-;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;49487:25:::1;49498:4;49504:7;49487:10;:25::i;:::-;49373:147:::0;;;:::o;131911:31::-;;;;:::o;50421:218::-;50528:12;:10;:12::i;:::-;50517:23;;:7;:23;;;50509:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;50605:26;50617:4;50623:7;50605:11;:26::i;:::-;50421:218;;:::o;136883:332::-;132424:28;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;136949:15:::1;136967:21;136949:39;;137014:1;137003:7;:12:::0;136999:66:::1;;137039:14;;;;;;;;;;;;;;136999:66;137078:9;137101:10;137093:24;;137125:7;137093:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137077:60;;;137153:4;137148:60;;137181:15;;;;;;;;;;;;;;137148:60;136938:277;;136883:332:::0;:::o;29930:185::-;30068:39;30085:4;30091:2;30095:7;30068:39;;;;;;;;;;;;:16;:39::i;:::-;29930:185;;;:::o;133203:314::-;132209:24;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;133335:6:::1;;:13;;133322:2;;:9;;:26;133318:82;;133372:16;;;;;;;;;;;;;;133318:82;133417:9;133412:98;133436:2;;:9;;133432:1;:13;133412:98;;;133467:31;133477:2;;133480:1;133477:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;133484:6;;133491:1;133484:9;;;;;;;:::i;:::-;;;;;;;;133467:31;;;;;;;;;;;::::0;:9:::1;:31::i;:::-;133447:3;;;;;:::i;:::-;;;;133412:98;;;;133203:314:::0;;;;;:::o;135763:108::-;135817:4;135841:22;135855:7;135841:13;:22::i;:::-;135834:29;;135763:108;;;:::o;135987:118::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;136086:11:::1;136076:7;:21;;;;;;;;;;;;:::i;:::-;;135987:118:::0;;:::o;27129:125::-;27193:7;27220:21;27233:7;27220:12;:21::i;:::-;:26;;;27213:33;;27129:125;;;:::o;135364:115::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;135462:9:::1;135449:10;:22;;;;135364:115:::0;;:::o;24577:206::-;24641:7;24682:1;24665:19;;:5;:19;;;24661:60;;24693:28;;;;;;;;;;;;;;24661:60;24747:12;:19;24760:5;24747:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;24739:36;;24732:43;;24577:206;;;:::o;132382:70::-;132424:28;132382:70;:::o;135253:103::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;135343:5:::1;135330:10;:18;;;;135253:103:::0;;:::o;47849:147::-;47935:4;47959:6;:12;47966:4;47959:12;;;;;;;;;;;:20;;:29;47980:7;47959:29;;;;;;;;;;;;;;;;;;;;;;;;;47952:36;;47849:147;;;;:::o;136113:135::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;136226:14:::1;136211:12;:29;;;;;;;;;;;;:::i;:::-;;136113:135:::0;;:::o;27490:104::-;27546:13;27579:7;27572:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27490:104;:::o;133525:121::-;132209:24;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;133613:25:::1;133623:2;133627:6;133613:25;;;;;;;;;;;::::0;:9:::1;:25::i;:::-;133525:121:::0;;;:::o;132313:62::-;132351:24;132313:62;:::o;46940:49::-;46985:4;46940:49;;;:::o;29100:287::-;29211:12;:10;:12::i;:::-;29199:24;;:8;:24;;;29195:54;;29232:17;;;;;;;;;;;;;;29195:54;29307:8;29262:18;:32;29281:12;:10;:12::i;:::-;29262:32;;;;;;;;;;;;;;;:42;29295:8;29262:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29360:8;29331:48;;29346:12;:10;:12::i;:::-;29331:48;;;29370:8;29331:48;;;;;;:::i;:::-;;;;;;;;29100:287;;:::o;30186:369::-;30353:28;30363:4;30369:2;30373:7;30353:9;:28::i;:::-;30396:15;:2;:13;;;:15::i;:::-;:76;;;;;30416:56;30447:4;30453:2;30457:7;30466:5;30416:30;:56::i;:::-;30415:57;30396:76;30392:156;;;30496:40;;;;;;;;;;;;;;30392:156;30186:369;;;;:::o;131990:35::-;;;;:::o;131886:18::-;;;;;;;;;;;;;:::o;27665:318::-;27738:13;27769:16;27777:7;27769;:16::i;:::-;27764:59;;27794:29;;;;;;;;;;;;;;27764:59;27836:21;27860:10;:8;:10::i;:::-;27836:34;;27913:1;27894:7;27888:21;:26;:87;;;;;;;;;;;;;;;;;27941:7;27950:18;:7;:16;:18::i;:::-;27924:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27888:87;27881:94;;;27665:318;;;:::o;135487:132::-;135562:7;135589:13;:22;135603:7;135589:22;;;;;;;;;;;;;;;;135582:29;;135487:132;;;:::o;133654:279::-;133813:7;133833:12;133848:29;133854:7;133863:6;133871:5;133848;:29::i;:::-;133833:44;;133895:30;133909:4;133915:9;;133895:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:30::i;:::-;133888:37;;;133654:279;;;;;;;:::o;132171:62::-;132209:24;132171:62;:::o;49765:149::-;49849:18;49862:4;49849:12;:18::i;:::-;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;49880:26:::1;49892:4;49898:7;49880:11;:26::i;:::-;49765:149:::0;;;:::o;135627:128::-;132280:26;47431:30;47442:4;47448:12;:10;:12::i;:::-;47431:10;:30::i;:::-;135735:12:::1;135718:14;:29;;;;135627:128:::0;;:::o;136301:97::-;136345:13;136378:12;136371:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;136301:97;:::o;29458:164::-;29555:4;29579:18;:25;29598:5;29579:25;;;;;;;;;;;;;;;:35;29605:8;29579:35;;;;;;;;;;;;;;;;;;;;;;;;;29572:42;;29458:164;;;;:::o;132240:66::-;132280:26;132240:66;:::o;47553:204::-;47638:4;47677:32;47662:47;;;:11;:47;;;;:87;;;;47713:36;47737:11;47713:23;:36::i;:::-;47662:87;47655:94;;47553:204;;;:::o;30810:174::-;30867:4;30910:7;30891:15;:13;:15::i;:::-;:26;;:53;;;;;30931:13;;30921:7;:23;30891:53;:85;;;;;30949:11;:20;30961:7;30949:20;;;;;;;;;;;:27;;;;;;;;;;;;30948:28;30891:85;30884:92;;30810:174;;;:::o;136406:295::-;136526:7;136566:127;136604:62;136668:7;136677:6;136685:5;136593:98;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;136583:109;;;;;;136566:16;:127::i;:::-;136546:147;;136406:295;;;;;:::o;136709:166::-;136789:4;136813:54;132351:24;136834:32;136848:6;136856:9;136834:13;:32::i;:::-;136813:7;:54::i;:::-;136806:61;;136709:166;;;;:::o;30992:104::-;31061:27;31071:2;31075:8;31061:27;;;;;;;;;;;;:9;:27::i;:::-;30992:104;;:::o;16620:98::-;16673:7;16700:10;16693:17;;16620:98;:::o;38967:196::-;39109:2;39082:15;:24;39098:7;39082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39147:7;39143:2;39127:28;;39136:5;39127:28;;;;;;;;;;;;38967:196;;;:::o;23231:92::-;23287:7;23231:92;:::o;33910:2130::-;34025:35;34063:21;34076:7;34063:12;:21::i;:::-;34025:59;;34123:4;34101:26;;:13;:18;;;:26;;;34097:67;;34136:28;;;;;;;;;;;;;;34097:67;34177:22;34219:4;34203:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34240:36;34257:4;34263:12;:10;:12::i;:::-;34240:16;:36::i;:::-;34203:73;:126;;;;34317:12;:10;:12::i;:::-;34293:36;;:20;34305:7;34293:11;:20::i;:::-;:36;;;34203:126;34177:153;;34348:17;34343:66;;34374:35;;;;;;;;;;;;;;34343:66;34438:1;34424:16;;:2;:16;;;34420:52;;34449:23;;;;;;;;;;;;;;34420:52;34485:43;34507:4;34513:2;34517:7;34526:1;34485:21;:43::i;:::-;34593:35;34610:1;34614:7;34623:4;34593:8;:35::i;:::-;34954:1;34924:12;:18;34937:4;34924:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34998:1;34970:12;:16;34983:2;34970:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35016:31;35050:11;:20;35062:7;35050:20;;;;;;;;;;;35016:54;;35101:2;35085:8;:13;;;:18;;;;;;;;;;;;;;;;;;35151:15;35118:8;:23;;;:49;;;;;;;;;;;;;;;;;;35419:19;35451:1;35441:7;:11;35419:33;;35467:31;35501:11;:24;35513:11;35501:24;;;;;;;;;;;35467:58;;35569:1;35544:27;;:8;:13;;;;;;;;;;;;:27;;;35540:384;;35754:13;;35739:11;:28;35735:174;;35808:4;35792:8;:13;;;:20;;;;;;;;;;;;;;;;;;35861:13;:28;;;35835:8;:23;;;:54;;;;;;;;;;;;;;;;;;35735:174;35540:384;34899:1036;;;35971:7;35967:2;35952:27;;35961:4;35952:27;;;;;;;;;;;;35990:42;36011:4;36017:2;36021:7;36030:1;35990:20;:42::i;:::-;34014:2026;;33910:2130;;;:::o;48286:505::-;48375:22;48383:4;48389:7;48375;:22::i;:::-;48370:414;;48563:41;48591:7;48563:41;;48601:2;48563:19;:41::i;:::-;48677:38;48705:4;48697:13;;48712:2;48677:19;:38::i;:::-;48468:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48414:358;;;;;;;;;;;:::i;:::-;;;;;;;;48370:414;48286:505;;:::o;51922:238::-;52006:22;52014:4;52020:7;52006;:22::i;:::-;52001:152;;52077:4;52045:6;:12;52052:4;52045:12;;;;;;;;;;;:20;;:29;52066:7;52045:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;52128:12;:10;:12::i;:::-;52101:40;;52119:7;52101:40;;52113:4;52101:40;;;;;;;;;;52001:152;51922:238;;:::o;52292:239::-;52376:22;52384:4;52390:7;52376;:22::i;:::-;52372:152;;;52447:5;52415:6;:12;52422:4;52415:12;;;;;;;;;;;:20;;:29;52436:7;52415:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;52499:12;:10;:12::i;:::-;52472:40;;52490:7;52472:40;;52484:4;52472:40;;;;;;;;;;52372:152;52292:239;;:::o;31459:163::-;31582:32;31588:2;31592:8;31602:5;31609:4;31582:5;:32::i;:::-;31459:163;;;:::o;25958:1109::-;26020:21;;:::i;:::-;26054:12;26069:7;26054:22;;26137:4;26118:15;:13;:15::i;:::-;:23;;:47;;;;;26152:13;;26145:4;:20;26118:47;26114:886;;;26186:31;26220:11;:17;26232:4;26220:17;;;;;;;;;;;26186:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26261:9;:16;;;26256:729;;26332:1;26306:28;;:9;:14;;;:28;;;26302:101;;26370:9;26363:16;;;;;;26302:101;26705:261;26712:4;26705:261;;;26745:6;;;;;;;;26790:11;:17;26802:4;26790:17;;;;;;;;;;;26778:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26864:1;26838:28;;:9;:14;;;:28;;;26834:109;;26906:9;26899:16;;;;;;26834:109;26705:261;;;26256:729;26167:833;26114:886;27028:31;;;;;;;;;;;;;;25958:1109;;;;:::o;8686:326::-;8746:4;9003:1;8981:7;:19;;;:23;8974:30;;8686:326;;;:::o;39655:667::-;39818:4;39855:2;39839:36;;;39876:12;:10;:12::i;:::-;39890:4;39896:7;39905:5;39839:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39835:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40090:1;40073:6;:13;:18;40069:235;;40119:40;;;;;;;;;;;;;;40069:235;40262:6;40256:13;40247:6;40243:2;40239:15;40232:38;39835:480;39968:45;;;39958:55;;;:6;:55;;;;39951:62;;;39655:667;;;;;;:::o;135879:100::-;135931:13;135964:7;135957:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;135879:100;:::o;17184:723::-;17240:13;17470:1;17461:5;:10;17457:53;;17488:10;;;;;;;;;;;;;;;;;;;;;17457:53;17520:12;17535:5;17520:20;;17551:14;17576:78;17591:1;17583:4;:9;17576:78;;17609:8;;;;;:::i;:::-;;;;17640:2;17632:10;;;;;:::i;:::-;;;17576:78;;;17664:19;17696:6;17686:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17664:39;;17714:154;17730:1;17721:5;:10;17714:154;;17758:1;17748:11;;;;;:::i;:::-;;;17825:2;17817:5;:10;;;;:::i;:::-;17804:2;:24;;;;:::i;:::-;17791:39;;17774:6;17781;17774:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17854:2;17845:11;;;;;:::i;:::-;;;17714:154;;;17892:6;17878:21;;;;;17184:723;;;;:::o;58388:231::-;58466:7;58487:17;58506:18;58528:27;58539:4;58545:9;58528:10;:27::i;:::-;58486:69;;;;58566:18;58578:5;58566:11;:18::i;:::-;58602:9;58595:16;;;;58388:231;;;;:::o;24208:305::-;24310:4;24362:25;24347:40;;;:11;:40;;;;:105;;;;24419:33;24404:48;;;:11;:48;;;;24347:105;:158;;;;24469:36;24493:11;24469:23;:36::i;:::-;24347:158;24327:178;;24208:305;;;:::o;67945:167::-;68022:7;68049:55;68071:20;:18;:20::i;:::-;68093:10;68049:21;:55::i;:::-;68042:62;;67945:167;;;:::o;40970:159::-;;;;;:::o;41788:158::-;;;;;:::o;18485:451::-;18560:13;18586:19;18631:1;18622:6;18618:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18608:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18586:47;;18644:15;:6;18651:1;18644:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18670;:6;18677:1;18670:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18701:9;18726:1;18717:6;18713:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18701:26;;18696:135;18733:1;18729;:5;18696:135;;;18768:12;18789:3;18781:5;:11;18768:25;;;;;;;:::i;:::-;;;;;18756:6;18763:1;18756:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;18818:1;18808:11;;;;;18736:3;;;;:::i;:::-;;;18696:135;;;;18858:1;18849:5;:10;18841:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18921:6;18907:21;;;18485:451;;;;:::o;31881:1775::-;32020:20;32043:13;;32020:36;;32085:1;32071:16;;:2;:16;;;32067:48;;32096:19;;;;;;;;;;;;;;32067:48;32142:1;32130:8;:13;32126:44;;32152:18;;;;;;;;;;;;;;32126:44;32183:61;32213:1;32217:2;32221:12;32235:8;32183:21;:61::i;:::-;32556:8;32521:12;:16;32534:2;32521:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32620:8;32580:12;:16;32593:2;32580:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32679:2;32646:11;:25;32658:12;32646:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;32746:15;32696:11;:25;32708:12;32696:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;32779:20;32802:12;32779:35;;32829:11;32858:8;32843:12;:23;32829:37;;32887:4;:23;;;;;32895:15;:2;:13;;;:15::i;:::-;32887:23;32883:641;;;32931:314;32987:12;32983:2;32962:38;;32979:1;32962:38;;;;;;;;;;;;33028:69;33067:1;33071:2;33075:14;;;;;;33091:5;33028:30;:69::i;:::-;33023:174;;33133:40;;;;;;;;;;;;;;33023:174;33240:3;33224:12;:19;32931:314;;33326:12;33309:13;;:29;33305:43;;33340:8;;;33305:43;32883:641;;;33389:120;33445:14;;;;;;33441:2;33420:40;;33437:1;33420:40;;;;;;;;;;;;33504:3;33488:12;:19;33389:120;;32883:641;33554:12;33538:13;:28;;;;32496:1082;;33588:60;33617:1;33621:2;33625:12;33639:8;33588:20;:60::i;:::-;32009:1647;31881:1775;;;;:::o;56278:1308::-;56359:7;56368:12;56613:2;56593:9;:16;:22;56589:990;;56632:9;56656;56680:7;56889:4;56878:9;56874:20;56868:27;56863:32;;56939:4;56928:9;56924:20;56918:27;56913:32;;56997:4;56986:9;56982:20;56976:27;56973:1;56968:36;56963:41;;57040:25;57051:4;57057:1;57060;57063;57040:10;:25::i;:::-;57033:32;;;;;;;;;56589:990;57107:2;57087:9;:16;:22;57083:496;;57126:9;57150:10;57362:4;57351:9;57347:20;57341:27;57336:32;;57413:4;57402:9;57398:20;57392:27;57386:33;;57455:23;57466:4;57472:1;57475:2;57455:10;:23::i;:::-;57448:30;;;;;;;;57083:496;57527:1;57531:35;57511:56;;;;56278:1308;;;;;;:::o;54549:643::-;54627:20;54618:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;54614:571;54664:7;54614:571;54725:29;54716:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;54712:473;;54771:34;;;;;;;;;;:::i;:::-;;;;;;;;54712:473;54836:35;54827:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;54823:362;;54888:41;;;;;;;;;;:::i;:::-;;;;;;;;54823:362;54960:30;54951:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;54947:238;;55007:44;;;;;;;;;;:::i;:::-;;;;;;;;54947:238;55082:30;55073:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;55069:116;;55129:44;;;;;;;;;;:::i;:::-;;;;;;;;55069:116;54549:643;;:::o;19791:157::-;19876:4;19915:25;19900:40;;;:11;:40;;;;19893:47;;19791:157;;;:::o;66718:314::-;66771:7;66812:12;66795:29;;66803:4;66795:29;;;:66;;;;;66845:16;66828:13;:33;66795:66;66791:234;;;66885:24;66878:31;;;;66791:234;66949:64;66971:10;66983:12;66997:15;66949:21;:64::i;:::-;66942:71;;66718:314;;:::o;63302:196::-;63395:7;63461:15;63478:10;63432:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63422:68;;;;;;63415:75;;63302:196;;;;:::o;59840:1632::-;59971:7;59980:12;60905:66;60900:1;60892:10;;:79;60888:163;;;61004:1;61008:30;60988:51;;;;;;60888:163;61070:2;61065:1;:7;;;;:18;;;;;61081:2;61076:1;:7;;;;61065:18;61061:102;;;61116:1;61120:30;61100:51;;;;;;61061:102;61260:14;61277:24;61287:4;61293:1;61296;61299;61277:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61260:41;;61334:1;61316:20;;:6;:20;;;61312:103;;61369:1;61373:29;61353:50;;;;;;;61312:103;61435:6;61443:20;61427:37;;;;;59840:1632;;;;;;;;:::o;58882:344::-;58996:7;59005:12;59030:9;59055:66;59047:75;;59042:2;:80;59030:92;;59133:7;59172:2;59165:3;59158:2;59150:11;;:18;;59149:25;;;;:::i;:::-;59133:42;;59193:25;59204:4;59210:1;59213;59216;59193:10;:25::i;:::-;59186:32;;;;;;58882:344;;;;;;:::o;67040:263::-;67184:7;67232:8;67242;67252:11;67265:13;67288:4;67221:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67211:84;;;;;;67204:91;;67040:263;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:117::-;4294:1;4291;4284:12;4308:117;4417:1;4414;4407:12;4431:117;4540:1;4537;4530:12;4567:552;4624:8;4634:6;4684:3;4677:4;4669:6;4665:17;4661:27;4651:122;;4692:79;;:::i;:::-;4651:122;4805:6;4792:20;4782:30;;4835:18;4827:6;4824:30;4821:117;;;4857:79;;:::i;:::-;4821:117;4971:4;4963:6;4959:17;4947:29;;5025:3;5017:4;5009:6;5005:17;4995:8;4991:32;4988:41;4985:128;;;5032:79;;:::i;:::-;4985:128;4567:552;;;;;:::o;5125:817::-;5213:6;5221;5229;5237;5286:2;5274:9;5265:7;5261:23;5257:32;5254:119;;;5292:79;;:::i;:::-;5254:119;5412:1;5437:53;5482:7;5473:6;5462:9;5458:22;5437:53;:::i;:::-;5427:63;;5383:117;5539:2;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5510:118;5695:2;5684:9;5680:18;5667:32;5726:18;5718:6;5715:30;5712:117;;;5748:79;;:::i;:::-;5712:117;5861:64;5917:7;5908:6;5897:9;5893:22;5861:64;:::i;:::-;5843:82;;;;5638:297;5125:817;;;;;;;:::o;5948:122::-;6021:24;6039:5;6021:24;:::i;:::-;6014:5;6011:35;6001:63;;6060:1;6057;6050:12;6001:63;5948:122;:::o;6076:139::-;6122:5;6160:6;6147:20;6138:29;;6176:33;6203:5;6176:33;:::i;:::-;6076:139;;;;:::o;6221:474::-;6289:6;6297;6346:2;6334:9;6325:7;6321:23;6317:32;6314:119;;;6352:79;;:::i;:::-;6314:119;6472:1;6497:53;6542:7;6533:6;6522:9;6518:22;6497:53;:::i;:::-;6487:63;;6443:117;6599:2;6625:53;6670:7;6661:6;6650:9;6646:22;6625:53;:::i;:::-;6615:63;;6570:118;6221:474;;;;;:::o;6701:118::-;6788:24;6806:5;6788:24;:::i;:::-;6783:3;6776:37;6701:118;;:::o;6825:222::-;6918:4;6956:2;6945:9;6941:18;6933:26;;6969:71;7037:1;7026:9;7022:17;7013:6;6969:71;:::i;:::-;6825:222;;;;:::o;7053:619::-;7130:6;7138;7146;7195:2;7183:9;7174:7;7170:23;7166:32;7163:119;;;7201:79;;:::i;:::-;7163:119;7321:1;7346:53;7391:7;7382:6;7371:9;7367:22;7346:53;:::i;:::-;7336:63;;7292:117;7448:2;7474:53;7519:7;7510:6;7499:9;7495:22;7474:53;:::i;:::-;7464:63;;7419:118;7576:2;7602:53;7647:7;7638:6;7627:9;7623:22;7602:53;:::i;:::-;7592:63;;7547:118;7053:619;;;;;:::o;7678:77::-;7715:7;7744:5;7733:16;;7678:77;;;:::o;7761:122::-;7834:24;7852:5;7834:24;:::i;:::-;7827:5;7824:35;7814:63;;7873:1;7870;7863:12;7814:63;7761:122;:::o;7889:139::-;7935:5;7973:6;7960:20;7951:29;;7989:33;8016:5;7989:33;:::i;:::-;7889:139;;;;:::o;8034:329::-;8093:6;8142:2;8130:9;8121:7;8117:23;8113:32;8110:119;;;8148:79;;:::i;:::-;8110:119;8268:1;8293:53;8338:7;8329:6;8318:9;8314:22;8293:53;:::i;:::-;8283:63;;8239:117;8034:329;;;;:::o;8369:118::-;8456:24;8474:5;8456:24;:::i;:::-;8451:3;8444:37;8369:118;;:::o;8493:222::-;8586:4;8624:2;8613:9;8609:18;8601:26;;8637:71;8705:1;8694:9;8690:17;8681:6;8637:71;:::i;:::-;8493:222;;;;:::o;8721:474::-;8789:6;8797;8846:2;8834:9;8825:7;8821:23;8817:32;8814:119;;;8852:79;;:::i;:::-;8814:119;8972:1;8997:53;9042:7;9033:6;9022:9;9018:22;8997:53;:::i;:::-;8987:63;;8943:117;9099:2;9125:53;9170:7;9161:6;9150:9;9146:22;9125:53;:::i;:::-;9115:63;;9070:118;8721:474;;;;;:::o;9218:568::-;9291:8;9301:6;9351:3;9344:4;9336:6;9332:17;9328:27;9318:122;;9359:79;;:::i;:::-;9318:122;9472:6;9459:20;9449:30;;9502:18;9494:6;9491:30;9488:117;;;9524:79;;:::i;:::-;9488:117;9638:4;9630:6;9626:17;9614:29;;9692:3;9684:4;9676:6;9672:17;9662:8;9658:32;9655:41;9652:128;;;9699:79;;:::i;:::-;9652:128;9218:568;;;;;:::o;9809:::-;9882:8;9892:6;9942:3;9935:4;9927:6;9923:17;9919:27;9909:122;;9950:79;;:::i;:::-;9909:122;10063:6;10050:20;10040:30;;10093:18;10085:6;10082:30;10079:117;;;10115:79;;:::i;:::-;10079:117;10229:4;10221:6;10217:17;10205:29;;10283:3;10275:4;10267:6;10263:17;10253:8;10249:32;10246:41;10243:128;;;10290:79;;:::i;:::-;10243:128;9809:568;;;;;:::o;10383:934::-;10505:6;10513;10521;10529;10578:2;10566:9;10557:7;10553:23;10549:32;10546:119;;;10584:79;;:::i;:::-;10546:119;10732:1;10721:9;10717:17;10704:31;10762:18;10754:6;10751:30;10748:117;;;10784:79;;:::i;:::-;10748:117;10897:80;10969:7;10960:6;10949:9;10945:22;10897:80;:::i;:::-;10879:98;;;;10675:312;11054:2;11043:9;11039:18;11026:32;11085:18;11077:6;11074:30;11071:117;;;11107:79;;:::i;:::-;11071:117;11220:80;11292:7;11283:6;11272:9;11268:22;11220:80;:::i;:::-;11202:98;;;;10997:313;10383:934;;;;;;;:::o;11323:117::-;11432:1;11429;11422:12;11446:180;11494:77;11491:1;11484:88;11591:4;11588:1;11581:15;11615:4;11612:1;11605:15;11632:281;11715:27;11737:4;11715:27;:::i;:::-;11707:6;11703:40;11845:6;11833:10;11830:22;11809:18;11797:10;11794:34;11791:62;11788:88;;;11856:18;;:::i;:::-;11788:88;11896:10;11892:2;11885:22;11675:238;11632:281;;:::o;11919:129::-;11953:6;11980:20;;:::i;:::-;11970:30;;12009:33;12037:4;12029:6;12009:33;:::i;:::-;11919:129;;;:::o;12054:308::-;12116:4;12206:18;12198:6;12195:30;12192:56;;;12228:18;;:::i;:::-;12192:56;12266:29;12288:6;12266:29;:::i;:::-;12258:37;;12350:4;12344;12340:15;12332:23;;12054:308;;;:::o;12368:154::-;12452:6;12447:3;12442;12429:30;12514:1;12505:6;12500:3;12496:16;12489:27;12368:154;;;:::o;12528:412::-;12606:5;12631:66;12647:49;12689:6;12647:49;:::i;:::-;12631:66;:::i;:::-;12622:75;;12720:6;12713:5;12706:21;12758:4;12751:5;12747:16;12796:3;12787:6;12782:3;12778:16;12775:25;12772:112;;;12803:79;;:::i;:::-;12772:112;12893:41;12927:6;12922:3;12917;12893:41;:::i;:::-;12612:328;12528:412;;;;;:::o;12960:340::-;13016:5;13065:3;13058:4;13050:6;13046:17;13042:27;13032:122;;13073:79;;:::i;:::-;13032:122;13190:6;13177:20;13215:79;13290:3;13282:6;13275:4;13267:6;13263:17;13215:79;:::i;:::-;13206:88;;13022:278;12960:340;;;;:::o;13306:509::-;13375:6;13424:2;13412:9;13403:7;13399:23;13395:32;13392:119;;;13430:79;;:::i;:::-;13392:119;13578:1;13567:9;13563:17;13550:31;13608:18;13600:6;13597:30;13594:117;;;13630:79;;:::i;:::-;13594:117;13735:63;13790:7;13781:6;13770:9;13766:22;13735:63;:::i;:::-;13725:73;;13521:287;13306:509;;;;:::o;13821:329::-;13880:6;13929:2;13917:9;13908:7;13904:23;13900:32;13897:119;;;13935:79;;:::i;:::-;13897:119;14055:1;14080:53;14125:7;14116:6;14105:9;14101:22;14080:53;:::i;:::-;14070:63;;14026:117;13821:329;;;;:::o;14156:116::-;14226:21;14241:5;14226:21;:::i;:::-;14219:5;14216:32;14206:60;;14262:1;14259;14252:12;14206:60;14156:116;:::o;14278:133::-;14321:5;14359:6;14346:20;14337:29;;14375:30;14399:5;14375:30;:::i;:::-;14278:133;;;;:::o;14417:468::-;14482:6;14490;14539:2;14527:9;14518:7;14514:23;14510:32;14507:119;;;14545:79;;:::i;:::-;14507:119;14665:1;14690:53;14735:7;14726:6;14715:9;14711:22;14690:53;:::i;:::-;14680:63;;14636:117;14792:2;14818:50;14860:7;14851:6;14840:9;14836:22;14818:50;:::i;:::-;14808:60;;14763:115;14417:468;;;;;:::o;14891:307::-;14952:4;15042:18;15034:6;15031:30;15028:56;;;15064:18;;:::i;:::-;15028:56;15102:29;15124:6;15102:29;:::i;:::-;15094:37;;15186:4;15180;15176:15;15168:23;;14891:307;;;:::o;15204:410::-;15281:5;15306:65;15322:48;15363:6;15322:48;:::i;:::-;15306:65;:::i;:::-;15297:74;;15394:6;15387:5;15380:21;15432:4;15425:5;15421:16;15470:3;15461:6;15456:3;15452:16;15449:25;15446:112;;;15477:79;;:::i;:::-;15446:112;15567:41;15601:6;15596:3;15591;15567:41;:::i;:::-;15287:327;15204:410;;;;;:::o;15633:338::-;15688:5;15737:3;15730:4;15722:6;15718:17;15714:27;15704:122;;15745:79;;:::i;:::-;15704:122;15862:6;15849:20;15887:78;15961:3;15953:6;15946:4;15938:6;15934:17;15887:78;:::i;:::-;15878:87;;15694:277;15633:338;;;;:::o;15977:943::-;16072:6;16080;16088;16096;16145:3;16133:9;16124:7;16120:23;16116:33;16113:120;;;16152:79;;:::i;:::-;16113:120;16272:1;16297:53;16342:7;16333:6;16322:9;16318:22;16297:53;:::i;:::-;16287:63;;16243:117;16399:2;16425:53;16470:7;16461:6;16450:9;16446:22;16425:53;:::i;:::-;16415:63;;16370:118;16527:2;16553:53;16598:7;16589:6;16578:9;16574:22;16553:53;:::i;:::-;16543:63;;16498:118;16683:2;16672:9;16668:18;16655:32;16714:18;16706:6;16703:30;16700:117;;;16736:79;;:::i;:::-;16700:117;16841:62;16895:7;16886:6;16875:9;16871:22;16841:62;:::i;:::-;16831:72;;16626:287;15977:943;;;;;;;:::o;16926:180::-;16974:77;16971:1;16964:88;17071:4;17068:1;17061:15;17095:4;17092:1;17085:15;17112:116;17196:1;17189:5;17186:12;17176:46;;17202:18;;:::i;:::-;17176:46;17112:116;:::o;17234:133::-;17282:7;17311:5;17300:16;;17317:44;17355:5;17317:44;:::i;:::-;17234:133;;;:::o;17373:::-;17432:9;17465:35;17494:5;17465:35;:::i;:::-;17452:48;;17373:133;;;:::o;17512:149::-;17608:46;17648:5;17608:46;:::i;:::-;17603:3;17596:59;17512:149;;:::o;17667:240::-;17769:4;17807:2;17796:9;17792:18;17784:26;;17820:80;17897:1;17886:9;17882:17;17873:6;17820:80;:::i;:::-;17667:240;;;;:::o;17913:963::-;18010:6;18018;18026;18034;18042;18091:3;18079:9;18070:7;18066:23;18062:33;18059:120;;;18098:79;;:::i;:::-;18059:120;18218:1;18243:53;18288:7;18279:6;18268:9;18264:22;18243:53;:::i;:::-;18233:63;;18189:117;18345:2;18371:53;18416:7;18407:6;18396:9;18392:22;18371:53;:::i;:::-;18361:63;;18316:118;18473:2;18499:53;18544:7;18535:6;18524:9;18520:22;18499:53;:::i;:::-;18489:63;;18444:118;18629:2;18618:9;18614:18;18601:32;18660:18;18652:6;18649:30;18646:117;;;18682:79;;:::i;:::-;18646:117;18795:64;18851:7;18842:6;18831:9;18827:22;18795:64;:::i;:::-;18777:82;;;;18572:297;17913:963;;;;;;;;:::o;18882:474::-;18950:6;18958;19007:2;18995:9;18986:7;18982:23;18978:32;18975:119;;;19013:79;;:::i;:::-;18975:119;19133:1;19158:53;19203:7;19194:6;19183:9;19179:22;19158:53;:::i;:::-;19148:63;;19104:117;19260:2;19286:53;19331:7;19322:6;19311:9;19307:22;19286:53;:::i;:::-;19276:63;;19231:118;18882:474;;;;;:::o;19362:180::-;19410:77;19407:1;19400:88;19507:4;19504:1;19497:15;19531:4;19528:1;19521:15;19548:320;19592:6;19629:1;19623:4;19619:12;19609:22;;19676:1;19670:4;19666:12;19697:18;19687:81;;19753:4;19745:6;19741:17;19731:27;;19687:81;19815:2;19807:6;19804:14;19784:18;19781:38;19778:84;;19834:18;;:::i;:::-;19778:84;19599:269;19548:320;;;:::o;19874:368::-;20013:4;20051:2;20040:9;20036:18;20028:26;;20064:80;20141:1;20130:9;20126:17;20117:6;20064:80;:::i;:::-;20154:81;20231:2;20220:9;20216:18;20207:6;20154:81;:::i;:::-;19874:368;;;;;:::o;20248:180::-;20296:77;20293:1;20286:88;20393:4;20390:1;20383:15;20417:4;20414:1;20407:15;20434:348;20474:7;20497:20;20515:1;20497:20;:::i;:::-;20492:25;;20531:20;20549:1;20531:20;:::i;:::-;20526:25;;20719:1;20651:66;20647:74;20644:1;20641:81;20636:1;20629:9;20622:17;20618:105;20615:131;;;20726:18;;:::i;:::-;20615:131;20774:1;20771;20767:9;20756:20;;20434:348;;;;:::o;20788:305::-;20828:3;20847:20;20865:1;20847:20;:::i;:::-;20842:25;;20881:20;20899:1;20881:20;:::i;:::-;20876:25;;21035:1;20967:66;20963:74;20960:1;20957:81;20954:107;;;21041:18;;:::i;:::-;20954:107;21085:1;21082;21078:9;21071:16;;20788:305;;;;:::o;21099:234::-;21239:34;21235:1;21227:6;21223:14;21216:58;21308:17;21303:2;21295:6;21291:15;21284:42;21099:234;:::o;21339:366::-;21481:3;21502:67;21566:2;21561:3;21502:67;:::i;:::-;21495:74;;21578:93;21667:3;21578:93;:::i;:::-;21696:2;21691:3;21687:12;21680:19;;21339:366;;;:::o;21711:419::-;21877:4;21915:2;21904:9;21900:18;21892:26;;21964:9;21958:4;21954:20;21950:1;21939:9;21935:17;21928:47;21992:131;22118:4;21992:131;:::i;:::-;21984:139;;21711:419;;;:::o;22136:147::-;22237:11;22274:3;22259:18;;22136:147;;;;:::o;22289:114::-;;:::o;22409:398::-;22568:3;22589:83;22670:1;22665:3;22589:83;:::i;:::-;22582:90;;22681:93;22770:3;22681:93;:::i;:::-;22799:1;22794:3;22790:11;22783:18;;22409:398;;;:::o;22813:379::-;22997:3;23019:147;23162:3;23019:147;:::i;:::-;23012:154;;23183:3;23176:10;;22813:379;;;:::o;23198:180::-;23246:77;23243:1;23236:88;23343:4;23340:1;23333:15;23367:4;23364:1;23357:15;23384:233;23423:3;23446:24;23464:5;23446:24;:::i;:::-;23437:33;;23492:66;23485:5;23482:77;23479:103;;23562:18;;:::i;:::-;23479:103;23609:1;23602:5;23598:13;23591:20;;23384:233;;;:::o;23623:148::-;23725:11;23762:3;23747:18;;23623:148;;;;:::o;23777:377::-;23883:3;23911:39;23944:5;23911:39;:::i;:::-;23966:89;24048:6;24043:3;23966:89;:::i;:::-;23959:96;;24064:52;24109:6;24104:3;24097:4;24090:5;24086:16;24064:52;:::i;:::-;24141:6;24136:3;24132:16;24125:23;;23887:267;23777:377;;;;:::o;24160:435::-;24340:3;24362:95;24453:3;24444:6;24362:95;:::i;:::-;24355:102;;24474:95;24565:3;24556:6;24474:95;:::i;:::-;24467:102;;24586:3;24579:10;;24160:435;;;;;:::o;24601:553::-;24778:4;24816:3;24805:9;24801:19;24793:27;;24830:71;24898:1;24887:9;24883:17;24874:6;24830:71;:::i;:::-;24911:72;24979:2;24968:9;24964:18;24955:6;24911:72;:::i;:::-;24993;25061:2;25050:9;25046:18;25037:6;24993:72;:::i;:::-;25075;25143:2;25132:9;25128:18;25119:6;25075:72;:::i;:::-;24601:553;;;;;;;:::o;25160:173::-;25300:25;25296:1;25288:6;25284:14;25277:49;25160:173;:::o;25339:402::-;25499:3;25520:85;25602:2;25597:3;25520:85;:::i;:::-;25513:92;;25614:93;25703:3;25614:93;:::i;:::-;25732:2;25727:3;25723:12;25716:19;;25339:402;;;:::o;25747:167::-;25887:19;25883:1;25875:6;25871:14;25864:43;25747:167;:::o;25920:402::-;26080:3;26101:85;26183:2;26178:3;26101:85;:::i;:::-;26094:92;;26195:93;26284:3;26195:93;:::i;:::-;26313:2;26308:3;26304:12;26297:19;;25920:402;;;:::o;26328:967::-;26710:3;26732:148;26876:3;26732:148;:::i;:::-;26725:155;;26897:95;26988:3;26979:6;26897:95;:::i;:::-;26890:102;;27009:148;27153:3;27009:148;:::i;:::-;27002:155;;27174:95;27265:3;27256:6;27174:95;:::i;:::-;27167:102;;27286:3;27279:10;;26328:967;;;;;:::o;27301:98::-;27352:6;27386:5;27380:12;27370:22;;27301:98;;;:::o;27405:168::-;27488:11;27522:6;27517:3;27510:19;27562:4;27557:3;27553:14;27538:29;;27405:168;;;;:::o;27579:360::-;27665:3;27693:38;27725:5;27693:38;:::i;:::-;27747:70;27810:6;27805:3;27747:70;:::i;:::-;27740:77;;27826:52;27871:6;27866:3;27859:4;27852:5;27848:16;27826:52;:::i;:::-;27903:29;27925:6;27903:29;:::i;:::-;27898:3;27894:39;27887:46;;27669:270;27579:360;;;;:::o;27945:640::-;28140:4;28178:3;28167:9;28163:19;28155:27;;28192:71;28260:1;28249:9;28245:17;28236:6;28192:71;:::i;:::-;28273:72;28341:2;28330:9;28326:18;28317:6;28273:72;:::i;:::-;28355;28423:2;28412:9;28408:18;28399:6;28355:72;:::i;:::-;28474:9;28468:4;28464:20;28459:2;28448:9;28444:18;28437:48;28502:76;28573:4;28564:6;28502:76;:::i;:::-;28494:84;;27945:640;;;;;;;:::o;28591:141::-;28647:5;28678:6;28672:13;28663:22;;28694:32;28720:5;28694:32;:::i;:::-;28591:141;;;;:::o;28738:349::-;28807:6;28856:2;28844:9;28835:7;28831:23;28827:32;28824:119;;;28862:79;;:::i;:::-;28824:119;28982:1;29007:63;29062:7;29053:6;29042:9;29038:22;29007:63;:::i;:::-;28997:73;;28953:127;28738:349;;;;:::o;29093:180::-;29141:77;29138:1;29131:88;29238:4;29235:1;29228:15;29262:4;29259:1;29252:15;29279:185;29319:1;29336:20;29354:1;29336:20;:::i;:::-;29331:25;;29370:20;29388:1;29370:20;:::i;:::-;29365:25;;29409:1;29399:35;;29414:18;;:::i;:::-;29399:35;29456:1;29453;29449:9;29444:14;;29279:185;;;;:::o;29470:191::-;29510:4;29530:20;29548:1;29530:20;:::i;:::-;29525:25;;29564:20;29582:1;29564:20;:::i;:::-;29559:25;;29603:1;29600;29597:8;29594:34;;;29608:18;;:::i;:::-;29594:34;29653:1;29650;29646:9;29638:17;;29470:191;;;;:::o;29667:176::-;29699:1;29716:20;29734:1;29716:20;:::i;:::-;29711:25;;29750:20;29768:1;29750:20;:::i;:::-;29745:25;;29789:1;29779:35;;29794:18;;:::i;:::-;29779:35;29835:1;29832;29828:9;29823:14;;29667:176;;;;:::o;29849:171::-;29888:3;29911:24;29929:5;29911:24;:::i;:::-;29902:33;;29957:4;29950:5;29947:15;29944:41;;29965:18;;:::i;:::-;29944:41;30012:1;30005:5;30001:13;29994:20;;29849:171;;;:::o;30026:182::-;30166:34;30162:1;30154:6;30150:14;30143:58;30026:182;:::o;30214:366::-;30356:3;30377:67;30441:2;30436:3;30377:67;:::i;:::-;30370:74;;30453:93;30542:3;30453:93;:::i;:::-;30571:2;30566:3;30562:12;30555:19;;30214:366;;;:::o;30586:419::-;30752:4;30790:2;30779:9;30775:18;30767:26;;30839:9;30833:4;30829:20;30825:1;30814:9;30810:17;30803:47;30867:131;30993:4;30867:131;:::i;:::-;30859:139;;30586:419;;;:::o;31011:174::-;31151:26;31147:1;31139:6;31135:14;31128:50;31011:174;:::o;31191:366::-;31333:3;31354:67;31418:2;31413:3;31354:67;:::i;:::-;31347:74;;31430:93;31519:3;31430:93;:::i;:::-;31548:2;31543:3;31539:12;31532:19;;31191:366;;;:::o;31563:419::-;31729:4;31767:2;31756:9;31752:18;31744:26;;31816:9;31810:4;31806:20;31802:1;31791:9;31787:17;31780:47;31844:131;31970:4;31844:131;:::i;:::-;31836:139;;31563:419;;;:::o;31988:181::-;32128:33;32124:1;32116:6;32112:14;32105:57;31988:181;:::o;32175:366::-;32317:3;32338:67;32402:2;32397:3;32338:67;:::i;:::-;32331:74;;32414:93;32503:3;32414:93;:::i;:::-;32532:2;32527:3;32523:12;32516:19;;32175:366;;;:::o;32547:419::-;32713:4;32751:2;32740:9;32736:18;32728:26;;32800:9;32794:4;32790:20;32786:1;32775:9;32771:17;32764:47;32828:131;32954:4;32828:131;:::i;:::-;32820:139;;32547:419;;;:::o;32972:221::-;33112:34;33108:1;33100:6;33096:14;33089:58;33181:4;33176:2;33168:6;33164:15;33157:29;32972:221;:::o;33199:366::-;33341:3;33362:67;33426:2;33421:3;33362:67;:::i;:::-;33355:74;;33438:93;33527:3;33438:93;:::i;:::-;33556:2;33551:3;33547:12;33540:19;;33199:366;;;:::o;33571:419::-;33737:4;33775:2;33764:9;33760:18;33752:26;;33824:9;33818:4;33814:20;33810:1;33799:9;33795:17;33788:47;33852:131;33978:4;33852:131;:::i;:::-;33844:139;;33571:419;;;:::o;33996:221::-;34136:34;34132:1;34124:6;34120:14;34113:58;34205:4;34200:2;34192:6;34188:15;34181:29;33996:221;:::o;34223:366::-;34365:3;34386:67;34450:2;34445:3;34386:67;:::i;:::-;34379:74;;34462:93;34551:3;34462:93;:::i;:::-;34580:2;34575:3;34571:12;34564:19;;34223:366;;;:::o;34595:419::-;34761:4;34799:2;34788:9;34784:18;34776:26;;34848:9;34842:4;34838:20;34834:1;34823:9;34819:17;34812:47;34876:131;35002:4;34876:131;:::i;:::-;34868:139;;34595:419;;;:::o;35020:214::-;35160:66;35156:1;35148:6;35144:14;35137:90;35020:214;:::o;35240:400::-;35400:3;35421:84;35503:1;35498:3;35421:84;:::i;:::-;35414:91;;35514:93;35603:3;35514:93;:::i;:::-;35632:1;35627:3;35623:11;35616:18;;35240:400;;;:::o;35646:79::-;35685:7;35714:5;35703:16;;35646:79;;;:::o;35731:157::-;35836:45;35856:24;35874:5;35856:24;:::i;:::-;35836:45;:::i;:::-;35831:3;35824:58;35731:157;;:::o;35894:663::-;36135:3;36157:148;36301:3;36157:148;:::i;:::-;36150:155;;36315:75;36386:3;36377:6;36315:75;:::i;:::-;36415:2;36410:3;36406:12;36399:19;;36428:75;36499:3;36490:6;36428:75;:::i;:::-;36528:2;36523:3;36519:12;36512:19;;36548:3;36541:10;;35894:663;;;;;:::o;36563:86::-;36598:7;36638:4;36631:5;36627:16;36616:27;;36563:86;;;:::o;36655:112::-;36738:22;36754:5;36738:22;:::i;:::-;36733:3;36726:35;36655:112;;:::o;36773:545::-;36946:4;36984:3;36973:9;36969:19;36961:27;;36998:71;37066:1;37055:9;37051:17;37042:6;36998:71;:::i;:::-;37079:68;37143:2;37132:9;37128:18;37119:6;37079:68;:::i;:::-;37157:72;37225:2;37214:9;37210:18;37201:6;37157:72;:::i;:::-;37239;37307:2;37296:9;37292:18;37283:6;37239:72;:::i;:::-;36773:545;;;;;;;:::o;37324:664::-;37529:4;37567:3;37556:9;37552:19;37544:27;;37581:71;37649:1;37638:9;37634:17;37625:6;37581:71;:::i;:::-;37662:72;37730:2;37719:9;37715:18;37706:6;37662:72;:::i;:::-;37744;37812:2;37801:9;37797:18;37788:6;37744:72;:::i;:::-;37826;37894:2;37883:9;37879:18;37870:6;37826:72;:::i;:::-;37908:73;37976:3;37965:9;37961:19;37952:6;37908:73;:::i;:::-;37324:664;;;;;;;;:::o

Swarm Source

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