ETH Price: $3,005.97 (+4.34%)
Gas: 2 Gwei

Token

ThePicaroons (PIC)
 

Overview

Max Total Supply

10,000 PIC

Holders

2,625

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 PIC
0x7eed737787fd44a12ff53846b277784c9f513ddf
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The 10,000 NFT Picaroons are a collectible series launched by the Shipbuilders ; muralist & street artist @lucasantics, tech team @blockmarktech & NFT advisor Pranksy.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ThePicaroons

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/thepicaroons.sol


pragma solidity ^0.8.0;




// Allows us to verify the signature which is provided from The Picaroons website.



contract ThePicaroons is ERC721Enumerable, Ownable {
    using Strings for uint256;
    using ECDSA for bytes32;

    // The address used to create the signature for the buy method.
    address private _signerAddress = 0xF5F6C1B8F13F2A41Ce8474AAD3Dd5050364eef1f;

    // Total Supply of Picaroons to be minted and individual price per Picaroon
    uint256 public constant TOTAL_SUPPLY = 10000;
    uint256 public constant PRICE = 0.08 ether;

    // The amount tokens an address has minted
    mapping(address => uint256) public amountMintedList;

    // The tokenURI starting index offset - This to improve transparency by ensuring we haven't rigged the minting process.
    uint256 public startingIndex;

    // Define the URI smart-contract metadata URI
    /// @dev see https://docs.opensea.io/docs/contract-level-metadata
    string private _contractURI = "ipfs://QmTWEJJuhEargPQRhnpWDEHctwdzaSTitwWZNi9FKBqB3o";

    //  Define the base URI for the tokens metadata
    string private _tokenBaseURI = "ipfs://QmbX28t9P7wFyeXDnhykshib8ZjtvynN4pcYeSrwRWLmpQ/";

    // The smart-contract proof that can be used to check if any data has been modified
    // proof is an hash of all the tokens metadata
    /// @dev see this post https://medium.com/coinmonks/the-elegance-of-the-nft-provenance-hash-solution-823b39f99473
    /// or the excellent BAYC mechanism https://boredapeyachtclub.com/#/provenance
    string public proof;
   
    bool public saleLive;
    // Is the contract metadata (so we can't change it)
    bool public locked;

    constructor() ERC721("ThePicaroons", "PIC") { }

    modifier notLocked {
        require(!locked, "Contract metadata methods are locked");
        _;
    }

    /// This function hashes the same values as the server-side API
    /// @param sender who sends the message to our smart-contract
    /// @param qty the quantity of NFT to mint
    /// @param maxAmountAllowed The max amount this address is allowed to mint (for gem holders and Mischief revenge holders)
    function hashTransaction(address sender, uint256 qty, uint256 maxAmountAllowed) private pure returns(bytes32) {
          bytes32 hash = keccak256(abi.encodePacked(
            "\x19Ethereum Signed Message:\n32",
            keccak256(abi.encodePacked(sender, qty, maxAmountAllowed)))
          );
          return hash;
    }

    /// Check if the current _signerAddress is the same as the one given in the hash by the server-side API
    /// @param hash contains the ABI encoded user address, the quantity of NFT to mint and nonce - a random string of 8 chars
    /// @param signature signature generated by the backend from a private key
    function matchAddresSigner(bytes32 hash, bytes memory signature) private view returns(bool) {
        return _signerAddress == hash.recover(signature);
    }

    /// Minting function
    /// @param hash contains the tokenQuantity and user address
    /// @param signature signature generated by the backend from the signer address
    /// @param tokenQuantity the quantity of NFT to mint
    function mint(bytes32 hash, bytes memory signature, uint256 tokenQuantity, uint256 maxAmountAllowed) external payable {
        require(saleLive, "SALE_CLOSED");
        // Is the signature valid
        require(matchAddresSigner(hash, signature), "DIRECT_MINT_DISALLOWED");
        // Verify if the keccak256 hash matches the hash generated by the hashTransaction function
        require(hashTransaction(msg.sender, tokenQuantity, maxAmountAllowed) == hash, "HASH_FAIL");
        // Out of stock check
        require(totalSupply() + tokenQuantity <= TOTAL_SUPPLY, "OUT_OF_STOCK");
        // Is the address allow more mint more tokens?
        require(amountMintedList[msg.sender] + tokenQuantity <= maxAmountAllowed, "EXCEED_ALLOC");
        require(PRICE * tokenQuantity <= msg.value, "INSUFFICIENT_ETH");

        for(uint256 i = 0; i < tokenQuantity; i++) {
            amountMintedList[msg.sender]++;
            _safeMint(msg.sender, totalSupply() + 1);
        }
       
    }

    /// withdraw mint gains to owner address
    /// @dev you can add some more receivers (artist, dev, marketing...) as variables above
    function withdraw() external onlyOwner {
        // payable(_artistAddress).transfer(address(this).balance * 2 / 5);
        payable(msg.sender).transfer(address(this).balance);
    }


    /// The amount of tokens minted for an address.
    /// @param addr to be checked against
    function amountMintedListCount(address addr) external view returns (uint256) {
        return amountMintedList[addr];
    }

    /// Enable pre-sale, public sale, hash, signer address...
    function lockMetadata() external onlyOwner {
        locked = true;
    }

    // Pause and Unpause the sale of Picaroons
    function toggleSaleStatus() external onlyOwner {
        saleLive = !saleLive;
    }

    /// Set the smart-contract proof as an hash of all NFT metadata hashes
    /// @param hash of all NFTs metadata hashes
    function setProvenanceHash(string calldata hash) external onlyOwner notLocked {
        proof = hash;
    }

    /// Set smart-contract metadata URI
    /// @param URI of the smart-contract
    function setContractURI(string calldata URI) external onlyOwner {
        _contractURI = URI;
    }

    /// Set the base URI for the tokens metadata
    /// @param URI for the base URI structure of each token
    function setBaseURI(string calldata URI) external onlyOwner notLocked {
        _tokenBaseURI = URI;
    }

    /// Smart-contract metadata
    /// @dev see https://docs.opensea.io/docs/contract-level-metadata
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

     // Set the starting index for the collection
     // @param random number to offset the token URI
    function setStartingIndex(uint256 number) external onlyOwner {
        // Requires we haven't already set the start index
        require(startingIndex == 0, "Starting index is already set");       
        startingIndex = number;
    }

    /// Retrieve the token URI from an id incremented using the startingIndex
    /// @param tokenId as an int
    /// @dev see https://docs.soliditylang.org/en/v0.5.3/abi-spec.html#non-standard-packed-mode
    function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
        require(_exists(tokenId), "Cannot query non-existent token");
        return string(abi.encodePacked(_tokenBaseURI, ((tokenId + startingIndex)% TOTAL_SUPPLY).toString()));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountMintedList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"amountMintedListCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"},{"internalType":"uint256","name":"maxAmountAllowed","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proof","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273f5f6c1b8f13f2a41ce8474aad3dd5050364eef1f600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060600160405280603581526020016200531160359139600e90805190602001906200008a9291906200025f565b506040518060600160405280603681526020016200534660369139600f9080519060200190620000bc9291906200025f565b50348015620000ca57600080fd5b506040518060400160405280600c81526020017f54686550696361726f6f6e7300000000000000000000000000000000000000008152506040518060400160405280600381526020017f504943000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200014f9291906200025f565b508060019080519060200190620001689291906200025f565b5050506200018b6200017f6200019160201b60201c565b6200019960201b60201c565b62000374565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200026d906200030f565b90600052602060002090601f016020900481019282620002915760008555620002dd565b82601f10620002ac57805160ff1916838001178555620002dd565b82800160010185558215620002dd579182015b82811115620002dc578251825591602001919060010190620002bf565b5b509050620002ec9190620002f0565b5090565b5b808211156200030b576000816000905550600101620002f1565b5090565b600060028204905060018216806200032857607f821691505b602082108114156200033f576200033e62000345565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614f8d80620003846000396000f3fe60806040526004361061020f5760003560e01c806388f2ebcb11610118578063c87b56dd116100a0578063e081b7811161006f578063e081b7811461077a578063e8a3d485146107a5578063e985e9c5146107d0578063f2fde38b1461080d578063faf924cf146108365761020f565b8063c87b56dd146106aa578063cb774d47146106e7578063cf30901214610712578063df5009191461073d5761020f565b8063938e3d7b116100e7578063938e3d7b146105ed57806395d89b4114610616578063989bdbb614610641578063a22cb46514610658578063b88d4fde146106815761020f565b806388f2ebcb146105435780638d859f3e1461056c5780638da5cb5b14610597578063902d55a5146105c25761020f565b80632f745c591161019b5780634f6ccce71161016a5780634f6ccce71461044c57806355f804b3146104895780636352211e146104b257806370a08231146104ef578063715018a61461052c5761020f565b80632f745c59146103b357806331fa3eb9146103f05780633ccfd60b1461040c57806342842e0e146104235761020f565b8063081812fc116101e2578063081812fc146102d0578063095ea7b31461030d578063109695231461033657806318160ddd1461035f57806323b872dd1461038a5761020f565b806301ffc9a714610214578063049c5c491461025157806306fdde031461026857806307a14ec214610293575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613655565b610861565b6040516102489190613e06565b60405180910390f35b34801561025d57600080fd5b506102666108db565b005b34801561027457600080fd5b5061027d610983565b60405161028a9190613e66565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b5919061340f565b610a15565b6040516102c79190614248565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906136fc565b610a5e565b6040516103049190613d9f565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190613592565b610ae3565b005b34801561034257600080fd5b5061035d600480360381019061035891906136af565b610bfb565b005b34801561036b57600080fd5b50610374610cdd565b6040516103819190614248565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac919061347c565b610cea565b005b3480156103bf57600080fd5b506103da60048036038101906103d59190613592565b610d4a565b6040516103e79190614248565b60405180910390f35b61040a600480360381019061040591906135d2565b610def565b005b34801561041857600080fd5b506104216110a4565b005b34801561042f57600080fd5b5061044a6004803603810190610445919061347c565b611169565b005b34801561045857600080fd5b50610473600480360381019061046e91906136fc565b611189565b6040516104809190614248565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab91906136af565b6111fa565b005b3480156104be57600080fd5b506104d960048036038101906104d491906136fc565b6112dc565b6040516104e69190613d9f565b60405180910390f35b3480156104fb57600080fd5b506105166004803603810190610511919061340f565b61138e565b6040516105239190614248565b60405180910390f35b34801561053857600080fd5b50610541611446565b005b34801561054f57600080fd5b5061056a600480360381019061056591906136fc565b6114ce565b005b34801561057857600080fd5b50610581611599565b60405161058e9190614248565b60405180910390f35b3480156105a357600080fd5b506105ac6115a5565b6040516105b99190613d9f565b60405180910390f35b3480156105ce57600080fd5b506105d76115cf565b6040516105e49190614248565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f91906136af565b6115d5565b005b34801561062257600080fd5b5061062b611667565b6040516106389190613e66565b60405180910390f35b34801561064d57600080fd5b506106566116f9565b005b34801561066457600080fd5b5061067f600480360381019061067a9190613552565b611792565b005b34801561068d57600080fd5b506106a860048036038101906106a391906134cf565b6117a8565b005b3480156106b657600080fd5b506106d160048036038101906106cc91906136fc565b61180a565b6040516106de9190613e66565b60405180910390f35b3480156106f357600080fd5b506106fc6118a0565b6040516107099190614248565b60405180910390f35b34801561071e57600080fd5b506107276118a6565b6040516107349190613e06565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f919061340f565b6118b9565b6040516107719190614248565b60405180910390f35b34801561078657600080fd5b5061078f6118d1565b60405161079c9190613e06565b60405180910390f35b3480156107b157600080fd5b506107ba6118e4565b6040516107c79190613e66565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f2919061343c565b611976565b6040516108049190613e06565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f919061340f565b611a0a565b005b34801561084257600080fd5b5061084b611b02565b6040516108589190613e66565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d457506108d382611b90565b5b9050919050565b6108e3611c72565b73ffffffffffffffffffffffffffffffffffffffff166109016115a5565b73ffffffffffffffffffffffffffffffffffffffff1614610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90614148565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b606060008054610992906144f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109be906144f3565b8015610a0b5780601f106109e057610100808354040283529160200191610a0b565b820191906000526020600020905b8154815290600101906020018083116109ee57829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610a6982611c7a565b610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90614128565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aee826112dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b56906141a8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7e611c72565b73ffffffffffffffffffffffffffffffffffffffff161480610bad5750610bac81610ba7611c72565b611976565b5b610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390614088565b60405180910390fd5b610bf68383611ce6565b505050565b610c03611c72565b73ffffffffffffffffffffffffffffffffffffffff16610c216115a5565b73ffffffffffffffffffffffffffffffffffffffff1614610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90614148565b60405180910390fd5b601160019054906101000a900460ff1615610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614168565b60405180910390fd5b818160109190610cd8929190613228565b505050565b6000600880549050905090565b610cfb610cf5611c72565b82611d9f565b610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d31906141c8565b60405180910390fd5b610d45838383611e7d565b505050565b6000610d558361138e565b8210610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d90613ee8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601160009054906101000a900460ff16610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590614008565b60405180910390fd5b610e4884846120e4565b610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e90613ea8565b60405180910390fd5b83610e93338484612151565b14610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90614068565b60405180910390fd5b61271082610edf610cdd565b610ee99190614311565b1115610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2190613fc8565b60405180910390fd5b8082600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f769190614311565b1115610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90614208565b60405180910390fd5b348267011c37937e080000610fcc9190614398565b111561100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100490614228565b60405180910390fd5b60005b8281101561109d57600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061106890614556565b919050555061108a33600161107b610cdd565b6110859190614311565b6121b2565b808061109590614556565b915050611010565b5050505050565b6110ac611c72565b73ffffffffffffffffffffffffffffffffffffffff166110ca6115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111790614148565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611166573d6000803e3d6000fd5b50565b611184838383604051806020016040528060008152506117a8565b505050565b6000611193610cdd565b82106111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb906141e8565b60405180910390fd5b600882815481106111e8576111e76146f3565b5b90600052602060002001549050919050565b611202611c72565b73ffffffffffffffffffffffffffffffffffffffff166112206115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90614148565b60405180910390fd5b601160019054906101000a900460ff16156112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90614168565b60405180910390fd5b8181600f91906112d7929190613228565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c906140c8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f6906140a8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61144e611c72565b73ffffffffffffffffffffffffffffffffffffffff1661146c6115a5565b73ffffffffffffffffffffffffffffffffffffffff16146114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b990614148565b60405180910390fd5b6114cc60006121d0565b565b6114d6611c72565b73ffffffffffffffffffffffffffffffffffffffff166114f46115a5565b73ffffffffffffffffffffffffffffffffffffffff161461154a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154190614148565b60405180910390fd5b6000600d541461158f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158690614048565b60405180910390fd5b80600d8190555050565b67011c37937e08000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61271081565b6115dd611c72565b73ffffffffffffffffffffffffffffffffffffffff166115fb6115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890614148565b60405180910390fd5b8181600e9190611662929190613228565b505050565b606060018054611676906144f3565b80601f01602080910402602001604051908101604052809291908181526020018280546116a2906144f3565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b611701611c72565b73ffffffffffffffffffffffffffffffffffffffff1661171f6115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c90614148565b60405180910390fd5b6001601160016101000a81548160ff021916908315150217905550565b6117a461179d611c72565b8383612296565b5050565b6117b96117b3611c72565b83611d9f565b6117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef906141c8565b60405180910390fd5b61180484848484612403565b50505050565b606061181582611c7a565b611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90614188565b60405180910390fd5b600f611879612710600d548561186a9190614311565b61187491906145d7565b61245f565b60405160200161188a929190613d55565b6040516020818303038152906040529050919050565b600d5481565b601160019054906101000a900460ff1681565b600c6020528060005260406000206000915090505481565b601160009054906101000a900460ff1681565b6060600e80546118f3906144f3565b80601f016020809104026020016040519081016040528092919081815260200182805461191f906144f3565b801561196c5780601f106119415761010080835404028352916020019161196c565b820191906000526020600020905b81548152906001019060200180831161194f57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a12611c72565b73ffffffffffffffffffffffffffffffffffffffff16611a306115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7d90614148565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90613f28565b60405180910390fd5b611aff816121d0565b50565b60108054611b0f906144f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3b906144f3565b8015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c6b5750611c6a826125c0565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d59836112dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611daa82611c7a565b611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de090614028565b60405180910390fd5b6000611df4836112dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e6357508373ffffffffffffffffffffffffffffffffffffffff16611e4b84610a5e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e745750611e738185611976565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9d826112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea90613f48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a90613f88565b60405180910390fd5b611f6e83838361262a565b611f79600082611ce6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fc991906143f2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120209190614311565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120df83838361273e565b505050565b60006120f9828461274390919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60008084848460405160200161216993929190613d18565b6040516020818303038152906040528051906020012060405160200161218f9190613d79565b604051602081830303815290604052805190602001209050809150509392505050565b6121cc82826040518060200160405280600081525061276a565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90613fa8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123f69190613e06565b60405180910390a3505050565b61240e848484611e7d565b61241a848484846127c5565b612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090613f08565b60405180910390fd5b50505050565b606060008214156124a7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125bb565b600082905060005b600082146124d95780806124c290614556565b915050600a826124d29190614367565b91506124af565b60008167ffffffffffffffff8111156124f5576124f4614722565b5b6040519080825280601f01601f1916602001820160405280156125275781602001600182028036833780820191505090505b5090505b600085146125b45760018261254091906143f2565b9150600a8561254f91906145d7565b603061255b9190614311565b60f81b818381518110612571576125706146f3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125ad9190614367565b945061252b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61263583838361295c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126785761267381612961565b6126b7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126b6576126b583826129aa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126fa576126f581612b17565b612739565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612738576127378282612be8565b5b5b505050565b505050565b60008060006127528585612c67565b9150915061275f81612cea565b819250505092915050565b6127748383612ebf565b61278160008484846127c5565b6127c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b790613f08565b60405180910390fd5b505050565b60006127e68473ffffffffffffffffffffffffffffffffffffffff16613099565b1561294f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261280f611c72565b8786866040518563ffffffff1660e01b81526004016128319493929190613dba565b602060405180830381600087803b15801561284b57600080fd5b505af192505050801561287c57506040513d601f19601f820116820180604052508101906128799190613682565b60015b6128ff573d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b506000815114156128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90613f08565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612954565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129b78461138e565b6129c191906143f2565b9050600060076000848152602001908152602001600020549050818114612aa6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b2b91906143f2565b9050600060096000848152602001908152602001600020549050600060088381548110612b5b57612b5a6146f3565b5b906000526020600020015490508060088381548110612b7d57612b7c6146f3565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bcc57612bcb6146c4565b5b6001900381819060005260206000200160009055905550505050565b6000612bf38361138e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080604183511415612ca95760008060006020860151925060408601519150606086015160001a9050612c9d878285856130bc565b94509450505050612ce3565b604083511415612cda576000806020850151915060408501519050612ccf8683836131c9565b935093505050612ce3565b60006002915091505b9250929050565b60006004811115612cfe57612cfd614666565b5b816004811115612d1157612d10614666565b5b1415612d1c57612ebc565b60016004811115612d3057612d2f614666565b5b816004811115612d4357612d42614666565b5b1415612d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7b90613e88565b60405180910390fd5b60026004811115612d9857612d97614666565b5b816004811115612dab57612daa614666565b5b1415612dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de390613ec8565b60405180910390fd5b60036004811115612e0057612dff614666565b5b816004811115612e1357612e12614666565b5b1415612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b90613fe8565b60405180910390fd5b600480811115612e6757612e66614666565b5b816004811115612e7a57612e79614666565b5b1415612ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb2906140e8565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2690614108565b60405180910390fd5b612f3881611c7a565b15612f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6f90613f68565b60405180910390fd5b612f846000838361262a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fd49190614311565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130956000838361273e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156130f75760006003915091506131c0565b601b8560ff161415801561310f5750601c8560ff1614155b156131215760006004915091506131c0565b6000600187878787604051600081526020016040526040516131469493929190613e21565b6020604051602081039080840390855afa158015613168573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131b7576000600192509250506131c0565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61320c9190614311565b905061321a878288856130bc565b935093505050935093915050565b828054613234906144f3565b90600052602060002090601f016020900481019282613256576000855561329d565b82601f1061326f57803560ff191683800117855561329d565b8280016001018555821561329d579182015b8281111561329c578235825591602001919060010190613281565b5b5090506132aa91906132ae565b5090565b5b808211156132c75760008160009055506001016132af565b5090565b60006132de6132d984614288565b614263565b9050828152602081018484840111156132fa576132f9614760565b5b6133058482856144b1565b509392505050565b60008135905061331c81614ee4565b92915050565b60008135905061333181614efb565b92915050565b60008135905061334681614f12565b92915050565b60008135905061335b81614f29565b92915050565b60008151905061337081614f29565b92915050565b600082601f83011261338b5761338a614756565b5b813561339b8482602086016132cb565b91505092915050565b60008083601f8401126133ba576133b9614756565b5b8235905067ffffffffffffffff8111156133d7576133d6614751565b5b6020830191508360018202830111156133f3576133f261475b565b5b9250929050565b60008135905061340981614f40565b92915050565b6000602082840312156134255761342461476a565b5b60006134338482850161330d565b91505092915050565b600080604083850312156134535761345261476a565b5b60006134618582860161330d565b92505060206134728582860161330d565b9150509250929050565b6000806000606084860312156134955761349461476a565b5b60006134a38682870161330d565b93505060206134b48682870161330d565b92505060406134c5868287016133fa565b9150509250925092565b600080600080608085870312156134e9576134e861476a565b5b60006134f78782880161330d565b94505060206135088782880161330d565b9350506040613519878288016133fa565b925050606085013567ffffffffffffffff81111561353a57613539614765565b5b61354687828801613376565b91505092959194509250565b600080604083850312156135695761356861476a565b5b60006135778582860161330d565b925050602061358885828601613322565b9150509250929050565b600080604083850312156135a9576135a861476a565b5b60006135b78582860161330d565b92505060206135c8858286016133fa565b9150509250929050565b600080600080608085870312156135ec576135eb61476a565b5b60006135fa87828801613337565b945050602085013567ffffffffffffffff81111561361b5761361a614765565b5b61362787828801613376565b9350506040613638878288016133fa565b9250506060613649878288016133fa565b91505092959194509250565b60006020828403121561366b5761366a61476a565b5b60006136798482850161334c565b91505092915050565b6000602082840312156136985761369761476a565b5b60006136a684828501613361565b91505092915050565b600080602083850312156136c6576136c561476a565b5b600083013567ffffffffffffffff8111156136e4576136e3614765565b5b6136f0858286016133a4565b92509250509250929050565b6000602082840312156137125761371161476a565b5b6000613720848285016133fa565b91505092915050565b61373281614426565b82525050565b61374961374482614426565b61459f565b82525050565b61375881614438565b82525050565b61376781614444565b82525050565b61377e61377982614444565b6145b1565b82525050565b600061378f826142ce565b61379981856142e4565b93506137a98185602086016144c0565b6137b28161476f565b840191505092915050565b60006137c8826142d9565b6137d281856142f5565b93506137e28185602086016144c0565b6137eb8161476f565b840191505092915050565b6000613801826142d9565b61380b8185614306565b935061381b8185602086016144c0565b80840191505092915050565b60008154613834816144f3565b61383e8186614306565b94506001821660008114613859576001811461386a5761389d565b60ff1983168652818601935061389d565b613873856142b9565b60005b8381101561389557815481890152600182019150602081019050613876565b838801955050505b50505092915050565b60006138b36018836142f5565b91506138be8261478d565b602082019050919050565b60006138d66016836142f5565b91506138e1826147b6565b602082019050919050565b60006138f9601f836142f5565b9150613904826147df565b602082019050919050565b600061391c601c83614306565b915061392782614808565b601c82019050919050565b600061393f602b836142f5565b915061394a82614831565b604082019050919050565b60006139626032836142f5565b915061396d82614880565b604082019050919050565b60006139856026836142f5565b9150613990826148cf565b604082019050919050565b60006139a86025836142f5565b91506139b38261491e565b604082019050919050565b60006139cb601c836142f5565b91506139d68261496d565b602082019050919050565b60006139ee6024836142f5565b91506139f982614996565b604082019050919050565b6000613a116019836142f5565b9150613a1c826149e5565b602082019050919050565b6000613a34600c836142f5565b9150613a3f82614a0e565b602082019050919050565b6000613a576022836142f5565b9150613a6282614a37565b604082019050919050565b6000613a7a600b836142f5565b9150613a8582614a86565b602082019050919050565b6000613a9d602c836142f5565b9150613aa882614aaf565b604082019050919050565b6000613ac0601d836142f5565b9150613acb82614afe565b602082019050919050565b6000613ae36009836142f5565b9150613aee82614b27565b602082019050919050565b6000613b066038836142f5565b9150613b1182614b50565b604082019050919050565b6000613b29602a836142f5565b9150613b3482614b9f565b604082019050919050565b6000613b4c6029836142f5565b9150613b5782614bee565b604082019050919050565b6000613b6f6022836142f5565b9150613b7a82614c3d565b604082019050919050565b6000613b926020836142f5565b9150613b9d82614c8c565b602082019050919050565b6000613bb5602c836142f5565b9150613bc082614cb5565b604082019050919050565b6000613bd86020836142f5565b9150613be382614d04565b602082019050919050565b6000613bfb6024836142f5565b9150613c0682614d2d565b604082019050919050565b6000613c1e601f836142f5565b9150613c2982614d7c565b602082019050919050565b6000613c416021836142f5565b9150613c4c82614da5565b604082019050919050565b6000613c646031836142f5565b9150613c6f82614df4565b604082019050919050565b6000613c87602c836142f5565b9150613c9282614e43565b604082019050919050565b6000613caa600c836142f5565b9150613cb582614e92565b602082019050919050565b6000613ccd6010836142f5565b9150613cd882614ebb565b602082019050919050565b613cec8161449a565b82525050565b613d03613cfe8261449a565b6145cd565b82525050565b613d12816144a4565b82525050565b6000613d248286613738565b601482019150613d348285613cf2565b602082019150613d448284613cf2565b602082019150819050949350505050565b6000613d618285613827565b9150613d6d82846137f6565b91508190509392505050565b6000613d848261390f565b9150613d90828461376d565b60208201915081905092915050565b6000602082019050613db46000830184613729565b92915050565b6000608082019050613dcf6000830187613729565b613ddc6020830186613729565b613de96040830185613ce3565b8181036060830152613dfb8184613784565b905095945050505050565b6000602082019050613e1b600083018461374f565b92915050565b6000608082019050613e36600083018761375e565b613e436020830186613d09565b613e50604083018561375e565b613e5d606083018461375e565b95945050505050565b60006020820190508181036000830152613e8081846137bd565b905092915050565b60006020820190508181036000830152613ea1816138a6565b9050919050565b60006020820190508181036000830152613ec1816138c9565b9050919050565b60006020820190508181036000830152613ee1816138ec565b9050919050565b60006020820190508181036000830152613f0181613932565b9050919050565b60006020820190508181036000830152613f2181613955565b9050919050565b60006020820190508181036000830152613f4181613978565b9050919050565b60006020820190508181036000830152613f618161399b565b9050919050565b60006020820190508181036000830152613f81816139be565b9050919050565b60006020820190508181036000830152613fa1816139e1565b9050919050565b60006020820190508181036000830152613fc181613a04565b9050919050565b60006020820190508181036000830152613fe181613a27565b9050919050565b6000602082019050818103600083015261400181613a4a565b9050919050565b6000602082019050818103600083015261402181613a6d565b9050919050565b6000602082019050818103600083015261404181613a90565b9050919050565b6000602082019050818103600083015261406181613ab3565b9050919050565b6000602082019050818103600083015261408181613ad6565b9050919050565b600060208201905081810360008301526140a181613af9565b9050919050565b600060208201905081810360008301526140c181613b1c565b9050919050565b600060208201905081810360008301526140e181613b3f565b9050919050565b6000602082019050818103600083015261410181613b62565b9050919050565b6000602082019050818103600083015261412181613b85565b9050919050565b6000602082019050818103600083015261414181613ba8565b9050919050565b6000602082019050818103600083015261416181613bcb565b9050919050565b6000602082019050818103600083015261418181613bee565b9050919050565b600060208201905081810360008301526141a181613c11565b9050919050565b600060208201905081810360008301526141c181613c34565b9050919050565b600060208201905081810360008301526141e181613c57565b9050919050565b6000602082019050818103600083015261420181613c7a565b9050919050565b6000602082019050818103600083015261422181613c9d565b9050919050565b6000602082019050818103600083015261424181613cc0565b9050919050565b600060208201905061425d6000830184613ce3565b92915050565b600061426d61427e565b90506142798282614525565b919050565b6000604051905090565b600067ffffffffffffffff8211156142a3576142a2614722565b5b6142ac8261476f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061431c8261449a565b91506143278361449a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561435c5761435b614608565b5b828201905092915050565b60006143728261449a565b915061437d8361449a565b92508261438d5761438c614637565b5b828204905092915050565b60006143a38261449a565b91506143ae8361449a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143e7576143e6614608565b5b828202905092915050565b60006143fd8261449a565b91506144088361449a565b92508282101561441b5761441a614608565b5b828203905092915050565b60006144318261447a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156144de5780820151818401526020810190506144c3565b838111156144ed576000848401525b50505050565b6000600282049050600182168061450b57607f821691505b6020821081141561451f5761451e614695565b5b50919050565b61452e8261476f565b810181811067ffffffffffffffff8211171561454d5761454c614722565b5b80604052505050565b60006145618261449a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561459457614593614608565b5b600182019050919050565b60006145aa826145bb565b9050919050565b6000819050919050565b60006145c682614780565b9050919050565b6000819050919050565b60006145e28261449a565b91506145ed8361449a565b9250826145fd576145fc614637565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f484153485f4641494c0000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b614eed81614426565b8114614ef857600080fd5b50565b614f0481614438565b8114614f0f57600080fd5b50565b614f1b81614444565b8114614f2657600080fd5b50565b614f328161444e565b8114614f3d57600080fd5b50565b614f498161449a565b8114614f5457600080fd5b5056fea2646970667358221220735f3ac950732db3ef3038fc5b6fe7a3fe94e9b25097439ae1bd9dda43eb7b8c64736f6c63430008070033697066733a2f2f516d5457454a4a756845617267505152686e7057444548637477647a615354697477575a4e6939464b427142336f697066733a2f2f516d62583238743950377746796558446e68796b73686962385a6a7476796e4e347063596553727752574c6d70512f

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806388f2ebcb11610118578063c87b56dd116100a0578063e081b7811161006f578063e081b7811461077a578063e8a3d485146107a5578063e985e9c5146107d0578063f2fde38b1461080d578063faf924cf146108365761020f565b8063c87b56dd146106aa578063cb774d47146106e7578063cf30901214610712578063df5009191461073d5761020f565b8063938e3d7b116100e7578063938e3d7b146105ed57806395d89b4114610616578063989bdbb614610641578063a22cb46514610658578063b88d4fde146106815761020f565b806388f2ebcb146105435780638d859f3e1461056c5780638da5cb5b14610597578063902d55a5146105c25761020f565b80632f745c591161019b5780634f6ccce71161016a5780634f6ccce71461044c57806355f804b3146104895780636352211e146104b257806370a08231146104ef578063715018a61461052c5761020f565b80632f745c59146103b357806331fa3eb9146103f05780633ccfd60b1461040c57806342842e0e146104235761020f565b8063081812fc116101e2578063081812fc146102d0578063095ea7b31461030d578063109695231461033657806318160ddd1461035f57806323b872dd1461038a5761020f565b806301ffc9a714610214578063049c5c491461025157806306fdde031461026857806307a14ec214610293575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613655565b610861565b6040516102489190613e06565b60405180910390f35b34801561025d57600080fd5b506102666108db565b005b34801561027457600080fd5b5061027d610983565b60405161028a9190613e66565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b5919061340f565b610a15565b6040516102c79190614248565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f291906136fc565b610a5e565b6040516103049190613d9f565b60405180910390f35b34801561031957600080fd5b50610334600480360381019061032f9190613592565b610ae3565b005b34801561034257600080fd5b5061035d600480360381019061035891906136af565b610bfb565b005b34801561036b57600080fd5b50610374610cdd565b6040516103819190614248565b60405180910390f35b34801561039657600080fd5b506103b160048036038101906103ac919061347c565b610cea565b005b3480156103bf57600080fd5b506103da60048036038101906103d59190613592565b610d4a565b6040516103e79190614248565b60405180910390f35b61040a600480360381019061040591906135d2565b610def565b005b34801561041857600080fd5b506104216110a4565b005b34801561042f57600080fd5b5061044a6004803603810190610445919061347c565b611169565b005b34801561045857600080fd5b50610473600480360381019061046e91906136fc565b611189565b6040516104809190614248565b60405180910390f35b34801561049557600080fd5b506104b060048036038101906104ab91906136af565b6111fa565b005b3480156104be57600080fd5b506104d960048036038101906104d491906136fc565b6112dc565b6040516104e69190613d9f565b60405180910390f35b3480156104fb57600080fd5b506105166004803603810190610511919061340f565b61138e565b6040516105239190614248565b60405180910390f35b34801561053857600080fd5b50610541611446565b005b34801561054f57600080fd5b5061056a600480360381019061056591906136fc565b6114ce565b005b34801561057857600080fd5b50610581611599565b60405161058e9190614248565b60405180910390f35b3480156105a357600080fd5b506105ac6115a5565b6040516105b99190613d9f565b60405180910390f35b3480156105ce57600080fd5b506105d76115cf565b6040516105e49190614248565b60405180910390f35b3480156105f957600080fd5b50610614600480360381019061060f91906136af565b6115d5565b005b34801561062257600080fd5b5061062b611667565b6040516106389190613e66565b60405180910390f35b34801561064d57600080fd5b506106566116f9565b005b34801561066457600080fd5b5061067f600480360381019061067a9190613552565b611792565b005b34801561068d57600080fd5b506106a860048036038101906106a391906134cf565b6117a8565b005b3480156106b657600080fd5b506106d160048036038101906106cc91906136fc565b61180a565b6040516106de9190613e66565b60405180910390f35b3480156106f357600080fd5b506106fc6118a0565b6040516107099190614248565b60405180910390f35b34801561071e57600080fd5b506107276118a6565b6040516107349190613e06565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f919061340f565b6118b9565b6040516107719190614248565b60405180910390f35b34801561078657600080fd5b5061078f6118d1565b60405161079c9190613e06565b60405180910390f35b3480156107b157600080fd5b506107ba6118e4565b6040516107c79190613e66565b60405180910390f35b3480156107dc57600080fd5b506107f760048036038101906107f2919061343c565b611976565b6040516108049190613e06565b60405180910390f35b34801561081957600080fd5b50610834600480360381019061082f919061340f565b611a0a565b005b34801561084257600080fd5b5061084b611b02565b6040516108589190613e66565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d457506108d382611b90565b5b9050919050565b6108e3611c72565b73ffffffffffffffffffffffffffffffffffffffff166109016115a5565b73ffffffffffffffffffffffffffffffffffffffff1614610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90614148565b60405180910390fd5b601160009054906101000a900460ff1615601160006101000a81548160ff021916908315150217905550565b606060008054610992906144f3565b80601f01602080910402602001604051908101604052809291908181526020018280546109be906144f3565b8015610a0b5780601f106109e057610100808354040283529160200191610a0b565b820191906000526020600020905b8154815290600101906020018083116109ee57829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610a6982611c7a565b610aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9f90614128565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aee826112dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b56906141a8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b7e611c72565b73ffffffffffffffffffffffffffffffffffffffff161480610bad5750610bac81610ba7611c72565b611976565b5b610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390614088565b60405180910390fd5b610bf68383611ce6565b505050565b610c03611c72565b73ffffffffffffffffffffffffffffffffffffffff16610c216115a5565b73ffffffffffffffffffffffffffffffffffffffff1614610c77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6e90614148565b60405180910390fd5b601160019054906101000a900460ff1615610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90614168565b60405180910390fd5b818160109190610cd8929190613228565b505050565b6000600880549050905090565b610cfb610cf5611c72565b82611d9f565b610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d31906141c8565b60405180910390fd5b610d45838383611e7d565b505050565b6000610d558361138e565b8210610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d90613ee8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601160009054906101000a900460ff16610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590614008565b60405180910390fd5b610e4884846120e4565b610e87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7e90613ea8565b60405180910390fd5b83610e93338484612151565b14610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90614068565b60405180910390fd5b61271082610edf610cdd565b610ee99190614311565b1115610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2190613fc8565b60405180910390fd5b8082600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f769190614311565b1115610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae90614208565b60405180910390fd5b348267011c37937e080000610fcc9190614398565b111561100d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100490614228565b60405180910390fd5b60005b8281101561109d57600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061106890614556565b919050555061108a33600161107b610cdd565b6110859190614311565b6121b2565b808061109590614556565b915050611010565b5050505050565b6110ac611c72565b73ffffffffffffffffffffffffffffffffffffffff166110ca6115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111790614148565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611166573d6000803e3d6000fd5b50565b611184838383604051806020016040528060008152506117a8565b505050565b6000611193610cdd565b82106111d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cb906141e8565b60405180910390fd5b600882815481106111e8576111e76146f3565b5b90600052602060002001549050919050565b611202611c72565b73ffffffffffffffffffffffffffffffffffffffff166112206115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126d90614148565b60405180910390fd5b601160019054906101000a900460ff16156112c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bd90614168565b60405180910390fd5b8181600f91906112d7929190613228565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c906140c8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f6906140a8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61144e611c72565b73ffffffffffffffffffffffffffffffffffffffff1661146c6115a5565b73ffffffffffffffffffffffffffffffffffffffff16146114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b990614148565b60405180910390fd5b6114cc60006121d0565b565b6114d6611c72565b73ffffffffffffffffffffffffffffffffffffffff166114f46115a5565b73ffffffffffffffffffffffffffffffffffffffff161461154a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154190614148565b60405180910390fd5b6000600d541461158f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158690614048565b60405180910390fd5b80600d8190555050565b67011c37937e08000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61271081565b6115dd611c72565b73ffffffffffffffffffffffffffffffffffffffff166115fb6115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164890614148565b60405180910390fd5b8181600e9190611662929190613228565b505050565b606060018054611676906144f3565b80601f01602080910402602001604051908101604052809291908181526020018280546116a2906144f3565b80156116ef5780601f106116c4576101008083540402835291602001916116ef565b820191906000526020600020905b8154815290600101906020018083116116d257829003601f168201915b5050505050905090565b611701611c72565b73ffffffffffffffffffffffffffffffffffffffff1661171f6115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611775576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c90614148565b60405180910390fd5b6001601160016101000a81548160ff021916908315150217905550565b6117a461179d611c72565b8383612296565b5050565b6117b96117b3611c72565b83611d9f565b6117f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ef906141c8565b60405180910390fd5b61180484848484612403565b50505050565b606061181582611c7a565b611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b90614188565b60405180910390fd5b600f611879612710600d548561186a9190614311565b61187491906145d7565b61245f565b60405160200161188a929190613d55565b6040516020818303038152906040529050919050565b600d5481565b601160019054906101000a900460ff1681565b600c6020528060005260406000206000915090505481565b601160009054906101000a900460ff1681565b6060600e80546118f3906144f3565b80601f016020809104026020016040519081016040528092919081815260200182805461191f906144f3565b801561196c5780601f106119415761010080835404028352916020019161196c565b820191906000526020600020905b81548152906001019060200180831161194f57829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a12611c72565b73ffffffffffffffffffffffffffffffffffffffff16611a306115a5565b73ffffffffffffffffffffffffffffffffffffffff1614611a86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7d90614148565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90613f28565b60405180910390fd5b611aff816121d0565b50565b60108054611b0f906144f3565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3b906144f3565b8015611b885780601f10611b5d57610100808354040283529160200191611b88565b820191906000526020600020905b815481529060010190602001808311611b6b57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c6b5750611c6a826125c0565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d59836112dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611daa82611c7a565b611de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de090614028565b60405180910390fd5b6000611df4836112dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e6357508373ffffffffffffffffffffffffffffffffffffffff16611e4b84610a5e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e745750611e738185611976565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9d826112dc565b73ffffffffffffffffffffffffffffffffffffffff1614611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea90613f48565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a90613f88565b60405180910390fd5b611f6e83838361262a565b611f79600082611ce6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fc991906143f2565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120209190614311565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120df83838361273e565b505050565b60006120f9828461274390919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60008084848460405160200161216993929190613d18565b6040516020818303038152906040528051906020012060405160200161218f9190613d79565b604051602081830303815290604052805190602001209050809150509392505050565b6121cc82826040518060200160405280600081525061276a565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc90613fa8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123f69190613e06565b60405180910390a3505050565b61240e848484611e7d565b61241a848484846127c5565b612459576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245090613f08565b60405180910390fd5b50505050565b606060008214156124a7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125bb565b600082905060005b600082146124d95780806124c290614556565b915050600a826124d29190614367565b91506124af565b60008167ffffffffffffffff8111156124f5576124f4614722565b5b6040519080825280601f01601f1916602001820160405280156125275781602001600182028036833780820191505090505b5090505b600085146125b45760018261254091906143f2565b9150600a8561254f91906145d7565b603061255b9190614311565b60f81b818381518110612571576125706146f3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125ad9190614367565b945061252b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61263583838361295c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126785761267381612961565b6126b7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126b6576126b583826129aa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126fa576126f581612b17565b612739565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612738576127378282612be8565b5b5b505050565b505050565b60008060006127528585612c67565b9150915061275f81612cea565b819250505092915050565b6127748383612ebf565b61278160008484846127c5565b6127c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b790613f08565b60405180910390fd5b505050565b60006127e68473ffffffffffffffffffffffffffffffffffffffff16613099565b1561294f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261280f611c72565b8786866040518563ffffffff1660e01b81526004016128319493929190613dba565b602060405180830381600087803b15801561284b57600080fd5b505af192505050801561287c57506040513d601f19601f820116820180604052508101906128799190613682565b60015b6128ff573d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b506000815114156128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90613f08565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612954565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016129b78461138e565b6129c191906143f2565b9050600060076000848152602001908152602001600020549050818114612aa6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b2b91906143f2565b9050600060096000848152602001908152602001600020549050600060088381548110612b5b57612b5a6146f3565b5b906000526020600020015490508060088381548110612b7d57612b7c6146f3565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612bcc57612bcb6146c4565b5b6001900381819060005260206000200160009055905550505050565b6000612bf38361138e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080604183511415612ca95760008060006020860151925060408601519150606086015160001a9050612c9d878285856130bc565b94509450505050612ce3565b604083511415612cda576000806020850151915060408501519050612ccf8683836131c9565b935093505050612ce3565b60006002915091505b9250929050565b60006004811115612cfe57612cfd614666565b5b816004811115612d1157612d10614666565b5b1415612d1c57612ebc565b60016004811115612d3057612d2f614666565b5b816004811115612d4357612d42614666565b5b1415612d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7b90613e88565b60405180910390fd5b60026004811115612d9857612d97614666565b5b816004811115612dab57612daa614666565b5b1415612dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de390613ec8565b60405180910390fd5b60036004811115612e0057612dff614666565b5b816004811115612e1357612e12614666565b5b1415612e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4b90613fe8565b60405180910390fd5b600480811115612e6757612e66614666565b5b816004811115612e7a57612e79614666565b5b1415612ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb2906140e8565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2690614108565b60405180910390fd5b612f3881611c7a565b15612f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6f90613f68565b60405180910390fd5b612f846000838361262a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fd49190614311565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130956000838361273e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156130f75760006003915091506131c0565b601b8560ff161415801561310f5750601c8560ff1614155b156131215760006004915091506131c0565b6000600187878787604051600081526020016040526040516131469493929190613e21565b6020604051602081039080840390855afa158015613168573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131b7576000600192509250506131c0565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61320c9190614311565b905061321a878288856130bc565b935093505050935093915050565b828054613234906144f3565b90600052602060002090601f016020900481019282613256576000855561329d565b82601f1061326f57803560ff191683800117855561329d565b8280016001018555821561329d579182015b8281111561329c578235825591602001919060010190613281565b5b5090506132aa91906132ae565b5090565b5b808211156132c75760008160009055506001016132af565b5090565b60006132de6132d984614288565b614263565b9050828152602081018484840111156132fa576132f9614760565b5b6133058482856144b1565b509392505050565b60008135905061331c81614ee4565b92915050565b60008135905061333181614efb565b92915050565b60008135905061334681614f12565b92915050565b60008135905061335b81614f29565b92915050565b60008151905061337081614f29565b92915050565b600082601f83011261338b5761338a614756565b5b813561339b8482602086016132cb565b91505092915050565b60008083601f8401126133ba576133b9614756565b5b8235905067ffffffffffffffff8111156133d7576133d6614751565b5b6020830191508360018202830111156133f3576133f261475b565b5b9250929050565b60008135905061340981614f40565b92915050565b6000602082840312156134255761342461476a565b5b60006134338482850161330d565b91505092915050565b600080604083850312156134535761345261476a565b5b60006134618582860161330d565b92505060206134728582860161330d565b9150509250929050565b6000806000606084860312156134955761349461476a565b5b60006134a38682870161330d565b93505060206134b48682870161330d565b92505060406134c5868287016133fa565b9150509250925092565b600080600080608085870312156134e9576134e861476a565b5b60006134f78782880161330d565b94505060206135088782880161330d565b9350506040613519878288016133fa565b925050606085013567ffffffffffffffff81111561353a57613539614765565b5b61354687828801613376565b91505092959194509250565b600080604083850312156135695761356861476a565b5b60006135778582860161330d565b925050602061358885828601613322565b9150509250929050565b600080604083850312156135a9576135a861476a565b5b60006135b78582860161330d565b92505060206135c8858286016133fa565b9150509250929050565b600080600080608085870312156135ec576135eb61476a565b5b60006135fa87828801613337565b945050602085013567ffffffffffffffff81111561361b5761361a614765565b5b61362787828801613376565b9350506040613638878288016133fa565b9250506060613649878288016133fa565b91505092959194509250565b60006020828403121561366b5761366a61476a565b5b60006136798482850161334c565b91505092915050565b6000602082840312156136985761369761476a565b5b60006136a684828501613361565b91505092915050565b600080602083850312156136c6576136c561476a565b5b600083013567ffffffffffffffff8111156136e4576136e3614765565b5b6136f0858286016133a4565b92509250509250929050565b6000602082840312156137125761371161476a565b5b6000613720848285016133fa565b91505092915050565b61373281614426565b82525050565b61374961374482614426565b61459f565b82525050565b61375881614438565b82525050565b61376781614444565b82525050565b61377e61377982614444565b6145b1565b82525050565b600061378f826142ce565b61379981856142e4565b93506137a98185602086016144c0565b6137b28161476f565b840191505092915050565b60006137c8826142d9565b6137d281856142f5565b93506137e28185602086016144c0565b6137eb8161476f565b840191505092915050565b6000613801826142d9565b61380b8185614306565b935061381b8185602086016144c0565b80840191505092915050565b60008154613834816144f3565b61383e8186614306565b94506001821660008114613859576001811461386a5761389d565b60ff1983168652818601935061389d565b613873856142b9565b60005b8381101561389557815481890152600182019150602081019050613876565b838801955050505b50505092915050565b60006138b36018836142f5565b91506138be8261478d565b602082019050919050565b60006138d66016836142f5565b91506138e1826147b6565b602082019050919050565b60006138f9601f836142f5565b9150613904826147df565b602082019050919050565b600061391c601c83614306565b915061392782614808565b601c82019050919050565b600061393f602b836142f5565b915061394a82614831565b604082019050919050565b60006139626032836142f5565b915061396d82614880565b604082019050919050565b60006139856026836142f5565b9150613990826148cf565b604082019050919050565b60006139a86025836142f5565b91506139b38261491e565b604082019050919050565b60006139cb601c836142f5565b91506139d68261496d565b602082019050919050565b60006139ee6024836142f5565b91506139f982614996565b604082019050919050565b6000613a116019836142f5565b9150613a1c826149e5565b602082019050919050565b6000613a34600c836142f5565b9150613a3f82614a0e565b602082019050919050565b6000613a576022836142f5565b9150613a6282614a37565b604082019050919050565b6000613a7a600b836142f5565b9150613a8582614a86565b602082019050919050565b6000613a9d602c836142f5565b9150613aa882614aaf565b604082019050919050565b6000613ac0601d836142f5565b9150613acb82614afe565b602082019050919050565b6000613ae36009836142f5565b9150613aee82614b27565b602082019050919050565b6000613b066038836142f5565b9150613b1182614b50565b604082019050919050565b6000613b29602a836142f5565b9150613b3482614b9f565b604082019050919050565b6000613b4c6029836142f5565b9150613b5782614bee565b604082019050919050565b6000613b6f6022836142f5565b9150613b7a82614c3d565b604082019050919050565b6000613b926020836142f5565b9150613b9d82614c8c565b602082019050919050565b6000613bb5602c836142f5565b9150613bc082614cb5565b604082019050919050565b6000613bd86020836142f5565b9150613be382614d04565b602082019050919050565b6000613bfb6024836142f5565b9150613c0682614d2d565b604082019050919050565b6000613c1e601f836142f5565b9150613c2982614d7c565b602082019050919050565b6000613c416021836142f5565b9150613c4c82614da5565b604082019050919050565b6000613c646031836142f5565b9150613c6f82614df4565b604082019050919050565b6000613c87602c836142f5565b9150613c9282614e43565b604082019050919050565b6000613caa600c836142f5565b9150613cb582614e92565b602082019050919050565b6000613ccd6010836142f5565b9150613cd882614ebb565b602082019050919050565b613cec8161449a565b82525050565b613d03613cfe8261449a565b6145cd565b82525050565b613d12816144a4565b82525050565b6000613d248286613738565b601482019150613d348285613cf2565b602082019150613d448284613cf2565b602082019150819050949350505050565b6000613d618285613827565b9150613d6d82846137f6565b91508190509392505050565b6000613d848261390f565b9150613d90828461376d565b60208201915081905092915050565b6000602082019050613db46000830184613729565b92915050565b6000608082019050613dcf6000830187613729565b613ddc6020830186613729565b613de96040830185613ce3565b8181036060830152613dfb8184613784565b905095945050505050565b6000602082019050613e1b600083018461374f565b92915050565b6000608082019050613e36600083018761375e565b613e436020830186613d09565b613e50604083018561375e565b613e5d606083018461375e565b95945050505050565b60006020820190508181036000830152613e8081846137bd565b905092915050565b60006020820190508181036000830152613ea1816138a6565b9050919050565b60006020820190508181036000830152613ec1816138c9565b9050919050565b60006020820190508181036000830152613ee1816138ec565b9050919050565b60006020820190508181036000830152613f0181613932565b9050919050565b60006020820190508181036000830152613f2181613955565b9050919050565b60006020820190508181036000830152613f4181613978565b9050919050565b60006020820190508181036000830152613f618161399b565b9050919050565b60006020820190508181036000830152613f81816139be565b9050919050565b60006020820190508181036000830152613fa1816139e1565b9050919050565b60006020820190508181036000830152613fc181613a04565b9050919050565b60006020820190508181036000830152613fe181613a27565b9050919050565b6000602082019050818103600083015261400181613a4a565b9050919050565b6000602082019050818103600083015261402181613a6d565b9050919050565b6000602082019050818103600083015261404181613a90565b9050919050565b6000602082019050818103600083015261406181613ab3565b9050919050565b6000602082019050818103600083015261408181613ad6565b9050919050565b600060208201905081810360008301526140a181613af9565b9050919050565b600060208201905081810360008301526140c181613b1c565b9050919050565b600060208201905081810360008301526140e181613b3f565b9050919050565b6000602082019050818103600083015261410181613b62565b9050919050565b6000602082019050818103600083015261412181613b85565b9050919050565b6000602082019050818103600083015261414181613ba8565b9050919050565b6000602082019050818103600083015261416181613bcb565b9050919050565b6000602082019050818103600083015261418181613bee565b9050919050565b600060208201905081810360008301526141a181613c11565b9050919050565b600060208201905081810360008301526141c181613c34565b9050919050565b600060208201905081810360008301526141e181613c57565b9050919050565b6000602082019050818103600083015261420181613c7a565b9050919050565b6000602082019050818103600083015261422181613c9d565b9050919050565b6000602082019050818103600083015261424181613cc0565b9050919050565b600060208201905061425d6000830184613ce3565b92915050565b600061426d61427e565b90506142798282614525565b919050565b6000604051905090565b600067ffffffffffffffff8211156142a3576142a2614722565b5b6142ac8261476f565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061431c8261449a565b91506143278361449a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561435c5761435b614608565b5b828201905092915050565b60006143728261449a565b915061437d8361449a565b92508261438d5761438c614637565b5b828204905092915050565b60006143a38261449a565b91506143ae8361449a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143e7576143e6614608565b5b828202905092915050565b60006143fd8261449a565b91506144088361449a565b92508282101561441b5761441a614608565b5b828203905092915050565b60006144318261447a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156144de5780820151818401526020810190506144c3565b838111156144ed576000848401525b50505050565b6000600282049050600182168061450b57607f821691505b6020821081141561451f5761451e614695565b5b50919050565b61452e8261476f565b810181811067ffffffffffffffff8211171561454d5761454c614722565b5b80604052505050565b60006145618261449a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561459457614593614608565b5b600182019050919050565b60006145aa826145bb565b9050919050565b6000819050919050565b60006145c682614780565b9050919050565b6000819050919050565b60006145e28261449a565b91506145ed8361449a565b9250826145fd576145fc614637565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f55545f4f465f53544f434b0000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f53414c455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5374617274696e6720696e64657820697320616c726561647920736574000000600082015250565b7f484153485f4641494c0000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e7472616374206d65746164617461206d6574686f647320617265206c6f60008201527f636b656400000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4558434545445f414c4c4f430000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b614eed81614426565b8114614ef857600080fd5b50565b614f0481614438565b8114614f0f57600080fd5b50565b614f1b81614444565b8114614f2657600080fd5b50565b614f328161444e565b8114614f3d57600080fd5b50565b614f498161449a565b8114614f5457600080fd5b5056fea2646970667358221220735f3ac950732db3ef3038fc5b6fe7a3fe94e9b25097439ae1bd9dda43eb7b8c64736f6c63430008070033

Deployed Bytecode Sourcemap

55160:6693:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48848:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60045:86;;;;;;;;;;;;;:::i;:::-;;35668:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59718:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37227:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36750:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60264:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49488:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37977:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49156:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58276:1003;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59426:186;;;;;;;;;;;;;:::i;:::-;;38387:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49678:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60684:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35362:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35092:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14264:103;;;;;;;;;;;;;:::i;:::-;;61114:240;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55567:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13613:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55516:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60464:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35837:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59914:75;;;;;;;;;;;;;:::i;:::-;;37520:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38643:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61572:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55851:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56712:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55666:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56628:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60904:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37746:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14522:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56597:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48848:224;48950:4;48989:35;48974:50;;;:11;:50;;;;:90;;;;49028:36;49052:11;49028:23;:36::i;:::-;48974:90;48967:97;;48848:224;;;:::o;60045:86::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60115:8:::1;;;;;;;;;;;60114:9;60103:8;;:20;;;;;;;;;;;;;;;;;;60045:86::o:0;35668:100::-;35722:13;35755:5;35748:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35668:100;:::o;59718:125::-;59786:7;59813:16;:22;59830:4;59813:22;;;;;;;;;;;;;;;;59806:29;;59718:125;;;:::o;37227:221::-;37303:7;37331:16;37339:7;37331;:16::i;:::-;37323:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37416:15;:24;37432:7;37416:24;;;;;;;;;;;;;;;;;;;;;37409:31;;37227:221;;;:::o;36750:411::-;36831:13;36847:23;36862:7;36847:14;:23::i;:::-;36831:39;;36895:5;36889:11;;:2;:11;;;;36881:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36989:5;36973:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36998:37;37015:5;37022:12;:10;:12::i;:::-;36998:16;:37::i;:::-;36973:62;36951:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;37132:21;37141:2;37145:7;37132:8;:21::i;:::-;36820:341;36750:411;;:::o;60264:109::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56833:6:::1;;;;;;;;;;;56832:7;56824:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;60361:4:::2;;60353:5;:12;;;;;;;:::i;:::-;;60264:109:::0;;:::o;49488:113::-;49549:7;49576:10;:17;;;;49569:24;;49488:113;:::o;37977:339::-;38172:41;38191:12;:10;:12::i;:::-;38205:7;38172:18;:41::i;:::-;38164:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38280:28;38290:4;38296:2;38300:7;38280:9;:28::i;:::-;37977:339;;;:::o;49156:256::-;49253:7;49289:23;49306:5;49289:16;:23::i;:::-;49281:5;:31;49273:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;49378:12;:19;49391:5;49378:19;;;;;;;;;;;;;;;:26;49398:5;49378:26;;;;;;;;;;;;49371:33;;49156:256;;;;:::o;58276:1003::-;58413:8;;;;;;;;;;;58405:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;58491:34;58509:4;58515:9;58491:17;:34::i;:::-;58483:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;58735:4;58671:60;58687:10;58699:13;58714:16;58671:15;:60::i;:::-;:68;58663:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;55555:5;58819:13;58803;:11;:13::i;:::-;:29;;;;:::i;:::-;:45;;58795:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;58988:16;58971:13;58940:16;:28;58957:10;58940:28;;;;;;;;;;;;;;;;:44;;;;:::i;:::-;:64;;58932:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;59065:9;59048:13;55599:10;59040:21;;;;:::i;:::-;:34;;59032:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;59112:9;59108:155;59131:13;59127:1;:17;59108:155;;;59166:16;:28;59183:10;59166:28;;;;;;;;;;;;;;;;:30;;;;;;;;;:::i;:::-;;;;;;59211:40;59221:10;59249:1;59233:13;:11;:13::i;:::-;:17;;;;:::i;:::-;59211:9;:40::i;:::-;59146:3;;;;;:::i;:::-;;;;59108:155;;;;58276:1003;;;;:::o;59426:186::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59561:10:::1;59553:28;;:51;59582:21;59553:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;59426:186::o:0;38387:185::-;38525:39;38542:4;38548:2;38552:7;38525:39;;;;;;;;;;;;:16;:39::i;:::-;38387:185;;;:::o;49678:233::-;49753:7;49789:30;:28;:30::i;:::-;49781:5;:38;49773:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;49886:10;49897:5;49886:17;;;;;;;;:::i;:::-;;;;;;;;;;49879:24;;49678:233;;;:::o;60684:108::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56833:6:::1;;;;;;;;;;;56832:7;56824:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;60781:3:::2;;60765:13;:19;;;;;;;:::i;:::-;;60684:108:::0;;:::o;35362:239::-;35434:7;35454:13;35470:7;:16;35478:7;35470:16;;;;;;;;;;;;;;;;;;;;;35454:32;;35522:1;35505:19;;:5;:19;;;;35497:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35588:5;35581:12;;;35362:239;;;:::o;35092:208::-;35164:7;35209:1;35192:19;;:5;:19;;;;35184:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35276:9;:16;35286:5;35276:16;;;;;;;;;;;;;;;;35269:23;;35092:208;;;:::o;14264:103::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14329:30:::1;14356:1;14329:18;:30::i;:::-;14264:103::o:0;61114:240::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61271:1:::1;61254:13;;:18;61246:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;61340:6;61324:13;:22;;;;61114:240:::0;:::o;55567:42::-;55599:10;55567:42;:::o;13613:87::-;13659:7;13686:6;;;;;;;;;;;13679:13;;13613:87;:::o;55516:44::-;55555:5;55516:44;:::o;60464:101::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60554:3:::1;;60539:12;:18;;;;;;;:::i;:::-;;60464:101:::0;;:::o;35837:104::-;35893:13;35926:7;35919:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35837:104;:::o;59914:75::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59977:4:::1;59968:6;;:13;;;;;;;;;;;;;;;;;;59914:75::o:0;37520:155::-;37615:52;37634:12;:10;:12::i;:::-;37648:8;37658;37615:18;:52::i;:::-;37520:155;;:::o;38643:328::-;38818:41;38837:12;:10;:12::i;:::-;38851:7;38818:18;:41::i;:::-;38810:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38924:39;38938:4;38944:2;38948:7;38957:5;38924:13;:39::i;:::-;38643:328;;;;:::o;61572:278::-;61645:13;61679:16;61687:7;61679;:16::i;:::-;61671:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;61773:13;61788:52;55555:5;61800:13;;61790:7;:23;;;;:::i;:::-;61789:39;;;;:::i;:::-;61788:50;:52::i;:::-;61756:85;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61742:100;;61572:278;;;:::o;55851:28::-;;;;:::o;56712:18::-;;;;;;;;;;;;;:::o;55666:51::-;;;;;;;;;;;;;;;;;:::o;56628:20::-;;;;;;;;;;;;;:::o;60904:97::-;60948:13;60981:12;60974:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60904:97;:::o;37746:164::-;37843:4;37867:18;:25;37886:5;37867:25;;;;;;;;;;;;;;;:35;37893:8;37867:35;;;;;;;;;;;;;;;;;;;;;;;;;37860:42;;37746:164;;;;:::o;14522:201::-;13844:12;:10;:12::i;:::-;13833:23;;:7;:5;:7::i;:::-;:23;;;13825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14631:1:::1;14611:22;;:8;:22;;;;14603:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14687:28;14706:8;14687:18;:28::i;:::-;14522:201:::0;:::o;56597:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34723:305::-;34825:4;34877:25;34862:40;;;:11;:40;;;;:105;;;;34934:33;34919:48;;;:11;:48;;;;34862:105;:158;;;;34984:36;35008:11;34984:23;:36::i;:::-;34862:158;34842:178;;34723:305;;;:::o;12337:98::-;12390:7;12417:10;12410:17;;12337:98;:::o;40481:127::-;40546:4;40598:1;40570:30;;:7;:16;40578:7;40570:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40563:37;;40481:127;;;:::o;44627:174::-;44729:2;44702:15;:24;44718:7;44702:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44785:7;44781:2;44747:46;;44756:23;44771:7;44756:14;:23::i;:::-;44747:46;;;;;;;;;;;;44627:174;;:::o;40775:348::-;40868:4;40893:16;40901:7;40893;:16::i;:::-;40885:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40969:13;40985:23;41000:7;40985:14;:23::i;:::-;40969:39;;41038:5;41027:16;;:7;:16;;;:51;;;;41071:7;41047:31;;:20;41059:7;41047:11;:20::i;:::-;:31;;;41027:51;:87;;;;41082:32;41099:5;41106:7;41082:16;:32::i;:::-;41027:87;41019:96;;;40775:348;;;;:::o;43884:625::-;44043:4;44016:31;;:23;44031:7;44016:14;:23::i;:::-;:31;;;44008:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;44122:1;44108:16;;:2;:16;;;;44100:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44178:39;44199:4;44205:2;44209:7;44178:20;:39::i;:::-;44282:29;44299:1;44303:7;44282:8;:29::i;:::-;44343:1;44324:9;:15;44334:4;44324:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44372:1;44355:9;:13;44365:2;44355:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44403:2;44384:7;:16;44392:7;44384:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44442:7;44438:2;44423:27;;44432:4;44423:27;;;;;;;;;;;;44463:38;44483:4;44489:2;44493:7;44463:19;:38::i;:::-;43884:625;;;:::o;57875:159::-;57961:4;58003:23;58016:9;58003:4;:12;;:23;;;;:::i;:::-;57985:41;;:14;;;;;;;;;;;:41;;;57978:48;;57875:159;;;;:::o;57219:332::-;57320:7;57342:12;57474:6;57482:3;57487:16;57457:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57447:58;;;;;;57367:139;;;;;;;;:::i;:::-;;;;;;;;;;;;;57357:162;;;;;;57342:177;;57539:4;57532:11;;;57219:332;;;;;:::o;41465:110::-;41541:26;41551:2;41555:7;41541:26;;;;;;;;;;;;:9;:26::i;:::-;41465:110;;:::o;14883:191::-;14957:16;14976:6;;;;;;;;;;;14957:25;;15002:8;14993:6;;:17;;;;;;;;;;;;;;;;;;15057:8;15026:40;;15047:8;15026:40;;;;;;;;;;;;14946:128;14883:191;:::o;44943:315::-;45098:8;45089:17;;:5;:17;;;;45081:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45185:8;45147:18;:25;45166:5;45147:25;;;;;;;;;;;;;;;:35;45173:8;45147:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45231:8;45209:41;;45224:5;45209:41;;;45241:8;45209:41;;;;;;:::i;:::-;;;;;;;;44943:315;;;:::o;39853:::-;40010:28;40020:4;40026:2;40030:7;40010:9;:28::i;:::-;40057:48;40080:4;40086:2;40090:7;40099:5;40057:22;:48::i;:::-;40049:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;39853:315;;;;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;26397:157::-;26482:4;26521:25;26506:40;;;:11;:40;;;;26499:47;;26397:157;;;:::o;50524:589::-;50668:45;50695:4;50701:2;50705:7;50668:26;:45::i;:::-;50746:1;50730:18;;:4;:18;;;50726:187;;;50765:40;50797:7;50765:31;:40::i;:::-;50726:187;;;50835:2;50827:10;;:4;:10;;;50823:90;;50854:47;50887:4;50893:7;50854:32;:47::i;:::-;50823:90;50726:187;50941:1;50927:16;;:2;:16;;;50923:183;;;50960:45;50997:7;50960:36;:45::i;:::-;50923:183;;;51033:4;51027:10;;:2;:10;;;51023:83;;51054:40;51082:2;51086:7;51054:27;:40::i;:::-;51023:83;50923:183;50524:589;;;:::o;47705:125::-;;;;:::o;6541:231::-;6619:7;6640:17;6659:18;6681:27;6692:4;6698:9;6681:10;:27::i;:::-;6639:69;;;;6719:18;6731:5;6719:11;:18::i;:::-;6755:9;6748:16;;;;6541:231;;;;:::o;41802:321::-;41932:18;41938:2;41942:7;41932:5;:18::i;:::-;41983:54;42014:1;42018:2;42022:7;42031:5;41983:22;:54::i;:::-;41961:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;41802:321;;;:::o;45823:799::-;45978:4;45999:15;:2;:13;;;:15::i;:::-;45995:620;;;46051:2;46035:36;;;46072:12;:10;:12::i;:::-;46086:4;46092:7;46101:5;46035:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46031:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46294:1;46277:6;:13;:18;46273:272;;;46320:60;;;;;;;;;;:::i;:::-;;;;;;;;46273:272;46495:6;46489:13;46480:6;46476:2;46472:15;46465:38;46031:529;46168:41;;;46158:51;;;:6;:51;;;;46151:58;;;;;45995:620;46599:4;46592:11;;45823:799;;;;;;;:::o;47194:126::-;;;;:::o;51836:164::-;51940:10;:17;;;;51913:15;:24;51929:7;51913:24;;;;;;;;;;;:44;;;;51968:10;51984:7;51968:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51836:164;:::o;52627:988::-;52893:22;52943:1;52918:22;52935:4;52918:16;:22::i;:::-;:26;;;;:::i;:::-;52893:51;;52955:18;52976:17;:26;52994:7;52976:26;;;;;;;;;;;;52955:47;;53123:14;53109:10;:28;53105:328;;53154:19;53176:12;:18;53189:4;53176:18;;;;;;;;;;;;;;;:34;53195:14;53176:34;;;;;;;;;;;;53154:56;;53260:11;53227:12;:18;53240:4;53227:18;;;;;;;;;;;;;;;:30;53246:10;53227:30;;;;;;;;;;;:44;;;;53377:10;53344:17;:30;53362:11;53344:30;;;;;;;;;;;:43;;;;53139:294;53105:328;53529:17;:26;53547:7;53529:26;;;;;;;;;;;53522:33;;;53573:12;:18;53586:4;53573:18;;;;;;;;;;;;;;;:34;53592:14;53573:34;;;;;;;;;;;53566:41;;;52708:907;;52627:988;;:::o;53910:1079::-;54163:22;54208:1;54188:10;:17;;;;:21;;;;:::i;:::-;54163:46;;54220:18;54241:15;:24;54257:7;54241:24;;;;;;;;;;;;54220:45;;54592:19;54614:10;54625:14;54614:26;;;;;;;;:::i;:::-;;;;;;;;;;54592:48;;54678:11;54653:10;54664;54653:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;54789:10;54758:15;:28;54774:11;54758:28;;;;;;;;;;;:41;;;;54930:15;:24;54946:7;54930:24;;;;;;;;;;;54923:31;;;54965:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53981:1008;;;53910:1079;:::o;51414:221::-;51499:14;51516:20;51533:2;51516:16;:20::i;:::-;51499:37;;51574:7;51547:12;:16;51560:2;51547:16;;;;;;;;;;;;;;;:24;51564:6;51547:24;;;;;;;;;;;:34;;;;51621:6;51592:17;:26;51610:7;51592:26;;;;;;;;;;;:35;;;;51488:147;51414:221;;:::o;4431:1308::-;4512:7;4521:12;4766:2;4746:9;:16;:22;4742:990;;;4785:9;4809;4833:7;5042:4;5031:9;5027:20;5021:27;5016:32;;5092:4;5081:9;5077:20;5071:27;5066:32;;5150:4;5139:9;5135:20;5129:27;5126:1;5121:36;5116:41;;5193:25;5204:4;5210:1;5213;5216;5193:10;:25::i;:::-;5186:32;;;;;;;;;4742:990;5260:2;5240:9;:16;:22;5236:496;;;5279:9;5303:10;5515:4;5504:9;5500:20;5494:27;5489:32;;5566:4;5555:9;5551:20;5545:27;5539:33;;5608:23;5619:4;5625:1;5628:2;5608:10;:23::i;:::-;5601:30;;;;;;;;5236:496;5680:1;5684:35;5664:56;;;;4431:1308;;;;;;:::o;2702:643::-;2780:20;2771:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;2767:571;;;2817:7;;2767:571;2878:29;2869:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;2865:473;;;2924:34;;;;;;;;;;:::i;:::-;;;;;;;;2865:473;2989:35;2980:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;2976:362;;;3041:41;;;;;;;;;;:::i;:::-;;;;;;;;2976:362;3113:30;3104:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3100:238;;;3160:44;;;;;;;;;;:::i;:::-;;;;;;;;3100:238;3235:30;3226:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3222:116;;;3282:44;;;;;;;;;;:::i;:::-;;;;;;;;3222:116;2702:643;;:::o;42459:439::-;42553:1;42539:16;;:2;:16;;;;42531:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42612:16;42620:7;42612;:16::i;:::-;42611:17;42603:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42674:45;42703:1;42707:2;42711:7;42674:20;:45::i;:::-;42749:1;42732:9;:13;42742:2;42732:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42780:2;42761:7;:16;42769:7;42761:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42825:7;42821:2;42800:33;;42817:1;42800:33;;;;;;;;;;;;42846:44;42874:1;42878:2;42882:7;42846:19;:44::i;:::-;42459:439;;:::o;16314:326::-;16374:4;16631:1;16609:7;:19;;;:23;16602:30;;16314:326;;;:::o;7993:1632::-;8124:7;8133:12;9058:66;9053:1;9045:10;;:79;9041:163;;;9157:1;9161:30;9141:51;;;;;;9041:163;9223:2;9218:1;:7;;;;:18;;;;;9234:2;9229:1;:7;;;;9218:18;9214:102;;;9269:1;9273:30;9253:51;;;;;;9214:102;9413:14;9430:24;9440:4;9446:1;9449;9452;9430:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9413:41;;9487:1;9469:20;;:6;:20;;;9465:103;;;9522:1;9526:29;9506:50;;;;;;;9465:103;9588:6;9596:20;9580:37;;;;;7993:1632;;;;;;;;:::o;7035:344::-;7149:7;7158:12;7183:9;7208:66;7200:75;;7195:2;:80;7183:92;;7286:7;7325:2;7318:3;7311:2;7303:11;;:18;;7302:25;;;;:::i;:::-;7286:42;;7346:25;7357:4;7363:1;7366;7369;7346:10;:25::i;:::-;7339:32;;;;;;7035:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;707:139;;;;:::o;852:137::-;897:5;935:6;922:20;913:29;;951:32;977:5;951:32;:::i;:::-;852:137;;;;:::o;995:141::-;1051:5;1082:6;1076:13;1067:22;;1098:32;1124:5;1098:32;:::i;:::-;995:141;;;;:::o;1155:338::-;1210:5;1259:3;1252:4;1244:6;1240:17;1236:27;1226:122;;1267:79;;:::i;:::-;1226:122;1384:6;1371:20;1409:78;1483:3;1475:6;1468:4;1460:6;1456:17;1409:78;:::i;:::-;1400:87;;1216:277;1155:338;;;;:::o;1513:553::-;1571:8;1581:6;1631:3;1624:4;1616:6;1612:17;1608:27;1598:122;;1639:79;;:::i;:::-;1598:122;1752:6;1739:20;1729:30;;1782:18;1774:6;1771:30;1768:117;;;1804:79;;:::i;:::-;1768:117;1918:4;1910:6;1906:17;1894:29;;1972:3;1964:4;1956:6;1952:17;1942:8;1938:32;1935:41;1932:128;;;1979:79;;:::i;:::-;1932:128;1513:553;;;;;:::o;2072:139::-;2118:5;2156:6;2143:20;2134:29;;2172:33;2199:5;2172:33;:::i;:::-;2072:139;;;;:::o;2217:329::-;2276:6;2325:2;2313:9;2304:7;2300:23;2296:32;2293:119;;;2331:79;;:::i;:::-;2293:119;2451:1;2476:53;2521:7;2512:6;2501:9;2497:22;2476:53;:::i;:::-;2466:63;;2422:117;2217:329;;;;:::o;2552:474::-;2620:6;2628;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:53;2873:7;2864:6;2853:9;2849:22;2828:53;:::i;:::-;2818:63;;2774:117;2930:2;2956:53;3001:7;2992:6;2981:9;2977:22;2956:53;:::i;:::-;2946:63;;2901:118;2552:474;;;;;:::o;3032:619::-;3109:6;3117;3125;3174:2;3162:9;3153:7;3149:23;3145:32;3142:119;;;3180:79;;:::i;:::-;3142:119;3300:1;3325:53;3370:7;3361:6;3350:9;3346:22;3325:53;:::i;:::-;3315:63;;3271:117;3427:2;3453:53;3498:7;3489:6;3478:9;3474:22;3453:53;:::i;:::-;3443:63;;3398:118;3555:2;3581:53;3626:7;3617:6;3606:9;3602:22;3581:53;:::i;:::-;3571:63;;3526:118;3032:619;;;;;:::o;3657:943::-;3752:6;3760;3768;3776;3825:3;3813:9;3804:7;3800:23;3796:33;3793:120;;;3832:79;;:::i;:::-;3793:120;3952:1;3977:53;4022:7;4013:6;4002:9;3998:22;3977:53;:::i;:::-;3967:63;;3923:117;4079:2;4105:53;4150:7;4141:6;4130:9;4126:22;4105:53;:::i;:::-;4095:63;;4050:118;4207:2;4233:53;4278:7;4269:6;4258:9;4254:22;4233:53;:::i;:::-;4223:63;;4178:118;4363:2;4352:9;4348:18;4335:32;4394:18;4386:6;4383:30;4380:117;;;4416:79;;:::i;:::-;4380:117;4521:62;4575:7;4566:6;4555:9;4551:22;4521:62;:::i;:::-;4511:72;;4306:287;3657:943;;;;;;;:::o;4606:468::-;4671:6;4679;4728:2;4716:9;4707:7;4703:23;4699:32;4696:119;;;4734:79;;:::i;:::-;4696:119;4854:1;4879:53;4924:7;4915:6;4904:9;4900:22;4879:53;:::i;:::-;4869:63;;4825:117;4981:2;5007:50;5049:7;5040:6;5029:9;5025:22;5007:50;:::i;:::-;4997:60;;4952:115;4606:468;;;;;:::o;5080:474::-;5148:6;5156;5205:2;5193:9;5184:7;5180:23;5176:32;5173:119;;;5211:79;;:::i;:::-;5173:119;5331:1;5356:53;5401:7;5392:6;5381:9;5377:22;5356:53;:::i;:::-;5346:63;;5302:117;5458:2;5484:53;5529:7;5520:6;5509:9;5505:22;5484:53;:::i;:::-;5474:63;;5429:118;5080:474;;;;;:::o;5560:943::-;5655:6;5663;5671;5679;5728:3;5716:9;5707:7;5703:23;5699:33;5696:120;;;5735:79;;:::i;:::-;5696:120;5855:1;5880:53;5925:7;5916:6;5905:9;5901:22;5880:53;:::i;:::-;5870:63;;5826:117;6010:2;5999:9;5995:18;5982:32;6041:18;6033:6;6030:30;6027:117;;;6063:79;;:::i;:::-;6027:117;6168:62;6222:7;6213:6;6202:9;6198:22;6168:62;:::i;:::-;6158:72;;5953:287;6279:2;6305:53;6350:7;6341:6;6330:9;6326:22;6305:53;:::i;:::-;6295:63;;6250:118;6407:2;6433:53;6478:7;6469:6;6458:9;6454:22;6433:53;:::i;:::-;6423:63;;6378:118;5560:943;;;;;;;:::o;6509:327::-;6567:6;6616:2;6604:9;6595:7;6591:23;6587:32;6584:119;;;6622:79;;:::i;:::-;6584:119;6742:1;6767:52;6811:7;6802:6;6791:9;6787:22;6767:52;:::i;:::-;6757:62;;6713:116;6509:327;;;;:::o;6842:349::-;6911:6;6960:2;6948:9;6939:7;6935:23;6931:32;6928:119;;;6966:79;;:::i;:::-;6928:119;7086:1;7111:63;7166:7;7157:6;7146:9;7142:22;7111:63;:::i;:::-;7101:73;;7057:127;6842:349;;;;:::o;7197:529::-;7268:6;7276;7325:2;7313:9;7304:7;7300:23;7296:32;7293:119;;;7331:79;;:::i;:::-;7293:119;7479:1;7468:9;7464:17;7451:31;7509:18;7501:6;7498:30;7495:117;;;7531:79;;:::i;:::-;7495:117;7644:65;7701:7;7692:6;7681:9;7677:22;7644:65;:::i;:::-;7626:83;;;;7422:297;7197:529;;;;;:::o;7732:329::-;7791:6;7840:2;7828:9;7819:7;7815:23;7811:32;7808:119;;;7846:79;;:::i;:::-;7808:119;7966:1;7991:53;8036:7;8027:6;8016:9;8012:22;7991:53;:::i;:::-;7981:63;;7937:117;7732:329;;;;:::o;8067:118::-;8154:24;8172:5;8154:24;:::i;:::-;8149:3;8142:37;8067:118;;:::o;8191:157::-;8296:45;8316:24;8334:5;8316:24;:::i;:::-;8296:45;:::i;:::-;8291:3;8284:58;8191:157;;:::o;8354:109::-;8435:21;8450:5;8435:21;:::i;:::-;8430:3;8423:34;8354:109;;:::o;8469:118::-;8556:24;8574:5;8556:24;:::i;:::-;8551:3;8544:37;8469:118;;:::o;8593:157::-;8698:45;8718:24;8736:5;8718:24;:::i;:::-;8698:45;:::i;:::-;8693:3;8686:58;8593:157;;:::o;8756:360::-;8842:3;8870:38;8902:5;8870:38;:::i;:::-;8924:70;8987:6;8982:3;8924:70;:::i;:::-;8917:77;;9003:52;9048:6;9043:3;9036:4;9029:5;9025:16;9003:52;:::i;:::-;9080:29;9102:6;9080:29;:::i;:::-;9075:3;9071:39;9064:46;;8846:270;8756:360;;;;:::o;9122:364::-;9210:3;9238:39;9271:5;9238:39;:::i;:::-;9293:71;9357:6;9352:3;9293:71;:::i;:::-;9286:78;;9373:52;9418:6;9413:3;9406:4;9399:5;9395:16;9373:52;:::i;:::-;9450:29;9472:6;9450:29;:::i;:::-;9445:3;9441:39;9434:46;;9214:272;9122:364;;;;:::o;9492:377::-;9598:3;9626:39;9659:5;9626:39;:::i;:::-;9681:89;9763:6;9758:3;9681:89;:::i;:::-;9674:96;;9779:52;9824:6;9819:3;9812:4;9805:5;9801:16;9779:52;:::i;:::-;9856:6;9851:3;9847:16;9840:23;;9602:267;9492:377;;;;:::o;9899:845::-;10002:3;10039:5;10033:12;10068:36;10094:9;10068:36;:::i;:::-;10120:89;10202:6;10197:3;10120:89;:::i;:::-;10113:96;;10240:1;10229:9;10225:17;10256:1;10251:137;;;;10402:1;10397:341;;;;10218:520;;10251:137;10335:4;10331:9;10320;10316:25;10311:3;10304:38;10371:6;10366:3;10362:16;10355:23;;10251:137;;10397:341;10464:38;10496:5;10464:38;:::i;:::-;10524:1;10538:154;10552:6;10549:1;10546:13;10538:154;;;10626:7;10620:14;10616:1;10611:3;10607:11;10600:35;10676:1;10667:7;10663:15;10652:26;;10574:4;10571:1;10567:12;10562:17;;10538:154;;;10721:6;10716:3;10712:16;10705:23;;10404:334;;10218:520;;10006:738;;9899:845;;;;:::o;10750:366::-;10892:3;10913:67;10977:2;10972:3;10913:67;:::i;:::-;10906:74;;10989:93;11078:3;10989:93;:::i;:::-;11107:2;11102:3;11098:12;11091:19;;10750:366;;;:::o;11122:::-;11264:3;11285:67;11349:2;11344:3;11285:67;:::i;:::-;11278:74;;11361:93;11450:3;11361:93;:::i;:::-;11479:2;11474:3;11470:12;11463:19;;11122:366;;;:::o;11494:::-;11636:3;11657:67;11721:2;11716:3;11657:67;:::i;:::-;11650:74;;11733:93;11822:3;11733:93;:::i;:::-;11851:2;11846:3;11842:12;11835:19;;11494:366;;;:::o;11866:402::-;12026:3;12047:85;12129:2;12124:3;12047:85;:::i;:::-;12040:92;;12141:93;12230:3;12141:93;:::i;:::-;12259:2;12254:3;12250:12;12243:19;;11866:402;;;:::o;12274:366::-;12416:3;12437:67;12501:2;12496:3;12437:67;:::i;:::-;12430:74;;12513:93;12602:3;12513:93;:::i;:::-;12631:2;12626:3;12622:12;12615:19;;12274:366;;;:::o;12646:::-;12788:3;12809:67;12873:2;12868:3;12809:67;:::i;:::-;12802:74;;12885:93;12974:3;12885:93;:::i;:::-;13003:2;12998:3;12994:12;12987:19;;12646:366;;;:::o;13018:::-;13160:3;13181:67;13245:2;13240:3;13181:67;:::i;:::-;13174:74;;13257:93;13346:3;13257:93;:::i;:::-;13375:2;13370:3;13366:12;13359:19;;13018:366;;;:::o;13390:::-;13532:3;13553:67;13617:2;13612:3;13553:67;:::i;:::-;13546:74;;13629:93;13718:3;13629:93;:::i;:::-;13747:2;13742:3;13738:12;13731:19;;13390:366;;;:::o;13762:::-;13904:3;13925:67;13989:2;13984:3;13925:67;:::i;:::-;13918:74;;14001:93;14090:3;14001:93;:::i;:::-;14119:2;14114:3;14110:12;14103:19;;13762:366;;;:::o;14134:::-;14276:3;14297:67;14361:2;14356:3;14297:67;:::i;:::-;14290:74;;14373:93;14462:3;14373:93;:::i;:::-;14491:2;14486:3;14482:12;14475:19;;14134:366;;;:::o;14506:::-;14648:3;14669:67;14733:2;14728:3;14669:67;:::i;:::-;14662:74;;14745:93;14834:3;14745:93;:::i;:::-;14863:2;14858:3;14854:12;14847:19;;14506:366;;;:::o;14878:::-;15020:3;15041:67;15105:2;15100:3;15041:67;:::i;:::-;15034:74;;15117:93;15206:3;15117:93;:::i;:::-;15235:2;15230:3;15226:12;15219:19;;14878:366;;;:::o;15250:::-;15392:3;15413:67;15477:2;15472:3;15413:67;:::i;:::-;15406:74;;15489:93;15578:3;15489:93;:::i;:::-;15607:2;15602:3;15598:12;15591:19;;15250:366;;;:::o;15622:::-;15764:3;15785:67;15849:2;15844:3;15785:67;:::i;:::-;15778:74;;15861:93;15950:3;15861:93;:::i;:::-;15979:2;15974:3;15970:12;15963:19;;15622:366;;;:::o;15994:::-;16136:3;16157:67;16221:2;16216:3;16157:67;:::i;:::-;16150:74;;16233:93;16322:3;16233:93;:::i;:::-;16351:2;16346:3;16342:12;16335:19;;15994:366;;;:::o;16366:::-;16508:3;16529:67;16593:2;16588:3;16529:67;:::i;:::-;16522:74;;16605:93;16694:3;16605:93;:::i;:::-;16723:2;16718:3;16714:12;16707:19;;16366:366;;;:::o;16738:365::-;16880:3;16901:66;16965:1;16960:3;16901:66;:::i;:::-;16894:73;;16976:93;17065:3;16976:93;:::i;:::-;17094:2;17089:3;17085:12;17078:19;;16738:365;;;:::o;17109:366::-;17251:3;17272:67;17336:2;17331:3;17272:67;:::i;:::-;17265:74;;17348:93;17437:3;17348:93;:::i;:::-;17466:2;17461:3;17457:12;17450:19;;17109:366;;;:::o;17481:::-;17623:3;17644:67;17708:2;17703:3;17644:67;:::i;:::-;17637:74;;17720:93;17809:3;17720:93;:::i;:::-;17838:2;17833:3;17829:12;17822:19;;17481:366;;;:::o;17853:::-;17995:3;18016:67;18080:2;18075:3;18016:67;:::i;:::-;18009:74;;18092:93;18181:3;18092:93;:::i;:::-;18210:2;18205:3;18201:12;18194:19;;17853:366;;;:::o;18225:::-;18367:3;18388:67;18452:2;18447:3;18388:67;:::i;:::-;18381:74;;18464:93;18553:3;18464:93;:::i;:::-;18582:2;18577:3;18573:12;18566:19;;18225:366;;;:::o;18597:::-;18739:3;18760:67;18824:2;18819:3;18760:67;:::i;:::-;18753:74;;18836:93;18925:3;18836:93;:::i;:::-;18954:2;18949:3;18945:12;18938:19;;18597:366;;;:::o;18969:::-;19111:3;19132:67;19196:2;19191:3;19132:67;:::i;:::-;19125:74;;19208:93;19297:3;19208:93;:::i;:::-;19326:2;19321:3;19317:12;19310:19;;18969:366;;;:::o;19341:::-;19483:3;19504:67;19568:2;19563:3;19504:67;:::i;:::-;19497:74;;19580:93;19669:3;19580:93;:::i;:::-;19698:2;19693:3;19689:12;19682:19;;19341:366;;;:::o;19713:::-;19855:3;19876:67;19940:2;19935:3;19876:67;:::i;:::-;19869:74;;19952:93;20041:3;19952:93;:::i;:::-;20070:2;20065:3;20061:12;20054:19;;19713:366;;;:::o;20085:::-;20227:3;20248:67;20312:2;20307:3;20248:67;:::i;:::-;20241:74;;20324:93;20413:3;20324:93;:::i;:::-;20442:2;20437:3;20433:12;20426:19;;20085:366;;;:::o;20457:::-;20599:3;20620:67;20684:2;20679:3;20620:67;:::i;:::-;20613:74;;20696:93;20785:3;20696:93;:::i;:::-;20814:2;20809:3;20805:12;20798:19;;20457:366;;;:::o;20829:::-;20971:3;20992:67;21056:2;21051:3;20992:67;:::i;:::-;20985:74;;21068:93;21157:3;21068:93;:::i;:::-;21186:2;21181:3;21177:12;21170:19;;20829:366;;;:::o;21201:::-;21343:3;21364:67;21428:2;21423:3;21364:67;:::i;:::-;21357:74;;21440:93;21529:3;21440:93;:::i;:::-;21558:2;21553:3;21549:12;21542:19;;21201:366;;;:::o;21573:::-;21715:3;21736:67;21800:2;21795:3;21736:67;:::i;:::-;21729:74;;21812:93;21901:3;21812:93;:::i;:::-;21930:2;21925:3;21921:12;21914:19;;21573:366;;;:::o;21945:::-;22087:3;22108:67;22172:2;22167:3;22108:67;:::i;:::-;22101:74;;22184:93;22273:3;22184:93;:::i;:::-;22302:2;22297:3;22293:12;22286:19;;21945:366;;;:::o;22317:118::-;22404:24;22422:5;22404:24;:::i;:::-;22399:3;22392:37;22317:118;;:::o;22441:157::-;22546:45;22566:24;22584:5;22566:24;:::i;:::-;22546:45;:::i;:::-;22541:3;22534:58;22441:157;;:::o;22604:112::-;22687:22;22703:5;22687:22;:::i;:::-;22682:3;22675:35;22604:112;;:::o;22722:538::-;22890:3;22905:75;22976:3;22967:6;22905:75;:::i;:::-;23005:2;23000:3;22996:12;22989:19;;23018:75;23089:3;23080:6;23018:75;:::i;:::-;23118:2;23113:3;23109:12;23102:19;;23131:75;23202:3;23193:6;23131:75;:::i;:::-;23231:2;23226:3;23222:12;23215:19;;23251:3;23244:10;;22722:538;;;;;;:::o;23266:429::-;23443:3;23465:92;23553:3;23544:6;23465:92;:::i;:::-;23458:99;;23574:95;23665:3;23656:6;23574:95;:::i;:::-;23567:102;;23686:3;23679:10;;23266:429;;;;;:::o;23701:522::-;23914:3;23936:148;24080:3;23936:148;:::i;:::-;23929:155;;24094:75;24165:3;24156:6;24094:75;:::i;:::-;24194:2;24189:3;24185:12;24178:19;;24214:3;24207:10;;23701:522;;;;:::o;24229:222::-;24322:4;24360:2;24349:9;24345:18;24337:26;;24373:71;24441:1;24430:9;24426:17;24417:6;24373:71;:::i;:::-;24229:222;;;;:::o;24457:640::-;24652:4;24690:3;24679:9;24675:19;24667:27;;24704:71;24772:1;24761:9;24757:17;24748:6;24704:71;:::i;:::-;24785:72;24853:2;24842:9;24838:18;24829:6;24785:72;:::i;:::-;24867;24935:2;24924:9;24920:18;24911:6;24867:72;:::i;:::-;24986:9;24980:4;24976:20;24971:2;24960:9;24956:18;24949:48;25014:76;25085:4;25076:6;25014:76;:::i;:::-;25006:84;;24457:640;;;;;;;:::o;25103:210::-;25190:4;25228:2;25217:9;25213:18;25205:26;;25241:65;25303:1;25292:9;25288:17;25279:6;25241:65;:::i;:::-;25103:210;;;;:::o;25319:545::-;25492:4;25530:3;25519:9;25515:19;25507:27;;25544:71;25612:1;25601:9;25597:17;25588:6;25544:71;:::i;:::-;25625:68;25689:2;25678:9;25674:18;25665:6;25625:68;:::i;:::-;25703:72;25771:2;25760:9;25756:18;25747:6;25703:72;:::i;:::-;25785;25853:2;25842:9;25838:18;25829:6;25785:72;:::i;:::-;25319:545;;;;;;;:::o;25870:313::-;25983:4;26021:2;26010:9;26006:18;25998:26;;26070:9;26064:4;26060:20;26056:1;26045:9;26041:17;26034:47;26098:78;26171:4;26162:6;26098:78;:::i;:::-;26090:86;;25870:313;;;;:::o;26189:419::-;26355:4;26393:2;26382:9;26378:18;26370:26;;26442:9;26436:4;26432:20;26428:1;26417:9;26413:17;26406:47;26470:131;26596:4;26470:131;:::i;:::-;26462:139;;26189:419;;;:::o;26614:::-;26780:4;26818:2;26807:9;26803:18;26795:26;;26867:9;26861:4;26857:20;26853:1;26842:9;26838:17;26831:47;26895:131;27021:4;26895:131;:::i;:::-;26887:139;;26614:419;;;:::o;27039:::-;27205:4;27243:2;27232:9;27228:18;27220:26;;27292:9;27286:4;27282:20;27278:1;27267:9;27263:17;27256:47;27320:131;27446:4;27320:131;:::i;:::-;27312:139;;27039:419;;;:::o;27464:::-;27630:4;27668:2;27657:9;27653:18;27645:26;;27717:9;27711:4;27707:20;27703:1;27692:9;27688:17;27681:47;27745:131;27871:4;27745:131;:::i;:::-;27737:139;;27464:419;;;:::o;27889:::-;28055:4;28093:2;28082:9;28078:18;28070:26;;28142:9;28136:4;28132:20;28128:1;28117:9;28113:17;28106:47;28170:131;28296:4;28170:131;:::i;:::-;28162:139;;27889:419;;;:::o;28314:::-;28480:4;28518:2;28507:9;28503:18;28495:26;;28567:9;28561:4;28557:20;28553:1;28542:9;28538:17;28531:47;28595:131;28721:4;28595:131;:::i;:::-;28587:139;;28314:419;;;:::o;28739:::-;28905:4;28943:2;28932:9;28928:18;28920:26;;28992:9;28986:4;28982:20;28978:1;28967:9;28963:17;28956:47;29020:131;29146:4;29020:131;:::i;:::-;29012:139;;28739:419;;;:::o;29164:::-;29330:4;29368:2;29357:9;29353:18;29345:26;;29417:9;29411:4;29407:20;29403:1;29392:9;29388:17;29381:47;29445:131;29571:4;29445:131;:::i;:::-;29437:139;;29164:419;;;:::o;29589:::-;29755:4;29793:2;29782:9;29778:18;29770:26;;29842:9;29836:4;29832:20;29828:1;29817:9;29813:17;29806:47;29870:131;29996:4;29870:131;:::i;:::-;29862:139;;29589:419;;;:::o;30014:::-;30180:4;30218:2;30207:9;30203:18;30195:26;;30267:9;30261:4;30257:20;30253:1;30242:9;30238:17;30231:47;30295:131;30421:4;30295:131;:::i;:::-;30287:139;;30014:419;;;:::o;30439:::-;30605:4;30643:2;30632:9;30628:18;30620:26;;30692:9;30686:4;30682:20;30678:1;30667:9;30663:17;30656:47;30720:131;30846:4;30720:131;:::i;:::-;30712:139;;30439:419;;;:::o;30864:::-;31030:4;31068:2;31057:9;31053:18;31045:26;;31117:9;31111:4;31107:20;31103:1;31092:9;31088:17;31081:47;31145:131;31271:4;31145:131;:::i;:::-;31137:139;;30864:419;;;:::o;31289:::-;31455:4;31493:2;31482:9;31478:18;31470:26;;31542:9;31536:4;31532:20;31528:1;31517:9;31513:17;31506:47;31570:131;31696:4;31570:131;:::i;:::-;31562:139;;31289:419;;;:::o;31714:::-;31880:4;31918:2;31907:9;31903:18;31895:26;;31967:9;31961:4;31957:20;31953:1;31942:9;31938:17;31931:47;31995:131;32121:4;31995:131;:::i;:::-;31987:139;;31714:419;;;:::o;32139:::-;32305:4;32343:2;32332:9;32328:18;32320:26;;32392:9;32386:4;32382:20;32378:1;32367:9;32363:17;32356:47;32420:131;32546:4;32420:131;:::i;:::-;32412:139;;32139:419;;;:::o;32564:::-;32730:4;32768:2;32757:9;32753:18;32745:26;;32817:9;32811:4;32807:20;32803:1;32792:9;32788:17;32781:47;32845:131;32971:4;32845:131;:::i;:::-;32837:139;;32564:419;;;:::o;32989:::-;33155:4;33193:2;33182:9;33178:18;33170:26;;33242:9;33236:4;33232:20;33228:1;33217:9;33213:17;33206:47;33270:131;33396:4;33270:131;:::i;:::-;33262:139;;32989:419;;;:::o;33414:::-;33580:4;33618:2;33607:9;33603:18;33595:26;;33667:9;33661:4;33657:20;33653:1;33642:9;33638:17;33631:47;33695:131;33821:4;33695:131;:::i;:::-;33687:139;;33414:419;;;:::o;33839:::-;34005:4;34043:2;34032:9;34028:18;34020:26;;34092:9;34086:4;34082:20;34078:1;34067:9;34063:17;34056:47;34120:131;34246:4;34120:131;:::i;:::-;34112:139;;33839:419;;;:::o;34264:::-;34430:4;34468:2;34457:9;34453:18;34445:26;;34517:9;34511:4;34507:20;34503:1;34492:9;34488:17;34481:47;34545:131;34671:4;34545:131;:::i;:::-;34537:139;;34264:419;;;:::o;34689:::-;34855:4;34893:2;34882:9;34878:18;34870:26;;34942:9;34936:4;34932:20;34928:1;34917:9;34913:17;34906:47;34970:131;35096:4;34970:131;:::i;:::-;34962:139;;34689:419;;;:::o;35114:::-;35280:4;35318:2;35307:9;35303:18;35295:26;;35367:9;35361:4;35357:20;35353:1;35342:9;35338:17;35331:47;35395:131;35521:4;35395:131;:::i;:::-;35387:139;;35114:419;;;:::o;35539:::-;35705:4;35743:2;35732:9;35728:18;35720:26;;35792:9;35786:4;35782:20;35778:1;35767:9;35763:17;35756:47;35820:131;35946:4;35820:131;:::i;:::-;35812:139;;35539:419;;;:::o;35964:::-;36130:4;36168:2;36157:9;36153:18;36145:26;;36217:9;36211:4;36207:20;36203:1;36192:9;36188:17;36181:47;36245:131;36371:4;36245:131;:::i;:::-;36237:139;;35964:419;;;:::o;36389:::-;36555:4;36593:2;36582:9;36578:18;36570:26;;36642:9;36636:4;36632:20;36628:1;36617:9;36613:17;36606:47;36670:131;36796:4;36670:131;:::i;:::-;36662:139;;36389:419;;;:::o;36814:::-;36980:4;37018:2;37007:9;37003:18;36995:26;;37067:9;37061:4;37057:20;37053:1;37042:9;37038:17;37031:47;37095:131;37221:4;37095:131;:::i;:::-;37087:139;;36814:419;;;:::o;37239:::-;37405:4;37443:2;37432:9;37428:18;37420:26;;37492:9;37486:4;37482:20;37478:1;37467:9;37463:17;37456:47;37520:131;37646:4;37520:131;:::i;:::-;37512:139;;37239:419;;;:::o;37664:::-;37830:4;37868:2;37857:9;37853:18;37845:26;;37917:9;37911:4;37907:20;37903:1;37892:9;37888:17;37881:47;37945:131;38071:4;37945:131;:::i;:::-;37937:139;;37664:419;;;:::o;38089:::-;38255:4;38293:2;38282:9;38278:18;38270:26;;38342:9;38336:4;38332:20;38328:1;38317:9;38313:17;38306:47;38370:131;38496:4;38370:131;:::i;:::-;38362:139;;38089:419;;;:::o;38514:::-;38680:4;38718:2;38707:9;38703:18;38695:26;;38767:9;38761:4;38757:20;38753:1;38742:9;38738:17;38731:47;38795:131;38921:4;38795:131;:::i;:::-;38787:139;;38514:419;;;:::o;38939:222::-;39032:4;39070:2;39059:9;39055:18;39047:26;;39083:71;39151:1;39140:9;39136:17;39127:6;39083:71;:::i;:::-;38939:222;;;;:::o;39167:129::-;39201:6;39228:20;;:::i;:::-;39218:30;;39257:33;39285:4;39277:6;39257:33;:::i;:::-;39167:129;;;:::o;39302:75::-;39335:6;39368:2;39362:9;39352:19;;39302:75;:::o;39383:307::-;39444:4;39534:18;39526:6;39523:30;39520:56;;;39556:18;;:::i;:::-;39520:56;39594:29;39616:6;39594:29;:::i;:::-;39586:37;;39678:4;39672;39668:15;39660:23;;39383:307;;;:::o;39696:141::-;39745:4;39768:3;39760:11;;39791:3;39788:1;39781:14;39825:4;39822:1;39812:18;39804:26;;39696:141;;;:::o;39843:98::-;39894:6;39928:5;39922:12;39912:22;;39843:98;;;:::o;39947:99::-;39999:6;40033:5;40027:12;40017:22;;39947:99;;;:::o;40052:168::-;40135:11;40169:6;40164:3;40157:19;40209:4;40204:3;40200:14;40185:29;;40052:168;;;;:::o;40226:169::-;40310:11;40344:6;40339:3;40332:19;40384:4;40379:3;40375:14;40360:29;;40226:169;;;;:::o;40401:148::-;40503:11;40540:3;40525:18;;40401:148;;;;:::o;40555:305::-;40595:3;40614:20;40632:1;40614:20;:::i;:::-;40609:25;;40648:20;40666:1;40648:20;:::i;:::-;40643:25;;40802:1;40734:66;40730:74;40727:1;40724:81;40721:107;;;40808:18;;:::i;:::-;40721:107;40852:1;40849;40845:9;40838:16;;40555:305;;;;:::o;40866:185::-;40906:1;40923:20;40941:1;40923:20;:::i;:::-;40918:25;;40957:20;40975:1;40957:20;:::i;:::-;40952:25;;40996:1;40986:35;;41001:18;;:::i;:::-;40986:35;41043:1;41040;41036:9;41031:14;;40866:185;;;;:::o;41057:348::-;41097:7;41120:20;41138:1;41120:20;:::i;:::-;41115:25;;41154:20;41172:1;41154:20;:::i;:::-;41149:25;;41342:1;41274:66;41270:74;41267:1;41264:81;41259:1;41252:9;41245:17;41241:105;41238:131;;;41349:18;;:::i;:::-;41238:131;41397:1;41394;41390:9;41379:20;;41057:348;;;;:::o;41411:191::-;41451:4;41471:20;41489:1;41471:20;:::i;:::-;41466:25;;41505:20;41523:1;41505:20;:::i;:::-;41500:25;;41544:1;41541;41538:8;41535:34;;;41549:18;;:::i;:::-;41535:34;41594:1;41591;41587:9;41579:17;;41411:191;;;;:::o;41608:96::-;41645:7;41674:24;41692:5;41674:24;:::i;:::-;41663:35;;41608:96;;;:::o;41710:90::-;41744:7;41787:5;41780:13;41773:21;41762:32;;41710:90;;;:::o;41806:77::-;41843:7;41872:5;41861:16;;41806:77;;;:::o;41889:149::-;41925:7;41965:66;41958:5;41954:78;41943:89;;41889:149;;;:::o;42044:126::-;42081:7;42121:42;42114:5;42110:54;42099:65;;42044:126;;;:::o;42176:77::-;42213:7;42242:5;42231:16;;42176:77;;;:::o;42259:86::-;42294:7;42334:4;42327:5;42323:16;42312:27;;42259:86;;;:::o;42351:154::-;42435:6;42430:3;42425;42412:30;42497:1;42488:6;42483:3;42479:16;42472:27;42351:154;;;:::o;42511:307::-;42579:1;42589:113;42603:6;42600:1;42597:13;42589:113;;;42688:1;42683:3;42679:11;42673:18;42669:1;42664:3;42660:11;42653:39;42625:2;42622:1;42618:10;42613:15;;42589:113;;;42720:6;42717:1;42714:13;42711:101;;;42800:1;42791:6;42786:3;42782:16;42775:27;42711:101;42560:258;42511:307;;;:::o;42824:320::-;42868:6;42905:1;42899:4;42895:12;42885:22;;42952:1;42946:4;42942:12;42973:18;42963:81;;43029:4;43021:6;43017:17;43007:27;;42963:81;43091:2;43083:6;43080:14;43060:18;43057:38;43054:84;;;43110:18;;:::i;:::-;43054:84;42875:269;42824:320;;;:::o;43150:281::-;43233:27;43255:4;43233:27;:::i;:::-;43225:6;43221:40;43363:6;43351:10;43348:22;43327:18;43315:10;43312:34;43309:62;43306:88;;;43374:18;;:::i;:::-;43306:88;43414:10;43410:2;43403:22;43193:238;43150:281;;:::o;43437:233::-;43476:3;43499:24;43517:5;43499:24;:::i;:::-;43490:33;;43545:66;43538:5;43535:77;43532:103;;;43615:18;;:::i;:::-;43532:103;43662:1;43655:5;43651:13;43644:20;;43437:233;;;:::o;43676:100::-;43715:7;43744:26;43764:5;43744:26;:::i;:::-;43733:37;;43676:100;;;:::o;43782:79::-;43821:7;43850:5;43839:16;;43782:79;;;:::o;43867:94::-;43906:7;43935:20;43949:5;43935:20;:::i;:::-;43924:31;;43867:94;;;:::o;43967:79::-;44006:7;44035:5;44024:16;;43967:79;;;:::o;44052:176::-;44084:1;44101:20;44119:1;44101:20;:::i;:::-;44096:25;;44135:20;44153:1;44135:20;:::i;:::-;44130:25;;44174:1;44164:35;;44179:18;;:::i;:::-;44164:35;44220:1;44217;44213:9;44208:14;;44052:176;;;;:::o;44234:180::-;44282:77;44279:1;44272:88;44379:4;44376:1;44369:15;44403:4;44400:1;44393:15;44420:180;44468:77;44465:1;44458:88;44565:4;44562:1;44555:15;44589:4;44586:1;44579:15;44606:180;44654:77;44651:1;44644:88;44751:4;44748:1;44741:15;44775:4;44772:1;44765:15;44792:180;44840:77;44837:1;44830:88;44937:4;44934:1;44927:15;44961:4;44958:1;44951:15;44978:180;45026:77;45023:1;45016:88;45123:4;45120:1;45113:15;45147:4;45144:1;45137:15;45164:180;45212:77;45209:1;45202:88;45309:4;45306:1;45299:15;45333:4;45330:1;45323:15;45350:180;45398:77;45395:1;45388:88;45495:4;45492:1;45485:15;45519:4;45516:1;45509:15;45536:117;45645:1;45642;45635:12;45659:117;45768:1;45765;45758:12;45782:117;45891:1;45888;45881:12;45905:117;46014:1;46011;46004:12;46028:117;46137:1;46134;46127:12;46151:117;46260:1;46257;46250:12;46274:102;46315:6;46366:2;46362:7;46357:2;46350:5;46346:14;46342:28;46332:38;;46274:102;;;:::o;46382:94::-;46415:8;46463:5;46459:2;46455:14;46434:35;;46382:94;;;:::o;46482:174::-;46622:26;46618:1;46610:6;46606:14;46599:50;46482:174;:::o;46662:172::-;46802:24;46798:1;46790:6;46786:14;46779:48;46662:172;:::o;46840:181::-;46980:33;46976:1;46968:6;46964:14;46957:57;46840:181;:::o;47027:214::-;47167:66;47163:1;47155:6;47151:14;47144:90;47027:214;:::o;47247:230::-;47387:34;47383:1;47375:6;47371:14;47364:58;47456:13;47451:2;47443:6;47439:15;47432:38;47247:230;:::o;47483:237::-;47623:34;47619:1;47611:6;47607:14;47600:58;47692:20;47687:2;47679:6;47675:15;47668:45;47483:237;:::o;47726:225::-;47866:34;47862:1;47854:6;47850:14;47843:58;47935:8;47930:2;47922:6;47918:15;47911:33;47726:225;:::o;47957:224::-;48097:34;48093:1;48085:6;48081:14;48074:58;48166:7;48161:2;48153:6;48149:15;48142:32;47957:224;:::o;48187:178::-;48327:30;48323:1;48315:6;48311:14;48304:54;48187:178;:::o;48371:223::-;48511:34;48507:1;48499:6;48495:14;48488:58;48580:6;48575:2;48567:6;48563:15;48556:31;48371:223;:::o;48600:175::-;48740:27;48736:1;48728:6;48724:14;48717:51;48600:175;:::o;48781:162::-;48921:14;48917:1;48909:6;48905:14;48898:38;48781:162;:::o;48949:221::-;49089:34;49085:1;49077:6;49073:14;49066:58;49158:4;49153:2;49145:6;49141:15;49134:29;48949:221;:::o;49176:161::-;49316:13;49312:1;49304:6;49300:14;49293:37;49176:161;:::o;49343:231::-;49483:34;49479:1;49471:6;49467:14;49460:58;49552:14;49547:2;49539:6;49535:15;49528:39;49343:231;:::o;49580:179::-;49720:31;49716:1;49708:6;49704:14;49697:55;49580:179;:::o;49765:159::-;49905:11;49901:1;49893:6;49889:14;49882:35;49765:159;:::o;49930:243::-;50070:34;50066:1;50058:6;50054:14;50047:58;50139:26;50134:2;50126:6;50122:15;50115:51;49930:243;:::o;50179:229::-;50319:34;50315:1;50307:6;50303:14;50296:58;50388:12;50383:2;50375:6;50371:15;50364:37;50179:229;:::o;50414:228::-;50554:34;50550:1;50542:6;50538:14;50531:58;50623:11;50618:2;50610:6;50606:15;50599:36;50414:228;:::o;50648:221::-;50788:34;50784:1;50776:6;50772:14;50765:58;50857:4;50852:2;50844:6;50840:15;50833:29;50648:221;:::o;50875:182::-;51015:34;51011:1;51003:6;50999:14;50992:58;50875:182;:::o;51063:231::-;51203:34;51199:1;51191:6;51187:14;51180:58;51272:14;51267:2;51259:6;51255:15;51248:39;51063:231;:::o;51300:182::-;51440:34;51436:1;51428:6;51424:14;51417:58;51300:182;:::o;51488:223::-;51628:34;51624:1;51616:6;51612:14;51605:58;51697:6;51692:2;51684:6;51680:15;51673:31;51488:223;:::o;51717:181::-;51857:33;51853:1;51845:6;51841:14;51834:57;51717:181;:::o;51904:220::-;52044:34;52040:1;52032:6;52028:14;52021:58;52113:3;52108:2;52100:6;52096:15;52089:28;51904:220;:::o;52130:236::-;52270:34;52266:1;52258:6;52254:14;52247:58;52339:19;52334:2;52326:6;52322:15;52315:44;52130:236;:::o;52372:231::-;52512:34;52508:1;52500:6;52496:14;52489:58;52581:14;52576:2;52568:6;52564:15;52557:39;52372:231;:::o;52609:162::-;52749:14;52745:1;52737:6;52733:14;52726:38;52609:162;:::o;52777:166::-;52917:18;52913:1;52905:6;52901:14;52894:42;52777:166;:::o;52949:122::-;53022:24;53040:5;53022:24;:::i;:::-;53015:5;53012:35;53002:63;;53061:1;53058;53051:12;53002:63;52949:122;:::o;53077:116::-;53147:21;53162:5;53147:21;:::i;:::-;53140:5;53137:32;53127:60;;53183:1;53180;53173:12;53127:60;53077:116;:::o;53199:122::-;53272:24;53290:5;53272:24;:::i;:::-;53265:5;53262:35;53252:63;;53311:1;53308;53301:12;53252:63;53199:122;:::o;53327:120::-;53399:23;53416:5;53399:23;:::i;:::-;53392:5;53389:34;53379:62;;53437:1;53434;53427:12;53379:62;53327:120;:::o;53453:122::-;53526:24;53544:5;53526:24;:::i;:::-;53519:5;53516:35;53506:63;;53565:1;53562;53555:12;53506:63;53453:122;:::o

Swarm Source

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