ETH Price: $3,047.87 (+2.26%)
Gas: 1 Gwei

Token

 

Overview

Max Total Supply

386

Holders

73

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0x0Bb521bD6B2A0eb81A0750E0d78C50917323d958
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
GreenRoomV2

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-10-31
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.3) (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) {
        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.
            /// @solidity memory-safe-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 {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/draft-EIP712.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// 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 (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens 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 amount
    ) 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, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/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/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: GreenRoomV2.sol



pragma solidity ^0.8.7;






contract GreenRoomV2 is ERC1155, Ownable, EIP712 {
    address public immutable showTokenAddr;

    string baseUri;
    string contractUri;

    address signerAddress;

    mapping(uint256 => Item) public items;
    mapping(uint256 => uint256) public totalSupply;
    ERC20Burnable burner;

    enum ItemPurchaseType {
        ETH,
        SHOW
    }
    struct Item {
        uint256 maxSupply;
        uint256 mintLimit;
        uint256 price;
        ItemPurchaseType purchaseType;
        bool active;
    }

    constructor() ERC1155("") EIP712("GreenRoomV2", "1.0.0") {
        address showAddress = 0x136209a516D1C2660F045e70634c9d95D64325F9;
        signerAddress = 0xa2bcd5Cc70E1e568Dd31C475FcB19E8c367B2202;
        showTokenAddr = showAddress;
        baseUri = "https://greenroom-api.herokuapp.com/items/metadata/";
        contractUri = "https://deadheads.mypinata.cloud/ipfs/QmQN2SVL4abr9ZhV75GEBSYQft3ftYE5QdxbxJYa6XNQJA";
        burner = ERC20Burnable(showAddress);
    }

    function __mint(uint256 itemId, ItemPurchaseType purchaseType, uint256 price, uint256 quantity) internal {
        uint256 total = price * quantity;
        if (purchaseType == ItemPurchaseType.ETH) {
            require(total == msg.value, "Wrong price amount");
        } else {
            burner.burnFrom(msg.sender, total);
        }
        totalSupply[itemId] += quantity;
        _mint(msg.sender, itemId, quantity, "");
    }

    function mint(
        uint256 _itemId,
        uint256 _quantity
    ) public payable {
        Item memory item = items[_itemId];
        require(item.maxSupply > 0, "item does not exists");
        require(item.active, "item is not active");
        require(totalSupply[_itemId] < item.maxSupply, "item sold out");
        require(
            totalSupply[_itemId] + _quantity <= item.maxSupply,
            "Quantity exceeds the remaining supply"
        );
        uint256 balance = balanceOf(msg.sender, _itemId);
        require(balance < item.mintLimit, "reached the max max limit for this item.");
        require(balance + _quantity <= item.mintLimit, "Quantity exceeds max mint. Try minting less.");
        
        __mint(_itemId, item.purchaseType, item.price, _quantity);
    }

    function createItem(
        uint256 _maxSupply,
        uint256 _mintLimit,
        uint256 _quantity,
        uint256 _price,
        ItemPurchaseType _purchaseType,
        uint256 _itemId,
        bytes calldata _signature
    ) public payable {
        require(
            signerAddress ==
                recoverAddress(
                    _maxSupply,
                    _mintLimit,
                    _price,
                    _purchaseType,
                    _itemId,
                    msg.sender,
                    _signature
                ),
            "Invalid create parameters."
        );
        if (items[_itemId].maxSupply > 0) {
            mint(_itemId, _quantity);
        } else {
            require(_quantity <= _maxSupply, "Quantity exceeds the supply");
            require(_quantity <= _mintLimit, "Quantity exceeds the limit");

            items[_itemId] = Item(_maxSupply, _mintLimit, _price, _purchaseType, true);

            __mint(_itemId, _purchaseType, _price, _quantity);
        }
    }

    function updateItem(
        uint256 _maxSupply,
        uint256 _mintLimit,
        uint256 _price,
        ItemPurchaseType _purchaseType,
        bool _active,
        uint256 _itemId
    ) public onlyOwner {
        require(items[_itemId].maxSupply > 0, "item does not exist");
        require(_maxSupply > 0, "Max supply must be greater than 0");

        items[_itemId].price = _price;
        items[_itemId].purchaseType = _purchaseType;
        items[_itemId].maxSupply = _maxSupply;
        items[_itemId].mintLimit = _mintLimit;
        items[_itemId].active = _active;
    }

    function updateItemActive(uint256 _itemId, bool _active) public onlyOwner {
        require(items[_itemId].maxSupply > 0, "item does not exist");

        items[_itemId].active = _active;
    }

    function setURI(string memory _newURI) external onlyOwner {
        super._setURI(_newURI);
    }

    function _hash(
        uint256 _maxSupply,
        uint256 _mintLimit,
        uint256 _price,
        ItemPurchaseType _purchaseType,
        uint256 _id,
        address _caller
    ) internal view returns (bytes32) {
        return
            _hashTypedDataV4(
                keccak256(
                    abi.encode(
                        keccak256(
                            "CREATE(uint256 maxSupply,uint256 mintLimit,uint256 price,uint256 purchaseType,uint256 id,address caller)"
                        ),
                        _maxSupply,
                        _mintLimit,
                        _price,
                        _purchaseType,
                        _id,
                        _caller
                    )
                )
            );
    }

    function recoverAddress(
        uint256 _maxSupply,
        uint256 _mintLimit,
        uint256 _price,
        ItemPurchaseType _purchaseType,
        uint256 _id,
        address _account,
        bytes calldata signature
    ) public view returns (address) {
        return
            ECDSA.recover(
                _hash(_maxSupply, _mintLimit, _price, _purchaseType, _id, _account),
                signature
            );
    }

    function uri(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            items[_tokenId].maxSupply > 0,
            "ERC1155Metadata: URI query for nonexistent token"
        );
        return
            string(abi.encodePacked(baseUri, Strings.toString(_tokenId), ""));
    }

    function setContractURI(string memory _newContractURI) external onlyOwner {
        contractUri = _newContractURI;
    }

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

    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseUri = _newBaseURI;
    }

    function setSignerAddress(address _signerAddress) external onlyOwner {
        signerAddress = _signerAddress;
    }

    function withdrawAll() external onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","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":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_mintLimit","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"enum GreenRoomV2.ItemPurchaseType","name":"_purchaseType","type":"uint8"},{"internalType":"uint256","name":"_itemId","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"createItem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"items","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"mintLimit","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"enum GreenRoomV2.ItemPurchaseType","name":"purchaseType","type":"uint8"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_itemId","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_mintLimit","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"enum GreenRoomV2.ItemPurchaseType","name":"_purchaseType","type":"uint8"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"showTokenAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_mintLimit","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"enum GreenRoomV2.ItemPurchaseType","name":"_purchaseType","type":"uint8"},{"internalType":"bool","name":"_active","type":"bool"},{"internalType":"uint256","name":"_itemId","type":"uint256"}],"name":"updateItem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_itemId","type":"uint256"},{"internalType":"bool","name":"_active","type":"bool"}],"name":"updateItemActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101606040523480156200001257600080fd5b506040518060400160405280600b81526020017f477265656e526f6f6d56320000000000000000000000000000000000000000008152506040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525060405180602001604052806000815250620000a081620002c860201b60201c565b50620000c1620000b5620002e460201b60201c565b620002ec60201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a081815250506200012a818484620003b260201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050600073136209a516d1c2660f045e70634c9d95d64325f9905073a2bcd5cc70e1e568dd31c475fcb19e8c367b2202600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff1660601b815250506040518060600160405280603381526020016200588c60339139600490805190602001906200024d929190620003ee565b50604051806080016040528060548152602001620058bf60549139600590805190602001906200027f929190620003ee565b5080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620005db565b8060029080519060200190620002e0929190620003ee565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008383834630604051602001620003cf959493929190620004d1565b6040516020818303038152906040528051906020012090509392505050565b828054620003fc9062000576565b90600052602060002090601f0160209004810192826200042057600085556200046c565b82601f106200043b57805160ff19168380011785556200046c565b828001600101855582156200046c579182015b828111156200046b5782518255916020019190600101906200044e565b5b5090506200047b91906200047f565b5090565b5b808211156200049a57600081600090555060010162000480565b5090565b620004a9816200052e565b82525050565b620004ba8162000542565b82525050565b620004cb816200056c565b82525050565b600060a082019050620004e86000830188620004af565b620004f76020830187620004af565b620005066040830186620004af565b620005156060830185620004c0565b6200052460808301846200049e565b9695505050505050565b60006200053b826200054c565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200058f57607f821691505b60208210811415620005a657620005a5620005ac565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160a05160c05160601c60e05161010051610120516101405160601c6152506200063c6000396000610efd01526000612a7701526000612ab901526000612a98015260006129cd01526000612a2301526000612a4c01526152506000f3fe6080604052600436106101655760003560e01c80638da5cb5b116100d1578063bfb231d21161008a578063e985e9c511610064578063e985e9c51461052c578063f242432a14610569578063f2fde38b14610592578063f9161abc146105bb57610165565b8063bfb231d214610483578063e2322df9146104c4578063e8a3d4851461050157610165565b80638da5cb5b14610375578063938e3d7b146103a0578063950d2c48146103c9578063a22cb465146103f4578063add70d211461041d578063bd85b0391461044657610165565b80632c3bd3f4116101235780632c3bd3f41461028f5780632eb2c2d6146102b85780634e1273f4146102e157806355f804b31461031e578063715018a614610347578063853828b61461035e57610165565b8062fdd58e1461016a57806301ffc9a7146101a757806302fe5305146101e4578063046dc1661461020d5780630e89341c146102365780631b2ef1ca14610273575b600080fd5b34801561017657600080fd5b50610191600480360381019061018c9190613203565b6105d7565b60405161019e919061431a565b60405180910390f35b3480156101b357600080fd5b506101ce60048036038101906101c991906132bb565b6106a0565b6040516101db9190613e36565b60405180910390f35b3480156101f057600080fd5b5061020b60048036038101906102069190613315565b610782565b005b34801561021957600080fd5b50610234600480360381019061022f9190612ff0565b610796565b005b34801561024257600080fd5b5061025d6004803603810190610258919061335e565b6107e2565b60405161026a9190613f58565b60405180910390f35b61028d600480360381019061028891906133cb565b61086f565b005b34801561029b57600080fd5b506102b660048036038101906102b1919061340b565b610b0e565b005b3480156102c457600080fd5b506102df60048036038101906102da919061305d565b610c77565b005b3480156102ed57600080fd5b5061030860048036038101906103039190613243565b610d18565b6040516103159190613ddd565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613315565b610e31565b005b34801561035357600080fd5b5061035c610e53565b005b34801561036a57600080fd5b50610373610e67565b005b34801561038157600080fd5b5061038a610eaf565b6040516103979190613cd7565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613315565b610ed9565b005b3480156103d557600080fd5b506103de610efb565b6040516103eb9190613cd7565b60405180910390f35b34801561040057600080fd5b5061041b600480360381019061041691906131c3565b610f1f565b005b34801561042957600080fd5b50610444600480360381019061043f919061338b565b610f35565b005b34801561045257600080fd5b5061046d6004803603810190610468919061335e565b610fc8565b60405161047a919061431a565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a5919061335e565b610fe0565b6040516104bb95949392919061435e565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613498565b611030565b6040516104f89190613cd7565b60405180910390f35b34801561050d57600080fd5b5061051661109b565b6040516105239190613f58565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e919061301d565b61112d565b6040516105609190613e36565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b919061312c565b6111c1565b005b34801561059e57600080fd5b506105b960048036038101906105b49190612ff0565b611262565b005b6105d560048036038101906105d0919061355a565b6112e6565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063f9061405a565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061077b575061077a82611510565b5b9050919050565b61078a61157a565b610793816115f8565b50565b61079e61157a565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600060076000848152602001908152602001600020600001541161083d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108349061423a565b60405180910390fd5b600461084883611612565b604051602001610859929190613c71565b6040516020818303038152906040529050919050565b6000600760008481526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff1660018111156108d2576108d161486d565b5b60018111156108e4576108e361486d565b5b81526020016003820160019054906101000a900460ff1615151515815250509050600081600001511161094c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109439061421a565b60405180910390fd5b8060800151610990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109879061419a565b60405180910390fd5b80600001516008600085815260200190815260200160002054106109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e09061415a565b60405180910390fd5b8060000151826008600086815260200190815260200160002054610a0d9190614521565b1115610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a459061427a565b60405180910390fd5b6000610a5a33856105d7565b905081602001518110610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a99906141ba565b60405180910390fd5b81602001518382610ab39190614521565b1115610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb9061407a565b60405180910390fd5b610b08848360600151846040015186611773565b50505050565b610b1661157a565b6000600760008381526020019081526020016000206000015411610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b669061425a565b60405180910390fd5b60008611610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba99061413a565b60405180910390fd5b836007600083815260200190815260200160002060020181905550826007600083815260200190815260200160002060030160006101000a81548160ff02191690836001811115610c0657610c0561486d565b5b0217905550856007600083815260200190815260200160002060000181905550846007600083815260200190815260200160002060010181905550816007600083815260200190815260200160002060030160016101000a81548160ff021916908315150217905550505050505050565b610c7f6118d3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610cc55750610cc485610cbf6118d3565b61112d565b5b610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90613fba565b60405180910390fd5b610d1185858585856118db565b5050505050565b60608151835114610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d55906142ba565b60405180910390fd5b6000835167ffffffffffffffff811115610d7b57610d7a6148fa565b5b604051908082528060200260200182016040528015610da95781602001602082028036833780820191505090505b50905060005b8451811015610e2657610df6858281518110610dce57610dcd6148cb565b5b6020026020010151858381518110610de957610de86148cb565b5b60200260200101516105d7565b828281518110610e0957610e086148cb565b5b60200260200101818152505080610e1f9061478b565b9050610daf565b508091505092915050565b610e3961157a565b8060049080519060200190610e4f929190612c5d565b5050565b610e5b61157a565b610e656000611bfd565b565b610e6f61157a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ead57600080fd5b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ee161157a565b8060059080519060200190610ef7929190612c5d565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610f31610f2a6118d3565b8383611cc3565b5050565b610f3d61157a565b6000600760008481526020019081526020016000206000015411610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d9061425a565b60405180910390fd5b806007600084815260200190815260200160002060030160016101000a81548160ff0219169083151502179055505050565b60086020528060005260406000206000915090505481565b60076020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b600061108d6110438a8a8a8a8a8a611e30565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611e99565b905098975050505050505050565b6060600580546110aa90614728565b80601f01602080910402602001604051908101604052809291908181526020018280546110d690614728565b80156111235780601f106110f857610100808354040283529160200191611123565b820191906000526020600020905b81548152906001019060200180831161110657829003601f168201915b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111c96118d3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061120f575061120e856112096118d3565b61112d565b5b61124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613fba565b60405180910390fd5b61125b8585858585611ec0565b5050505050565b61126a61157a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d19061403a565b60405180910390fd5b6112e381611bfd565b50565b6112f68888878787338888611030565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c906140fa565b60405180910390fd5b6000600760008581526020019081526020016000206000015411156113b3576113ae838761086f565b611506565b878611156113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90613ffa565b60405180910390fd5b86861115611439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114309061409a565b60405180910390fd5b6040518060a001604052808981526020018881526020018681526020018560018111156114695761146861486d565b5b8152602001600115158152506007600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff021916908360018111156114d1576114d061486d565b5b021790555060808201518160030160016101000a81548160ff02191690831515021790555090505061150583858789611773565b5b5050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6115826118d3565b73ffffffffffffffffffffffffffffffffffffffff166115a0610eaf565b73ffffffffffffffffffffffffffffffffffffffff16146115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed906141fa565b60405180910390fd5b565b806002908051906020019061160e929190612c5d565b5050565b6060600082141561165a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061176e565b600082905060005b6000821461168c5780806116759061478b565b915050600a826116859190614577565b9150611662565b60008167ffffffffffffffff8111156116a8576116a76148fa565b5b6040519080825280601f01601f1916602001820160405280156116da5781602001600182028036833780820191505090505b5090505b60008514611767576001826116f39190614602565b9150600a8561170291906147de565b603061170e9190614521565b60f81b818381518110611724576117236148cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856117609190614577565b94506116de565b8093505050505b919050565b6000818361178191906145a8565b9050600060018111156117975761179661486d565b5b8460018111156117aa576117a961486d565b5b14156117f7573481146117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e9906140da565b60405180910390fd5b611887565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc679033836040518363ffffffff1660e01b8152600401611854929190613db4565b600060405180830381600087803b15801561186e57600080fd5b505af1158015611882573d6000803e3d6000fd5b505050505b816008600087815260200190815260200160002060008282546118aa9190614521565b925050819055506118cc3386846040518060200160405280600081525061215c565b5050505050565b600033905090565b815183511461191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906142da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561198f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119869061411a565b60405180910390fd5b60006119996118d3565b90506119a981878787878761230d565b60005b8451811015611b5a5760008582815181106119ca576119c96148cb565b5b6020026020010151905060008583815181106119e9576119e86148cb565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a81906141da565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b3f9190614521565b9250508190555050505080611b539061478b565b90506119ac565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bd1929190613dff565b60405180910390a4611be7818787878787612315565b611bf581878787878761231d565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d299061429a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e239190613e36565b60405180910390a3505050565b6000611e8d7fd1c27241daf4f03c6fdcb18799986ac8d3516a452c577f7425ebbca15b1eec19888888888888604051602001611e729796959493929190613ea4565b60405160208183030381529060405280519060200120612504565b90509695505050505050565b6000806000611ea8858561251e565b91509150611eb581612570565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f279061411a565b60405180910390fd5b6000611f3a6118d3565b90506000611f4785612745565b90506000611f5485612745565b9050611f6483898985858961230d565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff2906141da565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b09190614521565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161212d929190614335565b60405180910390a4612143848a8a86868a612315565b612151848a8a8a8a8a6127bf565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906142fa565b60405180910390fd5b60006121d66118d3565b905060006121e385612745565b905060006121f085612745565b90506122018360008985858961230d565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122609190614521565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516122de929190614335565b60405180910390a46122f583600089858589612315565b612304836000898989896127bf565b50505050505050565b505050505050565b505050505050565b61233c8473ffffffffffffffffffffffffffffffffffffffff166129a6565b156124fc578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612382959493929190613cf2565b602060405180830381600087803b15801561239c57600080fd5b505af19250505080156123cd57506040513d601f19601f820116820180604052508101906123ca91906132e8565b60015b612473576123d9614929565b806308c379a0141561243657506123ee615104565b806123f95750612438565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d9190613f58565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246a90613f9a565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f190613fda565b60405180910390fd5b505b505050505050565b60006125176125116129c9565b83612ae3565b9050919050565b6000806041835114156125605760008060006020860151925060408601519150606086015160001a905061255487828585612b16565b94509450505050612569565b60006002915091505b9250929050565b600060048111156125845761258361486d565b5b8160048111156125975761259661486d565b5b14156125a257612742565b600160048111156125b6576125b561486d565b5b8160048111156125c9576125c861486d565b5b141561260a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260190613f7a565b60405180910390fd5b6002600481111561261e5761261d61486d565b5b8160048111156126315761263061486d565b5b1415612672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126699061401a565b60405180910390fd5b600360048111156126865761268561486d565b5b8160048111156126995761269861486d565b5b14156126da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d1906140ba565b60405180910390fd5b6004808111156126ed576126ec61486d565b5b816004811115612700576126ff61486d565b5b1415612741576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127389061417a565b60405180910390fd5b5b50565b60606000600167ffffffffffffffff811115612764576127636148fa565b5b6040519080825280602002602001820160405280156127925781602001602082028036833780820191505090505b50905082816000815181106127aa576127a96148cb565b5b60200260200101818152505080915050919050565b6127de8473ffffffffffffffffffffffffffffffffffffffff166129a6565b1561299e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612824959493929190613d5a565b602060405180830381600087803b15801561283e57600080fd5b505af192505050801561286f57506040513d601f19601f8201168201806040525081019061286c91906132e8565b60015b6129155761287b614929565b806308c379a014156128d85750612890615104565b8061289b57506128da565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cf9190613f58565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290c90613f9a565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461299c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299390613fda565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015612a4557507f000000000000000000000000000000000000000000000000000000000000000046145b15612a72577f00000000000000000000000000000000000000000000000000000000000000009050612ae0565b612add7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612c23565b90505b90565b60008282604051602001612af8929190613ca0565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b51576000600391509150612c1a565b601b8560ff1614158015612b695750601c8560ff1614155b15612b7b576000600491509150612c1a565b600060018787878760405160008152602001604052604051612ba09493929190613f13565b6020604051602081039080840390855afa158015612bc2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c1157600060019250925050612c1a565b80600092509250505b94509492505050565b60008383834630604051602001612c3e959493929190613e51565b6040516020818303038152906040528051906020012090509392505050565b828054612c6990614728565b90600052602060002090601f016020900481019282612c8b5760008555612cd2565b82601f10612ca457805160ff1916838001178555612cd2565b82800160010185558215612cd2579182015b82811115612cd1578251825591602001919060010190612cb6565b5b509050612cdf9190612ce3565b5090565b5b80821115612cfc576000816000905550600101612ce4565b5090565b6000612d13612d0e846143d6565b6143b1565b90508083825260208201905082856020860282011115612d3657612d35614955565b5b60005b85811015612d665781612d4c8882612e64565b845260208401935060208301925050600181019050612d39565b5050509392505050565b6000612d83612d7e84614402565b6143b1565b90508083825260208201905082856020860282011115612da657612da5614955565b5b60005b85811015612dd65781612dbc8882612fdb565b845260208401935060208301925050600181019050612da9565b5050509392505050565b6000612df3612dee8461442e565b6143b1565b905082815260208101848484011115612e0f57612e0e61495a565b5b612e1a8482856146e6565b509392505050565b6000612e35612e308461445f565b6143b1565b905082815260208101848484011115612e5157612e5061495a565b5b612e5c8482856146e6565b509392505050565b600081359050612e73816151ae565b92915050565b600082601f830112612e8e57612e8d614950565b5b8135612e9e848260208601612d00565b91505092915050565b600082601f830112612ebc57612ebb614950565b5b8135612ecc848260208601612d70565b91505092915050565b600081359050612ee4816151c5565b92915050565b600081359050612ef9816151dc565b92915050565b600081519050612f0e816151dc565b92915050565b60008083601f840112612f2a57612f29614950565b5b8235905067ffffffffffffffff811115612f4757612f4661494b565b5b602083019150836001820283011115612f6357612f62614955565b5b9250929050565b600082601f830112612f7f57612f7e614950565b5b8135612f8f848260208601612de0565b91505092915050565b600081359050612fa7816151f3565b92915050565b600082601f830112612fc257612fc1614950565b5b8135612fd2848260208601612e22565b91505092915050565b600081359050612fea81615203565b92915050565b60006020828403121561300657613005614964565b5b600061301484828501612e64565b91505092915050565b6000806040838503121561303457613033614964565b5b600061304285828601612e64565b925050602061305385828601612e64565b9150509250929050565b600080600080600060a0868803121561307957613078614964565b5b600061308788828901612e64565b955050602061309888828901612e64565b945050604086013567ffffffffffffffff8111156130b9576130b861495f565b5b6130c588828901612ea7565b935050606086013567ffffffffffffffff8111156130e6576130e561495f565b5b6130f288828901612ea7565b925050608086013567ffffffffffffffff8111156131135761311261495f565b5b61311f88828901612f6a565b9150509295509295909350565b600080600080600060a0868803121561314857613147614964565b5b600061315688828901612e64565b955050602061316788828901612e64565b945050604061317888828901612fdb565b935050606061318988828901612fdb565b925050608086013567ffffffffffffffff8111156131aa576131a961495f565b5b6131b688828901612f6a565b9150509295509295909350565b600080604083850312156131da576131d9614964565b5b60006131e885828601612e64565b92505060206131f985828601612ed5565b9150509250929050565b6000806040838503121561321a57613219614964565b5b600061322885828601612e64565b925050602061323985828601612fdb565b9150509250929050565b6000806040838503121561325a57613259614964565b5b600083013567ffffffffffffffff8111156132785761327761495f565b5b61328485828601612e79565b925050602083013567ffffffffffffffff8111156132a5576132a461495f565b5b6132b185828601612ea7565b9150509250929050565b6000602082840312156132d1576132d0614964565b5b60006132df84828501612eea565b91505092915050565b6000602082840312156132fe576132fd614964565b5b600061330c84828501612eff565b91505092915050565b60006020828403121561332b5761332a614964565b5b600082013567ffffffffffffffff8111156133495761334861495f565b5b61335584828501612fad565b91505092915050565b60006020828403121561337457613373614964565b5b600061338284828501612fdb565b91505092915050565b600080604083850312156133a2576133a1614964565b5b60006133b085828601612fdb565b92505060206133c185828601612ed5565b9150509250929050565b600080604083850312156133e2576133e1614964565b5b60006133f085828601612fdb565b925050602061340185828601612fdb565b9150509250929050565b60008060008060008060c0878903121561342857613427614964565b5b600061343689828a01612fdb565b965050602061344789828a01612fdb565b955050604061345889828a01612fdb565b945050606061346989828a01612f98565b935050608061347a89828a01612ed5565b92505060a061348b89828a01612fdb565b9150509295509295509295565b60008060008060008060008060e0898b0312156134b8576134b7614964565b5b60006134c68b828c01612fdb565b98505060206134d78b828c01612fdb565b97505060406134e88b828c01612fdb565b96505060606134f98b828c01612f98565b955050608061350a8b828c01612fdb565b94505060a061351b8b828c01612e64565b93505060c089013567ffffffffffffffff81111561353c5761353b61495f565b5b6135488b828c01612f14565b92509250509295985092959890939650565b60008060008060008060008060e0898b03121561357a57613579614964565b5b60006135888b828c01612fdb565b98505060206135998b828c01612fdb565b97505060406135aa8b828c01612fdb565b96505060606135bb8b828c01612fdb565b95505060806135cc8b828c01612f98565b94505060a06135dd8b828c01612fdb565b93505060c089013567ffffffffffffffff8111156135fe576135fd61495f565b5b61360a8b828c01612f14565b92509250509295985092959890939650565b60006136288383613c44565b60208301905092915050565b61363d81614636565b82525050565b600061364e826144b5565b61365881856144e3565b935061366383614490565b8060005b8381101561369457815161367b888261361c565b9750613686836144d6565b925050600181019050613667565b5085935050505092915050565b6136aa81614648565b82525050565b6136b981614654565b82525050565b6136d06136cb82614654565b6147d4565b82525050565b60006136e1826144c0565b6136eb81856144f4565b93506136fb8185602086016146f5565b61370481614969565b840191505092915050565b613718816146d4565b82525050565b6000613729826144cb565b6137338185614505565b93506137438185602086016146f5565b61374c81614969565b840191505092915050565b6000613762826144cb565b61376c8185614516565b935061377c8185602086016146f5565b80840191505092915050565b6000815461379581614728565b61379f8186614516565b945060018216600081146137ba57600181146137cb576137fe565b60ff198316865281860193506137fe565b6137d4856144a0565b60005b838110156137f6578154818901526001820191506020810190506137d7565b838801955050505b50505092915050565b6000613814601883614505565b915061381f82614987565b602082019050919050565b6000613837603483614505565b9150613842826149b0565b604082019050919050565b600061385a602f83614505565b9150613865826149ff565b604082019050919050565b600061387d602883614505565b915061388882614a4e565b604082019050919050565b60006138a0601b83614505565b91506138ab82614a9d565b602082019050919050565b60006138c3601f83614505565b91506138ce82614ac6565b602082019050919050565b60006138e6602683614505565b91506138f182614aef565b604082019050919050565b6000613909600283614516565b915061391482614b3e565b600282019050919050565b600061392c602a83614505565b915061393782614b67565b604082019050919050565b600061394f602c83614505565b915061395a82614bb6565b604082019050919050565b6000613972601a83614505565b915061397d82614c05565b602082019050919050565b6000613995602283614505565b91506139a082614c2e565b604082019050919050565b60006139b8601283614505565b91506139c382614c7d565b602082019050919050565b60006139db601a83614505565b91506139e682614ca6565b602082019050919050565b60006139fe602583614505565b9150613a0982614ccf565b604082019050919050565b6000613a21602183614505565b9150613a2c82614d1e565b604082019050919050565b6000613a44600d83614505565b9150613a4f82614d6d565b602082019050919050565b6000613a67602283614505565b9150613a7282614d96565b604082019050919050565b6000613a8a601283614505565b9150613a9582614de5565b602082019050919050565b6000613aad602883614505565b9150613ab882614e0e565b604082019050919050565b6000613ad0602a83614505565b9150613adb82614e5d565b604082019050919050565b6000613af3602083614505565b9150613afe82614eac565b602082019050919050565b6000613b16601483614505565b9150613b2182614ed5565b602082019050919050565b6000613b39603083614505565b9150613b4482614efe565b604082019050919050565b6000613b5c600083614516565b9150613b6782614f4d565b600082019050919050565b6000613b7f601383614505565b9150613b8a82614f50565b602082019050919050565b6000613ba2602583614505565b9150613bad82614f79565b604082019050919050565b6000613bc5602983614505565b9150613bd082614fc8565b604082019050919050565b6000613be8602983614505565b9150613bf382615017565b604082019050919050565b6000613c0b602883614505565b9150613c1682615066565b604082019050919050565b6000613c2e602183614505565b9150613c39826150b5565b604082019050919050565b613c4d816146bd565b82525050565b613c5c816146bd565b82525050565b613c6b816146c7565b82525050565b6000613c7d8285613788565b9150613c898284613757565b9150613c9482613b4f565b91508190509392505050565b6000613cab826138fc565b9150613cb782856136bf565b602082019150613cc782846136bf565b6020820191508190509392505050565b6000602082019050613cec6000830184613634565b92915050565b600060a082019050613d076000830188613634565b613d146020830187613634565b8181036040830152613d268186613643565b90508181036060830152613d3a8185613643565b90508181036080830152613d4e81846136d6565b90509695505050505050565b600060a082019050613d6f6000830188613634565b613d7c6020830187613634565b613d896040830186613c53565b613d966060830185613c53565b8181036080830152613da881846136d6565b90509695505050505050565b6000604082019050613dc96000830185613634565b613dd66020830184613c53565b9392505050565b60006020820190508181036000830152613df78184613643565b905092915050565b60006040820190508181036000830152613e198185613643565b90508181036020830152613e2d8184613643565b90509392505050565b6000602082019050613e4b60008301846136a1565b92915050565b600060a082019050613e6660008301886136b0565b613e7360208301876136b0565b613e8060408301866136b0565b613e8d6060830185613c53565b613e9a6080830184613634565b9695505050505050565b600060e082019050613eb9600083018a6136b0565b613ec66020830189613c53565b613ed36040830188613c53565b613ee06060830187613c53565b613eed608083018661370f565b613efa60a0830185613c53565b613f0760c0830184613634565b98975050505050505050565b6000608082019050613f2860008301876136b0565b613f356020830186613c62565b613f4260408301856136b0565b613f4f60608301846136b0565b95945050505050565b60006020820190508181036000830152613f72818461371e565b905092915050565b60006020820190508181036000830152613f9381613807565b9050919050565b60006020820190508181036000830152613fb38161382a565b9050919050565b60006020820190508181036000830152613fd38161384d565b9050919050565b60006020820190508181036000830152613ff381613870565b9050919050565b6000602082019050818103600083015261401381613893565b9050919050565b60006020820190508181036000830152614033816138b6565b9050919050565b60006020820190508181036000830152614053816138d9565b9050919050565b600060208201905081810360008301526140738161391f565b9050919050565b6000602082019050818103600083015261409381613942565b9050919050565b600060208201905081810360008301526140b381613965565b9050919050565b600060208201905081810360008301526140d381613988565b9050919050565b600060208201905081810360008301526140f3816139ab565b9050919050565b60006020820190508181036000830152614113816139ce565b9050919050565b60006020820190508181036000830152614133816139f1565b9050919050565b6000602082019050818103600083015261415381613a14565b9050919050565b6000602082019050818103600083015261417381613a37565b9050919050565b6000602082019050818103600083015261419381613a5a565b9050919050565b600060208201905081810360008301526141b381613a7d565b9050919050565b600060208201905081810360008301526141d381613aa0565b9050919050565b600060208201905081810360008301526141f381613ac3565b9050919050565b6000602082019050818103600083015261421381613ae6565b9050919050565b6000602082019050818103600083015261423381613b09565b9050919050565b6000602082019050818103600083015261425381613b2c565b9050919050565b6000602082019050818103600083015261427381613b72565b9050919050565b6000602082019050818103600083015261429381613b95565b9050919050565b600060208201905081810360008301526142b381613bb8565b9050919050565b600060208201905081810360008301526142d381613bdb565b9050919050565b600060208201905081810360008301526142f381613bfe565b9050919050565b6000602082019050818103600083015261431381613c21565b9050919050565b600060208201905061432f6000830184613c53565b92915050565b600060408201905061434a6000830185613c53565b6143576020830184613c53565b9392505050565b600060a0820190506143736000830188613c53565b6143806020830187613c53565b61438d6040830186613c53565b61439a606083018561370f565b6143a760808301846136a1565b9695505050505050565b60006143bb6143cc565b90506143c7828261475a565b919050565b6000604051905090565b600067ffffffffffffffff8211156143f1576143f06148fa565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561441d5761441c6148fa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614449576144486148fa565b5b61445282614969565b9050602081019050919050565b600067ffffffffffffffff82111561447a576144796148fa565b5b61448382614969565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061452c826146bd565b9150614537836146bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561456c5761456b61480f565b5b828201905092915050565b6000614582826146bd565b915061458d836146bd565b92508261459d5761459c61483e565b5b828204905092915050565b60006145b3826146bd565b91506145be836146bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145f7576145f661480f565b5b828202905092915050565b600061460d826146bd565b9150614618836146bd565b92508282101561462b5761462a61480f565b5b828203905092915050565b60006146418261469d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506146988261519a565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006146df8261468a565b9050919050565b82818337600083830152505050565b60005b838110156147135780820151818401526020810190506146f8565b83811115614722576000848401525b50505050565b6000600282049050600182168061474057607f821691505b602082108114156147545761475361489c565b5b50919050565b61476382614969565b810181811067ffffffffffffffff82111715614782576147816148fa565b5b80604052505050565b6000614796826146bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147c9576147c861480f565b5b600182019050919050565b6000819050919050565b60006147e9826146bd565b91506147f4836146bd565b9250826148045761480361483e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156149485760046000803e61494560005161497a565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5175616e7469747920657863656564732074686520737570706c790000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f5175616e746974792065786365656473206d6178206d696e742e20547279206d60008201527f696e74696e67206c6573732e0000000000000000000000000000000000000000602082015250565b7f5175616e74697479206578636565647320746865206c696d6974000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f57726f6e6720707269636520616d6f756e740000000000000000000000000000600082015250565b7f496e76616c69642063726561746520706172616d65746572732e000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d617820737570706c79206d7573742062652067726561746572207468616e2060008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b7f6974656d20736f6c64206f757400000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f6974656d206973206e6f74206163746976650000000000000000000000000000600082015250565b7f7265616368656420746865206d6178206d6178206c696d697420666f7220746860008201527f6973206974656d2e000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6974656d20646f6573206e6f7420657869737473000000000000000000000000600082015250565b7f455243313135354d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b50565b7f6974656d20646f6573206e6f7420657869737400000000000000000000000000600082015250565b7f5175616e746974792065786365656473207468652072656d61696e696e67207360008201527f7570706c79000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101561511457615197565b61511c6143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615144575050615197565b808201805167ffffffffffffffff8111156151625750505050615197565b80602083010160043d03850181111561517f575050505050615197565b61518e8260200185018661475a565b82955050505050505b90565b600281106151ab576151aa61486d565b5b50565b6151b781614636565b81146151c257600080fd5b50565b6151ce81614648565b81146151d957600080fd5b50565b6151e58161465e565b81146151f057600080fd5b50565b6002811061520057600080fd5b50565b61520c816146bd565b811461521757600080fd5b5056fea2646970667358221220cb12d663c01662d5e95b1837f62fd4cd2769db16a7123cc4a601ea9d5651a1b264736f6c6343000807003368747470733a2f2f677265656e726f6f6d2d6170692e6865726f6b756170702e636f6d2f6974656d732f6d657461646174612f68747470733a2f2f6465616468656164732e6d7970696e6174612e636c6f75642f697066732f516d514e3253564c34616272395a68563735474542535951667433667459453551647862784a596136584e514a41

