ETH Price: $2,920.78 (+1.65%)
 

Overview

Max Total Supply

979

Holders

187

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x5746abcd8955535dE063DE44C1BE6A090fE1deDF
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:
MythicArmor

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.16;

/*
    _____           __  .__    .__
   /     \ ___.__._/  |_|  |__ |__| ____
  /  \ /  <   |  |\   __\  |  \|  |/ ___\
 /    Y    \___  | |  | |   Y  \  \  \___
 \____|__  / ____| |__| |___|  /__|\___  >
         \/\/                \/        \/
     _____
    /  _  \_______  _____   ___________
   /  /_\  \_  __ \/     \ /  _ \_  __ \
  /    |    \  | \/  Y Y  (  <_> )  | \/
  \____|__  /__|  |__|_|  /\____/|__|
          \/            \/
Standing on the shoulders of giants -- Yuga Labs & CryptoPunks
    * Written by Aleph 0ne for the ApeLiquid community *
 * Mythic Armor by ApeLiquid.io (with OpenSea Creator Fees) *
*/

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

// File @openzeppelin/contracts/token/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/[email protected]

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

pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

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

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File @openzeppelin/contracts/utils/introspection/[email protected]
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}

// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

// File @openzeppelin/contracts/access/[email protected]
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

// SafeMath
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastvalue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value)
        private
        view
        returns (bool)
    {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index)
        private
        view
        returns (bytes32)
    {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index)
        internal
        view
        returns (bytes32)
    {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set)
        internal
        view
        returns (bytes32[] memory)
    {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set)
        internal
        view
        returns (address[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index)
        internal
        view
        returns (uint256)
    {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set)
        internal
        view
        returns (uint256[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// OPENSEA BULLSHIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator)
        external
        view
        returns (bool);

    function register(address registrant) external;

    function registerAndSubscribe(address registrant, address subscription)
        external;

    function registerAndCopyEntries(
        address registrant,
        address registrantToCopy
    ) external;

    function unregister(address addr) external;

    function updateOperator(
        address registrant,
        address operator,
        bool filtered
    ) external;

    function updateOperators(
        address registrant,
        address[] calldata operators,
        bool filtered
    ) external;

    function updateCodeHash(
        address registrant,
        bytes32 codehash,
        bool filtered
    ) external;

    function updateCodeHashes(
        address registrant,
        bytes32[] calldata codeHashes,
        bool filtered
    ) external;

    function subscribe(address registrant, address registrantToSubscribe)
        external;

    function unsubscribe(address registrant, bool copyExistingEntries) external;

    function subscriptionOf(address addr) external returns (address registrant);

    function subscribers(address registrant)
        external
        returns (address[] memory);

    function subscriberAt(address registrant, uint256 index)
        external
        returns (address);

    function copyEntriesOf(address registrant, address registrantToCopy)
        external;

    function isOperatorFiltered(address registrant, address operator)
        external
        returns (bool);

    function isCodeHashOfFiltered(address registrant, address operatorWithCode)
        external
        returns (bool);

    function isCodeHashFiltered(address registrant, bytes32 codeHash)
        external
        returns (bool);

    function filteredOperators(address addr)
        external
        returns (address[] memory);

    function filteredCodeHashes(address addr)
        external
        returns (bytes32[] memory);

    function filteredOperatorAt(address registrant, uint256 index)
        external
        returns (address);

    function filteredCodeHashAt(address registrant, uint256 index)
        external
        returns (bytes32);

    function isRegistered(address addr) external returns (bool);

    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.13;

//import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(
                    address(this),
                    subscriptionOrRegistrantToCopy
                );
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(
                        address(this),
                        subscriptionOrRegistrantToCopy
                    );
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    msg.sender
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (
                !OPERATOR_FILTER_REGISTRY.isOperatorAllowed(
                    address(this),
                    operator
                )
            ) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

pragma solidity ^0.8.0;

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(
        IERC20 indexed token,
        address to,
        uint256 amount
    );
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(
            payees.length == shares_.length,
            "PaymentSplitter: payees and shares length mismatch"
        );
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleased(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function released(IERC20 token, address account)
        public
        view
        returns (uint256)
    {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] += payment;
        _totalReleased += payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function release(IERC20 token, address account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = token.balanceOf(address(this)) +
            totalReleased(token);
        uint256 payment = _pendingPayment(
            account,
            totalReceived,
            released(token, account)
        );

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _erc20Released[token][account] += payment;
        _erc20TotalReleased[token] += payment;

        SafeERC20.safeTransfer(token, account, payment);
        emit ERC20PaymentReleased(token, account, payment);
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        return
            (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(
            account != address(0),
            "PaymentSplitter: account is the zero address"
        );
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(
            _shares[account] == 0,
            "PaymentSplitter: account already has shares"
        );

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

pragma solidity ^0.8.13;

//import {OperatorFilterer} from "./OperatorFilterer.sol";

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default
 *         OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION =
        address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
contract MythicArmor is
    Ownable,
    PaymentSplitter,
    DefaultOperatorFilterer,
    ERC1155
{
    using Strings for uint256;

    // Sale Status
    bool public saleIsActive = false;

    address public LiquidDeployer = 0x866cfDa1B7cD90Cd250485cd8b700211480845D7;
    uint256 public RandomNumberRange = 100;
    string private baseURI = "https://apeliquid.io/armor/json/";
    string public name = "Mythic Armor";

    mapping(uint256 => bool) public validArmor;
    uint256 private maxArmorID = 27;

    // Liquid METL -- bang your head as you read this line of code
    address public METLToken = 0xFcbE615dEf610E806BB64427574A2c5c1fB55510;

    // Specify the IERC20 interface to the METL Token
    IERC20 METLTokenAddress = IERC20(address(METLToken));

    uint256 public mintMETLRequired = 10 ether;
    uint256 public mintETHRequired = 1000000000000000;

    event SetBaseURI(string indexed _baseURI);

    // Enumerate all the items for minting
    constructor() ERC1155("MythicArmor") PaymentSplitter(_payees, _shares) {
        validArmor[1] = true; // Common
        validArmor[2] = true; // Rare
        validArmor[3] = true; // Mythic
        validArmor[4] = true; // Legendary
        validArmor[5] = true; // Divine
        validArmor[6] = true; // Immortal
        validArmor[7] = true; // Battle Droid | Android Matrix
        validArmor[8] = true; // Bloodmoon | Mono Arch
        validArmor[9] = true; // Circuit Shield | Cypher Collective
        validArmor[10] = true; // Dark Ruin | Random
        validArmor[11] = true; // Dark Spectre | Unknown
        validArmor[12] = true; // First Forge | Hammer Planetoid
        validArmor[13] = true; // FTL Armor | Ansible Homeworld
        validArmor[14] = true; // Goo Reaver | Terrene Goo
        validArmor[15] = true; // Guardian | Sword of Light
        validArmor[16] = true; // Ironwood | Seed Terra
        validArmor[17] = true; // iwghargh | Batleth QonoS
        validArmor[18] = true; // Liquid Dragon | Majicka
        validArmor[19] = true; // Liquid Immortality | Any
        validArmor[20] = true; // Luminous | Inherited
        validArmor[21] = true; // Protectorate | New Frontier
        validArmor[22] = true; // Queen's Guard | Trilithium Crystal
        validArmor[23] = true; // Shellden Ring | Eyebeam
        validArmor[24] = true; // Stardust | Interdimensional Portal
        validArmor[25] = true; // Stargazer | Telescope Sphere
        validArmor[26] = true; // Xeno | Polymorph
        validArmor[27] = true; // FUD Butter | Any

        emit SetBaseURI(baseURI);
    }

    // -------------------------------------------------------------------
    // Functions for setting variables and changing values (only by owner)
    // -------------------------------------------------------------------

    function setRandomNumberRange(uint256 r) external onlyOwner {
        RandomNumberRange = r;
    }

    /**
     * @notice Airdrop tokens to multiple addresses at once.
     * No strict supply is set in the contract. All methods are ownerOnly,
     * it is up to the owner to control the supply by not minting
     * past their desired number for each token.
     * @dev Airdrop tokens to each address in the calldata list,
     * setting the supply to the length of the list + previously minted (airdropped) supply.
     * Add an address once per token you would like to send.
     * @param _tokenIds The tokenIDs to send
     * @param _list address[] list of wallets to send tokens to
     * @param _qty The qty of each token we are sending
     */
    function airdrop(
        uint256[] memory _tokenIds,
        address[] calldata _list,
        uint256[] memory _qty
    ) external onlyOwner {
        for (uint256 i = 0; i < _list.length; i++) {
            _mint(_list[i], _tokenIds[i], _qty[i], "Drop-a-palooza error!");
        }
    }

    function updateBaseUri(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
        emit SetBaseURI(baseURI);
    }

    function uri(uint256 typeId) public view override returns (string memory) {
        require(validArmor[typeId], "URI requested for invalid type");
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, typeId.toString()))
                : baseURI;
    }

    // -------------------------------------------------------------------------------
    // MINT and Sale details
    // -------------------------------------------------------------------------------

    event SaleActivation(bool isActive);

    function toggleSaleStatus() external onlyOwner {
        saleIsActive = !saleIsActive;
        emit SaleActivation(saleIsActive);
    }

    event ItemMinted(
        address contractAddress,
        uint256 tokenId,
        uint256 timestamp
    );

    function newMints(uint256 _count) private {
        for (uint256 i = 0; i < _count; i++) {
            uint256 randomItem = RandomNumber(maxArmorID);
            _mint(msg.sender, randomItem, 1, "Mint Failed");
            emit ItemMinted(msg.sender, randomItem, block.timestamp);
        }
    }

    // @notice mint The mint function, which can be done in ETH or METL
    // @params _count How many to mint
    // @params mintInMETL Boolean that determines if mint is in METL (or ETH)
    function mint(uint256 _count, bool mintInMETL)
        public
        payable
    {
        require(saleIsActive, "Sale not active!");
        if (mintInMETL) {
            require(
                METLTokenAddress.allowance(msg.sender, address(this)) >=
                    mintMETLRequired * _count,
                "Error: Transfer not approved"
            );
            METLTokenAddress.transferFrom(
                msg.sender,
                address(this),
                (mintMETLRequired) * _count
            );
        } else {
            require(
                mintETHRequired * _count <= msg.value,
                "Not Enough ETH to mint!"
            );
        }

        newMints(_count);
    }

    // @notice Generate random number based on totalnumbers
    // @param totalnumbers The Maximum number to return (i.e. 100 returns 0-99)
    function RandomNumber(uint256 totalnumbers) public view returns (uint256) {
        uint256 seed = uint256(
            keccak256(
                abi.encodePacked(
                    block.timestamp +
                        block.difficulty +
                        ((
                            uint256(keccak256(abi.encodePacked(block.coinbase)))
                        ) / (block.timestamp)) +
                        block.gaslimit +
                        ((uint256(keccak256(abi.encodePacked(msg.sender)))) /
                            (block.timestamp)) +
                        block.number
                )
            )
        );

        return seed % totalnumbers;
    }

    // -------------------------------------------------------------------------------
    // PRIVATE FUNCTIONS + ADDITIONAL REQUIREMENTS FOR CONTRACT
    // -------------------------------------------------------------------------------

    function DestroyArmor(
        address tokenOwner,
        uint256 tokenId,
        uint256 totalToBurn
    ) external onlyOwner {
        _burn(tokenOwner, tokenId, totalToBurn);
    }

    function changeMintETH(uint256 neweth) external onlyOwner {
        mintETHRequired = neweth;
    }

    function changeMintMETL(uint256 neweth) external onlyOwner {
        mintMETLRequired = neweth;
    }

    function receiveETH() public payable {
        require(msg.value > mintETHRequired, "Not enough ETH");
    }

    // Payments using splitter go here...
    address[] public _payees = [
        0x7FDE663601A53A6953bbb98F1Ab87E86dEE81b35, // Liquid Payments
        0x867Eb0804eACA9FEeda8a0E1d2B9a32eEF58AF8f,
        0x0C07747AB98EE84971C90Fbd353eda207B737c43,
        0xfebbB48C8f7A67Dc3DcEE19524A410E078e6A6a1
    ];
    uint256[] private _shares = [10, 60, 15, 15];

    // Payments
    function claim() external {
        release(payable(msg.sender));
    }

    /**
     * @notice Withdraw all tokens from the contract (emergency function)
     */
    function removeAllMETL() public onlyOwner {
        uint256 balance = METLTokenAddress.balanceOf(address(this));
        METLTokenAddress.transfer(LiquidDeployer, balance);
    }

    // OpenSea's new bullshit requirements, which violate my moral code, but
    // are nonetheless necessary to make this all work properly.
    function setApprovalForAll(address operator, bool approved)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.setApprovalForAll(operator, approved);
    }

    // Take my love, take my land, Take me where I cannot stand.
    // I don't care, I'm still free, You can't take the sky from me.
    //
    function SelfDestruct() external onlyOwner {
        // Walk through all the keys and return them to the contract
        removeAllMETL();
        address payable os = payable(address(LiquidDeployer));
        selfdestruct(os);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ItemMinted","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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SaleActivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"_baseURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"totalToBurn","type":"uint256"}],"name":"DestroyArmor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"LiquidDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METLToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalnumbers","type":"uint256"}],"name":"RandomNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RandomNumberRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SelfDestruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payees","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"_list","type":"address[]"},{"internalType":"uint256[]","name":"_qty","type":"uint256[]"}],"name":"airdrop","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":"neweth","type":"uint256"}],"name":"changeMintETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"neweth","type":"uint256"}],"name":"changeMintMETL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","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":"uint256","name":"_count","type":"uint256"},{"internalType":"bool","name":"mintInMETL","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintETHRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMETLRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiveETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeAllMETL","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"r","type":"uint256"}],"name":"setRandomNumberRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"updateBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validArmor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600b60006101000a81548160ff02191690831515021790555073866cfda1b7cd90cd250485cd8b700211480845d7600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506064600c556040518060400160405280602081526020017f68747470733a2f2f6170656c69717569642e696f2f61726d6f722f6a736f6e2f815250600d9081620000bf919062001356565b506040518060400160405280600c81526020017f4d79746869632041726d6f720000000000000000000000000000000000000000815250600e908162000106919062001356565b50601b60105573fcbe615def610e806bb64427574a2c5c1fb55510601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550678ac7230489e8000060135566038d7ea4c680006014556040518060800160405280737fde663601a53a6953bbb98f1ab87e86dee81b3573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173867eb0804eaca9feeda8a0e1d2b9a32eef58af8f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001730c07747ab98ee84971c90fbd353eda207b737c4373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200173febbb48c8f7a67dc3dcee19524a410e078e6a6a173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681525060159060046200030e92919062000fd7565b506040518060800160405280600a60ff168152602001603c60ff168152602001600f60ff168152602001600f60ff1681525060169060046200035292919062001066565b503480156200036057600080fd5b506040518060400160405280600b81526020017f4d797468696341726d6f72000000000000000000000000000000000000000000815250733cc6cdda760b79bafa08df41ecfa224f810dceb6600160158054806020026020016040519081016040528092919081815260200182805480156200043257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620003e7575b505050505060168054806020026020016040519081016040528092919081815260200182805480156200048557602002820191906000526020600020905b81548152602001906001019080831162000470575b5050505050620004aa6200049e62000cbd60201b60201c565b62000cc560201b60201c565b8051825114620004f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004e890620014c4565b60405180910390fd5b600082511162000538576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200052f9062001536565b60405180910390fd5b60005b8251811015620005a757620005918382815181106200055f576200055e62001558565b5b60200260200101518383815181106200057d576200057c62001558565b5b602002602001015162000d8960201b60201c565b80806200059e90620015b6565b9150506200053b565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200079f57801562000665576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200062b92919062001648565b600060405180830381600087803b1580156200064657600080fd5b505af11580156200065b573d6000803e3d6000fd5b505050506200079e565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200071f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620006e592919062001648565b600060405180830381600087803b1580156200070057600080fd5b505af115801562000715573d6000803e3d6000fd5b505050506200079d565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000768919062001675565b600060405180830381600087803b1580156200078357600080fd5b505af115801562000798573d6000803e3d6000fd5b505050505b5b5b5050620007b28162000fc260201b60201c565b506001600f60006001815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006002815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006003815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006004815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006005815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006006815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006007815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006008815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006009815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600a815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600b815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600c815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600d815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600e815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000600f815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006010815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006011815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006012815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006013815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006014815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006015815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006016815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006017815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006018815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f60006019815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000601a815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600f6000601b815260200190815260200160002060006101000a81548160ff021916908315150217905550600d60405162000c8391906200172c565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a262001960565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000dfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000df290620017bb565b60405180910390fd5b6000811162000e41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e38906200182d565b60405180910390fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541462000ec6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ebd90620018c5565b60405180910390fd5b6005829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508060015462000f7d9190620018e7565b6001819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac828260405162000fb692919062001933565b60405180910390a15050565b80600a908162000fd3919062001356565b5050565b82805482825590600052602060002090810192821562001053579160200282015b82811115620010525782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019062000ff8565b5b509050620010629190620010bd565b5090565b828054828255906000526020600020908101928215620010aa579160200282015b82811115620010a9578251829060ff1690559160200191906001019062001087565b5b509050620010b99190620010bd565b5090565b5b80821115620010d8576000816000905550600101620010be565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200115e57607f821691505b60208210810362001174576200117362001116565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620011de7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200119f565b620011ea86836200119f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062001237620012316200122b8462001202565b6200120c565b62001202565b9050919050565b6000819050919050565b620012538362001216565b6200126b62001262826200123e565b848454620011ac565b825550505050565b600090565b6200128262001273565b6200128f81848462001248565b505050565b5b81811015620012b757620012ab60008262001278565b60018101905062001295565b5050565b601f8211156200130657620012d0816200117a565b620012db846200118f565b81016020851015620012eb578190505b62001303620012fa856200118f565b83018262001294565b50505b505050565b600082821c905092915050565b60006200132b600019846008026200130b565b1980831691505092915050565b600062001346838362001318565b9150826002028217905092915050565b6200136182620010dc565b67ffffffffffffffff8111156200137d576200137c620010e7565b5b62001389825462001145565b62001396828285620012bb565b600060209050601f831160018114620013ce5760008415620013b9578287015190505b620013c5858262001338565b86555062001435565b601f198416620013de866200117a565b60005b828110156200140857848901518255600182019150602085019450602081019050620013e1565b8683101562001428578489015162001424601f89168262001318565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b6000620014ac6032836200143d565b9150620014b9826200144e565b604082019050919050565b60006020820190508181036000830152620014df816200149d565b9050919050565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b60006200151e601a836200143d565b91506200152b82620014e6565b602082019050919050565b6000602082019050818103600083015262001551816200150f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620015c38262001202565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620015f857620015f762001587565b5b600182019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620016308262001603565b9050919050565b620016428162001623565b82525050565b60006040820190506200165f600083018562001637565b6200166e602083018462001637565b9392505050565b60006020820190506200168c600083018462001637565b92915050565b600081905092915050565b60008154620016ac8162001145565b620016b8818662001692565b94506001821660008114620016d65760018114620016ec5762001723565b60ff198316865281151582028601935062001723565b620016f7856200117a565b60005b838110156200171b57815481890152600182019150602081019050620016fa565b838801955050505b50505092915050565b60006200173a82846200169d565b915081905092915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b6000620017a3602c836200143d565b9150620017b08262001745565b604082019050919050565b60006020820190508181036000830152620017d68162001794565b9050919050565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b600062001815601d836200143d565b91506200182282620017dd565b602082019050919050565b60006020820190508181036000830152620018488162001806565b9050919050565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b6000620018ad602b836200143d565b9150620018ba826200184f565b604082019050919050565b60006020820190508181036000830152620018e0816200189e565b9050919050565b6000620018f48262001202565b9150620019018362001202565b92508282019050808211156200191c576200191b62001587565b5b92915050565b6200192d8162001202565b82525050565b60006040820190506200194a600083018562001637565b62001959602083018462001922565b9392505050565b615e6780620019706000396000f3fe60806040526004361061025f5760003560e01c806367f68fac11610144578063d10507a9116100b6578063e985e9c51161007a578063e985e9c514610914578063eb8d244414610951578063ec6cdc8e1461097c578063f242432a146109b9578063f2fde38b146109e2578063f83e092a14610a0b576102a6565b8063d10507a914610841578063d3444b7b1461086a578063d79779b214610895578063dba5e917146108d2578063e33b7de3146108e9576102a6565b80638dfc9b04116101085780638dfc9b041461070b5780639852595c14610736578063a22cb46514610773578063a3c106fa1461079c578063b62d4437146107c7578063ce7c2ac214610804576102a6565b806367f68fac14610647578063715018a6146106635780637a5216641461067a5780638b83209b146106a35780638da5cb5b146106e0576102a6565b8063354c66c3116101dd57806341f43434116101a157806341f434341461054b578063452ca5741461057657806348b750441461059f5780634e1273f4146105c85780634e71d92d14610605578063500c06f41461061c576102a6565b8063354c66c31461048757806339f7e37f146104b05780633a98ef39146104d95780633ecfd51e14610504578063406072a91461050e576102a6565b80630e89341c116102245780630e89341c1461039057806319165587146103cd57806326506ba4146103f6578063283248be146104215780632eb2c2d61461045e576102a6565b8062fdd58e146102ab57806301ffc9a7146102e8578063049c5c4914610325578063059c14fb1461033c57806306fdde0314610365576102a6565b366102a6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061028d610a22565b3460405161029c929190613880565b60405180910390a1005b600080fd5b3480156102b757600080fd5b506102d260048036038101906102cd9190613915565b610a2a565b6040516102df9190613955565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906139c8565b610af3565b60405161031c9190613a10565b60405180910390f35b34801561033157600080fd5b5061033a610bd5565b005b34801561034857600080fd5b50610363600480360381019061035e9190613a2b565b610c4f565b005b34801561037157600080fd5b5061037a610c61565b6040516103879190613ae8565b60405180910390f35b34801561039c57600080fd5b506103b760048036038101906103b29190613a2b565b610cef565b6040516103c49190613ae8565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef9190613b48565b610e2a565b005b34801561040257600080fd5b5061040b610fd4565b6040516104189190613b75565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190613a2b565b610ffa565b6040516104559190613b75565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613d8d565b611039565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613e5c565b6110da565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613f50565b6110f2565b005b3480156104e557600080fd5b506104ee611150565b6040516104fb9190613955565b60405180910390f35b61050c61115a565b005b34801561051a57600080fd5b5061053560048036038101906105309190613fd7565b6111a0565b6040516105429190613955565b60405180910390f35b34801561055757600080fd5b50610560611227565b60405161056d9190614076565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613a2b565b611239565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190613fd7565b61124b565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190614154565b611503565b6040516105fc919061428a565b60405180910390f35b34801561061157600080fd5b5061061a61161c565b005b34801561062857600080fd5b50610631611627565b60405161063e9190613955565b60405180910390f35b610661600480360381019061065c91906142d8565b61162d565b005b34801561066f57600080fd5b50610678611882565b005b34801561068657600080fd5b506106a1600480360381019061069c9190613a2b565b611896565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613a2b565b6118a8565b6040516106d79190613b75565b60405180910390f35b3480156106ec57600080fd5b506106f56118f0565b6040516107029190613b75565b60405180910390f35b34801561071757600080fd5b50610720611919565b60405161072d9190613955565b60405180910390f35b34801561074257600080fd5b5061075d60048036038101906107589190614318565b61191f565b60405161076a9190613955565b60405180910390f35b34801561077f57600080fd5b5061079a60048036038101906107959190614345565b611968565b005b3480156107a857600080fd5b506107b1611a72565b6040516107be9190613955565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190613a2b565b611a78565b6040516107fb9190613a10565b60405180910390f35b34801561081057600080fd5b5061082b60048036038101906108269190614318565b611a98565b6040516108389190613955565b60405180910390f35b34801561084d57600080fd5b50610868600480360381019061086391906143e0565b611ae1565b005b34801561087657600080fd5b5061087f611bad565b60405161088c9190613b75565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b7919061448c565b611bd3565b6040516108c99190613955565b60405180910390f35b3480156108de57600080fd5b506108e7611c1c565b005b3480156108f557600080fd5b506108fe611c6c565b60405161090b9190613955565b60405180910390f35b34801561092057600080fd5b5061093b600480360381019061093691906144b9565b611c76565b6040516109489190613a10565b60405180910390f35b34801561095d57600080fd5b50610966611d0a565b6040516109739190613a10565b60405180910390f35b34801561098857600080fd5b506109a3600480360381019061099e9190613a2b565b611d1d565b6040516109b09190613955565b60405180910390f35b3480156109c557600080fd5b506109e060048036038101906109db91906144f9565b611dff565b005b3480156109ee57600080fd5b50610a096004803603810190610a049190614318565b611ea0565b005b348015610a1757600080fd5b50610a20611f23565b005b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190614602565b60405180910390fd5b6008600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bbe57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bce5750610bcd82612091565b5b9050919050565b610bdd6120fb565b600b60009054906101000a900460ff1615600b60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600b60009054906101000a900460ff16604051610c459190613a10565b60405180910390a1565b610c576120fb565b8060138190555050565b600e8054610c6e90614651565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9a90614651565b8015610ce75780601f10610cbc57610100808354040283529160200191610ce7565b820191906000526020600020905b815481529060010190602001808311610cca57829003601f168201915b505050505081565b6060600f600083815260200190815260200160002060009054906101000a900460ff16610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d48906146ce565b60405180910390fd5b6000600d8054610d6090614651565b905011610df757600d8054610d7490614651565b80601f0160208091040260200160405190810160405280929190818152602001828054610da090614651565b8015610ded5780601f10610dc257610100808354040283529160200191610ded565b820191906000526020600020905b815481529060010190602001808311610dd057829003601f168201915b5050505050610e23565b600d610e0283612179565b604051602001610e139291906147c2565b6040516020818303038152906040525b9050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390614858565b60405180910390fd5b6000610eb6611c6c565b47610ec191906148a7565b90506000610ed88383610ed38661191f565b6122d9565b905060008103610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f149061494d565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f6c91906148a7565b925050819055508060026000828254610f8591906148a7565b92505081905550610f968382612347565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fc792919061498e565b60405180910390a1505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6015818154811061100a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611041610a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611087575061108685611081610a22565b611c76565b5b6110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd90614a29565b60405180910390fd5b6110d3858585858561243b565b5050505050565b6110e26120fb565b6110ed83838361275f565b505050565b6110fa6120fb565b80600d90816111099190614bd6565b50600d6040516111199190614ca8565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a250565b6000600154905090565b601454341161119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614d0b565b60405180910390fd5b565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b6112416120fb565b8060148190555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490614858565b60405180910390fd5b60006112d883611bd3565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113119190613b75565b602060405180830381865afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113529190614d40565b61135c91906148a7565b90506000611374838361136f87876111a0565b6122d9565b9050600081036113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b09061494d565b60405180910390fd5b80600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461144591906148a7565b9250508190555080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149b91906148a7565b925050819055506114ad8484836129a7565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516114f5929190613880565b60405180910390a250505050565b60608151835114611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090614ddf565b60405180910390fd5b6000835167ffffffffffffffff81111561156657611565613b95565b5b6040519080825280602002602001820160405280156115945781602001602082028036833780820191505090505b50905060005b8451811015611611576115e18582815181106115b9576115b8614dff565b5b60200260200101518583815181106115d4576115d3614dff565b5b6020026020010151610a2a565b8282815181106115f4576115f3614dff565b5b6020026020010181815250508061160a90614e2e565b905061159a565b508091505092915050565b61162533610e2a565b565b60145481565b600b60009054906101000a900460ff1661167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390614ec2565b60405180910390fd5b801561182457816013546116909190614ee2565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016116ed929190614f24565b602060405180830381865afa15801561170a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172e9190614d40565b101561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614f99565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856013546117bd9190614ee2565b6040518463ffffffff1660e01b81526004016117db93929190614fb9565b6020604051808303816000875af11580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190615005565b50611875565b34826014546118339190614ee2565b1115611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b9061507e565b60405180910390fd5b5b61187e82612a2d565b5050565b61188a6120fb565b6118946000612adc565b565b61189e6120fb565b80600c8190555050565b6000600582815481106118be576118bd614dff565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a63576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119e0929190614f24565b602060405180830381865afa1580156119fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a219190615005565b611a6257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a599190613b75565b60405180910390fd5b5b611a6d8383612ba0565b505050565b600c5481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ae96120fb565b60005b83839050811015611ba657611b93848483818110611b0d57611b0c614dff565b5b9050602002016020810190611b229190614318565b868381518110611b3557611b34614dff565b5b6020026020010151848481518110611b5057611b4f614dff565b5b60200260200101516040518060400160405280601581526020017f44726f702d612d70616c6f6f7a61206572726f72210000000000000000000000815250612bb6565b8080611b9e90614e2e565b915050611aec565b5050505050565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c246120fb565b611c2c611f23565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16ff5b6000600254905090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900460ff1681565b600080434233604051602001611d3391906150e6565b6040516020818303038152906040528051906020012060001c611d569190615130565b454241604051602001611d69919061518a565b6040516020818303038152906040528051906020012060001c611d8c9190615130565b4442611d9891906148a7565b611da291906148a7565b611dac91906148a7565b611db691906148a7565b611dc091906148a7565b604051602001611dd091906151c6565b6040516020818303038152906040528051906020012060001c90508281611df791906151e1565b915050919050565b611e07610a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611e4d5750611e4c85611e47610a22565b611c76565b5b611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614a29565b60405180910390fd5b611e998585858585612d67565b5050505050565b611ea86120fb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e90615284565b60405180910390fd5b611f2081612adc565b50565b611f2b6120fb565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f889190613b75565b602060405180830381865afa158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190614d40565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161204a929190613880565b6020604051808303816000875af1158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190615005565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612103610a22565b73ffffffffffffffffffffffffffffffffffffffff166121216118f0565b73ffffffffffffffffffffffffffffffffffffffff1614612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e906152f0565b60405180910390fd5b565b6060600082036121c0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122d4565b600082905060005b600082146121f25780806121db90614e2e565b915050600a826121eb9190615130565b91506121c8565b60008167ffffffffffffffff81111561220e5761220d613b95565b5b6040519080825280601f01601f1916602001820160405280156122405781602001600182028036833780820191505090505b5090505b600085146122cd576001826122599190615310565b9150600a8561226891906151e1565b603061227491906148a7565b60f81b81838151811061228a57612289614dff565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122c69190615130565b9450612244565b8093505050505b919050565b600081600154600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561232a9190614ee2565b6123349190615130565b61233e9190615310565b90509392505050565b8047101561238a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238190615390565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123b0906153e1565b60006040518083038185875af1925050503d80600081146123ed576040519150601f19603f3d011682016040523d82523d6000602084013e6123f2565b606091505b5050905080612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90615468565b60405180910390fd5b505050565b815183511461247f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612476906154fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e59061558c565b60405180910390fd5b60006124f8610a22565b9050612508818787878787613005565b60005b84518110156126bc57600085828151811061252957612528614dff565b5b60200260200101519050600085838151811061254857612547614dff565b5b6020026020010151905060006008600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e19061561e565b60405180910390fd5b8181036008600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816008600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a191906148a7565b92505081905550505050806126b590614e2e565b905061250b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161273392919061563e565b60405180910390a461274981878787878761300d565b612757818787878787613015565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c5906156e7565b60405180910390fd5b60006127d8610a22565b905060006127e5846131ec565b905060006127f2846131ec565b905061281283876000858560405180602001604052806000815250613005565b60006008600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156128aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a190615779565b60405180910390fd5b8481036008600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612978929190615799565b60405180910390a461299e8488600086866040518060200160405280600081525061300d565b50505050505050565b612a288363a9059cbb60e01b84846040516024016129c6929190613880565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613266565b505050565b60005b81811015612ad8576000612a45601054611d1d565b9050612a89338260016040518060400160405280600b81526020017f4d696e74204661696c6564000000000000000000000000000000000000000000815250612bb6565b7fd9be9c40c7e99dfc974fa3fe3b790af02afd2939b5dedfccb1ba12933eb27a8e338242604051612abc939291906157c2565b60405180910390a1508080612ad090614e2e565b915050612a30565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612bb2612bab610a22565b838361332d565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1c9061586b565b60405180910390fd5b6000612c2f610a22565b90506000612c3c856131ec565b90506000612c49856131ec565b9050612c5a83600089858589613005565b846008600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cba91906148a7565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612d38929190615799565b60405180910390a4612d4f8360008985858961300d565b612d5e83600089898989613499565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcd9061558c565b60405180910390fd5b6000612de0610a22565b90506000612ded856131ec565b90506000612dfa856131ec565b9050612e0a838989858589613005565b60006008600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e999061561e565b60405180910390fd5b8581036008600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856008600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f5991906148a7565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612fd6929190615799565b60405180910390a4612fec848a8a86868a61300d565b612ffa848a8a8a8a8a613499565b505050505050505050565b505050505050565b505050505050565b6130348473ffffffffffffffffffffffffffffffffffffffff16613670565b156131e4578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161307a9594939291906158e0565b6020604051808303816000875af19250505080156130b657506040513d601f19601f820116820180604052508101906130b3919061595d565b60015b61315b576130c2615997565b806308c379a00361311e57506130d66159b9565b806130e15750613120565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131159190613ae8565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315290615abb565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d990615b4d565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561320b5761320a613b95565b5b6040519080825280602002602001820160405280156132395781602001602082028036833780820191505090505b509050828160008151811061325157613250614dff565b5b60200260200101818152505080915050919050565b60006132c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136939092919063ffffffff16565b905060008151111561332857808060200190518101906132e89190615005565b613327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331e90615bdf565b60405180910390fd5b5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361339b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339290615c71565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161348c9190613a10565b60405180910390a3505050565b6134b88473ffffffffffffffffffffffffffffffffffffffff16613670565b15613668578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016134fe959493929190615c91565b6020604051808303816000875af192505050801561353a57506040513d601f19601f82011682018060405250810190613537919061595d565b60015b6135df57613546615997565b806308c379a0036135a2575061355a6159b9565b8061356557506135a4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135999190613ae8565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d690615abb565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365d90615b4d565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606136a284846000856136ab565b90509392505050565b6060824710156136f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e790615d5d565b60405180910390fd5b6136f985613670565b613738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372f90615dc9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137619190615e1a565b60006040518083038185875af1925050503d806000811461379e576040519150601f19603f3d011682016040523d82523d6000602084013e6137a3565b606091505b50915091506137b38282866137bf565b92505050949350505050565b606083156137cf5782905061381f565b6000835111156137e25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138169190613ae8565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061385182613826565b9050919050565b61386181613846565b82525050565b6000819050919050565b61387a81613867565b82525050565b60006040820190506138956000830185613858565b6138a26020830184613871565b9392505050565b6000604051905090565b600080fd5b600080fd5b6138c681613846565b81146138d157600080fd5b50565b6000813590506138e3816138bd565b92915050565b6138f281613867565b81146138fd57600080fd5b50565b60008135905061390f816138e9565b92915050565b6000806040838503121561392c5761392b6138b3565b5b600061393a858286016138d4565b925050602061394b85828601613900565b9150509250929050565b600060208201905061396a6000830184613871565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139a581613970565b81146139b057600080fd5b50565b6000813590506139c28161399c565b92915050565b6000602082840312156139de576139dd6138b3565b5b60006139ec848285016139b3565b91505092915050565b60008115159050919050565b613a0a816139f5565b82525050565b6000602082019050613a256000830184613a01565b92915050565b600060208284031215613a4157613a406138b3565b5b6000613a4f84828501613900565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a92578082015181840152602081019050613a77565b60008484015250505050565b6000601f19601f8301169050919050565b6000613aba82613a58565b613ac48185613a63565b9350613ad4818560208601613a74565b613add81613a9e565b840191505092915050565b60006020820190508181036000830152613b028184613aaf565b905092915050565b6000613b1582613826565b9050919050565b613b2581613b0a565b8114613b3057600080fd5b50565b600081359050613b4281613b1c565b92915050565b600060208284031215613b5e57613b5d6138b3565b5b6000613b6c84828501613b33565b91505092915050565b6000602082019050613b8a6000830184613858565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bcd82613a9e565b810181811067ffffffffffffffff82111715613bec57613beb613b95565b5b80604052505050565b6000613bff6138a9565b9050613c0b8282613bc4565b919050565b600067ffffffffffffffff821115613c2b57613c2a613b95565b5b602082029050602081019050919050565b600080fd5b6000613c54613c4f84613c10565b613bf5565b90508083825260208201905060208402830185811115613c7757613c76613c3c565b5b835b81811015613ca05780613c8c8882613900565b845260208401935050602081019050613c79565b5050509392505050565b600082601f830112613cbf57613cbe613b90565b5b8135613ccf848260208601613c41565b91505092915050565b600080fd5b600067ffffffffffffffff821115613cf857613cf7613b95565b5b613d0182613a9e565b9050602081019050919050565b82818337600083830152505050565b6000613d30613d2b84613cdd565b613bf5565b905082815260208101848484011115613d4c57613d4b613cd8565b5b613d57848285613d0e565b509392505050565b600082601f830112613d7457613d73613b90565b5b8135613d84848260208601613d1d565b91505092915050565b600080600080600060a08688031215613da957613da86138b3565b5b6000613db7888289016138d4565b9550506020613dc8888289016138d4565b945050604086013567ffffffffffffffff811115613de957613de86138b8565b5b613df588828901613caa565b935050606086013567ffffffffffffffff811115613e1657613e156138b8565b5b613e2288828901613caa565b925050608086013567ffffffffffffffff811115613e4357613e426138b8565b5b613e4f88828901613d5f565b9150509295509295909350565b600080600060608486031215613e7557613e746138b3565b5b6000613e83868287016138d4565b9350506020613e9486828701613900565b9250506040613ea586828701613900565b9150509250925092565b600067ffffffffffffffff821115613eca57613ec9613b95565b5b613ed382613a9e565b9050602081019050919050565b6000613ef3613eee84613eaf565b613bf5565b905082815260208101848484011115613f0f57613f0e613cd8565b5b613f1a848285613d0e565b509392505050565b600082601f830112613f3757613f36613b90565b5b8135613f47848260208601613ee0565b91505092915050565b600060208284031215613f6657613f656138b3565b5b600082013567ffffffffffffffff811115613f8457613f836138b8565b5b613f9084828501613f22565b91505092915050565b6000613fa482613846565b9050919050565b613fb481613f99565b8114613fbf57600080fd5b50565b600081359050613fd181613fab565b92915050565b60008060408385031215613fee57613fed6138b3565b5b6000613ffc85828601613fc2565b925050602061400d858286016138d4565b9150509250929050565b6000819050919050565b600061403c61403761403284613826565b614017565b613826565b9050919050565b600061404e82614021565b9050919050565b600061406082614043565b9050919050565b61407081614055565b82525050565b600060208201905061408b6000830184614067565b92915050565b600067ffffffffffffffff8211156140ac576140ab613b95565b5b602082029050602081019050919050565b60006140d06140cb84614091565b613bf5565b905080838252602082019050602084028301858111156140f3576140f2613c3c565b5b835b8181101561411c578061410888826138d4565b8452602084019350506020810190506140f5565b5050509392505050565b600082601f83011261413b5761413a613b90565b5b813561414b8482602086016140bd565b91505092915050565b6000806040838503121561416b5761416a6138b3565b5b600083013567ffffffffffffffff811115614189576141886138b8565b5b61419585828601614126565b925050602083013567ffffffffffffffff8111156141b6576141b56138b8565b5b6141c285828601613caa565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61420181613867565b82525050565b600061421383836141f8565b60208301905092915050565b6000602082019050919050565b6000614237826141cc565b61424181856141d7565b935061424c836141e8565b8060005b8381101561427d5781516142648882614207565b975061426f8361421f565b925050600181019050614250565b5085935050505092915050565b600060208201905081810360008301526142a4818461422c565b905092915050565b6142b5816139f5565b81146142c057600080fd5b50565b6000813590506142d2816142ac565b92915050565b600080604083850312156142ef576142ee6138b3565b5b60006142fd85828601613900565b925050602061430e858286016142c3565b9150509250929050565b60006020828403121561432e5761432d6138b3565b5b600061433c848285016138d4565b91505092915050565b6000806040838503121561435c5761435b6138b3565b5b600061436a858286016138d4565b925050602061437b858286016142c3565b9150509250929050565b600080fd5b60008083601f8401126143a05761439f613b90565b5b8235905067ffffffffffffffff8111156143bd576143bc614385565b5b6020830191508360208202830111156143d9576143d8613c3c565b5b9250929050565b600080600080606085870312156143fa576143f96138b3565b5b600085013567ffffffffffffffff811115614418576144176138b8565b5b61442487828801613caa565b945050602085013567ffffffffffffffff811115614445576144446138b8565b5b6144518782880161438a565b9350935050604085013567ffffffffffffffff811115614474576144736138b8565b5b61448087828801613caa565b91505092959194509250565b6000602082840312156144a2576144a16138b3565b5b60006144b084828501613fc2565b91505092915050565b600080604083850312156144d0576144cf6138b3565b5b60006144de858286016138d4565b92505060206144ef858286016138d4565b9150509250929050565b600080600080600060a08688031215614515576145146138b3565b5b6000614523888289016138d4565b9550506020614534888289016138d4565b945050604061454588828901613900565b935050606061455688828901613900565b925050608086013567ffffffffffffffff811115614577576145766138b8565b5b61458388828901613d5f565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006145ec602a83613a63565b91506145f782614590565b604082019050919050565b6000602082019050818103600083015261461b816145df565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061466957607f821691505b60208210810361467c5761467b614622565b5b50919050565b7f5552492072657175657374656420666f7220696e76616c696420747970650000600082015250565b60006146b8601e83613a63565b91506146c382614682565b602082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461471b81614651565b61472581866146ee565b94506001821660008114614740576001811461475557614788565b60ff1983168652811515820286019350614788565b61475e856146f9565b60005b8381101561478057815481890152600182019150602081019050614761565b838801955050505b50505092915050565b600061479c82613a58565b6147a681856146ee565b93506147b6818560208601613a74565b80840191505092915050565b60006147ce828561470e565b91506147da8284614791565b91508190509392505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614842602683613a63565b915061484d826147e6565b604082019050919050565b6000602082019050818103600083015261487181614835565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148b282613867565b91506148bd83613867565b92508282019050808211156148d5576148d4614878565b5b92915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614937602b83613a63565b9150614942826148db565b604082019050919050565b600060208201905081810360008301526149668161492a565b9050919050565b600061497882614043565b9050919050565b6149888161496d565b82525050565b60006040820190506149a3600083018561497f565b6149b06020830184613871565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000614a13602f83613a63565b9150614a1e826149b7565b604082019050919050565b60006020820190508181036000830152614a4281614a06565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614a967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a59565b614aa08683614a59565b95508019841693508086168417925050509392505050565b6000614ad3614ace614ac984613867565b614017565b613867565b9050919050565b6000819050919050565b614aed83614ab8565b614b01614af982614ada565b848454614a66565b825550505050565b600090565b614b16614b09565b614b21818484614ae4565b505050565b5b81811015614b4557614b3a600082614b0e565b600181019050614b27565b5050565b601f821115614b8a57614b5b816146f9565b614b6484614a49565b81016020851015614b73578190505b614b87614b7f85614a49565b830182614b26565b50505b505050565b600082821c905092915050565b6000614bad60001984600802614b8f565b1980831691505092915050565b6000614bc68383614b9c565b9150826002028217905092915050565b614bdf82613a58565b67ffffffffffffffff811115614bf857614bf7613b95565b5b614c028254614651565b614c0d828285614b49565b600060209050601f831160018114614c405760008415614c2e578287015190505b614c388582614bba565b865550614ca0565b601f198416614c4e866146f9565b60005b82811015614c7657848901518255600182019150602085019450602081019050614c51565b86831015614c935784890151614c8f601f891682614b9c565b8355505b6001600288020188555050505b505050505050565b6000614cb4828461470e565b915081905092915050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000614cf5600e83613a63565b9150614d0082614cbf565b602082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b600081519050614d3a816138e9565b92915050565b600060208284031215614d5657614d556138b3565b5b6000614d6484828501614d2b565b91505092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614dc9602983613a63565b9150614dd482614d6d565b604082019050919050565b60006020820190508181036000830152614df881614dbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e3982613867565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e6b57614e6a614878565b5b600182019050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b6000614eac601083613a63565b9150614eb782614e76565b602082019050919050565b60006020820190508181036000830152614edb81614e9f565b9050919050565b6000614eed82613867565b9150614ef883613867565b9250828202614f0681613867565b91508282048414831517614f1d57614f1c614878565b5b5092915050565b6000604082019050614f396000830185613858565b614f466020830184613858565b9392505050565b7f4572726f723a205472616e73666572206e6f7420617070726f76656400000000600082015250565b6000614f83601c83613a63565b9150614f8e82614f4d565b602082019050919050565b60006020820190508181036000830152614fb281614f76565b9050919050565b6000606082019050614fce6000830186613858565b614fdb6020830185613858565b614fe86040830184613871565b949350505050565b600081519050614fff816142ac565b92915050565b60006020828403121561501b5761501a6138b3565b5b600061502984828501614ff0565b91505092915050565b7f4e6f7420456e6f7567682045544820746f206d696e7421000000000000000000600082015250565b6000615068601783613a63565b915061507382615032565b602082019050919050565b600060208201905081810360008301526150978161505b565b9050919050565b60008160601b9050919050565b60006150b68261509e565b9050919050565b60006150c8826150ab565b9050919050565b6150e06150db82613846565b6150bd565b82525050565b60006150f282846150cf565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061513b82613867565b915061514683613867565b92508261515657615155615101565b5b828204905092915050565b600061516c826150ab565b9050919050565b61518461517f82613b0a565b615161565b82525050565b60006151968284615173565b60148201915081905092915050565b6000819050919050565b6151c06151bb82613867565b6151a5565b82525050565b60006151d282846151af565b60208201915081905092915050565b60006151ec82613867565b91506151f783613867565b92508261520757615206615101565b5b828206905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061526e602683613a63565b915061527982615212565b604082019050919050565b6000602082019050818103600083015261529d81615261565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006152da602083613a63565b91506152e5826152a4565b602082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b600061531b82613867565b915061532683613867565b925082820390508181111561533e5761533d614878565b5b92915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061537a601d83613a63565b915061538582615344565b602082019050919050565b600060208201905081810360008301526153a98161536d565b9050919050565b600081905092915050565b50565b60006153cb6000836153b0565b91506153d6826153bb565b600082019050919050565b60006153ec826153be565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615452603a83613a63565b915061545d826153f6565b604082019050919050565b6000602082019050818103600083015261548181615445565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006154e4602883613a63565b91506154ef82615488565b604082019050919050565b60006020820190508181036000830152615513816154d7565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615576602583613a63565b91506155818261551a565b604082019050919050565b600060208201905081810360008301526155a581615569565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615608602a83613a63565b9150615613826155ac565b604082019050919050565b60006020820190508181036000830152615637816155fb565b9050919050565b60006040820190508181036000830152615658818561422c565b9050818103602083015261566c818461422c565b90509392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006156d1602383613a63565b91506156dc82615675565b604082019050919050565b60006020820190508181036000830152615700816156c4565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000615763602483613a63565b915061576e82615707565b604082019050919050565b6000602082019050818103600083015261579281615756565b9050919050565b60006040820190506157ae6000830185613871565b6157bb6020830184613871565b9392505050565b60006060820190506157d76000830186613858565b6157e46020830185613871565b6157f16040830184613871565b949350505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615855602183613a63565b9150615860826157f9565b604082019050919050565b6000602082019050818103600083015261588481615848565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006158b28261588b565b6158bc8185615896565b93506158cc818560208601613a74565b6158d581613a9e565b840191505092915050565b600060a0820190506158f56000830188613858565b6159026020830187613858565b8181036040830152615914818661422c565b90508181036060830152615928818561422c565b9050818103608083015261593c81846158a7565b90509695505050505050565b6000815190506159578161399c565b92915050565b600060208284031215615973576159726138b3565b5b600061598184828501615948565b91505092915050565b60008160e01c9050919050565b600060033d11156159b65760046000803e6159b360005161598a565b90505b90565b600060443d10615a46576159cb6138a9565b60043d036004823e80513d602482011167ffffffffffffffff821117156159f3575050615a46565b808201805167ffffffffffffffff811115615a115750505050615a46565b80602083010160043d038501811115615a2e575050505050615a46565b615a3d82602001850186613bc4565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615aa5603483613a63565b9150615ab082615a49565b604082019050919050565b60006020820190508181036000830152615ad481615a98565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615b37602883613a63565b9150615b4282615adb565b604082019050919050565b60006020820190508181036000830152615b6681615b2a565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615bc9602a83613a63565b9150615bd482615b6d565b604082019050919050565b60006020820190508181036000830152615bf881615bbc565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615c5b602983613a63565b9150615c6682615bff565b604082019050919050565b60006020820190508181036000830152615c8a81615c4e565b9050919050565b600060a082019050615ca66000830188613858565b615cb36020830187613858565b615cc06040830186613871565b615ccd6060830185613871565b8181036080830152615cdf81846158a7565b90509695505050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615d47602683613a63565b9150615d5282615ceb565b604082019050919050565b60006020820190508181036000830152615d7681615d3a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615db3601d83613a63565b9150615dbe82615d7d565b602082019050919050565b60006020820190508181036000830152615de281615da6565b9050919050565b6000615df48261588b565b615dfe81856153b0565b9350615e0e818560208601613a74565b80840191505092915050565b6000615e268284615de9565b91508190509291505056fea2646970667358221220c31f4d41f6b6e8f95ea86fd0b251061dea3acca71adedcf7be6542a818aa66fe64736f6c63430008110033

Deployed Bytecode

0x60806040526004361061025f5760003560e01c806367f68fac11610144578063d10507a9116100b6578063e985e9c51161007a578063e985e9c514610914578063eb8d244414610951578063ec6cdc8e1461097c578063f242432a146109b9578063f2fde38b146109e2578063f83e092a14610a0b576102a6565b8063d10507a914610841578063d3444b7b1461086a578063d79779b214610895578063dba5e917146108d2578063e33b7de3146108e9576102a6565b80638dfc9b04116101085780638dfc9b041461070b5780639852595c14610736578063a22cb46514610773578063a3c106fa1461079c578063b62d4437146107c7578063ce7c2ac214610804576102a6565b806367f68fac14610647578063715018a6146106635780637a5216641461067a5780638b83209b146106a35780638da5cb5b146106e0576102a6565b8063354c66c3116101dd57806341f43434116101a157806341f434341461054b578063452ca5741461057657806348b750441461059f5780634e1273f4146105c85780634e71d92d14610605578063500c06f41461061c576102a6565b8063354c66c31461048757806339f7e37f146104b05780633a98ef39146104d95780633ecfd51e14610504578063406072a91461050e576102a6565b80630e89341c116102245780630e89341c1461039057806319165587146103cd57806326506ba4146103f6578063283248be146104215780632eb2c2d61461045e576102a6565b8062fdd58e146102ab57806301ffc9a7146102e8578063049c5c4914610325578063059c14fb1461033c57806306fdde0314610365576102a6565b366102a6577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061028d610a22565b3460405161029c929190613880565b60405180910390a1005b600080fd5b3480156102b757600080fd5b506102d260048036038101906102cd9190613915565b610a2a565b6040516102df9190613955565b60405180910390f35b3480156102f457600080fd5b5061030f600480360381019061030a91906139c8565b610af3565b60405161031c9190613a10565b60405180910390f35b34801561033157600080fd5b5061033a610bd5565b005b34801561034857600080fd5b50610363600480360381019061035e9190613a2b565b610c4f565b005b34801561037157600080fd5b5061037a610c61565b6040516103879190613ae8565b60405180910390f35b34801561039c57600080fd5b506103b760048036038101906103b29190613a2b565b610cef565b6040516103c49190613ae8565b60405180910390f35b3480156103d957600080fd5b506103f460048036038101906103ef9190613b48565b610e2a565b005b34801561040257600080fd5b5061040b610fd4565b6040516104189190613b75565b60405180910390f35b34801561042d57600080fd5b5061044860048036038101906104439190613a2b565b610ffa565b6040516104559190613b75565b60405180910390f35b34801561046a57600080fd5b5061048560048036038101906104809190613d8d565b611039565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613e5c565b6110da565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613f50565b6110f2565b005b3480156104e557600080fd5b506104ee611150565b6040516104fb9190613955565b60405180910390f35b61050c61115a565b005b34801561051a57600080fd5b5061053560048036038101906105309190613fd7565b6111a0565b6040516105429190613955565b60405180910390f35b34801561055757600080fd5b50610560611227565b60405161056d9190614076565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613a2b565b611239565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190613fd7565b61124b565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190614154565b611503565b6040516105fc919061428a565b60405180910390f35b34801561061157600080fd5b5061061a61161c565b005b34801561062857600080fd5b50610631611627565b60405161063e9190613955565b60405180910390f35b610661600480360381019061065c91906142d8565b61162d565b005b34801561066f57600080fd5b50610678611882565b005b34801561068657600080fd5b506106a1600480360381019061069c9190613a2b565b611896565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613a2b565b6118a8565b6040516106d79190613b75565b60405180910390f35b3480156106ec57600080fd5b506106f56118f0565b6040516107029190613b75565b60405180910390f35b34801561071757600080fd5b50610720611919565b60405161072d9190613955565b60405180910390f35b34801561074257600080fd5b5061075d60048036038101906107589190614318565b61191f565b60405161076a9190613955565b60405180910390f35b34801561077f57600080fd5b5061079a60048036038101906107959190614345565b611968565b005b3480156107a857600080fd5b506107b1611a72565b6040516107be9190613955565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190613a2b565b611a78565b6040516107fb9190613a10565b60405180910390f35b34801561081057600080fd5b5061082b60048036038101906108269190614318565b611a98565b6040516108389190613955565b60405180910390f35b34801561084d57600080fd5b50610868600480360381019061086391906143e0565b611ae1565b005b34801561087657600080fd5b5061087f611bad565b60405161088c9190613b75565b60405180910390f35b3480156108a157600080fd5b506108bc60048036038101906108b7919061448c565b611bd3565b6040516108c99190613955565b60405180910390f35b3480156108de57600080fd5b506108e7611c1c565b005b3480156108f557600080fd5b506108fe611c6c565b60405161090b9190613955565b60405180910390f35b34801561092057600080fd5b5061093b600480360381019061093691906144b9565b611c76565b6040516109489190613a10565b60405180910390f35b34801561095d57600080fd5b50610966611d0a565b6040516109739190613a10565b60405180910390f35b34801561098857600080fd5b506109a3600480360381019061099e9190613a2b565b611d1d565b6040516109b09190613955565b60405180910390f35b3480156109c557600080fd5b506109e060048036038101906109db91906144f9565b611dff565b005b3480156109ee57600080fd5b50610a096004803603810190610a049190614318565b611ea0565b005b348015610a1757600080fd5b50610a20611f23565b005b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9190614602565b60405180910390fd5b6008600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bbe57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bce5750610bcd82612091565b5b9050919050565b610bdd6120fb565b600b60009054906101000a900460ff1615600b60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600b60009054906101000a900460ff16604051610c459190613a10565b60405180910390a1565b610c576120fb565b8060138190555050565b600e8054610c6e90614651565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9a90614651565b8015610ce75780601f10610cbc57610100808354040283529160200191610ce7565b820191906000526020600020905b815481529060010190602001808311610cca57829003601f168201915b505050505081565b6060600f600083815260200190815260200160002060009054906101000a900460ff16610d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d48906146ce565b60405180910390fd5b6000600d8054610d6090614651565b905011610df757600d8054610d7490614651565b80601f0160208091040260200160405190810160405280929190818152602001828054610da090614651565b8015610ded5780601f10610dc257610100808354040283529160200191610ded565b820191906000526020600020905b815481529060010190602001808311610dd057829003601f168201915b5050505050610e23565b600d610e0283612179565b604051602001610e139291906147c2565b6040516020818303038152906040525b9050919050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390614858565b60405180910390fd5b6000610eb6611c6c565b47610ec191906148a7565b90506000610ed88383610ed38661191f565b6122d9565b905060008103610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f149061494d565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f6c91906148a7565b925050819055508060026000828254610f8591906148a7565b92505081905550610f968382612347565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b0568382604051610fc792919061498e565b60405180910390a1505050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6015818154811061100a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611041610a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611087575061108685611081610a22565b611c76565b5b6110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd90614a29565b60405180910390fd5b6110d3858585858561243b565b5050505050565b6110e26120fb565b6110ed83838361275f565b505050565b6110fa6120fb565b80600d90816111099190614bd6565b50600d6040516111199190614ca8565b60405180910390207f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa60405160405180910390a250565b6000600154905090565b601454341161119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614d0b565b60405180910390fd5b565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6daaeb6d7670e522a718067333cd4e81565b6112416120fb565b8060148190555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490614858565b60405180910390fd5b60006112d883611bd3565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113119190613b75565b602060405180830381865afa15801561132e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113529190614d40565b61135c91906148a7565b90506000611374838361136f87876111a0565b6122d9565b9050600081036113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b09061494d565b60405180910390fd5b80600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461144591906148a7565b9250508190555080600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149b91906148a7565b925050819055506114ad8484836129a7565b8373ffffffffffffffffffffffffffffffffffffffff167f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a84836040516114f5929190613880565b60405180910390a250505050565b60608151835114611549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154090614ddf565b60405180910390fd5b6000835167ffffffffffffffff81111561156657611565613b95565b5b6040519080825280602002602001820160405280156115945781602001602082028036833780820191505090505b50905060005b8451811015611611576115e18582815181106115b9576115b8614dff565b5b60200260200101518583815181106115d4576115d3614dff565b5b6020026020010151610a2a565b8282815181106115f4576115f3614dff565b5b6020026020010181815250508061160a90614e2e565b905061159a565b508091505092915050565b61162533610e2a565b565b60145481565b600b60009054906101000a900460ff1661167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390614ec2565b60405180910390fd5b801561182457816013546116909190614ee2565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016116ed929190614f24565b602060405180830381865afa15801561170a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172e9190614d40565b101561176f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176690614f99565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856013546117bd9190614ee2565b6040518463ffffffff1660e01b81526004016117db93929190614fb9565b6020604051808303816000875af11580156117fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181e9190615005565b50611875565b34826014546118339190614ee2565b1115611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186b9061507e565b60405180910390fd5b5b61187e82612a2d565b5050565b61188a6120fb565b6118946000612adc565b565b61189e6120fb565b80600c8190555050565b6000600582815481106118be576118bd614dff565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60135481565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a63576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016119e0929190614f24565b602060405180830381865afa1580156119fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a219190615005565b611a6257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a599190613b75565b60405180910390fd5b5b611a6d8383612ba0565b505050565b600c5481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ae96120fb565b60005b83839050811015611ba657611b93848483818110611b0d57611b0c614dff565b5b9050602002016020810190611b229190614318565b868381518110611b3557611b34614dff565b5b6020026020010151848481518110611b5057611b4f614dff565b5b60200260200101516040518060400160405280601581526020017f44726f702d612d70616c6f6f7a61206572726f72210000000000000000000000815250612bb6565b8080611b9e90614e2e565b915050611aec565b5050505050565b600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611c246120fb565b611c2c611f23565b6000600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16ff5b6000600254905090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b60009054906101000a900460ff1681565b600080434233604051602001611d3391906150e6565b6040516020818303038152906040528051906020012060001c611d569190615130565b454241604051602001611d69919061518a565b6040516020818303038152906040528051906020012060001c611d8c9190615130565b4442611d9891906148a7565b611da291906148a7565b611dac91906148a7565b611db691906148a7565b611dc091906148a7565b604051602001611dd091906151c6565b6040516020818303038152906040528051906020012060001c90508281611df791906151e1565b915050919050565b611e07610a22565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611e4d5750611e4c85611e47610a22565b611c76565b5b611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614a29565b60405180910390fd5b611e998585858585612d67565b5050505050565b611ea86120fb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e90615284565b60405180910390fd5b611f2081612adc565b50565b611f2b6120fb565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611f889190613b75565b602060405180830381865afa158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190614d40565b9050601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161204a929190613880565b6020604051808303816000875af1158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190615005565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612103610a22565b73ffffffffffffffffffffffffffffffffffffffff166121216118f0565b73ffffffffffffffffffffffffffffffffffffffff1614612177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216e906152f0565b60405180910390fd5b565b6060600082036121c0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506122d4565b600082905060005b600082146121f25780806121db90614e2e565b915050600a826121eb9190615130565b91506121c8565b60008167ffffffffffffffff81111561220e5761220d613b95565b5b6040519080825280601f01601f1916602001820160405280156122405781602001600182028036833780820191505090505b5090505b600085146122cd576001826122599190615310565b9150600a8561226891906151e1565b603061227491906148a7565b60f81b81838151811061228a57612289614dff565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122c69190615130565b9450612244565b8093505050505b919050565b600081600154600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548561232a9190614ee2565b6123349190615130565b61233e9190615310565b90509392505050565b8047101561238a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238190615390565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516123b0906153e1565b60006040518083038185875af1925050503d80600081146123ed576040519150601f19603f3d011682016040523d82523d6000602084013e6123f2565b606091505b5050905080612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90615468565b60405180910390fd5b505050565b815183511461247f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612476906154fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036124ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e59061558c565b60405180910390fd5b60006124f8610a22565b9050612508818787878787613005565b60005b84518110156126bc57600085828151811061252957612528614dff565b5b60200260200101519050600085838151811061254857612547614dff565b5b6020026020010151905060006008600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156125ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e19061561e565b60405180910390fd5b8181036008600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816008600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126a191906148a7565b92505081905550505050806126b590614e2e565b905061250b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161273392919061563e565b60405180910390a461274981878787878761300d565b612757818787878787613015565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036127ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c5906156e7565b60405180910390fd5b60006127d8610a22565b905060006127e5846131ec565b905060006127f2846131ec565b905061281283876000858560405180602001604052806000815250613005565b60006008600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156128aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a190615779565b60405180910390fd5b8481036008600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612978929190615799565b60405180910390a461299e8488600086866040518060200160405280600081525061300d565b50505050505050565b612a288363a9059cbb60e01b84846040516024016129c6929190613880565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613266565b505050565b60005b81811015612ad8576000612a45601054611d1d565b9050612a89338260016040518060400160405280600b81526020017f4d696e74204661696c6564000000000000000000000000000000000000000000815250612bb6565b7fd9be9c40c7e99dfc974fa3fe3b790af02afd2939b5dedfccb1ba12933eb27a8e338242604051612abc939291906157c2565b60405180910390a1508080612ad090614e2e565b915050612a30565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612bb2612bab610a22565b838361332d565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1c9061586b565b60405180910390fd5b6000612c2f610a22565b90506000612c3c856131ec565b90506000612c49856131ec565b9050612c5a83600089858589613005565b846008600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cba91906148a7565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612d38929190615799565b60405180910390a4612d4f8360008985858961300d565b612d5e83600089898989613499565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcd9061558c565b60405180910390fd5b6000612de0610a22565b90506000612ded856131ec565b90506000612dfa856131ec565b9050612e0a838989858589613005565b60006008600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e999061561e565b60405180910390fd5b8581036008600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856008600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f5991906148a7565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612fd6929190615799565b60405180910390a4612fec848a8a86868a61300d565b612ffa848a8a8a8a8a613499565b505050505050505050565b505050505050565b505050505050565b6130348473ffffffffffffffffffffffffffffffffffffffff16613670565b156131e4578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161307a9594939291906158e0565b6020604051808303816000875af19250505080156130b657506040513d601f19601f820116820180604052508101906130b3919061595d565b60015b61315b576130c2615997565b806308c379a00361311e57506130d66159b9565b806130e15750613120565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131159190613ae8565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315290615abb565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d990615b4d565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561320b5761320a613b95565b5b6040519080825280602002602001820160405280156132395781602001602082028036833780820191505090505b509050828160008151811061325157613250614dff565b5b60200260200101818152505080915050919050565b60006132c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166136939092919063ffffffff16565b905060008151111561332857808060200190518101906132e89190615005565b613327576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331e90615bdf565b60405180910390fd5b5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361339b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339290615c71565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161348c9190613a10565b60405180910390a3505050565b6134b88473ffffffffffffffffffffffffffffffffffffffff16613670565b15613668578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016134fe959493929190615c91565b6020604051808303816000875af192505050801561353a57506040513d601f19601f82011682018060405250810190613537919061595d565b60015b6135df57613546615997565b806308c379a0036135a2575061355a6159b9565b8061356557506135a4565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135999190613ae8565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d690615abb565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365d90615b4d565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606136a284846000856136ab565b90509392505050565b6060824710156136f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e790615d5d565b60405180910390fd5b6136f985613670565b613738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372f90615dc9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516137619190615e1a565b60006040518083038185875af1925050503d806000811461379e576040519150601f19603f3d011682016040523d82523d6000602084013e6137a3565b606091505b50915091506137b38282866137bf565b92505050949350505050565b606083156137cf5782905061381f565b6000835111156137e25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138169190613ae8565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061385182613826565b9050919050565b61386181613846565b82525050565b6000819050919050565b61387a81613867565b82525050565b60006040820190506138956000830185613858565b6138a26020830184613871565b9392505050565b6000604051905090565b600080fd5b600080fd5b6138c681613846565b81146138d157600080fd5b50565b6000813590506138e3816138bd565b92915050565b6138f281613867565b81146138fd57600080fd5b50565b60008135905061390f816138e9565b92915050565b6000806040838503121561392c5761392b6138b3565b5b600061393a858286016138d4565b925050602061394b85828601613900565b9150509250929050565b600060208201905061396a6000830184613871565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139a581613970565b81146139b057600080fd5b50565b6000813590506139c28161399c565b92915050565b6000602082840312156139de576139dd6138b3565b5b60006139ec848285016139b3565b91505092915050565b60008115159050919050565b613a0a816139f5565b82525050565b6000602082019050613a256000830184613a01565b92915050565b600060208284031215613a4157613a406138b3565b5b6000613a4f84828501613900565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a92578082015181840152602081019050613a77565b60008484015250505050565b6000601f19601f8301169050919050565b6000613aba82613a58565b613ac48185613a63565b9350613ad4818560208601613a74565b613add81613a9e565b840191505092915050565b60006020820190508181036000830152613b028184613aaf565b905092915050565b6000613b1582613826565b9050919050565b613b2581613b0a565b8114613b3057600080fd5b50565b600081359050613b4281613b1c565b92915050565b600060208284031215613b5e57613b5d6138b3565b5b6000613b6c84828501613b33565b91505092915050565b6000602082019050613b8a6000830184613858565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bcd82613a9e565b810181811067ffffffffffffffff82111715613bec57613beb613b95565b5b80604052505050565b6000613bff6138a9565b9050613c0b8282613bc4565b919050565b600067ffffffffffffffff821115613c2b57613c2a613b95565b5b602082029050602081019050919050565b600080fd5b6000613c54613c4f84613c10565b613bf5565b90508083825260208201905060208402830185811115613c7757613c76613c3c565b5b835b81811015613ca05780613c8c8882613900565b845260208401935050602081019050613c79565b5050509392505050565b600082601f830112613cbf57613cbe613b90565b5b8135613ccf848260208601613c41565b91505092915050565b600080fd5b600067ffffffffffffffff821115613cf857613cf7613b95565b5b613d0182613a9e565b9050602081019050919050565b82818337600083830152505050565b6000613d30613d2b84613cdd565b613bf5565b905082815260208101848484011115613d4c57613d4b613cd8565b5b613d57848285613d0e565b509392505050565b600082601f830112613d7457613d73613b90565b5b8135613d84848260208601613d1d565b91505092915050565b600080600080600060a08688031215613da957613da86138b3565b5b6000613db7888289016138d4565b9550506020613dc8888289016138d4565b945050604086013567ffffffffffffffff811115613de957613de86138b8565b5b613df588828901613caa565b935050606086013567ffffffffffffffff811115613e1657613e156138b8565b5b613e2288828901613caa565b925050608086013567ffffffffffffffff811115613e4357613e426138b8565b5b613e4f88828901613d5f565b9150509295509295909350565b600080600060608486031215613e7557613e746138b3565b5b6000613e83868287016138d4565b9350506020613e9486828701613900565b9250506040613ea586828701613900565b9150509250925092565b600067ffffffffffffffff821115613eca57613ec9613b95565b5b613ed382613a9e565b9050602081019050919050565b6000613ef3613eee84613eaf565b613bf5565b905082815260208101848484011115613f0f57613f0e613cd8565b5b613f1a848285613d0e565b509392505050565b600082601f830112613f3757613f36613b90565b5b8135613f47848260208601613ee0565b91505092915050565b600060208284031215613f6657613f656138b3565b5b600082013567ffffffffffffffff811115613f8457613f836138b8565b5b613f9084828501613f22565b91505092915050565b6000613fa482613846565b9050919050565b613fb481613f99565b8114613fbf57600080fd5b50565b600081359050613fd181613fab565b92915050565b60008060408385031215613fee57613fed6138b3565b5b6000613ffc85828601613fc2565b925050602061400d858286016138d4565b9150509250929050565b6000819050919050565b600061403c61403761403284613826565b614017565b613826565b9050919050565b600061404e82614021565b9050919050565b600061406082614043565b9050919050565b61407081614055565b82525050565b600060208201905061408b6000830184614067565b92915050565b600067ffffffffffffffff8211156140ac576140ab613b95565b5b602082029050602081019050919050565b60006140d06140cb84614091565b613bf5565b905080838252602082019050602084028301858111156140f3576140f2613c3c565b5b835b8181101561411c578061410888826138d4565b8452602084019350506020810190506140f5565b5050509392505050565b600082601f83011261413b5761413a613b90565b5b813561414b8482602086016140bd565b91505092915050565b6000806040838503121561416b5761416a6138b3565b5b600083013567ffffffffffffffff811115614189576141886138b8565b5b61419585828601614126565b925050602083013567ffffffffffffffff8111156141b6576141b56138b8565b5b6141c285828601613caa565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61420181613867565b82525050565b600061421383836141f8565b60208301905092915050565b6000602082019050919050565b6000614237826141cc565b61424181856141d7565b935061424c836141e8565b8060005b8381101561427d5781516142648882614207565b975061426f8361421f565b925050600181019050614250565b5085935050505092915050565b600060208201905081810360008301526142a4818461422c565b905092915050565b6142b5816139f5565b81146142c057600080fd5b50565b6000813590506142d2816142ac565b92915050565b600080604083850312156142ef576142ee6138b3565b5b60006142fd85828601613900565b925050602061430e858286016142c3565b9150509250929050565b60006020828403121561432e5761432d6138b3565b5b600061433c848285016138d4565b91505092915050565b6000806040838503121561435c5761435b6138b3565b5b600061436a858286016138d4565b925050602061437b858286016142c3565b9150509250929050565b600080fd5b60008083601f8401126143a05761439f613b90565b5b8235905067ffffffffffffffff8111156143bd576143bc614385565b5b6020830191508360208202830111156143d9576143d8613c3c565b5b9250929050565b600080600080606085870312156143fa576143f96138b3565b5b600085013567ffffffffffffffff811115614418576144176138b8565b5b61442487828801613caa565b945050602085013567ffffffffffffffff811115614445576144446138b8565b5b6144518782880161438a565b9350935050604085013567ffffffffffffffff811115614474576144736138b8565b5b61448087828801613caa565b91505092959194509250565b6000602082840312156144a2576144a16138b3565b5b60006144b084828501613fc2565b91505092915050565b600080604083850312156144d0576144cf6138b3565b5b60006144de858286016138d4565b92505060206144ef858286016138d4565b9150509250929050565b600080600080600060a08688031215614515576145146138b3565b5b6000614523888289016138d4565b9550506020614534888289016138d4565b945050604061454588828901613900565b935050606061455688828901613900565b925050608086013567ffffffffffffffff811115614577576145766138b8565b5b61458388828901613d5f565b9150509295509295909350565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006145ec602a83613a63565b91506145f782614590565b604082019050919050565b6000602082019050818103600083015261461b816145df565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061466957607f821691505b60208210810361467c5761467b614622565b5b50919050565b7f5552492072657175657374656420666f7220696e76616c696420747970650000600082015250565b60006146b8601e83613a63565b91506146c382614682565b602082019050919050565b600060208201905081810360008301526146e7816146ab565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461471b81614651565b61472581866146ee565b94506001821660008114614740576001811461475557614788565b60ff1983168652811515820286019350614788565b61475e856146f9565b60005b8381101561478057815481890152600182019150602081019050614761565b838801955050505b50505092915050565b600061479c82613a58565b6147a681856146ee565b93506147b6818560208601613a74565b80840191505092915050565b60006147ce828561470e565b91506147da8284614791565b91508190509392505050565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b6000614842602683613a63565b915061484d826147e6565b604082019050919050565b6000602082019050818103600083015261487181614835565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006148b282613867565b91506148bd83613867565b92508282019050808211156148d5576148d4614878565b5b92915050565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b6000614937602b83613a63565b9150614942826148db565b604082019050919050565b600060208201905081810360008301526149668161492a565b9050919050565b600061497882614043565b9050919050565b6149888161496d565b82525050565b60006040820190506149a3600083018561497f565b6149b06020830184613871565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000614a13602f83613a63565b9150614a1e826149b7565b604082019050919050565b60006020820190508181036000830152614a4281614a06565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614a967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a59565b614aa08683614a59565b95508019841693508086168417925050509392505050565b6000614ad3614ace614ac984613867565b614017565b613867565b9050919050565b6000819050919050565b614aed83614ab8565b614b01614af982614ada565b848454614a66565b825550505050565b600090565b614b16614b09565b614b21818484614ae4565b505050565b5b81811015614b4557614b3a600082614b0e565b600181019050614b27565b5050565b601f821115614b8a57614b5b816146f9565b614b6484614a49565b81016020851015614b73578190505b614b87614b7f85614a49565b830182614b26565b50505b505050565b600082821c905092915050565b6000614bad60001984600802614b8f565b1980831691505092915050565b6000614bc68383614b9c565b9150826002028217905092915050565b614bdf82613a58565b67ffffffffffffffff811115614bf857614bf7613b95565b5b614c028254614651565b614c0d828285614b49565b600060209050601f831160018114614c405760008415614c2e578287015190505b614c388582614bba565b865550614ca0565b601f198416614c4e866146f9565b60005b82811015614c7657848901518255600182019150602085019450602081019050614c51565b86831015614c935784890151614c8f601f891682614b9c565b8355505b6001600288020188555050505b505050505050565b6000614cb4828461470e565b915081905092915050565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b6000614cf5600e83613a63565b9150614d0082614cbf565b602082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b600081519050614d3a816138e9565b92915050565b600060208284031215614d5657614d556138b3565b5b6000614d6484828501614d2b565b91505092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000614dc9602983613a63565b9150614dd482614d6d565b604082019050919050565b60006020820190508181036000830152614df881614dbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e3982613867565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e6b57614e6a614878565b5b600182019050919050565b7f53616c65206e6f74206163746976652100000000000000000000000000000000600082015250565b6000614eac601083613a63565b9150614eb782614e76565b602082019050919050565b60006020820190508181036000830152614edb81614e9f565b9050919050565b6000614eed82613867565b9150614ef883613867565b9250828202614f0681613867565b91508282048414831517614f1d57614f1c614878565b5b5092915050565b6000604082019050614f396000830185613858565b614f466020830184613858565b9392505050565b7f4572726f723a205472616e73666572206e6f7420617070726f76656400000000600082015250565b6000614f83601c83613a63565b9150614f8e82614f4d565b602082019050919050565b60006020820190508181036000830152614fb281614f76565b9050919050565b6000606082019050614fce6000830186613858565b614fdb6020830185613858565b614fe86040830184613871565b949350505050565b600081519050614fff816142ac565b92915050565b60006020828403121561501b5761501a6138b3565b5b600061502984828501614ff0565b91505092915050565b7f4e6f7420456e6f7567682045544820746f206d696e7421000000000000000000600082015250565b6000615068601783613a63565b915061507382615032565b602082019050919050565b600060208201905081810360008301526150978161505b565b9050919050565b60008160601b9050919050565b60006150b68261509e565b9050919050565b60006150c8826150ab565b9050919050565b6150e06150db82613846565b6150bd565b82525050565b60006150f282846150cf565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061513b82613867565b915061514683613867565b92508261515657615155615101565b5b828204905092915050565b600061516c826150ab565b9050919050565b61518461517f82613b0a565b615161565b82525050565b60006151968284615173565b60148201915081905092915050565b6000819050919050565b6151c06151bb82613867565b6151a5565b82525050565b60006151d282846151af565b60208201915081905092915050565b60006151ec82613867565b91506151f783613867565b92508261520757615206615101565b5b828206905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061526e602683613a63565b915061527982615212565b604082019050919050565b6000602082019050818103600083015261529d81615261565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006152da602083613a63565b91506152e5826152a4565b602082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b600061531b82613867565b915061532683613867565b925082820390508181111561533e5761533d614878565b5b92915050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061537a601d83613a63565b915061538582615344565b602082019050919050565b600060208201905081810360008301526153a98161536d565b9050919050565b600081905092915050565b50565b60006153cb6000836153b0565b91506153d6826153bb565b600082019050919050565b60006153ec826153be565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000615452603a83613a63565b915061545d826153f6565b604082019050919050565b6000602082019050818103600083015261548181615445565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006154e4602883613a63565b91506154ef82615488565b604082019050919050565b60006020820190508181036000830152615513816154d7565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615576602583613a63565b91506155818261551a565b604082019050919050565b600060208201905081810360008301526155a581615569565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000615608602a83613a63565b9150615613826155ac565b604082019050919050565b60006020820190508181036000830152615637816155fb565b9050919050565b60006040820190508181036000830152615658818561422c565b9050818103602083015261566c818461422c565b90509392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006156d1602383613a63565b91506156dc82615675565b604082019050919050565b60006020820190508181036000830152615700816156c4565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000615763602483613a63565b915061576e82615707565b604082019050919050565b6000602082019050818103600083015261579281615756565b9050919050565b60006040820190506157ae6000830185613871565b6157bb6020830184613871565b9392505050565b60006060820190506157d76000830186613858565b6157e46020830185613871565b6157f16040830184613871565b949350505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615855602183613a63565b9150615860826157f9565b604082019050919050565b6000602082019050818103600083015261588481615848565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006158b28261588b565b6158bc8185615896565b93506158cc818560208601613a74565b6158d581613a9e565b840191505092915050565b600060a0820190506158f56000830188613858565b6159026020830187613858565b8181036040830152615914818661422c565b90508181036060830152615928818561422c565b9050818103608083015261593c81846158a7565b90509695505050505050565b6000815190506159578161399c565b92915050565b600060208284031215615973576159726138b3565b5b600061598184828501615948565b91505092915050565b60008160e01c9050919050565b600060033d11156159b65760046000803e6159b360005161598a565b90505b90565b600060443d10615a46576159cb6138a9565b60043d036004823e80513d602482011167ffffffffffffffff821117156159f3575050615a46565b808201805167ffffffffffffffff811115615a115750505050615a46565b80602083010160043d038501811115615a2e575050505050615a46565b615a3d82602001850186613bc4565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615aa5603483613a63565b9150615ab082615a49565b604082019050919050565b60006020820190508181036000830152615ad481615a98565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615b37602883613a63565b9150615b4282615adb565b604082019050919050565b60006020820190508181036000830152615b6681615b2a565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000615bc9602a83613a63565b9150615bd482615b6d565b604082019050919050565b60006020820190508181036000830152615bf881615bbc565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615c5b602983613a63565b9150615c6682615bff565b604082019050919050565b60006020820190508181036000830152615c8a81615c4e565b9050919050565b600060a082019050615ca66000830188613858565b615cb36020830187613858565b615cc06040830186613871565b615ccd6060830185613871565b8181036080830152615cdf81846158a7565b90509695505050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000615d47602683613a63565b9150615d5282615ceb565b604082019050919050565b60006020820190508181036000830152615d7681615d3a565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000615db3601d83613a63565b9150615dbe82615d7d565b602082019050919050565b60006020820190508181036000830152615de281615da6565b9050919050565b6000615df48261588b565b615dfe81856153b0565b9350615e0e818560208601613a74565b80840191505092915050565b6000615e268284615de9565b91508190509291505056fea2646970667358221220c31f4d41f6b6e8f95ea86fd0b251061dea3acca71adedcf7be6542a818aa66fe64736f6c63430008110033

Deployed Bytecode Sourcemap

92275:9315:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84560:40;84576:12;:10;:12::i;:::-;84590:9;84560:40;;;;;;;:::i;:::-;;;;;;;;92275:9315;;;;;22071:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21044:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96939:138;;;;;;;;;;;;;:::i;:::-;;99868:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92673:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;96370:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86378:616;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92874:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100140:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24221:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99560:191;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96224:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84691:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99979:110;;;:::i;:::-;;85820:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78822:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99759:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;87262:704;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22554:561;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100482:73;;;;;;;;;;;;;:::i;:::-;;93117:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;97707:741;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43104:103;;;;;;;;;;;;;:::i;:::-;;95147:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86078;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42456:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93068:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85542:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100989:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92562:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92717:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85338:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95918:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92481:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85128:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101349:238;;;;;;;;;;;;;:::i;:::-;;84876:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23447:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92440:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98598:711;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23737:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43362:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100656:181;;;;;;;;;;;;;:::i;:::-;;18746:98;18799:7;18826:10;18819:17;;18746:98;:::o;22071:317::-;22202:7;22268:1;22249:21;;:7;:21;;;22227:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;22358:9;:13;22368:2;22358:13;;;;;;;;;;;:22;22372:7;22358:22;;;;;;;;;;;;;;;;22351:29;;22071:317;;;;:::o;21044:360::-;21191:4;21248:26;21233:41;;;:11;:41;;;;:110;;;;21306:37;21291:52;;;:11;:52;;;;21233:110;:163;;;;21360:36;21384:11;21360:23;:36::i;:::-;21233:163;21213:183;;21044:360;;;:::o;96939:138::-;42342:13;:11;:13::i;:::-;97013:12:::1;;;;;;;;;;;97012:13;96997:12;;:28;;;;;;;;;;;;;;;;;;97041;97056:12;;;;;;;;;;;97041:28;;;;;;:::i;:::-;;;;;;;;96939:138::o:0;99868:103::-;42342:13;:11;:13::i;:::-;99957:6:::1;99938:16;:25;;;;99868:103:::0;:::o;92673:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;96370:309::-;96429:13;96463:10;:18;96474:6;96463:18;;;;;;;;;;;;;;;;;;;;;96455:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;96571:1;96553:7;96547:21;;;;;:::i;:::-;;;:25;:124;;96664:7;96547:124;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96616:7;96625:17;:6;:15;:17::i;:::-;96599:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96547:124;96527:144;;96370:309;;;:::o;86378:616::-;86473:1;86454:7;:16;86462:7;86454:16;;;;;;;;;;;;;;;;:20;86446:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;86530:21;86578:15;:13;:15::i;:::-;86554:21;:39;;;;:::i;:::-;86530:63;;86604:15;86622:108;86652:7;86674:13;86702:17;86711:7;86702:8;:17::i;:::-;86622:15;:108::i;:::-;86604:126;;86762:1;86751:7;:12;86743:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;86846:7;86824:9;:18;86834:7;86824:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;86882:7;86864:14;;:25;;;;;;;:::i;:::-;;;;;;;;86902:35;86920:7;86929;86902:17;:35::i;:::-;86953:33;86969:7;86978;86953:33;;;;;;;:::i;:::-;;;;;;;;86435:559;;86378:616;:::o;92874:69::-;;;;;;;;;;;;;:::o;100140:265::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24221:439::-;24462:12;:10;:12::i;:::-;24454:20;;:4;:20;;;:60;;;;24478:36;24495:4;24501:12;:10;:12::i;:::-;24478:16;:36::i;:::-;24454:60;24432:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;24600:52;24623:4;24629:2;24633:3;24638:7;24647:4;24600:22;:52::i;:::-;24221:439;;;;;:::o;99560:191::-;42342:13;:11;:13::i;:::-;99704:39:::1;99710:10;99722:7;99731:11;99704:5;:39::i;:::-;99560:191:::0;;;:::o;96224:138::-;42342:13;:11;:13::i;:::-;96311:8:::1;96301:7;:18;;;;;;:::i;:::-;;96346:7;96335:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;96224:138:::0;:::o;84691:91::-;84735:7;84762:12;;84755:19;;84691:91;:::o;99979:110::-;100047:15;;100035:9;:27;100027:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;99979:110::o;85820:167::-;85917:7;85949:14;:21;85964:5;85949:21;;;;;;;;;;;;;;;:30;85971:7;85949:30;;;;;;;;;;;;;;;;85942:37;;85820:167;;;;:::o;78822:143::-;78922:42;78822:143;:::o;99759:101::-;42342:13;:11;:13::i;:::-;99846:6:::1;99828:15;:24;;;;99759:101:::0;:::o;87262:704::-;87363:1;87344:7;:16;87352:7;87344:16;;;;;;;;;;;;;;;;:20;87336:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;87420:21;87490:20;87504:5;87490:13;:20::i;:::-;87444:5;:15;;;87468:4;87444:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;;:::i;:::-;87420:90;;87521:15;87539:115;87569:7;87591:13;87619:24;87628:5;87635:7;87619:8;:24::i;:::-;87539:15;:115::i;:::-;87521:133;;87686:1;87675:7;:12;87667:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;87782:7;87748:14;:21;87763:5;87748:21;;;;;;;;;;;;;;;:30;87770:7;87748:30;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;87830:7;87800:19;:26;87820:5;87800:26;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;87850:47;87873:5;87880:7;87889;87850:22;:47::i;:::-;87934:5;87913:45;;;87941:7;87950;87913:45;;;;;;;:::i;:::-;;;;;;;;87325:641;;87262:704;;:::o;22554:561::-;22710:16;22785:3;:10;22766:8;:15;:29;22744:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;22877:30;22924:8;:15;22910:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22877:63;;22958:9;22953:122;22977:8;:15;22973:1;:19;22953:122;;;23033:30;23043:8;23052:1;23043:11;;;;;;;;:::i;:::-;;;;;;;;23056:3;23060:1;23056:6;;;;;;;;:::i;:::-;;;;;;;;23033:9;:30::i;:::-;23014:13;23028:1;23014:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;22994:3;;;;:::i;:::-;;;22953:122;;;;23094:13;23087:20;;;22554:561;;;;:::o;100482:73::-;100519:28;100535:10;100519:7;:28::i;:::-;100482:73::o;93117:49::-;;;;:::o;97707:741::-;97811:12;;;;;;;;;;;97803:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;97859:10;97855:557;;;98009:6;97990:16;;:25;;;;:::i;:::-;97912:16;;;;;;;;;;;:26;;;97939:10;97959:4;97912:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:103;;97886:193;;;;;;;;;;;;:::i;:::-;;;;;;;;;98094:16;;;;;;;;;;;:29;;;98142:10;98179:4;98224:6;98204:16;;98203:27;;;;:::i;:::-;98094:151;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;97855:557;;;98332:9;98322:6;98304:15;;:24;;;;:::i;:::-;:37;;98278:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;97855:557;98424:16;98433:6;98424:8;:16::i;:::-;97707:741;;:::o;43104:103::-;42342:13;:11;:13::i;:::-;43169:30:::1;43196:1;43169:18;:30::i;:::-;43104:103::o:0;95147:100::-;42342:13;:11;:13::i;:::-;95238:1:::1;95218:17;:21;;;;95147:100:::0;:::o;86078:::-;86129:7;86156;86164:5;86156:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;86149:21;;86078:100;;;:::o;42456:87::-;42502:7;42529:6;;;;;;;;;;;42522:13;;42456:87;:::o;93068:42::-;;;;:::o;85542:109::-;85598:7;85625:9;:18;85635:7;85625:18;;;;;;;;;;;;;;;;85618:25;;85542:109;;;:::o;100989:208::-;101120:8;81091:1;78922:42;81043:45;;;:49;81039:318;;;78922:42;81132;;;81205:4;81233:8;81132:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81109:237;;81321:8;81302:28;;;;;;;;;;;:::i;:::-;;;;;;;;81109:237;81039:318;101146:43:::1;101170:8;101180;101146:23;:43::i;:::-;100989:208:::0;;;:::o;92562:38::-;;;;:::o;92717:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;85338:105::-;85392:7;85419;:16;85427:7;85419:16;;;;;;;;;;;;;;;;85412:23;;85338:105;;;:::o;95918:298::-;42342:13;:11;:13::i;:::-;96081:9:::1;96076:133;96100:5;;:12;;96096:1;:16;96076:133;;;96134:63;96140:5;;96146:1;96140:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;96150:9;96160:1;96150:12;;;;;;;;:::i;:::-;;;;;;;;96164:4;96169:1;96164:7;;;;;;;;:::i;:::-;;;;;;;;96134:63;;;;;;;;;;;;;;;;::::0;:5:::1;:63::i;:::-;96114:3;;;;;:::i;:::-;;;;96076:133;;;;95918:298:::0;;;;:::o;92481:74::-;;;;;;;;;;;;;:::o;85128:119::-;85186:7;85213:19;:26;85233:5;85213:26;;;;;;;;;;;;;;;;85206:33;;85128:119;;;:::o;101349:238::-;42342:13;:11;:13::i;:::-;101473:15:::1;:13;:15::i;:::-;101499:18;101536:14;;;;;;;;;;;101499:53;;101576:2;101563:16;;;84876:95:::0;84922:7;84949:14;;84942:21;;84876:95;:::o;23447:218::-;23591:4;23620:18;:27;23639:7;23620:27;;;;;;;;;;;;;;;:37;23648:8;23620:37;;;;;;;;;;;;;;;;;;;;;;;;;23613:44;;23447:218;;;;:::o;92440:32::-;;;;;;;;;;;;;:::o;98598:711::-;98663:7;98683:12;99205;99160:15;99113:10;99096:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;99086:39;;;;;;99078:48;;99077:99;;;;:::i;:::-;99034:14;98989:15;98941:14;98924:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;98914:43;;;;;;98906:52;;98875:130;;;;:::i;:::-;98830:16;98787:15;:59;;;;:::i;:::-;:219;;;;:::i;:::-;:261;;;;:::i;:::-;:390;;;;:::i;:::-;:430;;;;:::i;:::-;98748:488;;;;;;;;:::i;:::-;;;;;;;;;;;;;98720:531;;;;;;98698:564;;98683:579;;99289:12;99282:4;:19;;;;:::i;:::-;99275:26;;;98598:711;;;:::o;23737:407::-;23953:12;:10;:12::i;:::-;23945:20;;:4;:20;;;:60;;;;23969:36;23986:4;23992:12;:10;:12::i;:::-;23969:16;:36::i;:::-;23945:60;23923:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;24091:45;24109:4;24115:2;24119;24123:6;24131:4;24091:17;:45::i;:::-;23737:407;;;;;:::o;43362:238::-;42342:13;:11;:13::i;:::-;43485:1:::1;43465:22;;:8;:22;;::::0;43443:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43564:28;43583:8;43564:18;:28::i;:::-;43362:238:::0;:::o;100656:181::-;42342:13;:11;:13::i;:::-;100709:15:::1;100727:16;;;;;;;;;;;:26;;;100762:4;100727:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;100709:59;;100779:16;;;;;;;;;;;:25;;;100805:14;;;;;;;;;;;100821:7;100779:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;100698:139;100656:181::o:0;19825:207::-;19955:4;19999:25;19984:40;;;:11;:40;;;;19977:47;;19825:207;;;:::o;42621:132::-;42696:12;:10;:12::i;:::-;42685:23;;:7;:5;:7::i;:::-;:23;;;42677:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42621:132::o;39097:723::-;39153:13;39383:1;39374:5;:10;39370:53;;39401:10;;;;;;;;;;;;;;;;;;;;;39370:53;39433:12;39448:5;39433:20;;39464:14;39489:78;39504:1;39496:4;:9;39489:78;;39522:8;;;;;:::i;:::-;;;;39553:2;39545:10;;;;;:::i;:::-;;;39489:78;;;39577:19;39609:6;39599:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39577:39;;39627:154;39643:1;39634:5;:10;39627:154;;39671:1;39661:11;;;;;:::i;:::-;;;39738:2;39730:5;:10;;;;:::i;:::-;39717:2;:24;;;;:::i;:::-;39704:39;;39687:6;39694;39687:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;39767:2;39758:11;;;;;:::i;:::-;;;39627:154;;;39805:6;39791:21;;;;;39097:723;;;;:::o;88144:261::-;88290:7;88382:15;88367:12;;88347:7;:16;88355:7;88347:16;;;;;;;;;;;;;;;;88331:13;:32;;;;:::i;:::-;88330:49;;;;:::i;:::-;:67;;;;:::i;:::-;88310:87;;88144:261;;;;;:::o;11539:391::-;11668:6;11643:21;:31;;11621:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;11745:12;11763:9;:14;;11785:6;11763:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11744:52;;;11829:7;11807:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;11610:320;11539:391;;:::o;26493:1321::-;26734:7;:14;26720:3;:10;:28;26698:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;26849:1;26835:16;;:2;:16;;;26827:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26906:16;26925:12;:10;:12::i;:::-;26906:31;;26950:60;26971:8;26981:4;26987:2;26991:3;26996:7;27005:4;26950:20;:60::i;:::-;27028:9;27023:470;27047:3;:10;27043:1;:14;27023:470;;;27079:10;27092:3;27096:1;27092:6;;;;;;;;:::i;:::-;;;;;;;;27079:19;;27113:14;27130:7;27138:1;27130:10;;;;;;;;:::i;:::-;;;;;;;;27113:27;;27157:19;27179:9;:13;27189:2;27179:13;;;;;;;;;;;:19;27193:4;27179:19;;;;;;;;;;;;;;;;27157:41;;27254:6;27239:11;:21;;27213:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;27418:6;27404:11;:20;27382:9;:13;27392:2;27382:13;;;;;;;;;;;:19;27396:4;27382:19;;;;;;;;;;;;;;;:42;;;;27475:6;27454:9;:13;27464:2;27454:13;;;;;;;;;;;:17;27468:2;27454:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27064:429;;;27059:3;;;;:::i;:::-;;;27023:470;;;;27540:2;27510:47;;27534:4;27510:47;;27524:8;27510:47;;;27544:3;27549:7;27510:47;;;;;;;:::i;:::-;;;;;;;;27570:59;27590:8;27600:4;27606:2;27610:3;27615:7;27624:4;27570:19;:59::i;:::-;27642:164;27692:8;27715:4;27734:2;27751:3;27769:7;27791:4;27642:35;:164::i;:::-;26687:1127;26493:1321;;;;;:::o;31590:808::-;31733:1;31717:18;;:4;:18;;;31709:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31788:16;31807:12;:10;:12::i;:::-;31788:31;;31830:20;31853:21;31871:2;31853:17;:21::i;:::-;31830:44;;31885:24;31912:25;31930:6;31912:17;:25::i;:::-;31885:52;;31950:66;31971:8;31981:4;31995:1;31999:3;32004:7;31950:66;;;;;;;;;;;;:20;:66::i;:::-;32029:19;32051:9;:13;32061:2;32051:13;;;;;;;;;;;:19;32065:4;32051:19;;;;;;;;;;;;;;;;32029:41;;32104:6;32089:11;:21;;32081:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;32223:6;32209:11;:20;32187:9;:13;32197:2;32187:13;;;;;;;;;;;:19;32201:4;32187:19;;;;;;;;;;;;;;;:42;;;;32297:1;32258:54;;32283:4;32258:54;;32273:8;32258:54;;;32301:2;32305:6;32258:54;;;;;;;:::i;:::-;;;;;;;;32325:65;32345:8;32355:4;32369:1;32373:3;32378:7;32325:65;;;;;;;;;;;;:19;:65::i;:::-;31698:700;;;;31590:808;;;:::o;55979:248::-;56096:123;56130:5;56173:23;;;56198:2;56202:5;56150:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56096:19;:123::i;:::-;55979:248;;;:::o;97205:302::-;97263:9;97258:242;97282:6;97278:1;:10;97258:242;;;97310:18;97331:24;97344:10;;97331:12;:24::i;:::-;97310:45;;97370:47;97376:10;97388;97400:1;97370:47;;;;;;;;;;;;;;;;;:5;:47::i;:::-;97437:51;97448:10;97460;97472:15;97437:51;;;;;;;;:::i;:::-;;;;;;;;97295:205;97290:3;;;;;:::i;:::-;;;;97258:242;;;;97205:302;:::o;43760:191::-;43834:16;43853:6;;;;;;;;;;;43834:25;;43879:8;43870:6;;:17;;;;;;;;;;;;;;;;;;43934:8;43903:40;;43924:8;43903:40;;;;;;;;;;;;43823:128;43760:191;:::o;23188:187::-;23315:52;23334:12;:10;:12::i;:::-;23348:8;23358;23315:18;:52::i;:::-;23188:187;;:::o;29132:818::-;29299:1;29285:16;;:2;:16;;;29277:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29352:16;29371:12;:10;:12::i;:::-;29352:31;;29394:20;29417:21;29435:2;29417:17;:21::i;:::-;29394:44;;29449:24;29476:25;29494:6;29476:17;:25::i;:::-;29449:52;;29514:66;29535:8;29553:1;29557:2;29561:3;29566:7;29575:4;29514:20;:66::i;:::-;29614:6;29593:9;:13;29603:2;29593:13;;;;;;;;;;;:17;29607:2;29593:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29673:2;29636:52;;29669:1;29636:52;;29651:8;29636:52;;;29677:2;29681:6;29636:52;;;;;;;:::i;:::-;;;;;;;;29701:65;29721:8;29739:1;29743:2;29747:3;29752:7;29761:4;29701:19;:65::i;:::-;29779:163;29824:8;29855:1;29872:2;29889;29906:6;29927:4;29779:30;:163::i;:::-;29266:684;;;29132:818;;;;:::o;25124:1011::-;25326:1;25312:16;;:2;:16;;;25304:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;25383:16;25402:12;:10;:12::i;:::-;25383:31;;25425:20;25448:21;25466:2;25448:17;:21::i;:::-;25425:44;;25480:24;25507:25;25525:6;25507:17;:25::i;:::-;25480:52;;25545:60;25566:8;25576:4;25582:2;25586:3;25591:7;25600:4;25545:20;:60::i;:::-;25618:19;25640:9;:13;25650:2;25640:13;;;;;;;;;;;:19;25654:4;25640:19;;;;;;;;;;;;;;;;25618:41;;25707:6;25692:11;:21;;25670:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;25855:6;25841:11;:20;25819:9;:13;25829:2;25819:13;;;;;;;;;;;:19;25833:4;25819:19;;;;;;;;;;;;;;;:42;;;;25904:6;25883:9;:13;25893:2;25883:13;;;;;;;;;;;:17;25897:2;25883:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;25959:2;25928:46;;25953:4;25928:46;;25943:8;25928:46;;;25963:2;25967:6;25928:46;;;;;;;:::i;:::-;;;;;;;;25987:59;26007:8;26017:4;26023:2;26027:3;26032:7;26041:4;25987:19;:59::i;:::-;26059:68;26090:8;26100:4;26106:2;26110;26114:6;26122:4;26059:30;:68::i;:::-;25293:842;;;;25124:1011;;;;;:::o;35135:221::-;;;;;;;:::o;36311:220::-;;;;;;;:::o;37445:975::-;37685:15;:2;:13;;;:15::i;:::-;37681:732;;;37755:2;37738:43;;;37804:8;37835:4;37862:3;37888:7;37918:4;37738:203;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37717:685;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;38275:6;38268:14;;;;;;;;;;;:::i;:::-;;;;;;;;37717:685;;;38324:62;;;;;;;;;;:::i;:::-;;;;;;;;37717:685;38038:48;;;38026:60;;;:8;:60;;;;38000:199;;38129:50;;;;;;;;;;:::i;:::-;;;;;;;;38000:199;37955:259;37681:732;37445:975;;;;;;:::o;38428:230::-;38521:16;38555:22;38594:1;38580:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38555:41;;38618:7;38607:5;38613:1;38607:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;38645:5;38638:12;;;38428:230;;;:::o;58946:802::-;59370:23;59396:106;59438:4;59396:106;;;;;;;;;;;;;;;;;59404:5;59396:27;;;;:106;;;;;:::i;:::-;59370:132;;59537:1;59517:10;:17;:21;59513:228;;;59632:10;59621:30;;;;;;;;;;;;:::i;:::-;59595:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;59513:228;59016:732;58946:802;;:::o;33846:331::-;34001:8;33992:17;;:5;:17;;;33984:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;34104:8;34066:18;:25;34085:5;34066:25;;;;;;;;;;;;;;;:35;34092:8;34066:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;34150:8;34128:41;;34143:5;34128:41;;;34160:8;34128:41;;;;;;:::i;:::-;;;;;;;;33846:331;;;:::o;36539:898::-;36754:15;:2;:13;;;:15::i;:::-;36750:680;;;36824:2;36807:38;;;36868:8;36899:4;36926:2;36951:6;36980:4;36807:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36786:633;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;37292:6;37285:14;;;;;;;;;;;:::i;:::-;;;;;;;;36786:633;;;37341:62;;;;;;;;;;:::i;:::-;;;;;;;;36786:633;37078:43;;;37066:55;;;:8;:55;;;;37062:154;;37146:50;;;;;;;;;;:::i;:::-;;;;;;;;37062:154;37017:214;36750:680;36539:898;;;;;;:::o;10278:326::-;10338:4;10595:1;10573:7;:19;;;:23;10566:30;;10278:326;;;:::o;13120:229::-;13257:12;13289:52;13311:6;13319:4;13325:1;13328:12;13289:21;:52::i;:::-;13282:59;;13120:229;;;;;:::o;14336:571::-;14506:12;14578:5;14553:21;:30;;14531:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;14668:18;14679:6;14668:10;:18::i;:::-;14660:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;14734:12;14748:23;14775:6;:11;;14794:5;14815:4;14775:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14733:97;;;;14848:51;14865:7;14874:10;14886:12;14848:16;:51::i;:::-;14841:58;;;;14336:571;;;;;;:::o;17296:762::-;17446:12;17475:7;17471:580;;;17506:10;17499:17;;;;17471:580;17640:1;17620:10;:17;:21;17616:424;;;17868:10;17862:17;17929:15;17916:10;17912:2;17908:19;17901:44;17616:424;18011:12;18004:20;;;;;;;;;;;:::i;:::-;;;;;;;;17296:762;;;;;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:77::-;402:7;431:5;420:16;;365:77;;;:::o;448:118::-;535:24;553:5;535:24;:::i;:::-;530:3;523:37;448:118;;:::o;572:332::-;693:4;731:2;720:9;716:18;708:26;;744:71;812:1;801:9;797:17;788:6;744:71;:::i;:::-;825:72;893:2;882:9;878:18;869:6;825:72;:::i;:::-;572:332;;;;;:::o;910:75::-;943:6;976:2;970:9;960:19;;910:75;:::o;991:117::-;1100:1;1097;1090:12;1114:117;1223:1;1220;1213:12;1237:122;1310:24;1328:5;1310:24;:::i;:::-;1303:5;1300:35;1290:63;;1349:1;1346;1339:12;1290:63;1237:122;:::o;1365:139::-;1411:5;1449:6;1436:20;1427:29;;1465:33;1492:5;1465:33;:::i;:::-;1365:139;;;;:::o;1510:122::-;1583:24;1601:5;1583:24;:::i;:::-;1576:5;1573:35;1563:63;;1622:1;1619;1612:12;1563:63;1510:122;:::o;1638:139::-;1684:5;1722:6;1709:20;1700:29;;1738:33;1765:5;1738:33;:::i;:::-;1638:139;;;;:::o;1783:474::-;1851:6;1859;1908:2;1896:9;1887:7;1883:23;1879:32;1876:119;;;1914:79;;:::i;:::-;1876:119;2034:1;2059:53;2104:7;2095:6;2084:9;2080:22;2059:53;:::i;:::-;2049:63;;2005:117;2161:2;2187:53;2232:7;2223:6;2212:9;2208:22;2187:53;:::i;:::-;2177:63;;2132:118;1783:474;;;;;:::o;2263:222::-;2356:4;2394:2;2383:9;2379:18;2371:26;;2407:71;2475:1;2464:9;2460:17;2451:6;2407:71;:::i;:::-;2263:222;;;;:::o;2491:149::-;2527:7;2567:66;2560:5;2556:78;2545:89;;2491:149;;;:::o;2646:120::-;2718:23;2735:5;2718:23;:::i;:::-;2711:5;2708:34;2698:62;;2756:1;2753;2746:12;2698:62;2646:120;:::o;2772:137::-;2817:5;2855:6;2842:20;2833:29;;2871:32;2897:5;2871:32;:::i;:::-;2772:137;;;;:::o;2915:327::-;2973:6;3022:2;3010:9;3001:7;2997:23;2993:32;2990:119;;;3028:79;;:::i;:::-;2990:119;3148:1;3173:52;3217:7;3208:6;3197:9;3193:22;3173:52;:::i;:::-;3163:62;;3119:116;2915:327;;;;:::o;3248:90::-;3282:7;3325:5;3318:13;3311:21;3300:32;;3248:90;;;:::o;3344:109::-;3425:21;3440:5;3425:21;:::i;:::-;3420:3;3413:34;3344:109;;:::o;3459:210::-;3546:4;3584:2;3573:9;3569:18;3561:26;;3597:65;3659:1;3648:9;3644:17;3635:6;3597:65;:::i;:::-;3459:210;;;;:::o;3675:329::-;3734:6;3783:2;3771:9;3762:7;3758:23;3754:32;3751:119;;;3789:79;;:::i;:::-;3751:119;3909:1;3934:53;3979:7;3970:6;3959:9;3955:22;3934:53;:::i;:::-;3924:63;;3880:117;3675:329;;;;:::o;4010:99::-;4062:6;4096:5;4090:12;4080:22;;4010:99;;;:::o;4115:169::-;4199:11;4233:6;4228:3;4221:19;4273:4;4268:3;4264:14;4249:29;;4115:169;;;;:::o;4290:246::-;4371:1;4381:113;4395:6;4392:1;4389:13;4381:113;;;4480:1;4475:3;4471:11;4465:18;4461:1;4456:3;4452:11;4445:39;4417:2;4414:1;4410:10;4405:15;;4381:113;;;4528:1;4519:6;4514:3;4510:16;4503:27;4352:184;4290:246;;;:::o;4542:102::-;4583:6;4634:2;4630:7;4625:2;4618:5;4614:14;4610:28;4600:38;;4542:102;;;:::o;4650:377::-;4738:3;4766:39;4799:5;4766:39;:::i;:::-;4821:71;4885:6;4880:3;4821:71;:::i;:::-;4814:78;;4901:65;4959:6;4954:3;4947:4;4940:5;4936:16;4901:65;:::i;:::-;4991:29;5013:6;4991:29;:::i;:::-;4986:3;4982:39;4975:46;;4742:285;4650:377;;;;:::o;5033:313::-;5146:4;5184:2;5173:9;5169:18;5161:26;;5233:9;5227:4;5223:20;5219:1;5208:9;5204:17;5197:47;5261:78;5334:4;5325:6;5261:78;:::i;:::-;5253:86;;5033:313;;;;:::o;5352:104::-;5397:7;5426:24;5444:5;5426:24;:::i;:::-;5415:35;;5352:104;;;:::o;5462:138::-;5543:32;5569:5;5543:32;:::i;:::-;5536:5;5533:43;5523:71;;5590:1;5587;5580:12;5523:71;5462:138;:::o;5606:155::-;5660:5;5698:6;5685:20;5676:29;;5714:41;5749:5;5714:41;:::i;:::-;5606:155;;;;:::o;5767:345::-;5834:6;5883:2;5871:9;5862:7;5858:23;5854:32;5851:119;;;5889:79;;:::i;:::-;5851:119;6009:1;6034:61;6087:7;6078:6;6067:9;6063:22;6034:61;:::i;:::-;6024:71;;5980:125;5767:345;;;;:::o;6118:222::-;6211:4;6249:2;6238:9;6234:18;6226:26;;6262:71;6330:1;6319:9;6315:17;6306:6;6262:71;:::i;:::-;6118:222;;;;:::o;6346:117::-;6455:1;6452;6445:12;6469:180;6517:77;6514:1;6507:88;6614:4;6611:1;6604:15;6638:4;6635:1;6628:15;6655:281;6738:27;6760:4;6738:27;:::i;:::-;6730:6;6726:40;6868:6;6856:10;6853:22;6832:18;6820:10;6817:34;6814:62;6811:88;;;6879:18;;:::i;:::-;6811:88;6919:10;6915:2;6908:22;6698:238;6655:281;;:::o;6942:129::-;6976:6;7003:20;;:::i;:::-;6993:30;;7032:33;7060:4;7052:6;7032:33;:::i;:::-;6942:129;;;:::o;7077:311::-;7154:4;7244:18;7236:6;7233:30;7230:56;;;7266:18;;:::i;:::-;7230:56;7316:4;7308:6;7304:17;7296:25;;7376:4;7370;7366:15;7358:23;;7077:311;;;:::o;7394:117::-;7503:1;7500;7493:12;7534:710;7630:5;7655:81;7671:64;7728:6;7671:64;:::i;:::-;7655:81;:::i;:::-;7646:90;;7756:5;7785:6;7778:5;7771:21;7819:4;7812:5;7808:16;7801:23;;7872:4;7864:6;7860:17;7852:6;7848:30;7901:3;7893:6;7890:15;7887:122;;;7920:79;;:::i;:::-;7887:122;8035:6;8018:220;8052:6;8047:3;8044:15;8018:220;;;8127:3;8156:37;8189:3;8177:10;8156:37;:::i;:::-;8151:3;8144:50;8223:4;8218:3;8214:14;8207:21;;8094:144;8078:4;8073:3;8069:14;8062:21;;8018:220;;;8022:21;7636:608;;7534:710;;;;;:::o;8267:370::-;8338:5;8387:3;8380:4;8372:6;8368:17;8364:27;8354:122;;8395:79;;:::i;:::-;8354:122;8512:6;8499:20;8537:94;8627:3;8619:6;8612:4;8604:6;8600:17;8537:94;:::i;:::-;8528:103;;8344:293;8267:370;;;;:::o;8643:117::-;8752:1;8749;8742:12;8766:307;8827:4;8917:18;8909:6;8906:30;8903:56;;;8939:18;;:::i;:::-;8903:56;8977:29;8999:6;8977:29;:::i;:::-;8969:37;;9061:4;9055;9051:15;9043:23;;8766:307;;;:::o;9079:146::-;9176:6;9171:3;9166;9153:30;9217:1;9208:6;9203:3;9199:16;9192:27;9079:146;;;:::o;9231:423::-;9308:5;9333:65;9349:48;9390:6;9349:48;:::i;:::-;9333:65;:::i;:::-;9324:74;;9421:6;9414:5;9407:21;9459:4;9452:5;9448:16;9497:3;9488:6;9483:3;9479:16;9476:25;9473:112;;;9504:79;;:::i;:::-;9473:112;9594:54;9641:6;9636:3;9631;9594:54;:::i;:::-;9314:340;9231:423;;;;;:::o;9673:338::-;9728:5;9777:3;9770:4;9762:6;9758:17;9754:27;9744:122;;9785:79;;:::i;:::-;9744:122;9902:6;9889:20;9927:78;10001:3;9993:6;9986:4;9978:6;9974:17;9927:78;:::i;:::-;9918:87;;9734:277;9673:338;;;;:::o;10017:1509::-;10171:6;10179;10187;10195;10203;10252:3;10240:9;10231:7;10227:23;10223:33;10220:120;;;10259:79;;:::i;:::-;10220:120;10379:1;10404:53;10449:7;10440:6;10429:9;10425:22;10404:53;:::i;:::-;10394:63;;10350:117;10506:2;10532:53;10577:7;10568:6;10557:9;10553:22;10532:53;:::i;:::-;10522:63;;10477:118;10662:2;10651:9;10647:18;10634:32;10693:18;10685:6;10682:30;10679:117;;;10715:79;;:::i;:::-;10679:117;10820:78;10890:7;10881:6;10870:9;10866:22;10820:78;:::i;:::-;10810:88;;10605:303;10975:2;10964:9;10960:18;10947:32;11006:18;10998:6;10995:30;10992:117;;;11028:79;;:::i;:::-;10992:117;11133:78;11203:7;11194:6;11183:9;11179:22;11133:78;:::i;:::-;11123:88;;10918:303;11288:3;11277:9;11273:19;11260:33;11320:18;11312:6;11309:30;11306:117;;;11342:79;;:::i;:::-;11306:117;11447:62;11501:7;11492:6;11481:9;11477:22;11447:62;:::i;:::-;11437:72;;11231:288;10017:1509;;;;;;;;:::o;11532:619::-;11609:6;11617;11625;11674:2;11662:9;11653:7;11649:23;11645:32;11642:119;;;11680:79;;:::i;:::-;11642:119;11800:1;11825:53;11870:7;11861:6;11850:9;11846:22;11825:53;:::i;:::-;11815:63;;11771:117;11927:2;11953:53;11998:7;11989:6;11978:9;11974:22;11953:53;:::i;:::-;11943:63;;11898:118;12055:2;12081:53;12126:7;12117:6;12106:9;12102:22;12081:53;:::i;:::-;12071:63;;12026:118;11532:619;;;;;:::o;12157:308::-;12219:4;12309:18;12301:6;12298:30;12295:56;;;12331:18;;:::i;:::-;12295:56;12369:29;12391:6;12369:29;:::i;:::-;12361:37;;12453:4;12447;12443:15;12435:23;;12157:308;;;:::o;12471:425::-;12549:5;12574:66;12590:49;12632:6;12590:49;:::i;:::-;12574:66;:::i;:::-;12565:75;;12663:6;12656:5;12649:21;12701:4;12694:5;12690:16;12739:3;12730:6;12725:3;12721:16;12718:25;12715:112;;;12746:79;;:::i;:::-;12715:112;12836:54;12883:6;12878:3;12873;12836:54;:::i;:::-;12555:341;12471:425;;;;;:::o;12916:340::-;12972:5;13021:3;13014:4;13006:6;13002:17;12998:27;12988:122;;13029:79;;:::i;:::-;12988:122;13146:6;13133:20;13171:79;13246:3;13238:6;13231:4;13223:6;13219:17;13171:79;:::i;:::-;13162:88;;12978:278;12916:340;;;;:::o;13262:509::-;13331:6;13380:2;13368:9;13359:7;13355:23;13351:32;13348:119;;;13386:79;;:::i;:::-;13348:119;13534:1;13523:9;13519:17;13506:31;13564:18;13556:6;13553:30;13550:117;;;13586:79;;:::i;:::-;13550:117;13691:63;13746:7;13737:6;13726:9;13722:22;13691:63;:::i;:::-;13681:73;;13477:287;13262:509;;;;:::o;13777:111::-;13829:7;13858:24;13876:5;13858:24;:::i;:::-;13847:35;;13777:111;;;:::o;13894:152::-;13982:39;14015:5;13982:39;:::i;:::-;13975:5;13972:50;13962:78;;14036:1;14033;14026:12;13962:78;13894:152;:::o;14052:169::-;14113:5;14151:6;14138:20;14129:29;;14167:48;14209:5;14167:48;:::i;:::-;14052:169;;;;:::o;14227:504::-;14310:6;14318;14367:2;14355:9;14346:7;14342:23;14338:32;14335:119;;;14373:79;;:::i;:::-;14335:119;14493:1;14518:68;14578:7;14569:6;14558:9;14554:22;14518:68;:::i;:::-;14508:78;;14464:132;14635:2;14661:53;14706:7;14697:6;14686:9;14682:22;14661:53;:::i;:::-;14651:63;;14606:118;14227:504;;;;;:::o;14737:60::-;14765:3;14786:5;14779:12;;14737:60;;;:::o;14803:142::-;14853:9;14886:53;14904:34;14913:24;14931:5;14913:24;:::i;:::-;14904:34;:::i;:::-;14886:53;:::i;:::-;14873:66;;14803:142;;;:::o;14951:126::-;15001:9;15034:37;15065:5;15034:37;:::i;:::-;15021:50;;14951:126;;;:::o;15083:158::-;15165:9;15198:37;15229:5;15198:37;:::i;:::-;15185:50;;15083:158;;;:::o;15247:195::-;15366:69;15429:5;15366:69;:::i;:::-;15361:3;15354:82;15247:195;;:::o;15448:286::-;15573:4;15611:2;15600:9;15596:18;15588:26;;15624:103;15724:1;15713:9;15709:17;15700:6;15624:103;:::i;:::-;15448:286;;;;:::o;15740:311::-;15817:4;15907:18;15899:6;15896:30;15893:56;;;15929:18;;:::i;:::-;15893:56;15979:4;15971:6;15967:17;15959:25;;16039:4;16033;16029:15;16021:23;;15740:311;;;:::o;16074:710::-;16170:5;16195:81;16211:64;16268:6;16211:64;:::i;:::-;16195:81;:::i;:::-;16186:90;;16296:5;16325:6;16318:5;16311:21;16359:4;16352:5;16348:16;16341:23;;16412:4;16404:6;16400:17;16392:6;16388:30;16441:3;16433:6;16430:15;16427:122;;;16460:79;;:::i;:::-;16427:122;16575:6;16558:220;16592:6;16587:3;16584:15;16558:220;;;16667:3;16696:37;16729:3;16717:10;16696:37;:::i;:::-;16691:3;16684:50;16763:4;16758:3;16754:14;16747:21;;16634:144;16618:4;16613:3;16609:14;16602:21;;16558:220;;;16562:21;16176:608;;16074:710;;;;;:::o;16807:370::-;16878:5;16927:3;16920:4;16912:6;16908:17;16904:27;16894:122;;16935:79;;:::i;:::-;16894:122;17052:6;17039:20;17077:94;17167:3;17159:6;17152:4;17144:6;17140:17;17077:94;:::i;:::-;17068:103;;16884:293;16807:370;;;;:::o;17183:894::-;17301:6;17309;17358:2;17346:9;17337:7;17333:23;17329:32;17326:119;;;17364:79;;:::i;:::-;17326:119;17512:1;17501:9;17497:17;17484:31;17542:18;17534:6;17531:30;17528:117;;;17564:79;;:::i;:::-;17528:117;17669:78;17739:7;17730:6;17719:9;17715:22;17669:78;:::i;:::-;17659:88;;17455:302;17824:2;17813:9;17809:18;17796:32;17855:18;17847:6;17844:30;17841:117;;;17877:79;;:::i;:::-;17841:117;17982:78;18052:7;18043:6;18032:9;18028:22;17982:78;:::i;:::-;17972:88;;17767:303;17183:894;;;;;:::o;18083:114::-;18150:6;18184:5;18178:12;18168:22;;18083:114;;;:::o;18203:184::-;18302:11;18336:6;18331:3;18324:19;18376:4;18371:3;18367:14;18352:29;;18203:184;;;;:::o;18393:132::-;18460:4;18483:3;18475:11;;18513:4;18508:3;18504:14;18496:22;;18393:132;;;:::o;18531:108::-;18608:24;18626:5;18608:24;:::i;:::-;18603:3;18596:37;18531:108;;:::o;18645:179::-;18714:10;18735:46;18777:3;18769:6;18735:46;:::i;:::-;18813:4;18808:3;18804:14;18790:28;;18645:179;;;;:::o;18830:113::-;18900:4;18932;18927:3;18923:14;18915:22;;18830:113;;;:::o;18979:732::-;19098:3;19127:54;19175:5;19127:54;:::i;:::-;19197:86;19276:6;19271:3;19197:86;:::i;:::-;19190:93;;19307:56;19357:5;19307:56;:::i;:::-;19386:7;19417:1;19402:284;19427:6;19424:1;19421:13;19402:284;;;19503:6;19497:13;19530:63;19589:3;19574:13;19530:63;:::i;:::-;19523:70;;19616:60;19669:6;19616:60;:::i;:::-;19606:70;;19462:224;19449:1;19446;19442:9;19437:14;;19402:284;;;19406:14;19702:3;19695:10;;19103:608;;;18979:732;;;;:::o;19717:373::-;19860:4;19898:2;19887:9;19883:18;19875:26;;19947:9;19941:4;19937:20;19933:1;19922:9;19918:17;19911:47;19975:108;20078:4;20069:6;19975:108;:::i;:::-;19967:116;;19717:373;;;;:::o;20096:116::-;20166:21;20181:5;20166:21;:::i;:::-;20159:5;20156:32;20146:60;;20202:1;20199;20192:12;20146:60;20096:116;:::o;20218:133::-;20261:5;20299:6;20286:20;20277:29;;20315:30;20339:5;20315:30;:::i;:::-;20218:133;;;;:::o;20357:468::-;20422:6;20430;20479:2;20467:9;20458:7;20454:23;20450:32;20447:119;;;20485:79;;:::i;:::-;20447:119;20605:1;20630:53;20675:7;20666:6;20655:9;20651:22;20630:53;:::i;:::-;20620:63;;20576:117;20732:2;20758:50;20800:7;20791:6;20780:9;20776:22;20758:50;:::i;:::-;20748:60;;20703:115;20357:468;;;;;:::o;20831:329::-;20890:6;20939:2;20927:9;20918:7;20914:23;20910:32;20907:119;;;20945:79;;:::i;:::-;20907:119;21065:1;21090:53;21135:7;21126:6;21115:9;21111:22;21090:53;:::i;:::-;21080:63;;21036:117;20831:329;;;;:::o;21166:468::-;21231:6;21239;21288:2;21276:9;21267:7;21263:23;21259:32;21256:119;;;21294:79;;:::i;:::-;21256:119;21414:1;21439:53;21484:7;21475:6;21464:9;21460:22;21439:53;:::i;:::-;21429:63;;21385:117;21541:2;21567:50;21609:7;21600:6;21589:9;21585:22;21567:50;:::i;:::-;21557:60;;21512:115;21166:468;;;;;:::o;21640:117::-;21749:1;21746;21739:12;21780:568;21853:8;21863:6;21913:3;21906:4;21898:6;21894:17;21890:27;21880:122;;21921:79;;:::i;:::-;21880:122;22034:6;22021:20;22011:30;;22064:18;22056:6;22053:30;22050:117;;;22086:79;;:::i;:::-;22050:117;22200:4;22192:6;22188:17;22176:29;;22254:3;22246:4;22238:6;22234:17;22224:8;22220:32;22217:41;22214:128;;;22261:79;;:::i;:::-;22214:128;21780:568;;;;;:::o;22354:1269::-;22508:6;22516;22524;22532;22581:2;22569:9;22560:7;22556:23;22552:32;22549:119;;;22587:79;;:::i;:::-;22549:119;22735:1;22724:9;22720:17;22707:31;22765:18;22757:6;22754:30;22751:117;;;22787:79;;:::i;:::-;22751:117;22892:78;22962:7;22953:6;22942:9;22938:22;22892:78;:::i;:::-;22882:88;;22678:302;23047:2;23036:9;23032:18;23019:32;23078:18;23070:6;23067:30;23064:117;;;23100:79;;:::i;:::-;23064:117;23213:80;23285:7;23276:6;23265:9;23261:22;23213:80;:::i;:::-;23195:98;;;;22990:313;23370:2;23359:9;23355:18;23342:32;23401:18;23393:6;23390:30;23387:117;;;23423:79;;:::i;:::-;23387:117;23528:78;23598:7;23589:6;23578:9;23574:22;23528:78;:::i;:::-;23518:88;;23313:303;22354:1269;;;;;;;:::o;23629:359::-;23703:6;23752:2;23740:9;23731:7;23727:23;23723:32;23720:119;;;23758:79;;:::i;:::-;23720:119;23878:1;23903:68;23963:7;23954:6;23943:9;23939:22;23903:68;:::i;:::-;23893:78;;23849:132;23629:359;;;;:::o;23994:474::-;24062:6;24070;24119:2;24107:9;24098:7;24094:23;24090:32;24087:119;;;24125:79;;:::i;:::-;24087:119;24245:1;24270:53;24315:7;24306:6;24295:9;24291:22;24270:53;:::i;:::-;24260:63;;24216:117;24372:2;24398:53;24443:7;24434:6;24423:9;24419:22;24398:53;:::i;:::-;24388:63;;24343:118;23994:474;;;;;:::o;24474:1089::-;24578:6;24586;24594;24602;24610;24659:3;24647:9;24638:7;24634:23;24630:33;24627:120;;;24666:79;;:::i;:::-;24627:120;24786:1;24811:53;24856:7;24847:6;24836:9;24832:22;24811:53;:::i;:::-;24801:63;;24757:117;24913:2;24939:53;24984:7;24975:6;24964:9;24960:22;24939:53;:::i;:::-;24929:63;;24884:118;25041:2;25067:53;25112:7;25103:6;25092:9;25088:22;25067:53;:::i;:::-;25057:63;;25012:118;25169:2;25195:53;25240:7;25231:6;25220:9;25216:22;25195:53;:::i;:::-;25185:63;;25140:118;25325:3;25314:9;25310:19;25297:33;25357:18;25349:6;25346:30;25343:117;;;25379:79;;:::i;:::-;25343:117;25484:62;25538:7;25529:6;25518:9;25514:22;25484:62;:::i;:::-;25474:72;;25268:288;24474:1089;;;;;;;;:::o;25569:229::-;25709:34;25705:1;25697:6;25693:14;25686:58;25778:12;25773:2;25765:6;25761:15;25754:37;25569:229;:::o;25804:366::-;25946:3;25967:67;26031:2;26026:3;25967:67;:::i;:::-;25960:74;;26043:93;26132:3;26043:93;:::i;:::-;26161:2;26156:3;26152:12;26145:19;;25804:366;;;:::o;26176:419::-;26342:4;26380:2;26369:9;26365:18;26357:26;;26429:9;26423:4;26419:20;26415:1;26404:9;26400:17;26393:47;26457:131;26583:4;26457:131;:::i;:::-;26449:139;;26176:419;;;:::o;26601:180::-;26649:77;26646:1;26639:88;26746:4;26743:1;26736:15;26770:4;26767:1;26760:15;26787:320;26831:6;26868:1;26862:4;26858:12;26848:22;;26915:1;26909:4;26905:12;26936:18;26926:81;;26992:4;26984:6;26980:17;26970:27;;26926:81;27054:2;27046:6;27043:14;27023:18;27020:38;27017:84;;27073:18;;:::i;:::-;27017:84;26838:269;26787:320;;;:::o;27113:180::-;27253:32;27249:1;27241:6;27237:14;27230:56;27113:180;:::o;27299:366::-;27441:3;27462:67;27526:2;27521:3;27462:67;:::i;:::-;27455:74;;27538:93;27627:3;27538:93;:::i;:::-;27656:2;27651:3;27647:12;27640:19;;27299:366;;;:::o;27671:419::-;27837:4;27875:2;27864:9;27860:18;27852:26;;27924:9;27918:4;27914:20;27910:1;27899:9;27895:17;27888:47;27952:131;28078:4;27952:131;:::i;:::-;27944:139;;27671:419;;;:::o;28096:148::-;28198:11;28235:3;28220:18;;28096:148;;;;:::o;28250:141::-;28299:4;28322:3;28314:11;;28345:3;28342:1;28335:14;28379:4;28376:1;28366:18;28358:26;;28250:141;;;:::o;28421:874::-;28524:3;28561:5;28555:12;28590:36;28616:9;28590:36;:::i;:::-;28642:89;28724:6;28719:3;28642:89;:::i;:::-;28635:96;;28762:1;28751:9;28747:17;28778:1;28773:166;;;;28953:1;28948:341;;;;28740:549;;28773:166;28857:4;28853:9;28842;28838:25;28833:3;28826:38;28919:6;28912:14;28905:22;28897:6;28893:35;28888:3;28884:45;28877:52;;28773:166;;28948:341;29015:38;29047:5;29015:38;:::i;:::-;29075:1;29089:154;29103:6;29100:1;29097:13;29089:154;;;29177:7;29171:14;29167:1;29162:3;29158:11;29151:35;29227:1;29218:7;29214:15;29203:26;;29125:4;29122:1;29118:12;29113:17;;29089:154;;;29272:6;29267:3;29263:16;29256:23;;28955:334;;28740:549;;28528:767;;28421:874;;;;:::o;29301:390::-;29407:3;29435:39;29468:5;29435:39;:::i;:::-;29490:89;29572:6;29567:3;29490:89;:::i;:::-;29483:96;;29588:65;29646:6;29641:3;29634:4;29627:5;29623:16;29588:65;:::i;:::-;29678:6;29673:3;29669:16;29662:23;;29411:280;29301:390;;;;:::o;29697:429::-;29874:3;29896:92;29984:3;29975:6;29896:92;:::i;:::-;29889:99;;30005:95;30096:3;30087:6;30005:95;:::i;:::-;29998:102;;30117:3;30110:10;;29697:429;;;;;:::o;30132:225::-;30272:34;30268:1;30260:6;30256:14;30249:58;30341:8;30336:2;30328:6;30324:15;30317:33;30132:225;:::o;30363:366::-;30505:3;30526:67;30590:2;30585:3;30526:67;:::i;:::-;30519:74;;30602:93;30691:3;30602:93;:::i;:::-;30720:2;30715:3;30711:12;30704:19;;30363:366;;;:::o;30735:419::-;30901:4;30939:2;30928:9;30924:18;30916:26;;30988:9;30982:4;30978:20;30974:1;30963:9;30959:17;30952:47;31016:131;31142:4;31016:131;:::i;:::-;31008:139;;30735:419;;;:::o;31160:180::-;31208:77;31205:1;31198:88;31305:4;31302:1;31295:15;31329:4;31326:1;31319:15;31346:191;31386:3;31405:20;31423:1;31405:20;:::i;:::-;31400:25;;31439:20;31457:1;31439:20;:::i;:::-;31434:25;;31482:1;31479;31475:9;31468:16;;31503:3;31500:1;31497:10;31494:36;;;31510:18;;:::i;:::-;31494:36;31346:191;;;;:::o;31543:230::-;31683:34;31679:1;31671:6;31667:14;31660:58;31752:13;31747:2;31739:6;31735:15;31728:38;31543:230;:::o;31779:366::-;31921:3;31942:67;32006:2;32001:3;31942:67;:::i;:::-;31935:74;;32018:93;32107:3;32018:93;:::i;:::-;32136:2;32131:3;32127:12;32120:19;;31779:366;;;:::o;32151:419::-;32317:4;32355:2;32344:9;32340:18;32332:26;;32404:9;32398:4;32394:20;32390:1;32379:9;32375:17;32368:47;32432:131;32558:4;32432:131;:::i;:::-;32424:139;;32151:419;;;:::o;32576:134::-;32634:9;32667:37;32698:5;32667:37;:::i;:::-;32654:50;;32576:134;;;:::o;32716:147::-;32811:45;32850:5;32811:45;:::i;:::-;32806:3;32799:58;32716:147;;:::o;32869:348::-;32998:4;33036:2;33025:9;33021:18;33013:26;;33049:79;33125:1;33114:9;33110:17;33101:6;33049:79;:::i;:::-;33138:72;33206:2;33195:9;33191:18;33182:6;33138:72;:::i;:::-;32869:348;;;;;:::o;33223:234::-;33363:34;33359:1;33351:6;33347:14;33340:58;33432:17;33427:2;33419:6;33415:15;33408:42;33223:234;:::o;33463:366::-;33605:3;33626:67;33690:2;33685:3;33626:67;:::i;:::-;33619:74;;33702:93;33791:3;33702:93;:::i;:::-;33820:2;33815:3;33811:12;33804:19;;33463:366;;;:::o;33835:419::-;34001:4;34039:2;34028:9;34024:18;34016:26;;34088:9;34082:4;34078:20;34074:1;34063:9;34059:17;34052:47;34116:131;34242:4;34116:131;:::i;:::-;34108:139;;33835:419;;;:::o;34260:93::-;34297:6;34344:2;34339;34332:5;34328:14;34324:23;34314:33;;34260:93;;;:::o;34359:107::-;34403:8;34453:5;34447:4;34443:16;34422:37;;34359:107;;;;:::o;34472:393::-;34541:6;34591:1;34579:10;34575:18;34614:97;34644:66;34633:9;34614:97;:::i;:::-;34732:39;34762:8;34751:9;34732:39;:::i;:::-;34720:51;;34804:4;34800:9;34793:5;34789:21;34780:30;;34853:4;34843:8;34839:19;34832:5;34829:30;34819:40;;34548:317;;34472:393;;;;;:::o;34871:142::-;34921:9;34954:53;34972:34;34981:24;34999:5;34981:24;:::i;:::-;34972:34;:::i;:::-;34954:53;:::i;:::-;34941:66;;34871:142;;;:::o;35019:75::-;35062:3;35083:5;35076:12;;35019:75;;;:::o;35100:269::-;35210:39;35241:7;35210:39;:::i;:::-;35271:91;35320:41;35344:16;35320:41;:::i;:::-;35312:6;35305:4;35299:11;35271:91;:::i;:::-;35265:4;35258:105;35176:193;35100:269;;;:::o;35375:73::-;35420:3;35375:73;:::o;35454:189::-;35531:32;;:::i;:::-;35572:65;35630:6;35622;35616:4;35572:65;:::i;:::-;35507:136;35454:189;;:::o;35649:186::-;35709:120;35726:3;35719:5;35716:14;35709:120;;;35780:39;35817:1;35810:5;35780:39;:::i;:::-;35753:1;35746:5;35742:13;35733:22;;35709:120;;;35649:186;;:::o;35841:543::-;35942:2;35937:3;35934:11;35931:446;;;35976:38;36008:5;35976:38;:::i;:::-;36060:29;36078:10;36060:29;:::i;:::-;36050:8;36046:44;36243:2;36231:10;36228:18;36225:49;;;36264:8;36249:23;;36225:49;36287:80;36343:22;36361:3;36343:22;:::i;:::-;36333:8;36329:37;36316:11;36287:80;:::i;:::-;35946:431;;35931:446;35841:543;;;:::o;36390:117::-;36444:8;36494:5;36488:4;36484:16;36463:37;;36390:117;;;;:::o;36513:169::-;36557:6;36590:51;36638:1;36634:6;36626:5;36623:1;36619:13;36590:51;:::i;:::-;36586:56;36671:4;36665;36661:15;36651:25;;36564:118;36513:169;;;;:::o;36687:295::-;36763:4;36909:29;36934:3;36928:4;36909:29;:::i;:::-;36901:37;;36971:3;36968:1;36964:11;36958:4;36955:21;36947:29;;36687:295;;;;:::o;36987:1395::-;37104:37;37137:3;37104:37;:::i;:::-;37206:18;37198:6;37195:30;37192:56;;;37228:18;;:::i;:::-;37192:56;37272:38;37304:4;37298:11;37272:38;:::i;:::-;37357:67;37417:6;37409;37403:4;37357:67;:::i;:::-;37451:1;37475:4;37462:17;;37507:2;37499:6;37496:14;37524:1;37519:618;;;;38181:1;38198:6;38195:77;;;38247:9;38242:3;38238:19;38232:26;38223:35;;38195:77;38298:67;38358:6;38351:5;38298:67;:::i;:::-;38292:4;38285:81;38154:222;37489:887;;37519:618;37571:4;37567:9;37559:6;37555:22;37605:37;37637:4;37605:37;:::i;:::-;37664:1;37678:208;37692:7;37689:1;37686:14;37678:208;;;37771:9;37766:3;37762:19;37756:26;37748:6;37741:42;37822:1;37814:6;37810:14;37800:24;;37869:2;37858:9;37854:18;37841:31;;37715:4;37712:1;37708:12;37703:17;;37678:208;;;37914:6;37905:7;37902:19;37899:179;;;37972:9;37967:3;37963:19;37957:26;38015:48;38057:4;38049:6;38045:17;38034:9;38015:48;:::i;:::-;38007:6;38000:64;37922:156;37899:179;38124:1;38120;38112:6;38108:14;38104:22;38098:4;38091:36;37526:611;;;37489:887;;37079:1303;;;36987:1395;;:::o;38388:269::-;38517:3;38539:92;38627:3;38618:6;38539:92;:::i;:::-;38532:99;;38648:3;38641:10;;38388:269;;;;:::o;38663:164::-;38803:16;38799:1;38791:6;38787:14;38780:40;38663:164;:::o;38833:366::-;38975:3;38996:67;39060:2;39055:3;38996:67;:::i;:::-;38989:74;;39072:93;39161:3;39072:93;:::i;:::-;39190:2;39185:3;39181:12;39174:19;;38833:366;;;:::o;39205:419::-;39371:4;39409:2;39398:9;39394:18;39386:26;;39458:9;39452:4;39448:20;39444:1;39433:9;39429:17;39422:47;39486:131;39612:4;39486:131;:::i;:::-;39478:139;;39205:419;;;:::o;39630:143::-;39687:5;39718:6;39712:13;39703:22;;39734:33;39761:5;39734:33;:::i;:::-;39630:143;;;;:::o;39779:351::-;39849:6;39898:2;39886:9;39877:7;39873:23;39869:32;39866:119;;;39904:79;;:::i;:::-;39866:119;40024:1;40049:64;40105:7;40096:6;40085:9;40081:22;40049:64;:::i;:::-;40039:74;;39995:128;39779:351;;;;:::o;40136:228::-;40276:34;40272:1;40264:6;40260:14;40253:58;40345:11;40340:2;40332:6;40328:15;40321:36;40136:228;:::o;40370:366::-;40512:3;40533:67;40597:2;40592:3;40533:67;:::i;:::-;40526:74;;40609:93;40698:3;40609:93;:::i;:::-;40727:2;40722:3;40718:12;40711:19;;40370:366;;;:::o;40742:419::-;40908:4;40946:2;40935:9;40931:18;40923:26;;40995:9;40989:4;40985:20;40981:1;40970:9;40966:17;40959:47;41023:131;41149:4;41023:131;:::i;:::-;41015:139;;40742:419;;;:::o;41167:180::-;41215:77;41212:1;41205:88;41312:4;41309:1;41302:15;41336:4;41333:1;41326:15;41353:233;41392:3;41415:24;41433:5;41415:24;:::i;:::-;41406:33;;41461:66;41454:5;41451:77;41448:103;;41531:18;;:::i;:::-;41448:103;41578:1;41571:5;41567:13;41560:20;;41353:233;;;:::o;41592:166::-;41732:18;41728:1;41720:6;41716:14;41709:42;41592:166;:::o;41764:366::-;41906:3;41927:67;41991:2;41986:3;41927:67;:::i;:::-;41920:74;;42003:93;42092:3;42003:93;:::i;:::-;42121:2;42116:3;42112:12;42105:19;;41764:366;;;:::o;42136:419::-;42302:4;42340:2;42329:9;42325:18;42317:26;;42389:9;42383:4;42379:20;42375:1;42364:9;42360:17;42353:47;42417:131;42543:4;42417:131;:::i;:::-;42409:139;;42136:419;;;:::o;42561:410::-;42601:7;42624:20;42642:1;42624:20;:::i;:::-;42619:25;;42658:20;42676:1;42658:20;:::i;:::-;42653:25;;42713:1;42710;42706:9;42735:30;42753:11;42735:30;:::i;:::-;42724:41;;42914:1;42905:7;42901:15;42898:1;42895:22;42875:1;42868:9;42848:83;42825:139;;42944:18;;:::i;:::-;42825:139;42609:362;42561:410;;;;:::o;42977:332::-;43098:4;43136:2;43125:9;43121:18;43113:26;;43149:71;43217:1;43206:9;43202:17;43193:6;43149:71;:::i;:::-;43230:72;43298:2;43287:9;43283:18;43274:6;43230:72;:::i;:::-;42977:332;;;;;:::o;43315:178::-;43455:30;43451:1;43443:6;43439:14;43432:54;43315:178;:::o;43499:366::-;43641:3;43662:67;43726:2;43721:3;43662:67;:::i;:::-;43655:74;;43738:93;43827:3;43738:93;:::i;:::-;43856:2;43851:3;43847:12;43840:19;;43499:366;;;:::o;43871:419::-;44037:4;44075:2;44064:9;44060:18;44052:26;;44124:9;44118:4;44114:20;44110:1;44099:9;44095:17;44088:47;44152:131;44278:4;44152:131;:::i;:::-;44144:139;;43871:419;;;:::o;44296:442::-;44445:4;44483:2;44472:9;44468:18;44460:26;;44496:71;44564:1;44553:9;44549:17;44540:6;44496:71;:::i;:::-;44577:72;44645:2;44634:9;44630:18;44621:6;44577:72;:::i;:::-;44659;44727:2;44716:9;44712:18;44703:6;44659:72;:::i;:::-;44296:442;;;;;;:::o;44744:137::-;44798:5;44829:6;44823:13;44814:22;;44845:30;44869:5;44845:30;:::i;:::-;44744:137;;;;:::o;44887:345::-;44954:6;45003:2;44991:9;44982:7;44978:23;44974:32;44971:119;;;45009:79;;:::i;:::-;44971:119;45129:1;45154:61;45207:7;45198:6;45187:9;45183:22;45154:61;:::i;:::-;45144:71;;45100:125;44887:345;;;;:::o;45238:173::-;45378:25;45374:1;45366:6;45362:14;45355:49;45238:173;:::o;45417:366::-;45559:3;45580:67;45644:2;45639:3;45580:67;:::i;:::-;45573:74;;45656:93;45745:3;45656:93;:::i;:::-;45774:2;45769:3;45765:12;45758:19;;45417:366;;;:::o;45789:419::-;45955:4;45993:2;45982:9;45978:18;45970:26;;46042:9;46036:4;46032:20;46028:1;46017:9;46013:17;46006:47;46070:131;46196:4;46070:131;:::i;:::-;46062:139;;45789:419;;;:::o;46214:94::-;46247:8;46295:5;46291:2;46287:14;46266:35;;46214:94;;;:::o;46314:::-;46353:7;46382:20;46396:5;46382:20;:::i;:::-;46371:31;;46314:94;;;:::o;46414:100::-;46453:7;46482:26;46502:5;46482:26;:::i;:::-;46471:37;;46414:100;;;:::o;46520:157::-;46625:45;46645:24;46663:5;46645:24;:::i;:::-;46625:45;:::i;:::-;46620:3;46613:58;46520:157;;:::o;46683:256::-;46795:3;46810:75;46881:3;46872:6;46810:75;:::i;:::-;46910:2;46905:3;46901:12;46894:19;;46930:3;46923:10;;46683:256;;;;:::o;46945:180::-;46993:77;46990:1;46983:88;47090:4;47087:1;47080:15;47114:4;47111:1;47104:15;47131:185;47171:1;47188:20;47206:1;47188:20;:::i;:::-;47183:25;;47222:20;47240:1;47222:20;:::i;:::-;47217:25;;47261:1;47251:35;;47266:18;;:::i;:::-;47251:35;47308:1;47305;47301:9;47296:14;;47131:185;;;;:::o;47322:108::-;47369:7;47398:26;47418:5;47398:26;:::i;:::-;47387:37;;47322:108;;;:::o;47436:189::-;47557:61;47585:32;47611:5;47585:32;:::i;:::-;47557:61;:::i;:::-;47552:3;47545:74;47436:189;;:::o;47631:288::-;47759:3;47774:91;47861:3;47852:6;47774:91;:::i;:::-;47890:2;47885:3;47881:12;47874:19;;47910:3;47903:10;;47631:288;;;;:::o;47925:79::-;47964:7;47993:5;47982:16;;47925:79;;;:::o;48010:157::-;48115:45;48135:24;48153:5;48135:24;:::i;:::-;48115:45;:::i;:::-;48110:3;48103:58;48010:157;;:::o;48173:256::-;48285:3;48300:75;48371:3;48362:6;48300:75;:::i;:::-;48400:2;48395:3;48391:12;48384:19;;48420:3;48413:10;;48173:256;;;;:::o;48435:176::-;48467:1;48484:20;48502:1;48484:20;:::i;:::-;48479:25;;48518:20;48536:1;48518:20;:::i;:::-;48513:25;;48557:1;48547:35;;48562:18;;:::i;:::-;48547:35;48603:1;48600;48596:9;48591:14;;48435:176;;;;:::o;48617:225::-;48757:34;48753:1;48745:6;48741:14;48734:58;48826:8;48821:2;48813:6;48809:15;48802:33;48617:225;:::o;48848:366::-;48990:3;49011:67;49075:2;49070:3;49011:67;:::i;:::-;49004:74;;49087:93;49176:3;49087:93;:::i;:::-;49205:2;49200:3;49196:12;49189:19;;48848:366;;;:::o;49220:419::-;49386:4;49424:2;49413:9;49409:18;49401:26;;49473:9;49467:4;49463:20;49459:1;49448:9;49444:17;49437:47;49501:131;49627:4;49501:131;:::i;:::-;49493:139;;49220:419;;;:::o;49645:182::-;49785:34;49781:1;49773:6;49769:14;49762:58;49645:182;:::o;49833:366::-;49975:3;49996:67;50060:2;50055:3;49996:67;:::i;:::-;49989:74;;50072:93;50161:3;50072:93;:::i;:::-;50190:2;50185:3;50181:12;50174:19;;49833:366;;;:::o;50205:419::-;50371:4;50409:2;50398:9;50394:18;50386:26;;50458:9;50452:4;50448:20;50444:1;50433:9;50429:17;50422:47;50486:131;50612:4;50486:131;:::i;:::-;50478:139;;50205:419;;;:::o;50630:194::-;50670:4;50690:20;50708:1;50690:20;:::i;:::-;50685:25;;50724:20;50742:1;50724:20;:::i;:::-;50719:25;;50768:1;50765;50761:9;50753:17;;50792:1;50786:4;50783:11;50780:37;;;50797:18;;:::i;:::-;50780:37;50630:194;;;;:::o;50830:179::-;50970:31;50966:1;50958:6;50954:14;50947:55;50830:179;:::o;51015:366::-;51157:3;51178:67;51242:2;51237:3;51178:67;:::i;:::-;51171:74;;51254:93;51343:3;51254:93;:::i;:::-;51372:2;51367:3;51363:12;51356:19;;51015:366;;;:::o;51387:419::-;51553:4;51591:2;51580:9;51576:18;51568:26;;51640:9;51634:4;51630:20;51626:1;51615:9;51611:17;51604:47;51668:131;51794:4;51668:131;:::i;:::-;51660:139;;51387:419;;;:::o;51812:147::-;51913:11;51950:3;51935:18;;51812:147;;;;:::o;51965:114::-;;:::o;52085:398::-;52244:3;52265:83;52346:1;52341:3;52265:83;:::i;:::-;52258:90;;52357:93;52446:3;52357:93;:::i;:::-;52475:1;52470:3;52466:11;52459:18;;52085:398;;;:::o;52489:379::-;52673:3;52695:147;52838:3;52695:147;:::i;:::-;52688:154;;52859:3;52852:10;;52489:379;;;:::o;52874:245::-;53014:34;53010:1;53002:6;52998:14;52991:58;53083:28;53078:2;53070:6;53066:15;53059:53;52874:245;:::o;53125:366::-;53267:3;53288:67;53352:2;53347:3;53288:67;:::i;:::-;53281:74;;53364:93;53453:3;53364:93;:::i;:::-;53482:2;53477:3;53473:12;53466:19;;53125:366;;;:::o;53497:419::-;53663:4;53701:2;53690:9;53686:18;53678:26;;53750:9;53744:4;53740:20;53736:1;53725:9;53721:17;53714:47;53778:131;53904:4;53778:131;:::i;:::-;53770:139;;53497:419;;;:::o;53922:227::-;54062:34;54058:1;54050:6;54046:14;54039:58;54131:10;54126:2;54118:6;54114:15;54107:35;53922:227;:::o;54155:366::-;54297:3;54318:67;54382:2;54377:3;54318:67;:::i;:::-;54311:74;;54394:93;54483:3;54394:93;:::i;:::-;54512:2;54507:3;54503:12;54496:19;;54155:366;;;:::o;54527:419::-;54693:4;54731:2;54720:9;54716:18;54708:26;;54780:9;54774:4;54770:20;54766:1;54755:9;54751:17;54744:47;54808:131;54934:4;54808:131;:::i;:::-;54800:139;;54527:419;;;:::o;54952:224::-;55092:34;55088:1;55080:6;55076:14;55069:58;55161:7;55156:2;55148:6;55144:15;55137:32;54952:224;:::o;55182:366::-;55324:3;55345:67;55409:2;55404:3;55345:67;:::i;:::-;55338:74;;55421:93;55510:3;55421:93;:::i;:::-;55539:2;55534:3;55530:12;55523:19;;55182:366;;;:::o;55554:419::-;55720:4;55758:2;55747:9;55743:18;55735:26;;55807:9;55801:4;55797:20;55793:1;55782:9;55778:17;55771:47;55835:131;55961:4;55835:131;:::i;:::-;55827:139;;55554:419;;;:::o;55979:229::-;56119:34;56115:1;56107:6;56103:14;56096:58;56188:12;56183:2;56175:6;56171:15;56164:37;55979:229;:::o;56214:366::-;56356:3;56377:67;56441:2;56436:3;56377:67;:::i;:::-;56370:74;;56453:93;56542:3;56453:93;:::i;:::-;56571:2;56566:3;56562:12;56555:19;;56214:366;;;:::o;56586:419::-;56752:4;56790:2;56779:9;56775:18;56767:26;;56839:9;56833:4;56829:20;56825:1;56814:9;56810:17;56803:47;56867:131;56993:4;56867:131;:::i;:::-;56859:139;;56586:419;;;:::o;57011:634::-;57232:4;57270:2;57259:9;57255:18;57247:26;;57319:9;57313:4;57309:20;57305:1;57294:9;57290:17;57283:47;57347:108;57450:4;57441:6;57347:108;:::i;:::-;57339:116;;57502:9;57496:4;57492:20;57487:2;57476:9;57472:18;57465:48;57530:108;57633:4;57624:6;57530:108;:::i;:::-;57522:116;;57011:634;;;;;:::o;57651:222::-;57791:34;57787:1;57779:6;57775:14;57768:58;57860:5;57855:2;57847:6;57843:15;57836:30;57651:222;:::o;57879:366::-;58021:3;58042:67;58106:2;58101:3;58042:67;:::i;:::-;58035:74;;58118:93;58207:3;58118:93;:::i;:::-;58236:2;58231:3;58227:12;58220:19;;57879:366;;;:::o;58251:419::-;58417:4;58455:2;58444:9;58440:18;58432:26;;58504:9;58498:4;58494:20;58490:1;58479:9;58475:17;58468:47;58532:131;58658:4;58532:131;:::i;:::-;58524:139;;58251:419;;;:::o;58676:223::-;58816:34;58812:1;58804:6;58800:14;58793:58;58885:6;58880:2;58872:6;58868:15;58861:31;58676:223;:::o;58905:366::-;59047:3;59068:67;59132:2;59127:3;59068:67;:::i;:::-;59061:74;;59144:93;59233:3;59144:93;:::i;:::-;59262:2;59257:3;59253:12;59246:19;;58905:366;;;:::o;59277:419::-;59443:4;59481:2;59470:9;59466:18;59458:26;;59530:9;59524:4;59520:20;59516:1;59505:9;59501:17;59494:47;59558:131;59684:4;59558:131;:::i;:::-;59550:139;;59277:419;;;:::o;59702:332::-;59823:4;59861:2;59850:9;59846:18;59838:26;;59874:71;59942:1;59931:9;59927:17;59918:6;59874:71;:::i;:::-;59955:72;60023:2;60012:9;60008:18;59999:6;59955:72;:::i;:::-;59702:332;;;;;:::o;60040:442::-;60189:4;60227:2;60216:9;60212:18;60204:26;;60240:71;60308:1;60297:9;60293:17;60284:6;60240:71;:::i;:::-;60321:72;60389:2;60378:9;60374:18;60365:6;60321:72;:::i;:::-;60403;60471:2;60460:9;60456:18;60447:6;60403:72;:::i;:::-;60040:442;;;;;;:::o;60488:220::-;60628:34;60624:1;60616:6;60612:14;60605:58;60697:3;60692:2;60684:6;60680:15;60673:28;60488:220;:::o;60714:366::-;60856:3;60877:67;60941:2;60936:3;60877:67;:::i;:::-;60870:74;;60953:93;61042:3;60953:93;:::i;:::-;61071:2;61066:3;61062:12;61055:19;;60714:366;;;:::o;61086:419::-;61252:4;61290:2;61279:9;61275:18;61267:26;;61339:9;61333:4;61329:20;61325:1;61314:9;61310:17;61303:47;61367:131;61493:4;61367:131;:::i;:::-;61359:139;;61086:419;;;:::o;61511:98::-;61562:6;61596:5;61590:12;61580:22;;61511:98;;;:::o;61615:168::-;61698:11;61732:6;61727:3;61720:19;61772:4;61767:3;61763:14;61748:29;;61615:168;;;;:::o;61789:373::-;61875:3;61903:38;61935:5;61903:38;:::i;:::-;61957:70;62020:6;62015:3;61957:70;:::i;:::-;61950:77;;62036:65;62094:6;62089:3;62082:4;62075:5;62071:16;62036:65;:::i;:::-;62126:29;62148:6;62126:29;:::i;:::-;62121:3;62117:39;62110:46;;61879:283;61789:373;;;;:::o;62168:1053::-;62491:4;62529:3;62518:9;62514:19;62506:27;;62543:71;62611:1;62600:9;62596:17;62587:6;62543:71;:::i;:::-;62624:72;62692:2;62681:9;62677:18;62668:6;62624:72;:::i;:::-;62743:9;62737:4;62733:20;62728:2;62717:9;62713:18;62706:48;62771:108;62874:4;62865:6;62771:108;:::i;:::-;62763:116;;62926:9;62920:4;62916:20;62911:2;62900:9;62896:18;62889:48;62954:108;63057:4;63048:6;62954:108;:::i;:::-;62946:116;;63110:9;63104:4;63100:20;63094:3;63083:9;63079:19;63072:49;63138:76;63209:4;63200:6;63138:76;:::i;:::-;63130:84;;62168:1053;;;;;;;;:::o;63227:141::-;63283:5;63314:6;63308:13;63299:22;;63330:32;63356:5;63330:32;:::i;:::-;63227:141;;;;:::o;63374:349::-;63443:6;63492:2;63480:9;63471:7;63467:23;63463:32;63460:119;;;63498:79;;:::i;:::-;63460:119;63618:1;63643:63;63698:7;63689:6;63678:9;63674:22;63643:63;:::i;:::-;63633:73;;63589:127;63374:349;;;;:::o;63729:106::-;63773:8;63822:5;63817:3;63813:15;63792:36;;63729:106;;;:::o;63841:183::-;63876:3;63914:1;63896:16;63893:23;63890:128;;;63952:1;63949;63946;63931:23;63974:34;64005:1;63999:8;63974:34;:::i;:::-;63967:41;;63890:128;63841:183;:::o;64030:711::-;64069:3;64107:4;64089:16;64086:26;64115:5;64083:39;64144:20;;:::i;:::-;64219:1;64201:16;64197:24;64194:1;64188:4;64173:49;64252:4;64246:11;64351:16;64344:4;64336:6;64332:17;64329:39;64296:18;64288:6;64285:30;64269:113;64266:146;;;64397:5;;;;64266:146;64443:6;64437:4;64433:17;64479:3;64473:10;64506:18;64498:6;64495:30;64492:43;;;64528:5;;;;;;64492:43;64576:6;64569:4;64564:3;64560:14;64556:27;64635:1;64617:16;64613:24;64607:4;64603:35;64598:3;64595:44;64592:57;;;64642:5;;;;;;;64592:57;64659;64707:6;64701:4;64697:17;64689:6;64685:30;64679:4;64659:57;:::i;:::-;64732:3;64725:10;;64073:668;;;;;64030:711;;:::o;64747:239::-;64887:34;64883:1;64875:6;64871:14;64864:58;64956:22;64951:2;64943:6;64939:15;64932:47;64747:239;:::o;64992:366::-;65134:3;65155:67;65219:2;65214:3;65155:67;:::i;:::-;65148:74;;65231:93;65320:3;65231:93;:::i;:::-;65349:2;65344:3;65340:12;65333:19;;64992:366;;;:::o;65364:419::-;65530:4;65568:2;65557:9;65553:18;65545:26;;65617:9;65611:4;65607:20;65603:1;65592:9;65588:17;65581:47;65645:131;65771:4;65645:131;:::i;:::-;65637:139;;65364:419;;;:::o;65789:227::-;65929:34;65925:1;65917:6;65913:14;65906:58;65998:10;65993:2;65985:6;65981:15;65974:35;65789:227;:::o;66022:366::-;66164:3;66185:67;66249:2;66244:3;66185:67;:::i;:::-;66178:74;;66261:93;66350:3;66261:93;:::i;:::-;66379:2;66374:3;66370:12;66363:19;;66022:366;;;:::o;66394:419::-;66560:4;66598:2;66587:9;66583:18;66575:26;;66647:9;66641:4;66637:20;66633:1;66622:9;66618:17;66611:47;66675:131;66801:4;66675:131;:::i;:::-;66667:139;;66394:419;;;:::o;66819:229::-;66959:34;66955:1;66947:6;66943:14;66936:58;67028:12;67023:2;67015:6;67011:15;67004:37;66819:229;:::o;67054:366::-;67196:3;67217:67;67281:2;67276:3;67217:67;:::i;:::-;67210:74;;67293:93;67382:3;67293:93;:::i;:::-;67411:2;67406:3;67402:12;67395:19;;67054:366;;;:::o;67426:419::-;67592:4;67630:2;67619:9;67615:18;67607:26;;67679:9;67673:4;67669:20;67665:1;67654:9;67650:17;67643:47;67707:131;67833:4;67707:131;:::i;:::-;67699:139;;67426:419;;;:::o;67851:228::-;67991:34;67987:1;67979:6;67975:14;67968:58;68060:11;68055:2;68047:6;68043:15;68036:36;67851:228;:::o;68085:366::-;68227:3;68248:67;68312:2;68307:3;68248:67;:::i;:::-;68241:74;;68324:93;68413:3;68324:93;:::i;:::-;68442:2;68437:3;68433:12;68426:19;;68085:366;;;:::o;68457:419::-;68623:4;68661:2;68650:9;68646:18;68638:26;;68710:9;68704:4;68700:20;68696:1;68685:9;68681:17;68674:47;68738:131;68864:4;68738:131;:::i;:::-;68730:139;;68457:419;;;:::o;68882:751::-;69105:4;69143:3;69132:9;69128:19;69120:27;;69157:71;69225:1;69214:9;69210:17;69201:6;69157:71;:::i;:::-;69238:72;69306:2;69295:9;69291:18;69282:6;69238:72;:::i;:::-;69320;69388:2;69377:9;69373:18;69364:6;69320:72;:::i;:::-;69402;69470:2;69459:9;69455:18;69446:6;69402:72;:::i;:::-;69522:9;69516:4;69512:20;69506:3;69495:9;69491:19;69484:49;69550:76;69621:4;69612:6;69550:76;:::i;:::-;69542:84;;68882:751;;;;;;;;:::o;69639:225::-;69779:34;69775:1;69767:6;69763:14;69756:58;69848:8;69843:2;69835:6;69831:15;69824:33;69639:225;:::o;69870:366::-;70012:3;70033:67;70097:2;70092:3;70033:67;:::i;:::-;70026:74;;70109:93;70198:3;70109:93;:::i;:::-;70227:2;70222:3;70218:12;70211:19;;69870:366;;;:::o;70242:419::-;70408:4;70446:2;70435:9;70431:18;70423:26;;70495:9;70489:4;70485:20;70481:1;70470:9;70466:17;70459:47;70523:131;70649:4;70523:131;:::i;:::-;70515:139;;70242:419;;;:::o;70667:179::-;70807:31;70803:1;70795:6;70791:14;70784:55;70667:179;:::o;70852:366::-;70994:3;71015:67;71079:2;71074:3;71015:67;:::i;:::-;71008:74;;71091:93;71180:3;71091:93;:::i;:::-;71209:2;71204:3;71200:12;71193:19;;70852:366;;;:::o;71224:419::-;71390:4;71428:2;71417:9;71413:18;71405:26;;71477:9;71471:4;71467:20;71463:1;71452:9;71448:17;71441:47;71505:131;71631:4;71505:131;:::i;:::-;71497:139;;71224:419;;;:::o;71649:386::-;71753:3;71781:38;71813:5;71781:38;:::i;:::-;71835:88;71916:6;71911:3;71835:88;:::i;:::-;71828:95;;71932:65;71990:6;71985:3;71978:4;71971:5;71967:16;71932:65;:::i;:::-;72022:6;72017:3;72013:16;72006:23;;71757:278;71649:386;;;;:::o;72041:271::-;72171:3;72193:93;72282:3;72273:6;72193:93;:::i;:::-;72186:100;;72303:3;72296:10;;72041:271;;;;:::o

Swarm Source

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