ETH Price: $3,468.40 (+1.77%)
Gas: 7 Gwei

Token

 

Overview

Max Total Supply

92

Holders

52

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
mdrfkr.eth
0x60314c86b99a2a108e5097fc2688aa1e3c30be30
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:
EntertainMOutfits

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
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 contracts/metaNightClubStake.sol


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



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



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


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



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


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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)



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

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

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

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

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

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

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

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

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


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


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



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


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



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


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


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



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


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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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



/**
 * @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() {
        
    }

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}
// File @openzeppelin/contracts/utils/cryptography/[email protected]


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



/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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



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

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


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

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

contract MncStakeContract is Ownable {

    event Staked(address owner, uint256 tokenId, uint256 timestamp);
    event Unstaked(address owner, uint256 tokenId, uint256 timestamp);


    struct Stake {
        uint256 tokenId;
        uint256 timestamp;
    }

    IERC721 private mncNftContract;

    mapping(address => Stake[]) public stakes;

    bool public isPaused = true;
    uint256 public stakingPeriod = 90;

    constructor() {
        mncNftContract = IERC721(0x3C044935B01d0cF9E157ef9A64c512e51dB5dFaf);
    }

    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external pure returns (bytes4) {
        return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"));
    }

    function stake(uint256[] memory _tokens) external {
        require(!isPaused, "Staking is paused.");
        require(mncNftContract.balanceOf(msg.sender) >= _tokens.length, "You don't have enough NFTs");

        uint256 timestamp = block.timestamp;

        for (uint256 i = 0; i < _tokens.length; i++) {
            mncNftContract.safeTransferFrom(msg.sender, address(this), _tokens[i]);
            stakes[msg.sender].push(Stake(_tokens[i], timestamp));
            emit Staked(msg.sender, _tokens[i], timestamp);
        }

    }


    function unstake(uint256[] memory _tokenIds) external {
        uint256 senderStakes = stakes[msg.sender].length;

        require(senderStakes > 0, "Address has no stakes.");

        for (uint256 tokenIdsIndex = 0; tokenIdsIndex < _tokenIds.length; tokenIdsIndex++) {
            uint256 _tokenId = _tokenIds[tokenIdsIndex];
            for (uint256 i = 0; i < senderStakes; i++) {
                if (stakes[msg.sender][i].tokenId == _tokenId && stakes[msg.sender][i].timestamp != 0) {
                    uint256 elapsedMins = (block.timestamp - stakes[msg.sender][i].timestamp) / 60;
                    uint256 elapsedDays = elapsedMins / 1440;
                    require(elapsedDays >= stakingPeriod, "Can not unstake before stakingPeriod.");
                    mncNftContract.safeTransferFrom(address(this), msg.sender, _tokenId);

                    //remove staked nft from stake list
                    stakes[msg.sender][i] = stakes[msg.sender][stakes[msg.sender].length - 1];
                    stakes[msg.sender].pop();
                    emit Unstaked(msg.sender, _tokenId, block.timestamp);

                    break;
                }
                if (i == senderStakes - 1) {
                    revert("Provided token id not staked.");
                }
            }
        }
    }

    function ownerStake(address userAddress, uint256 _tokenId) external onlyOwner {
        require(!isPaused, "Staking is paused.");
        uint256 timestamp = block.timestamp;
        mncNftContract.safeTransferFrom(msg.sender, address(this), _tokenId);
        stakes[userAddress].push(Stake(_tokenId, timestamp));
        emit Staked(userAddress, _tokenId, timestamp);
    }


    function getStakes(address _address) external view returns (Stake[] memory) {
        uint256 addressStakes = stakes[_address].length;

        require(addressStakes > 0, "Address has no stakes.");

        Stake[] memory res = new Stake[](addressStakes);

        for (uint256 i = 0; i < addressStakes; i++) {
            if (stakes[_address][i].timestamp != 0) {
                res[i] = Stake(stakes[_address][i].tokenId, stakes[_address][i].timestamp);
            }
        }

        return res;
    }

    function getStakesCount(address _address) public view returns(uint) {
        return stakes[_address].length;
    }

    function getStake(address _address, uint256 index) public view returns(uint256, uint256) {
        Stake storage addressStake = stakes[_address][index];
        return (addressStake.tokenId, addressStake.timestamp);
    }

    function togglePause(bool _state) external onlyOwner {
        isPaused = _state;
    }

    function setStakingPeriod(uint256 _stakingPeriod) external onlyOwner {
        stakingPeriod = _stakingPeriod;
    }

}

contract EntertainMOutfits is ERC1155, Ownable {

    struct Outfit {
        uint256 collectionId;
        uint256 supply;
        uint256 stakersPrice;
        uint256 wlPrice;
        uint256 publicPrice;
        bool mintIsActive;
        bool saleIsActive;
        bool publicSale;
        bytes32 MERKLE_ROOT;
        uint256 maxTokensPerAddress;
        uint256 supplyMinted;
    }

    MncStakeContract private mncStakeContract;

    mapping(uint256 => Outfit) public outfits;
    mapping(uint256 => mapping (address => uint256)) public collectionWalletClaimAmount;
    mapping(uint256 => mapping (address => uint256)) public collectionWalletMintAmount;

    constructor() {
        mncStakeContract = MncStakeContract(0x91217E1CD876DF94AAFA282F8285575469F015d0);
    }

    function whitelistAddresses(uint256 collectionId, address[] memory listOfAddresses) public onlyOwner {
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        for (uint i = 0; i < listOfAddresses.length; i++) {
            collectionWalletClaimAmount[collectionId][listOfAddresses[i]] = 1;
        }
    }

    function claimOutfit(uint256 collectionId, bytes32[] calldata _merkleProof) public {
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        require(outfits[collectionId].mintIsActive, "Mint is not active");
        require(1 + outfits[collectionId].supplyMinted <= outfits[collectionId].supply, "amount exceeds the total collection supply");
        require(collectionWalletMintAmount[collectionId][msg.sender] + 1 <= outfits[collectionId].maxTokensPerAddress, "Mint amount exceeds the max tokens per address");
        if (outfits[collectionId].MERKLE_ROOT != "") {
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(_merkleProof, outfits[collectionId].MERKLE_ROOT, leaf), "Invalid Proof");
        } else {
            require(collectionWalletClaimAmount[collectionId][msg.sender] > 0, "Address has no claims");
        }
        collectionWalletClaimAmount[collectionId][msg.sender] = 0;
        outfits[collectionId].supplyMinted = outfits[collectionId].supplyMinted + 1;
        collectionWalletMintAmount[collectionId][msg.sender] = collectionWalletMintAmount[collectionId][msg.sender] + 1;
        _mint(msg.sender, collectionId, 1, "");
    }

    function mintOutfit(bytes32[] calldata _merkleProof, uint256 collectionId, uint256 amount) public payable {
        require(amount > 0, "Amount should be greater than 0");
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        require(outfits[collectionId].saleIsActive, "Sale is not active");
        require(collectionWalletMintAmount[collectionId][msg.sender] + amount <= outfits[collectionId].maxTokensPerAddress, "Mint amount exceeds the max tokens per address");
        if (outfits[collectionId].publicSale) {
            require(outfits[collectionId].publicPrice * amount <= msg.value, "Wrong ether value send");
        } else {
            if (mncStakeContract.getStakesCount(msg.sender) > 0) {
                require(outfits[collectionId].stakersPrice * amount <= msg.value, "Wrong ether value send");
            } else {
                if (outfits[collectionId].MERKLE_ROOT != "") {
                     bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
                     require(MerkleProof.verify(_merkleProof, outfits[collectionId].MERKLE_ROOT, leaf), "Invalid Proof");
                }
                require(outfits[collectionId].wlPrice * amount <= msg.value, "Wrong ether value send");
            }
        }
        outfits[collectionId].supplyMinted = outfits[collectionId].supplyMinted + amount;
        collectionWalletMintAmount[collectionId][msg.sender] = collectionWalletMintAmount[collectionId][msg.sender] + amount;
        _mint(msg.sender, collectionId, amount, "");
    }

    function addOutfitCollection(uint256 collectionId, uint256 supply, uint256 stakersPrice, uint256 wlPrice, uint256 publicPrice, bool mintIsActive, bool saleIsActive, bool publicSale, bytes32 MERKLE_ROOT, uint256 maxTokensPerAddress) public onlyOwner {
        require(supply > 0, "Supply can not be 0");
        require(outfits[collectionId].supply == 0, "Already exists a collection with this collectionId");
        Outfit memory newOutfitCollection = Outfit( collectionId, supply, stakersPrice, wlPrice, publicPrice, mintIsActive, saleIsActive, publicSale, MERKLE_ROOT, maxTokensPerAddress, 0);
        outfits[collectionId] = newOutfitCollection;
    }

    function changeTokenURI(string memory tokenURI) public onlyOwner {
        _setURI(tokenURI);
    }

    function changeCollectionSupply(uint256 collectionId, uint256 newSupply) public onlyOwner {
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        require(outfits[collectionId].supplyMinted <= newSupply, "Supply can not be lower than minted.");
        outfits[collectionId].supply = newSupply;
    }

    function changeCollectionPrices(uint256 collectionId, uint256 stakersPrice, uint256 wlPrice, uint256 publicPrice) public onlyOwner {
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        outfits[collectionId].stakersPrice = stakersPrice;
        outfits[collectionId].wlPrice = wlPrice;
        outfits[collectionId].publicPrice = publicPrice;
    }

    function flipMintIsActive(uint256 collectionId) public onlyOwner {
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        outfits[collectionId].mintIsActive = !outfits[collectionId].mintIsActive;
    }

    function flipSaleActive(uint256 collectionId) public onlyOwner {
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        outfits[collectionId].saleIsActive = !outfits[collectionId].saleIsActive;
    }

    function flipPublicSale(uint256 collectionId) public onlyOwner {
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        outfits[collectionId].publicSale = !outfits[collectionId].publicSale;
    }

    function changePresaleMerkleRoot(uint256 collectionId, bytes32 newMerkleRoot) public onlyOwner {
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        outfits[collectionId].MERKLE_ROOT = newMerkleRoot;
    }

    function changeMaxTokensPerAddress(uint256 collectionId, uint256 maxTokens) public onlyOwner {
        require(outfits[collectionId].supply > 0, "Collection id not existing");
        outfits[collectionId].maxTokensPerAddress = maxTokens;
    }

    function airDropNft(uint256 collectionId, address ownerAddress, uint256 amount) public onlyOwner {
        require(amount + outfits[collectionId].supplyMinted <= outfits[collectionId].supply, "amount exceeds the total collection supply");
        outfits[collectionId].supplyMinted = outfits[collectionId].supplyMinted + amount;
        _mint(ownerAddress, collectionId, amount, "");
    }

    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function uri(uint256 _id) public view override returns (string memory) {
        require(outfits[_id].supply > 0, "Collection id not existing");
        return string(abi.encodePacked(super.uri(_id), Strings.toString(_id)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"stakersPrice","type":"uint256"},{"internalType":"uint256","name":"wlPrice","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"bool","name":"mintIsActive","type":"bool"},{"internalType":"bool","name":"saleIsActive","type":"bool"},{"internalType":"bool","name":"publicSale","type":"bool"},{"internalType":"bytes32","name":"MERKLE_ROOT","type":"bytes32"},{"internalType":"uint256","name":"maxTokensPerAddress","type":"uint256"}],"name":"addOutfitCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airDropNft","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"stakersPrice","type":"uint256"},{"internalType":"uint256","name":"wlPrice","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"}],"name":"changeCollectionPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"changeCollectionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"maxTokens","type":"uint256"}],"name":"changeMaxTokensPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"changePresaleMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"name":"changeTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"claimOutfit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"collectionWalletClaimAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"collectionWalletMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"flipMintIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"flipPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"flipSaleActive","outputs":[],"stateMutability":"nonpayable","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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintOutfit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"outfits","outputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"stakersPrice","type":"uint256"},{"internalType":"uint256","name":"wlPrice","type":"uint256"},{"internalType":"uint256","name":"publicPrice","type":"uint256"},{"internalType":"bool","name":"mintIsActive","type":"bool"},{"internalType":"bool","name":"saleIsActive","type":"bool"},{"internalType":"bool","name":"publicSale","type":"bool"},{"internalType":"bytes32","name":"MERKLE_ROOT","type":"bytes32"},{"internalType":"uint256","name":"maxTokensPerAddress","type":"uint256"},{"internalType":"uint256","name":"supplyMinted","type":"uint256"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"},{"internalType":"address[]","name":"listOfAddresses","type":"address[]"}],"name":"whitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5062000032620000266200008d60201b60201c565b6200009560201b60201c565b7391217e1cd876df94aafa282f8285575469f015d0600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200015b565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61544d806200016b6000396000f3fe6080604052600436106101b65760003560e01c80635f0cef11116100ec578063a15cbd301161008a578063e23a53a711610064578063e23a53a7146105fa578063e985e9c514610623578063f242432a14610660578063f2fde38b14610689576101b6565b8063a15cbd301461057f578063a22cb465146105a8578063ca97687a146105d1576101b6565b8063715018a6116100c6578063715018a6146104eb5780637d7b17a1146105025780638da5cb5b1461052b5780639b5fdaf314610556576101b6565b80635f0cef111461045257806362eee469146104995780636b684517146104c2576101b6565b806333e80e69116101595780634eb78a6c116101335780634eb78a6c1461039a57806351283541146103c357806353c31f11146103ec5780635b6b369614610429576101b6565b806333e80e691461031d5780633ccfd60b146103465780634e1273f41461035d576101b6565b806304e020851161019557806304e02085146102725780630daf20961461028e5780630e89341c146102b75780632eb2c2d6146102f4576101b6565b8062fdd58e146101bb57806301ffc9a7146101f857806303cd29b014610235575b600080fd5b3480156101c757600080fd5b506101e260048036038101906101dd91906139c1565b6106b2565b6040516101ef9190614d0e565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a9190613ad5565b61077b565b60405161022c91906149d1565b60405180910390f35b34801561024157600080fd5b5061025c60048036038101906102579190613bba565b61085d565b6040516102699190614d0e565b60405180910390f35b61028c60048036038101906102879190613a69565b610882565b005b34801561029a57600080fd5b506102b560048036038101906102b09190613b68565b610e42565b005b3480156102c357600080fd5b506102de60048036038101906102d99190613b68565b610ef8565b6040516102eb91906149ec565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190613837565b610f8c565b005b34801561032957600080fd5b50610344600480360381019061033f9190613c45565b61102d565b005b34801561035257600080fd5b5061035b611148565b005b34801561036957600080fd5b50610384600480360381019061037f91906139fd565b611199565b6040516103919190614978565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613d2d565b61134a565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613bf6565b611423565b005b3480156103f857600080fd5b50610413600480360381019061040e9190613bba565b611501565b6040516104209190614d0e565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190613d2d565b611526565b005b34801561045e57600080fd5b5061047960048036038101906104749190613b68565b6115a6565b6040516104909b9a99989796959493929190614d52565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613d69565b611627565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190613dcc565b6116df565b005b3480156104f757600080fd5b506105006118b1565b005b34801561050e57600080fd5b5061052960048036038101906105249190613b27565b6118c5565b005b34801561053757600080fd5b506105406118d9565b60405161054d919061489b565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613b68565b611903565b005b34801561058b57600080fd5b506105a660048036038101906105a19190613c99565b6119b9565b005b3480156105b457600080fd5b506105cf60048036038101906105ca9190613985565b611e8e565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613b68565b611ea4565b005b34801561060657600080fd5b50610621600480360381019061061c9190613cf1565b611f5a565b005b34801561062f57600080fd5b5061064a600480360381019061064591906137fb565b611fda565b60405161065791906149d1565b60405180910390f35b34801561066c57600080fd5b50610687600480360381019061068291906138f6565b61206e565b005b34801561069557600080fd5b506106b060048036038101906106ab91906137d2565b61210f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a90614ace565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084657507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610856575061085582612193565b5b9050919050565b6007602052816000526040600020602052806000526040600020600091509150505481565b600081116108c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bc90614b2e565b60405180910390fd5b600060056000848152602001908152602001600020600101541161091e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091590614bce565b60405180910390fd5b6005600083815260200190815260200160002060050160019054906101000a900460ff16610981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097890614aee565b60405180910390fd5b6005600083815260200190815260200160002060070154816007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109f49190614f62565b1115610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90614bee565b60405180910390fd5b6005600083815260200190815260200160002060050160029054906101000a900460ff1615610ac75734816005600085815260200190815260200160002060040154610a819190614fe9565b1115610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990614a2e565b60405180910390fd5b610d35565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663549b5bfc336040518263ffffffff1660e01b8152600401610b24919061489b565b60206040518083038186803b158015610b3c57600080fd5b505afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b749190613b91565b1115610be35734816005600085815260200190815260200160002060020154610b9d9190614fe9565b1115610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd590614a2e565b60405180910390fd5b610d34565b6000600560008481526020019081526020016000206006015414610ccf57600033604051602001610c14919061485c565b604051602081830303815290604052805190602001209050610c8e858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506005600086815260200190815260200160002060060154836121fd565b610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc490614c2e565b60405180910390fd5b505b34816005600085815260200190815260200160002060030154610cf29190614fe9565b1115610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614a2e565b60405180910390fd5b5b5b806005600084815260200190815260200160002060080154610d579190614f62565b6005600084815260200190815260200160002060080181905550806007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dcd9190614f62565b6007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e3c33838360405180602001604052806000815250612214565b50505050565b610e4a6123c5565b6000600560008381526020019081526020016000206001015411610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90614bce565b60405180910390fd5b6005600082815260200190815260200160002060050160029054906101000a900460ff16156005600083815260200190815260200160002060050160026101000a81548160ff02191690831515021790555050565b60606000600560008481526020019081526020016000206001015411610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90614bce565b60405180910390fd5b610f5c82612443565b610f65836124d7565b604051602001610f76929190614877565b6040516020818303038152906040529050919050565b610f94612684565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fda5750610fd985610fd4612684565b611fda565b5b611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090614a4e565b60405180910390fd5b611026858585858561268c565b5050505050565b6110356123c5565b600060056000848152602001908152602001600020600101541161108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590614bce565b60405180910390fd5b60005b81518110156111435760016006600085815260200190815260200160002060008484815181106110ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061113b90615169565b915050611091565b505050565b6111506123c5565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611196573d6000803e3d6000fd5b50565b606081518351146111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d690614c8e565b60405180910390fd5b6000835167ffffffffffffffff811115611222577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112505781602001602082028036833780820191505090505b50905060005b845181101561133f576112e985828151811061129b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106112dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516106b2565b828281518110611322577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508061133890615169565b9050611256565b508091505092915050565b6113526123c5565b60006005600084815260200190815260200160002060010154116113ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a290614bce565b60405180910390fd5b8060056000848152602001908152602001600020600801541115611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90614c6e565b60405180910390fd5b8060056000848152602001908152602001600020600101819055505050565b61142b6123c5565b60056000848152602001908152602001600020600101546005600085815260200190815260200160002060080154826114649190614f62565b11156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614b4e565b60405180910390fd5b8060056000858152602001908152602001600020600801546114c79190614f62565b60056000858152602001908152602001600020600801819055506114fc82848360405180602001604052806000815250612214565b505050565b6006602052816000526040600020602052806000526040600020600091509150505481565b61152e6123c5565b6000600560008481526020019081526020016000206001015411611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614bce565b60405180910390fd5b8060056000848152602001908152602001600020600701819055505050565b60056020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff1690806006015490806007015490806008015490508b565b61162f6123c5565b6000600560008681526020019081526020016000206001015411611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614bce565b60405180910390fd5b82600560008681526020019081526020016000206002018190555081600560008681526020019081526020016000206003018190555080600560008681526020019081526020016000206004018190555050505050565b6116e76123c5565b6000891161172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190614c0e565b60405180910390fd5b6000600560008c81526020019081526020016000206001015414611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90614cee565b60405180910390fd5b60006040518061016001604052808c81526020018b81526020018a81526020018981526020018881526020018715158152602001861515815260200185151581526020018481526020018381526020016000815250905080600560008d8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160060155610120820151816007015561014082015181600801559050505050505050505050505050565b6118b96123c5565b6118c360006129fa565b565b6118cd6123c5565b6118d681612ac0565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61190b6123c5565b6000600560008381526020019081526020016000206001015411611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90614bce565b60405180910390fd5b6005600082815260200190815260200160002060050160009054906101000a900460ff16156005600083815260200190815260200160002060050160006101000a81548160ff02191690831515021790555050565b6000600560008581526020019081526020016000206001015411611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0990614bce565b60405180910390fd5b6005600084815260200190815260200160002060050160009054906101000a900460ff16611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c90614bae565b60405180910390fd5b600560008481526020019081526020016000206001015460056000858152602001908152602001600020600801546001611aaf9190614f62565b1115611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614b4e565b60405180910390fd5b600560008481526020019081526020016000206007015460016007600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b649190614f62565b1115611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90614bee565b60405180910390fd5b6000600560008581526020019081526020016000206006015414611c9557600033604051602001611bd6919061485c565b604051602081830303815290604052805190602001209050611c50838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506005600087815260200190815260200160002060060154836121fd565b611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8690614c2e565b60405180910390fd5b50611d29565b60006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f90614a8e565b60405180910390fd5b5b60006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016005600085815260200190815260200160002060080154611da29190614f62565b600560008581526020019081526020016000206008018190555060016007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e199190614f62565b6007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e893384600160405180602001604052806000815250612214565b505050565b611ea0611e99612684565b8383612ada565b5050565b611eac6123c5565b6000600560008381526020019081526020016000206001015411611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc90614bce565b60405180910390fd5b6005600082815260200190815260200160002060050160019054906101000a900460ff16156005600083815260200190815260200160002060050160016101000a81548160ff02191690831515021790555050565b611f626123c5565b6000600560008481526020019081526020016000206001015411611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb290614bce565b60405180910390fd5b8060056000848152602001908152602001600020600601819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612076612684565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806120bc57506120bb856120b6612684565b611fda565b5b6120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f290614a4e565b60405180910390fd5b6121088585858585612c47565b5050505050565b6121176123c5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90614aae565b60405180910390fd5b612190816129fa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008261220a8584612ee3565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227b90614cce565b60405180910390fd5b600061228e612684565b9050600061229b85612f5f565b905060006122a885612f5f565b90506122b983600089858589613025565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123189190614f62565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612396929190614d29565b60405180910390a46123ad8360008985858961302d565b6123bc83600089898989613035565b50505050505050565b6123cd612684565b73ffffffffffffffffffffffffffffffffffffffff166123eb6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890614b8e565b60405180910390fd5b565b60606002805461245290615137565b80601f016020809104026020016040519081016040528092919081815260200182805461247e90615137565b80156124cb5780601f106124a0576101008083540402835291602001916124cb565b820191906000526020600020905b8154815290600101906020018083116124ae57829003601f168201915b50505050509050919050565b6060600082141561251f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061267f565b600082905060005b6000821461255157808061253a90615169565b915050600a8261254a9190614fb8565b9150612527565b60008167ffffffffffffffff811115612593577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125c55781602001600182028036833780820191505090505b5090505b60008514612678576001826125de9190615043565b9150600a856125ed91906151d6565b60306125f99190614f62565b60f81b818381518110612635577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126719190614fb8565b94506125c9565b8093505050505b919050565b600033905090565b81518351146126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790614cae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273790614b0e565b60405180910390fd5b600061274a612684565b905061275a818787878787613025565b60005b84518110156129575760008582815181106127a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106127e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e90614b6e565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293c9190614f62565b925050819055505050508061295090615169565b905061275d565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516129ce92919061499a565b60405180910390a46129e481878787878761302d565b6129f2818787878787613205565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060029080519060200190612ad6929190613456565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4090614c4e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c3a91906149d1565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cae90614b0e565b60405180910390fd5b6000612cc1612684565b90506000612cce85612f5f565b90506000612cdb85612f5f565b9050612ceb838989858589613025565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7990614b6e565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e379190614f62565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612eb4929190614d29565b60405180910390a4612eca848a8a86868a61302d565b612ed8848a8a8a8a8a613035565b505050505050505050565b60008082905060005b8451811015612f5457612f3f82868381518110612f32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516133d5565b91508080612f4c90615169565b915050612eec565b508091505092915050565b60606000600167ffffffffffffffff811115612fa4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612fd25781602001602082028036833780820191505090505b5090508281600081518110613010577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6130548473ffffffffffffffffffffffffffffffffffffffff16613400565b156131fd578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161309a95949392919061491e565b602060405180830381600087803b1580156130b457600080fd5b505af19250505080156130e557506040513d601f19601f820116820180604052508101906130e29190613afe565b60015b613174576130f16152ee565b806130fc5750613139565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313091906149ec565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316b90614a0e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f290614a6e565b60405180910390fd5b505b505050505050565b6132248473ffffffffffffffffffffffffffffffffffffffff16613400565b156133cd578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161326a9594939291906148b6565b602060405180830381600087803b15801561328457600080fd5b505af19250505080156132b557506040513d601f19601f820116820180604052508101906132b29190613afe565b60015b613344576132c16152ee565b806132cc5750613309565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330091906149ec565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333b90614a0e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146133cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c290614a6e565b60405180910390fd5b505b505050505050565b60008183106133ed576133e8828461343f565b6133f8565b6133f7838361343f565b5b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c51119050919050565b600082600052816020526040600020905092915050565b82805461346290615137565b90600052602060002090601f01602090048101928261348457600085556134cb565b82601f1061349d57805160ff19168380011785556134cb565b828001600101855582156134cb579182015b828111156134ca5782518255916020019190600101906134af565b5b5090506134d891906134dc565b5090565b5b808211156134f55760008160009055506001016134dd565b5090565b600061350c61350784614e2e565b614dfd565b9050808382526020820190508285602086028201111561352b57600080fd5b60005b8581101561355b5781613541888261364d565b84526020840193506020830192505060018101905061352e565b5050509392505050565b600061357861357384614e5a565b614dfd565b9050808382526020820190508285602086028201111561359757600080fd5b60005b858110156135c757816135ad88826137a8565b84526020840193506020830192505060018101905061359a565b5050509392505050565b60006135e46135df84614e86565b614dfd565b9050828152602081018484840111156135fc57600080fd5b6136078482856150f5565b509392505050565b600061362261361d84614eb6565b614dfd565b90508281526020810184848401111561363a57600080fd5b6136458482856150f5565b509392505050565b60008135905061365c816153a4565b92915050565b600082601f83011261367357600080fd5b81356136838482602086016134f9565b91505092915050565b60008083601f84011261369e57600080fd5b8235905067ffffffffffffffff8111156136b757600080fd5b6020830191508360208202830111156136cf57600080fd5b9250929050565b600082601f8301126136e757600080fd5b81356136f7848260208601613565565b91505092915050565b60008135905061370f816153bb565b92915050565b600081359050613724816153d2565b92915050565b600081359050613739816153e9565b92915050565b60008151905061374e816153e9565b92915050565b600082601f83011261376557600080fd5b81356137758482602086016135d1565b91505092915050565b600082601f83011261378f57600080fd5b813561379f84826020860161360f565b91505092915050565b6000813590506137b781615400565b92915050565b6000815190506137cc81615400565b92915050565b6000602082840312156137e457600080fd5b60006137f28482850161364d565b91505092915050565b6000806040838503121561380e57600080fd5b600061381c8582860161364d565b925050602061382d8582860161364d565b9150509250929050565b600080600080600060a0868803121561384f57600080fd5b600061385d8882890161364d565b955050602061386e8882890161364d565b945050604086013567ffffffffffffffff81111561388b57600080fd5b613897888289016136d6565b935050606086013567ffffffffffffffff8111156138b457600080fd5b6138c0888289016136d6565b925050608086013567ffffffffffffffff8111156138dd57600080fd5b6138e988828901613754565b9150509295509295909350565b600080600080600060a0868803121561390e57600080fd5b600061391c8882890161364d565b955050602061392d8882890161364d565b945050604061393e888289016137a8565b935050606061394f888289016137a8565b925050608086013567ffffffffffffffff81111561396c57600080fd5b61397888828901613754565b9150509295509295909350565b6000806040838503121561399857600080fd5b60006139a68582860161364d565b92505060206139b785828601613700565b9150509250929050565b600080604083850312156139d457600080fd5b60006139e28582860161364d565b92505060206139f3858286016137a8565b9150509250929050565b60008060408385031215613a1057600080fd5b600083013567ffffffffffffffff811115613a2a57600080fd5b613a3685828601613662565b925050602083013567ffffffffffffffff811115613a5357600080fd5b613a5f858286016136d6565b9150509250929050565b60008060008060608587031215613a7f57600080fd5b600085013567ffffffffffffffff811115613a9957600080fd5b613aa58782880161368c565b94509450506020613ab8878288016137a8565b9250506040613ac9878288016137a8565b91505092959194509250565b600060208284031215613ae757600080fd5b6000613af58482850161372a565b91505092915050565b600060208284031215613b1057600080fd5b6000613b1e8482850161373f565b91505092915050565b600060208284031215613b3957600080fd5b600082013567ffffffffffffffff811115613b5357600080fd5b613b5f8482850161377e565b91505092915050565b600060208284031215613b7a57600080fd5b6000613b88848285016137a8565b91505092915050565b600060208284031215613ba357600080fd5b6000613bb1848285016137bd565b91505092915050565b60008060408385031215613bcd57600080fd5b6000613bdb858286016137a8565b9250506020613bec8582860161364d565b9150509250929050565b600080600060608486031215613c0b57600080fd5b6000613c19868287016137a8565b9350506020613c2a8682870161364d565b9250506040613c3b868287016137a8565b9150509250925092565b60008060408385031215613c5857600080fd5b6000613c66858286016137a8565b925050602083013567ffffffffffffffff811115613c8357600080fd5b613c8f85828601613662565b9150509250929050565b600080600060408486031215613cae57600080fd5b6000613cbc868287016137a8565b935050602084013567ffffffffffffffff811115613cd957600080fd5b613ce58682870161368c565b92509250509250925092565b60008060408385031215613d0457600080fd5b6000613d12858286016137a8565b9250506020613d2385828601613715565b9150509250929050565b60008060408385031215613d4057600080fd5b6000613d4e858286016137a8565b9250506020613d5f858286016137a8565b9150509250929050565b60008060008060808587031215613d7f57600080fd5b6000613d8d878288016137a8565b9450506020613d9e878288016137a8565b9350506040613daf878288016137a8565b9250506060613dc0878288016137a8565b91505092959194509250565b6000806000806000806000806000806101408b8d031215613dec57600080fd5b6000613dfa8d828e016137a8565b9a50506020613e0b8d828e016137a8565b9950506040613e1c8d828e016137a8565b9850506060613e2d8d828e016137a8565b9750506080613e3e8d828e016137a8565b96505060a0613e4f8d828e01613700565b95505060c0613e608d828e01613700565b94505060e0613e718d828e01613700565b935050610100613e838d828e01613715565b925050610120613e958d828e016137a8565b9150509295989b9194979a5092959850565b6000613eb3838361483e565b60208301905092915050565b613ec881615077565b82525050565b613edf613eda82615077565b6151b2565b82525050565b6000613ef082614ef6565b613efa8185614f24565b9350613f0583614ee6565b8060005b83811015613f36578151613f1d8882613ea7565b9750613f2883614f17565b925050600181019050613f09565b5085935050505092915050565b613f4c81615089565b82525050565b613f5b81615095565b82525050565b6000613f6c82614f01565b613f768185614f35565b9350613f86818560208601615104565b613f8f816152c3565b840191505092915050565b6000613fa582614f0c565b613faf8185614f46565b9350613fbf818560208601615104565b613fc8816152c3565b840191505092915050565b6000613fde82614f0c565b613fe88185614f57565b9350613ff8818560208601615104565b80840191505092915050565b6000614011603483614f46565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b6000614077601683614f46565b91507f57726f6e672065746865722076616c75652073656e64000000000000000000006000830152602082019050919050565b60006140b7602f83614f46565b91507f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008301527f6572206e6f7220617070726f76656400000000000000000000000000000000006020830152604082019050919050565b600061411d602883614f46565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614183601583614f46565b91507f4164647265737320686173206e6f20636c61696d7300000000000000000000006000830152602082019050919050565b60006141c3602683614f46565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614229602a83614f46565b91507f455243313135353a2061646472657373207a65726f206973206e6f742061207660008301527f616c6964206f776e6572000000000000000000000000000000000000000000006020830152604082019050919050565b600061428f601283614f46565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b60006142cf602583614f46565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614335601f83614f46565b91507f416d6f756e742073686f756c642062652067726561746572207468616e2030006000830152602082019050919050565b6000614375602a83614f46565b91507f616d6f756e7420657863656564732074686520746f74616c20636f6c6c65637460008301527f696f6e20737570706c79000000000000000000000000000000000000000000006020830152604082019050919050565b60006143db602a83614f46565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b6000614441602083614f46565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614481601283614f46565b91507f4d696e74206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b60006144c1601a83614f46565b91507f436f6c6c656374696f6e206964206e6f74206578697374696e670000000000006000830152602082019050919050565b6000614501602e83614f46565b91507f4d696e7420616d6f756e74206578636565647320746865206d617820746f6b6560008301527f6e732070657220616464726573730000000000000000000000000000000000006020830152604082019050919050565b6000614567601383614f46565b91507f537570706c792063616e206e6f742062652030000000000000000000000000006000830152602082019050919050565b60006145a7600d83614f46565b91507f496e76616c69642050726f6f66000000000000000000000000000000000000006000830152602082019050919050565b60006145e7602983614f46565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b600061464d602483614f46565b91507f537570706c792063616e206e6f74206265206c6f776572207468616e206d696e60008301527f7465642e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146b3602983614f46565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b6000614719602883614f46565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b600061477f602183614f46565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147e5603283614f46565b91507f416c726561647920657869737473206120636f6c6c656374696f6e207769746860008301527f207468697320636f6c6c656374696f6e496400000000000000000000000000006020830152604082019050919050565b614847816150eb565b82525050565b614856816150eb565b82525050565b60006148688284613ece565b60148201915081905092915050565b60006148838285613fd3565b915061488f8284613fd3565b91508190509392505050565b60006020820190506148b06000830184613ebf565b92915050565b600060a0820190506148cb6000830188613ebf565b6148d86020830187613ebf565b81810360408301526148ea8186613ee5565b905081810360608301526148fe8185613ee5565b905081810360808301526149128184613f61565b90509695505050505050565b600060a0820190506149336000830188613ebf565b6149406020830187613ebf565b61494d604083018661484d565b61495a606083018561484d565b818103608083015261496c8184613f61565b90509695505050505050565b600060208201905081810360008301526149928184613ee5565b905092915050565b600060408201905081810360008301526149b48185613ee5565b905081810360208301526149c88184613ee5565b90509392505050565b60006020820190506149e66000830184613f43565b92915050565b60006020820190508181036000830152614a068184613f9a565b905092915050565b60006020820190508181036000830152614a2781614004565b9050919050565b60006020820190508181036000830152614a478161406a565b9050919050565b60006020820190508181036000830152614a67816140aa565b9050919050565b60006020820190508181036000830152614a8781614110565b9050919050565b60006020820190508181036000830152614aa781614176565b9050919050565b60006020820190508181036000830152614ac7816141b6565b9050919050565b60006020820190508181036000830152614ae78161421c565b9050919050565b60006020820190508181036000830152614b0781614282565b9050919050565b60006020820190508181036000830152614b27816142c2565b9050919050565b60006020820190508181036000830152614b4781614328565b9050919050565b60006020820190508181036000830152614b6781614368565b9050919050565b60006020820190508181036000830152614b87816143ce565b9050919050565b60006020820190508181036000830152614ba781614434565b9050919050565b60006020820190508181036000830152614bc781614474565b9050919050565b60006020820190508181036000830152614be7816144b4565b9050919050565b60006020820190508181036000830152614c07816144f4565b9050919050565b60006020820190508181036000830152614c278161455a565b9050919050565b60006020820190508181036000830152614c478161459a565b9050919050565b60006020820190508181036000830152614c67816145da565b9050919050565b60006020820190508181036000830152614c8781614640565b9050919050565b60006020820190508181036000830152614ca7816146a6565b9050919050565b60006020820190508181036000830152614cc78161470c565b9050919050565b60006020820190508181036000830152614ce781614772565b9050919050565b60006020820190508181036000830152614d07816147d8565b9050919050565b6000602082019050614d23600083018461484d565b92915050565b6000604082019050614d3e600083018561484d565b614d4b602083018461484d565b9392505050565b600061016082019050614d68600083018e61484d565b614d75602083018d61484d565b614d82604083018c61484d565b614d8f606083018b61484d565b614d9c608083018a61484d565b614da960a0830189613f43565b614db660c0830188613f43565b614dc360e0830187613f43565b614dd1610100830186613f52565b614ddf61012083018561484d565b614ded61014083018461484d565b9c9b505050505050505050505050565b6000604051905081810181811067ffffffffffffffff82111715614e2457614e23615294565b5b8060405250919050565b600067ffffffffffffffff821115614e4957614e48615294565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e7557614e74615294565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ea157614ea0615294565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614ed157614ed0615294565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f6d826150eb565b9150614f78836150eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fad57614fac615207565b5b828201905092915050565b6000614fc3826150eb565b9150614fce836150eb565b925082614fde57614fdd615236565b5b828204905092915050565b6000614ff4826150eb565b9150614fff836150eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561503857615037615207565b5b828202905092915050565b600061504e826150eb565b9150615059836150eb565b92508282101561506c5761506b615207565b5b828203905092915050565b6000615082826150cb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615122578082015181840152602081019050615107565b83811115615131576000848401525b50505050565b6000600282049050600182168061514f57607f821691505b6020821081141561516357615162615265565b5b50919050565b6000615174826150eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151a7576151a6615207565b5b600182019050919050565b60006151bd826151c4565b9050919050565b60006151cf826152d4565b9050919050565b60006151e1826150eb565b91506151ec836150eb565b9250826151fc576151fb615236565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d10156152fe576153a1565b60046000803e61530f6000516152e1565b6308c379a0811461532057506153a1565b60405160043d036004823e80513d602482011167ffffffffffffffff8211171561534c575050506153a1565b808201805167ffffffffffffffff81111561536b5750505050506153a1565b8060208301013d8501811115615386575050505050506153a1565b61538f826152c3565b60208401016040528296505050505050505b90565b6153ad81615077565b81146153b857600080fd5b50565b6153c481615089565b81146153cf57600080fd5b50565b6153db81615095565b81146153e657600080fd5b50565b6153f28161509f565b81146153fd57600080fd5b50565b615409816150eb565b811461541457600080fd5b5056fea26469706673582212208f21b9bf807f7ad6e7ac3fc8d12c1456aa03fa28b20a965ea12de27581c0026564736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101b65760003560e01c80635f0cef11116100ec578063a15cbd301161008a578063e23a53a711610064578063e23a53a7146105fa578063e985e9c514610623578063f242432a14610660578063f2fde38b14610689576101b6565b8063a15cbd301461057f578063a22cb465146105a8578063ca97687a146105d1576101b6565b8063715018a6116100c6578063715018a6146104eb5780637d7b17a1146105025780638da5cb5b1461052b5780639b5fdaf314610556576101b6565b80635f0cef111461045257806362eee469146104995780636b684517146104c2576101b6565b806333e80e69116101595780634eb78a6c116101335780634eb78a6c1461039a57806351283541146103c357806353c31f11146103ec5780635b6b369614610429576101b6565b806333e80e691461031d5780633ccfd60b146103465780634e1273f41461035d576101b6565b806304e020851161019557806304e02085146102725780630daf20961461028e5780630e89341c146102b75780632eb2c2d6146102f4576101b6565b8062fdd58e146101bb57806301ffc9a7146101f857806303cd29b014610235575b600080fd5b3480156101c757600080fd5b506101e260048036038101906101dd91906139c1565b6106b2565b6040516101ef9190614d0e565b60405180910390f35b34801561020457600080fd5b5061021f600480360381019061021a9190613ad5565b61077b565b60405161022c91906149d1565b60405180910390f35b34801561024157600080fd5b5061025c60048036038101906102579190613bba565b61085d565b6040516102699190614d0e565b60405180910390f35b61028c60048036038101906102879190613a69565b610882565b005b34801561029a57600080fd5b506102b560048036038101906102b09190613b68565b610e42565b005b3480156102c357600080fd5b506102de60048036038101906102d99190613b68565b610ef8565b6040516102eb91906149ec565b60405180910390f35b34801561030057600080fd5b5061031b60048036038101906103169190613837565b610f8c565b005b34801561032957600080fd5b50610344600480360381019061033f9190613c45565b61102d565b005b34801561035257600080fd5b5061035b611148565b005b34801561036957600080fd5b50610384600480360381019061037f91906139fd565b611199565b6040516103919190614978565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613d2d565b61134a565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613bf6565b611423565b005b3480156103f857600080fd5b50610413600480360381019061040e9190613bba565b611501565b6040516104209190614d0e565b60405180910390f35b34801561043557600080fd5b50610450600480360381019061044b9190613d2d565b611526565b005b34801561045e57600080fd5b5061047960048036038101906104749190613b68565b6115a6565b6040516104909b9a99989796959493929190614d52565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190613d69565b611627565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190613dcc565b6116df565b005b3480156104f757600080fd5b506105006118b1565b005b34801561050e57600080fd5b5061052960048036038101906105249190613b27565b6118c5565b005b34801561053757600080fd5b506105406118d9565b60405161054d919061489b565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613b68565b611903565b005b34801561058b57600080fd5b506105a660048036038101906105a19190613c99565b6119b9565b005b3480156105b457600080fd5b506105cf60048036038101906105ca9190613985565b611e8e565b005b3480156105dd57600080fd5b506105f860048036038101906105f39190613b68565b611ea4565b005b34801561060657600080fd5b50610621600480360381019061061c9190613cf1565b611f5a565b005b34801561062f57600080fd5b5061064a600480360381019061064591906137fb565b611fda565b60405161065791906149d1565b60405180910390f35b34801561066c57600080fd5b50610687600480360381019061068291906138f6565b61206e565b005b34801561069557600080fd5b506106b060048036038101906106ab91906137d2565b61210f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071a90614ace565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084657507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610856575061085582612193565b5b9050919050565b6007602052816000526040600020602052806000526040600020600091509150505481565b600081116108c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bc90614b2e565b60405180910390fd5b600060056000848152602001908152602001600020600101541161091e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091590614bce565b60405180910390fd5b6005600083815260200190815260200160002060050160019054906101000a900460ff16610981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097890614aee565b60405180910390fd5b6005600083815260200190815260200160002060070154816007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546109f49190614f62565b1115610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c90614bee565b60405180910390fd5b6005600083815260200190815260200160002060050160029054906101000a900460ff1615610ac75734816005600085815260200190815260200160002060040154610a819190614fe9565b1115610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990614a2e565b60405180910390fd5b610d35565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663549b5bfc336040518263ffffffff1660e01b8152600401610b24919061489b565b60206040518083038186803b158015610b3c57600080fd5b505afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b749190613b91565b1115610be35734816005600085815260200190815260200160002060020154610b9d9190614fe9565b1115610bde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd590614a2e565b60405180910390fd5b610d34565b6000600560008481526020019081526020016000206006015414610ccf57600033604051602001610c14919061485c565b604051602081830303815290604052805190602001209050610c8e858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506005600086815260200190815260200160002060060154836121fd565b610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc490614c2e565b60405180910390fd5b505b34816005600085815260200190815260200160002060030154610cf29190614fe9565b1115610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614a2e565b60405180910390fd5b5b5b806005600084815260200190815260200160002060080154610d579190614f62565b6005600084815260200190815260200160002060080181905550806007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610dcd9190614f62565b6007600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e3c33838360405180602001604052806000815250612214565b50505050565b610e4a6123c5565b6000600560008381526020019081526020016000206001015411610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a90614bce565b60405180910390fd5b6005600082815260200190815260200160002060050160029054906101000a900460ff16156005600083815260200190815260200160002060050160026101000a81548160ff02191690831515021790555050565b60606000600560008481526020019081526020016000206001015411610f53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4a90614bce565b60405180910390fd5b610f5c82612443565b610f65836124d7565b604051602001610f76929190614877565b6040516020818303038152906040529050919050565b610f94612684565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fda5750610fd985610fd4612684565b611fda565b5b611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101090614a4e565b60405180910390fd5b611026858585858561268c565b5050505050565b6110356123c5565b600060056000848152602001908152602001600020600101541161108e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108590614bce565b60405180910390fd5b60005b81518110156111435760016006600085815260200190815260200160002060008484815181106110ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061113b90615169565b915050611091565b505050565b6111506123c5565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611196573d6000803e3d6000fd5b50565b606081518351146111df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d690614c8e565b60405180910390fd5b6000835167ffffffffffffffff811115611222577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112505781602001602082028036833780820191505090505b50905060005b845181101561133f576112e985828151811061129b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106112dc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516106b2565b828281518110611322577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508061133890615169565b9050611256565b508091505092915050565b6113526123c5565b60006005600084815260200190815260200160002060010154116113ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a290614bce565b60405180910390fd5b8060056000848152602001908152602001600020600801541115611404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fb90614c6e565b60405180910390fd5b8060056000848152602001908152602001600020600101819055505050565b61142b6123c5565b60056000848152602001908152602001600020600101546005600085815260200190815260200160002060080154826114649190614f62565b11156114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90614b4e565b60405180910390fd5b8060056000858152602001908152602001600020600801546114c79190614f62565b60056000858152602001908152602001600020600801819055506114fc82848360405180602001604052806000815250612214565b505050565b6006602052816000526040600020602052806000526040600020600091509150505481565b61152e6123c5565b6000600560008481526020019081526020016000206001015411611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614bce565b60405180910390fd5b8060056000848152602001908152602001600020600701819055505050565b60056020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900460ff16908060050160019054906101000a900460ff16908060050160029054906101000a900460ff1690806006015490806007015490806008015490508b565b61162f6123c5565b6000600560008681526020019081526020016000206001015411611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f90614bce565b60405180910390fd5b82600560008681526020019081526020016000206002018190555081600560008681526020019081526020016000206003018190555080600560008681526020019081526020016000206004018190555050505050565b6116e76123c5565b6000891161172a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172190614c0e565b60405180910390fd5b6000600560008c81526020019081526020016000206001015414611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90614cee565b60405180910390fd5b60006040518061016001604052808c81526020018b81526020018a81526020018981526020018881526020018715158152602001861515815260200185151581526020018481526020018381526020016000815250905080600560008d8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548160ff02191690831515021790555060c08201518160050160016101000a81548160ff02191690831515021790555060e08201518160050160026101000a81548160ff0219169083151502179055506101008201518160060155610120820151816007015561014082015181600801559050505050505050505050505050565b6118b96123c5565b6118c360006129fa565b565b6118cd6123c5565b6118d681612ac0565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61190b6123c5565b6000600560008381526020019081526020016000206001015411611964576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195b90614bce565b60405180910390fd5b6005600082815260200190815260200160002060050160009054906101000a900460ff16156005600083815260200190815260200160002060050160006101000a81548160ff02191690831515021790555050565b6000600560008581526020019081526020016000206001015411611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0990614bce565b60405180910390fd5b6005600084815260200190815260200160002060050160009054906101000a900460ff16611a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6c90614bae565b60405180910390fd5b600560008481526020019081526020016000206001015460056000858152602001908152602001600020600801546001611aaf9190614f62565b1115611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614b4e565b60405180910390fd5b600560008481526020019081526020016000206007015460016007600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b649190614f62565b1115611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c90614bee565b60405180910390fd5b6000600560008581526020019081526020016000206006015414611c9557600033604051602001611bd6919061485c565b604051602081830303815290604052805190602001209050611c50838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506005600087815260200190815260200160002060060154836121fd565b611c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8690614c2e565b60405180910390fd5b50611d29565b60006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f90614a8e565b60405180910390fd5b5b60006006600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060016005600085815260200190815260200160002060080154611da29190614f62565b600560008581526020019081526020016000206008018190555060016007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e199190614f62565b6007600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e893384600160405180602001604052806000815250612214565b505050565b611ea0611e99612684565b8383612ada565b5050565b611eac6123c5565b6000600560008381526020019081526020016000206001015411611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc90614bce565b60405180910390fd5b6005600082815260200190815260200160002060050160019054906101000a900460ff16156005600083815260200190815260200160002060050160016101000a81548160ff02191690831515021790555050565b611f626123c5565b6000600560008481526020019081526020016000206001015411611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb290614bce565b60405180910390fd5b8060056000848152602001908152602001600020600601819055505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612076612684565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806120bc57506120bb856120b6612684565b611fda565b5b6120fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f290614a4e565b60405180910390fd5b6121088585858585612c47565b5050505050565b6121176123c5565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90614aae565b60405180910390fd5b612190816129fa565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008261220a8584612ee3565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227b90614cce565b60405180910390fd5b600061228e612684565b9050600061229b85612f5f565b905060006122a885612f5f565b90506122b983600089858589613025565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123189190614f62565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612396929190614d29565b60405180910390a46123ad8360008985858961302d565b6123bc83600089898989613035565b50505050505050565b6123cd612684565b73ffffffffffffffffffffffffffffffffffffffff166123eb6118d9565b73ffffffffffffffffffffffffffffffffffffffff1614612441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243890614b8e565b60405180910390fd5b565b60606002805461245290615137565b80601f016020809104026020016040519081016040528092919081815260200182805461247e90615137565b80156124cb5780601f106124a0576101008083540402835291602001916124cb565b820191906000526020600020905b8154815290600101906020018083116124ae57829003601f168201915b50505050509050919050565b6060600082141561251f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061267f565b600082905060005b6000821461255157808061253a90615169565b915050600a8261254a9190614fb8565b9150612527565b60008167ffffffffffffffff811115612593577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125c55781602001600182028036833780820191505090505b5090505b60008514612678576001826125de9190615043565b9150600a856125ed91906151d6565b60306125f99190614f62565b60f81b818381518110612635577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126719190614fb8565b94506125c9565b8093505050505b919050565b600033905090565b81518351146126d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c790614cae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273790614b0e565b60405180910390fd5b600061274a612684565b905061275a818787878787613025565b60005b84518110156129575760008582815181106127a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008583815181106127e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287e90614b6e565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461293c9190614f62565b925050819055505050508061295090615169565b905061275d565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516129ce92919061499a565b60405180910390a46129e481878787878761302d565b6129f2818787878787613205565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060029080519060200190612ad6929190613456565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4090614c4e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612c3a91906149d1565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cae90614b0e565b60405180910390fd5b6000612cc1612684565b90506000612cce85612f5f565b90506000612cdb85612f5f565b9050612ceb838989858589613025565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7990614b6e565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e379190614f62565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612eb4929190614d29565b60405180910390a4612eca848a8a86868a61302d565b612ed8848a8a8a8a8a613035565b505050505050505050565b60008082905060005b8451811015612f5457612f3f82868381518110612f32577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516133d5565b91508080612f4c90615169565b915050612eec565b508091505092915050565b60606000600167ffffffffffffffff811115612fa4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612fd25781602001602082028036833780820191505090505b5090508281600081518110613010577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b505050505050565b505050505050565b6130548473ffffffffffffffffffffffffffffffffffffffff16613400565b156131fd578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161309a95949392919061491e565b602060405180830381600087803b1580156130b457600080fd5b505af19250505080156130e557506040513d601f19601f820116820180604052508101906130e29190613afe565b60015b613174576130f16152ee565b806130fc5750613139565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313091906149ec565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316b90614a0e565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f290614a6e565b60405180910390fd5b505b505050505050565b6132248473ffffffffffffffffffffffffffffffffffffffff16613400565b156133cd578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161326a9594939291906148b6565b602060405180830381600087803b15801561328457600080fd5b505af19250505080156132b557506040513d601f19601f820116820180604052508101906132b29190613afe565b60015b613344576132c16152ee565b806132cc5750613309565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330091906149ec565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333b90614a0e565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146133cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c290614a6e565b60405180910390fd5b505b505050505050565b60008183106133ed576133e8828461343f565b6133f8565b6133f7838361343f565b5b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff16803b806020016040519081016040528181526000908060200190933c51119050919050565b600082600052816020526040600020905092915050565b82805461346290615137565b90600052602060002090601f01602090048101928261348457600085556134cb565b82601f1061349d57805160ff19168380011785556134cb565b828001600101855582156134cb579182015b828111156134ca5782518255916020019190600101906134af565b5b5090506134d891906134dc565b5090565b5b808211156134f55760008160009055506001016134dd565b5090565b600061350c61350784614e2e565b614dfd565b9050808382526020820190508285602086028201111561352b57600080fd5b60005b8581101561355b5781613541888261364d565b84526020840193506020830192505060018101905061352e565b5050509392505050565b600061357861357384614e5a565b614dfd565b9050808382526020820190508285602086028201111561359757600080fd5b60005b858110156135c757816135ad88826137a8565b84526020840193506020830192505060018101905061359a565b5050509392505050565b60006135e46135df84614e86565b614dfd565b9050828152602081018484840111156135fc57600080fd5b6136078482856150f5565b509392505050565b600061362261361d84614eb6565b614dfd565b90508281526020810184848401111561363a57600080fd5b6136458482856150f5565b509392505050565b60008135905061365c816153a4565b92915050565b600082601f83011261367357600080fd5b81356136838482602086016134f9565b91505092915050565b60008083601f84011261369e57600080fd5b8235905067ffffffffffffffff8111156136b757600080fd5b6020830191508360208202830111156136cf57600080fd5b9250929050565b600082601f8301126136e757600080fd5b81356136f7848260208601613565565b91505092915050565b60008135905061370f816153bb565b92915050565b600081359050613724816153d2565b92915050565b600081359050613739816153e9565b92915050565b60008151905061374e816153e9565b92915050565b600082601f83011261376557600080fd5b81356137758482602086016135d1565b91505092915050565b600082601f83011261378f57600080fd5b813561379f84826020860161360f565b91505092915050565b6000813590506137b781615400565b92915050565b6000815190506137cc81615400565b92915050565b6000602082840312156137e457600080fd5b60006137f28482850161364d565b91505092915050565b6000806040838503121561380e57600080fd5b600061381c8582860161364d565b925050602061382d8582860161364d565b9150509250929050565b600080600080600060a0868803121561384f57600080fd5b600061385d8882890161364d565b955050602061386e8882890161364d565b945050604086013567ffffffffffffffff81111561388b57600080fd5b613897888289016136d6565b935050606086013567ffffffffffffffff8111156138b457600080fd5b6138c0888289016136d6565b925050608086013567ffffffffffffffff8111156138dd57600080fd5b6138e988828901613754565b9150509295509295909350565b600080600080600060a0868803121561390e57600080fd5b600061391c8882890161364d565b955050602061392d8882890161364d565b945050604061393e888289016137a8565b935050606061394f888289016137a8565b925050608086013567ffffffffffffffff81111561396c57600080fd5b61397888828901613754565b9150509295509295909350565b6000806040838503121561399857600080fd5b60006139a68582860161364d565b92505060206139b785828601613700565b9150509250929050565b600080604083850312156139d457600080fd5b60006139e28582860161364d565b92505060206139f3858286016137a8565b9150509250929050565b60008060408385031215613a1057600080fd5b600083013567ffffffffffffffff811115613a2a57600080fd5b613a3685828601613662565b925050602083013567ffffffffffffffff811115613a5357600080fd5b613a5f858286016136d6565b9150509250929050565b60008060008060608587031215613a7f57600080fd5b600085013567ffffffffffffffff811115613a9957600080fd5b613aa58782880161368c565b94509450506020613ab8878288016137a8565b9250506040613ac9878288016137a8565b91505092959194509250565b600060208284031215613ae757600080fd5b6000613af58482850161372a565b91505092915050565b600060208284031215613b1057600080fd5b6000613b1e8482850161373f565b91505092915050565b600060208284031215613b3957600080fd5b600082013567ffffffffffffffff811115613b5357600080fd5b613b5f8482850161377e565b91505092915050565b600060208284031215613b7a57600080fd5b6000613b88848285016137a8565b91505092915050565b600060208284031215613ba357600080fd5b6000613bb1848285016137bd565b91505092915050565b60008060408385031215613bcd57600080fd5b6000613bdb858286016137a8565b9250506020613bec8582860161364d565b9150509250929050565b600080600060608486031215613c0b57600080fd5b6000613c19868287016137a8565b9350506020613c2a8682870161364d565b9250506040613c3b868287016137a8565b9150509250925092565b60008060408385031215613c5857600080fd5b6000613c66858286016137a8565b925050602083013567ffffffffffffffff811115613c8357600080fd5b613c8f85828601613662565b9150509250929050565b600080600060408486031215613cae57600080fd5b6000613cbc868287016137a8565b935050602084013567ffffffffffffffff811115613cd957600080fd5b613ce58682870161368c565b92509250509250925092565b60008060408385031215613d0457600080fd5b6000613d12858286016137a8565b9250506020613d2385828601613715565b9150509250929050565b60008060408385031215613d4057600080fd5b6000613d4e858286016137a8565b9250506020613d5f858286016137a8565b9150509250929050565b60008060008060808587031215613d7f57600080fd5b6000613d8d878288016137a8565b9450506020613d9e878288016137a8565b9350506040613daf878288016137a8565b9250506060613dc0878288016137a8565b91505092959194509250565b6000806000806000806000806000806101408b8d031215613dec57600080fd5b6000613dfa8d828e016137a8565b9a50506020613e0b8d828e016137a8565b9950506040613e1c8d828e016137a8565b9850506060613e2d8d828e016137a8565b9750506080613e3e8d828e016137a8565b96505060a0613e4f8d828e01613700565b95505060c0613e608d828e01613700565b94505060e0613e718d828e01613700565b935050610100613e838d828e01613715565b925050610120613e958d828e016137a8565b9150509295989b9194979a5092959850565b6000613eb3838361483e565b60208301905092915050565b613ec881615077565b82525050565b613edf613eda82615077565b6151b2565b82525050565b6000613ef082614ef6565b613efa8185614f24565b9350613f0583614ee6565b8060005b83811015613f36578151613f1d8882613ea7565b9750613f2883614f17565b925050600181019050613f09565b5085935050505092915050565b613f4c81615089565b82525050565b613f5b81615095565b82525050565b6000613f6c82614f01565b613f768185614f35565b9350613f86818560208601615104565b613f8f816152c3565b840191505092915050565b6000613fa582614f0c565b613faf8185614f46565b9350613fbf818560208601615104565b613fc8816152c3565b840191505092915050565b6000613fde82614f0c565b613fe88185614f57565b9350613ff8818560208601615104565b80840191505092915050565b6000614011603483614f46565b91507f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008301527f526563656976657220696d706c656d656e7465720000000000000000000000006020830152604082019050919050565b6000614077601683614f46565b91507f57726f6e672065746865722076616c75652073656e64000000000000000000006000830152602082019050919050565b60006140b7602f83614f46565b91507f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008301527f6572206e6f7220617070726f76656400000000000000000000000000000000006020830152604082019050919050565b600061411d602883614f46565b91507f455243313135353a204552433131353552656365697665722072656a6563746560008301527f6420746f6b656e730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614183601583614f46565b91507f4164647265737320686173206e6f20636c61696d7300000000000000000000006000830152602082019050919050565b60006141c3602683614f46565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614229602a83614f46565b91507f455243313135353a2061646472657373207a65726f206973206e6f742061207660008301527f616c6964206f776e6572000000000000000000000000000000000000000000006020830152604082019050919050565b600061428f601283614f46565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b60006142cf602583614f46565b91507f455243313135353a207472616e7366657220746f20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614335601f83614f46565b91507f416d6f756e742073686f756c642062652067726561746572207468616e2030006000830152602082019050919050565b6000614375602a83614f46565b91507f616d6f756e7420657863656564732074686520746f74616c20636f6c6c65637460008301527f696f6e20737570706c79000000000000000000000000000000000000000000006020830152604082019050919050565b60006143db602a83614f46565b91507f455243313135353a20696e73756666696369656e742062616c616e636520666f60008301527f72207472616e73666572000000000000000000000000000000000000000000006020830152604082019050919050565b6000614441602083614f46565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614481601283614f46565b91507f4d696e74206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b60006144c1601a83614f46565b91507f436f6c6c656374696f6e206964206e6f74206578697374696e670000000000006000830152602082019050919050565b6000614501602e83614f46565b91507f4d696e7420616d6f756e74206578636565647320746865206d617820746f6b6560008301527f6e732070657220616464726573730000000000000000000000000000000000006020830152604082019050919050565b6000614567601383614f46565b91507f537570706c792063616e206e6f742062652030000000000000000000000000006000830152602082019050919050565b60006145a7600d83614f46565b91507f496e76616c69642050726f6f66000000000000000000000000000000000000006000830152602082019050919050565b60006145e7602983614f46565b91507f455243313135353a2073657474696e6720617070726f76616c2073746174757360008301527f20666f722073656c6600000000000000000000000000000000000000000000006020830152604082019050919050565b600061464d602483614f46565b91507f537570706c792063616e206e6f74206265206c6f776572207468616e206d696e60008301527f7465642e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146b3602983614f46565b91507f455243313135353a206163636f756e747320616e6420696473206c656e67746860008301527f206d69736d6174636800000000000000000000000000000000000000000000006020830152604082019050919050565b6000614719602883614f46565b91507f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008301527f6d69736d617463680000000000000000000000000000000000000000000000006020830152604082019050919050565b600061477f602183614f46565b91507f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147e5603283614f46565b91507f416c726561647920657869737473206120636f6c6c656374696f6e207769746860008301527f207468697320636f6c6c656374696f6e496400000000000000000000000000006020830152604082019050919050565b614847816150eb565b82525050565b614856816150eb565b82525050565b60006148688284613ece565b60148201915081905092915050565b60006148838285613fd3565b915061488f8284613fd3565b91508190509392505050565b60006020820190506148b06000830184613ebf565b92915050565b600060a0820190506148cb6000830188613ebf565b6148d86020830187613ebf565b81810360408301526148ea8186613ee5565b905081810360608301526148fe8185613ee5565b905081810360808301526149128184613f61565b90509695505050505050565b600060a0820190506149336000830188613ebf565b6149406020830187613ebf565b61494d604083018661484d565b61495a606083018561484d565b818103608083015261496c8184613f61565b90509695505050505050565b600060208201905081810360008301526149928184613ee5565b905092915050565b600060408201905081810360008301526149b48185613ee5565b905081810360208301526149c88184613ee5565b90509392505050565b60006020820190506149e66000830184613f43565b92915050565b60006020820190508181036000830152614a068184613f9a565b905092915050565b60006020820190508181036000830152614a2781614004565b9050919050565b60006020820190508181036000830152614a478161406a565b9050919050565b60006020820190508181036000830152614a67816140aa565b9050919050565b60006020820190508181036000830152614a8781614110565b9050919050565b60006020820190508181036000830152614aa781614176565b9050919050565b60006020820190508181036000830152614ac7816141b6565b9050919050565b60006020820190508181036000830152614ae78161421c565b9050919050565b60006020820190508181036000830152614b0781614282565b9050919050565b60006020820190508181036000830152614b27816142c2565b9050919050565b60006020820190508181036000830152614b4781614328565b9050919050565b60006020820190508181036000830152614b6781614368565b9050919050565b60006020820190508181036000830152614b87816143ce565b9050919050565b60006020820190508181036000830152614ba781614434565b9050919050565b60006020820190508181036000830152614bc781614474565b9050919050565b60006020820190508181036000830152614be7816144b4565b9050919050565b60006020820190508181036000830152614c07816144f4565b9050919050565b60006020820190508181036000830152614c278161455a565b9050919050565b60006020820190508181036000830152614c478161459a565b9050919050565b60006020820190508181036000830152614c67816145da565b9050919050565b60006020820190508181036000830152614c8781614640565b9050919050565b60006020820190508181036000830152614ca7816146a6565b9050919050565b60006020820190508181036000830152614cc78161470c565b9050919050565b60006020820190508181036000830152614ce781614772565b9050919050565b60006020820190508181036000830152614d07816147d8565b9050919050565b6000602082019050614d23600083018461484d565b92915050565b6000604082019050614d3e600083018561484d565b614d4b602083018461484d565b9392505050565b600061016082019050614d68600083018e61484d565b614d75602083018d61484d565b614d82604083018c61484d565b614d8f606083018b61484d565b614d9c608083018a61484d565b614da960a0830189613f43565b614db660c0830188613f43565b614dc360e0830187613f43565b614dd1610100830186613f52565b614ddf61012083018561484d565b614ded61014083018461484d565b9c9b505050505050505050505050565b6000604051905081810181811067ffffffffffffffff82111715614e2457614e23615294565b5b8060405250919050565b600067ffffffffffffffff821115614e4957614e48615294565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614e7557614e74615294565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614ea157614ea0615294565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614ed157614ed0615294565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f6d826150eb565b9150614f78836150eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fad57614fac615207565b5b828201905092915050565b6000614fc3826150eb565b9150614fce836150eb565b925082614fde57614fdd615236565b5b828204905092915050565b6000614ff4826150eb565b9150614fff836150eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561503857615037615207565b5b828202905092915050565b600061504e826150eb565b9150615059836150eb565b92508282101561506c5761506b615207565b5b828203905092915050565b6000615082826150cb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615122578082015181840152602081019050615107565b83811115615131576000848401525b50505050565b6000600282049050600182168061514f57607f821691505b6020821081141561516357615162615265565b5b50919050565b6000615174826150eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151a7576151a6615207565b5b600182019050919050565b60006151bd826151c4565b9050919050565b60006151cf826152d4565b9050919050565b60006151e1826150eb565b91506151ec836150eb565b9250826151fc576151fb615236565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b600060443d10156152fe576153a1565b60046000803e61530f6000516152e1565b6308c379a0811461532057506153a1565b60405160043d036004823e80513d602482011167ffffffffffffffff8211171561534c575050506153a1565b808201805167ffffffffffffffff81111561536b5750505050506153a1565b8060208301013d8501811115615386575050505050506153a1565b61538f826152c3565b60208401016040528296505050505050505b90565b6153ad81615077565b81146153b857600080fd5b50565b6153c481615089565b81146153cf57600080fd5b50565b6153db81615095565b81146153e657600080fd5b50565b6153f28161509f565b81146153fd57600080fd5b50565b615409816150eb565b811461541457600080fd5b5056fea26469706673582212208f21b9bf807f7ad6e7ac3fc8d12c1456aa03fa28b20a965ea12de27581c0026564736f6c63430008000033

Deployed Bytecode Sourcemap

60091:7513:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23406:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22429:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60689:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62514:1572;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66104:232;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67368:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25350:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60900:343;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67253:107;;;;;;;;;;;;;:::i;:::-;;23802:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64871:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66852:393;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60599:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66597:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60551:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;65217:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64094:660;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4633:103;;;;;;;;;;;;;:::i;:::-;;64762:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3985:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65614:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61251:1255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24399:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65860:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66344:245;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24626:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24866:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4891:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23406:230;23492:7;23539:1;23520:21;;:7;:21;;;;23512:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23606:9;:13;23616:2;23606:13;;;;;;;;;;;:22;23620:7;23606:22;;;;;;;;;;;;;;;;23599:29;;23406:230;;;;:::o;22429:310::-;22531:4;22583:26;22568:41;;;:11;:41;;;;:110;;;;22641:37;22626:52;;;:11;:52;;;;22568:110;:163;;;;22695:36;22719:11;22695:23;:36::i;:::-;22568:163;22548:183;;22429:310;;;:::o;60689:82::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62514:1572::-;62648:1;62639:6;:10;62631:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;62735:1;62704:7;:21;62712:12;62704:21;;;;;;;;;;;:28;;;:32;62696:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62786:7;:21;62794:12;62786:21;;;;;;;;;;;:34;;;;;;;;;;;;62778:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;62927:7;:21;62935:12;62927:21;;;;;;;;;;;:41;;;62917:6;62862:26;:40;62889:12;62862:40;;;;;;;;;;;:52;62903:10;62862:52;;;;;;;;;;;;;;;;:61;;;;:::i;:::-;:106;;62854:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;63034:7;:21;63042:12;63034:21;;;;;;;;;;;:32;;;;;;;;;;;;63030:777;;;63137:9;63127:6;63091:7;:21;63099:12;63091:21;;;;;;;;;;;:33;;;:42;;;;:::i;:::-;:55;;63083:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;63030:777;;;63256:1;63210:16;;;;;;;;;;;:31;;;63242:10;63210:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;63206:590;;;63333:9;63323:6;63286:7;:21;63294:12;63286:21;;;;;;;;;;;:34;;;:43;;;;:::i;:::-;:56;;63278:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;63206:590;;;63414:39;:7;:21;63422:12;63414:21;;;;;;;;;;;:33;;;:39;63410:266;;63479:12;63521:10;63504:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;63494:39;;;;;;63479:54;;63565:73;63584:12;;63565:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63598:7;:21;63606:12;63598:21;;;;;;;;;;;:33;;;63633:4;63565:18;:73::i;:::-;63557:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;63410:266;;63744:9;63734:6;63702:7;:21;63710:12;63702:21;;;;;;;;;;;:29;;;:38;;;;:::i;:::-;:51;;63694:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;63206:590;63030:777;63891:6;63854:7;:21;63862:12;63854:21;;;;;;;;;;;:34;;;:43;;;;:::i;:::-;63817:7;:21;63825:12;63817:21;;;;;;;;;;;:34;;:80;;;;64018:6;63963:26;:40;63990:12;63963:40;;;;;;;;;;;:52;64004:10;63963:52;;;;;;;;;;;;;;;;:61;;;;:::i;:::-;63908:26;:40;63935:12;63908:40;;;;;;;;;;;:52;63949:10;63908:52;;;;;;;;;;;;;;;:116;;;;64035:43;64041:10;64053:12;64067:6;64035:43;;;;;;;;;;;;:5;:43::i;:::-;62514:1572;;;;:::o;66104:232::-;3871:13;:11;:13::i;:::-;66217:1:::1;66186:7;:21;66194:12;66186:21;;;;;;;;;;;:28;;;:32;66178:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;66296:7;:21;66304:12;66296:21;;;;;;;;;;;:32;;;;;;;;;;;;66295:33;66260:7;:21;66268:12;66260:21;;;;;;;;;;;:32;;;:68;;;;;;;;;;;;;;;;;;66104:232:::0;:::o;67368:233::-;67424:13;67480:1;67458:7;:12;67466:3;67458:12;;;;;;;;;;;:19;;;:23;67450:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;67554:14;67564:3;67554:9;:14::i;:::-;67570:21;67587:3;67570:16;:21::i;:::-;67537:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67523:70;;67368:233;;;:::o;25350:439::-;25591:12;:10;:12::i;:::-;25583:20;;:4;:20;;;:60;;;;25607:36;25624:4;25630:12;:10;:12::i;:::-;25607:16;:36::i;:::-;25583:60;25561:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;25729:52;25752:4;25758:2;25762:3;25767:7;25776:4;25729:22;:52::i;:::-;25350:439;;;;;:::o;60900:343::-;3871:13;:11;:13::i;:::-;61051:1:::1;61020:7;:21;61028:12;61020:21;;;;;;;;;;;:28;;;:32;61012:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;61099:6;61094:142;61115:15;:22;61111:1;:26;61094:142;;;61223:1;61159:27;:41;61187:12;61159:41;;;;;;;;;;;:61;61201:15;61217:1;61201:18;;;;;;;;;;;;;;;;;;;;;;61159:61;;;;;;;;;;;;;;;:65;;;;61139:3;;;;;:::i;:::-;;;;61094:142;;;;60900:343:::0;;:::o;67253:107::-;3871:13;:11;:13::i;:::-;67309:10:::1;67301:28;;:51;67330:21;67301:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;67253:107::o:0;23802:524::-;23958:16;24019:3;:10;24000:8;:15;:29;23992:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;24088:30;24135:8;:15;24121:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24088:63;;24169:9;24164:122;24188:8;:15;24184:1;:19;24164:122;;;24244:30;24254:8;24263:1;24254:11;;;;;;;;;;;;;;;;;;;;;;24267:3;24271:1;24267:6;;;;;;;;;;;;;;;;;;;;;;24244:9;:30::i;:::-;24225:13;24239:1;24225:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;24205:3;;;;:::i;:::-;;;24164:122;;;;24305:13;24298:20;;;23802:524;;;;:::o;64871:338::-;3871:13;:11;:13::i;:::-;65011:1:::1;64980:7;:21;64988:12;64980:21;;;;;;;;;;;:28;;;:32;64972:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;65100:9;65062:7;:21;65070:12;65062:21;;;;;;;;;;;:34;;;:47;;65054:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;65192:9;65161:7;:21;65169:12;65161:21;;;;;;;;;;;:28;;:40;;;;64871:338:::0;;:::o;66852:393::-;3871:13;:11;:13::i;:::-;67015:7:::1;:21;67023:12;67015:21;;;;;;;;;;;:28;;;66977:7;:21;66985:12;66977:21;;;;;;;;;;;:34;;;66968:6;:43;;;;:::i;:::-;:75;;66960:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;67175:6;67138:7;:21;67146:12;67138:21;;;;;;;;;;;:34;;;:43;;;;:::i;:::-;67101:7;:21;67109:12;67101:21;;;;;;;;;;;:34;;:80;;;;67192:45;67198:12;67212;67226:6;67192:45;;;;;;;;;;;::::0;:5:::1;:45::i;:::-;66852:393:::0;;;:::o;60599:83::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66597:247::-;3871:13;:11;:13::i;:::-;66740:1:::1;66709:7;:21;66717:12;66709:21;;;;;;;;;;;:28;;;:32;66701:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;66827:9;66783:7;:21;66791:12;66783:21;;;;;;;;;;;:41;;:53;;;;66597:247:::0;;:::o;60551:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65217:389::-;3871:13;:11;:13::i;:::-;65398:1:::1;65367:7;:21;65375:12;65367:21;;;;;;;;;;;:28;;;:32;65359:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;65478:12;65441:7;:21;65449:12;65441:21;;;;;;;;;;;:34;;:49;;;;65533:7;65501;:21;65509:12;65501:21;;;;;;;;;;;:29;;:39;;;;65587:11;65551:7;:21;65559:12;65551:21;;;;;;;;;;;:33;;:47;;;;65217:389:::0;;;;:::o;64094:660::-;3871:13;:11;:13::i;:::-;64371:1:::1;64362:6;:10;64354:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;64447:1;64415:7;:21;64423:12;64415:21;;;;;;;;;;;:28;;;:33;64407:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;64514:33;64550:142;;;;;;;;64558:12;64550:142;;;;64572:6;64550:142;;;;64580:12;64550:142;;;;64594:7;64550:142;;;;64603:11;64550:142;;;;64616:12;64550:142;;;;;;64630:12;64550:142;;;;;;64644:10;64550:142;;;;;;64656:11;64550:142;;;;64669:19;64550:142;;;;64690:1;64550:142;;::::0;64514:178:::1;;64727:19;64703:7;:21;64711:12;64703:21;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3895:1;64094:660:::0;;;;;;;;;;:::o;4633:103::-;3871:13;:11;:13::i;:::-;4698:30:::1;4725:1;4698:18;:30::i;:::-;4633:103::o:0;64762:101::-;3871:13;:11;:13::i;:::-;64838:17:::1;64846:8;64838:7;:17::i;:::-;64762:101:::0;:::o;3985:87::-;4031:7;4058:6;;;;;;;;;;;4051:13;;3985:87;:::o;65614:238::-;3871:13;:11;:13::i;:::-;65729:1:::1;65698:7;:21;65706:12;65698:21;;;;;;;;;;;:28;;;:32;65690:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;65810:7;:21;65818:12;65810:21;;;;;;;;;;;:34;;;;;;;;;;;;65809:35;65772:7;:21;65780:12;65772:21;;;;;;;;;;;:34;;;:72;;;;;;;;;;;;;;;;;;65614:238:::0;:::o;61251:1255::-;61384:1;61353:7;:21;61361:12;61353:21;;;;;;;;;;;:28;;;:32;61345:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;61435:7;:21;61443:12;61435:21;;;;;;;;;;;:34;;;;;;;;;;;;61427:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;61553:7;:21;61561:12;61553:21;;;;;;;;;;;:28;;;61515:7;:21;61523:12;61515:21;;;;;;;;;;;:34;;;61511:1;:38;;;;:::i;:::-;:70;;61503:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;61707:7;:21;61715:12;61707:21;;;;;;;;;;;:41;;;61702:1;61647:26;:40;61674:12;61647:40;;;;;;;;;;;:52;61688:10;61647:52;;;;;;;;;;;;;;;;:56;;;;:::i;:::-;:101;;61639:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;61814:39;:7;:21;61822:12;61814:21;;;;;;;;;;;:33;;;:39;61810:364;;61870:12;61912:10;61895:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;61885:39;;;;;;61870:54;;61947:73;61966:12;;61947:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61980:7;:21;61988:12;61980:21;;;;;;;;;;;:33;;;62015:4;61947:18;:73::i;:::-;61939:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;61810:364;;;;62135:1;62079:27;:41;62107:12;62079:41;;;;;;;;;;;:53;62121:10;62079:53;;;;;;;;;;;;;;;;:57;62071:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;61810:364;62240:1;62184:27;:41;62212:12;62184:41;;;;;;;;;;;:53;62226:10;62184:53;;;;;;;;;;;;;;;:57;;;;62326:1;62289:7;:21;62297:12;62289:21;;;;;;;;;;;:34;;;:38;;;;:::i;:::-;62252:7;:21;62260:12;62252:21;;;;;;;;;;;:34;;:75;;;;62448:1;62393:26;:40;62420:12;62393:40;;;;;;;;;;;:52;62434:10;62393:52;;;;;;;;;;;;;;;;:56;;;;:::i;:::-;62338:26;:40;62365:12;62338:40;;;;;;;;;;;:52;62379:10;62338:52;;;;;;;;;;;;;;;:111;;;;62460:38;62466:10;62478:12;62492:1;62460:38;;;;;;;;;;;;:5;:38::i;:::-;61251:1255;;;:::o;24399:155::-;24494:52;24513:12;:10;:12::i;:::-;24527:8;24537;24494:18;:52::i;:::-;24399:155;;:::o;65860:236::-;3871:13;:11;:13::i;:::-;65973:1:::1;65942:7;:21;65950:12;65942:21;;;;;;;;;;;:28;;;:32;65934:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;66054:7;:21;66062:12;66054:21;;;;;;;;;;;:34;;;;;;;;;;;;66053:35;66016:7;:21;66024:12;66016:21;;;;;;;;;;;:34;;;:72;;;;;;;;;;;;;;;;;;65860:236:::0;:::o;66344:245::-;3871:13;:11;:13::i;:::-;66489:1:::1;66458:7;:21;66466:12;66458:21;;;;;;;;;;;:28;;;:32;66450:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;66568:13;66532:7;:21;66540:12;66532:21;;;;;;;;;;;:33;;:49;;;;66344:245:::0;;:::o;24626:168::-;24725:4;24749:18;:27;24768:7;24749:27;;;;;;;;;;;;;;;:37;24777:8;24749:37;;;;;;;;;;;;;;;;;;;;;;;;;24742:44;;24626:168;;;;:::o;24866:407::-;25082:12;:10;:12::i;:::-;25074:20;;:4;:20;;;:60;;;;25098:36;25115:4;25121:12;:10;:12::i;:::-;25098:16;:36::i;:::-;25074:60;25052:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;25220:45;25238:4;25244:2;25248;25252:6;25260:4;25220:17;:45::i;:::-;24866:407;;;;;:::o;4891:201::-;3871:13;:11;:13::i;:::-;5000:1:::1;4980:22;;:8;:22;;;;4972:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5056:28;5075:8;5056:18;:28::i;:::-;4891:201:::0;:::o;2603:157::-;2688:4;2727:25;2712:40;;;:11;:40;;;;2705:47;;2603:157;;;:::o;40133:190::-;40258:4;40311;40282:25;40295:5;40302:4;40282:12;:25::i;:::-;:33;40275:40;;40133:190;;;;;:::o;30049:729::-;30216:1;30202:16;;:2;:16;;;;30194:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30269:16;30288:12;:10;:12::i;:::-;30269:31;;30311:20;30334:21;30352:2;30334:17;:21::i;:::-;30311:44;;30366:24;30393:25;30411:6;30393:17;:25::i;:::-;30366:52;;30431:66;30452:8;30470:1;30474:2;30478:3;30483:7;30492:4;30431:20;:66::i;:::-;30531:6;30510:9;:13;30520:2;30510:13;;;;;;;;;;;:17;30524:2;30510:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;30590:2;30553:52;;30586:1;30553:52;;30568:8;30553:52;;;30594:2;30598:6;30553:52;;;;;;;:::i;:::-;;;;;;;;30618:65;30638:8;30656:1;30660:2;30664:3;30669:7;30678:4;30618:19;:65::i;:::-;30696:74;30727:8;30745:1;30749:2;30753;30757:6;30765:4;30696:30;:74::i;:::-;30049:729;;;;;;;:::o;4150:132::-;4225:12;:10;:12::i;:::-;4214:23;;:7;:5;:7::i;:::-;:23;;;4206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4150:132::o;23150:105::-;23210:13;23243:4;23236:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23150:105;;;:::o;47865:723::-;47921:13;48151:1;48142:5;:10;48138:53;;;48169:10;;;;;;;;;;;;;;;;;;;;;48138:53;48201:12;48216:5;48201:20;;48232:14;48257:78;48272:1;48264:4;:9;48257:78;;48290:8;;;;;:::i;:::-;;;;48321:2;48313:10;;;;;:::i;:::-;;;48257:78;;;48345:19;48377:6;48367:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48345:39;;48395:154;48411:1;48402:5;:10;48395:154;;48439:1;48429:11;;;;;:::i;:::-;;;48506:2;48498:5;:10;;;;:::i;:::-;48485:2;:24;;;;:::i;:::-;48472:39;;48455:6;48462;48455:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;48535:2;48526:11;;;;;:::i;:::-;;;48395:154;;;48573:6;48559:21;;;;;47865:723;;;;:::o;604:98::-;657:7;684:10;677:17;;604:98;:::o;27585:1146::-;27812:7;:14;27798:3;:10;:28;27790:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;27904:1;27890:16;;:2;:16;;;;27882:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27961:16;27980:12;:10;:12::i;:::-;27961:31;;28005:60;28026:8;28036:4;28042:2;28046:3;28051:7;28060:4;28005:20;:60::i;:::-;28083:9;28078:421;28102:3;:10;28098:1;:14;28078:421;;;28134:10;28147:3;28151:1;28147:6;;;;;;;;;;;;;;;;;;;;;;28134:19;;28168:14;28185:7;28193:1;28185:10;;;;;;;;;;;;;;;;;;;;;;28168:27;;28212:19;28234:9;:13;28244:2;28234:13;;;;;;;;;;;:19;28248:4;28234:19;;;;;;;;;;;;;;;;28212:41;;28291:6;28276:11;:21;;28268:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28424:6;28410:11;:20;28388:9;:13;28398:2;28388:13;;;;;;;;;;;:19;28402:4;28388:19;;;;;;;;;;;;;;;:42;;;;28481:6;28460:9;:13;28470:2;28460:13;;;;;;;;;;;:17;28474:2;28460:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;28078:421;;;28114:3;;;;:::i;:::-;;;28078:421;;;;28546:2;28516:47;;28540:4;28516:47;;28530:8;28516:47;;;28550:3;28555:7;28516:47;;;;;;;:::i;:::-;;;;;;;;28576:59;28596:8;28606:4;28612:2;28616:3;28621:7;28630:4;28576:19;:59::i;:::-;28648:75;28684:8;28694:4;28700:2;28704:3;28709:7;28718:4;28648:35;:75::i;:::-;27585:1146;;;;;;:::o;5252:191::-;5326:16;5345:6;;;;;;;;;;;5326:25;;5371:8;5362:6;;:17;;;;;;;;;;;;;;;;;;5426:8;5395:40;;5416:8;5395:40;;;;;;;;;;;;5252:191;;:::o;29575:88::-;29649:6;29642:4;:13;;;;;;;;;;;;:::i;:::-;;29575:88;:::o;34462:331::-;34617:8;34608:17;;:5;:17;;;;34600:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34720:8;34682:18;:25;34701:5;34682:25;;;;;;;;;;;;;;;:35;34708:8;34682:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34766:8;34744:41;;34759:5;34744:41;;;34776:8;34744:41;;;;;;:::i;:::-;;;;;;;;34462:331;;;:::o;26253:974::-;26455:1;26441:16;;:2;:16;;;;26433:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26512:16;26531:12;:10;:12::i;:::-;26512:31;;26554:20;26577:21;26595:2;26577:17;:21::i;:::-;26554:44;;26609:24;26636:25;26654:6;26636:17;:25::i;:::-;26609:52;;26674:60;26695:8;26705:4;26711:2;26715:3;26720:7;26729:4;26674:20;:60::i;:::-;26747:19;26769:9;:13;26779:2;26769:13;;;;;;;;;;;:19;26783:4;26769:19;;;;;;;;;;;;;;;;26747:41;;26822:6;26807:11;:21;;26799:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26947:6;26933:11;:20;26911:9;:13;26921:2;26911:13;;;;;;;;;;;:19;26925:4;26911:19;;;;;;;;;;;;;;;:42;;;;26996:6;26975:9;:13;26985:2;26975:13;;;;;;;;;;;:17;26989:2;26975:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27051:2;27020:46;;27045:4;27020:46;;27035:8;27020:46;;;27055:2;27059:6;27020:46;;;;;;;:::i;:::-;;;;;;;;27079:59;27099:8;27109:4;27115:2;27119:3;27124:7;27133:4;27079:19;:59::i;:::-;27151:68;27182:8;27192:4;27198:2;27202;27206:6;27214:4;27151:30;:68::i;:::-;26253:974;;;;;;;;;:::o;41000:296::-;41083:7;41103:20;41126:4;41103:27;;41146:9;41141:118;41165:5;:12;41161:1;:16;41141:118;;;41214:33;41224:12;41238:5;41244:1;41238:8;;;;;;;;;;;;;;;;;;;;;;41214:9;:33::i;:::-;41199:48;;41179:3;;;;;:::i;:::-;;;;41141:118;;;;41276:12;41269:19;;;41000:296;;;;:::o;38728:198::-;38794:16;38823:22;38862:1;38848:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38823:41;;38886:7;38875:5;38881:1;38875:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;38913:5;38906:12;;;38728:198;;;:::o;35751:221::-;;;;;;;:::o;36927:220::-;;;;;;;:::o;37155:744::-;37370:15;:2;:13;;;:15::i;:::-;37366:526;;;37423:2;37406:38;;;37445:8;37455:4;37461:2;37465:6;37473:4;37406:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37402:479;;;;:::i;:::-;;;;;;;;37754:6;37747:14;;;;;;;;;;;:::i;:::-;;;;;;;;37402:479;37803:62;;;;;;;;;;:::i;:::-;;;;;;;;37402:479;37540:43;;;37528:55;;;:8;:55;;;;37524:154;;37608:50;;;;;;;;;;:::i;:::-;;;;;;;;37524:154;37479:214;37366:526;37155:744;;;;;;:::o;37907:813::-;38147:15;:2;:13;;;:15::i;:::-;38143:570;;;38200:2;38183:43;;;38227:8;38237:4;38243:3;38248:7;38257:4;38183:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38179:523;;;;:::i;:::-;;;;;;;;38575:6;38568:14;;;;;;;;;;;:::i;:::-;;;;;;;;38179:523;38624:62;;;;;;;;;;:::i;:::-;;;;;;;;38179:523;38356:48;;;38344:60;;;:8;:60;;;;38340:159;;38429:50;;;;;;;;;;:::i;:::-;;;;;;;;38340:159;38263:251;38143:570;37907:813;;;;;;:::o;47207:149::-;47270:7;47301:1;47297;:5;:51;;47328:20;47343:1;47346;47328:14;:20::i;:::-;47297:51;;;47305:20;47320:1;47323;47305:14;:20::i;:::-;47297:51;47290:58;;47207:149;;;;:::o;14076:326::-;14136:4;14393:1;14371:7;:12;;;;;;;;;;;;;;;;;;;;;;;;;:19;:23;14364:30;;14076:326;;;:::o;47364:268::-;47432:13;47539:1;47533:4;47526:15;47568:1;47562:4;47555:15;47609:4;47603;47593:21;47584:30;;47511:114;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;669:622::-;;790:80;805:64;862:6;805:64;:::i;:::-;790:80;:::i;:::-;781:89;;890:5;918:6;911:5;904:21;944:4;937:5;933:16;926:23;;969:6;1019:3;1011:4;1003:6;999:17;994:3;990:27;987:36;984:2;;;1036:1;1033;1026:12;984:2;1064:1;1049:236;1074:6;1071:1;1068:13;1049:236;;;1141:3;1169:37;1202:3;1190:10;1169:37;:::i;:::-;1164:3;1157:50;1236:4;1231:3;1227:14;1220:21;;1270:4;1265:3;1261:14;1254:21;;1109:176;1096:1;1093;1089:9;1084:14;;1049:236;;;1053:14;771:520;;;;;;;:::o;1297:342::-;;1399:64;1414:48;1455:6;1414:48;:::i;:::-;1399:64;:::i;:::-;1390:73;;1486:6;1479:5;1472:21;1524:4;1517:5;1513:16;1562:3;1553:6;1548:3;1544:16;1541:25;1538:2;;;1579:1;1576;1569:12;1538:2;1592:41;1626:6;1621:3;1616;1592:41;:::i;:::-;1380:259;;;;;;:::o;1645:344::-;;1748:65;1763:49;1805:6;1763:49;:::i;:::-;1748:65;:::i;:::-;1739:74;;1836:6;1829:5;1822:21;1874:4;1867:5;1863:16;1912:3;1903:6;1898:3;1894:16;1891:25;1888:2;;;1929:1;1926;1919:12;1888:2;1942:41;1976:6;1971:3;1966;1942:41;:::i;:::-;1729:260;;;;;;:::o;1995:139::-;;2079:6;2066:20;2057:29;;2095:33;2122:5;2095:33;:::i;:::-;2047:87;;;;:::o;2157:303::-;;2277:3;2270:4;2262:6;2258:17;2254:27;2244:2;;2295:1;2292;2285:12;2244:2;2335:6;2322:20;2360:94;2450:3;2442:6;2435:4;2427:6;2423:17;2360:94;:::i;:::-;2351:103;;2234:226;;;;;:::o;2483:367::-;;;2616:3;2609:4;2601:6;2597:17;2593:27;2583:2;;2634:1;2631;2624:12;2583:2;2670:6;2657:20;2647:30;;2700:18;2692:6;2689:30;2686:2;;;2732:1;2729;2722:12;2686:2;2769:4;2761:6;2757:17;2745:29;;2823:3;2815:4;2807:6;2803:17;2793:8;2789:32;2786:41;2783:2;;;2840:1;2837;2830:12;2783:2;2573:277;;;;;:::o;2873:303::-;;2993:3;2986:4;2978:6;2974:17;2970:27;2960:2;;3011:1;3008;3001:12;2960:2;3051:6;3038:20;3076:94;3166:3;3158:6;3151:4;3143:6;3139:17;3076:94;:::i;:::-;3067:103;;2950:226;;;;;:::o;3182:133::-;;3263:6;3250:20;3241:29;;3279:30;3303:5;3279:30;:::i;:::-;3231:84;;;;:::o;3321:139::-;;3405:6;3392:20;3383:29;;3421:33;3448:5;3421:33;:::i;:::-;3373:87;;;;:::o;3466:137::-;;3549:6;3536:20;3527:29;;3565:32;3591:5;3565:32;:::i;:::-;3517:86;;;;:::o;3609:141::-;;3696:6;3690:13;3681:22;;3712:32;3738:5;3712:32;:::i;:::-;3671:79;;;;:::o;3769:271::-;;3873:3;3866:4;3858:6;3854:17;3850:27;3840:2;;3891:1;3888;3881:12;3840:2;3931:6;3918:20;3956:78;4030:3;4022:6;4015:4;4007:6;4003:17;3956:78;:::i;:::-;3947:87;;3830:210;;;;;:::o;4060:273::-;;4165:3;4158:4;4150:6;4146:17;4142:27;4132:2;;4183:1;4180;4173:12;4132:2;4223:6;4210:20;4248:79;4323:3;4315:6;4308:4;4300:6;4296:17;4248:79;:::i;:::-;4239:88;;4122:211;;;;;:::o;4339:139::-;;4423:6;4410:20;4401:29;;4439:33;4466:5;4439:33;:::i;:::-;4391:87;;;;:::o;4484:143::-;;4572:6;4566:13;4557:22;;4588:33;4615:5;4588:33;:::i;:::-;4547:80;;;;:::o;4633:262::-;;4741:2;4729:9;4720:7;4716:23;4712:32;4709:2;;;4757:1;4754;4747:12;4709:2;4800:1;4825:53;4870:7;4861:6;4850:9;4846:22;4825:53;:::i;:::-;4815:63;;4771:117;4699:196;;;;:::o;4901:407::-;;;5026:2;5014:9;5005:7;5001:23;4997:32;4994:2;;;5042:1;5039;5032:12;4994:2;5085:1;5110:53;5155:7;5146:6;5135:9;5131:22;5110:53;:::i;:::-;5100:63;;5056:117;5212:2;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5183:118;4984:324;;;;;:::o;5314:1241::-;;;;;;5549:3;5537:9;5528:7;5524:23;5520:33;5517:2;;;5566:1;5563;5556:12;5517:2;5609:1;5634:53;5679:7;5670:6;5659:9;5655:22;5634:53;:::i;:::-;5624:63;;5580:117;5736:2;5762:53;5807:7;5798:6;5787:9;5783:22;5762:53;:::i;:::-;5752:63;;5707:118;5892:2;5881:9;5877:18;5864:32;5923:18;5915:6;5912:30;5909:2;;;5955:1;5952;5945:12;5909:2;5983:78;6053:7;6044:6;6033:9;6029:22;5983:78;:::i;:::-;5973:88;;5835:236;6138:2;6127:9;6123:18;6110:32;6169:18;6161:6;6158:30;6155:2;;;6201:1;6198;6191:12;6155:2;6229:78;6299:7;6290:6;6279:9;6275:22;6229:78;:::i;:::-;6219:88;;6081:236;6384:3;6373:9;6369:19;6356:33;6416:18;6408:6;6405:30;6402:2;;;6448:1;6445;6438:12;6402:2;6476:62;6530:7;6521:6;6510:9;6506:22;6476:62;:::i;:::-;6466:72;;6327:221;5507:1048;;;;;;;;:::o;6561:955::-;;;;;;6746:3;6734:9;6725:7;6721:23;6717:33;6714:2;;;6763:1;6760;6753:12;6714:2;6806:1;6831:53;6876:7;6867:6;6856:9;6852:22;6831:53;:::i;:::-;6821:63;;6777:117;6933:2;6959:53;7004:7;6995:6;6984:9;6980:22;6959:53;:::i;:::-;6949:63;;6904:118;7061:2;7087:53;7132:7;7123:6;7112:9;7108:22;7087:53;:::i;:::-;7077:63;;7032:118;7189:2;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7160:118;7345:3;7334:9;7330:19;7317:33;7377:18;7369:6;7366:30;7363:2;;;7409:1;7406;7399:12;7363:2;7437:62;7491:7;7482:6;7471:9;7467:22;7437:62;:::i;:::-;7427:72;;7288:221;6704:812;;;;;;;;:::o;7522:401::-;;;7644:2;7632:9;7623:7;7619:23;7615:32;7612:2;;;7660:1;7657;7650:12;7612:2;7703:1;7728:53;7773:7;7764:6;7753:9;7749:22;7728:53;:::i;:::-;7718:63;;7674:117;7830:2;7856:50;7898:7;7889:6;7878:9;7874:22;7856:50;:::i;:::-;7846:60;;7801:115;7602:321;;;;;:::o;7929:407::-;;;8054:2;8042:9;8033:7;8029:23;8025:32;8022:2;;;8070:1;8067;8060:12;8022:2;8113:1;8138:53;8183:7;8174:6;8163:9;8159:22;8138:53;:::i;:::-;8128:63;;8084:117;8240:2;8266:53;8311:7;8302:6;8291:9;8287:22;8266:53;:::i;:::-;8256:63;;8211:118;8012:324;;;;;:::o;8342:693::-;;;8517:2;8505:9;8496:7;8492:23;8488:32;8485:2;;;8533:1;8530;8523:12;8485:2;8604:1;8593:9;8589:17;8576:31;8634:18;8626:6;8623:30;8620:2;;;8666:1;8663;8656:12;8620:2;8694:78;8764:7;8755:6;8744:9;8740:22;8694:78;:::i;:::-;8684:88;;8547:235;8849:2;8838:9;8834:18;8821:32;8880:18;8872:6;8869:30;8866:2;;;8912:1;8909;8902:12;8866:2;8940:78;9010:7;9001:6;8990:9;8986:22;8940:78;:::i;:::-;8930:88;;8792:236;8475:560;;;;;:::o;9041:715::-;;;;;9218:2;9206:9;9197:7;9193:23;9189:32;9186:2;;;9234:1;9231;9224:12;9186:2;9305:1;9294:9;9290:17;9277:31;9335:18;9327:6;9324:30;9321:2;;;9367:1;9364;9357:12;9321:2;9403:80;9475:7;9466:6;9455:9;9451:22;9403:80;:::i;:::-;9385:98;;;;9248:245;9532:2;9558:53;9603:7;9594:6;9583:9;9579:22;9558:53;:::i;:::-;9548:63;;9503:118;9660:2;9686:53;9731:7;9722:6;9711:9;9707:22;9686:53;:::i;:::-;9676:63;;9631:118;9176:580;;;;;;;:::o;9762:260::-;;9869:2;9857:9;9848:7;9844:23;9840:32;9837:2;;;9885:1;9882;9875:12;9837:2;9928:1;9953:52;9997:7;9988:6;9977:9;9973:22;9953:52;:::i;:::-;9943:62;;9899:116;9827:195;;;;:::o;10028:282::-;;10146:2;10134:9;10125:7;10121:23;10117:32;10114:2;;;10162:1;10159;10152:12;10114:2;10205:1;10230:63;10285:7;10276:6;10265:9;10261:22;10230:63;:::i;:::-;10220:73;;10176:127;10104:206;;;;:::o;10316:375::-;;10434:2;10422:9;10413:7;10409:23;10405:32;10402:2;;;10450:1;10447;10440:12;10402:2;10521:1;10510:9;10506:17;10493:31;10551:18;10543:6;10540:30;10537:2;;;10583:1;10580;10573:12;10537:2;10611:63;10666:7;10657:6;10646:9;10642:22;10611:63;:::i;:::-;10601:73;;10464:220;10392:299;;;;:::o;10697:262::-;;10805:2;10793:9;10784:7;10780:23;10776:32;10773:2;;;10821:1;10818;10811:12;10773:2;10864:1;10889:53;10934:7;10925:6;10914:9;10910:22;10889:53;:::i;:::-;10879:63;;10835:117;10763:196;;;;:::o;10965:284::-;;11084:2;11072:9;11063:7;11059:23;11055:32;11052:2;;;11100:1;11097;11090:12;11052:2;11143:1;11168:64;11224:7;11215:6;11204:9;11200:22;11168:64;:::i;:::-;11158:74;;11114:128;11042:207;;;;:::o;11255:407::-;;;11380:2;11368:9;11359:7;11355:23;11351:32;11348:2;;;11396:1;11393;11386:12;11348:2;11439:1;11464:53;11509:7;11500:6;11489:9;11485:22;11464:53;:::i;:::-;11454:63;;11410:117;11566:2;11592:53;11637:7;11628:6;11617:9;11613:22;11592:53;:::i;:::-;11582:63;;11537:118;11338:324;;;;;:::o;11668:552::-;;;;11810:2;11798:9;11789:7;11785:23;11781:32;11778:2;;;11826:1;11823;11816:12;11778:2;11869:1;11894:53;11939:7;11930:6;11919:9;11915:22;11894:53;:::i;:::-;11884:63;;11840:117;11996:2;12022:53;12067:7;12058:6;12047:9;12043:22;12022:53;:::i;:::-;12012:63;;11967:118;12124:2;12150:53;12195:7;12186:6;12175:9;12171:22;12150:53;:::i;:::-;12140:63;;12095:118;11768:452;;;;;:::o;12226:550::-;;;12376:2;12364:9;12355:7;12351:23;12347:32;12344:2;;;12392:1;12389;12382:12;12344:2;12435:1;12460:53;12505:7;12496:6;12485:9;12481:22;12460:53;:::i;:::-;12450:63;;12406:117;12590:2;12579:9;12575:18;12562:32;12621:18;12613:6;12610:30;12607:2;;;12653:1;12650;12643:12;12607:2;12681:78;12751:7;12742:6;12731:9;12727:22;12681:78;:::i;:::-;12671:88;;12533:236;12334:442;;;;;:::o;12782:570::-;;;;12942:2;12930:9;12921:7;12917:23;12913:32;12910:2;;;12958:1;12955;12948:12;12910:2;13001:1;13026:53;13071:7;13062:6;13051:9;13047:22;13026:53;:::i;:::-;13016:63;;12972:117;13156:2;13145:9;13141:18;13128:32;13187:18;13179:6;13176:30;13173:2;;;13219:1;13216;13209:12;13173:2;13255:80;13327:7;13318:6;13307:9;13303:22;13255:80;:::i;:::-;13237:98;;;;13099:246;12900:452;;;;;:::o;13358:407::-;;;13483:2;13471:9;13462:7;13458:23;13454:32;13451:2;;;13499:1;13496;13489:12;13451:2;13542:1;13567:53;13612:7;13603:6;13592:9;13588:22;13567:53;:::i;:::-;13557:63;;13513:117;13669:2;13695:53;13740:7;13731:6;13720:9;13716:22;13695:53;:::i;:::-;13685:63;;13640:118;13441:324;;;;;:::o;13771:407::-;;;13896:2;13884:9;13875:7;13871:23;13867:32;13864:2;;;13912:1;13909;13902:12;13864:2;13955:1;13980:53;14025:7;14016:6;14005:9;14001:22;13980:53;:::i;:::-;13970:63;;13926:117;14082:2;14108:53;14153:7;14144:6;14133:9;14129:22;14108:53;:::i;:::-;14098:63;;14053:118;13854:324;;;;;:::o;14184:698::-;;;;;14343:3;14331:9;14322:7;14318:23;14314:33;14311:2;;;14360:1;14357;14350:12;14311:2;14403:1;14428:53;14473:7;14464:6;14453:9;14449:22;14428:53;:::i;:::-;14418:63;;14374:117;14530:2;14556:53;14601:7;14592:6;14581:9;14577:22;14556:53;:::i;:::-;14546:63;;14501:118;14658:2;14684:53;14729:7;14720:6;14709:9;14705:22;14684:53;:::i;:::-;14674:63;;14629:118;14786:2;14812:53;14857:7;14848:6;14837:9;14833:22;14812:53;:::i;:::-;14802:63;;14757:118;14301:581;;;;;;;:::o;14888:1556::-;;;;;;;;;;;15140:3;15128:9;15119:7;15115:23;15111:33;15108:2;;;15157:1;15154;15147:12;15108:2;15200:1;15225:53;15270:7;15261:6;15250:9;15246:22;15225:53;:::i;:::-;15215:63;;15171:117;15327:2;15353:53;15398:7;15389:6;15378:9;15374:22;15353:53;:::i;:::-;15343:63;;15298:118;15455:2;15481:53;15526:7;15517:6;15506:9;15502:22;15481:53;:::i;:::-;15471:63;;15426:118;15583:2;15609:53;15654:7;15645:6;15634:9;15630:22;15609:53;:::i;:::-;15599:63;;15554:118;15711:3;15738:53;15783:7;15774:6;15763:9;15759:22;15738:53;:::i;:::-;15728:63;;15682:119;15840:3;15867:50;15909:7;15900:6;15889:9;15885:22;15867:50;:::i;:::-;15857:60;;15811:116;15966:3;15993:50;16035:7;16026:6;16015:9;16011:22;15993:50;:::i;:::-;15983:60;;15937:116;16092:3;16119:50;16161:7;16152:6;16141:9;16137:22;16119:50;:::i;:::-;16109:60;;16063:116;16218:3;16245:53;16290:7;16281:6;16270:9;16266:22;16245:53;:::i;:::-;16235:63;;16189:119;16347:3;16374:53;16419:7;16410:6;16399:9;16395:22;16374:53;:::i;:::-;16364:63;;16318:119;15098:1346;;;;;;;;;;;;;:::o;16450:179::-;;16540:46;16582:3;16574:6;16540:46;:::i;:::-;16618:4;16613:3;16609:14;16595:28;;16530:99;;;;:::o;16635:118::-;16722:24;16740:5;16722:24;:::i;:::-;16717:3;16710:37;16700:53;;:::o;16759:157::-;16864:45;16884:24;16902:5;16884:24;:::i;:::-;16864:45;:::i;:::-;16859:3;16852:58;16842:74;;:::o;16952:732::-;;17100:54;17148:5;17100:54;:::i;:::-;17170:86;17249:6;17244:3;17170:86;:::i;:::-;17163:93;;17280:56;17330:5;17280:56;:::i;:::-;17359:7;17390:1;17375:284;17400:6;17397:1;17394:13;17375:284;;;17476:6;17470:13;17503:63;17562:3;17547:13;17503:63;:::i;:::-;17496:70;;17589:60;17642:6;17589:60;:::i;:::-;17579:70;;17435:224;17422:1;17419;17415:9;17410:14;;17375:284;;;17379:14;17675:3;17668:10;;17076:608;;;;;;;:::o;17690:109::-;17771:21;17786:5;17771:21;:::i;:::-;17766:3;17759:34;17749:50;;:::o;17805:118::-;17892:24;17910:5;17892:24;:::i;:::-;17887:3;17880:37;17870:53;;:::o;17929:360::-;;18043:38;18075:5;18043:38;:::i;:::-;18097:70;18160:6;18155:3;18097:70;:::i;:::-;18090:77;;18176:52;18221:6;18216:3;18209:4;18202:5;18198:16;18176:52;:::i;:::-;18253:29;18275:6;18253:29;:::i;:::-;18248:3;18244:39;18237:46;;18019:270;;;;;:::o;18295:364::-;;18411:39;18444:5;18411:39;:::i;:::-;18466:71;18530:6;18525:3;18466:71;:::i;:::-;18459:78;;18546:52;18591:6;18586:3;18579:4;18572:5;18568:16;18546:52;:::i;:::-;18623:29;18645:6;18623:29;:::i;:::-;18618:3;18614:39;18607:46;;18387:272;;;;;:::o;18665:377::-;;18799:39;18832:5;18799:39;:::i;:::-;18854:89;18936:6;18931:3;18854:89;:::i;:::-;18847:96;;18952:52;18997:6;18992:3;18985:4;18978:5;18974:16;18952:52;:::i;:::-;19029:6;19024:3;19020:16;19013:23;;18775:267;;;;;:::o;19048:384::-;;19211:67;19275:2;19270:3;19211:67;:::i;:::-;19204:74;;19308:34;19304:1;19299:3;19295:11;19288:55;19374:22;19369:2;19364:3;19360:12;19353:44;19423:2;19418:3;19414:12;19407:19;;19194:238;;;:::o;19438:320::-;;19601:67;19665:2;19660:3;19601:67;:::i;:::-;19594:74;;19698:24;19694:1;19689:3;19685:11;19678:45;19749:2;19744:3;19740:12;19733:19;;19584:174;;;:::o;19764:379::-;;19927:67;19991:2;19986:3;19927:67;:::i;:::-;19920:74;;20024:34;20020:1;20015:3;20011:11;20004:55;20090:17;20085:2;20080:3;20076:12;20069:39;20134:2;20129:3;20125:12;20118:19;;19910:233;;;:::o;20149:372::-;;20312:67;20376:2;20371:3;20312:67;:::i;:::-;20305:74;;20409:34;20405:1;20400:3;20396:11;20389:55;20475:10;20470:2;20465:3;20461:12;20454:32;20512:2;20507:3;20503:12;20496:19;;20295:226;;;:::o;20527:319::-;;20690:67;20754:2;20749:3;20690:67;:::i;:::-;20683:74;;20787:23;20783:1;20778:3;20774:11;20767:44;20837:2;20832:3;20828:12;20821:19;;20673:173;;;:::o;20852:370::-;;21015:67;21079:2;21074:3;21015:67;:::i;:::-;21008:74;;21112:34;21108:1;21103:3;21099:11;21092:55;21178:8;21173:2;21168:3;21164:12;21157:30;21213:2;21208:3;21204:12;21197:19;;20998:224;;;:::o;21228:374::-;;21391:67;21455:2;21450:3;21391:67;:::i;:::-;21384:74;;21488:34;21484:1;21479:3;21475:11;21468:55;21554:12;21549:2;21544:3;21540:12;21533:34;21593:2;21588:3;21584:12;21577:19;;21374:228;;;:::o;21608:316::-;;21771:67;21835:2;21830:3;21771:67;:::i;:::-;21764:74;;21868:20;21864:1;21859:3;21855:11;21848:41;21915:2;21910:3;21906:12;21899:19;;21754:170;;;:::o;21930:369::-;;22093:67;22157:2;22152:3;22093:67;:::i;:::-;22086:74;;22190:34;22186:1;22181:3;22177:11;22170:55;22256:7;22251:2;22246:3;22242:12;22235:29;22290:2;22285:3;22281:12;22274:19;;22076:223;;;:::o;22305:329::-;;22468:67;22532:2;22527:3;22468:67;:::i;:::-;22461:74;;22565:33;22561:1;22556:3;22552:11;22545:54;22625:2;22620:3;22616:12;22609:19;;22451:183;;;:::o;22640:374::-;;22803:67;22867:2;22862:3;22803:67;:::i;:::-;22796:74;;22900:34;22896:1;22891:3;22887:11;22880:55;22966:12;22961:2;22956:3;22952:12;22945:34;23005:2;23000:3;22996:12;22989:19;;22786:228;;;:::o;23020:374::-;;23183:67;23247:2;23242:3;23183:67;:::i;:::-;23176:74;;23280:34;23276:1;23271:3;23267:11;23260:55;23346:12;23341:2;23336:3;23332:12;23325:34;23385:2;23380:3;23376:12;23369:19;;23166:228;;;:::o;23400:330::-;;23563:67;23627:2;23622:3;23563:67;:::i;:::-;23556:74;;23660:34;23656:1;23651:3;23647:11;23640:55;23721:2;23716:3;23712:12;23705:19;;23546:184;;;:::o;23736:316::-;;23899:67;23963:2;23958:3;23899:67;:::i;:::-;23892:74;;23996:20;23992:1;23987:3;23983:11;23976:41;24043:2;24038:3;24034:12;24027:19;;23882:170;;;:::o;24058:324::-;;24221:67;24285:2;24280:3;24221:67;:::i;:::-;24214:74;;24318:28;24314:1;24309:3;24305:11;24298:49;24373:2;24368:3;24364:12;24357:19;;24204:178;;;:::o;24388:378::-;;24551:67;24615:2;24610:3;24551:67;:::i;:::-;24544:74;;24648:34;24644:1;24639:3;24635:11;24628:55;24714:16;24709:2;24704:3;24700:12;24693:38;24757:2;24752:3;24748:12;24741:19;;24534:232;;;:::o;24772:317::-;;24935:67;24999:2;24994:3;24935:67;:::i;:::-;24928:74;;25032:21;25028:1;25023:3;25019:11;25012:42;25080:2;25075:3;25071:12;25064:19;;24918:171;;;:::o;25095:311::-;;25258:67;25322:2;25317:3;25258:67;:::i;:::-;25251:74;;25355:15;25351:1;25346:3;25342:11;25335:36;25397:2;25392:3;25388:12;25381:19;;25241:165;;;:::o;25412:373::-;;25575:67;25639:2;25634:3;25575:67;:::i;:::-;25568:74;;25672:34;25668:1;25663:3;25659:11;25652:55;25738:11;25733:2;25728:3;25724:12;25717:33;25776:2;25771:3;25767:12;25760:19;;25558:227;;;:::o;25791:368::-;;25954:67;26018:2;26013:3;25954:67;:::i;:::-;25947:74;;26051:34;26047:1;26042:3;26038:11;26031:55;26117:6;26112:2;26107:3;26103:12;26096:28;26150:2;26145:3;26141:12;26134:19;;25937:222;;;:::o;26165:373::-;;26328:67;26392:2;26387:3;26328:67;:::i;:::-;26321:74;;26425:34;26421:1;26416:3;26412:11;26405:55;26491:11;26486:2;26481:3;26477:12;26470:33;26529:2;26524:3;26520:12;26513:19;;26311:227;;;:::o;26544:372::-;;26707:67;26771:2;26766:3;26707:67;:::i;:::-;26700:74;;26804:34;26800:1;26795:3;26791:11;26784:55;26870:10;26865:2;26860:3;26856:12;26849:32;26907:2;26902:3;26898:12;26891:19;;26690:226;;;:::o;26922:365::-;;27085:67;27149:2;27144:3;27085:67;:::i;:::-;27078:74;;27182:34;27178:1;27173:3;27169:11;27162:55;27248:3;27243:2;27238:3;27234:12;27227:25;27278:2;27273:3;27269:12;27262:19;;27068:219;;;:::o;27293:382::-;;27456:67;27520:2;27515:3;27456:67;:::i;:::-;27449:74;;27553:34;27549:1;27544:3;27540:11;27533:55;27619:20;27614:2;27609:3;27605:12;27598:42;27666:2;27661:3;27657:12;27650:19;;27439:236;;;:::o;27681:108::-;27758:24;27776:5;27758:24;:::i;:::-;27753:3;27746:37;27736:53;;:::o;27795:118::-;27882:24;27900:5;27882:24;:::i;:::-;27877:3;27870:37;27860:53;;:::o;27919:256::-;;28046:75;28117:3;28108:6;28046:75;:::i;:::-;28146:2;28141:3;28137:12;28130:19;;28166:3;28159:10;;28035:140;;;;:::o;28181:435::-;;28383:95;28474:3;28465:6;28383:95;:::i;:::-;28376:102;;28495:95;28586:3;28577:6;28495:95;:::i;:::-;28488:102;;28607:3;28600:10;;28365:251;;;;;:::o;28622:222::-;;28753:2;28742:9;28738:18;28730:26;;28766:71;28834:1;28823:9;28819:17;28810:6;28766:71;:::i;:::-;28720:124;;;;:::o;28850:1053::-;;29211:3;29200:9;29196:19;29188:27;;29225:71;29293:1;29282:9;29278:17;29269:6;29225:71;:::i;:::-;29306:72;29374:2;29363:9;29359:18;29350:6;29306:72;:::i;:::-;29425:9;29419:4;29415:20;29410:2;29399:9;29395:18;29388:48;29453:108;29556:4;29547:6;29453:108;:::i;:::-;29445:116;;29608:9;29602:4;29598:20;29593:2;29582:9;29578:18;29571:48;29636:108;29739:4;29730:6;29636:108;:::i;:::-;29628:116;;29792:9;29786:4;29782:20;29776:3;29765:9;29761:19;29754:49;29820:76;29891:4;29882:6;29820:76;:::i;:::-;29812:84;;29178:725;;;;;;;;:::o;29909:751::-;;30170:3;30159:9;30155:19;30147:27;;30184:71;30252:1;30241:9;30237:17;30228:6;30184:71;:::i;:::-;30265:72;30333:2;30322:9;30318:18;30309:6;30265:72;:::i;:::-;30347;30415:2;30404:9;30400:18;30391:6;30347:72;:::i;:::-;30429;30497:2;30486:9;30482:18;30473:6;30429:72;:::i;:::-;30549:9;30543:4;30539:20;30533:3;30522:9;30518:19;30511:49;30577:76;30648:4;30639:6;30577:76;:::i;:::-;30569:84;;30137:523;;;;;;;;:::o;30666:373::-;;30847:2;30836:9;30832:18;30824:26;;30896:9;30890:4;30886:20;30882:1;30871:9;30867:17;30860:47;30924:108;31027:4;31018:6;30924:108;:::i;:::-;30916:116;;30814:225;;;;:::o;31045:634::-;;31304:2;31293:9;31289:18;31281:26;;31353:9;31347:4;31343:20;31339:1;31328:9;31324:17;31317:47;31381:108;31484:4;31475:6;31381:108;:::i;:::-;31373:116;;31536:9;31530:4;31526:20;31521:2;31510:9;31506:18;31499:48;31564:108;31667:4;31658:6;31564:108;:::i;:::-;31556:116;;31271:408;;;;;:::o;31685:210::-;;31810:2;31799:9;31795:18;31787:26;;31823:65;31885:1;31874:9;31870:17;31861:6;31823:65;:::i;:::-;31777:118;;;;:::o;31901:313::-;;32052:2;32041:9;32037:18;32029:26;;32101:9;32095:4;32091:20;32087:1;32076:9;32072:17;32065:47;32129:78;32202:4;32193:6;32129:78;:::i;:::-;32121:86;;32019:195;;;;:::o;32220:419::-;;32424:2;32413:9;32409:18;32401:26;;32473:9;32467:4;32463:20;32459:1;32448:9;32444:17;32437:47;32501:131;32627:4;32501:131;:::i;:::-;32493:139;;32391:248;;;:::o;32645:419::-;;32849:2;32838:9;32834:18;32826:26;;32898:9;32892:4;32888:20;32884:1;32873:9;32869:17;32862:47;32926:131;33052:4;32926:131;:::i;:::-;32918:139;;32816:248;;;:::o;33070:419::-;;33274:2;33263:9;33259:18;33251:26;;33323:9;33317:4;33313:20;33309:1;33298:9;33294:17;33287:47;33351:131;33477:4;33351:131;:::i;:::-;33343:139;;33241:248;;;:::o;33495:419::-;;33699:2;33688:9;33684:18;33676:26;;33748:9;33742:4;33738:20;33734:1;33723:9;33719:17;33712:47;33776:131;33902:4;33776:131;:::i;:::-;33768:139;;33666:248;;;:::o;33920:419::-;;34124:2;34113:9;34109:18;34101:26;;34173:9;34167:4;34163:20;34159:1;34148:9;34144:17;34137:47;34201:131;34327:4;34201:131;:::i;:::-;34193:139;;34091:248;;;:::o;34345:419::-;;34549:2;34538:9;34534:18;34526:26;;34598:9;34592:4;34588:20;34584:1;34573:9;34569:17;34562:47;34626:131;34752:4;34626:131;:::i;:::-;34618:139;;34516:248;;;:::o;34770:419::-;;34974:2;34963:9;34959:18;34951:26;;35023:9;35017:4;35013:20;35009:1;34998:9;34994:17;34987:47;35051:131;35177:4;35051:131;:::i;:::-;35043:139;;34941:248;;;:::o;35195:419::-;;35399:2;35388:9;35384:18;35376:26;;35448:9;35442:4;35438:20;35434:1;35423:9;35419:17;35412:47;35476:131;35602:4;35476:131;:::i;:::-;35468:139;;35366:248;;;:::o;35620:419::-;;35824:2;35813:9;35809:18;35801:26;;35873:9;35867:4;35863:20;35859:1;35848:9;35844:17;35837:47;35901:131;36027:4;35901:131;:::i;:::-;35893:139;;35791:248;;;:::o;36045:419::-;;36249:2;36238:9;36234:18;36226:26;;36298:9;36292:4;36288:20;36284:1;36273:9;36269:17;36262:47;36326:131;36452:4;36326:131;:::i;:::-;36318:139;;36216:248;;;:::o;36470:419::-;;36674:2;36663:9;36659:18;36651:26;;36723:9;36717:4;36713:20;36709:1;36698:9;36694:17;36687:47;36751:131;36877:4;36751:131;:::i;:::-;36743:139;;36641:248;;;:::o;36895:419::-;;37099:2;37088:9;37084:18;37076:26;;37148:9;37142:4;37138:20;37134:1;37123:9;37119:17;37112:47;37176:131;37302:4;37176:131;:::i;:::-;37168:139;;37066:248;;;:::o;37320:419::-;;37524:2;37513:9;37509:18;37501:26;;37573:9;37567:4;37563:20;37559:1;37548:9;37544:17;37537:47;37601:131;37727:4;37601:131;:::i;:::-;37593:139;;37491:248;;;:::o;37745:419::-;;37949:2;37938:9;37934:18;37926:26;;37998:9;37992:4;37988:20;37984:1;37973:9;37969:17;37962:47;38026:131;38152:4;38026:131;:::i;:::-;38018:139;;37916:248;;;:::o;38170:419::-;;38374:2;38363:9;38359:18;38351:26;;38423:9;38417:4;38413:20;38409:1;38398:9;38394:17;38387:47;38451:131;38577:4;38451:131;:::i;:::-;38443:139;;38341:248;;;:::o;38595:419::-;;38799:2;38788:9;38784:18;38776:26;;38848:9;38842:4;38838:20;38834:1;38823:9;38819:17;38812:47;38876:131;39002:4;38876:131;:::i;:::-;38868:139;;38766:248;;;:::o;39020:419::-;;39224:2;39213:9;39209:18;39201:26;;39273:9;39267:4;39263:20;39259:1;39248:9;39244:17;39237:47;39301:131;39427:4;39301:131;:::i;:::-;39293:139;;39191:248;;;:::o;39445:419::-;;39649:2;39638:9;39634:18;39626:26;;39698:9;39692:4;39688:20;39684:1;39673:9;39669:17;39662:47;39726:131;39852:4;39726:131;:::i;:::-;39718:139;;39616:248;;;:::o;39870:419::-;;40074:2;40063:9;40059:18;40051:26;;40123:9;40117:4;40113:20;40109:1;40098:9;40094:17;40087:47;40151:131;40277:4;40151:131;:::i;:::-;40143:139;;40041:248;;;:::o;40295:419::-;;40499:2;40488:9;40484:18;40476:26;;40548:9;40542:4;40538:20;40534:1;40523:9;40519:17;40512:47;40576:131;40702:4;40576:131;:::i;:::-;40568:139;;40466:248;;;:::o;40720:419::-;;40924:2;40913:9;40909:18;40901:26;;40973:9;40967:4;40963:20;40959:1;40948:9;40944:17;40937:47;41001:131;41127:4;41001:131;:::i;:::-;40993:139;;40891:248;;;:::o;41145:419::-;;41349:2;41338:9;41334:18;41326:26;;41398:9;41392:4;41388:20;41384:1;41373:9;41369:17;41362:47;41426:131;41552:4;41426:131;:::i;:::-;41418:139;;41316:248;;;:::o;41570:419::-;;41774:2;41763:9;41759:18;41751:26;;41823:9;41817:4;41813:20;41809:1;41798:9;41794:17;41787:47;41851:131;41977:4;41851:131;:::i;:::-;41843:139;;41741:248;;;:::o;41995:419::-;;42199:2;42188:9;42184:18;42176:26;;42248:9;42242:4;42238:20;42234:1;42223:9;42219:17;42212:47;42276:131;42402:4;42276:131;:::i;:::-;42268:139;;42166:248;;;:::o;42420:222::-;;42551:2;42540:9;42536:18;42528:26;;42564:71;42632:1;42621:9;42617:17;42608:6;42564:71;:::i;:::-;42518:124;;;;:::o;42648:332::-;;42807:2;42796:9;42792:18;42784:26;;42820:71;42888:1;42877:9;42873:17;42864:6;42820:71;:::i;:::-;42901:72;42969:2;42958:9;42954:18;42945:6;42901:72;:::i;:::-;42774:206;;;;;:::o;42986:1296::-;;43380:3;43369:9;43365:19;43357:27;;43394:71;43462:1;43451:9;43447:17;43438:6;43394:71;:::i;:::-;43475:72;43543:2;43532:9;43528:18;43519:6;43475:72;:::i;:::-;43557;43625:2;43614:9;43610:18;43601:6;43557:72;:::i;:::-;43639;43707:2;43696:9;43692:18;43683:6;43639:72;:::i;:::-;43721:73;43789:3;43778:9;43774:19;43765:6;43721:73;:::i;:::-;43804:67;43866:3;43855:9;43851:19;43842:6;43804:67;:::i;:::-;43881;43943:3;43932:9;43928:19;43919:6;43881:67;:::i;:::-;43958;44020:3;44009:9;44005:19;43996:6;43958:67;:::i;:::-;44035:73;44103:3;44092:9;44088:19;44079:6;44035:73;:::i;:::-;44118;44186:3;44175:9;44171:19;44162:6;44118:73;:::i;:::-;44201:74;44270:3;44259:9;44255:19;44245:7;44201:74;:::i;:::-;43347:935;;;;;;;;;;;;;;:::o;44288:283::-;;44354:2;44348:9;44338:19;;44396:4;44388:6;44384:17;44503:6;44491:10;44488:22;44467:18;44455:10;44452:34;44449:62;44446:2;;;44514:18;;:::i;:::-;44446:2;44554:10;44550:2;44543:22;44328:243;;;;:::o;44577:311::-;;44744:18;44736:6;44733:30;44730:2;;;44766:18;;:::i;:::-;44730:2;44816:4;44808:6;44804:17;44796:25;;44876:4;44870;44866:15;44858:23;;44659:229;;;:::o;44894:311::-;;45061:18;45053:6;45050:30;45047:2;;;45083:18;;:::i;:::-;45047:2;45133:4;45125:6;45121:17;45113:25;;45193:4;45187;45183:15;45175:23;;44976:229;;;:::o;45211:331::-;;45362:18;45354:6;45351:30;45348:2;;;45384:18;;:::i;:::-;45348:2;45469:4;45465:9;45458:4;45450:6;45446:17;45442:33;45434:41;;45530:4;45524;45520:15;45512:23;;45277:265;;;:::o;45548:332::-;;45700:18;45692:6;45689:30;45686:2;;;45722:18;;:::i;:::-;45686:2;45807:4;45803:9;45796:4;45788:6;45784:17;45780:33;45772:41;;45868:4;45862;45858:15;45850:23;;45615:265;;;:::o;45886:132::-;;45976:3;45968:11;;46006:4;46001:3;45997:14;45989:22;;45958:60;;;:::o;46024:114::-;;46125:5;46119:12;46109:22;;46098:40;;;:::o;46144:98::-;;46229:5;46223:12;46213:22;;46202:40;;;:::o;46248:99::-;;46334:5;46328:12;46318:22;;46307:40;;;:::o;46353:113::-;;46455:4;46450:3;46446:14;46438:22;;46428:38;;;:::o;46472:184::-;;46605:6;46600:3;46593:19;46645:4;46640:3;46636:14;46621:29;;46583:73;;;;:::o;46662:168::-;;46779:6;46774:3;46767:19;46819:4;46814:3;46810:14;46795:29;;46757:73;;;;:::o;46836:169::-;;46954:6;46949:3;46942:19;46994:4;46989:3;46985:14;46970:29;;46932:73;;;;:::o;47011:148::-;;47150:3;47135:18;;47125:34;;;;:::o;47165:305::-;;47224:20;47242:1;47224:20;:::i;:::-;47219:25;;47258:20;47276:1;47258:20;:::i;:::-;47253:25;;47412:1;47344:66;47340:74;47337:1;47334:81;47331:2;;;47418:18;;:::i;:::-;47331:2;47462:1;47459;47455:9;47448:16;;47209:261;;;;:::o;47476:185::-;;47533:20;47551:1;47533:20;:::i;:::-;47528:25;;47567:20;47585:1;47567:20;:::i;:::-;47562:25;;47606:1;47596:2;;47611:18;;:::i;:::-;47596:2;47653:1;47650;47646:9;47641:14;;47518:143;;;;:::o;47667:348::-;;47730:20;47748:1;47730:20;:::i;:::-;47725:25;;47764:20;47782:1;47764:20;:::i;:::-;47759:25;;47952:1;47884:66;47880:74;47877:1;47874:81;47869:1;47862:9;47855:17;47851:105;47848:2;;;47959:18;;:::i;:::-;47848:2;48007:1;48004;48000:9;47989:20;;47715:300;;;;:::o;48021:191::-;;48081:20;48099:1;48081:20;:::i;:::-;48076:25;;48115:20;48133:1;48115:20;:::i;:::-;48110:25;;48154:1;48151;48148:8;48145:2;;;48159:18;;:::i;:::-;48145:2;48204:1;48201;48197:9;48189:17;;48066:146;;;;:::o;48218:96::-;;48284:24;48302:5;48284:24;:::i;:::-;48273:35;;48263:51;;;:::o;48320:90::-;;48397:5;48390:13;48383:21;48372:32;;48362:48;;;:::o;48416:77::-;;48482:5;48471:16;;48461:32;;;:::o;48499:149::-;;48575:66;48568:5;48564:78;48553:89;;48543:105;;;:::o;48654:126::-;;48731:42;48724:5;48720:54;48709:65;;48699:81;;;:::o;48786:77::-;;48852:5;48841:16;;48831:32;;;:::o;48869:154::-;48953:6;48948:3;48943;48930:30;49015:1;49006:6;49001:3;48997:16;48990:27;48920:103;;;:::o;49029:307::-;49097:1;49107:113;49121:6;49118:1;49115:13;49107:113;;;49206:1;49201:3;49197:11;49191:18;49187:1;49182:3;49178:11;49171:39;49143:2;49140:1;49136:10;49131:15;;49107:113;;;49238:6;49235:1;49232:13;49229:2;;;49318:1;49309:6;49304:3;49300:16;49293:27;49229:2;49078:258;;;;:::o;49342:320::-;;49423:1;49417:4;49413:12;49403:22;;49470:1;49464:4;49460:12;49491:18;49481:2;;49547:4;49539:6;49535:17;49525:27;;49481:2;49609;49601:6;49598:14;49578:18;49575:38;49572:2;;;49628:18;;:::i;:::-;49572:2;49393:269;;;;:::o;49668:233::-;;49730:24;49748:5;49730:24;:::i;:::-;49721:33;;49776:66;49769:5;49766:77;49763:2;;;49846:18;;:::i;:::-;49763:2;49893:1;49886:5;49882:13;49875:20;;49711:190;;;:::o;49907:100::-;;49975:26;49995:5;49975:26;:::i;:::-;49964:37;;49954:53;;;:::o;50013:94::-;;50081:20;50095:5;50081:20;:::i;:::-;50070:31;;50060:47;;;:::o;50113:176::-;;50162:20;50180:1;50162:20;:::i;:::-;50157:25;;50196:20;50214:1;50196:20;:::i;:::-;50191:25;;50235:1;50225:2;;50240:18;;:::i;:::-;50225:2;50281:1;50278;50274:9;50269:14;;50147:142;;;;:::o;50295:180::-;50343:77;50340:1;50333:88;50440:4;50437:1;50430:15;50464:4;50461:1;50454:15;50481:180;50529:77;50526:1;50519:88;50626:4;50623:1;50616:15;50650:4;50647:1;50640:15;50667:180;50715:77;50712:1;50705:88;50812:4;50809:1;50802:15;50836:4;50833:1;50826:15;50853:180;50901:77;50898:1;50891:88;50998:4;50995:1;50988:15;51022:4;51019:1;51012:15;51039:102;;51131:2;51127:7;51122:2;51115:5;51111:14;51107:28;51097:38;;51087:54;;;:::o;51147:94::-;;51228:5;51224:2;51220:14;51199:35;;51189:52;;;:::o;51247:106::-;;51340:5;51335:3;51331:15;51310:36;;51300:53;;;:::o;51359:833::-;;51436:4;51418:16;51415:26;51412:2;;;51444:5;;51412:2;51482:1;51479;51476;51461:23;51504:34;51535:1;51529:8;51504:34;:::i;:::-;51565:10;51560:3;51557:19;51547:2;;51580:5;;;51547:2;51615;51609:9;51673:1;51655:16;51651:24;51648:1;51642:4;51627:49;51706:4;51700:11;51805:16;51798:4;51790:6;51786:17;51783:39;51750:18;51742:6;51739:30;51723:113;51720:2;;;51851:5;;;;;51720:2;51897:6;51891:4;51887:17;51933:3;51927:10;51960:18;51952:6;51949:30;51946:2;;;51982:5;;;;;;;51946:2;52030:6;52023:4;52018:3;52014:14;52010:27;52067:16;52061:4;52057:27;52052:3;52049:36;52046:2;;;52088:5;;;;;;;;52046:2;52136:29;52158:6;52136:29;:::i;:::-;52129:4;52124:3;52120:14;52116:50;52112:2;52105:62;52183:3;52176:10;;51402:790;;;;;;;;:::o;52198:122::-;52271:24;52289:5;52271:24;:::i;:::-;52264:5;52261:35;52251:2;;52310:1;52307;52300:12;52251:2;52241:79;:::o;52326:116::-;52396:21;52411:5;52396:21;:::i;:::-;52389:5;52386:32;52376:2;;52432:1;52429;52422:12;52376:2;52366:76;:::o;52448:122::-;52521:24;52539:5;52521:24;:::i;:::-;52514:5;52511:35;52501:2;;52560:1;52557;52550:12;52501:2;52491:79;:::o;52576:120::-;52648:23;52665:5;52648:23;:::i;:::-;52641:5;52638:34;52628:2;;52686:1;52683;52676:12;52628:2;52618:78;:::o;52702:122::-;52775:24;52793:5;52775:24;:::i;:::-;52768:5;52765:35;52755:2;;52814:1;52811;52804:12;52755:2;52745:79;:::o

Swarm Source

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