Deployed Bytecode

0x6080604052600436106101655760003560e01c80638da5cb5b116100d1578063bfb231d21161008a578063e985e9c511610064578063e985e9c51461052c578063f242432a14610569578063f2fde38b14610592578063f9161abc146105bb57610165565b8063bfb231d214610483578063e2322df9146104c4578063e8a3d4851461050157610165565b80638da5cb5b14610375578063938e3d7b146103a0578063950d2c48146103c9578063a22cb465146103f4578063add70d211461041d578063bd85b0391461044657610165565b80632c3bd3f4116101235780632c3bd3f41461028f5780632eb2c2d6146102b85780634e1273f4146102e157806355f804b31461031e578063715018a614610347578063853828b61461035e57610165565b8062fdd58e1461016a57806301ffc9a7146101a757806302fe5305146101e4578063046dc1661461020d5780630e89341c146102365780631b2ef1ca14610273575b600080fd5b34801561017657600080fd5b50610191600480360381019061018c9190613203565b6105d7565b60405161019e919061431a565b60405180910390f35b3480156101b357600080fd5b506101ce60048036038101906101c991906132bb565b6106a0565b6040516101db9190613e36565b60405180910390f35b3480156101f057600080fd5b5061020b60048036038101906102069190613315565b610782565b005b34801561021957600080fd5b50610234600480360381019061022f9190612ff0565b610796565b005b34801561024257600080fd5b5061025d6004803603810190610258919061335e565b6107e2565b60405161026a9190613f58565b60405180910390f35b61028d600480360381019061028891906133cb565b61086f565b005b34801561029b57600080fd5b506102b660048036038101906102b1919061340b565b610b0e565b005b3480156102c457600080fd5b506102df60048036038101906102da919061305d565b610c77565b005b3480156102ed57600080fd5b5061030860048036038101906103039190613243565b610d18565b6040516103159190613ddd565b60405180910390f35b34801561032a57600080fd5b5061034560048036038101906103409190613315565b610e31565b005b34801561035357600080fd5b5061035c610e53565b005b34801561036a57600080fd5b50610373610e67565b005b34801561038157600080fd5b5061038a610eaf565b6040516103979190613cd7565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c29190613315565b610ed9565b005b3480156103d557600080fd5b506103de610efb565b6040516103eb9190613cd7565b60405180910390f35b34801561040057600080fd5b5061041b600480360381019061041691906131c3565b610f1f565b005b34801561042957600080fd5b50610444600480360381019061043f919061338b565b610f35565b005b34801561045257600080fd5b5061046d6004803603810190610468919061335e565b610fc8565b60405161047a919061431a565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a5919061335e565b610fe0565b6040516104bb95949392919061435e565b60405180910390f35b3480156104d057600080fd5b506104eb60048036038101906104e69190613498565b611030565b6040516104f89190613cd7565b60405180910390f35b34801561050d57600080fd5b5061051661109b565b6040516105239190613f58565b60405180910390f35b34801561053857600080fd5b50610553600480360381019061054e919061301d565b61112d565b6040516105609190613e36565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b919061312c565b6111c1565b005b34801561059e57600080fd5b506105b960048036038101906105b49190612ff0565b611262565b005b6105d560048036038101906105d0919061355a565b6112e6565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063f9061405a565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061076b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061077b575061077a82611510565b5b9050919050565b61078a61157a565b610793816115f8565b50565b61079e61157a565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600060076000848152602001908152602001600020600001541161083d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108349061423a565b60405180910390fd5b600461084883611612565b604051602001610859929190613c71565b6040516020818303038152906040529050919050565b6000600760008481526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820160009054906101000a900460ff1660018111156108d2576108d161486d565b5b60018111156108e4576108e361486d565b5b81526020016003820160019054906101000a900460ff1615151515815250509050600081600001511161094c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109439061421a565b60405180910390fd5b8060800151610990576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109879061419a565b60405180910390fd5b80600001516008600085815260200190815260200160002054106109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e09061415a565b60405180910390fd5b8060000151826008600086815260200190815260200160002054610a0d9190614521565b1115610a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a459061427a565b60405180910390fd5b6000610a5a33856105d7565b905081602001518110610aa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a99906141ba565b60405180910390fd5b81602001518382610ab39190614521565b1115610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb9061407a565b60405180910390fd5b610b08848360600151846040015186611773565b50505050565b610b1661157a565b6000600760008381526020019081526020016000206000015411610b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b669061425a565b60405180910390fd5b60008611610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba99061413a565b60405180910390fd5b836007600083815260200190815260200160002060020181905550826007600083815260200190815260200160002060030160006101000a81548160ff02191690836001811115610c0657610c0561486d565b5b0217905550856007600083815260200190815260200160002060000181905550846007600083815260200190815260200160002060010181905550816007600083815260200190815260200160002060030160016101000a81548160ff021916908315150217905550505050505050565b610c7f6118d3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610cc55750610cc485610cbf6118d3565b61112d565b5b610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90613fba565b60405180910390fd5b610d1185858585856118db565b5050505050565b60608151835114610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d55906142ba565b60405180910390fd5b6000835167ffffffffffffffff811115610d7b57610d7a6148fa565b5b604051908082528060200260200182016040528015610da95781602001602082028036833780820191505090505b50905060005b8451811015610e2657610df6858281518110610dce57610dcd6148cb565b5b6020026020010151858381518110610de957610de86148cb565b5b60200260200101516105d7565b828281518110610e0957610e086148cb565b5b60200260200101818152505080610e1f9061478b565b9050610daf565b508091505092915050565b610e3961157a565b8060049080519060200190610e4f929190612c5d565b5050565b610e5b61157a565b610e656000611bfd565b565b610e6f61157a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610ead57600080fd5b565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ee161157a565b8060059080519060200190610ef7929190612c5d565b5050565b7f000000000000000000000000136209a516d1c2660f045e70634c9d95d64325f981565b610f31610f2a6118d3565b8383611cc3565b5050565b610f3d61157a565b6000600760008481526020019081526020016000206000015411610f96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8d9061425a565b60405180910390fd5b806007600084815260200190815260200160002060030160016101000a81548160ff0219169083151502179055505050565b60086020528060005260406000206000915090505481565b60076020528060005260406000206000915090508060000154908060010154908060020154908060030160009054906101000a900460ff16908060030160019054906101000a900460ff16905085565b600061108d6110438a8a8a8a8a8a611e30565b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611e99565b905098975050505050505050565b6060600580546110aa90614728565b80601f01602080910402602001604051908101604052809291908181526020018280546110d690614728565b80156111235780601f106110f857610100808354040283529160200191611123565b820191906000526020600020905b81548152906001019060200180831161110657829003601f168201915b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111c96118d3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061120f575061120e856112096118d3565b61112d565b5b61124e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124590613fba565b60405180910390fd5b61125b8585858585611ec0565b5050505050565b61126a61157a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d19061403a565b60405180910390fd5b6112e381611bfd565b50565b6112f68888878787338888611030565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137c906140fa565b60405180910390fd5b6000600760008581526020019081526020016000206000015411156113b3576113ae838761086f565b611506565b878611156113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90613ffa565b60405180910390fd5b86861115611439576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114309061409a565b60405180910390fd5b6040518060a001604052808981526020018881526020018681526020018560018111156114695761146861486d565b5b8152602001600115158152506007600085815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030160006101000a81548160ff021916908360018111156114d1576114d061486d565b5b021790555060808201518160030160016101000a81548160ff02191690831515021790555090505061150583858789611773565b5b5050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6115826118d3565b73ffffffffffffffffffffffffffffffffffffffff166115a0610eaf565b73ffffffffffffffffffffffffffffffffffffffff16146115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed906141fa565b60405180910390fd5b565b806002908051906020019061160e929190612c5d565b5050565b6060600082141561165a576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061176e565b600082905060005b6000821461168c5780806116759061478b565b915050600a826116859190614577565b9150611662565b60008167ffffffffffffffff8111156116a8576116a76148fa565b5b6040519080825280601f01601f1916602001820160405280156116da5781602001600182028036833780820191505090505b5090505b60008514611767576001826116f39190614602565b9150600a8561170291906147de565b603061170e9190614521565b60f81b818381518110611724576117236148cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856117609190614577565b94506116de565b8093505050505b919050565b6000818361178191906145a8565b9050600060018111156117975761179661486d565b5b8460018111156117aa576117a961486d565b5b14156117f7573481146117f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e9906140da565b60405180910390fd5b611887565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166379cc679033836040518363ffffffff1660e01b8152600401611854929190613db4565b600060405180830381600087803b15801561186e57600080fd5b505af1158015611882573d6000803e3d6000fd5b505050505b816008600087815260200190815260200160002060008282546118aa9190614521565b925050819055506118cc3386846040518060200160405280600081525061215c565b5050505050565b600033905090565b815183511461191f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611916906142da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561198f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119869061411a565b60405180910390fd5b60006119996118d3565b90506119a981878787878761230d565b60005b8451811015611b5a5760008582815181106119ca576119c96148cb565b5b6020026020010151905060008583815181106119e9576119e86148cb565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a81906141da565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b3f9190614521565b9250508190555050505080611b539061478b565b90506119ac565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611bd1929190613dff565b60405180910390a4611be7818787878787612315565b611bf581878787878761231d565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d299061429a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e239190613e36565b60405180910390a3505050565b6000611e8d7fd1c27241daf4f03c6fdcb18799986ac8d3516a452c577f7425ebbca15b1eec19888888888888604051602001611e729796959493929190613ea4565b60405160208183030381529060405280519060200120612504565b90509695505050505050565b6000806000611ea8858561251e565b91509150611eb581612570565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f279061411a565b60405180910390fd5b6000611f3a6118d3565b90506000611f4785612745565b90506000611f5485612745565b9050611f6483898985858961230d565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff2906141da565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b09190614521565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161212d929190614335565b60405180910390a4612143848a8a86868a612315565b612151848a8a8a8a8a6127bf565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c3906142fa565b60405180910390fd5b60006121d66118d3565b905060006121e385612745565b905060006121f085612745565b90506122018360008985858961230d565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122609190614521565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516122de929190614335565b60405180910390a46122f583600089858589612315565b612304836000898989896127bf565b50505050505050565b505050505050565b505050505050565b61233c8473ffffffffffffffffffffffffffffffffffffffff166129a6565b156124fc578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612382959493929190613cf2565b602060405180830381600087803b15801561239c57600080fd5b505af19250505080156123cd57506040513d601f19601f820116820180604052508101906123ca91906132e8565b60015b612473576123d9614929565b806308c379a0141561243657506123ee615104565b806123f95750612438565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d9190613f58565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246a90613f9a565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f190613fda565b60405180910390fd5b505b505050505050565b60006125176125116129c9565b83612ae3565b9050919050565b6000806041835114156125605760008060006020860151925060408601519150606086015160001a905061255487828585612b16565b94509450505050612569565b60006002915091505b9250929050565b600060048111156125845761258361486d565b5b8160048111156125975761259661486d565b5b14156125a257612742565b600160048111156125b6576125b561486d565b5b8160048111156125c9576125c861486d565b5b141561260a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260190613f7a565b60405180910390fd5b6002600481111561261e5761261d61486d565b5b8160048111156126315761263061486d565b5b1415612672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126699061401a565b60405180910390fd5b600360048111156126865761268561486d565b5b8160048111156126995761269861486d565b5b14156126da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d1906140ba565b60405180910390fd5b6004808111156126ed576126ec61486d565b5b816004811115612700576126ff61486d565b5b1415612741576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127389061417a565b60405180910390fd5b5b50565b60606000600167ffffffffffffffff811115612764576127636148fa565b5b6040519080825280602002602001820160405280156127925781602001602082028036833780820191505090505b50905082816000815181106127aa576127a96148cb565b5b60200260200101818152505080915050919050565b6127de8473ffffffffffffffffffffffffffffffffffffffff166129a6565b1561299e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612824959493929190613d5a565b602060405180830381600087803b15801561283e57600080fd5b505af192505050801561286f57506040513d601f19601f8201168201806040525081019061286c91906132e8565b60015b6129155761287b614929565b806308c379a014156128d85750612890615104565b8061289b57506128da565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cf9190613f58565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290c90613f9a565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461299c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299390613fda565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f00000000000000000000000054041bbf04ed7994cb5ac0e3ca421cef5b8ef8b473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015612a4557507f000000000000000000000000000000000000000000000000000000000000000146145b15612a72577f4722fe68a1c4cbbf5b33e60bf46d67741ce7ee6c7b2dfd679b187db3bcddab039050612ae0565b612add7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f43569e5f3e37b4b32294b6b82b1c5816f3462b13c24191e37778af41352f14067f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c612c23565b90505b90565b60008282604051602001612af8929190613ca0565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612b51576000600391509150612c1a565b601b8560ff1614158015612b695750601c8560ff1614155b15612b7b576000600491509150612c1a565b600060018787878760405160008152602001604052604051612ba09493929190613f13565b6020604051602081039080840390855afa158015612bc2573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c1157600060019250925050612c1a565b80600092509250505b94509492505050565b60008383834630604051602001612c3e959493929190613e51565b6040516020818303038152906040528051906020012090509392505050565b828054612c6990614728565b90600052602060002090601f016020900481019282612c8b5760008555612cd2565b82601f10612ca457805160ff1916838001178555612cd2565b82800160010185558215612cd2579182015b82811115612cd1578251825591602001919060010190612cb6565b5b509050612cdf9190612ce3565b5090565b5b80821115612cfc576000816000905550600101612ce4565b5090565b6000612d13612d0e846143d6565b6143b1565b90508083825260208201905082856020860282011115612d3657612d35614955565b5b60005b85811015612d665781612d4c8882612e64565b845260208401935060208301925050600181019050612d39565b5050509392505050565b6000612d83612d7e84614402565b6143b1565b90508083825260208201905082856020860282011115612da657612da5614955565b5b60005b85811015612dd65781612dbc8882612fdb565b845260208401935060208301925050600181019050612da9565b5050509392505050565b6000612df3612dee8461442e565b6143b1565b905082815260208101848484011115612e0f57612e0e61495a565b5b612e1a8482856146e6565b509392505050565b6000612e35612e308461445f565b6143b1565b905082815260208101848484011115612e5157612e5061495a565b5b612e5c8482856146e6565b509392505050565b600081359050612e73816151ae565b92915050565b600082601f830112612e8e57612e8d614950565b5b8135612e9e848260208601612d00565b91505092915050565b600082601f830112612ebc57612ebb614950565b5b8135612ecc848260208601612d70565b91505092915050565b600081359050612ee4816151c5565b92915050565b600081359050612ef9816151dc565b92915050565b600081519050612f0e816151dc565b92915050565b60008083601f840112612f2a57612f29614950565b5b8235905067ffffffffffffffff811115612f4757612f4661494b565b5b602083019150836001820283011115612f6357612f62614955565b5b9250929050565b600082601f830112612f7f57612f7e614950565b5b8135612f8f848260208601612de0565b91505092915050565b600081359050612fa7816151f3565b92915050565b600082601f830112612fc257612fc1614950565b5b8135612fd2848260208601612e22565b91505092915050565b600081359050612fea81615203565b92915050565b60006020828403121561300657613005614964565b5b600061301484828501612e64565b91505092915050565b6000806040838503121561303457613033614964565b5b600061304285828601612e64565b925050602061305385828601612e64565b9150509250929050565b600080600080600060a0868803121561307957613078614964565b5b600061308788828901612e64565b955050602061309888828901612e64565b945050604086013567ffffffffffffffff8111156130b9576130b861495f565b5b6130c588828901612ea7565b935050606086013567ffffffffffffffff8111156130e6576130e561495f565b5b6130f288828901612ea7565b925050608086013567ffffffffffffffff8111156131135761311261495f565b5b61311f88828901612f6a565b9150509295509295909350565b600080600080600060a0868803121561314857613147614964565b5b600061315688828901612e64565b955050602061316788828901612e64565b945050604061317888828901612fdb565b935050606061318988828901612fdb565b925050608086013567ffffffffffffffff8111156131aa576131a961495f565b5b6131b688828901612f6a565b9150509295509295909350565b600080604083850312156131da576131d9614964565b5b60006131e885828601612e64565b92505060206131f985828601612ed5565b9150509250929050565b6000806040838503121561321a57613219614964565b5b600061322885828601612e64565b925050602061323985828601612fdb565b9150509250929050565b6000806040838503121561325a57613259614964565b5b600083013567ffffffffffffffff8111156132785761327761495f565b5b61328485828601612e79565b925050602083013567ffffffffffffffff8111156132a5576132a461495f565b5b6132b185828601612ea7565b9150509250929050565b6000602082840312156132d1576132d0614964565b5b60006132df84828501612eea565b91505092915050565b6000602082840312156132fe576132fd614964565b5b600061330c84828501612eff565b91505092915050565b60006020828403121561332b5761332a614964565b5b600082013567ffffffffffffffff8111156133495761334861495f565b5b61335584828501612fad565b91505092915050565b60006020828403121561337457613373614964565b5b600061338284828501612fdb565b91505092915050565b600080604083850312156133a2576133a1614964565b5b60006133b085828601612fdb565b92505060206133c185828601612ed5565b9150509250929050565b600080604083850312156133e2576133e1614964565b5b60006133f085828601612fdb565b925050602061340185828601612fdb565b9150509250929050565b60008060008060008060c0878903121561342857613427614964565b5b600061343689828a01612fdb565b965050602061344789828a01612fdb565b955050604061345889828a01612fdb565b945050606061346989828a01612f98565b935050608061347a89828a01612ed5565b92505060a061348b89828a01612fdb565b9150509295509295509295565b60008060008060008060008060e0898b0312156134b8576134b7614964565b5b60006134c68b828c01612fdb565b98505060206134d78b828c01612fdb565b97505060406134e88b828c01612fdb565b96505060606134f98b828c01612f98565b955050608061350a8b828c01612fdb565b94505060a061351b8b828c01612e64565b93505060c089013567ffffffffffffffff81111561353c5761353b61495f565b5b6135488b828c01612f14565b92509250509295985092959890939650565b60008060008060008060008060e0898b03121561357a57613579614964565b5b60006135888b828c01612fdb565b98505060206135998b828c01612fdb565b97505060406135aa8b828c01612fdb565b96505060606135bb8b828c01612fdb565b95505060806135cc8b828c01612f98565b94505060a06135dd8b828c01612fdb565b93505060c089013567ffffffffffffffff8111156135fe576135fd61495f565b5b61360a8b828c01612f14565b92509250509295985092959890939650565b60006136288383613c44565b60208301905092915050565b61363d81614636565b82525050565b600061364e826144b5565b61365881856144e3565b935061366383614490565b8060005b8381101561369457815161367b888261361c565b9750613686836144d6565b925050600181019050613667565b5085935050505092915050565b6136aa81614648565b82525050565b6136b981614654565b82525050565b6136d06136cb82614654565b6147d4565b82525050565b60006136e1826144c0565b6136eb81856144f4565b93506136fb8185602086016146f5565b61370481614969565b840191505092915050565b613718816146d4565b82525050565b6000613729826144cb565b6137338185614505565b93506137438185602086016146f5565b61374c81614969565b840191505092915050565b6000613762826144cb565b61376c8185614516565b935061377c8185602086016146f5565b80840191505092915050565b6000815461379581614728565b61379f8186614516565b945060018216600081146137ba57600181146137cb576137fe565b60ff198316865281860193506137fe565b6137d4856144a0565b60005b838110156137f6578154818901526001820191506020810190506137d7565b838801955050505b50505092915050565b6000613814601883614505565b915061381f82614987565b602082019050919050565b6000613837603483614505565b9150613842826149b0565b604082019050919050565b600061385a602f83614505565b9150613865826149ff565b604082019050919050565b600061387d602883614505565b915061388882614a4e565b604082019050919050565b60006138a0601b83614505565b91506138ab82614a9d565b602082019050919050565b60006138c3601f83614505565b91506138ce82614ac6565b602082019050919050565b60006138e6602683614505565b91506138f182614aef565b604082019050919050565b6000613909600283614516565b915061391482614b3e565b600282019050919050565b600061392c602a83614505565b915061393782614b67565b604082019050919050565b600061394f602c83614505565b915061395a82614bb6565b604082019050919050565b6000613972601a83614505565b915061397d82614c05565b602082019050919050565b6000613995602283614505565b91506139a082614c2e565b604082019050919050565b60006139b8601283614505565b91506139c382614c7d565b602082019050919050565b60006139db601a83614505565b91506139e682614ca6565b602082019050919050565b60006139fe602583614505565b9150613a0982614ccf565b604082019050919050565b6000613a21602183614505565b9150613a2c82614d1e565b604082019050919050565b6000613a44600d83614505565b9150613a4f82614d6d565b602082019050919050565b6000613a67602283614505565b9150613a7282614d96565b604082019050919050565b6000613a8a601283614505565b9150613a9582614de5565b602082019050919050565b6000613aad602883614505565b9150613ab882614e0e565b604082019050919050565b6000613ad0602a83614505565b9150613adb82614e5d565b604082019050919050565b6000613af3602083614505565b9150613afe82614eac565b602082019050919050565b6000613b16601483614505565b9150613b2182614ed5565b602082019050919050565b6000613b39603083614505565b9150613b4482614efe565b604082019050919050565b6000613b5c600083614516565b9150613b6782614f4d565b600082019050919050565b6000613b7f601383614505565b9150613b8a82614f50565b602082019050919050565b6000613ba2602583614505565b9150613bad82614f79565b604082019050919050565b6000613bc5602983614505565b9150613bd082614fc8565b604082019050919050565b6000613be8602983614505565b9150613bf382615017565b604082019050919050565b6000613c0b602883614505565b9150613c1682615066565b604082019050919050565b6000613c2e602183614505565b9150613c39826150b5565b604082019050919050565b613c4d816146bd565b82525050565b613c5c816146bd565b82525050565b613c6b816146c7565b82525050565b6000613c7d8285613788565b9150613c898284613757565b9150613c9482613b4f565b91508190509392505050565b6000613cab826138fc565b9150613cb782856136bf565b602082019150613cc782846136bf565b6020820191508190509392505050565b6000602082019050613cec6000830184613634565b92915050565b600060a082019050613d076000830188613634565b613d146020830187613634565b8181036040830152613d268186613643565b90508181036060830152613d3a8185613643565b90508181036080830152613d4e81846136d6565b90509695505050505050565b600060a082019050613d6f6000830188613634565b613d7c6020830187613634565b613d896040830186613c53565b613d966060830185613c53565b8181036080830152613da881846136d6565b90509695505050505050565b6000604082019050613dc96000830185613634565b613dd66020830184613c53565b9392505050565b60006020820190508181036000830152613df78184613643565b905092915050565b60006040820190508181036000830152613e198185613643565b90508181036020830152613e2d8184613643565b90509392505050565b6000602082019050613e4b60008301846136a1565b92915050565b600060a082019050613e6660008301886136b0565b613e7360208301876136b0565b613e8060408301866136b0565b613e8d6060830185613c53565b613e9a6080830184613634565b9695505050505050565b600060e082019050613eb9600083018a6136b0565b613ec66020830189613c53565b613ed36040830188613c53565b613ee06060830187613c53565b613eed608083018661370f565b613efa60a0830185613c53565b613f0760c0830184613634565b98975050505050505050565b6000608082019050613f2860008301876136b0565b613f356020830186613c62565b613f4260408301856136b0565b613f4f60608301846136b0565b95945050505050565b60006020820190508181036000830152613f72818461371e565b905092915050565b60006020820190508181036000830152613f9381613807565b9050919050565b60006020820190508181036000830152613fb38161382a565b9050919050565b60006020820190508181036000830152613fd38161384d565b9050919050565b60006020820190508181036000830152613ff381613870565b9050919050565b6000602082019050818103600083015261401381613893565b9050919050565b60006020820190508181036000830152614033816138b6565b9050919050565b60006020820190508181036000830152614053816138d9565b9050919050565b600060208201905081810360008301526140738161391f565b9050919050565b6000602082019050818103600083015261409381613942565b9050919050565b600060208201905081810360008301526140b381613965565b9050919050565b600060208201905081810360008301526140d381613988565b9050919050565b600060208201905081810360008301526140f3816139ab565b9050919050565b60006020820190508181036000830152614113816139ce565b9050919050565b60006020820190508181036000830152614133816139f1565b9050919050565b6000602082019050818103600083015261415381613a14565b9050919050565b6000602082019050818103600083015261417381613a37565b9050919050565b6000602082019050818103600083015261419381613a5a565b9050919050565b600060208201905081810360008301526141b381613a7d565b9050919050565b600060208201905081810360008301526141d381613aa0565b9050919050565b600060208201905081810360008301526141f381613ac3565b9050919050565b6000602082019050818103600083015261421381613ae6565b9050919050565b6000602082019050818103600083015261423381613b09565b9050919050565b6000602082019050818103600083015261425381613b2c565b9050919050565b6000602082019050818103600083015261427381613b72565b9050919050565b6000602082019050818103600083015261429381613b95565b9050919050565b600060208201905081810360008301526142b381613bb8565b9050919050565b600060208201905081810360008301526142d381613bdb565b9050919050565b600060208201905081810360008301526142f381613bfe565b9050919050565b6000602082019050818103600083015261431381613c21565b9050919050565b600060208201905061432f6000830184613c53565b92915050565b600060408201905061434a6000830185613c53565b6143576020830184613c53565b9392505050565b600060a0820190506143736000830188613c53565b6143806020830187613c53565b61438d6040830186613c53565b61439a606083018561370f565b6143a760808301846136a1565b9695505050505050565b60006143bb6143cc565b90506143c7828261475a565b919050565b6000604051905090565b600067ffffffffffffffff8211156143f1576143f06148fa565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561441d5761441c6148fa565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614449576144486148fa565b5b61445282614969565b9050602081019050919050565b600067ffffffffffffffff82111561447a576144796148fa565b5b61448382614969565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061452c826146bd565b9150614537836146bd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561456c5761456b61480f565b5b828201905092915050565b6000614582826146bd565b915061458d836146bd565b92508261459d5761459c61483e565b5b828204905092915050565b60006145b3826146bd565b91506145be836146bd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145f7576145f661480f565b5b828202905092915050565b600061460d826146bd565b9150614618836146bd565b92508282101561462b5761462a61480f565b5b828203905092915050565b60006146418261469d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506146988261519a565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006146df8261468a565b9050919050565b82818337600083830152505050565b60005b838110156147135780820151818401526020810190506146f8565b83811115614722576000848401525b50505050565b6000600282049050600182168061474057607f821691505b602082108114156147545761475361489c565b5b50919050565b61476382614969565b810181811067ffffffffffffffff82111715614782576147816148fa565b5b80604052505050565b6000614796826146bd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147c9576147c861480f565b5b600182019050919050565b6000819050919050565b60006147e9826146bd565b91506147f4836146bd565b9250826148045761480361483e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156149485760046000803e61494560005161497a565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5175616e7469747920657863656564732074686520737570706c790000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f5175616e746974792065786365656473206d6178206d696e742e20547279206d60008201527f696e74696e67206c6573732e0000000000000000000000000000000000000000602082015250565b7f5175616e74697479206578636565647320746865206c696d6974000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f57726f6e6720707269636520616d6f756e740000000000000000000000000000600082015250565b7f496e76616c69642063726561746520706172616d65746572732e000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4d617820737570706c79206d7573742062652067726561746572207468616e2060008201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b7f6974656d20736f6c64206f757400000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f6974656d206973206e6f74206163746976650000000000000000000000000000600082015250565b7f7265616368656420746865206d6178206d6178206c696d697420666f7220746860008201527f6973206974656d2e000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f6974656d20646f6573206e6f7420657869737473000000000000000000000000600082015250565b7f455243313135354d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b50565b7f6974656d20646f6573206e6f7420657869737400000000000000000000000000600082015250565b7f5175616e746974792065786365656473207468652072656d61696e696e67207360008201527f7570706c79000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101561511457615197565b61511c6143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615144575050615197565b808201805167ffffffffffffffff8111156151625750505050615197565b80602083010160043d03850181111561517f575050505050615197565b61518e8260200185018661475a565b82955050505050505b90565b600281106151ab576151aa61486d565b5b50565b6151b781614636565b81146151c257600080fd5b50565b6151ce81614648565b81146151d957600080fd5b50565b6151e58161465e565b81146151f057600080fd5b50565b6002811061520057600080fd5b50565b61520c816146bd565b811461521757600080fd5b5056fea2646970667358221220cb12d663c01662d5e95b1837f62fd4cd2769db16a7123cc4a601ea9d5651a1b264736f6c63430008070033

