ETH Price: $3,532.81 (+4.30%)
Gas: 7.33 Gwei

Token

WCA Strong Box (WCASB)
 

Overview

Max Total Supply

396 WCASB

Holders

67

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0x1590a7193d5b0a1abc56ceb9835d6920e635b128
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:
WCAStrongBox

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-26
*/

// 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.9.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/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/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/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// 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/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// 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/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.9.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 or 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 or 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: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(address account, uint256 id, uint256 value) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(address account, uint256[] memory ids, uint256[] memory values) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );

        _burnBatch(account, ids, values);
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155URIStorage.sol)

pragma solidity ^0.8.0;



/**
 * @dev ERC1155 token with storage based token URI management.
 * Inspired by the ERC721URIStorage extension
 *
 * _Available since v4.6._
 */
abstract contract ERC1155URIStorage is ERC1155 {
    using Strings for uint256;

    // Optional base URI
    string private _baseURI = "";

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the concatenation of the `_baseURI`
     * and the token-specific uri if the latter is set
     *
     * This enables the following behaviors:
     *
     * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation
     *   of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI`
     *   is empty per default);
     *
     * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()`
     *   which in most cases will contain `ERC1155._uri`;
     *
     * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a
     *   uri value set, then the result is empty.
     */
    function uri(uint256 tokenId) public view virtual override returns (string memory) {
        string memory tokenURI = _tokenURIs[tokenId];

        // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked).
        return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId);
    }

    /**
     * @dev Sets `tokenURI` as the tokenURI of `tokenId`.
     */
    function _setURI(uint256 tokenId, string memory tokenURI) internal virtual {
        _tokenURIs[tokenId] = tokenURI;
        emit URI(uri(tokenId), tokenId);
    }

    /**
     * @dev Sets `baseURI` as the `_baseURI` for all tokens
     */
    function _setBaseURI(string memory baseURI) internal virtual {
        _baseURI = baseURI;
    }
}

// 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: contracts/WCAStrongBox.sol


pragma solidity ^0.8.19;






abstract contract AbstractERC1155Factory is ERC1155Supply, ERC1155Burnable, Ownable {
	string name_;
	string symbol_;

	function setURI(string memory baseURI) external onlyOwner {
		_setURI(baseURI);
	}

	function name() public view returns (string memory) {
		return name_;
	}

	function symbol() public view returns (string memory) {
		return symbol_;
	}

	function _beforeTokenTransfer(
		address operator,
		address from,
		address to,
		uint256[] memory ids,
		uint256[] memory amounts,
		bytes memory data
	) internal virtual override(ERC1155, ERC1155Supply) {
		super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
	}
}

contract WCAStrongBox is AbstractERC1155Factory {
	using SafeERC20 for IERC20;

	error Unauthorized();
	error MintingNotEnabled();
	error NotEnoughTokensLeft();

	IERC20 public USDT;
	IWCAStrongBoxManager public WCAStrongBoxManager;

	mapping(uint256 => uint256) public tokenIdToRemainingTokens;
	mapping(uint256 => uint256) public tokenIdToPrice;

	bool public mintingEnabled = true;

	constructor(address _USDT, string memory uri) ERC1155(uri) {
		name_ = "WCA Strong Box";
		symbol_ = "WCASB";

		USDT = IERC20(_USDT);
		tokenIdToPrice[1] = 100e6;
		tokenIdToRemainingTokens[1] = 5000;
	}

	modifier canMint(uint256 tokenId) {
		if (!mintingEnabled) {
			revert MintingNotEnabled();
		}
		if (tokenIdToRemainingTokens[tokenId] == 0) {
			revert NotEnoughTokensLeft();
		}
		_;
	}

	function setManager(address _WCAStrongBoxManager) external onlyOwner {
		WCAStrongBoxManager = IWCAStrongBoxManager(_WCAStrongBoxManager);
	}

	function setBaseTokenURI(string calldata uri) external onlyOwner {
		_setURI(uri);
	}

	function setPrice(uint256 tokenId, uint256 _price) external onlyOwner {
		tokenIdToPrice[tokenId] = _price;
	}

	function setRemainingPacks(uint256 tokenId, uint256 amount) external onlyOwner {
		tokenIdToRemainingTokens[tokenId] = amount;
	}

	function toggleMintingEnabled() external onlyOwner {
		mintingEnabled = !mintingEnabled;
	}

	function mint(
		address account,
		uint256 tokenId,
		uint256 amount,
		address sponsor
	) external canMint(tokenId) {
		// Transfer USDT from user to contract
		USDT.safeTransferFrom(msg.sender, address(WCAStrongBoxManager), tokenIdToPrice[tokenId] * amount);

		// Mint a pack
		_mint(account, tokenId, amount, "");

		// Decrease the amount of packs left
		tokenIdToRemainingTokens[tokenId] -= amount;

		// Call the manager
		WCAStrongBoxManager.onPurchased(account, tokenId, tokenIdToPrice[tokenId], amount, sponsor);
	}
}