Deployed Bytecode Sourcemap

73031:6531:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57435:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56458:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77218:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79316:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78601:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74509:809;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76404:601;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59379:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57831:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79202:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22491:103;;;;;;;;;;;;;:::i;:::-;;79442:117;;;;;;;;;;;;;:::i;:::-;;21843:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78968:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73087:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58428:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77013:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73256:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73212:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;78143:450;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79098:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58655:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58895:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22749:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75326:1070;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57435:230;57521:7;57568:1;57549:21;;:7;:21;;;;57541:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57635:9;:13;57645:2;57635:13;;;;;;;;;;;:22;57649:7;57635:22;;;;;;;;;;;;;;;;57628:29;;57435:230;;;;:::o;56458:310::-;56560:4;56612:26;56597:41;;;:11;:41;;;;:110;;;;56670:37;56655:52;;;:11;:52;;;;56597:110;:163;;;;56724:36;56748:11;56724:23;:36::i;:::-;56597:163;56577:183;;56458:310;;;:::o;77218:99::-;21729:13;:11;:13::i;:::-;77287:22:::1;77301:7;77287:13;:22::i;:::-;77218:99:::0;:::o;79316:118::-;21729:13;:11;:13::i;:::-;79412:14:::1;79396:13;;:30;;;;;;;;;;;;;;;;;;79316:118:::0;:::o;78601:359::-;78698:13;78779:1;78751:5;:15;78757:8;78751:15;;;;;;;;;;;:25;;;:29;78729:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;78911:7;78920:26;78937:8;78920:16;:26::i;:::-;78894:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78867:85;;78601:359;;;:::o;74509:809::-;74610:16;74629:5;:14;74635:7;74629:14;;;;;;;;;;;74610:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74679:1;74662:4;:14;;;:18;74654:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;74724:4;:11;;;74716:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;74800:4;:14;;;74777:11;:20;74789:7;74777:20;;;;;;;;;;;;:37;74769:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;74901:4;:14;;;74888:9;74865:11;:20;74877:7;74865:20;;;;;;;;;;;;:32;;;;:::i;:::-;:50;;74843:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;74991:15;75009:30;75019:10;75031:7;75009:9;:30::i;:::-;74991:48;;75068:4;:14;;;75058:7;:24;75050:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;75169:4;:14;;;75156:9;75146:7;:19;;;;:::i;:::-;:37;;75138:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;75253:57;75260:7;75269:4;:17;;;75288:4;:10;;;75300:9;75253:6;:57::i;:::-;74599:719;;74509:809;;:::o;76404:601::-;21729:13;:11;:13::i;:::-;76667:1:::1;76640:5;:14;76646:7;76640:14;;;;;;;;;;;:24;;;:28;76632:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;76724:1;76711:10;:14;76703:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;76799:6;76776:5;:14;76782:7;76776:14;;;;;;;;;;;:20;;:29;;;;76846:13;76816:5;:14;76822:7;76816:14;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;76897:10;76870:5;:14;76876:7;76870:14;;;;;;;;;;;:24;;:37;;;;76945:10;76918:5;:14;76924:7;76918:14;;;;;;;;;;;:24;;:37;;;;76990:7;76966:5;:14;76972:7;76966:14;;;;;;;;;;;:21;;;:31;;;;;;;;;;;;;;;;;;76404:601:::0;;;;;;:::o;59379:439::-;59620:12;:10;:12::i;:::-;59612:20;;:4;:20;;;:60;;;;59636:36;59653:4;59659:12;:10;:12::i;:::-;59636:16;:36::i;:::-;59612:60;59590:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;59758:52;59781:4;59787:2;59791:3;59796:7;59805:4;59758:22;:52::i;:::-;59379:439;;;;;:::o;57831:524::-;57987:16;58048:3;:10;58029:8;:15;:29;58021:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;58117:30;58164:8;:15;58150:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58117:63;;58198:9;58193:122;58217:8;:15;58213:1;:19;58193:122;;;58273:30;58283:8;58292:1;58283:11;;;;;;;;:::i;:::-;;;;;;;;58296:3;58300:1;58296:6;;;;;;;;:::i;:::-;;;;;;;;58273:9;:30::i;:::-;58254:13;58268:1;58254:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;58234:3;;;;:::i;:::-;;;58193:122;;;;58334:13;58327:20;;;57831:524;;;;:::o;79202:106::-;21729:13;:11;:13::i;:::-;79289:11:::1;79279:7;:21;;;;;;;;;;;;:::i;:::-;;79202:106:::0;:::o;22491:103::-;21729:13;:11;:13::i;:::-;22556:30:::1;22583:1;22556:18;:30::i;:::-;22491:103::o:0;79442:117::-;21729:13;:11;:13::i;:::-;79511:10:::1;79503:24;;:47;79528:21;79503:47;;;;;;;;;;;;;;;;;;;;;;;79495:56;;;::::0;::::1;;79442:117::o:0;21843:87::-;21889:7;21916:6;;;;;;;;;;;21909:13;;21843:87;:::o;78968:122::-;21729:13;:11;:13::i;:::-;79067:15:::1;79053:11;:29;;;;;;;;;;;;:::i;:::-;;78968:122:::0;:::o;73087:38::-;;;:::o;58428:155::-;58523:52;58542:12;:10;:12::i;:::-;58556:8;58566;58523:18;:52::i;:::-;58428:155;;:::o;77013:197::-;21729:13;:11;:13::i;:::-;77133:1:::1;77106:5;:14;77112:7;77106:14;;;;;;;;;;;:24;;;:28;77098:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;77195:7;77171:5;:14;77177:7;77171:14;;;;;;;;;;;:21;;;:31;;;;;;;;;;;;;;;;;;77013:197:::0;;:::o;73256:46::-;;;;;;;;;;;;;;;;;:::o;73212:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;78143:450::-;78403:7;78443:142;78475:67;78481:10;78493;78505:6;78513:13;78528:3;78533:8;78475:5;:67::i;:::-;78561:9;;78443:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:142::i;:::-;78423:162;;78143:450;;;;;;;;;;:::o;79098:96::-;79142:13;79175:11;79168:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79098:96;:::o;58655:168::-;58754:4;58778:18;:27;58797:7;58778:27;;;;;;;;;;;;;;;:37;58806:8;58778:37;;;;;;;;;;;;;;;;;;;;;;;;;58771:44;;58655:168;;;;:::o;58895:407::-;59111:12;:10;:12::i;:::-;59103:20;;:4;:20;;;:60;;;;59127:36;59144:4;59150:12;:10;:12::i;:::-;59127:16;:36::i;:::-;59103:60;59081:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;59249:45;59267:4;59273:2;59277;59281:6;59289:4;59249:17;:45::i;:::-;58895:407;;;;;:::o;22749:201::-;21729:13;:11;:13::i;:::-;22858:1:::1;22838:22;;:8;:22;;;;22830:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22914:28;22933:8;22914:18;:28::i;:::-;22749:201:::0;:::o;75326:1070::-;75649:260;75686:10;75719;75752:6;75781:13;75817:7;75847:10;75880;;75649:14;:260::i;:::-;75615:294;;:13;;;;;;;;;;;:294;;;75593:370;;;;;;;;;;;;:::i;:::-;;;;;;;;;76005:1;75978:5;:14;75984:7;75978:14;;;;;;;;;;;:24;;;:28;75974:415;;;76023:24;76028:7;76037:9;76023:4;:24::i;:::-;75974:415;;;76101:10;76088:9;:23;;76080:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;76179:10;76166:9;:23;;76158:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;76254:57;;;;;;;;76259:10;76254:57;;;;76271:10;76254:57;;;;76283:6;76254:57;;;;76291:13;76254:57;;;;;;;;:::i;:::-;;;;;;76306:4;76254:57;;;;;76237:5;:14;76243:7;76237:14;;;;;;;;;;;:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76328:49;76335:7;76344:13;76359:6;76367:9;76328:6;:49::i;:::-;75974:415;75326:1070;;;;;;;;:::o;47739:157::-;47824:4;47863:25;47848:40;;;:11;:40;;;;47841:47;;47739:157;;;:::o;22008:132::-;22083:12;:10;:12::i;:::-;22072:23;;:7;:5;:7::i;:::-;:23;;;22064:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22008:132::o;63604:88::-;63678:6;63671:4;:13;;;;;;;;;;;;:::i;:::-;;63604:88;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;74058:443::-;74174:13;74198:8;74190:5;:16;;;;:::i;:::-;74174:32;;74237:20;74221:36;;;;;;;;:::i;:::-;;:12;:36;;;;;;;;:::i;:::-;;;74217:185;;;74291:9;74282:5;:18;74274:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;74217:185;;;74356:6;;;;;;;;;;;:15;;;74372:10;74384:5;74356:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74217:185;74435:8;74412:11;:19;74424:6;74412:19;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;74454:39;74460:10;74472:6;74480:8;74454:39;;;;;;;;;;;;:5;:39::i;:::-;74163:338;74058:443;;;;:::o;20394:98::-;20447:7;20474:10;20467:17;;20394:98;:::o;61614:1146::-;61841:7;:14;61827:3;:10;:28;61819:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;61933:1;61919:16;;:2;:16;;;;61911:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;61990:16;62009:12;:10;:12::i;:::-;61990:31;;62034:60;62055:8;62065:4;62071:2;62075:3;62080:7;62089:4;62034:20;:60::i;:::-;62112:9;62107:421;62131:3;:10;62127:1;:14;62107:421;;;62163:10;62176:3;62180:1;62176:6;;;;;;;;:::i;:::-;;;;;;;;62163:19;;62197:14;62214:7;62222:1;62214:10;;;;;;;;:::i;:::-;;;;;;;;62197:27;;62241:19;62263:9;:13;62273:2;62263:13;;;;;;;;;;;:19;62277:4;62263:19;;;;;;;;;;;;;;;;62241:41;;62320:6;62305:11;:21;;62297:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;62453:6;62439:11;:20;62417:9;:13;62427:2;62417:13;;;;;;;;;;;:19;62431:4;62417:19;;;;;;;;;;;;;;;:42;;;;62510:6;62489:9;:13;62499:2;62489:13;;;;;;;;;;;:17;62503:2;62489:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;62148:380;;;62143:3;;;;:::i;:::-;;;62107:421;;;;62575:2;62545:47;;62569:4;62545:47;;62559:8;62545:47;;;62579:3;62584:7;62545:47;;;;;;;:::i;:::-;;;;;;;;62605:59;62625:8;62635:4;62641:2;62645:3;62650:7;62659:4;62605:19;:59::i;:::-;62677:75;62713:8;62723:4;62729:2;62733:3;62738:7;62747:4;62677:35;:75::i;:::-;61808:952;61614:1146;;;;;:::o;23110:191::-;23184:16;23203:6;;;;;;;;;;;23184:25;;23229:8;23220:6;;:17;;;;;;;;;;;;;;;;;;23284:8;23253:40;;23274:8;23253:40;;;;;;;;;;;;23173:128;23110:191;:::o;68491:331::-;68646:8;68637:17;;:5;:17;;;;68629:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;68749:8;68711:18;:25;68730:5;68711:25;;;;;;;;;;;;;;;:35;68737:8;68711:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;68795:8;68773:41;;68788:5;68773:41;;;68805:8;68773:41;;;;;;:::i;:::-;;;;;;;;68491:331;;;:::o;77325:810::-;77542:7;77582:545;77686:173;77886:10;77923;77960:6;77993:13;78033:3;78063:7;77649:444;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77617:495;;;;;;77582:16;:545::i;:::-;77562:565;;77325:810;;;;;;;;:::o;6353:231::-;6431:7;6452:17;6471:18;6493:27;6504:4;6510:9;6493:10;:27::i;:::-;6451:69;;;;6531:18;6543:5;6531:11;:18::i;:::-;6567:9;6560:16;;;;6353:231;;;;:::o;60282:974::-;60484:1;60470:16;;:2;:16;;;;60462:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60541:16;60560:12;:10;:12::i;:::-;60541:31;;60583:20;60606:21;60624:2;60606:17;:21::i;:::-;60583:44;;60638:24;60665:25;60683:6;60665:17;:25::i;:::-;60638:52;;60703:60;60724:8;60734:4;60740:2;60744:3;60749:7;60758:4;60703:20;:60::i;:::-;60776:19;60798:9;:13;60808:2;60798:13;;;;;;;;;;;:19;60812:4;60798:19;;;;;;;;;;;;;;;;60776:41;;60851:6;60836:11;:21;;60828:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;60976:6;60962:11;:20;60940:9;:13;60950:2;60940:13;;;;;;;;;;;:19;60954:4;60940:19;;;;;;;;;;;;;;;:42;;;;61025:6;61004:9;:13;61014:2;61004:13;;;;;;;;;;;:17;61018:2;61004:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;61080:2;61049:46;;61074:4;61049:46;;61064:8;61049:46;;;61084:2;61088:6;61049:46;;;;;;;:::i;:::-;;;;;;;;61108:59;61128:8;61138:4;61144:2;61148:3;61153:7;61162:4;61108:19;:59::i;:::-;61180:68;61211:8;61221:4;61227:2;61231;61235:6;61243:4;61180:30;:68::i;:::-;60451:805;;;;60282:974;;;;;:::o;64078:729::-;64245:1;64231:16;;:2;:16;;;;64223:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;64298:16;64317:12;:10;:12::i;:::-;64298:31;;64340:20;64363:21;64381:2;64363:17;:21::i;:::-;64340:44;;64395:24;64422:25;64440:6;64422:17;:25::i;:::-;64395:52;;64460:66;64481:8;64499:1;64503:2;64507:3;64512:7;64521:4;64460:20;:66::i;:::-;64560:6;64539:9;:13;64549:2;64539:13;;;;;;;;;;;:17;64553:2;64539:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;64619:2;64582:52;;64615:1;64582:52;;64597:8;64582:52;;;64623:2;64627:6;64582:52;;;;;;;:::i;:::-;;;;;;;;64647:65;64667:8;64685:1;64689:2;64693:3;64698:7;64707:4;64647:19;:65::i;:::-;64725:74;64756:8;64774:1;64778:2;64782;64786:6;64794:4;64725:30;:74::i;:::-;64212:595;;;64078:729;;;;:::o;69780:221::-;;;;;;;:::o;70956:220::-;;;;;;;:::o;71936:813::-;72176:15;:2;:13;;;:15::i;:::-;72172:570;;;72229:2;72212:43;;;72256:8;72266:4;72272:3;72277:7;72286:4;72212:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;72208:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;72604:6;72597:14;;;;;;;;;;;:::i;:::-;;;;;;;;72208:523;;;72653:62;;;;;;;;;;:::i;:::-;;;;;;;;72208:523;72385:48;;;72373:60;;;:8;:60;;;;72369:159;;72458:50;;;;;;;;;;:::i;:::-;;;;;;;;72369:159;72292:251;72172:570;71936:813;;;;;;:::o;15927:167::-;16004:7;16031:55;16053:20;:18;:20::i;:::-;16075:10;16031:21;:55::i;:::-;16024:62;;15927:167;;;:::o;4804:747::-;4885:7;4894:12;4943:2;4923:9;:16;:22;4919:625;;;4962:9;4986;5010:7;5267:4;5256:9;5252:20;5246:27;5241:32;;5317:4;5306:9;5302:20;5296:27;5291:32;;5375:4;5364:9;5360:20;5354:27;5351:1;5346:36;5341:41;;5418:25;5429:4;5435:1;5438;5441;5418:10;:25::i;:::-;5411:32;;;;;;;;;4919:625;5492:1;5496:35;5476:56;;;;4804:747;;;;;;:::o;3075:643::-;3153:20;3144:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;3140:571;;;3190:7;;3140:571;3251:29;3242:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;3238:473;;;3297:34;;;;;;;;;;:::i;:::-;;;;;;;;3238:473;3362:35;3353:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;3349:362;;;3414:41;;;;;;;;;;:::i;:::-;;;;;;;;3349:362;3486:30;3477:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3473:238;;;3533:44;;;;;;;;;;:::i;:::-;;;;;;;;3473:238;3608:30;3599:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;3595:116;;;3655:44;;;;;;;;;;:::i;:::-;;;;;;;;3595:116;3075:643;;:::o;72757:198::-;72823:16;72852:22;72891:1;72877:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72852:41;;72915:7;72904:5;72910:1;72904:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;72942:5;72935:12;;;72757:198;;;:::o;71184:744::-;71399:15;:2;:13;;;:15::i;:::-;71395:526;;;71452:2;71435:38;;;71474:8;71484:4;71490:2;71494:6;71502:4;71435:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;71431:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;71783:6;71776:14;;;;;;;;;;;:::i;:::-;;;;;;;;71431:479;;;71832:62;;;;;;;;;;:::i;:::-;;;;;;;;71431:479;71569:43;;;71557:55;;;:8;:55;;;;71553:154;;71637:50;;;;;;;;;;:::i;:::-;;;;;;;;71553:154;71508:214;71395:526;71184:744;;;;;;:::o;38637:326::-;38697:4;38954:1;38932:7;:19;;;:23;38925:30;;38637:326;;;:::o;14700:314::-;14753:7;14794:12;14777:29;;14785:4;14777:29;;;:66;;;;;14827:16;14810:13;:33;14777:66;14773:234;;;14867:24;14860:31;;;;14773:234;14931:64;14953:10;14965:12;14979:15;14931:21;:64::i;:::-;14924:71;;14700:314;;:::o;11267:196::-;11360:7;11426:15;11443:10;11397:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11387:68;;;;;;11380:75;;11267:196;;;;:::o;7805:1632::-;7936:7;7945:12;8870:66;8865:1;8857:10;;:79;8853:163;;;8969:1;8973:30;8953:51;;;;;;8853:163;9035:2;9030:1;:7;;;;:18;;;;;9046:2;9041:1;:7;;;;9030:18;9026:102;;;9081:1;9085:30;9065:51;;;;;;9026:102;9225:14;9242:24;9252:4;9258:1;9261;9264;9242:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9225:41;;9299:1;9281:20;;:6;:20;;;9277:103;;;9334:1;9338:29;9318:50;;;;;;;9277:103;9400:6;9408:20;9392:37;;;;;7805:1632;;;;;;;;:::o;15022:263::-;15166:7;15214:8;15224;15234:11;15247:13;15270:4;15203:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;15193:84;;;;;;15186:91;;15022:263;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:552::-;3761:8;3771:6;3821:3;3814:4;3806:6;3802:17;3798:27;3788:122;;3829:79;;:::i;:::-;3788:122;3942:6;3929:20;3919:30;;3972:18;3964:6;3961:30;3958:117;;;3994:79;;:::i;:::-;3958:117;4108:4;4100:6;4096:17;4084:29;;4162:3;4154:4;4146:6;4142:17;4132:8;4128:32;4125:41;4122:128;;;4169:79;;:::i;:::-;4122:128;3704:552;;;;;:::o;4275:338::-;4330:5;4379:3;4372:4;4364:6;4360:17;4356:27;4346:122;;4387:79;;:::i;:::-;4346:122;4504:6;4491:20;4529:78;4603:3;4595:6;4588:4;4580:6;4576:17;4529:78;:::i;:::-;4520:87;;4336:277;4275:338;;;;:::o;4619:181::-;4686:5;4724:6;4711:20;4702:29;;4740:54;4788:5;4740:54;:::i;:::-;4619:181;;;;:::o;4820:340::-;4876:5;4925:3;4918:4;4910:6;4906:17;4902:27;4892:122;;4933:79;;:::i;:::-;4892:122;5050:6;5037:20;5075:79;5150:3;5142:6;5135:4;5127:6;5123:17;5075:79;:::i;:::-;5066:88;;4882:278;4820:340;;;;:::o;5166:139::-;5212:5;5250:6;5237:20;5228:29;;5266:33;5293:5;5266:33;:::i;:::-;5166:139;;;;:::o;5311:329::-;5370:6;5419:2;5407:9;5398:7;5394:23;5390:32;5387:119;;;5425:79;;:::i;:::-;5387:119;5545:1;5570:53;5615:7;5606:6;5595:9;5591:22;5570:53;:::i;:::-;5560:63;;5516:117;5311:329;;;;:::o;5646:474::-;5714:6;5722;5771:2;5759:9;5750:7;5746:23;5742:32;5739:119;;;5777:79;;:::i;:::-;5739:119;5897:1;5922:53;5967:7;5958:6;5947:9;5943:22;5922:53;:::i;:::-;5912:63;;5868:117;6024:2;6050:53;6095:7;6086:6;6075:9;6071:22;6050:53;:::i;:::-;6040:63;;5995:118;5646:474;;;;;:::o;6126:1509::-;6280:6;6288;6296;6304;6312;6361:3;6349:9;6340:7;6336:23;6332:33;6329:120;;;6368:79;;:::i;:::-;6329:120;6488:1;6513:53;6558:7;6549:6;6538:9;6534:22;6513:53;:::i;:::-;6503:63;;6459:117;6615:2;6641:53;6686:7;6677:6;6666:9;6662:22;6641:53;:::i;:::-;6631:63;;6586:118;6771:2;6760:9;6756:18;6743:32;6802:18;6794:6;6791:30;6788:117;;;6824:79;;:::i;:::-;6788:117;6929:78;6999:7;6990:6;6979:9;6975:22;6929:78;:::i;:::-;6919:88;;6714:303;7084:2;7073:9;7069:18;7056:32;7115:18;7107:6;7104:30;7101:117;;;7137:79;;:::i;:::-;7101:117;7242:78;7312:7;7303:6;7292:9;7288:22;7242:78;:::i;:::-;7232:88;;7027:303;7397:3;7386:9;7382:19;7369:33;7429:18;7421:6;7418:30;7415:117;;;7451:79;;:::i;:::-;7415:117;7556:62;7610:7;7601:6;7590:9;7586:22;7556:62;:::i;:::-;7546:72;;7340:288;6126:1509;;;;;;;;:::o;7641:1089::-;7745:6;7753;7761;7769;7777;7826:3;7814:9;7805:7;7801:23;7797:33;7794:120;;;7833:79;;:::i;:::-;7794:120;7953:1;7978:53;8023:7;8014:6;8003:9;7999:22;7978:53;:::i;:::-;7968:63;;7924:117;8080:2;8106:53;8151:7;8142:6;8131:9;8127:22;8106:53;:::i;:::-;8096:63;;8051:118;8208:2;8234:53;8279:7;8270:6;8259:9;8255:22;8234:53;:::i;:::-;8224:63;;8179:118;8336:2;8362:53;8407:7;8398:6;8387:9;8383:22;8362:53;:::i;:::-;8352:63;;8307:118;8492:3;8481:9;8477:19;8464:33;8524:18;8516:6;8513:30;8510:117;;;8546:79;;:::i;:::-;8510:117;8651:62;8705:7;8696:6;8685:9;8681:22;8651:62;:::i;:::-;8641:72;;8435:288;7641:1089;;;;;;;;:::o;8736:468::-;8801:6;8809;8858:2;8846:9;8837:7;8833:23;8829:32;8826:119;;;8864:79;;:::i;:::-;8826:119;8984:1;9009:53;9054:7;9045:6;9034:9;9030:22;9009:53;:::i;:::-;8999:63;;8955:117;9111:2;9137:50;9179:7;9170:6;9159:9;9155:22;9137:50;:::i;:::-;9127:60;;9082:115;8736:468;;;;;:::o;9210:474::-;9278:6;9286;9335:2;9323:9;9314:7;9310:23;9306:32;9303:119;;;9341:79;;:::i;:::-;9303:119;9461:1;9486:53;9531:7;9522:6;9511:9;9507:22;9486:53;:::i;:::-;9476:63;;9432:117;9588:2;9614:53;9659:7;9650:6;9639:9;9635:22;9614:53;:::i;:::-;9604:63;;9559:118;9210:474;;;;;:::o;9690:894::-;9808:6;9816;9865:2;9853:9;9844:7;9840:23;9836:32;9833:119;;;9871:79;;:::i;:::-;9833:119;10019:1;10008:9;10004:17;9991:31;10049:18;10041:6;10038:30;10035:117;;;10071:79;;:::i;:::-;10035:117;10176:78;10246:7;10237:6;10226:9;10222:22;10176:78;:::i;:::-;10166:88;;9962:302;10331:2;10320:9;10316:18;10303:32;10362:18;10354:6;10351:30;10348:117;;;10384:79;;:::i;:::-;10348:117;10489:78;10559:7;10550:6;10539:9;10535:22;10489:78;:::i;:::-;10479:88;;10274:303;9690:894;;;;;:::o;10590:327::-;10648:6;10697:2;10685:9;10676:7;10672:23;10668:32;10665:119;;;10703:79;;:::i;:::-;10665:119;10823:1;10848:52;10892:7;10883:6;10872:9;10868:22;10848:52;:::i;:::-;10838:62;;10794:116;10590:327;;;;:::o;10923:349::-;10992:6;11041:2;11029:9;11020:7;11016:23;11012:32;11009:119;;;11047:79;;:::i;:::-;11009:119;11167:1;11192:63;11247:7;11238:6;11227:9;11223:22;11192:63;:::i;:::-;11182:73;;11138:127;10923:349;;;;:::o;11278:509::-;11347:6;11396:2;11384:9;11375:7;11371:23;11367:32;11364:119;;;11402:79;;:::i;:::-;11364:119;11550:1;11539:9;11535:17;11522:31;11580:18;11572:6;11569:30;11566:117;;;11602:79;;:::i;:::-;11566:117;11707:63;11762:7;11753:6;11742:9;11738:22;11707:63;:::i;:::-;11697:73;;11493:287;11278:509;;;;:::o;11793:329::-;11852:6;11901:2;11889:9;11880:7;11876:23;11872:32;11869:119;;;11907:79;;:::i;:::-;11869:119;12027:1;12052:53;12097:7;12088:6;12077:9;12073:22;12052:53;:::i;:::-;12042:63;;11998:117;11793:329;;;;:::o;12128:468::-;12193:6;12201;12250:2;12238:9;12229:7;12225:23;12221:32;12218:119;;;12256:79;;:::i;:::-;12218:119;12376:1;12401:53;12446:7;12437:6;12426:9;12422:22;12401:53;:::i;:::-;12391:63;;12347:117;12503:2;12529:50;12571:7;12562:6;12551:9;12547:22;12529:50;:::i;:::-;12519:60;;12474:115;12128:468;;;;;:::o;12602:474::-;12670:6;12678;12727:2;12715:9;12706:7;12702:23;12698:32;12695:119;;;12733:79;;:::i;:::-;12695:119;12853:1;12878:53;12923:7;12914:6;12903:9;12899:22;12878:53;:::i;:::-;12868:63;;12824:117;12980:2;13006:53;13051:7;13042:6;13031:9;13027:22;13006:53;:::i;:::-;12996:63;;12951:118;12602:474;;;;;:::o;13082:1093::-;13204:6;13212;13220;13228;13236;13244;13293:3;13281:9;13272:7;13268:23;13264:33;13261:120;;;13300:79;;:::i;:::-;13261:120;13420:1;13445:53;13490:7;13481:6;13470:9;13466:22;13445:53;:::i;:::-;13435:63;;13391:117;13547:2;13573:53;13618:7;13609:6;13598:9;13594:22;13573:53;:::i;:::-;13563:63;;13518:118;13675:2;13701:53;13746:7;13737:6;13726:9;13722:22;13701:53;:::i;:::-;13691:63;;13646:118;13803:2;13829:74;13895:7;13886:6;13875:9;13871:22;13829:74;:::i;:::-;13819:84;;13774:139;13952:3;13979:50;14021:7;14012:6;14001:9;13997:22;13979:50;:::i;:::-;13969:60;;13923:116;14078:3;14105:53;14150:7;14141:6;14130:9;14126:22;14105:53;:::i;:::-;14095:63;;14049:119;13082:1093;;;;;;;;:::o;14181:1443::-;14326:6;14334;14342;14350;14358;14366;14374;14382;14431:3;14419:9;14410:7;14406:23;14402:33;14399:120;;;14438:79;;:::i;:::-;14399:120;14558:1;14583:53;14628:7;14619:6;14608:9;14604:22;14583:53;:::i;:::-;14573:63;;14529:117;14685:2;14711:53;14756:7;14747:6;14736:9;14732:22;14711:53;:::i;:::-;14701:63;;14656:118;14813:2;14839:53;14884:7;14875:6;14864:9;14860:22;14839:53;:::i;:::-;14829:63;;14784:118;14941:2;14967:74;15033:7;15024:6;15013:9;15009:22;14967:74;:::i;:::-;14957:84;;14912:139;15090:3;15117:53;15162:7;15153:6;15142:9;15138:22;15117:53;:::i;:::-;15107:63;;15061:119;15219:3;15246:53;15291:7;15282:6;15271:9;15267:22;15246:53;:::i;:::-;15236:63;;15190:119;15376:3;15365:9;15361:19;15348:33;15408:18;15400:6;15397:30;15394:117;;;15430:79;;:::i;:::-;15394:117;15543:64;15599:7;15590:6;15579:9;15575:22;15543:64;:::i;:::-;15525:82;;;;15319:298;14181:1443;;;;;;;;;;;:::o;15630:::-;15775:6;15783;15791;15799;15807;15815;15823;15831;15880:3;15868:9;15859:7;15855:23;15851:33;15848:120;;;15887:79;;:::i;:::-;15848:120;16007:1;16032:53;16077:7;16068:6;16057:9;16053:22;16032:53;:::i;:::-;16022:63;;15978:117;16134:2;16160:53;16205:7;16196:6;16185:9;16181:22;16160:53;:::i;:::-;16150:63;;16105:118;16262:2;16288:53;16333:7;16324:6;16313:9;16309:22;16288:53;:::i;:::-;16278:63;;16233:118;16390:2;16416:53;16461:7;16452:6;16441:9;16437:22;16416:53;:::i;:::-;16406:63;;16361:118;16518:3;16545:74;16611:7;16602:6;16591:9;16587:22;16545:74;:::i;:::-;16535:84;;16489:140;16668:3;16695:53;16740:7;16731:6;16720:9;16716:22;16695:53;:::i;:::-;16685:63;;16639:119;16825:3;16814:9;16810:19;16797:33;16857:18;16849:6;16846:30;16843:117;;;16879:79;;:::i;:::-;16843:117;16992:64;17048:7;17039:6;17028:9;17024:22;16992:64;:::i;:::-;16974:82;;;;16768:298;15630:1443;;;;;;;;;;;:::o;17079:179::-;17148:10;17169:46;17211:3;17203:6;17169:46;:::i;:::-;17247:4;17242:3;17238:14;17224:28;;17079:179;;;;:::o;17264:118::-;17351:24;17369:5;17351:24;:::i;:::-;17346:3;17339:37;17264:118;;:::o;17418:732::-;17537:3;17566:54;17614:5;17566:54;:::i;:::-;17636:86;17715:6;17710:3;17636:86;:::i;:::-;17629:93;;17746:56;17796:5;17746:56;:::i;:::-;17825:7;17856:1;17841:284;17866:6;17863:1;17860:13;17841:284;;;17942:6;17936:13;17969:63;18028:3;18013:13;17969:63;:::i;:::-;17962:70;;18055:60;18108:6;18055:60;:::i;:::-;18045:70;;17901:224;17888:1;17885;17881:9;17876:14;;17841:284;;;17845:14;18141:3;18134:10;;17542:608;;;17418:732;;;;:::o;18156:109::-;18237:21;18252:5;18237:21;:::i;:::-;18232:3;18225:34;18156:109;;:::o;18271:118::-;18358:24;18376:5;18358:24;:::i;:::-;18353:3;18346:37;18271:118;;:::o;18395:157::-;18500:45;18520:24;18538:5;18520:24;:::i;:::-;18500:45;:::i;:::-;18495:3;18488:58;18395:157;;:::o;18558:360::-;18644:3;18672:38;18704:5;18672:38;:::i;:::-;18726:70;18789:6;18784:3;18726:70;:::i;:::-;18719:77;;18805:52;18850:6;18845:3;18838:4;18831:5;18827:16;18805:52;:::i;:::-;18882:29;18904:6;18882:29;:::i;:::-;18877:3;18873:39;18866:46;;18648:270;18558:360;;;;:::o;18924:169::-;19030:56;19080:5;19030:56;:::i;:::-;19025:3;19018:69;18924:169;;:::o;19099:364::-;19187:3;19215:39;19248:5;19215:39;:::i;:::-;19270:71;19334:6;19329:3;19270:71;:::i;:::-;19263:78;;19350:52;19395:6;19390:3;19383:4;19376:5;19372:16;19350:52;:::i;:::-;19427:29;19449:6;19427:29;:::i;:::-;19422:3;19418:39;19411:46;;19191:272;19099:364;;;;:::o;19469:377::-;19575:3;19603:39;19636:5;19603:39;:::i;:::-;19658:89;19740:6;19735:3;19658:89;:::i;:::-;19651:96;;19756:52;19801:6;19796:3;19789:4;19782:5;19778:16;19756:52;:::i;:::-;19833:6;19828:3;19824:16;19817:23;;19579:267;19469:377;;;;:::o;19876:845::-;19979:3;20016:5;20010:12;20045:36;20071:9;20045:36;:::i;:::-;20097:89;20179:6;20174:3;20097:89;:::i;:::-;20090:96;;20217:1;20206:9;20202:17;20233:1;20228:137;;;;20379:1;20374:341;;;;20195:520;;20228:137;20312:4;20308:9;20297;20293:25;20288:3;20281:38;20348:6;20343:3;20339:16;20332:23;;20228:137;;20374:341;20441:38;20473:5;20441:38;:::i;:::-;20501:1;20515:154;20529:6;20526:1;20523:13;20515:154;;;20603:7;20597:14;20593:1;20588:3;20584:11;20577:35;20653:1;20644:7;20640:15;20629:26;;20551:4;20548:1;20544:12;20539:17;;20515:154;;;20698:6;20693:3;20689:16;20682:23;;20381:334;;20195:520;;19983:738;;19876:845;;;;:::o;20727:366::-;20869:3;20890:67;20954:2;20949:3;20890:67;:::i;:::-;20883:74;;20966:93;21055:3;20966:93;:::i;:::-;21084:2;21079:3;21075:12;21068:19;;20727:366;;;:::o;21099:::-;21241:3;21262:67;21326:2;21321:3;21262:67;:::i;:::-;21255:74;;21338:93;21427:3;21338:93;:::i;:::-;21456:2;21451:3;21447:12;21440:19;;21099:366;;;:::o;21471:::-;21613:3;21634:67;21698:2;21693:3;21634:67;:::i;:::-;21627:74;;21710:93;21799:3;21710:93;:::i;:::-;21828:2;21823:3;21819:12;21812:19;;21471:366;;;:::o;21843:::-;21985:3;22006:67;22070:2;22065:3;22006:67;:::i;:::-;21999:74;;22082:93;22171:3;22082:93;:::i;:::-;22200:2;22195:3;22191:12;22184:19;;21843:366;;;:::o;22215:::-;22357:3;22378:67;22442:2;22437:3;22378:67;:::i;:::-;22371:74;;22454:93;22543:3;22454:93;:::i;:::-;22572:2;22567:3;22563:12;22556:19;;22215:366;;;:::o;22587:::-;22729:3;22750:67;22814:2;22809:3;22750:67;:::i;:::-;22743:74;;22826:93;22915:3;22826:93;:::i;:::-;22944:2;22939:3;22935:12;22928:19;;22587:366;;;:::o;22959:::-;23101:3;23122:67;23186:2;23181:3;23122:67;:::i;:::-;23115:74;;23198:93;23287:3;23198:93;:::i;:::-;23316:2;23311:3;23307:12;23300:19;;22959:366;;;:::o;23331:400::-;23491:3;23512:84;23594:1;23589:3;23512:84;:::i;:::-;23505:91;;23605:93;23694:3;23605:93;:::i;:::-;23723:1;23718:3;23714:11;23707:18;;23331:400;;;:::o;23737:366::-;23879:3;23900:67;23964:2;23959:3;23900:67;:::i;:::-;23893:74;;23976:93;24065:3;23976:93;:::i;:::-;24094:2;24089:3;24085:12;24078:19;;23737:366;;;:::o;24109:::-;24251:3;24272:67;24336:2;24331:3;24272:67;:::i;:::-;24265:74;;24348:93;24437:3;24348:93;:::i;:::-;24466:2;24461:3;24457:12;24450:19;;24109:366;;;:::o;24481:::-;24623:3;24644:67;24708:2;24703:3;24644:67;:::i;:::-;24637:74;;24720:93;24809:3;24720:93;:::i;:::-;24838:2;24833:3;24829:12;24822:19;;24481:366;;;:::o;24853:::-;24995:3;25016:67;25080:2;25075:3;25016:67;:::i;:::-;25009:74;;25092:93;25181:3;25092:93;:::i;:::-;25210:2;25205:3;25201:12;25194:19;;24853:366;;;:::o;25225:::-;25367:3;25388:67;25452:2;25447:3;25388:67;:::i;:::-;25381:74;;25464:93;25553:3;25464:93;:::i;:::-;25582:2;25577:3;25573:12;25566:19;;25225:366;;;:::o;25597:::-;25739:3;25760:67;25824:2;25819:3;25760:67;:::i;:::-;25753:74;;25836:93;25925:3;25836:93;:::i;:::-;25954:2;25949:3;25945:12;25938:19;;25597:366;;;:::o;25969:::-;26111:3;26132:67;26196:2;26191:3;26132:67;:::i;:::-;26125:74;;26208:93;26297:3;26208:93;:::i;:::-;26326:2;26321:3;26317:12;26310:19;;25969:366;;;:::o;26341:::-;26483:3;26504:67;26568:2;26563:3;26504:67;:::i;:::-;26497:74;;26580:93;26669:3;26580:93;:::i;:::-;26698:2;26693:3;26689:12;26682:19;;26341:366;;;:::o;26713:::-;26855:3;26876:67;26940:2;26935:3;26876:67;:::i;:::-;26869:74;;26952:93;27041:3;26952:93;:::i;:::-;27070:2;27065:3;27061:12;27054:19;;26713:366;;;:::o;27085:::-;27227:3;27248:67;27312:2;27307:3;27248:67;:::i;:::-;27241:74;;27324:93;27413:3;27324:93;:::i;:::-;27442:2;27437:3;27433:12;27426:19;;27085:366;;;:::o;27457:::-;27599:3;27620:67;27684:2;27679:3;27620:67;:::i;:::-;27613:74;;27696:93;27785:3;27696:93;:::i;:::-;27814:2;27809:3;27805:12;27798:19;;27457:366;;;:::o;27829:::-;27971:3;27992:67;28056:2;28051:3;27992:67;:::i;:::-;27985:74;;28068:93;28157:3;28068:93;:::i;:::-;28186:2;28181:3;28177:12;28170:19;;27829:366;;;:::o;28201:::-;28343:3;28364:67;28428:2;28423:3;28364:67;:::i;:::-;28357:74;;28440:93;28529:3;28440:93;:::i;:::-;28558:2;28553:3;28549:12;28542:19;;28201:366;;;:::o;28573:::-;28715:3;28736:67;28800:2;28795:3;28736:67;:::i;:::-;28729:74;;28812:93;28901:3;28812:93;:::i;:::-;28930:2;28925:3;28921:12;28914:19;;28573:366;;;:::o;28945:::-;29087:3;29108:67;29172:2;29167:3;29108:67;:::i;:::-;29101:74;;29184:93;29273:3;29184:93;:::i;:::-;29302:2;29297:3;29293:12;29286:19;;28945:366;;;:::o;29317:::-;29459:3;29480:67;29544:2;29539:3;29480:67;:::i;:::-;29473:74;;29556:93;29645:3;29556:93;:::i;:::-;29674:2;29669:3;29665:12;29658:19;;29317:366;;;:::o;29689:400::-;29849:3;29870:84;29952:1;29947:3;29870:84;:::i;:::-;29863:91;;29963:93;30052:3;29963:93;:::i;:::-;30081:1;30076:3;30072:11;30065:18;;29689:400;;;:::o;30095:366::-;30237:3;30258:67;30322:2;30317:3;30258:67;:::i;:::-;30251:74;;30334:93;30423:3;30334:93;:::i;:::-;30452:2;30447:3;30443:12;30436:19;;30095:366;;;:::o;30467:::-;30609:3;30630:67;30694:2;30689:3;30630:67;:::i;:::-;30623:74;;30706:93;30795:3;30706:93;:::i;:::-;30824:2;30819:3;30815:12;30808:19;;30467:366;;;:::o;30839:::-;30981:3;31002:67;31066:2;31061:3;31002:67;:::i;:::-;30995:74;;31078:93;31167:3;31078:93;:::i;:::-;31196:2;31191:3;31187:12;31180:19;;30839:366;;;:::o;31211:::-;31353:3;31374:67;31438:2;31433:3;31374:67;:::i;:::-;31367:74;;31450:93;31539:3;31450:93;:::i;:::-;31568:2;31563:3;31559:12;31552:19;;31211:366;;;:::o;31583:::-;31725:3;31746:67;31810:2;31805:3;31746:67;:::i;:::-;31739:74;;31822:93;31911:3;31822:93;:::i;:::-;31940:2;31935:3;31931:12;31924:19;;31583:366;;;:::o;31955:::-;32097:3;32118:67;32182:2;32177:3;32118:67;:::i;:::-;32111:74;;32194:93;32283:3;32194:93;:::i;:::-;32312:2;32307:3;32303:12;32296:19;;31955:366;;;:::o;32327:108::-;32404:24;32422:5;32404:24;:::i;:::-;32399:3;32392:37;32327:108;;:::o;32441:118::-;32528:24;32546:5;32528:24;:::i;:::-;32523:3;32516:37;32441:118;;:::o;32565:112::-;32648:22;32664:5;32648:22;:::i;:::-;32643:3;32636:35;32565:112;;:::o;32683:695::-;32961:3;32983:92;33071:3;33062:6;32983:92;:::i;:::-;32976:99;;33092:95;33183:3;33174:6;33092:95;:::i;:::-;33085:102;;33204:148;33348:3;33204:148;:::i;:::-;33197:155;;33369:3;33362:10;;32683:695;;;;;:::o;33384:663::-;33625:3;33647:148;33791:3;33647:148;:::i;:::-;33640:155;;33805:75;33876:3;33867:6;33805:75;:::i;:::-;33905:2;33900:3;33896:12;33889:19;;33918:75;33989:3;33980:6;33918:75;:::i;:::-;34018:2;34013:3;34009:12;34002:19;;34038:3;34031:10;;33384:663;;;;;:::o;34053:222::-;34146:4;34184:2;34173:9;34169:18;34161:26;;34197:71;34265:1;34254:9;34250:17;34241:6;34197:71;:::i;:::-;34053:222;;;;:::o;34281:1053::-;34604:4;34642:3;34631:9;34627:19;34619:27;;34656:71;34724:1;34713:9;34709:17;34700:6;34656:71;:::i;:::-;34737:72;34805:2;34794:9;34790:18;34781:6;34737:72;:::i;:::-;34856:9;34850:4;34846:20;34841:2;34830:9;34826:18;34819:48;34884:108;34987:4;34978:6;34884:108;:::i;:::-;34876:116;;35039:9;35033:4;35029:20;35024:2;35013:9;35009:18;35002:48;35067:108;35170:4;35161:6;35067:108;:::i;:::-;35059:116;;35223:9;35217:4;35213:20;35207:3;35196:9;35192:19;35185:49;35251:76;35322:4;35313:6;35251:76;:::i;:::-;35243:84;;34281:1053;;;;;;;;:::o;35340:751::-;35563:4;35601:3;35590:9;35586:19;35578:27;;35615:71;35683:1;35672:9;35668:17;35659:6;35615:71;:::i;:::-;35696:72;35764:2;35753:9;35749:18;35740:6;35696:72;:::i;:::-;35778;35846:2;35835:9;35831:18;35822:6;35778:72;:::i;:::-;35860;35928:2;35917:9;35913:18;35904:6;35860:72;:::i;:::-;35980:9;35974:4;35970:20;35964:3;35953:9;35949:19;35942:49;36008:76;36079:4;36070:6;36008:76;:::i;:::-;36000:84;;35340:751;;;;;;;;:::o;36097:332::-;36218:4;36256:2;36245:9;36241:18;36233:26;;36269:71;36337:1;36326:9;36322:17;36313:6;36269:71;:::i;:::-;36350:72;36418:2;36407:9;36403:18;36394:6;36350:72;:::i;:::-;36097:332;;;;;:::o;36435:373::-;36578:4;36616:2;36605:9;36601:18;36593:26;;36665:9;36659:4;36655:20;36651:1;36640:9;36636:17;36629:47;36693:108;36796:4;36787:6;36693:108;:::i;:::-;36685:116;;36435:373;;;;:::o;36814:634::-;37035:4;37073:2;37062:9;37058:18;37050:26;;37122:9;37116:4;37112:20;37108:1;37097:9;37093:17;37086:47;37150:108;37253:4;37244:6;37150:108;:::i;:::-;37142:116;;37305:9;37299:4;37295:20;37290:2;37279:9;37275:18;37268:48;37333:108;37436:4;37427:6;37333:108;:::i;:::-;37325:116;;36814:634;;;;;:::o;37454:210::-;37541:4;37579:2;37568:9;37564:18;37556:26;;37592:65;37654:1;37643:9;37639:17;37630:6;37592:65;:::i;:::-;37454:210;;;;:::o;37670:664::-;37875:4;37913:3;37902:9;37898:19;37890:27;;37927:71;37995:1;37984:9;37980:17;37971:6;37927:71;:::i;:::-;38008:72;38076:2;38065:9;38061:18;38052:6;38008:72;:::i;:::-;38090;38158:2;38147:9;38143:18;38134:6;38090:72;:::i;:::-;38172;38240:2;38229:9;38225:18;38216:6;38172:72;:::i;:::-;38254:73;38322:3;38311:9;38307:19;38298:6;38254:73;:::i;:::-;37670:664;;;;;;;;:::o;38340:924::-;38620:4;38658:3;38647:9;38643:19;38635:27;;38672:71;38740:1;38729:9;38725:17;38716:6;38672:71;:::i;:::-;38753:72;38821:2;38810:9;38806:18;38797:6;38753:72;:::i;:::-;38835;38903:2;38892:9;38888:18;38879:6;38835:72;:::i;:::-;38917;38985:2;38974:9;38970:18;38961:6;38917:72;:::i;:::-;38999:92;39086:3;39075:9;39071:19;39062:6;38999:92;:::i;:::-;39101:73;39169:3;39158:9;39154:19;39145:6;39101:73;:::i;:::-;39184;39252:3;39241:9;39237:19;39228:6;39184:73;:::i;:::-;38340:924;;;;;;;;;;:::o;39270:545::-;39443:4;39481:3;39470:9;39466:19;39458:27;;39495:71;39563:1;39552:9;39548:17;39539:6;39495:71;:::i;:::-;39576:68;39640:2;39629:9;39625:18;39616:6;39576:68;:::i;:::-;39654:72;39722:2;39711:9;39707:18;39698:6;39654:72;:::i;:::-;39736;39804:2;39793:9;39789:18;39780:6;39736:72;:::i;:::-;39270:545;;;;;;;:::o;39821:313::-;39934:4;39972:2;39961:9;39957:18;39949:26;;40021:9;40015:4;40011:20;40007:1;39996:9;39992:17;39985:47;40049:78;40122:4;40113:6;40049:78;:::i;:::-;40041:86;;39821:313;;;;:::o;40140:419::-;40306:4;40344:2;40333:9;40329:18;40321:26;;40393:9;40387:4;40383:20;40379:1;40368:9;40364:17;40357:47;40421:131;40547:4;40421:131;:::i;:::-;40413:139;;40140:419;;;:::o;40565:::-;40731:4;40769:2;40758:9;40754:18;40746:26;;40818:9;40812:4;40808:20;40804:1;40793:9;40789:17;40782:47;40846:131;40972:4;40846:131;:::i;:::-;40838:139;;40565:419;;;:::o;40990:::-;41156:4;41194:2;41183:9;41179:18;41171:26;;41243:9;41237:4;41233:20;41229:1;41218:9;41214:17;41207:47;41271:131;41397:4;41271:131;:::i;:::-;41263:139;;40990:419;;;:::o;41415:::-;41581:4;41619:2;41608:9;41604:18;41596:26;;41668:9;41662:4;41658:20;41654:1;41643:9;41639:17;41632:47;41696:131;41822:4;41696:131;:::i;:::-;41688:139;;41415:419;;;:::o;41840:::-;42006:4;42044:2;42033:9;42029:18;42021:26;;42093:9;42087:4;42083:20;42079:1;42068:9;42064:17;42057:47;42121:131;42247:4;42121:131;:::i;:::-;42113:139;;41840:419;;;:::o;42265:::-;42431:4;42469:2;42458:9;42454:18;42446:26;;42518:9;42512:4;42508:20;42504:1;42493:9;42489:17;42482:47;42546:131;42672:4;42546:131;:::i;:::-;42538:139;;42265:419;;;:::o;42690:::-;42856:4;42894:2;42883:9;42879:18;42871:26;;42943:9;42937:4;42933:20;42929:1;42918:9;42914:17;42907:47;42971:131;43097:4;42971:131;:::i;:::-;42963:139;;42690:419;;;:::o;43115:::-;43281:4;43319:2;43308:9;43304:18;43296:26;;43368:9;43362:4;43358:20;43354:1;43343:9;43339:17;43332:47;43396:131;43522:4;43396:131;:::i;:::-;43388:139;;43115:419;;;:::o;43540:::-;43706:4;43744:2;43733:9;43729:18;43721:26;;43793:9;43787:4;43783:20;43779:1;43768:9;43764:17;43757:47;43821:131;43947:4;43821:131;:::i;:::-;43813:139;;43540:419;;;:::o;43965:::-;44131:4;44169:2;44158:9;44154:18;44146:26;;44218:9;44212:4;44208:20;44204:1;44193:9;44189:17;44182:47;44246:131;44372:4;44246:131;:::i;:::-;44238:139;;43965:419;;;:::o;44390:::-;44556:4;44594:2;44583:9;44579:18;44571:26;;44643:9;44637:4;44633:20;44629:1;44618:9;44614:17;44607:47;44671:131;44797:4;44671:131;:::i;:::-;44663:139;;44390:419;;;:::o;44815:::-;44981:4;45019:2;45008:9;45004:18;44996:26;;45068:9;45062:4;45058:20;45054:1;45043:9;45039:17;45032:47;45096:131;45222:4;45096:131;:::i;:::-;45088:139;;44815:419;;;:::o;45240:::-;45406:4;45444:2;45433:9;45429:18;45421:26;;45493:9;45487:4;45483:20;45479:1;45468:9;45464:17;45457:47;45521:131;45647:4;45521:131;:::i;:::-;45513:139;;45240:419;;;:::o;45665:::-;45831:4;45869:2;45858:9;45854:18;45846:26;;45918:9;45912:4;45908:20;45904:1;45893:9;45889:17;45882:47;45946:131;46072:4;45946:131;:::i;:::-;45938:139;;45665:419;;;:::o;46090:::-;46256:4;46294:2;46283:9;46279:18;46271:26;;46343:9;46337:4;46333:20;46329:1;46318:9;46314:17;46307:47;46371:131;46497:4;46371:131;:::i;:::-;46363:139;;46090:419;;;:::o;46515:::-;46681:4;46719:2;46708:9;46704:18;46696:26;;46768:9;46762:4;46758:20;46754:1;46743:9;46739:17;46732:47;46796:131;46922:4;46796:131;:::i;:::-;46788:139;;46515:419;;;:::o;46940:::-;47106:4;47144:2;47133:9;47129:18;47121:26;;47193:9;47187:4;47183:20;47179:1;47168:9;47164:17;47157:47;47221:131;47347:4;47221:131;:::i;:::-;47213:139;;46940:419;;;:::o;47365:::-;47531:4;47569:2;47558:9;47554:18;47546:26;;47618:9;47612:4;47608:20;47604:1;47593:9;47589:17;47582:47;47646:131;47772:4;47646:131;:::i;:::-;47638:139;;47365:419;;;:::o;47790:::-;47956:4;47994:2;47983:9;47979:18;47971:26;;48043:9;48037:4;48033:20;48029:1;48018:9;48014:17;48007:47;48071:131;48197:4;48071:131;:::i;:::-;48063:139;;47790:419;;;:::o;48215:::-;48381:4;48419:2;48408:9;48404:18;48396:26;;48468:9;48462:4;48458:20;48454:1;48443:9;48439:17;48432:47;48496:131;48622:4;48496:131;:::i;:::-;48488:139;;48215:419;;;:::o;48640:::-;48806:4;48844:2;48833:9;48829:18;48821:26;;48893:9;48887:4;48883:20;48879:1;48868:9;48864:17;48857:47;48921:131;49047:4;48921:131;:::i;:::-;48913:139;;48640:419;;;:::o;49065:::-;49231:4;49269:2;49258:9;49254:18;49246:26;;49318:9;49312:4;49308:20;49304:1;49293:9;49289:17;49282:47;49346:131;49472:4;49346:131;:::i;:::-;49338:139;;49065:419;;;:::o;49490:::-;49656:4;49694:2;49683:9;49679:18;49671:26;;49743:9;49737:4;49733:20;49729:1;49718:9;49714:17;49707:47;49771:131;49897:4;49771:131;:::i;:::-;49763:139;;49490:419;;;:::o;49915:::-;50081:4;50119:2;50108:9;50104:18;50096:26;;50168:9;50162:4;50158:20;50154:1;50143:9;50139:17;50132:47;50196:131;50322:4;50196:131;:::i;:::-;50188:139;;49915:419;;;:::o;50340:::-;50506:4;50544:2;50533:9;50529:18;50521:26;;50593:9;50587:4;50583:20;50579:1;50568:9;50564:17;50557:47;50621:131;50747:4;50621:131;:::i;:::-;50613:139;;50340:419;;;:::o;50765:::-;50931:4;50969:2;50958:9;50954:18;50946:26;;51018:9;51012:4;51008:20;51004:1;50993:9;50989:17;50982:47;51046:131;51172:4;51046:131;:::i;:::-;51038:139;;50765:419;;;:::o;51190:::-;51356:4;51394:2;51383:9;51379:18;51371:26;;51443:9;51437:4;51433:20;51429:1;51418:9;51414:17;51407:47;51471:131;51597:4;51471:131;:::i;:::-;51463:139;;51190:419;;;:::o;51615:::-;51781:4;51819:2;51808:9;51804:18;51796:26;;51868:9;51862:4;51858:20;51854:1;51843:9;51839:17;51832:47;51896:131;52022:4;51896:131;:::i;:::-;51888:139;;51615:419;;;:::o;52040:::-;52206:4;52244:2;52233:9;52229:18;52221:26;;52293:9;52287:4;52283:20;52279:1;52268:9;52264:17;52257:47;52321:131;52447:4;52321:131;:::i;:::-;52313:139;;52040:419;;;:::o;52465:222::-;52558:4;52596:2;52585:9;52581:18;52573:26;;52609:71;52677:1;52666:9;52662:17;52653:6;52609:71;:::i;:::-;52465:222;;;;:::o;52693:332::-;52814:4;52852:2;52841:9;52837:18;52829:26;;52865:71;52933:1;52922:9;52918:17;52909:6;52865:71;:::i;:::-;52946:72;53014:2;53003:9;52999:18;52990:6;52946:72;:::i;:::-;52693:332;;;;;:::o;53031:690::-;53249:4;53287:3;53276:9;53272:19;53264:27;;53301:71;53369:1;53358:9;53354:17;53345:6;53301:71;:::i;:::-;53382:72;53450:2;53439:9;53435:18;53426:6;53382:72;:::i;:::-;53464;53532:2;53521:9;53517:18;53508:6;53464:72;:::i;:::-;53546:91;53633:2;53622:9;53618:18;53609:6;53546:91;:::i;:::-;53647:67;53709:3;53698:9;53694:19;53685:6;53647:67;:::i;:::-;53031:690;;;;;;;;:::o;53727:129::-;53761:6;53788:20;;:::i;:::-;53778:30;;53817:33;53845:4;53837:6;53817:33;:::i;:::-;53727:129;;;:::o;53862:75::-;53895:6;53928:2;53922:9;53912:19;;53862:75;:::o;53943:311::-;54020:4;54110:18;54102:6;54099:30;54096:56;;;54132:18;;:::i;:::-;54096:56;54182:4;54174:6;54170:17;54162:25;;54242:4;54236;54232:15;54224:23;;53943:311;;;:::o;54260:::-;54337:4;54427:18;54419:6;54416:30;54413:56;;;54449:18;;:::i;:::-;54413:56;54499:4;54491:6;54487:17;54479:25;;54559:4;54553;54549:15;54541:23;;54260:311;;;:::o;54577:307::-;54638:4;54728:18;54720:6;54717:30;54714:56;;;54750:18;;:::i;:::-;54714:56;54788:29;54810:6;54788:29;:::i;:::-;54780:37;;54872:4;54866;54862:15;54854:23;;54577:307;;;:::o;54890:308::-;54952:4;55042:18;55034:6;55031:30;55028:56;;;55064:18;;:::i;:::-;55028:56;55102:29;55124:6;55102:29;:::i;:::-;55094:37;;55186:4;55180;55176:15;55168:23;;54890:308;;;:::o;55204:132::-;55271:4;55294:3;55286:11;;55324:4;55319:3;55315:14;55307:22;;55204:132;;;:::o;55342:141::-;55391:4;55414:3;55406:11;;55437:3;55434:1;55427:14;55471:4;55468:1;55458:18;55450:26;;55342:141;;;:::o;55489:114::-;55556:6;55590:5;55584:12;55574:22;;55489:114;;;:::o;55609:98::-;55660:6;55694:5;55688:12;55678:22;;55609:98;;;:::o;55713:99::-;55765:6;55799:5;55793:12;55783:22;;55713:99;;;:::o;55818:113::-;55888:4;55920;55915:3;55911:14;55903:22;;55818:113;;;:::o;55937:184::-;56036:11;56070:6;56065:3;56058:19;56110:4;56105:3;56101:14;56086:29;;55937:184;;;;:::o;56127:168::-;56210:11;56244:6;56239:3;56232:19;56284:4;56279:3;56275:14;56260:29;;56127:168;;;;:::o;56301:169::-;56385:11;56419:6;56414:3;56407:19;56459:4;56454:3;56450:14;56435:29;;56301:169;;;;:::o;56476:148::-;56578:11;56615:3;56600:18;;56476:148;;;;:::o;56630:305::-;56670:3;56689:20;56707:1;56689:20;:::i;:::-;56684:25;;56723:20;56741:1;56723:20;:::i;:::-;56718:25;;56877:1;56809:66;56805:74;56802:1;56799:81;56796:107;;;56883:18;;:::i;:::-;56796:107;56927:1;56924;56920:9;56913:16;;56630:305;;;;:::o;56941:185::-;56981:1;56998:20;57016:1;56998:20;:::i;:::-;56993:25;;57032:20;57050:1;57032:20;:::i;:::-;57027:25;;57071:1;57061:35;;57076:18;;:::i;:::-;57061:35;57118:1;57115;57111:9;57106:14;;56941:185;;;;:::o;57132:348::-;57172:7;57195:20;57213:1;57195:20;:::i;:::-;57190:25;;57229:20;57247:1;57229:20;:::i;:::-;57224:25;;57417:1;57349:66;57345:74;57342:1;57339:81;57334:1;57327:9;57320:17;57316:105;57313:131;;;57424:18;;:::i;:::-;57313:131;57472:1;57469;57465:9;57454:20;;57132:348;;;;:::o;57486:191::-;57526:4;57546:20;57564:1;57546:20;:::i;:::-;57541:25;;57580:20;57598:1;57580:20;:::i;:::-;57575:25;;57619:1;57616;57613:8;57610:34;;;57624:18;;:::i;:::-;57610:34;57669:1;57666;57662:9;57654:17;;57486:191;;;;:::o;57683:96::-;57720:7;57749:24;57767:5;57749:24;:::i;:::-;57738:35;;57683:96;;;:::o;57785:90::-;57819:7;57862:5;57855:13;57848:21;57837:32;;57785:90;;;:::o;57881:77::-;57918:7;57947:5;57936:16;;57881:77;;;:::o;57964:149::-;58000:7;58040:66;58033:5;58029:78;58018:89;;57964:149;;;:::o;58119:153::-;58177:7;58206:5;58195:16;;58212:54;58260:5;58212:54;:::i;:::-;58119:153;;;:::o;58278:126::-;58315:7;58355:42;58348:5;58344:54;58333:65;;58278:126;;;:::o;58410:77::-;58447:7;58476:5;58465:16;;58410:77;;;:::o;58493:86::-;58528:7;58568:4;58561:5;58557:16;58546:27;;58493:86;;;:::o;58585:153::-;58654:9;58687:45;58726:5;58687:45;:::i;:::-;58674:58;;58585:153;;;:::o;58744:154::-;58828:6;58823:3;58818;58805:30;58890:1;58881:6;58876:3;58872:16;58865:27;58744:154;;;:::o;58904:307::-;58972:1;58982:113;58996:6;58993:1;58990:13;58982:113;;;59081:1;59076:3;59072:11;59066:18;59062:1;59057:3;59053:11;59046:39;59018:2;59015:1;59011:10;59006:15;;58982:113;;;59113:6;59110:1;59107:13;59104:101;;;59193:1;59184:6;59179:3;59175:16;59168:27;59104:101;58953:258;58904:307;;;:::o;59217:320::-;59261:6;59298:1;59292:4;59288:12;59278:22;;59345:1;59339:4;59335:12;59366:18;59356:81;;59422:4;59414:6;59410:17;59400:27;;59356:81;59484:2;59476:6;59473:14;59453:18;59450:38;59447:84;;;59503:18;;:::i;:::-;59447:84;59268:269;59217:320;;;:::o;59543:281::-;59626:27;59648:4;59626:27;:::i;:::-;59618:6;59614:40;59756:6;59744:10;59741:22;59720:18;59708:10;59705:34;59702:62;59699:88;;;59767:18;;:::i;:::-;59699:88;59807:10;59803:2;59796:22;59586:238;59543:281;;:::o;59830:233::-;59869:3;59892:24;59910:5;59892:24;:::i;:::-;59883:33;;59938:66;59931:5;59928:77;59925:103;;;60008:18;;:::i;:::-;59925:103;60055:1;60048:5;60044:13;60037:20;;59830:233;;;:::o;60069:79::-;60108:7;60137:5;60126:16;;60069:79;;;:::o;60154:176::-;60186:1;60203:20;60221:1;60203:20;:::i;:::-;60198:25;;60237:20;60255:1;60237:20;:::i;:::-;60232:25;;60276:1;60266:35;;60281:18;;:::i;:::-;60266:35;60322:1;60319;60315:9;60310:14;;60154:176;;;;:::o;60336:180::-;60384:77;60381:1;60374:88;60481:4;60478:1;60471:15;60505:4;60502:1;60495:15;60522:180;60570:77;60567:1;60560:88;60667:4;60664:1;60657:15;60691:4;60688:1;60681:15;60708:180;60756:77;60753:1;60746:88;60853:4;60850:1;60843:15;60877:4;60874:1;60867:15;60894:180;60942:77;60939:1;60932:88;61039:4;61036:1;61029:15;61063:4;61060:1;61053:15;61080:180;61128:77;61125:1;61118:88;61225:4;61222:1;61215:15;61249:4;61246:1;61239:15;61266:180;61314:77;61311:1;61304:88;61411:4;61408:1;61401:15;61435:4;61432:1;61425:15;61452:183;61487:3;61525:1;61507:16;61504:23;61501:128;;;61563:1;61560;61557;61542:23;61585:34;61616:1;61610:8;61585:34;:::i;:::-;61578:41;;61501:128;61452:183;:::o;61641:117::-;61750:1;61747;61740:12;61764:117;61873:1;61870;61863:12;61887:117;61996:1;61993;61986:12;62010:117;62119:1;62116;62109:12;62133:117;62242:1;62239;62232:12;62256:117;62365:1;62362;62355:12;62379:102;62420:6;62471:2;62467:7;62462:2;62455:5;62451:14;62447:28;62437:38;;62379:102;;;:::o;62487:106::-;62531:8;62580:5;62575:3;62571:15;62550:36;;62487:106;;;:::o;62599:174::-;62739:26;62735:1;62727:6;62723:14;62716:50;62599:174;:::o;62779:239::-;62919:34;62915:1;62907:6;62903:14;62896:58;62988:22;62983:2;62975:6;62971:15;62964:47;62779:239;:::o;63024:234::-;63164:34;63160:1;63152:6;63148:14;63141:58;63233:17;63228:2;63220:6;63216:15;63209:42;63024:234;:::o;63264:227::-;63404:34;63400:1;63392:6;63388:14;63381:58;63473:10;63468:2;63460:6;63456:15;63449:35;63264:227;:::o;63497:177::-;63637:29;63633:1;63625:6;63621:14;63614:53;63497:177;:::o;63680:181::-;63820:33;63816:1;63808:6;63804:14;63797:57;63680:181;:::o;63867:225::-;64007:34;64003:1;63995:6;63991:14;63984:58;64076:8;64071:2;64063:6;64059:15;64052:33;63867:225;:::o;64098:214::-;64238:66;64234:1;64226:6;64222:14;64215:90;64098:214;:::o;64318:229::-;64458:34;64454:1;64446:6;64442:14;64435:58;64527:12;64522:2;64514:6;64510:15;64503:37;64318:229;:::o;64553:231::-;64693:34;64689:1;64681:6;64677:14;64670:58;64762:14;64757:2;64749:6;64745:15;64738:39;64553:231;:::o;64790:176::-;64930:28;64926:1;64918:6;64914:14;64907:52;64790:176;:::o;64972:221::-;65112:34;65108:1;65100:6;65096:14;65089:58;65181:4;65176:2;65168:6;65164:15;65157:29;64972:221;:::o;65199:168::-;65339:20;65335:1;65327:6;65323:14;65316:44;65199:168;:::o;65373:176::-;65513:28;65509:1;65501:6;65497:14;65490:52;65373:176;:::o;65555:224::-;65695:34;65691:1;65683:6;65679:14;65672:58;65764:7;65759:2;65751:6;65747:15;65740:32;65555:224;:::o;65785:220::-;65925:34;65921:1;65913:6;65909:14;65902:58;65994:3;65989:2;65981:6;65977:15;65970:28;65785:220;:::o;66011:163::-;66151:15;66147:1;66139:6;66135:14;66128:39;66011:163;:::o;66180:221::-;66320:34;66316:1;66308:6;66304:14;66297:58;66389:4;66384:2;66376:6;66372:15;66365:29;66180:221;:::o;66407:168::-;66547:20;66543:1;66535:6;66531:14;66524:44;66407:168;:::o;66581:227::-;66721:34;66717:1;66709:6;66705:14;66698:58;66790:10;66785:2;66777:6;66773:15;66766:35;66581:227;:::o;66814:229::-;66954:34;66950:1;66942:6;66938:14;66931:58;67023:12;67018:2;67010:6;67006:15;66999:37;66814:229;:::o;67049:182::-;67189:34;67185:1;67177:6;67173:14;67166:58;67049:182;:::o;67237:170::-;67377:22;67373:1;67365:6;67361:14;67354:46;67237:170;:::o;67413:235::-;67553:34;67549:1;67541:6;67537:14;67530:58;67622:18;67617:2;67609:6;67605:15;67598:43;67413:235;:::o;67654:114::-;;:::o;67774:169::-;67914:21;67910:1;67902:6;67898:14;67891:45;67774:169;:::o;67949:224::-;68089:34;68085:1;68077:6;68073:14;68066:58;68158:7;68153:2;68145:6;68141:15;68134:32;67949:224;:::o;68179:228::-;68319:34;68315:1;68307:6;68303:14;68296:58;68388:11;68383:2;68375:6;68371:15;68364:36;68179:228;:::o;68413:::-;68553:34;68549:1;68541:6;68537:14;68530:58;68622:11;68617:2;68609:6;68605:15;68598:36;68413:228;:::o;68647:227::-;68787:34;68783:1;68775:6;68771:14;68764:58;68856:10;68851:2;68843:6;68839:15;68832:35;68647:227;:::o;68880:220::-;69020:34;69016:1;69008:6;69004:14;68997:58;69089:3;69084:2;69076:6;69072:15;69065:28;68880:220;:::o;69106:711::-;69145:3;69183:4;69165:16;69162:26;69159:39;;;69191:5;;69159:39;69220:20;;:::i;:::-;69295:1;69277:16;69273:24;69270:1;69264:4;69249:49;69328:4;69322:11;69427:16;69420:4;69412:6;69408:17;69405:39;69372:18;69364:6;69361:30;69345:113;69342:146;;;69473:5;;;;69342:146;69519:6;69513:4;69509:17;69555:3;69549:10;69582:18;69574:6;69571:30;69568:43;;;69604:5;;;;;;69568:43;69652:6;69645:4;69640:3;69636:14;69632:27;69711:1;69693:16;69689:24;69683:4;69679:35;69674:3;69671:44;69668:57;;;69718:5;;;;;;;69668:57;69735;69783:6;69777:4;69773:17;69765:6;69761:30;69755:4;69735:57;:::i;:::-;69808:3;69801:10;;69149:668;;;;;69106:711;;:::o;69823:126::-;69917:1;69910:5;69907:12;69897:46;;69923:18;;:::i;:::-;69897:46;69823:126;:::o;69955:122::-;70028:24;70046:5;70028:24;:::i;:::-;70021:5;70018:35;70008:63;;70067:1;70064;70057:12;70008:63;69955:122;:::o;70083:116::-;70153:21;70168:5;70153:21;:::i;:::-;70146:5;70143:32;70133:60;;70189:1;70186;70179:12;70133:60;70083:116;:::o;70205:120::-;70277:23;70294:5;70277:23;:::i;:::-;70270:5;70267:34;70257:62;;70315:1;70312;70305:12;70257:62;70205:120;:::o;70331:::-;70425:1;70418:5;70415:12;70405:40;;70441:1;70438;70431:12;70405:40;70331:120;:::o;70457:122::-;70530:24;70548:5;70530:24;:::i;:::-;70523:5;70520:35;70510:63;;70569:1;70566;70559:12;70510:63;70457:122;:::o

Swarm Source

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