interface IWCAStrongBoxManager {
	function onPurchased(
		address account,
		uint256 tokenId,
		uint256 price,
		uint256 amount,
		address sponsor
	) external;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_USDT","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MintingNotEnabled","type":"error"},{"inputs":[],"name":"NotEnoughTokensLeft","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"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":[],"name":"USDT","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WCAStrongBoxManager","outputs":[{"internalType":"contract IWCAStrongBoxManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"sponsor","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_WCAStrongBoxManager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRemainingPacks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMintingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToRemainingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526001600b60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051620051dc380380620051dc83398181016040528101906200005291906200046f565b8062000064816200019460201b60201c565b506200008562000079620001a960201b60201c565b620001b160201b60201c565b6040518060400160405280600e81526020017f574341205374726f6e6720426f7800000000000000000000000000000000000081525060059081620000cb919062000720565b506040518060400160405280600581526020017f57434153420000000000000000000000000000000000000000000000000000008152506006908162000112919062000720565b5081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506305f5e100600a60006001815260200190815260200160002081905550611388600960006001815260200190815260200160002081905550505062000807565b8060029081620001a5919062000720565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620002b8826200028b565b9050919050565b620002ca81620002ab565b8114620002d657600080fd5b50565b600081519050620002ea81620002bf565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200034582620002fa565b810181811067ffffffffffffffff821117156200036757620003666200030b565b5b80604052505050565b60006200037c62000277565b90506200038a82826200033a565b919050565b600067ffffffffffffffff821115620003ad57620003ac6200030b565b5b620003b882620002fa565b9050602081019050919050565b60005b83811015620003e5578082015181840152602081019050620003c8565b60008484015250505050565b60006200040862000402846200038f565b62000370565b905082815260208101848484011115620004275762000426620002f5565b5b62000434848285620003c5565b509392505050565b600082601f830112620004545762000453620002f0565b5b815162000466848260208601620003f1565b91505092915050565b6000806040838503121562000489576200048862000281565b5b60006200049985828601620002d9565b925050602083015167ffffffffffffffff811115620004bd57620004bc62000286565b5b620004cb858286016200043c565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200052857607f821691505b6020821081036200053e576200053d620004e0565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005a87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000569565b620005b4868362000569565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000601620005fb620005f584620005cc565b620005d6565b620005cc565b9050919050565b6000819050919050565b6200061d83620005e0565b620006356200062c8262000608565b84845462000576565b825550505050565b600090565b6200064c6200063d565b6200065981848462000612565b505050565b5b8181101562000681576200067560008262000642565b6001810190506200065f565b5050565b601f821115620006d0576200069a8162000544565b620006a58462000559565b81016020851015620006b5578190505b620006cd620006c48562000559565b8301826200065e565b50505b505050565b600082821c905092915050565b6000620006f560001984600802620006d5565b1980831691505092915050565b6000620007108383620006e2565b9150826002028217905092915050565b6200072b82620004d5565b67ffffffffffffffff8111156200074757620007466200030b565b5b6200075382546200050f565b6200076082828562000685565b600060209050601f83116001811462000798576000841562000783578287015190505b6200078f858262000702565b865550620007ff565b601f198416620007a88662000544565b60005b82811015620007d257848901518255600182019150602085019450602081019050620007ab565b86831015620007f25784890151620007ee601f891682620006e2565b8355505b6001600288020188555050505b505050505050565b6149c580620008176000396000f3fe608060405234801561001057600080fd5b50600436106101ce5760003560e01c806395d89b4111610104578063e985e9c5116100a2578063f4812eb911610071578063f4812eb914610517578063f5298aca14610547578063f74bfe8e14610563578063f7d975771461057f576101ce565b8063e985e9c514610493578063e9c85501146104c3578063f242432a146104df578063f2fde38b146104fb576101ce565b8063ba93dece116100de578063ba93dece146103f9578063bd85b03914610429578063c54e44eb14610459578063d0ebdbe714610477576101ce565b806395d89b41146103a15780639fd6db12146103bf578063a22cb465146103dd576101ce565b80634e1273f4116101715780636b20c4541161014b5780636b20c4541461033f578063715018a61461035b5780638da5cb5b146103655780638f376f9914610383576101ce565b80634e1273f4146102d55780634f558e79146103055780635196e06014610335576101ce565b806306fdde03116101ad57806306fdde031461024f5780630e89341c1461026d5780632eb2c2d61461029d57806330176e13146102b9576101ce565b8062fdd58e146101d357806301ffc9a71461020357806302fe530514610233575b600080fd5b6101ed60048036038101906101e89190612b8a565b61059b565b6040516101fa9190612bd9565b60405180910390f35b61021d60048036038101906102189190612c4c565b610663565b60405161022a9190612c94565b60405180910390f35b61024d60048036038101906102489190612df5565b610745565b005b610257610759565b6040516102649190612ebd565b60405180910390f35b61028760048036038101906102829190612edf565b6107eb565b6040516102949190612ebd565b60405180910390f35b6102b760048036038101906102b29190613075565b61087f565b005b6102d360048036038101906102ce919061319f565b610920565b005b6102ef60048036038101906102ea91906132af565b610979565b6040516102fc91906133e5565b60405180910390f35b61031f600480360381019061031a9190612edf565b610a92565b60405161032c9190612c94565b60405180910390f35b61033d610aa6565b005b61035960048036038101906103549190613407565b610ada565b005b610363610b77565b005b61036d610b8b565b60405161037a91906134a1565b60405180910390f35b61038b610bb5565b604051610398919061351b565b60405180910390f35b6103a9610bdb565b6040516103b69190612ebd565b60405180910390f35b6103c7610c6d565b6040516103d49190612c94565b60405180910390f35b6103f760048036038101906103f29190613562565b610c80565b005b610413600480360381019061040e9190612edf565b610c96565b6040516104209190612bd9565b60405180910390f35b610443600480360381019061043e9190612edf565b610cae565b6040516104509190612bd9565b60405180910390f35b610461610ccb565b60405161046e91906135c3565b60405180910390f35b610491600480360381019061048c91906135de565b610cf1565b005b6104ad60048036038101906104a8919061360b565b610d3d565b6040516104ba9190612c94565b60405180910390f35b6104dd60048036038101906104d8919061364b565b610dd1565b005b6104f960048036038101906104f4919061368b565b610df5565b005b610515600480360381019061051091906135de565b610e96565b005b610531600480360381019061052c9190612edf565b610f19565b60405161053e9190612bd9565b60405180910390f35b610561600480360381019061055c9190613722565b610f31565b005b61057d60048036038101906105789190613775565b610fce565b005b6105996004803603810190610594919061364b565b6111e5565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361060b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106029061384e565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072e57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073e575061073d82611209565b5b9050919050565b61074d611273565b610756816112f1565b50565b6060600580546107689061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546107949061389d565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b6060600280546107fa9061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546108269061389d565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b50505050509050919050565b610887611304565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806108cd57506108cc856108c7611304565b610d3d565b5b61090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390613940565b60405180910390fd5b610919858585858561130c565b5050505050565b610928611273565b61097582828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506112f1565b5050565b606081518351146109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b6906139d2565b60405180910390fd5b6000835167ffffffffffffffff8111156109dc576109db612cca565b5b604051908082528060200260200182016040528015610a0a5781602001602082028036833780820191505090505b50905060005b8451811015610a8757610a57858281518110610a2f57610a2e6139f2565b5b6020026020010151858381518110610a4a57610a496139f2565b5b602002602001015161059b565b828281518110610a6a57610a696139f2565b5b60200260200101818152505080610a8090613a50565b9050610a10565b508091505092915050565b600080610a9e83610cae565b119050919050565b610aae611273565b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b610ae2611304565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610b285750610b2783610b22611304565b610d3d565b5b610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90613940565b60405180910390fd5b610b7283838361162d565b505050565b610b7f611273565b610b8960006118fb565b565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054610bea9061389d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c169061389d565b8015610c635780601f10610c3857610100808354040283529160200191610c63565b820191906000526020600020905b815481529060010190602001808311610c4657829003601f168201915b5050505050905090565b600b60009054906101000a900460ff1681565b610c92610c8b611304565b83836119c1565b5050565b60096020528060005260406000206000915090505481565b600060036000838152602001908152602001600020549050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cf9611273565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd9611273565b8060096000848152602001908152602001600020819055505050565b610dfd611304565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610e435750610e4285610e3d611304565b610d3d565b5b610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990613940565b60405180910390fd5b610e8f8585858585611b2d565b5050505050565b610e9e611273565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613b0a565b60405180910390fd5b610f16816118fb565b50565b600a6020528060005260406000206000915090505481565b610f39611304565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610f7f5750610f7e83610f79611304565b610d3d565b5b610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590613940565b60405180910390fd5b610fc9838383611dc8565b505050565b82600b60009054906101000a900460ff16611015576040517f3990ac6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600960008381526020019081526020016000205403611062576040517f76592c6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110f133600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600a6000898152602001908152602001600020546110a89190613b2a565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661200e909392919063ffffffff16565b61110c85858560405180602001604052806000815250612097565b8260096000868152602001908152602001600020600082825461112f9190613b6c565b92505081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c49462998686600a60008981526020019081526020016000205487876040518663ffffffff1660e01b81526004016111ac959493929190613ba0565b600060405180830381600087803b1580156111c657600080fd5b505af11580156111da573d6000803e3d6000fd5b505050505050505050565b6111ed611273565b80600a6000848152602001908152602001600020819055505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61127b611304565b73ffffffffffffffffffffffffffffffffffffffff16611299610b8b565b73ffffffffffffffffffffffffffffffffffffffff16146112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e690613c3f565b60405180910390fd5b565b80600290816113009190613e01565b5050565b600033905090565b8151835114611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613f45565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036113bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b690613fd7565b60405180910390fd5b60006113c9611304565b90506113d9818787878787612247565b60005b845181101561158a5760008582815181106113fa576113f96139f2565b5b602002602001015190506000858381518110611419576114186139f2565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190614069565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461156f9190614089565b925050819055505050508061158390613a50565b90506113dc565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516116019291906140bd565b60405180910390a461161781878787878761225d565b611625818787878787612265565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169390614166565b60405180910390fd5b80518251146116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790613f45565b60405180910390fd5b60006116ea611304565b905061170a81856000868660405180602001604052806000815250612247565b60005b835181101561185757600084828151811061172b5761172a6139f2565b5b60200260200101519050600084838151811061174a576117496139f2565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e2906141f8565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061184f90613a50565b91505061170d565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516118cf9291906140bd565b60405180910390a46118f58185600086866040518060200160405280600081525061225d565b50505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a269061428a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b209190612c94565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390613fd7565b60405180910390fd5b6000611ba6611304565b90506000611bb38561243c565b90506000611bc08561243c565b9050611bd0838989858589612247565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90614069565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1c9190614089565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611d999291906142aa565b60405180910390a4611daf848a8a86868a61225d565b611dbd848a8a8a8a8a6124b6565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90614166565b60405180910390fd5b6000611e41611304565b90506000611e4e8461243c565b90506000611e5b8461243c565b9050611e7b83876000858560405180602001604052806000815250612247565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f09906141f8565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611fdf9291906142aa565b60405180910390a46120058488600086866040518060200160405280600081525061225d565b50505050505050565b612091846323b872dd60e01b85858560405160240161202f939291906142d3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061268d565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd9061437c565b60405180910390fd5b6000612110611304565b9050600061211d8561243c565b9050600061212a8561243c565b905061213b83600089858589612247565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461219a9190614089565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516122189291906142aa565b60405180910390a461222f8360008985858961225d565b61223e836000898989896124b6565b50505050505050565b612255868686868686612754565b505050505050565b505050505050565b6122848473ffffffffffffffffffffffffffffffffffffffff16612924565b15612434578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016122ca9594939291906143f1565b6020604051808303816000875af192505050801561230657506040513d601f19601f82011682018060405250810190612303919061446e565b60015b6123ab576123126144a8565b806308c379a00361236e57506123266144ca565b806123315750612370565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123659190612ebd565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a2906145cc565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061465e565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561245b5761245a612cca565b5b6040519080825280602002602001820160405280156124895781602001602082028036833780820191505090505b50905082816000815181106124a1576124a06139f2565b5b60200260200101818152505080915050919050565b6124d58473ffffffffffffffffffffffffffffffffffffffff16612924565b15612685578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161251b95949392919061467e565b6020604051808303816000875af192505050801561255757506040513d601f19601f82011682018060405250810190612554919061446e565b60015b6125fc576125636144a8565b806308c379a0036125bf57506125776144ca565b8061258257506125c1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b69190612ebd565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f3906145cc565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267a9061465e565b60405180910390fd5b505b505050505050565b60006126ef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166129479092919063ffffffff16565b905060008151111561274f578080602001905181019061270f91906146ed565b61274e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127459061478c565b60405180910390fd5b5b505050565b61276286868686868661295f565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128135760005b8351811015612811578281815181106127b5576127b46139f2565b5b6020026020010151600360008684815181106127d4576127d36139f2565b5b6020026020010151815260200190815260200160002060008282546127f99190614089565b925050819055508061280a90613a50565b9050612799565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361291c5760005b835181101561291a576000848281518110612868576128676139f2565b5b602002602001015190506000848381518110612887576128866139f2565b5b60200260200101519050600060036000848152602001908152602001600020549050818110156128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e39061481e565b60405180910390fd5b81810360036000858152602001908152602001600020819055505050508061291390613a50565b905061284a565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606129568484600085612967565b90509392505050565b505050505050565b6060824710156129ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a3906148b0565b60405180910390fd5b6129b585612924565b6129f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129eb9061491c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612a1d9190614978565b60006040518083038185875af1925050503d8060008114612a5a576040519150601f19603f3d011682016040523d82523d6000602084013e612a5f565b606091505b5091509150612a6f828286612a7b565b92505050949350505050565b60608315612a8b57829050612adb565b600083511115612a9e5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad29190612ebd565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b2182612af6565b9050919050565b612b3181612b16565b8114612b3c57600080fd5b50565b600081359050612b4e81612b28565b92915050565b6000819050919050565b612b6781612b54565b8114612b7257600080fd5b50565b600081359050612b8481612b5e565b92915050565b60008060408385031215612ba157612ba0612aec565b5b6000612baf85828601612b3f565b9250506020612bc085828601612b75565b9150509250929050565b612bd381612b54565b82525050565b6000602082019050612bee6000830184612bca565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c2981612bf4565b8114612c3457600080fd5b50565b600081359050612c4681612c20565b92915050565b600060208284031215612c6257612c61612aec565b5b6000612c7084828501612c37565b91505092915050565b60008115159050919050565b612c8e81612c79565b82525050565b6000602082019050612ca96000830184612c85565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d0282612cb9565b810181811067ffffffffffffffff82111715612d2157612d20612cca565b5b80604052505050565b6000612d34612ae2565b9050612d408282612cf9565b919050565b600067ffffffffffffffff821115612d6057612d5f612cca565b5b612d6982612cb9565b9050602081019050919050565b82818337600083830152505050565b6000612d98612d9384612d45565b612d2a565b905082815260208101848484011115612db457612db3612cb4565b5b612dbf848285612d76565b509392505050565b600082601f830112612ddc57612ddb612caf565b5b8135612dec848260208601612d85565b91505092915050565b600060208284031215612e0b57612e0a612aec565b5b600082013567ffffffffffffffff811115612e2957612e28612af1565b5b612e3584828501612dc7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e78578082015181840152602081019050612e5d565b60008484015250505050565b6000612e8f82612e3e565b612e998185612e49565b9350612ea9818560208601612e5a565b612eb281612cb9565b840191505092915050565b60006020820190508181036000830152612ed78184612e84565b905092915050565b600060208284031215612ef557612ef4612aec565b5b6000612f0384828501612b75565b91505092915050565b600067ffffffffffffffff821115612f2757612f26612cca565b5b602082029050602081019050919050565b600080fd5b6000612f50612f4b84612f0c565b612d2a565b90508083825260208201905060208402830185811115612f7357612f72612f38565b5b835b81811015612f9c5780612f888882612b75565b845260208401935050602081019050612f75565b5050509392505050565b600082601f830112612fbb57612fba612caf565b5b8135612fcb848260208601612f3d565b91505092915050565b600067ffffffffffffffff821115612fef57612fee612cca565b5b612ff882612cb9565b9050602081019050919050565b600061301861301384612fd4565b612d2a565b90508281526020810184848401111561303457613033612cb4565b5b61303f848285612d76565b509392505050565b600082601f83011261305c5761305b612caf565b5b813561306c848260208601613005565b91505092915050565b600080600080600060a0868803121561309157613090612aec565b5b600061309f88828901612b3f565b95505060206130b088828901612b3f565b945050604086013567ffffffffffffffff8111156130d1576130d0612af1565b5b6130dd88828901612fa6565b935050606086013567ffffffffffffffff8111156130fe576130fd612af1565b5b61310a88828901612fa6565b925050608086013567ffffffffffffffff81111561312b5761312a612af1565b5b61313788828901613047565b9150509295509295909350565b600080fd5b60008083601f84011261315f5761315e612caf565b5b8235905067ffffffffffffffff81111561317c5761317b613144565b5b60208301915083600182028301111561319857613197612f38565b5b9250929050565b600080602083850312156131b6576131b5612aec565b5b600083013567ffffffffffffffff8111156131d4576131d3612af1565b5b6131e085828601613149565b92509250509250929050565b600067ffffffffffffffff82111561320757613206612cca565b5b602082029050602081019050919050565b600061322b613226846131ec565b612d2a565b9050808382526020820190506020840283018581111561324e5761324d612f38565b5b835b8181101561327757806132638882612b3f565b845260208401935050602081019050613250565b5050509392505050565b600082601f83011261329657613295612caf565b5b81356132a6848260208601613218565b91505092915050565b600080604083850312156132c6576132c5612aec565b5b600083013567ffffffffffffffff8111156132e4576132e3612af1565b5b6132f085828601613281565b925050602083013567ffffffffffffffff81111561331157613310612af1565b5b61331d85828601612fa6565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61335c81612b54565b82525050565b600061336e8383613353565b60208301905092915050565b6000602082019050919050565b600061339282613327565b61339c8185613332565b93506133a783613343565b8060005b838110156133d85781516133bf8882613362565b97506133ca8361337a565b9250506001810190506133ab565b5085935050505092915050565b600060208201905081810360008301526133ff8184613387565b905092915050565b6000806000606084860312156134205761341f612aec565b5b600061342e86828701612b3f565b935050602084013567ffffffffffffffff81111561344f5761344e612af1565b5b61345b86828701612fa6565b925050604084013567ffffffffffffffff81111561347c5761347b612af1565b5b61348886828701612fa6565b9150509250925092565b61349b81612b16565b82525050565b60006020820190506134b66000830184613492565b92915050565b6000819050919050565b60006134e16134dc6134d784612af6565b6134bc565b612af6565b9050919050565b60006134f3826134c6565b9050919050565b6000613505826134e8565b9050919050565b613515816134fa565b82525050565b6000602082019050613530600083018461350c565b92915050565b61353f81612c79565b811461354a57600080fd5b50565b60008135905061355c81613536565b92915050565b6000806040838503121561357957613578612aec565b5b600061358785828601612b3f565b92505060206135988582860161354d565b9150509250929050565b60006135ad826134e8565b9050919050565b6135bd816135a2565b82525050565b60006020820190506135d860008301846135b4565b92915050565b6000602082840312156135f4576135f3612aec565b5b600061360284828501612b3f565b91505092915050565b6000806040838503121561362257613621612aec565b5b600061363085828601612b3f565b925050602061364185828601612b3f565b9150509250929050565b6000806040838503121561366257613661612aec565b5b600061367085828601612b75565b925050602061368185828601612b75565b9150509250929050565b600080600080600060a086880312156136a7576136a6612aec565b5b60006136b588828901612b3f565b95505060206136c688828901612b3f565b94505060406136d788828901612b75565b93505060606136e888828901612b75565b925050608086013567ffffffffffffffff81111561370957613708612af1565b5b61371588828901613047565b9150509295509295909350565b60008060006060848603121561373b5761373a612aec565b5b600061374986828701612b3f565b935050602061375a86828701612b75565b925050604061376b86828701612b75565b9150509250925092565b6000806000806080858703121561378f5761378e612aec565b5b600061379d87828801612b3f565b94505060206137ae87828801612b75565b93505060406137bf87828801612b75565b92505060606137d087828801612b3f565b91505092959194509250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613838602a83612e49565b9150613843826137dc565b604082019050919050565b600060208201905081810360008301526138678161382b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138b557607f821691505b6020821081036138c8576138c761386e565b5b50919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b600061392a602e83612e49565b9150613935826138ce565b604082019050919050565b600060208201905081810360008301526139598161391d565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006139bc602983612e49565b91506139c782613960565b604082019050919050565b600060208201905081810360008301526139eb816139af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a5b82612b54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a8d57613a8c613a21565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613af4602683612e49565b9150613aff82613a98565b604082019050919050565b60006020820190508181036000830152613b2381613ae7565b9050919050565b6000613b3582612b54565b9150613b4083612b54565b9250828202613b4e81612b54565b91508282048414831517613b6557613b64613a21565b5b5092915050565b6000613b7782612b54565b9150613b8283612b54565b9250828203905081811115613b9a57613b99613a21565b5b92915050565b600060a082019050613bb56000830188613492565b613bc26020830187612bca565b613bcf6040830186612bca565b613bdc6060830185612bca565b613be96080830184613492565b9695505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c29602083612e49565b9150613c3482613bf3565b602082019050919050565b60006020820190508181036000830152613c5881613c1c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613cc17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613c84565b613ccb8683613c84565b95508019841693508086168417925050509392505050565b6000613cfe613cf9613cf484612b54565b6134bc565b612b54565b9050919050565b6000819050919050565b613d1883613ce3565b613d2c613d2482613d05565b848454613c91565b825550505050565b600090565b613d41613d34565b613d4c818484613d0f565b505050565b5b81811015613d7057613d65600082613d39565b600181019050613d52565b5050565b601f821115613db557613d8681613c5f565b613d8f84613c74565b81016020851015613d9e578190505b613db2613daa85613c74565b830182613d51565b50505b505050565b600082821c905092915050565b6000613dd860001984600802613dba565b1980831691505092915050565b6000613df18383613dc7565b9150826002028217905092915050565b613e0a82612e3e565b67ffffffffffffffff811115613e2357613e22612cca565b5b613e2d825461389d565b613e38828285613d74565b600060209050601f831160018114613e6b5760008415613e59578287015190505b613e638582613de5565b865550613ecb565b601f198416613e7986613c5f565b60005b82811015613ea157848901518255600182019150602085019450602081019050613e7c565b86831015613ebe5784890151613eba601f891682613dc7565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613f2f602883612e49565b9150613f3a82613ed3565b604082019050919050565b60006020820190508181036000830152613f5e81613f22565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613fc1602583612e49565b9150613fcc82613f65565b604082019050919050565b60006020820190508181036000830152613ff081613fb4565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614053602a83612e49565b915061405e82613ff7565b604082019050919050565b6000602082019050818103600083015261408281614046565b9050919050565b600061409482612b54565b915061409f83612b54565b92508282019050808211156140b7576140b6613a21565b5b92915050565b600060408201905081810360008301526140d78185613387565b905081810360208301526140eb8184613387565b90509392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614150602383612e49565b915061415b826140f4565b604082019050919050565b6000602082019050818103600083015261417f81614143565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006141e2602483612e49565b91506141ed82614186565b604082019050919050565b60006020820190508181036000830152614211816141d5565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614274602983612e49565b915061427f82614218565b604082019050919050565b600060208201905081810360008301526142a381614267565b9050919050565b60006040820190506142bf6000830185612bca565b6142cc6020830184612bca565b9392505050565b60006060820190506142e86000830186613492565b6142f56020830185613492565b6143026040830184612bca565b949350505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614366602183612e49565b91506143718261430a565b604082019050919050565b6000602082019050818103600083015261439581614359565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006143c38261439c565b6143cd81856143a7565b93506143dd818560208601612e5a565b6143e681612cb9565b840191505092915050565b600060a0820190506144066000830188613492565b6144136020830187613492565b81810360408301526144258186613387565b905081810360608301526144398185613387565b9050818103608083015261444d81846143b8565b90509695505050505050565b60008151905061446881612c20565b92915050565b60006020828403121561448457614483612aec565b5b600061449284828501614459565b91505092915050565b60008160e01c9050919050565b600060033d11156144c75760046000803e6144c460005161449b565b90505b90565b600060443d10614557576144dc612ae2565b60043d036004823e80513d602482011167ffffffffffffffff82111715614504575050614557565b808201805167ffffffffffffffff8111156145225750505050614557565b80602083010160043d03850181111561453f575050505050614557565b61454e82602001850186612cf9565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006145b6603483612e49565b91506145c18261455a565b604082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000614648602883612e49565b9150614653826145ec565b604082019050919050565b600060208201905081810360008301526146778161463b565b9050919050565b600060a0820190506146936000830188613492565b6146a06020830187613492565b6146ad6040830186612bca565b6146ba6060830185612bca565b81810360808301526146cc81846143b8565b90509695505050505050565b6000815190506146e781613536565b92915050565b60006020828403121561470357614702612aec565b5b6000614711848285016146d8565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614776602a83612e49565b91506147818261471a565b604082019050919050565b600060208201905081810360008301526147a581614769565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614808602883612e49565b9150614813826147ac565b604082019050919050565b60006020820190508181036000830152614837816147fb565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061489a602683612e49565b91506148a58261483e565b604082019050919050565b600060208201905081810360008301526148c98161488d565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614906601d83612e49565b9150614911826148d0565b602082019050919050565b60006020820190508181036000830152614935816148f9565b9050919050565b600081905092915050565b60006149528261439c565b61495c818561493c565b935061496c818560208601612e5a565b80840191505092915050565b60006149848284614947565b91508190509291505056fea264697066735822122090bcb63b0545abc032b353065912da2c2071bd2291ea28788fe0643312f9734864736f6c63430008130033000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000042697066733a2f2f6261666b72656964777273666577346d616a7463613673366c3575746a6f627279726b6f6e346c626e646373676666326c35626776667935336469000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101ce5760003560e01c806395d89b4111610104578063e985e9c5116100a2578063f4812eb911610071578063f4812eb914610517578063f5298aca14610547578063f74bfe8e14610563578063f7d975771461057f576101ce565b8063e985e9c514610493578063e9c85501146104c3578063f242432a146104df578063f2fde38b146104fb576101ce565b8063ba93dece116100de578063ba93dece146103f9578063bd85b03914610429578063c54e44eb14610459578063d0ebdbe714610477576101ce565b806395d89b41146103a15780639fd6db12146103bf578063a22cb465146103dd576101ce565b80634e1273f4116101715780636b20c4541161014b5780636b20c4541461033f578063715018a61461035b5780638da5cb5b146103655780638f376f9914610383576101ce565b80634e1273f4146102d55780634f558e79146103055780635196e06014610335576101ce565b806306fdde03116101ad57806306fdde031461024f5780630e89341c1461026d5780632eb2c2d61461029d57806330176e13146102b9576101ce565b8062fdd58e146101d357806301ffc9a71461020357806302fe530514610233575b600080fd5b6101ed60048036038101906101e89190612b8a565b61059b565b6040516101fa9190612bd9565b60405180910390f35b61021d60048036038101906102189190612c4c565b610663565b60405161022a9190612c94565b60405180910390f35b61024d60048036038101906102489190612df5565b610745565b005b610257610759565b6040516102649190612ebd565b60405180910390f35b61028760048036038101906102829190612edf565b6107eb565b6040516102949190612ebd565b60405180910390f35b6102b760048036038101906102b29190613075565b61087f565b005b6102d360048036038101906102ce919061319f565b610920565b005b6102ef60048036038101906102ea91906132af565b610979565b6040516102fc91906133e5565b60405180910390f35b61031f600480360381019061031a9190612edf565b610a92565b60405161032c9190612c94565b60405180910390f35b61033d610aa6565b005b61035960048036038101906103549190613407565b610ada565b005b610363610b77565b005b61036d610b8b565b60405161037a91906134a1565b60405180910390f35b61038b610bb5565b604051610398919061351b565b60405180910390f35b6103a9610bdb565b6040516103b69190612ebd565b60405180910390f35b6103c7610c6d565b6040516103d49190612c94565b60405180910390f35b6103f760048036038101906103f29190613562565b610c80565b005b610413600480360381019061040e9190612edf565b610c96565b6040516104209190612bd9565b60405180910390f35b610443600480360381019061043e9190612edf565b610cae565b6040516104509190612bd9565b60405180910390f35b610461610ccb565b60405161046e91906135c3565b60405180910390f35b610491600480360381019061048c91906135de565b610cf1565b005b6104ad60048036038101906104a8919061360b565b610d3d565b6040516104ba9190612c94565b60405180910390f35b6104dd60048036038101906104d8919061364b565b610dd1565b005b6104f960048036038101906104f4919061368b565b610df5565b005b610515600480360381019061051091906135de565b610e96565b005b610531600480360381019061052c9190612edf565b610f19565b60405161053e9190612bd9565b60405180910390f35b610561600480360381019061055c9190613722565b610f31565b005b61057d60048036038101906105789190613775565b610fce565b005b6105996004803603810190610594919061364b565b6111e5565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361060b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106029061384e565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072e57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061073e575061073d82611209565b5b9050919050565b61074d611273565b610756816112f1565b50565b6060600580546107689061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546107949061389d565b80156107e15780601f106107b6576101008083540402835291602001916107e1565b820191906000526020600020905b8154815290600101906020018083116107c457829003601f168201915b5050505050905090565b6060600280546107fa9061389d565b80601f01602080910402602001604051908101604052809291908181526020018280546108269061389d565b80156108735780601f1061084857610100808354040283529160200191610873565b820191906000526020600020905b81548152906001019060200180831161085657829003601f168201915b50505050509050919050565b610887611304565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806108cd57506108cc856108c7611304565b610d3d565b5b61090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390613940565b60405180910390fd5b610919858585858561130c565b5050505050565b610928611273565b61097582828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506112f1565b5050565b606081518351146109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b6906139d2565b60405180910390fd5b6000835167ffffffffffffffff8111156109dc576109db612cca565b5b604051908082528060200260200182016040528015610a0a5781602001602082028036833780820191505090505b50905060005b8451811015610a8757610a57858281518110610a2f57610a2e6139f2565b5b6020026020010151858381518110610a4a57610a496139f2565b5b602002602001015161059b565b828281518110610a6a57610a696139f2565b5b60200260200101818152505080610a8090613a50565b9050610a10565b508091505092915050565b600080610a9e83610cae565b119050919050565b610aae611273565b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b610ae2611304565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610b285750610b2783610b22611304565b610d3d565b5b610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e90613940565b60405180910390fd5b610b7283838361162d565b505050565b610b7f611273565b610b8960006118fb565b565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060068054610bea9061389d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c169061389d565b8015610c635780601f10610c3857610100808354040283529160200191610c63565b820191906000526020600020905b815481529060010190602001808311610c4657829003601f168201915b5050505050905090565b600b60009054906101000a900460ff1681565b610c92610c8b611304565b83836119c1565b5050565b60096020528060005260406000206000915090505481565b600060036000838152602001908152602001600020549050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cf9611273565b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610dd9611273565b8060096000848152602001908152602001600020819055505050565b610dfd611304565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610e435750610e4285610e3d611304565b610d3d565b5b610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990613940565b60405180910390fd5b610e8f8585858585611b2d565b5050505050565b610e9e611273565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490613b0a565b60405180910390fd5b610f16816118fb565b50565b600a6020528060005260406000206000915090505481565b610f39611304565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610f7f5750610f7e83610f79611304565b610d3d565b5b610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590613940565b60405180910390fd5b610fc9838383611dc8565b505050565b82600b60009054906101000a900460ff16611015576040517f3990ac6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600960008381526020019081526020016000205403611062576040517f76592c6f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110f133600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600a6000898152602001908152602001600020546110a89190613b2a565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661200e909392919063ffffffff16565b61110c85858560405180602001604052806000815250612097565b8260096000868152602001908152602001600020600082825461112f9190613b6c565b92505081905550600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c49462998686600a60008981526020019081526020016000205487876040518663ffffffff1660e01b81526004016111ac959493929190613ba0565b600060405180830381600087803b1580156111c657600080fd5b505af11580156111da573d6000803e3d6000fd5b505050505050505050565b6111ed611273565b80600a6000848152602001908152602001600020819055505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61127b611304565b73ffffffffffffffffffffffffffffffffffffffff16611299610b8b565b73ffffffffffffffffffffffffffffffffffffffff16146112ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e690613c3f565b60405180910390fd5b565b80600290816113009190613e01565b5050565b600033905090565b8151835114611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790613f45565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036113bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b690613fd7565b60405180910390fd5b60006113c9611304565b90506113d9818787878787612247565b60005b845181101561158a5760008582815181106113fa576113f96139f2565b5b602002602001015190506000858381518110611419576114186139f2565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b190614069565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461156f9190614089565b925050819055505050508061158390613a50565b90506113dc565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516116019291906140bd565b60405180910390a461161781878787878761225d565b611625818787878787612265565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361169c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169390614166565b60405180910390fd5b80518251146116e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d790613f45565b60405180910390fd5b60006116ea611304565b905061170a81856000868660405180602001604052806000815250612247565b60005b835181101561185757600084828151811061172b5761172a6139f2565b5b60200260200101519050600084838151811061174a576117496139f2565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156117eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e2906141f8565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061184f90613a50565b91505061170d565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516118cf9291906140bd565b60405180910390a46118f58185600086866040518060200160405280600081525061225d565b50505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a269061428a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b209190612c94565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390613fd7565b60405180910390fd5b6000611ba6611304565b90506000611bb38561243c565b90506000611bc08561243c565b9050611bd0838989858589612247565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90614069565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1c9190614089565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051611d999291906142aa565b60405180910390a4611daf848a8a86868a61225d565b611dbd848a8a8a8a8a6124b6565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e90614166565b60405180910390fd5b6000611e41611304565b90506000611e4e8461243c565b90506000611e5b8461243c565b9050611e7b83876000858560405180602001604052806000815250612247565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f09906141f8565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611fdf9291906142aa565b60405180910390a46120058488600086866040518060200160405280600081525061225d565b50505050505050565b612091846323b872dd60e01b85858560405160240161202f939291906142d3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061268d565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd9061437c565b60405180910390fd5b6000612110611304565b9050600061211d8561243c565b9050600061212a8561243c565b905061213b83600089858589612247565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461219a9190614089565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516122189291906142aa565b60405180910390a461222f8360008985858961225d565b61223e836000898989896124b6565b50505050505050565b612255868686868686612754565b505050505050565b505050505050565b6122848473ffffffffffffffffffffffffffffffffffffffff16612924565b15612434578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016122ca9594939291906143f1565b6020604051808303816000875af192505050801561230657506040513d601f19601f82011682018060405250810190612303919061446e565b60015b6123ab576123126144a8565b806308c379a00361236e57506123266144ca565b806123315750612370565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123659190612ebd565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a2906145cc565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124299061465e565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561245b5761245a612cca565b5b6040519080825280602002602001820160405280156124895781602001602082028036833780820191505090505b50905082816000815181106124a1576124a06139f2565b5b60200260200101818152505080915050919050565b6124d58473ffffffffffffffffffffffffffffffffffffffff16612924565b15612685578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161251b95949392919061467e565b6020604051808303816000875af192505050801561255757506040513d601f19601f82011682018060405250810190612554919061446e565b60015b6125fc576125636144a8565b806308c379a0036125bf57506125776144ca565b8061258257506125c1565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b69190612ebd565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f3906145cc565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267a9061465e565b60405180910390fd5b505b505050505050565b60006126ef826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166129479092919063ffffffff16565b905060008151111561274f578080602001905181019061270f91906146ed565b61274e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127459061478c565b60405180910390fd5b5b505050565b61276286868686868661295f565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128135760005b8351811015612811578281815181106127b5576127b46139f2565b5b6020026020010151600360008684815181106127d4576127d36139f2565b5b6020026020010151815260200190815260200160002060008282546127f99190614089565b925050819055508061280a90613a50565b9050612799565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361291c5760005b835181101561291a576000848281518110612868576128676139f2565b5b602002602001015190506000848381518110612887576128866139f2565b5b60200260200101519050600060036000848152602001908152602001600020549050818110156128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e39061481e565b60405180910390fd5b81810360036000858152602001908152602001600020819055505050508061291390613a50565b905061284a565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606129568484600085612967565b90509392505050565b505050505050565b6060824710156129ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a3906148b0565b60405180910390fd5b6129b585612924565b6129f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129eb9061491c565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612a1d9190614978565b60006040518083038185875af1925050503d8060008114612a5a576040519150601f19603f3d011682016040523d82523d6000602084013e612a5f565b606091505b5091509150612a6f828286612a7b565b92505050949350505050565b60608315612a8b57829050612adb565b600083511115612a9e5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad29190612ebd565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b2182612af6565b9050919050565b612b3181612b16565b8114612b3c57600080fd5b50565b600081359050612b4e81612b28565b92915050565b6000819050919050565b612b6781612b54565b8114612b7257600080fd5b50565b600081359050612b8481612b5e565b92915050565b60008060408385031215612ba157612ba0612aec565b5b6000612baf85828601612b3f565b9250506020612bc085828601612b75565b9150509250929050565b612bd381612b54565b82525050565b6000602082019050612bee6000830184612bca565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c2981612bf4565b8114612c3457600080fd5b50565b600081359050612c4681612c20565b92915050565b600060208284031215612c6257612c61612aec565b5b6000612c7084828501612c37565b91505092915050565b60008115159050919050565b612c8e81612c79565b82525050565b6000602082019050612ca96000830184612c85565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d0282612cb9565b810181811067ffffffffffffffff82111715612d2157612d20612cca565b5b80604052505050565b6000612d34612ae2565b9050612d408282612cf9565b919050565b600067ffffffffffffffff821115612d6057612d5f612cca565b5b612d6982612cb9565b9050602081019050919050565b82818337600083830152505050565b6000612d98612d9384612d45565b612d2a565b905082815260208101848484011115612db457612db3612cb4565b5b612dbf848285612d76565b509392505050565b600082601f830112612ddc57612ddb612caf565b5b8135612dec848260208601612d85565b91505092915050565b600060208284031215612e0b57612e0a612aec565b5b600082013567ffffffffffffffff811115612e2957612e28612af1565b5b612e3584828501612dc7565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e78578082015181840152602081019050612e5d565b60008484015250505050565b6000612e8f82612e3e565b612e998185612e49565b9350612ea9818560208601612e5a565b612eb281612cb9565b840191505092915050565b60006020820190508181036000830152612ed78184612e84565b905092915050565b600060208284031215612ef557612ef4612aec565b5b6000612f0384828501612b75565b91505092915050565b600067ffffffffffffffff821115612f2757612f26612cca565b5b602082029050602081019050919050565b600080fd5b6000612f50612f4b84612f0c565b612d2a565b90508083825260208201905060208402830185811115612f7357612f72612f38565b5b835b81811015612f9c5780612f888882612b75565b845260208401935050602081019050612f75565b5050509392505050565b600082601f830112612fbb57612fba612caf565b5b8135612fcb848260208601612f3d565b91505092915050565b600067ffffffffffffffff821115612fef57612fee612cca565b5b612ff882612cb9565b9050602081019050919050565b600061301861301384612fd4565b612d2a565b90508281526020810184848401111561303457613033612cb4565b5b61303f848285612d76565b509392505050565b600082601f83011261305c5761305b612caf565b5b813561306c848260208601613005565b91505092915050565b600080600080600060a0868803121561309157613090612aec565b5b600061309f88828901612b3f565b95505060206130b088828901612b3f565b945050604086013567ffffffffffffffff8111156130d1576130d0612af1565b5b6130dd88828901612fa6565b935050606086013567ffffffffffffffff8111156130fe576130fd612af1565b5b61310a88828901612fa6565b925050608086013567ffffffffffffffff81111561312b5761312a612af1565b5b61313788828901613047565b9150509295509295909350565b600080fd5b60008083601f84011261315f5761315e612caf565b5b8235905067ffffffffffffffff81111561317c5761317b613144565b5b60208301915083600182028301111561319857613197612f38565b5b9250929050565b600080602083850312156131b6576131b5612aec565b5b600083013567ffffffffffffffff8111156131d4576131d3612af1565b5b6131e085828601613149565b92509250509250929050565b600067ffffffffffffffff82111561320757613206612cca565b5b602082029050602081019050919050565b600061322b613226846131ec565b612d2a565b9050808382526020820190506020840283018581111561324e5761324d612f38565b5b835b8181101561327757806132638882612b3f565b845260208401935050602081019050613250565b5050509392505050565b600082601f83011261329657613295612caf565b5b81356132a6848260208601613218565b91505092915050565b600080604083850312156132c6576132c5612aec565b5b600083013567ffffffffffffffff8111156132e4576132e3612af1565b5b6132f085828601613281565b925050602083013567ffffffffffffffff81111561331157613310612af1565b5b61331d85828601612fa6565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61335c81612b54565b82525050565b600061336e8383613353565b60208301905092915050565b6000602082019050919050565b600061339282613327565b61339c8185613332565b93506133a783613343565b8060005b838110156133d85781516133bf8882613362565b97506133ca8361337a565b9250506001810190506133ab565b5085935050505092915050565b600060208201905081810360008301526133ff8184613387565b905092915050565b6000806000606084860312156134205761341f612aec565b5b600061342e86828701612b3f565b935050602084013567ffffffffffffffff81111561344f5761344e612af1565b5b61345b86828701612fa6565b925050604084013567ffffffffffffffff81111561347c5761347b612af1565b5b61348886828701612fa6565b9150509250925092565b61349b81612b16565b82525050565b60006020820190506134b66000830184613492565b92915050565b6000819050919050565b60006134e16134dc6134d784612af6565b6134bc565b612af6565b9050919050565b60006134f3826134c6565b9050919050565b6000613505826134e8565b9050919050565b613515816134fa565b82525050565b6000602082019050613530600083018461350c565b92915050565b61353f81612c79565b811461354a57600080fd5b50565b60008135905061355c81613536565b92915050565b6000806040838503121561357957613578612aec565b5b600061358785828601612b3f565b92505060206135988582860161354d565b9150509250929050565b60006135ad826134e8565b9050919050565b6135bd816135a2565b82525050565b60006020820190506135d860008301846135b4565b92915050565b6000602082840312156135f4576135f3612aec565b5b600061360284828501612b3f565b91505092915050565b6000806040838503121561362257613621612aec565b5b600061363085828601612b3f565b925050602061364185828601612b3f565b9150509250929050565b6000806040838503121561366257613661612aec565b5b600061367085828601612b75565b925050602061368185828601612b75565b9150509250929050565b600080600080600060a086880312156136a7576136a6612aec565b5b60006136b588828901612b3f565b95505060206136c688828901612b3f565b94505060406136d788828901612b75565b93505060606136e888828901612b75565b925050608086013567ffffffffffffffff81111561370957613708612af1565b5b61371588828901613047565b9150509295509295909350565b60008060006060848603121561373b5761373a612aec565b5b600061374986828701612b3f565b935050602061375a86828701612b75565b925050604061376b86828701612b75565b9150509250925092565b6000806000806080858703121561378f5761378e612aec565b5b600061379d87828801612b3f565b94505060206137ae87828801612b75565b93505060406137bf87828801612b75565b92505060606137d087828801612b3f565b91505092959194509250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613838602a83612e49565b9150613843826137dc565b604082019050919050565b600060208201905081810360008301526138678161382b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806138b557607f821691505b6020821081036138c8576138c761386e565b5b50919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b600061392a602e83612e49565b9150613935826138ce565b604082019050919050565b600060208201905081810360008301526139598161391d565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006139bc602983612e49565b91506139c782613960565b604082019050919050565b600060208201905081810360008301526139eb816139af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a5b82612b54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a8d57613a8c613a21565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613af4602683612e49565b9150613aff82613a98565b604082019050919050565b60006020820190508181036000830152613b2381613ae7565b9050919050565b6000613b3582612b54565b9150613b4083612b54565b9250828202613b4e81612b54565b91508282048414831517613b6557613b64613a21565b5b5092915050565b6000613b7782612b54565b9150613b8283612b54565b9250828203905081811115613b9a57613b99613a21565b5b92915050565b600060a082019050613bb56000830188613492565b613bc26020830187612bca565b613bcf6040830186612bca565b613bdc6060830185612bca565b613be96080830184613492565b9695505050505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613c29602083612e49565b9150613c3482613bf3565b602082019050919050565b60006020820190508181036000830152613c5881613c1c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613cc17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613c84565b613ccb8683613c84565b95508019841693508086168417925050509392505050565b6000613cfe613cf9613cf484612b54565b6134bc565b612b54565b9050919050565b6000819050919050565b613d1883613ce3565b613d2c613d2482613d05565b848454613c91565b825550505050565b600090565b613d41613d34565b613d4c818484613d0f565b505050565b5b81811015613d7057613d65600082613d39565b600181019050613d52565b5050565b601f821115613db557613d8681613c5f565b613d8f84613c74565b81016020851015613d9e578190505b613db2613daa85613c74565b830182613d51565b50505b505050565b600082821c905092915050565b6000613dd860001984600802613dba565b1980831691505092915050565b6000613df18383613dc7565b9150826002028217905092915050565b613e0a82612e3e565b67ffffffffffffffff811115613e2357613e22612cca565b5b613e2d825461389d565b613e38828285613d74565b600060209050601f831160018114613e6b5760008415613e59578287015190505b613e638582613de5565b865550613ecb565b601f198416613e7986613c5f565b60005b82811015613ea157848901518255600182019150602085019450602081019050613e7c565b86831015613ebe5784890151613eba601f891682613dc7565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613f2f602883612e49565b9150613f3a82613ed3565b604082019050919050565b60006020820190508181036000830152613f5e81613f22565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613fc1602583612e49565b9150613fcc82613f65565b604082019050919050565b60006020820190508181036000830152613ff081613fb4565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614053602a83612e49565b915061405e82613ff7565b604082019050919050565b6000602082019050818103600083015261408281614046565b9050919050565b600061409482612b54565b915061409f83612b54565b92508282019050808211156140b7576140b6613a21565b5b92915050565b600060408201905081810360008301526140d78185613387565b905081810360208301526140eb8184613387565b90509392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614150602383612e49565b915061415b826140f4565b604082019050919050565b6000602082019050818103600083015261417f81614143565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006141e2602483612e49565b91506141ed82614186565b604082019050919050565b60006020820190508181036000830152614211816141d5565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614274602983612e49565b915061427f82614218565b604082019050919050565b600060208201905081810360008301526142a381614267565b9050919050565b60006040820190506142bf6000830185612bca565b6142cc6020830184612bca565b9392505050565b60006060820190506142e86000830186613492565b6142f56020830185613492565b6143026040830184612bca565b949350505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614366602183612e49565b91506143718261430a565b604082019050919050565b6000602082019050818103600083015261439581614359565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006143c38261439c565b6143cd81856143a7565b93506143dd818560208601612e5a565b6143e681612cb9565b840191505092915050565b600060a0820190506144066000830188613492565b6144136020830187613492565b81810360408301526144258186613387565b905081810360608301526144398185613387565b9050818103608083015261444d81846143b8565b90509695505050505050565b60008151905061446881612c20565b92915050565b60006020828403121561448457614483612aec565b5b600061449284828501614459565b91505092915050565b60008160e01c9050919050565b600060033d11156144c75760046000803e6144c460005161449b565b90505b90565b600060443d10614557576144dc612ae2565b60043d036004823e80513d602482011167ffffffffffffffff82111715614504575050614557565b808201805167ffffffffffffffff8111156145225750505050614557565b80602083010160043d03850181111561453f575050505050614557565b61454e82602001850186612cf9565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006145b6603483612e49565b91506145c18261455a565b604082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000614648602883612e49565b9150614653826145ec565b604082019050919050565b600060208201905081810360008301526146778161463b565b9050919050565b600060a0820190506146936000830188613492565b6146a06020830187613492565b6146ad6040830186612bca565b6146ba6060830185612bca565b81810360808301526146cc81846143b8565b90509695505050505050565b6000815190506146e781613536565b92915050565b60006020828403121561470357614702612aec565b5b6000614711848285016146d8565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614776602a83612e49565b91506147818261471a565b604082019050919050565b600060208201905081810360008301526147a581614769565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b6000614808602883612e49565b9150614813826147ac565b604082019050919050565b60006020820190508181036000830152614837816147fb565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061489a602683612e49565b91506148a58261483e565b604082019050919050565b600060208201905081810360008301526148c98161488d565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614906601d83612e49565b9150614911826148d0565b602082019050919050565b60006020820190508181036000830152614935816148f9565b9050919050565b600081905092915050565b60006149528261439c565b61495c818561493c565b935061496c818560208601612e5a565b80840191505092915050565b60006149848284614947565b91508190509291505056fea264697066735822122090bcb63b0545abc032b353065912da2c2071bd2291ea28788fe0643312f9734864736f6c63430008130033

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

000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000042697066733a2f2f6261666b72656964777273666577346d616a7463613673366c3575746a6f627279726b6f6e346c626e646373676666326c35626776667935336469000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _USDT (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [1] : uri (string): ipfs://bafkreidwrsfew4majtca6s6l5utjobryrkon4lbndcsgff2l5bgvfy53di

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000042
Arg [3] : 697066733a2f2f6261666b72656964777273666577346d616a7463613673366c
Arg [4] : 3575746a6f627279726b6f6e346c626e646373676666326c3562677666793533
Arg [5] : 6469000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

57230:1956:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33115:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32138:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56683:84;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56772:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32859:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35033:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58197:87;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33511:499;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50498:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58542:93;;;:::i;:::-;;49216:324;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55663:103;;;:::i;:::-;;55015:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57422:47;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56851:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57593:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34083:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57475:59;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50287:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57400:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58049:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34310:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58406:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34550:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55921:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57538:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48916:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58640:543;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58289:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33115:230;33201:7;33248:1;33229:21;;:7;:21;;;33221:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33315:9;:13;33325:2;33315:13;;;;;;;;;;;:22;33329:7;33315:22;;;;;;;;;;;;;;;;33308:29;;33115:230;;;;:::o;32138:310::-;32240:4;32292:26;32277:41;;;:11;:41;;;;:110;;;;32350:37;32335:52;;;:11;:52;;;;32277:110;:163;;;;32404:36;32428:11;32404:23;:36::i;:::-;32277:163;32257:183;;32138:310;;;:::o;56683:84::-;54901:13;:11;:13::i;:::-;56746:16:::1;56754:7;56746;:16::i;:::-;56683:84:::0;:::o;56772:74::-;56809:13;56836:5;56829:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56772:74;:::o;32859:105::-;32919:13;32952:4;32945:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32859:105;;;:::o;35033:438::-;35274:12;:10;:12::i;:::-;35266:20;;:4;:20;;;:60;;;;35290:36;35307:4;35313:12;:10;:12::i;:::-;35290:16;:36::i;:::-;35266:60;35244:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;35411:52;35434:4;35440:2;35444:3;35449:7;35458:4;35411:22;:52::i;:::-;35033:438;;;;;:::o;58197:87::-;54901:13;:11;:13::i;:::-;58267:12:::1;58275:3;;58267:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:12::i;:::-;58197:87:::0;;:::o;33511:499::-;33647:16;33703:3;:10;33684:8;:15;:29;33676:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;33772:30;33819:8;:15;33805:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33772:63;;33853:9;33848:122;33872:8;:15;33868:1;:19;33848:122;;;33928:30;33938:8;33947:1;33938:11;;;;;;;;:::i;:::-;;;;;;;;33951:3;33955:1;33951:6;;;;;;;;:::i;:::-;;;;;;;;33928:9;:30::i;:::-;33909:13;33923:1;33909:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;33889:3;;;;:::i;:::-;;;33848:122;;;;33989:13;33982:20;;;33511:499;;;;:::o;50498:122::-;50555:4;50611:1;50579:29;50605:2;50579:25;:29::i;:::-;:33;50572:40;;50498:122;;;:::o;58542:93::-;54901:13;:11;:13::i;:::-;58616:14:::1;;;;;;;;;;;58615:15;58598:14;;:32;;;;;;;;;;;;;;;;;;58542:93::o:0;49216:324::-;49358:12;:10;:12::i;:::-;49347:23;;:7;:23;;;:66;;;;49374:39;49391:7;49400:12;:10;:12::i;:::-;49374:16;:39::i;:::-;49347:66;49325:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;49500:32;49511:7;49520:3;49525:6;49500:10;:32::i;:::-;49216:324;;;:::o;55663:103::-;54901:13;:11;:13::i;:::-;55728:30:::1;55755:1;55728:18;:30::i;:::-;55663:103::o:0;55015:87::-;55061:7;55088:6;;;;;;;;;;;55081:13;;55015:87;:::o;57422:47::-;;;;;;;;;;;;;:::o;56851:78::-;56890:13;56917:7;56910:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56851:78;:::o;57593:33::-;;;;;;;;;;;;;:::o;34083:155::-;34178:52;34197:12;:10;:12::i;:::-;34211:8;34221;34178:18;:52::i;:::-;34083:155;;:::o;57475:59::-;;;;;;;;;;;;;;;;;:::o;50287:113::-;50349:7;50376:12;:16;50389:2;50376:16;;;;;;;;;;;;50369:23;;50287:113;;;:::o;57400:18::-;;;;;;;;;;;;;:::o;58049:143::-;54901:13;:11;:13::i;:::-;58166:20:::1;58123:19;;:64;;;;;;;;;;;;;;;;;;58049:143:::0;:::o;34310:168::-;34409:4;34433:18;:27;34452:7;34433:27;;;;;;;;;;;;;;;:37;34461:8;34433:37;;;;;;;;;;;;;;;;;;;;;;;;;34426:44;;34310:168;;;;:::o;58406:131::-;54901:13;:11;:13::i;:::-;58526:6:::1;58490:24;:33;58515:7;58490:33;;;;;;;;;;;:42;;;;58406:131:::0;;:::o;34550:406::-;34766:12;:10;:12::i;:::-;34758:20;;:4;:20;;;:60;;;;34782:36;34799:4;34805:12;:10;:12::i;:::-;34782:16;:36::i;:::-;34758:60;34736:156;;;;;;;;;;;;:::i;:::-;;;;;;;;;34903:45;34921:4;34927:2;34931;34935:6;34943:4;34903:17;:45::i;:::-;34550:406;;;;;:::o;55921:201::-;54901:13;:11;:13::i;:::-;56030:1:::1;56010:22;;:8;:22;;::::0;56002:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;56086:28;56105:8;56086:18;:28::i;:::-;55921:201:::0;:::o;57538:49::-;;;;;;;;;;;;;;;;;:::o;48916:292::-;49033:12;:10;:12::i;:::-;49022:23;;:7;:23;;;:66;;;;49049:39;49066:7;49075:12;:10;:12::i;:::-;49049:16;:39::i;:::-;49022:66;49000:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;49175:25;49181:7;49190:2;49194:5;49175;:25::i;:::-;48916:292;;;:::o;58640:543::-;58754:7;57892:14;;;;;;;;;;;57887:59;;57921:19;;;;;;;;;;;;;;57887:59;57991:1;57954:24;:33;57979:7;57954:33;;;;;;;;;;;;:38;57950:84;;58007:21;;;;;;;;;;;;;;57950:84;58810:97:::1;58832:10;58852:19;;;;;;;;;;;58900:6;58874:14;:23;58889:7;58874:23;;;;;;;;;;;;:32;;;;:::i;:::-;58810:4;;;;;;;;;;;:21;;;;:97;;;;;;:::i;:::-;58932:35;58938:7;58947;58956:6;58932:35;;;;;;;;;;;::::0;:5:::1;:35::i;:::-;59051:6;59014:24;:33;59039:7;59014:33;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;59087:19;;;;;;;;;;;:31;;;59119:7;59128;59137:14;:23;59152:7;59137:23;;;;;;;;;;;;59162:6;59170:7;59087:91;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;58640:543:::0;;;;;:::o;58289:112::-;54901:13;:11;:13::i;:::-;58390:6:::1;58364:14;:23;58379:7;58364:23;;;;;;;;;;;:32;;;;58289:112:::0;;:::o;1782:157::-;1867:4;1906:25;1891:40;;;:11;:40;;;;1884:47;;1782:157;;;:::o;55180:132::-;55255:12;:10;:12::i;:::-;55244:23;;:7;:5;:7::i;:::-;:23;;;55236:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55180:132::o;39257:88::-;39331:6;39324:4;:13;;;;;;:::i;:::-;;39257:88;:::o;30832:98::-;30885:7;30912:10;30905:17;;30832:98;:::o;37267:1146::-;37494:7;:14;37480:3;:10;:28;37472:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37586:1;37572:16;;:2;:16;;;37564:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37643:16;37662:12;:10;:12::i;:::-;37643:31;;37687:60;37708:8;37718:4;37724:2;37728:3;37733:7;37742:4;37687:20;:60::i;:::-;37765:9;37760:421;37784:3;:10;37780:1;:14;37760:421;;;37816:10;37829:3;37833:1;37829:6;;;;;;;;:::i;:::-;;;;;;;;37816:19;;37850:14;37867:7;37875:1;37867:10;;;;;;;;:::i;:::-;;;;;;;;37850:27;;37894:19;37916:9;:13;37926:2;37916:13;;;;;;;;;;;:19;37930:4;37916:19;;;;;;;;;;;;;;;;37894:41;;37973:6;37958:11;:21;;37950:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;38106:6;38092:11;:20;38070:9;:13;38080:2;38070:13;;;;;;;;;;;:19;38084:4;38070:19;;;;;;;;;;;;;;;:42;;;;38163:6;38142:9;:13;38152:2;38142:13;;;;;;;;;;;:17;38156:2;38142:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;37801:380;;;37796:3;;;;:::i;:::-;;;37760:421;;;;38228:2;38198:47;;38222:4;38198:47;;38212:8;38198:47;;;38232:3;38237:7;38198:47;;;;;;;:::i;:::-;;;;;;;;38258:59;38278:8;38288:4;38294:2;38298:3;38303:7;38312:4;38258:19;:59::i;:::-;38330:75;38366:8;38376:4;38382:2;38386:3;38391:7;38400:4;38330:35;:75::i;:::-;37461:952;37267:1146;;;;;:::o;42955:935::-;43089:1;43073:18;;:4;:18;;;43065:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43164:7;:14;43150:3;:10;:28;43142:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43236:16;43255:12;:10;:12::i;:::-;43236:31;;43280:66;43301:8;43311:4;43325:1;43329:3;43334:7;43280:66;;;;;;;;;;;;:20;:66::i;:::-;43364:9;43359:373;43383:3;:10;43379:1;:14;43359:373;;;43415:10;43428:3;43432:1;43428:6;;;;;;;;:::i;:::-;;;;;;;;43415:19;;43449:14;43466:7;43474:1;43466:10;;;;;;;;:::i;:::-;;;;;;;;43449:27;;43493:19;43515:9;:13;43525:2;43515:13;;;;;;;;;;;:19;43529:4;43515:19;;;;;;;;;;;;;;;;43493:41;;43572:6;43557:11;:21;;43549:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;43699:6;43685:11;:20;43663:9;:13;43673:2;43663:13;;;;;;;;;;;:19;43677:4;43663:19;;;;;;;;;;;;;;;:42;;;;43400:332;;;43395:3;;;;;:::i;:::-;;;;43359:373;;;;43787:1;43749:55;;43773:4;43749:55;;43763:8;43749:55;;;43791:3;43796:7;43749:55;;;;;;;:::i;:::-;;;;;;;;43817:65;43837:8;43847:4;43861:1;43865:3;43870:7;43817:65;;;;;;;;;;;;:19;:65::i;:::-;43054:836;42955:935;;;:::o;56282:191::-;56356:16;56375:6;;;;;;;;;;;56356:25;;56401:8;56392:6;;:17;;;;;;;;;;;;;;;;;;56456:8;56425:40;;56446:8;56425:40;;;;;;;;;;;;56345:128;56282:191;:::o;44033:297::-;44154:8;44145:17;;:5;:17;;;44137:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44257:8;44219:18;:25;44238:5;44219:25;;;;;;;;;;;;;;;:35;44245:8;44219:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44303:8;44281:41;;44296:5;44281:41;;;44313:8;44281:41;;;;;;:::i;:::-;;;;;;;;44033:297;;;:::o;35935:974::-;36137:1;36123:16;;:2;:16;;;36115:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;36194:16;36213:12;:10;:12::i;:::-;36194:31;;36236:20;36259:21;36277:2;36259:17;:21::i;:::-;36236:44;;36291:24;36318:25;36336:6;36318:17;:25::i;:::-;36291:52;;36356:60;36377:8;36387:4;36393:2;36397:3;36402:7;36411:4;36356:20;:60::i;:::-;36429:19;36451:9;:13;36461:2;36451:13;;;;;;;;;;;:19;36465:4;36451:19;;;;;;;;;;;;;;;;36429:41;;36504:6;36489:11;:21;;36481:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;36629:6;36615:11;:20;36593:9;:13;36603:2;36593:13;;;;;;;;;;;:19;36607:4;36593:19;;;;;;;;;;;;;;;:42;;;;36678:6;36657:9;:13;36667:2;36657:13;;;;;;;;;;;:17;36671:2;36657:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;36733:2;36702:46;;36727:4;36702:46;;36717:8;36702:46;;;36737:2;36741:6;36702:46;;;;;;;:::i;:::-;;;;;;;;36761:59;36781:8;36791:4;36797:2;36801:3;36806:7;36815:4;36761:19;:59::i;:::-;36833:68;36864:8;36874:4;36880:2;36884;36888:6;36896:4;36833:30;:68::i;:::-;36104:805;;;;35935:974;;;;;:::o;41931:774::-;42040:1;42024:18;;:4;:18;;;42016:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42095:16;42114:12;:10;:12::i;:::-;42095:31;;42137:20;42160:21;42178:2;42160:17;:21::i;:::-;42137:44;;42192:24;42219:25;42237:6;42219:17;:25::i;:::-;42192:52;;42257:66;42278:8;42288:4;42302:1;42306:3;42311:7;42257:66;;;;;;;;;;;;:20;:66::i;:::-;42336:19;42358:9;:13;42368:2;42358:13;;;;;;;;;;;:19;42372:4;42358:19;;;;;;;;;;;;;;;;42336:41;;42411:6;42396:11;:21;;42388:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;42530:6;42516:11;:20;42494:9;:13;42504:2;42494:13;;;;;;;;;;;:19;42508:4;42494:19;;;;;;;;;;;;;;;:42;;;;42604:1;42565:54;;42590:4;42565:54;;42580:8;42565:54;;;42608:2;42612:6;42565:54;;;;;;;:::i;:::-;;;;;;;;42632:65;42652:8;42662:4;42676:1;42680:3;42685:7;42632:65;;;;;;;;;;;;:19;:65::i;:::-;42005:700;;;;41931:774;;;:::o;26582:248::-;26726:96;26746:5;26776:27;;;26805:4;26811:2;26815:5;26753:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26726:19;:96::i;:::-;26582:248;;;;:::o;39731:686::-;39855:1;39841:16;;:2;:16;;;39833:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;39908:16;39927:12;:10;:12::i;:::-;39908:31;;39950:20;39973:21;39991:2;39973:17;:21::i;:::-;39950:44;;40005:24;40032:25;40050:6;40032:17;:25::i;:::-;40005:52;;40070:66;40091:8;40109:1;40113:2;40117:3;40122:7;40131:4;40070:20;:66::i;:::-;40170:6;40149:9;:13;40159:2;40149:13;;;;;;;;;;;:17;40163:2;40149:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;40229:2;40192:52;;40225:1;40192:52;;40207:8;40192:52;;;40233:2;40237:6;40192:52;;;;;;;:::i;:::-;;;;;;;;40257:65;40277:8;40295:1;40299:2;40303:3;40308:7;40317:4;40257:19;:65::i;:::-;40335:74;40366:8;40384:1;40388:2;40392;40396:6;40404:4;40335:30;:74::i;:::-;39822:595;;;39731:686;;;;:::o;56934:289::-;57152:66;57179:8;57189:4;57195:2;57199:3;57204:7;57213:4;57152:26;:66::i;:::-;56934:289;;;;;;:::o;46464:220::-;;;;;;;:::o;47444:813::-;47684:15;:2;:13;;;:15::i;:::-;47680:570;;;47737:2;47720:43;;;47764:8;47774:4;47780:3;47785:7;47794:4;47720:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47716:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;48112:6;48105:14;;;;;;;;;;;:::i;:::-;;;;;;;;47716:523;;;48161:62;;;;;;;;;;:::i;:::-;;;;;;;;47716:523;47893:48;;;47881:60;;;:8;:60;;;;47877:159;;47966:50;;;;;;;;;;:::i;:::-;;;;;;;;47877:159;47800:251;47680:570;47444:813;;;;;;:::o;48265:198::-;48331:16;48360:22;48399:1;48385:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48360:41;;48423:7;48412:5;48418:1;48412:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;48450:5;48443:12;;;48265:198;;;:::o;46692:744::-;46907:15;:2;:13;;;:15::i;:::-;46903:526;;;46960:2;46943:38;;;46982:8;46992:4;46998:2;47002:6;47010:4;46943:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46939:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;47291:6;47284:14;;;;;;;;;;;:::i;:::-;;;;;;;;46939:479;;;47340:62;;;;;;;;;;:::i;:::-;;;;;;;;46939:479;47077:43;;;47065:55;;;:8;:55;;;;47061:154;;47145:50;;;;;;;;;;:::i;:::-;;;;;;;;47061:154;47016:214;46903:526;46692:744;;;;;;:::o;29430:716::-;29854:23;29880:69;29908:4;29880:69;;;;;;;;;;;;;;;;;29888:5;29880:27;;;;:69;;;;;:::i;:::-;29854:95;;29984:1;29964:10;:17;:21;29960:179;;;30061:10;30050:30;;;;;;;;;;;;:::i;:::-;30042:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29960:179;29500:646;29430:716;;:::o;50695:931::-;50934:66;50961:8;50971:4;50977:2;50981:3;50986:7;50995:4;50934:26;:66::i;:::-;51033:1;51017:18;;:4;:18;;;51013:160;;51057:9;51052:110;51076:3;:10;51072:1;:14;51052:110;;;51136:7;51144:1;51136:10;;;;;;;;:::i;:::-;;;;;;;;51112:12;:20;51125:3;51129:1;51125:6;;;;;;;;:::i;:::-;;;;;;;;51112:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;51088:3;;;;:::i;:::-;;;51052:110;;;;51013:160;51203:1;51189:16;;:2;:16;;;51185:434;;51227:9;51222:386;51246:3;:10;51242:1;:14;51222:386;;;51282:10;51295:3;51299:1;51295:6;;;;;;;;:::i;:::-;;;;;;;;51282:19;;51320:14;51337:7;51345:1;51337:10;;;;;;;;:::i;:::-;;;;;;;;51320:27;;51366:14;51383:12;:16;51396:2;51383:16;;;;;;;;;;;;51366:33;;51436:6;51426;:16;;51418:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51567:6;51558;:15;51539:12;:16;51552:2;51539:16;;;;;;;;;;;:34;;;;51263:345;;;51258:3;;;;:::i;:::-;;;51222:386;;;;51185:434;50695:931;;;;;;:::o;13085:326::-;13145:4;13402:1;13380:7;:19;;;:23;13373:30;;13085:326;;;:::o;15830:229::-;15967:12;15999:52;16021:6;16029:4;16035:1;16038:12;15999:21;:52::i;:::-;15992:59;;15830:229;;;;;:::o;45288:221::-;;;;;;;:::o;16950:510::-;17120:12;17178:5;17153:21;:30;;17145:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;17245:18;17256:6;17245:10;:18::i;:::-;17237:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;17311:12;17325:23;17352:6;:11;;17371:5;17378:4;17352:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17310:73;;;;17401:51;17418:7;17427:10;17439:12;17401:16;:51::i;:::-;17394:58;;;;16950:510;;;;;;:::o;19636:762::-;19786:12;19815:7;19811:580;;;19846:10;19839:17;;;;19811:580;19980:1;19960:10;:17;:21;19956:424;;;20208:10;20202:17;20269:15;20256:10;20252:2;20248:19;20241:44;19956:424;20351:12;20344:20;;;;;;;;;;;:::i;:::-;;;;;;;;19636:762;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:146::-;4586:6;4581:3;4576;4563:30;4627:1;4618:6;4613:3;4609:16;4602:27;4489:146;;;:::o;4641:425::-;4719:5;4744:66;4760:49;4802:6;4760:49;:::i;:::-;4744:66;:::i;:::-;4735:75;;4833:6;4826:5;4819:21;4871:4;4864:5;4860:16;4909:3;4900:6;4895:3;4891:16;4888:25;4885:112;;;4916:79;;:::i;:::-;4885:112;5006:54;5053:6;5048:3;5043;5006:54;:::i;:::-;4725:341;4641:425;;;;;:::o;5086:340::-;5142:5;5191:3;5184:4;5176:6;5172:17;5168:27;5158:122;;5199:79;;:::i;:::-;5158:122;5316:6;5303:20;5341:79;5416:3;5408:6;5401:4;5393:6;5389:17;5341:79;:::i;:::-;5332:88;;5148:278;5086:340;;;;:::o;5432:509::-;5501:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:119;;;5556:79;;:::i;:::-;5518:119;5704:1;5693:9;5689:17;5676:31;5734:18;5726:6;5723:30;5720:117;;;5756:79;;:::i;:::-;5720:117;5861:63;5916:7;5907:6;5896:9;5892:22;5861:63;:::i;:::-;5851:73;;5647:287;5432:509;;;;:::o;5947:99::-;5999:6;6033:5;6027:12;6017:22;;5947:99;;;:::o;6052:169::-;6136:11;6170:6;6165:3;6158:19;6210:4;6205:3;6201:14;6186:29;;6052:169;;;;:::o;6227:246::-;6308:1;6318:113;6332:6;6329:1;6326:13;6318:113;;;6417:1;6412:3;6408:11;6402:18;6398:1;6393:3;6389:11;6382:39;6354:2;6351:1;6347:10;6342:15;;6318:113;;;6465:1;6456:6;6451:3;6447:16;6440:27;6289:184;6227:246;;;:::o;6479:377::-;6567:3;6595:39;6628:5;6595:39;:::i;:::-;6650:71;6714:6;6709:3;6650:71;:::i;:::-;6643:78;;6730:65;6788:6;6783:3;6776:4;6769:5;6765:16;6730:65;:::i;:::-;6820:29;6842:6;6820:29;:::i;:::-;6815:3;6811:39;6804:46;;6571:285;6479:377;;;;:::o;6862:313::-;6975:4;7013:2;7002:9;6998:18;6990:26;;7062:9;7056:4;7052:20;7048:1;7037:9;7033:17;7026:47;7090:78;7163:4;7154:6;7090:78;:::i;:::-;7082:86;;6862:313;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:311::-;7593:4;7683:18;7675:6;7672:30;7669:56;;;7705:18;;:::i;:::-;7669:56;7755:4;7747:6;7743:17;7735:25;;7815:4;7809;7805:15;7797:23;;7516:311;;;:::o;7833:117::-;7942:1;7939;7932:12;7973:710;8069:5;8094:81;8110:64;8167:6;8110:64;:::i;:::-;8094:81;:::i;:::-;8085:90;;8195:5;8224:6;8217:5;8210:21;8258:4;8251:5;8247:16;8240:23;;8311:4;8303:6;8299:17;8291:6;8287:30;8340:3;8332:6;8329:15;8326:122;;;8359:79;;:::i;:::-;8326:122;8474:6;8457:220;8491:6;8486:3;8483:15;8457:220;;;8566:3;8595:37;8628:3;8616:10;8595:37;:::i;:::-;8590:3;8583:50;8662:4;8657:3;8653:14;8646:21;;8533:144;8517:4;8512:3;8508:14;8501:21;;8457:220;;;8461:21;8075:608;;7973:710;;;;;:::o;8706:370::-;8777:5;8826:3;8819:4;8811:6;8807:17;8803:27;8793:122;;8834:79;;:::i;:::-;8793:122;8951:6;8938:20;8976:94;9066:3;9058:6;9051:4;9043:6;9039:17;8976:94;:::i;:::-;8967:103;;8783:293;8706:370;;;;:::o;9082:307::-;9143:4;9233:18;9225:6;9222:30;9219:56;;;9255:18;;:::i;:::-;9219:56;9293:29;9315:6;9293:29;:::i;:::-;9285:37;;9377:4;9371;9367:15;9359:23;;9082:307;;;:::o;9395:423::-;9472:5;9497:65;9513:48;9554:6;9513:48;:::i;:::-;9497:65;:::i;:::-;9488:74;;9585:6;9578:5;9571:21;9623:4;9616:5;9612:16;9661:3;9652:6;9647:3;9643:16;9640:25;9637:112;;;9668:79;;:::i;:::-;9637:112;9758:54;9805:6;9800:3;9795;9758:54;:::i;:::-;9478:340;9395:423;;;;;:::o;9837:338::-;9892:5;9941:3;9934:4;9926:6;9922:17;9918:27;9908:122;;9949:79;;:::i;:::-;9908:122;10066:6;10053:20;10091:78;10165:3;10157:6;10150:4;10142:6;10138:17;10091:78;:::i;:::-;10082:87;;9898:277;9837:338;;;;:::o;10181:1509::-;10335:6;10343;10351;10359;10367;10416:3;10404:9;10395:7;10391:23;10387:33;10384:120;;;10423:79;;:::i;:::-;10384:120;10543:1;10568:53;10613:7;10604:6;10593:9;10589:22;10568:53;:::i;:::-;10558:63;;10514:117;10670:2;10696:53;10741:7;10732:6;10721:9;10717:22;10696:53;:::i;:::-;10686:63;;10641:118;10826:2;10815:9;10811:18;10798:32;10857:18;10849:6;10846:30;10843:117;;;10879:79;;:::i;:::-;10843:117;10984:78;11054:7;11045:6;11034:9;11030:22;10984:78;:::i;:::-;10974:88;;10769:303;11139:2;11128:9;11124:18;11111:32;11170:18;11162:6;11159:30;11156:117;;;11192:79;;:::i;:::-;11156:117;11297:78;11367:7;11358:6;11347:9;11343:22;11297:78;:::i;:::-;11287:88;;11082:303;11452:3;11441:9;11437:19;11424:33;11484:18;11476:6;11473:30;11470:117;;;11506:79;;:::i;:::-;11470:117;11611:62;11665:7;11656:6;11645:9;11641:22;11611:62;:::i;:::-;11601:72;;11395:288;10181:1509;;;;;;;;:::o;11696:117::-;11805:1;11802;11795:12;11833:553;11891:8;11901:6;11951:3;11944:4;11936:6;11932:17;11928:27;11918:122;;11959:79;;:::i;:::-;11918:122;12072:6;12059:20;12049:30;;12102:18;12094:6;12091:30;12088:117;;;12124:79;;:::i;:::-;12088:117;12238:4;12230:6;12226:17;12214:29;;12292:3;12284:4;12276:6;12272:17;12262:8;12258:32;12255:41;12252:128;;;12299:79;;:::i;:::-;12252:128;11833:553;;;;;:::o;12392:529::-;12463:6;12471;12520:2;12508:9;12499:7;12495:23;12491:32;12488:119;;;12526:79;;:::i;:::-;12488:119;12674:1;12663:9;12659:17;12646:31;12704:18;12696:6;12693:30;12690:117;;;12726:79;;:::i;:::-;12690:117;12839:65;12896:7;12887:6;12876:9;12872:22;12839:65;:::i;:::-;12821:83;;;;12617:297;12392:529;;;;;:::o;12927:311::-;13004:4;13094:18;13086:6;13083:30;13080:56;;;13116:18;;:::i;:::-;13080:56;13166:4;13158:6;13154:17;13146:25;;13226:4;13220;13216:15;13208:23;;12927:311;;;:::o;13261:710::-;13357:5;13382:81;13398:64;13455:6;13398:64;:::i;:::-;13382:81;:::i;:::-;13373:90;;13483:5;13512:6;13505:5;13498:21;13546:4;13539:5;13535:16;13528:23;;13599:4;13591:6;13587:17;13579:6;13575:30;13628:3;13620:6;13617:15;13614:122;;;13647:79;;:::i;:::-;13614:122;13762:6;13745:220;13779:6;13774:3;13771:15;13745:220;;;13854:3;13883:37;13916:3;13904:10;13883:37;:::i;:::-;13878:3;13871:50;13950:4;13945:3;13941:14;13934:21;;13821:144;13805:4;13800:3;13796:14;13789:21;;13745:220;;;13749:21;13363:608;;13261:710;;;;;:::o;13994:370::-;14065:5;14114:3;14107:4;14099:6;14095:17;14091:27;14081:122;;14122:79;;:::i;:::-;14081:122;14239:6;14226:20;14264:94;14354:3;14346:6;14339:4;14331:6;14327:17;14264:94;:::i;:::-;14255:103;;14071:293;13994:370;;;;:::o;14370:894::-;14488:6;14496;14545:2;14533:9;14524:7;14520:23;14516:32;14513:119;;;14551:79;;:::i;:::-;14513:119;14699:1;14688:9;14684:17;14671:31;14729:18;14721:6;14718:30;14715:117;;;14751:79;;:::i;:::-;14715:117;14856:78;14926:7;14917:6;14906:9;14902:22;14856:78;:::i;:::-;14846:88;;14642:302;15011:2;15000:9;14996:18;14983:32;15042:18;15034:6;15031:30;15028:117;;;15064:79;;:::i;:::-;15028:117;15169:78;15239:7;15230:6;15219:9;15215:22;15169:78;:::i;:::-;15159:88;;14954:303;14370:894;;;;;:::o;15270:114::-;15337:6;15371:5;15365:12;15355:22;;15270:114;;;:::o;15390:184::-;15489:11;15523:6;15518:3;15511:19;15563:4;15558:3;15554:14;15539:29;;15390:184;;;;:::o;15580:132::-;15647:4;15670:3;15662:11;;15700:4;15695:3;15691:14;15683:22;;15580:132;;;:::o;15718:108::-;15795:24;15813:5;15795:24;:::i;:::-;15790:3;15783:37;15718:108;;:::o;15832:179::-;15901:10;15922:46;15964:3;15956:6;15922:46;:::i;:::-;16000:4;15995:3;15991:14;15977:28;;15832:179;;;;:::o;16017:113::-;16087:4;16119;16114:3;16110:14;16102:22;;16017:113;;;:::o;16166:732::-;16285:3;16314:54;16362:5;16314:54;:::i;:::-;16384:86;16463:6;16458:3;16384:86;:::i;:::-;16377:93;;16494:56;16544:5;16494:56;:::i;:::-;16573:7;16604:1;16589:284;16614:6;16611:1;16608:13;16589:284;;;16690:6;16684:13;16717:63;16776:3;16761:13;16717:63;:::i;:::-;16710:70;;16803:60;16856:6;16803:60;:::i;:::-;16793:70;;16649:224;16636:1;16633;16629:9;16624:14;;16589:284;;;16593:14;16889:3;16882:10;;16290:608;;;16166:732;;;;:::o;16904:373::-;17047:4;17085:2;17074:9;17070:18;17062:26;;17134:9;17128:4;17124:20;17120:1;17109:9;17105:17;17098:47;17162:108;17265:4;17256:6;17162:108;:::i;:::-;17154:116;;16904:373;;;;:::o;17283:1039::-;17410:6;17418;17426;17475:2;17463:9;17454:7;17450:23;17446:32;17443:119;;;17481:79;;:::i;:::-;17443:119;17601:1;17626:53;17671:7;17662:6;17651:9;17647:22;17626:53;:::i;:::-;17616:63;;17572:117;17756:2;17745:9;17741:18;17728:32;17787:18;17779:6;17776:30;17773:117;;;17809:79;;:::i;:::-;17773:117;17914:78;17984:7;17975:6;17964:9;17960:22;17914:78;:::i;:::-;17904:88;;17699:303;18069:2;18058:9;18054:18;18041:32;18100:18;18092:6;18089:30;18086:117;;;18122:79;;:::i;:::-;18086:117;18227:78;18297:7;18288:6;18277:9;18273:22;18227:78;:::i;:::-;18217:88;;18012:303;17283:1039;;;;;:::o;18328:118::-;18415:24;18433:5;18415:24;:::i;:::-;18410:3;18403:37;18328:118;;:::o;18452:222::-;18545:4;18583:2;18572:9;18568:18;18560:26;;18596:71;18664:1;18653:9;18649:17;18640:6;18596:71;:::i;:::-;18452:222;;;;:::o;18680:60::-;18708:3;18729:5;18722:12;;18680:60;;;:::o;18746:142::-;18796:9;18829:53;18847:34;18856:24;18874:5;18856:24;:::i;:::-;18847:34;:::i;:::-;18829:53;:::i;:::-;18816:66;;18746:142;;;:::o;18894:126::-;18944:9;18977:37;19008:5;18977:37;:::i;:::-;18964:50;;18894:126;;;:::o;19026:155::-;19105:9;19138:37;19169:5;19138:37;:::i;:::-;19125:50;;19026:155;;;:::o;19187:189::-;19303:66;19363:5;19303:66;:::i;:::-;19298:3;19291:79;19187:189;;:::o;19382:280::-;19504:4;19542:2;19531:9;19527:18;19519:26;;19555:100;19652:1;19641:9;19637:17;19628:6;19555:100;:::i;:::-;19382:280;;;;:::o;19668:116::-;19738:21;19753:5;19738:21;:::i;:::-;19731:5;19728:32;19718:60;;19774:1;19771;19764:12;19718:60;19668:116;:::o;19790:133::-;19833:5;19871:6;19858:20;19849:29;;19887:30;19911:5;19887:30;:::i;:::-;19790:133;;;;:::o;19929:468::-;19994:6;20002;20051:2;20039:9;20030:7;20026:23;20022:32;20019:119;;;20057:79;;:::i;:::-;20019:119;20177:1;20202:53;20247:7;20238:6;20227:9;20223:22;20202:53;:::i;:::-;20192:63;;20148:117;20304:2;20330:50;20372:7;20363:6;20352:9;20348:22;20330:50;:::i;:::-;20320:60;;20275:115;19929:468;;;;;:::o;20403:140::-;20467:9;20500:37;20531:5;20500:37;:::i;:::-;20487:50;;20403:140;;;:::o;20549:159::-;20650:51;20695:5;20650:51;:::i;:::-;20645:3;20638:64;20549:159;;:::o;20714:250::-;20821:4;20859:2;20848:9;20844:18;20836:26;;20872:85;20954:1;20943:9;20939:17;20930:6;20872:85;:::i;:::-;20714:250;;;;:::o;20970:329::-;21029:6;21078:2;21066:9;21057:7;21053:23;21049:32;21046:119;;;21084:79;;:::i;:::-;21046:119;21204:1;21229:53;21274:7;21265:6;21254:9;21250:22;21229:53;:::i;:::-;21219:63;;21175:117;20970:329;;;;:::o;21305:474::-;21373:6;21381;21430:2;21418:9;21409:7;21405:23;21401:32;21398:119;;;21436:79;;:::i;:::-;21398:119;21556:1;21581:53;21626:7;21617:6;21606:9;21602:22;21581:53;:::i;:::-;21571:63;;21527:117;21683:2;21709:53;21754:7;21745:6;21734:9;21730:22;21709:53;:::i;:::-;21699:63;;21654:118;21305:474;;;;;:::o;21785:::-;21853:6;21861;21910:2;21898:9;21889:7;21885:23;21881:32;21878:119;;;21916:79;;:::i;:::-;21878:119;22036:1;22061:53;22106:7;22097:6;22086:9;22082:22;22061:53;:::i;:::-;22051:63;;22007:117;22163:2;22189:53;22234:7;22225:6;22214:9;22210:22;22189:53;:::i;:::-;22179:63;;22134:118;21785:474;;;;;:::o;22265:1089::-;22369:6;22377;22385;22393;22401;22450:3;22438:9;22429:7;22425:23;22421:33;22418:120;;;22457:79;;:::i;:::-;22418:120;22577:1;22602:53;22647:7;22638:6;22627:9;22623:22;22602:53;:::i;:::-;22592:63;;22548:117;22704:2;22730:53;22775:7;22766:6;22755:9;22751:22;22730:53;:::i;:::-;22720:63;;22675:118;22832:2;22858:53;22903:7;22894:6;22883:9;22879:22;22858:53;:::i;:::-;22848:63;;22803:118;22960:2;22986:53;23031:7;23022:6;23011:9;23007:22;22986:53;:::i;:::-;22976:63;;22931:118;23116:3;23105:9;23101:19;23088:33;23148:18;23140:6;23137:30;23134:117;;;23170:79;;:::i;:::-;23134:117;23275:62;23329:7;23320:6;23309:9;23305:22;23275:62;:::i;:::-;23265:72;;23059:288;22265:1089;;;;;;;;:::o;23360:619::-;23437:6;23445;23453;23502:2;23490:9;23481:7;23477:23;23473:32;23470:119;;;23508:79;;:::i;:::-;23470:119;23628:1;23653:53;23698:7;23689:6;23678:9;23674:22;23653:53;:::i;:::-;23643:63;;23599:117;23755:2;23781:53;23826:7;23817:6;23806:9;23802:22;23781:53;:::i;:::-;23771:63;;23726:118;23883:2;23909:53;23954:7;23945:6;23934:9;23930:22;23909:53;:::i;:::-;23899:63;;23854:118;23360:619;;;;;:::o;23985:765::-;24071:6;24079;24087;24095;24144:3;24132:9;24123:7;24119:23;24115:33;24112:120;;;24151:79;;:::i;:::-;24112:120;24271:1;24296:53;24341:7;24332:6;24321:9;24317:22;24296:53;:::i;:::-;24286:63;;24242:117;24398:2;24424:53;24469:7;24460:6;24449:9;24445:22;24424:53;:::i;:::-;24414:63;;24369:118;24526:2;24552:53;24597:7;24588:6;24577:9;24573:22;24552:53;:::i;:::-;24542:63;;24497:118;24654:2;24680:53;24725:7;24716:6;24705:9;24701:22;24680:53;:::i;:::-;24670:63;;24625:118;23985:765;;;;;;;:::o;24756:229::-;24896:34;24892:1;24884:6;24880:14;24873:58;24965:12;24960:2;24952:6;24948:15;24941:37;24756:229;:::o;24991:366::-;25133:3;25154:67;25218:2;25213:3;25154:67;:::i;:::-;25147:74;;25230:93;25319:3;25230:93;:::i;:::-;25348:2;25343:3;25339:12;25332:19;;24991:366;;;:::o;25363:419::-;25529:4;25567:2;25556:9;25552:18;25544:26;;25616:9;25610:4;25606:20;25602:1;25591:9;25587:17;25580:47;25644:131;25770:4;25644:131;:::i;:::-;25636:139;;25363:419;;;:::o;25788:180::-;25836:77;25833:1;25826:88;25933:4;25930:1;25923:15;25957:4;25954:1;25947:15;25974:320;26018:6;26055:1;26049:4;26045:12;26035:22;;26102:1;26096:4;26092:12;26123:18;26113:81;;26179:4;26171:6;26167:17;26157:27;;26113:81;26241:2;26233:6;26230:14;26210:18;26207:38;26204:84;;26260:18;;:::i;:::-;26204:84;26025:269;25974:320;;;:::o;26300:233::-;26440:34;26436:1;26428:6;26424:14;26417:58;26509:16;26504:2;26496:6;26492:15;26485:41;26300:233;:::o;26539:366::-;26681:3;26702:67;26766:2;26761:3;26702:67;:::i;:::-;26695:74;;26778:93;26867:3;26778:93;:::i;:::-;26896:2;26891:3;26887:12;26880:19;;26539:366;;;:::o;26911:419::-;27077:4;27115:2;27104:9;27100:18;27092:26;;27164:9;27158:4;27154:20;27150:1;27139:9;27135:17;27128:47;27192:131;27318:4;27192:131;:::i;:::-;27184:139;;26911:419;;;:::o;27336:228::-;27476:34;27472:1;27464:6;27460:14;27453:58;27545:11;27540:2;27532:6;27528:15;27521:36;27336:228;:::o;27570:366::-;27712:3;27733:67;27797:2;27792:3;27733:67;:::i;:::-;27726:74;;27809:93;27898:3;27809:93;:::i;:::-;27927:2;27922:3;27918:12;27911:19;;27570:366;;;:::o;27942:419::-;28108:4;28146:2;28135:9;28131:18;28123:26;;28195:9;28189:4;28185:20;28181:1;28170:9;28166:17;28159:47;28223:131;28349:4;28223:131;:::i;:::-;28215:139;;27942:419;;;:::o;28367:180::-;28415:77;28412:1;28405:88;28512:4;28509:1;28502:15;28536:4;28533:1;28526:15;28553:180;28601:77;28598:1;28591:88;28698:4;28695:1;28688:15;28722:4;28719:1;28712:15;28739:233;28778:3;28801:24;28819:5;28801:24;:::i;:::-;28792:33;;28847:66;28840:5;28837:77;28834:103;;28917:18;;:::i;:::-;28834:103;28964:1;28957:5;28953:13;28946:20;;28739:233;;;:::o;28978:225::-;29118:34;29114:1;29106:6;29102:14;29095:58;29187:8;29182:2;29174:6;29170:15;29163:33;28978:225;:::o;29209:366::-;29351:3;29372:67;29436:2;29431:3;29372:67;:::i;:::-;29365:74;;29448:93;29537:3;29448:93;:::i;:::-;29566:2;29561:3;29557:12;29550:19;;29209:366;;;:::o;29581:419::-;29747:4;29785:2;29774:9;29770:18;29762:26;;29834:9;29828:4;29824:20;29820:1;29809:9;29805:17;29798:47;29862:131;29988:4;29862:131;:::i;:::-;29854:139;;29581:419;;;:::o;30006:410::-;30046:7;30069:20;30087:1;30069:20;:::i;:::-;30064:25;;30103:20;30121:1;30103:20;:::i;:::-;30098:25;;30158:1;30155;30151:9;30180:30;30198:11;30180:30;:::i;:::-;30169:41;;30359:1;30350:7;30346:15;30343:1;30340:22;30320:1;30313:9;30293:83;30270:139;;30389:18;;:::i;:::-;30270:139;30054:362;30006:410;;;;:::o;30422:194::-;30462:4;30482:20;30500:1;30482:20;:::i;:::-;30477:25;;30516:20;30534:1;30516:20;:::i;:::-;30511:25;;30560:1;30557;30553:9;30545:17;;30584:1;30578:4;30575:11;30572:37;;;30589:18;;:::i;:::-;30572:37;30422:194;;;;:::o;30622:664::-;30827:4;30865:3;30854:9;30850:19;30842:27;;30879:71;30947:1;30936:9;30932:17;30923:6;30879:71;:::i;:::-;30960:72;31028:2;31017:9;31013:18;31004:6;30960:72;:::i;:::-;31042;31110:2;31099:9;31095:18;31086:6;31042:72;:::i;:::-;31124;31192:2;31181:9;31177:18;31168:6;31124:72;:::i;:::-;31206:73;31274:3;31263:9;31259:19;31250:6;31206:73;:::i;:::-;30622:664;;;;;;;;:::o;31292:182::-;31432:34;31428:1;31420:6;31416:14;31409:58;31292:182;:::o;31480:366::-;31622:3;31643:67;31707:2;31702:3;31643:67;:::i;:::-;31636:74;;31719:93;31808:3;31719:93;:::i;:::-;31837:2;31832:3;31828:12;31821:19;;31480:366;;;:::o;31852:419::-;32018:4;32056:2;32045:9;32041:18;32033:26;;32105:9;32099:4;32095:20;32091:1;32080:9;32076:17;32069:47;32133:131;32259:4;32133:131;:::i;:::-;32125:139;;31852:419;;;:::o;32277:141::-;32326:4;32349:3;32341:11;;32372:3;32369:1;32362:14;32406:4;32403:1;32393:18;32385:26;;32277:141;;;:::o;32424:93::-;32461:6;32508:2;32503;32496:5;32492:14;32488:23;32478:33;;32424:93;;;:::o;32523:107::-;32567:8;32617:5;32611:4;32607:16;32586:37;;32523:107;;;;:::o;32636:393::-;32705:6;32755:1;32743:10;32739:18;32778:97;32808:66;32797:9;32778:97;:::i;:::-;32896:39;32926:8;32915:9;32896:39;:::i;:::-;32884:51;;32968:4;32964:9;32957:5;32953:21;32944:30;;33017:4;33007:8;33003:19;32996:5;32993:30;32983:40;;32712:317;;32636:393;;;;;:::o;33035:142::-;33085:9;33118:53;33136:34;33145:24;33163:5;33145:24;:::i;:::-;33136:34;:::i;:::-;33118:53;:::i;:::-;33105:66;;33035:142;;;:::o;33183:75::-;33226:3;33247:5;33240:12;;33183:75;;;:::o;33264:269::-;33374:39;33405:7;33374:39;:::i;:::-;33435:91;33484:41;33508:16;33484:41;:::i;:::-;33476:6;33469:4;33463:11;33435:91;:::i;:::-;33429:4;33422:105;33340:193;33264:269;;;:::o;33539:73::-;33584:3;33539:73;:::o;33618:189::-;33695:32;;:::i;:::-;33736:65;33794:6;33786;33780:4;33736:65;:::i;:::-;33671:136;33618:189;;:::o;33813:186::-;33873:120;33890:3;33883:5;33880:14;33873:120;;;33944:39;33981:1;33974:5;33944:39;:::i;:::-;33917:1;33910:5;33906:13;33897:22;;33873:120;;;33813:186;;:::o;34005:543::-;34106:2;34101:3;34098:11;34095:446;;;34140:38;34172:5;34140:38;:::i;:::-;34224:29;34242:10;34224:29;:::i;:::-;34214:8;34210:44;34407:2;34395:10;34392:18;34389:49;;;34428:8;34413:23;;34389:49;34451:80;34507:22;34525:3;34507:22;:::i;:::-;34497:8;34493:37;34480:11;34451:80;:::i;:::-;34110:431;;34095:446;34005:543;;;:::o;34554:117::-;34608:8;34658:5;34652:4;34648:16;34627:37;;34554:117;;;;:::o;34677:169::-;34721:6;34754:51;34802:1;34798:6;34790:5;34787:1;34783:13;34754:51;:::i;:::-;34750:56;34835:4;34829;34825:15;34815:25;;34728:118;34677:169;;;;:::o;34851:295::-;34927:4;35073:29;35098:3;35092:4;35073:29;:::i;:::-;35065:37;;35135:3;35132:1;35128:11;35122:4;35119:21;35111:29;;34851:295;;;;:::o;35151:1395::-;35268:37;35301:3;35268:37;:::i;:::-;35370:18;35362:6;35359:30;35356:56;;;35392:18;;:::i;:::-;35356:56;35436:38;35468:4;35462:11;35436:38;:::i;:::-;35521:67;35581:6;35573;35567:4;35521:67;:::i;:::-;35615:1;35639:4;35626:17;;35671:2;35663:6;35660:14;35688:1;35683:618;;;;36345:1;36362:6;36359:77;;;36411:9;36406:3;36402:19;36396:26;36387:35;;36359:77;36462:67;36522:6;36515:5;36462:67;:::i;:::-;36456:4;36449:81;36318:222;35653:887;;35683:618;35735:4;35731:9;35723:6;35719:22;35769:37;35801:4;35769:37;:::i;:::-;35828:1;35842:208;35856:7;35853:1;35850:14;35842:208;;;35935:9;35930:3;35926:19;35920:26;35912:6;35905:42;35986:1;35978:6;35974:14;35964:24;;36033:2;36022:9;36018:18;36005:31;;35879:4;35876:1;35872:12;35867:17;;35842:208;;;36078:6;36069:7;36066:19;36063:179;;;36136:9;36131:3;36127:19;36121:26;36179:48;36221:4;36213:6;36209:17;36198:9;36179:48;:::i;:::-;36171:6;36164:64;36086:156;36063:179;36288:1;36284;36276:6;36272:14;36268:22;36262:4;36255:36;35690:611;;;35653:887;;35243:1303;;;35151:1395;;:::o;36552:227::-;36692:34;36688:1;36680:6;36676:14;36669:58;36761:10;36756:2;36748:6;36744:15;36737:35;36552:227;:::o;36785:366::-;36927:3;36948:67;37012:2;37007:3;36948:67;:::i;:::-;36941:74;;37024:93;37113:3;37024:93;:::i;:::-;37142:2;37137:3;37133:12;37126:19;;36785:366;;;:::o;37157:419::-;37323:4;37361:2;37350:9;37346:18;37338:26;;37410:9;37404:4;37400:20;37396:1;37385:9;37381:17;37374:47;37438:131;37564:4;37438:131;:::i;:::-;37430:139;;37157:419;;;:::o;37582:224::-;37722:34;37718:1;37710:6;37706:14;37699:58;37791:7;37786:2;37778:6;37774:15;37767:32;37582:224;:::o;37812:366::-;37954:3;37975:67;38039:2;38034:3;37975:67;:::i;:::-;37968:74;;38051:93;38140:3;38051:93;:::i;:::-;38169:2;38164:3;38160:12;38153:19;;37812:366;;;:::o;38184:419::-;38350:4;38388:2;38377:9;38373:18;38365:26;;38437:9;38431:4;38427:20;38423:1;38412:9;38408:17;38401:47;38465:131;38591:4;38465:131;:::i;:::-;38457:139;;38184:419;;;:::o;38609:229::-;38749:34;38745:1;38737:6;38733:14;38726:58;38818:12;38813:2;38805:6;38801:15;38794:37;38609:229;:::o;38844:366::-;38986:3;39007:67;39071:2;39066:3;39007:67;:::i;:::-;39000:74;;39083:93;39172:3;39083:93;:::i;:::-;39201:2;39196:3;39192:12;39185:19;;38844:366;;;:::o;39216:419::-;39382:4;39420:2;39409:9;39405:18;39397:26;;39469:9;39463:4;39459:20;39455:1;39444:9;39440:17;39433:47;39497:131;39623:4;39497:131;:::i;:::-;39489:139;;39216:419;;;:::o;39641:191::-;39681:3;39700:20;39718:1;39700:20;:::i;:::-;39695:25;;39734:20;39752:1;39734:20;:::i;:::-;39729:25;;39777:1;39774;39770:9;39763:16;;39798:3;39795:1;39792:10;39789:36;;;39805:18;;:::i;:::-;39789:36;39641:191;;;;:::o;39838:634::-;40059:4;40097:2;40086:9;40082:18;40074:26;;40146:9;40140:4;40136:20;40132:1;40121:9;40117:17;40110:47;40174:108;40277:4;40268:6;40174:108;:::i;:::-;40166:116;;40329:9;40323:4;40319:20;40314:2;40303:9;40299:18;40292:48;40357:108;40460:4;40451:6;40357:108;:::i;:::-;40349:116;;39838:634;;;;;:::o;40478:222::-;40618:34;40614:1;40606:6;40602:14;40595:58;40687:5;40682:2;40674:6;40670:15;40663:30;40478:222;:::o;40706:366::-;40848:3;40869:67;40933:2;40928:3;40869:67;:::i;:::-;40862:74;;40945:93;41034:3;40945:93;:::i;:::-;41063:2;41058:3;41054:12;41047:19;;40706:366;;;:::o;41078:419::-;41244:4;41282:2;41271:9;41267:18;41259:26;;41331:9;41325:4;41321:20;41317:1;41306:9;41302:17;41295:47;41359:131;41485:4;41359:131;:::i;:::-;41351:139;;41078:419;;;:::o;41503:223::-;41643:34;41639:1;41631:6;41627:14;41620:58;41712:6;41707:2;41699:6;41695:15;41688:31;41503:223;:::o;41732:366::-;41874:3;41895:67;41959:2;41954:3;41895:67;:::i;:::-;41888:74;;41971:93;42060:3;41971:93;:::i;:::-;42089:2;42084:3;42080:12;42073:19;;41732:366;;;:::o;42104:419::-;42270:4;42308:2;42297:9;42293:18;42285:26;;42357:9;42351:4;42347:20;42343:1;42332:9;42328:17;42321:47;42385:131;42511:4;42385:131;:::i;:::-;42377:139;;42104:419;;;:::o;42529:228::-;42669:34;42665:1;42657:6;42653:14;42646:58;42738:11;42733:2;42725:6;42721:15;42714:36;42529:228;:::o;42763:366::-;42905:3;42926:67;42990:2;42985:3;42926:67;:::i;:::-;42919:74;;43002:93;43091:3;43002:93;:::i;:::-;43120:2;43115:3;43111:12;43104:19;;42763:366;;;:::o;43135:419::-;43301:4;43339:2;43328:9;43324:18;43316:26;;43388:9;43382:4;43378:20;43374:1;43363:9;43359:17;43352:47;43416:131;43542:4;43416:131;:::i;:::-;43408:139;;43135:419;;;:::o;43560:332::-;43681:4;43719:2;43708:9;43704:18;43696:26;;43732:71;43800:1;43789:9;43785:17;43776:6;43732:71;:::i;:::-;43813:72;43881:2;43870:9;43866:18;43857:6;43813:72;:::i;:::-;43560:332;;;;;:::o;43898:442::-;44047:4;44085:2;44074:9;44070:18;44062:26;;44098:71;44166:1;44155:9;44151:17;44142:6;44098:71;:::i;:::-;44179:72;44247:2;44236:9;44232:18;44223:6;44179:72;:::i;:::-;44261;44329:2;44318:9;44314:18;44305:6;44261:72;:::i;:::-;43898:442;;;;;;:::o;44346:220::-;44486:34;44482:1;44474:6;44470:14;44463:58;44555:3;44550:2;44542:6;44538:15;44531:28;44346:220;:::o;44572:366::-;44714:3;44735:67;44799:2;44794:3;44735:67;:::i;:::-;44728:74;;44811:93;44900:3;44811:93;:::i;:::-;44929:2;44924:3;44920:12;44913:19;;44572:366;;;:::o;44944:419::-;45110:4;45148:2;45137:9;45133:18;45125:26;;45197:9;45191:4;45187:20;45183:1;45172:9;45168:17;45161:47;45225:131;45351:4;45225:131;:::i;:::-;45217:139;;44944:419;;;:::o;45369:98::-;45420:6;45454:5;45448:12;45438:22;;45369:98;;;:::o;45473:168::-;45556:11;45590:6;45585:3;45578:19;45630:4;45625:3;45621:14;45606:29;;45473:168;;;;:::o;45647:373::-;45733:3;45761:38;45793:5;45761:38;:::i;:::-;45815:70;45878:6;45873:3;45815:70;:::i;:::-;45808:77;;45894:65;45952:6;45947:3;45940:4;45933:5;45929:16;45894:65;:::i;:::-;45984:29;46006:6;45984:29;:::i;:::-;45979:3;45975:39;45968:46;;45737:283;45647:373;;;;:::o;46026:1053::-;46349:4;46387:3;46376:9;46372:19;46364:27;;46401:71;46469:1;46458:9;46454:17;46445:6;46401:71;:::i;:::-;46482:72;46550:2;46539:9;46535:18;46526:6;46482:72;:::i;:::-;46601:9;46595:4;46591:20;46586:2;46575:9;46571:18;46564:48;46629:108;46732:4;46723:6;46629:108;:::i;:::-;46621:116;;46784:9;46778:4;46774:20;46769:2;46758:9;46754:18;46747:48;46812:108;46915:4;46906:6;46812:108;:::i;:::-;46804:116;;46968:9;46962:4;46958:20;46952:3;46941:9;46937:19;46930:49;46996:76;47067:4;47058:6;46996:76;:::i;:::-;46988:84;;46026:1053;;;;;;;;:::o;47085:141::-;47141:5;47172:6;47166:13;47157:22;;47188:32;47214:5;47188:32;:::i;:::-;47085:141;;;;:::o;47232:349::-;47301:6;47350:2;47338:9;47329:7;47325:23;47321:32;47318:119;;;47356:79;;:::i;:::-;47318:119;47476:1;47501:63;47556:7;47547:6;47536:9;47532:22;47501:63;:::i;:::-;47491:73;;47447:127;47232:349;;;;:::o;47587:106::-;47631:8;47680:5;47675:3;47671:15;47650:36;;47587:106;;;:::o;47699:183::-;47734:3;47772:1;47754:16;47751:23;47748:128;;;47810:1;47807;47804;47789:23;47832:34;47863:1;47857:8;47832:34;:::i;:::-;47825:41;;47748:128;47699:183;:::o;47888:711::-;47927:3;47965:4;47947:16;47944:26;47973:5;47941:39;48002:20;;:::i;:::-;48077:1;48059:16;48055:24;48052:1;48046:4;48031:49;48110:4;48104:11;48209:16;48202:4;48194:6;48190:17;48187:39;48154:18;48146:6;48143:30;48127:113;48124:146;;;48255:5;;;;48124:146;48301:6;48295:4;48291:17;48337:3;48331:10;48364:18;48356:6;48353:30;48350:43;;;48386:5;;;;;;48350:43;48434:6;48427:4;48422:3;48418:14;48414:27;48493:1;48475:16;48471:24;48465:4;48461:35;48456:3;48453:44;48450:57;;;48500:5;;;;;;;48450:57;48517;48565:6;48559:4;48555:17;48547:6;48543:30;48537:4;48517:57;:::i;:::-;48590:3;48583:10;;47931:668;;;;;47888:711;;:::o;48605:239::-;48745:34;48741:1;48733:6;48729:14;48722:58;48814:22;48809:2;48801:6;48797:15;48790:47;48605:239;:::o;48850:366::-;48992:3;49013:67;49077:2;49072:3;49013:67;:::i;:::-;49006:74;;49089:93;49178:3;49089:93;:::i;:::-;49207:2;49202:3;49198:12;49191:19;;48850:366;;;:::o;49222:419::-;49388:4;49426:2;49415:9;49411:18;49403:26;;49475:9;49469:4;49465:20;49461:1;49450:9;49446:17;49439:47;49503:131;49629:4;49503:131;:::i;:::-;49495:139;;49222:419;;;:::o;49647:227::-;49787:34;49783:1;49775:6;49771:14;49764:58;49856:10;49851:2;49843:6;49839:15;49832:35;49647:227;:::o;49880:366::-;50022:3;50043:67;50107:2;50102:3;50043:67;:::i;:::-;50036:74;;50119:93;50208:3;50119:93;:::i;:::-;50237:2;50232:3;50228:12;50221:19;;49880:366;;;:::o;50252:419::-;50418:4;50456:2;50445:9;50441:18;50433:26;;50505:9;50499:4;50495:20;50491:1;50480:9;50476:17;50469:47;50533:131;50659:4;50533:131;:::i;:::-;50525:139;;50252:419;;;:::o;50677:751::-;50900:4;50938:3;50927:9;50923:19;50915:27;;50952:71;51020:1;51009:9;51005:17;50996:6;50952:71;:::i;:::-;51033:72;51101:2;51090:9;51086:18;51077:6;51033:72;:::i;:::-;51115;51183:2;51172:9;51168:18;51159:6;51115:72;:::i;:::-;51197;51265:2;51254:9;51250:18;51241:6;51197:72;:::i;:::-;51317:9;51311:4;51307:20;51301:3;51290:9;51286:19;51279:49;51345:76;51416:4;51407:6;51345:76;:::i;:::-;51337:84;;50677:751;;;;;;;;:::o;51434:137::-;51488:5;51519:6;51513:13;51504:22;;51535:30;51559:5;51535:30;:::i;:::-;51434:137;;;;:::o;51577:345::-;51644:6;51693:2;51681:9;51672:7;51668:23;51664:32;51661:119;;;51699:79;;:::i;:::-;51661:119;51819:1;51844:61;51897:7;51888:6;51877:9;51873:22;51844:61;:::i;:::-;51834:71;;51790:125;51577:345;;;;:::o;51928:229::-;52068:34;52064:1;52056:6;52052:14;52045:58;52137:12;52132:2;52124:6;52120:15;52113:37;51928:229;:::o;52163:366::-;52305:3;52326:67;52390:2;52385:3;52326:67;:::i;:::-;52319:74;;52402:93;52491:3;52402:93;:::i;:::-;52520:2;52515:3;52511:12;52504:19;;52163:366;;;:::o;52535:419::-;52701:4;52739:2;52728:9;52724:18;52716:26;;52788:9;52782:4;52778:20;52774:1;52763:9;52759:17;52752:47;52816:131;52942:4;52816:131;:::i;:::-;52808:139;;52535:419;;;:::o;52960:227::-;53100:34;53096:1;53088:6;53084:14;53077:58;53169:10;53164:2;53156:6;53152:15;53145:35;52960:227;:::o;53193:366::-;53335:3;53356:67;53420:2;53415:3;53356:67;:::i;:::-;53349:74;;53432:93;53521:3;53432:93;:::i;:::-;53550:2;53545:3;53541:12;53534:19;;53193:366;;;:::o;53565:419::-;53731:4;53769:2;53758:9;53754:18;53746:26;;53818:9;53812:4;53808:20;53804:1;53793:9;53789:17;53782:47;53846:131;53972:4;53846:131;:::i;:::-;53838:139;;53565:419;;;:::o;53990:225::-;54130:34;54126:1;54118:6;54114:14;54107:58;54199:8;54194:2;54186:6;54182:15;54175:33;53990:225;:::o;54221:366::-;54363:3;54384:67;54448:2;54443:3;54384:67;:::i;:::-;54377:74;;54460:93;54549:3;54460:93;:::i;:::-;54578:2;54573:3;54569:12;54562:19;;54221:366;;;:::o;54593:419::-;54759:4;54797:2;54786:9;54782:18;54774:26;;54846:9;54840:4;54836:20;54832:1;54821:9;54817:17;54810:47;54874:131;55000:4;54874:131;:::i;:::-;54866:139;;54593:419;;;:::o;55018:179::-;55158:31;55154:1;55146:6;55142:14;55135:55;55018:179;:::o;55203:366::-;55345:3;55366:67;55430:2;55425:3;55366:67;:::i;:::-;55359:74;;55442:93;55531:3;55442:93;:::i;:::-;55560:2;55555:3;55551:12;55544:19;;55203:366;;;:::o;55575:419::-;55741:4;55779:2;55768:9;55764:18;55756:26;;55828:9;55822:4;55818:20;55814:1;55803:9;55799:17;55792:47;55856:131;55982:4;55856:131;:::i;:::-;55848:139;;55575:419;;;:::o;56000:147::-;56101:11;56138:3;56123:18;;56000:147;;;;:::o;56153:386::-;56257:3;56285:38;56317:5;56285:38;:::i;:::-;56339:88;56420:6;56415:3;56339:88;:::i;:::-;56332:95;;56436:65;56494:6;56489:3;56482:4;56475:5;56471:16;56436:65;:::i;:::-;56526:6;56521:3;56517:16;56510:23;;56261:278;56153:386;;;;:::o;56545:271::-;56675:3;56697:93;56786:3;56777:6;56697:93;:::i;:::-;56690:100;;56807:3;56800:10;;56545:271;;;;:::o

Swarm Source

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