Token

Overview ERC-1155

Total Supply:
0 N/A

Holders:
8 addresses

Profile Summary

 
Contract:
0x2d302076bf2eff466c4b1e0aa5d8bde3e08d988e0x2D302076bF2EFf466C4B1E0aa5d8bDE3e08D988e

Balance
0 N/A
0x3120e153e89b7850b158d1a93d4289066a14ccd5
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Artifacts

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/[email protected]/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/[email protected]/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/[email protected]/token/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


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

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

// File: @openzeppelin/[email protected]/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be 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/[email protected]/token/ERC1155/extensions/IERC1155MetadataURI.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/[email protected]/token/ERC1155/ERC1155.sol


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

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        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 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: transfer caller is not 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();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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);

        _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);

        _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();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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);

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

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * 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();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        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);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * 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);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "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 `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 _beforeTokenTransfer(
        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/[email protected]/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts v4.4.1 (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) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

// File: @openzeppelin/[email protected]/token/ERC1155/extensions/ERC1155Burnable.sol


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

pragma solidity ^0.8.0;


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

        _burn(account, id, value);
    }

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

        _burnBatch(account, ids, values);
    }
}

// File: Artifacts.sol


pragma solidity ^0.8.4;





contract Artifacts is ERC1155, Ownable, ERC1155Burnable, ERC1155Supply {

    /* EVENTS */

    event EquipmentLocked(address account, uint256 id, uint256 amount);
    event EquipmentUnlocked(address account, uint256 id, uint256 amount);
    
    // ID -> Account -> Locked Amount
    mapping(uint256 => mapping(address => uint256)) public lockedEquipments;

    string constant ERR_LENGTH_MISMATCH = "Ids length and amounts length don't match";
    string constant ERR_LOCK_BALANCE = "Account doesn't have enough equipments to lock";
    string constant ERR_UNLOCKED_BALANCE = "Account doesn't have enough unlocked equipments";

    constructor() ERC1155("") {}

    /* EQUIPMENT LOCKING */

    /**
     * @dev Locks given amount of equipments
     * @param account   Owner of the equipments
     * @param id        ID of equipment
     * @param amount    Amount to lock
     */
    function increaseLockedEquipment(
        address account,
        uint256 id,
        uint256 amount
    ) external onlyOwner {
        // Check if user has enough items to lock
        require(balanceOf(account, id) >= amount, ERR_LOCK_BALANCE);

        _increaseLockedEquipment(account, id, amount);
    }

    /**
     * @dev Locks equipments in batch
     * @param account   Owner of the equipments
     * @param ids       ID list
     * @param amounts   Amount list 
     */
    function increaseLockedEquipmentBatch(
        address account, 
        uint256[] calldata ids, 
        uint256[] calldata amounts
    ) external onlyOwner {
        require(ids.length == amounts.length, ERR_LENGTH_MISMATCH);

        uint256 length = amounts.length;
        for (uint256 i = 0; i < length;) {
            require(balanceOf(account, ids[i]) >= amounts[i], ERR_LOCK_BALANCE);

            _increaseLockedEquipment(account, ids[i], amounts[i]);

            unchecked { ++i; } // This saves gas for loops
        }
    }

    /**
     * @dev Unlocks given amount of equipments
     * @param account   Owner of the equipments
     * @param id        ID of equipment
     * @param amount    Amount to unlock
     */
    function decreaseLockedEquipment(
        address account,
        uint256 id,
        uint256 amount
    ) external onlyOwner {
        _decreaseLockedEquipment(account, id, amount);
    }

    /**
     * @dev Unlocks equipments in batch
     * @param account   Owner of the equipments
     * @param ids       ID list
     * @param amounts   Amount list 
     */
    function decreaseLockedEquipmentBatch(
        address account, 
        uint256[] calldata ids, 
        uint256[] calldata amounts
    ) external onlyOwner {
        require(ids.length == amounts.length, ERR_LENGTH_MISMATCH);

        uint256 length = amounts.length;
        for (uint256 i = 0; i < length;) {
            require(balanceOf(account, ids[i]) >= amounts[i], ERR_LOCK_BALANCE);

            _decreaseLockedEquipment(account, ids[i], amounts[i]);
            
            unchecked { ++i; } // This saves gas for loops
        }
    }

    /** @dev Internal method for locking */
    function _increaseLockedEquipment(
        address account,
        uint256 id,
        uint256 amount
    ) private {
        lockedEquipments[id][account] += amount;
        emit EquipmentLocked(account, id, amount);
    }

    /** @dev Internal method for unlocking */
    function _decreaseLockedEquipment(
        address account, 
        uint256 id, 
        uint256 amount
    ) private {
        lockedEquipments[id][account] -= amount;
        emit EquipmentUnlocked(account, id, amount);
    }

    /* ERC1155 OVERRIDES */

    function safeTransferFrom(
        address from, 
        address to, 
        uint256 id, 
        uint256 amount,
        bytes memory data
    ) public override {
        // Check available balance, then make transfer
        uint256 availableBalance = balanceOf(from, id) - lockedEquipments[id][from]; 
        require(availableBalance >= amount, ERR_UNLOCKED_BALANCE);

        super.safeTransferFrom(from, to, id, amount, data);
    }

    function safeBatchTransferFrom(
        address from, 
        address to, 
        uint256[] memory ids, 
        uint256[] memory amounts, 
        bytes memory data
    ) public override {
        // Check available balances for each id, then make transfer
        uint256 length = ids.length;
        for(uint256 i = 0; i < length;) {
            uint256 availableBalance = balanceOf(from, ids[i]) - lockedEquipments[ids[i]][from]; 
            require(availableBalance >= amounts[i], ERR_UNLOCKED_BALANCE);
            unchecked { ++i; }
        }

        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    function burn(
        address account, 
        uint256 id, 
        uint256 value
    ) public override {
        // Check available balance, then burn equipments
        uint256 availableBalance = balanceOf(account, id) - lockedEquipments[id][account]; 
        require(availableBalance >= value, ERR_UNLOCKED_BALANCE);

        super.burn(account, id, value);
    }

    function burnBatch(
        address account, 
        uint256[] memory ids, 
        uint256[] memory values
    ) public override {
        // Check available balances for each id, then burn equipments
        uint256 length = ids.length;
        for(uint256 i = 0; i < length;) {
            uint256 availableBalance = balanceOf(account, ids[i]) - lockedEquipments[ids[i]][account]; 
            require(availableBalance >= values[i], ERR_UNLOCKED_BALANCE);
            unchecked { ++i; }
        }

        super.burnBatch(account, ids, values);
    }

    function setURI(string memory newuri) public onlyOwner {
        _setURI(newuri);
    }

    /* MINTING */

    function mint(
        address account, 
        uint256 id, 
        uint256 amount, 
        bytes memory data
    ) public onlyOwner {
        _mint(account, id, amount, data);
    }

    function mintBatch(
        address to, 
        uint256[] memory ids, 
        uint256[] memory amounts, 
        bytes memory data
    ) public onlyOwner {
        _mintBatch(to, ids, amounts, data);
    }

    // The following functions are overrides required by Solidity.

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

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EquipmentLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EquipmentUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"decreaseLockedEquipment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"decreaseLockedEquipmentBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"increaseLockedEquipment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"increaseLockedEquipmentBatch","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":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"lockedEquipments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040518060200160405280600081525062000033816200005a60201b60201c565b5062000054620000486200007660201b60201c565b6200007e60201b60201c565b62000259565b80600290805190602001906200007292919062000144565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200015290620001f4565b90600052602060002090601f016020900481019282620001765760008555620001c2565b82601f106200019157805160ff1916838001178555620001c2565b82800160010185558215620001c2579182015b82811115620001c1578251825591602001919060010190620001a4565b5b509050620001d19190620001d5565b5090565b5b80821115620001f0576000816000905550600101620001d6565b5090565b600060028204905060018216806200020d57607f821691505b602082108114156200022457620002236200022a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614bb780620002696000396000f3fe608060405234801561001057600080fd5b506004361061014c5760003560e01c8063715018a6116100c3578063bd85b0391161007c578063bd85b03914610395578063e985e9c5146103c5578063f242432a146103f5578063f2fde38b14610411578063f5298aca1461042d578063fbbdbe8d146104495761014c565b8063715018a6146102e9578063731133e9146102f35780637a33d4fe1461030f5780638da5cb5b1461033f578063a22cb4651461035d578063a7dca2f3146103795761014c565b80631f7fdffa116101155780631f7fdffa146102195780632eb2c2d6146102355780633e64628a146102515780634e1273f41461026d5780634f558e791461029d5780636b20c454146102cd5761014c565b8062fdd58e1461015157806301914ffe1461018157806301ffc9a71461019d57806302fe5305146101cd5780630e89341c146101e9575b600080fd5b61016b6004803603810190610166919061379b565b610465565b60405161017891906140f4565b60405180910390f35b61019b600480360381019061019691906137db565b61052e565b005b6101b760048036038101906101b29190613929565b610622565b6040516101c49190613ed7565b60405180910390f35b6101e760048036038101906101e29190613983565b610704565b005b61020360048036038101906101fe91906139cc565b61078c565b6040516102109190613ef2565b60405180910390f35b610233600480360381019061022e91906136a0565b610820565b005b61024f600480360381019061024a919061341a565b6108ae565b005b61026b60048036038101906102669190613580565b6109f7565b005b610287600480360381019061028291906138b1565b610bd5565b6040516102949190613e7e565b60405180910390f35b6102b760048036038101906102b291906139cc565b610cee565b6040516102c49190613ed7565b60405180910390f35b6102e760048036038101906102e29190613615565b610d02565b005b6102f1610e47565b005b61030d6004803603810190610308919061382e565b610ecf565b005b610329600480360381019061032491906139f9565b610f5d565b60405161033691906140f4565b60405180910390f35b610347610f82565b6040516103549190613d6a565b60405180910390f35b6103776004803603810190610372919061375b565b610fac565b005b610393600480360381019061038e9190613580565b610fc2565b005b6103af60048036038101906103aa91906139cc565b6111a0565b6040516103bc91906140f4565b60405180910390f35b6103df60048036038101906103da91906133da565b6111bd565b6040516103ec9190613ed7565b60405180910390f35b61040f600480360381019061040a91906134e9565b611251565b005b61042b600480360381019061042691906133ad565b61132e565b005b610447600480360381019061044291906137db565b611426565b005b610463600480360381019061045e91906137db565b6114ff565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156104d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104cd90613f54565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61053661158b565b73ffffffffffffffffffffffffffffffffffffffff16610554610f82565b73ffffffffffffffffffffffffffffffffffffffff16146105aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105a190614054565b60405180910390fd5b806105b58484610465565b10156040518060600160405280602e8152602001614afc602e913990610611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106089190613ef2565b60405180910390fd5b5061061d838383611593565b505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ed57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106fd57506106fc8261163a565b5b9050919050565b61070c61158b565b73ffffffffffffffffffffffffffffffffffffffff1661072a610f82565b73ffffffffffffffffffffffffffffffffffffffff1614610780576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077790614054565b60405180910390fd5b610789816116a4565b50565b60606002805461079b906143c8565b80601f01602080910402602001604051908101604052809291908181526020018280546107c7906143c8565b80156108145780601f106107e957610100808354040283529160200191610814565b820191906000526020600020905b8154815290600101906020018083116107f757829003601f168201915b50505050509050919050565b61082861158b565b73ffffffffffffffffffffffffffffffffffffffff16610846610f82565b73ffffffffffffffffffffffffffffffffffffffff161461089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089390614054565b60405180910390fd5b6108a8848484846116be565b50505050565b60008351905060005b818110156109e1576000600560008784815181106108d8576108d76144d2565b5b6020026020010151815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461095089888581518110610943576109426144d2565b5b6020026020010151610465565b61095a91906142de565b905084828151811061096f5761096e6144d2565b5b60200260200101518110156040518060600160405280602f8152602001614b2a602f9139906109d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109cb9190613ef2565b60405180910390fd5b50816001019150506108b7565b506109ef86868686866118dc565b505050505050565b6109ff61158b565b73ffffffffffffffffffffffffffffffffffffffff16610a1d610f82565b73ffffffffffffffffffffffffffffffffffffffff1614610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a90614054565b60405180910390fd5b818190508484905014604051806060016040528060298152602001614b596029913990610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd9190613ef2565b60405180910390fd5b50600082829050905060005b81811015610bcc57838382818110610afd57610afc6144d2565b5b90506020020135610b2788888885818110610b1b57610b1a6144d2565b5b90506020020135610465565b10156040518060600160405280602e8152602001614afc602e913990610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a9190613ef2565b60405180910390fd5b50610bc187878784818110610b9b57610b9a6144d2565b5b90506020020135868685818110610bb557610bb46144d2565b5b90506020020135611593565b806001019050610ae2565b50505050505050565b60608151835114610c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1290614094565b60405180910390fd5b6000835167ffffffffffffffff811115610c3857610c37614501565b5b604051908082528060200260200182016040528015610c665781602001602082028036833780820191505090505b50905060005b8451811015610ce357610cb3858281518110610c8b57610c8a6144d2565b5b6020026020010151858381518110610ca657610ca56144d2565b5b6020026020010151610465565b828281518110610cc657610cc56144d2565b5b60200260200101818152505080610cdc9061442b565b9050610c6c565b508091505092915050565b600080610cfa836111a0565b119050919050565b60008251905060005b81811015610e3557600060056000868481518110610d2c57610d2b6144d2565b5b6020026020010151815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610da487878581518110610d9757610d966144d2565b5b6020026020010151610465565b610dae91906142de565b9050838281518110610dc357610dc26144d2565b5b60200260200101518110156040518060600160405280602f8152602001614b2a602f913990610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f9190613ef2565b60405180910390fd5b5081600101915050610d0b565b50610e4184848461197d565b50505050565b610e4f61158b565b73ffffffffffffffffffffffffffffffffffffffff16610e6d610f82565b73ffffffffffffffffffffffffffffffffffffffff1614610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90614054565b60405180910390fd5b610ecd6000611a1a565b565b610ed761158b565b73ffffffffffffffffffffffffffffffffffffffff16610ef5610f82565b73ffffffffffffffffffffffffffffffffffffffff1614610f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4290614054565b60405180910390fd5b610f5784848484611ae0565b50505050565b6005602052816000526040600020602052806000526040600020600091509150505481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610fbe610fb761158b565b8383611c76565b5050565b610fca61158b565b73ffffffffffffffffffffffffffffffffffffffff16610fe8610f82565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590614054565b60405180910390fd5b818190508484905014604051806060016040528060298152602001614b5960299139906110a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110989190613ef2565b60405180910390fd5b50600082829050905060005b81811015611197578383828181106110c8576110c76144d2565b5b905060200201356110f2888888858181106110e6576110e56144d2565b5b90506020020135610465565b10156040518060600160405280602e8152602001614afc602e91399061114e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111459190613ef2565b60405180910390fd5b5061118c87878784818110611166576111656144d2565b5b905060200201358686858181106111805761117f6144d2565b5b90506020020135611de3565b8060010190506110ad565b50505050505050565b600060046000838152602001908152602001600020549050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006005600085815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112ae8786610465565b6112b891906142de565b9050828110156040518060600160405280602f8152602001614b2a602f913990611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f9190613ef2565b60405180910390fd5b506113268686868686611e8a565b505050505050565b61133661158b565b73ffffffffffffffffffffffffffffffffffffffff16611354610f82565b73ffffffffffffffffffffffffffffffffffffffff16146113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a190614054565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141190613f74565b60405180910390fd5b61142381611a1a565b50565b60006005600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114838585610465565b61148d91906142de565b9050818110156040518060600160405280602f8152602001614b2a602f9139906114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e49190613ef2565b60405180910390fd5b506114f9848484611f2b565b50505050565b61150761158b565b73ffffffffffffffffffffffffffffffffffffffff16611525610f82565b73ffffffffffffffffffffffffffffffffffffffff161461157b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157290614054565b60405180910390fd5b611586838383611de3565b505050565b600033905090565b806005600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115f39190614288565b925050819055507f1e1f0599225a0f1c8464438fac645799d744b027c1068fff6da0688ed07eb92d83838360405161162d93929190613e47565b60405180910390a1505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b80600290805190602001906116ba92919061302f565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561172e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611725906140d4565b60405180910390fd5b8151835114611772576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611769906140b4565b60405180910390fd5b600061177c61158b565b905061178d81600087878787611fc8565b60005b8451811015611846578381815181106117ac576117ab6144d2565b5b60200260200101516000808784815181106117ca576117c96144d2565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461182c9190614288565b92505081905550808061183e9061442b565b915050611790565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118be929190613ea0565b60405180910390a46118d581600087878787611fde565b5050505050565b6118e461158b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061192a57506119298561192461158b565b6111bd565b5b611969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196090613ff4565b60405180910390fd5b61197685858585856121c5565b5050505050565b61198561158b565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806119cb57506119ca836119c561158b565b6111bd565b5b611a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0190613fb4565b60405180910390fd5b611a158383836124d9565b505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b47906140d4565b60405180910390fd5b6000611b5a61158b565b9050611b7b81600087611b6c8861278a565b611b758861278a565b87611fc8565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bda9190614288565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611c5892919061410f565b60405180910390a4611c6f81600087878787612804565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc90614074565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dd69190613ed7565b60405180910390a3505050565b806005600084815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e4391906142de565b925050819055507fdf4379af885fc73d817d706126e27990441d4bfc474e7acefa9431faab5c5034838383604051611e7d93929190613e47565b60405180910390a1505050565b611e9261158b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611ed85750611ed785611ed261158b565b6111bd565b5b611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e90613fb4565b60405180910390fd5b611f2485858585856129eb565b5050505050565b611f3361158b565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611f795750611f7883611f7361158b565b6111bd565b5b611fb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faf90613fb4565b60405180910390fd5b611fc3838383612c6d565b505050565b611fd6868686868686612e8a565b505050505050565b611ffd8473ffffffffffffffffffffffffffffffffffffffff16613004565b156121bd578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612043959493929190613d85565b602060405180830381600087803b15801561205d57600080fd5b505af192505050801561208e57506040513d601f19601f8201168201806040525081019061208b9190613956565b60015b6121345761209a614530565b806308c379a014156120f757506120af614a09565b806120ba57506120f9565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ee9190613ef2565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212b90613f14565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146121bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b290613f34565b60405180910390fd5b505b505050505050565b8151835114612209576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612200906140b4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227090613fd4565b60405180910390fd5b600061228361158b565b9050612293818787878787611fc8565b60005b84518110156124445760008582815181106122b4576122b36144d2565b5b6020026020010151905060008583815181106122d3576122d26144d2565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b90614034565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124299190614288565b925050819055505050508061243d9061442b565b9050612296565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516124bb929190613ea0565b60405180910390a46124d1818787878787611fde565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612549576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254090614014565b60405180910390fd5b805182511461258d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612584906140b4565b60405180910390fd5b600061259761158b565b90506125b781856000868660405180602001604052806000815250611fc8565b60005b83518110156127045760008482815181106125d8576125d76144d2565b5b6020026020010151905060008483815181106125f7576125f66144d2565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f90613f94565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505080806126fc9061442b565b9150506125ba565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161277c929190613ea0565b60405180910390a450505050565b60606000600167ffffffffffffffff8111156127a9576127a8614501565b5b6040519080825280602002602001820160405280156127d75781602001602082028036833780820191505090505b50905082816000815181106127ef576127ee6144d2565b5b60200260200101818152505080915050919050565b6128238473ffffffffffffffffffffffffffffffffffffffff16613004565b156129e3578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612869959493929190613ded565b602060405180830381600087803b15801561288357600080fd5b505af19250505080156128b457506040513d601f19601f820116820180604052508101906128b19190613956565b60015b61295a576128c0614530565b806308c379a0141561291d57506128d5614a09565b806128e0575061291f565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129149190613ef2565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295190613f14565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146129e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d890613f34565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5290613fd4565b60405180910390fd5b6000612a6561158b565b9050612a85818787612a768861278a565b612a7f8861278a565b87611fc8565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390614034565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bd19190614288565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612c4e92919061410f565b60405180910390a4612c64828888888888612804565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd490614014565b60405180910390fd5b6000612ce761158b565b9050612d1781856000612cf98761278a565b612d028761278a565b60405180602001604052806000815250611fc8565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da590613f94565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612e7b92919061410f565b60405180910390a45050505050565b612e98868686868686613027565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612f4a5760005b8351811015612f4857828181518110612eec57612eeb6144d2565b5b602002602001015160046000868481518110612f0b57612f0a6144d2565b5b602002602001015181526020019081526020016000206000828254612f309190614288565b9250508190555080612f419061442b565b9050612ed0565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ffc5760005b8351811015612ffa57828181518110612f9e57612f9d6144d2565b5b602002602001015160046000868481518110612fbd57612fbc6144d2565b5b602002602001015181526020019081526020016000206000828254612fe291906142de565b9250508190555080612ff39061442b565b9050612f82565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b82805461303b906143c8565b90600052602060002090601f01602090048101928261305d57600085556130a4565b82601f1061307657805160ff19168380011785556130a4565b828001600101855582156130a4579182015b828111156130a3578251825591602001919060010190613088565b5b5090506130b191906130b5565b5090565b5b808211156130ce5760008160009055506001016130b6565b5090565b60006130e56130e08461415d565b614138565b905080838252602082019050828560208602820111156131085761310761455c565b5b60005b85811015613138578161311e8882613236565b84526020840193506020830192505060018101905061310b565b5050509392505050565b600061315561315084614189565b614138565b905080838252602082019050828560208602820111156131785761317761455c565b5b60005b858110156131a8578161318e8882613398565b84526020840193506020830192505060018101905061317b565b5050509392505050565b60006131c56131c0846141b5565b614138565b9050828152602081018484840111156131e1576131e0614561565b5b6131ec848285614386565b509392505050565b6000613207613202846141e6565b614138565b90508281526020810184848401111561322357613222614561565b5b61322e848285614386565b509392505050565b60008135905061324581614a9f565b92915050565b600082601f8301126132605761325f614557565b5b81356132708482602086016130d2565b91505092915050565b60008083601f84011261328f5761328e614557565b5b8235905067ffffffffffffffff8111156132ac576132ab614552565b5b6020830191508360208202830111156132c8576132c761455c565b5b9250929050565b600082601f8301126132e4576132e3614557565b5b81356132f4848260208601613142565b91505092915050565b60008135905061330c81614ab6565b92915050565b60008135905061332181614acd565b92915050565b60008151905061333681614acd565b92915050565b600082601f83011261335157613350614557565b5b81356133618482602086016131b2565b91505092915050565b600082601f83011261337f5761337e614557565b5b813561338f8482602086016131f4565b91505092915050565b6000813590506133a781614ae4565b92915050565b6000602082840312156133c3576133c261456b565b5b60006133d184828501613236565b91505092915050565b600080604083850312156133f1576133f061456b565b5b60006133ff85828601613236565b925050602061341085828601613236565b9150509250929050565b600080600080600060a086880312156134365761343561456b565b5b600061344488828901613236565b955050602061345588828901613236565b945050604086013567ffffffffffffffff81111561347657613475614566565b5b613482888289016132cf565b935050606086013567ffffffffffffffff8111156134a3576134a2614566565b5b6134af888289016132cf565b925050608086013567ffffffffffffffff8111156134d0576134cf614566565b5b6134dc8882890161333c565b9150509295509295909350565b600080600080600060a086880312156135055761350461456b565b5b600061351388828901613236565b955050602061352488828901613236565b945050604061353588828901613398565b935050606061354688828901613398565b925050608086013567ffffffffffffffff81111561356757613566614566565b5b6135738882890161333c565b9150509295509295909350565b60008060008060006060868803121561359c5761359b61456b565b5b60006135aa88828901613236565b955050602086013567ffffffffffffffff8111156135cb576135ca614566565b5b6135d788828901613279565b9450945050604086013567ffffffffffffffff8111156135fa576135f9614566565b5b61360688828901613279565b92509250509295509295909350565b60008060006060848603121561362e5761362d61456b565b5b600061363c86828701613236565b935050602084013567ffffffffffffffff81111561365d5761365c614566565b5b613669868287016132cf565b925050604084013567ffffffffffffffff81111561368a57613689614566565b5b613696868287016132cf565b9150509250925092565b600080600080608085870312156136ba576136b961456b565b5b60006136c887828801613236565b945050602085013567ffffffffffffffff8111156136e9576136e8614566565b5b6136f5878288016132cf565b935050604085013567ffffffffffffffff81111561371657613715614566565b5b613722878288016132cf565b925050606085013567ffffffffffffffff81111561374357613742614566565b5b61374f8782880161333c565b91505092959194509250565b600080604083850312156137725761377161456b565b5b600061378085828601613236565b9250506020613791858286016132fd565b9150509250929050565b600080604083850312156137b2576137b161456b565b5b60006137c085828601613236565b92505060206137d185828601613398565b9150509250929050565b6000806000606084860312156137f4576137f361456b565b5b600061380286828701613236565b935050602061381386828701613398565b925050604061382486828701613398565b9150509250925092565b600080600080608085870312156138485761384761456b565b5b600061385687828801613236565b945050602061386787828801613398565b935050604061387887828801613398565b925050606085013567ffffffffffffffff81111561389957613898614566565b5b6138a58782880161333c565b91505092959194509250565b600080604083850312156138c8576138c761456b565b5b600083013567ffffffffffffffff8111156138e6576138e5614566565b5b6138f28582860161324b565b925050602083013567ffffffffffffffff81111561391357613912614566565b5b61391f858286016132cf565b9150509250929050565b60006020828403121561393f5761393e61456b565b5b600061394d84828501613312565b91505092915050565b60006020828403121561396c5761396b61456b565b5b600061397a84828501613327565b91505092915050565b6000602082840312156139995761399861456b565b5b600082013567ffffffffffffffff8111156139b7576139b6614566565b5b6139c38482850161336a565b91505092915050565b6000602082840312156139e2576139e161456b565b5b60006139f084828501613398565b91505092915050565b60008060408385031215613a1057613a0f61456b565b5b6000613a1e85828601613398565b9250506020613a2f85828601613236565b9150509250929050565b6000613a458383613d4c565b60208301905092915050565b613a5a81614312565b82525050565b6000613a6b82614227565b613a758185614255565b9350613a8083614217565b8060005b83811015613ab1578151613a988882613a39565b9750613aa383614248565b925050600181019050613a84565b5085935050505092915050565b613ac781614324565b82525050565b6000613ad882614232565b613ae28185614266565b9350613af2818560208601614395565b613afb81614570565b840191505092915050565b6000613b118261423d565b613b1b8185614277565b9350613b2b818560208601614395565b613b3481614570565b840191505092915050565b6000613b4c603483614277565b9150613b578261458e565b604082019050919050565b6000613b6f602883614277565b9150613b7a826145dd565b604082019050919050565b6000613b92602b83614277565b9150613b9d8261462c565b604082019050919050565b6000613bb5602683614277565b9150613bc08261467b565b604082019050919050565b6000613bd8602483614277565b9150613be3826146ca565b604082019050919050565b6000613bfb602983614277565b9150613c0682614719565b604082019050919050565b6000613c1e602583614277565b9150613c2982614768565b604082019050919050565b6000613c41603283614277565b9150613c4c826147b7565b604082019050919050565b6000613c64602383614277565b9150613c6f82614806565b604082019050919050565b6000613c87602a83614277565b9150613c9282614855565b604082019050919050565b6000613caa602083614277565b9150613cb5826148a4565b602082019050919050565b6000613ccd602983614277565b9150613cd8826148cd565b604082019050919050565b6000613cf0602983614277565b9150613cfb8261491c565b604082019050919050565b6000613d13602883614277565b9150613d1e8261496b565b604082019050919050565b6000613d36602183614277565b9150613d41826149ba565b604082019050919050565b613d558161437c565b82525050565b613d648161437c565b82525050565b6000602082019050613d7f6000830184613a51565b92915050565b600060a082019050613d9a6000830188613a51565b613da76020830187613a51565b8181036040830152613db98186613a60565b90508181036060830152613dcd8185613a60565b90508181036080830152613de18184613acd565b90509695505050505050565b600060a082019050613e026000830188613a51565b613e0f6020830187613a51565b613e1c6040830186613d5b565b613e296060830185613d5b565b8181036080830152613e3b8184613acd565b90509695505050505050565b6000606082019050613e5c6000830186613a51565b613e696020830185613d5b565b613e766040830184613d5b565b949350505050565b60006020820190508181036000830152613e988184613a60565b905092915050565b60006040820190508181036000830152613eba8185613a60565b90508181036020830152613ece8184613a60565b90509392505050565b6000602082019050613eec6000830184613abe565b92915050565b60006020820190508181036000830152613f0c8184613b06565b905092915050565b60006020820190508181036000830152613f2d81613b3f565b9050919050565b60006020820190508181036000830152613f4d81613b62565b9050919050565b60006020820190508181036000830152613f6d81613b85565b9050919050565b60006020820190508181036000830152613f8d81613ba8565b9050919050565b60006020820190508181036000830152613fad81613bcb565b9050919050565b60006020820190508181036000830152613fcd81613bee565b9050919050565b60006020820190508181036000830152613fed81613c11565b9050919050565b6000602082019050818103600083015261400d81613c34565b9050919050565b6000602082019050818103600083015261402d81613c57565b9050919050565b6000602082019050818103600083015261404d81613c7a565b9050919050565b6000602082019050818103600083015261406d81613c9d565b9050919050565b6000602082019050818103600083015261408d81613cc0565b9050919050565b600060208201905081810360008301526140ad81613ce3565b9050919050565b600060208201905081810360008301526140cd81613d06565b9050919050565b600060208201905081810360008301526140ed81613d29565b9050919050565b60006020820190506141096000830184613d5b565b92915050565b60006040820190506141246000830185613d5b565b6141316020830184613d5b565b9392505050565b6000614142614153565b905061414e82826143fa565b919050565b6000604051905090565b600067ffffffffffffffff82111561417857614177614501565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141a4576141a3614501565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141d0576141cf614501565b5b6141d982614570565b9050602081019050919050565b600067ffffffffffffffff82111561420157614200614501565b5b61420a82614570565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006142938261437c565b915061429e8361437c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142d3576142d2614474565b5b828201905092915050565b60006142e98261437c565b91506142f48361437c565b92508282101561430757614306614474565b5b828203905092915050565b600061431d8261435c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143b3578082015181840152602081019050614398565b838111156143c2576000848401525b50505050565b600060028204905060018216806143e057607f821691505b602082108114156143f4576143f36144a3565b5b50919050565b61440382614570565b810181811067ffffffffffffffff8211171561442257614421614501565b5b80604052505050565b60006144368261437c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561446957614468614474565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561454f5760046000803e61454c600051614581565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d1015614a1957614a9c565b614a21614153565b60043d036004823e80513d602482011167ffffffffffffffff82111715614a49575050614a9c565b808201805167ffffffffffffffff811115614a675750505050614a9c565b80602083010160043d038501811115614a84575050505050614a9c565b614a93826020018501866143fa565b82955050505050505b90565b614aa881614312565b8114614ab357600080fd5b50565b614abf81614324565b8114614aca57600080fd5b50565b614ad681614330565b8114614ae157600080fd5b50565b614aed8161437c565b8114614af857600080fd5b5056fe4163636f756e7420646f65736e2774206861766520656e6f7567682065717569706d656e747320746f206c6f636b4163636f756e7420646f65736e2774206861766520656e6f75676820756e6c6f636b65642065717569706d656e7473496473206c656e67746820616e6420616d6f756e7473206c656e67746820646f6e2774206d61746368a264697066735822122019285075c50bc8f372f74cd44e1c4978ba4d92555c3b66d5b65947b9a56f781b64736f6c63430008070033

Deployed ByteCode Sourcemap

39924:6749:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23431:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40833:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22454:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45726:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23175:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46044:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44113:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41336:552;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23828:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37876:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45150:568;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2618:103;;;:::i;:::-;;45844:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40217:71;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1967:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24425:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42476:564;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37665:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24652:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43653:452;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2876:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44763:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42094:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23431:231;23517:7;23564:1;23545:21;;:7;:21;;;;23537:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;23632:9;:13;23642:2;23632:13;;;;;;;;;;;:22;23646:7;23632:22;;;;;;;;;;;;;;;;23625:29;;23431:231;;;;:::o;40833:318::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41060:6:::1;41034:22;41044:7;41053:2;41034:9;:22::i;:::-;:32;;41068:16;;;;;;;;;;;;;;;;;41026:59;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41098:45;41123:7;41132:2;41136:6;41098:24;:45::i;:::-;40833:318:::0;;;:::o;22454:310::-;22556:4;22608:26;22593:41;;;:11;:41;;;;:110;;;;22666:37;22651:52;;;:11;:52;;;;22593:110;:163;;;;22720:36;22744:11;22720:23;:36::i;:::-;22593:163;22573:183;;22454:310;;;:::o;45726:89::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45792:15:::1;45800:6;45792:7;:15::i;:::-;45726:89:::0;:::o;23175:105::-;23235:13;23268:4;23261:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23175:105;;;:::o;46044:214::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46216:34:::1;46227:2;46231:3;46236:7;46245:4;46216:10;:34::i;:::-;46044:214:::0;;;;:::o;44113:642::-;44389:14;44406:3;:10;44389:27;;44431:9;44427:251;44450:6;44446:1;:10;44427:251;;;44474:24;44527:16;:24;44544:3;44548:1;44544:6;;;;;;;;:::i;:::-;;;;;;;;44527:24;;;;;;;;;;;:30;44552:4;44527:30;;;;;;;;;;;;;;;;44501:23;44511:4;44517:3;44521:1;44517:6;;;;;;;;:::i;:::-;;;;;;;;44501:9;:23::i;:::-;:56;;;;:::i;:::-;44474:83;;44601:7;44609:1;44601:10;;;;;;;;:::i;:::-;;;;;;;;44581:16;:30;;44613:20;;;;;;;;;;;;;;;;;44573:61;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;44661:3;;;;;44459:219;44427:251;;;;44690:57;44718:4;44724:2;44728:3;44733:7;44742:4;44690:27;:57::i;:::-;44309:446;44113:642;;;;;:::o;41336:552::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41531:7:::1;;:14;;41517:3;;:10;;:28;41547:19;;;;;;;;;;;;;;;;;41509:58;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41580:14;41597:7;;:14;;41580:31;;41627:9;41622:259;41646:6;41642:1;:10;41622:259;;;41708:7;;41716:1;41708:10;;;;;;;:::i;:::-;;;;;;;;41678:26;41688:7;41697:3;;41701:1;41697:6;;;;;;;:::i;:::-;;;;;;;;41678:9;:26::i;:::-;:40;;41720:16;;;;;;;;;;;;;;;;;41670:67;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;41754:53;41779:7;41788:3;;41792:1;41788:6;;;;;;;:::i;:::-;;;;;;;;41796:7;;41804:1;41796:10;;;;;;;:::i;:::-;;;;;;;;41754:24;:53::i;:::-;41836:3;;;;;41622:259;;;;41498:390;41336:552:::0;;;;;:::o;23828:524::-;23984:16;24045:3;:10;24026:8;:15;:29;24018:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;24114:30;24161:8;:15;24147:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24114:63;;24195:9;24190:122;24214:8;:15;24210:1;:19;24190:122;;;24270:30;24280:8;24289:1;24280:11;;;;;;;;:::i;:::-;;;;;;;;24293:3;24297:1;24293:6;;;;;;;;:::i;:::-;;;;;;;;24270:9;:30::i;:::-;24251:13;24265:1;24251:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;24231:3;;;;:::i;:::-;;;24190:122;;;;24331:13;24324:20;;;23828:524;;;;:::o;37876:122::-;37933:4;37989:1;37957:29;37983:2;37957:25;:29::i;:::-;:33;37950:40;;37876:122;;;:::o;45150:568::-;45367:14;45384:3;:10;45367:27;;45409:9;45405:256;45428:6;45424:1;:10;45405:256;;;45452:24;45508:16;:24;45525:3;45529:1;45525:6;;;;;;;;:::i;:::-;;;;;;;;45508:24;;;;;;;;;;;:33;45533:7;45508:33;;;;;;;;;;;;;;;;45479:26;45489:7;45498:3;45502:1;45498:6;;;;;;;;:::i;:::-;;;;;;;;45479:9;:26::i;:::-;:62;;;;:::i;:::-;45452:89;;45585:6;45592:1;45585:9;;;;;;;;:::i;:::-;;;;;;;;45565:16;:29;;45596:20;;;;;;;;;;;;;;;;;45557:60;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;45644:3;;;;;45437:224;45405:256;;;;45673:37;45689:7;45698:3;45703:6;45673:15;:37::i;:::-;45285:433;45150:568;;;:::o;2618:103::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2683:30:::1;2710:1;2683:18;:30::i;:::-;2618:103::o:0;45844:192::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45996:32:::1;46002:7;46011:2;46015:6;46023:4;45996:5;:32::i;:::-;45844:192:::0;;;;:::o;40217:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1967:87::-;2013:7;2040:6;;;;;;;;;;;2033:13;;1967:87;:::o;24425:155::-;24520:52;24539:12;:10;:12::i;:::-;24553:8;24563;24520:18;:52::i;:::-;24425:155;;:::o;42476:564::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42671:7:::1;;:14;;42657:3;;:10;;:28;42687:19;;;;;;;;;;;;;;;;;42649:58;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42720:14;42737:7;;:14;;42720:31;;42767:9;42762:271;42786:6;42782:1;:10;42762:271;;;42848:7;;42856:1;42848:10;;;;;;;:::i;:::-;;;;;;;;42818:26;42828:7;42837:3;;42841:1;42837:6;;;;;;;:::i;:::-;;;;;;;;42818:9;:26::i;:::-;:40;;42860:16;;;;;;;;;;;;;;;;;42810:67;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;42894:53;42919:7;42928:3;;42932:1;42928:6;;;;;;;:::i;:::-;;;;;;;;42936:7;;42944:1;42936:10;;;;;;;:::i;:::-;;;;;;;;42894:24;:53::i;:::-;42988:3;;;;;42762:271;;;;42638:402;42476:564:::0;;;;;:::o;37665:113::-;37727:7;37754:12;:16;37767:2;37754:16;;;;;;;;;;;;37747:23;;37665:113;;;:::o;24652:168::-;24751:4;24775:18;:27;24794:7;24775:27;;;;;;;;;;;;;;;:37;24803:8;24775:37;;;;;;;;;;;;;;;;;;;;;;;;;24768:44;;24652:168;;;;:::o;43653:452::-;43890:24;43939:16;:20;43956:2;43939:20;;;;;;;;;;;:26;43960:4;43939:26;;;;;;;;;;;;;;;;43917:19;43927:4;43933:2;43917:9;:19::i;:::-;:48;;;;:::i;:::-;43890:75;;44005:6;43985:16;:26;;44013:20;;;;;;;;;;;;;;;;;43977:57;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;44047:50;44070:4;44076:2;44080;44084:6;44092:4;44047:22;:50::i;:::-;43823:282;43653:452;;;;;:::o;2876:201::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2985:1:::1;2965:22;;:8;:22;;;;2957:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3041:28;3060:8;3041:18;:28::i;:::-;2876:201:::0;:::o;44763:379::-;44942:24;44994:16;:20;45011:2;44994:20;;;;;;;;;;;:29;45015:7;44994:29;;;;;;;;;;;;;;;;44969:22;44979:7;44988:2;44969:9;:22::i;:::-;:54;;;;:::i;:::-;44942:81;;45063:5;45043:16;:25;;45070:20;;;;;;;;;;;;;;;;;45035:56;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;45104:30;45115:7;45124:2;45128:5;45104:10;:30::i;:::-;44873:269;44763:379;;;:::o;42094:195::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42236:45:::1;42261:7;42270:2;42274:6;42236:24;:45::i;:::-;42094:195:::0;;;:::o;685:98::-;738:7;765:10;758:17;;685:98;:::o;43093:231::-;43258:6;43225:16;:20;43242:2;43225:20;;;;;;;;;;;:29;43246:7;43225:29;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;43280:36;43296:7;43305:2;43309:6;43280:36;;;;;;;;:::i;:::-;;;;;;;;43093:231;;;:::o;13738:157::-;13823:4;13862:25;13847:40;;;:11;:40;;;;13840:47;;13738:157;;;:::o;29372:88::-;29446:6;29439:4;:13;;;;;;;;;;;;:::i;:::-;;29372:88;:::o;30771:735::-;30963:1;30949:16;;:2;:16;;;;30941:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31036:7;:14;31022:3;:10;:28;31014:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31108:16;31127:12;:10;:12::i;:::-;31108:31;;31152:66;31173:8;31191:1;31195:2;31199:3;31204:7;31213:4;31152:20;:66::i;:::-;31236:9;31231:103;31255:3;:10;31251:1;:14;31231:103;;;31312:7;31320:1;31312:10;;;;;;;;:::i;:::-;;;;;;;;31287:9;:17;31297:3;31301:1;31297:6;;;;;;;;:::i;:::-;;;;;;;;31287:17;;;;;;;;;;;:21;31305:2;31287:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;31267:3;;;;;:::i;:::-;;;;31231:103;;;;31387:2;31351:53;;31383:1;31351:53;;31365:8;31351:53;;;31391:3;31396:7;31351:53;;;;;;;:::i;:::-;;;;;;;;31417:81;31453:8;31471:1;31475:2;31479:3;31484:7;31493:4;31417:35;:81::i;:::-;30930:576;30771:735;;;;:::o;25370:442::-;25611:12;:10;:12::i;:::-;25603:20;;:4;:20;;;:60;;;;25627:36;25644:4;25650:12;:10;:12::i;:::-;25627:16;:36::i;:::-;25603:60;25581:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;25752:52;25775:4;25781:2;25785:3;25790:7;25799:4;25752:22;:52::i;:::-;25370:442;;;;;:::o;39501:353::-;39677:12;:10;:12::i;:::-;39666:23;;:7;:23;;;:66;;;;39693:39;39710:7;39719:12;:10;:12::i;:::-;39693:16;:39::i;:::-;39666:66;39644:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;39814:32;39825:7;39834:3;39839:6;39814:10;:32::i;:::-;39501:353;;;:::o;3237:191::-;3311:16;3330:6;;;;;;;;;;;3311:25;;3356:8;3347:6;;:17;;;;;;;;;;;;;;;;;;3411:8;3380:40;;3401:8;3380:40;;;;;;;;;;;;3300:128;3237:191;:::o;29846:569::-;30013:1;29999:16;;:2;:16;;;;29991:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30066:16;30085:12;:10;:12::i;:::-;30066:31;;30110:102;30131:8;30149:1;30153:2;30157:21;30175:2;30157:17;:21::i;:::-;30180:25;30198:6;30180:17;:25::i;:::-;30207:4;30110:20;:102::i;:::-;30246:6;30225:9;:13;30235:2;30225:13;;;;;;;;;;;:17;30239:2;30225:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;30305:2;30268:52;;30301:1;30268:52;;30283:8;30268:52;;;30309:2;30313:6;30268:52;;;;;;;:::i;:::-;;;;;;;;30333:74;30364:8;30382:1;30386:2;30390;30394:6;30402:4;30333:30;:74::i;:::-;29980:435;29846:569;;;;:::o;33640:331::-;33795:8;33786:17;;:5;:17;;;;33778:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33898:8;33860:18;:25;33879:5;33860:25;;;;;;;;;;;;;;;:35;33886:8;33860:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33944:8;33922:41;;33937:5;33922:41;;;33954:8;33922:41;;;;;;:::i;:::-;;;;;;;;33640:331;;;:::o;43379:235::-;43546:6;43513:16;:20;43530:2;43513:20;;;;;;;;;;;:29;43534:7;43513:29;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;43568:38;43586:7;43595:2;43599:6;43568:38;;;;;;;;:::i;:::-;;;;;;;;43379:235;;;:::o;24892:401::-;25108:12;:10;:12::i;:::-;25100:20;;:4;:20;;;:60;;;;25124:36;25141:4;25147:12;:10;:12::i;:::-;25124:16;:36::i;:::-;25100:60;25078:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;25240:45;25258:4;25264:2;25268;25272:6;25280:4;25240:17;:45::i;:::-;24892:401;;;;;:::o;39172:321::-;39323:12;:10;:12::i;:::-;39312:23;;:7;:23;;;:66;;;;39339:39;39356:7;39365:12;:10;:12::i;:::-;39339:16;:39::i;:::-;39312:66;39290:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;39460:25;39466:7;39475:2;39479:5;39460;:25::i;:::-;39172:321;;;:::o;46336:334::-;46596:66;46623:8;46633:4;46639:2;46643:3;46648:7;46657:4;46596:26;:66::i;:::-;46336:334;;;;;;:::o;35908:813::-;36148:15;:2;:13;;;:15::i;:::-;36144:570;;;36201:2;36184:43;;;36228:8;36238:4;36244:3;36249:7;36258:4;36184:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36180:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;36576:6;36569:14;;;;;;;;;;;:::i;:::-;;;;;;;;36180:523;;;36625:62;;;;;;;;;;:::i;:::-;;;;;;;;36180:523;36357:48;;;36345:60;;;:8;:60;;;;36341:159;;36430:50;;;;;;;;;;:::i;:::-;;;;;;;;36341:159;36264:251;36144:570;35908:813;;;;;;:::o;27454:1074::-;27681:7;:14;27667:3;:10;:28;27659:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;27773:1;27759:16;;:2;:16;;;;27751:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27830:16;27849:12;:10;:12::i;:::-;27830:31;;27874:60;27895:8;27905:4;27911:2;27915:3;27920:7;27929:4;27874:20;:60::i;:::-;27952:9;27947:421;27971:3;:10;27967:1;:14;27947:421;;;28003:10;28016:3;28020:1;28016:6;;;;;;;;:::i;:::-;;;;;;;;28003:19;;28037:14;28054:7;28062:1;28054:10;;;;;;;;:::i;:::-;;;;;;;;28037:27;;28081:19;28103:9;:13;28113:2;28103:13;;;;;;;;;;;:19;28117:4;28103:19;;;;;;;;;;;;;;;;28081:41;;28160:6;28145:11;:21;;28137:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28293:6;28279:11;:20;28257:9;:13;28267:2;28257:13;;;;;;;;;;;:19;28271:4;28257:19;;;;;;;;;;;;;;;:42;;;;28350:6;28329:9;:13;28339:2;28329:13;;;;;;;;;;;:17;28343:2;28329:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27988:380;;;27983:3;;;;:::i;:::-;;;27947:421;;;;28415:2;28385:47;;28409:4;28385:47;;28399:8;28385:47;;;28419:3;28424:7;28385:47;;;;;;;:::i;:::-;;;;;;;;28445:75;28481:8;28491:4;28497:2;28501:3;28506:7;28515:4;28445:35;:75::i;:::-;27648:880;27454:1074;;;;;:::o;32607:891::-;32775:1;32759:18;;:4;:18;;;;32751:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32850:7;:14;32836:3;:10;:28;32828:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32922:16;32941:12;:10;:12::i;:::-;32922:31;;32966:66;32987:8;32997:4;33011:1;33015:3;33020:7;32966:66;;;;;;;;;;;;:20;:66::i;:::-;33050:9;33045:373;33069:3;:10;33065:1;:14;33045:373;;;33101:10;33114:3;33118:1;33114:6;;;;;;;;:::i;:::-;;;;;;;;33101:19;;33135:14;33152:7;33160:1;33152:10;;;;;;;;:::i;:::-;;;;;;;;33135:27;;33179:19;33201:9;:13;33211:2;33201:13;;;;;;;;;;;:19;33215:4;33201:19;;;;;;;;;;;;;;;;33179:41;;33258:6;33243:11;:21;;33235:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;33385:6;33371:11;:20;33349:9;:13;33359:2;33349:13;;;;;;;;;;;:19;33363:4;33349:19;;;;;;;;;;;;;;;:42;;;;33086:332;;;33081:3;;;;;:::i;:::-;;;;33045:373;;;;33473:1;33435:55;;33459:4;33435:55;;33449:8;33435:55;;;33477:3;33482:7;33435:55;;;;;;;:::i;:::-;;;;;;;;32740:758;32607:891;;;:::o;36729:198::-;36795:16;36824:22;36863:1;36849:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36824:41;;36887:7;36876:5;36882:1;36876:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;36914:5;36907:12;;;36729:198;;;:::o;35156:744::-;35371:15;:2;:13;;;:15::i;:::-;35367:526;;;35424:2;35407:38;;;35446:8;35456:4;35462:2;35466:6;35474:4;35407:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35403:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;35755:6;35748:14;;;;;;;;;;;:::i;:::-;;;;;;;;35403:479;;;35804:62;;;;;;;;;;:::i;:::-;;;;;;;;35403:479;35541:43;;;35529:55;;;:8;:55;;;;35525:154;;35609:50;;;;;;;;;;:::i;:::-;;;;;;;;35525:154;35480:214;35367:526;35156:744;;;;;;:::o;26276:820::-;26478:1;26464:16;;:2;:16;;;;26456:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;26535:16;26554:12;:10;:12::i;:::-;26535:31;;26579:96;26600:8;26610:4;26616:2;26620:21;26638:2;26620:17;:21::i;:::-;26643:25;26661:6;26643:17;:25::i;:::-;26670:4;26579:20;:96::i;:::-;26688:19;26710:9;:13;26720:2;26710:13;;;;;;;;;;;:19;26724:4;26710:19;;;;;;;;;;;;;;;;26688:41;;26763:6;26748:11;:21;;26740:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26888:6;26874:11;:20;26852:9;:13;26862:2;26852:13;;;;;;;;;;;:19;26866:4;26852:19;;;;;;;;;;;;;;;:42;;;;26937:6;26916:9;:13;26926:2;26916:13;;;;;;;;;;;:17;26930:2;26916:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;26992:2;26961:46;;26986:4;26961:46;;26976:8;26961:46;;;26996:2;27000:6;26961:46;;;;;;;:::i;:::-;;;;;;;;27020:68;27051:8;27061:4;27067:2;27071;27075:6;27083:4;27020:30;:68::i;:::-;26445:651;;26276:820;;;;;:::o;31756:648::-;31899:1;31883:18;;:4;:18;;;;31875:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31954:16;31973:12;:10;:12::i;:::-;31954:31;;31998:102;32019:8;32029:4;32043:1;32047:21;32065:2;32047:17;:21::i;:::-;32070:25;32088:6;32070:17;:25::i;:::-;31998:102;;;;;;;;;;;;:20;:102::i;:::-;32113:19;32135:9;:13;32145:2;32135:13;;;;;;;;;;;:19;32149:4;32135:19;;;;;;;;;;;;;;;;32113:41;;32188:6;32173:11;:21;;32165:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;32307:6;32293:11;:20;32271:9;:13;32281:2;32271:13;;;;;;;;;;;:19;32285:4;32271:19;;;;;;;;;;;;;;;:42;;;;32381:1;32342:54;;32367:4;32342:54;;32357:8;32342:54;;;32385:2;32389:6;32342:54;;;;;;;:::i;:::-;;;;;;;;31864:540;;31756:648;;;:::o;38073:655::-;38312:66;38339:8;38349:4;38355:2;38359:3;38364:7;38373:4;38312:26;:66::i;:::-;38411:1;38395:18;;:4;:18;;;38391:160;;;38435:9;38430:110;38454:3;:10;38450:1;:14;38430:110;;;38514:7;38522:1;38514:10;;;;;;;;:::i;:::-;;;;;;;;38490:12;:20;38503:3;38507:1;38503:6;;;;;;;;:::i;:::-;;;;;;;;38490:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;38466:3;;;;:::i;:::-;;;38430:110;;;;38391:160;38581:1;38567:16;;:2;:16;;;38563:158;;;38605:9;38600:110;38624:3;:10;38620:1;:14;38600:110;;;38684:7;38692:1;38684:10;;;;;;;;:::i;:::-;;;;;;;;38660:12;:20;38673:3;38677:1;38673:6;;;;;;;;:::i;:::-;;;;;;;;38660:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;38636:3;;;;:::i;:::-;;;38600:110;;;;38563:158;38073:655;;;;;;:::o;4674:326::-;4734:4;4991:1;4969:7;:19;;;:23;4962:30;;4674:326;;;:::o;34927:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:568::-;2959:8;2969:6;3019:3;3012:4;3004:6;3000:17;2996:27;2986:122;;3027:79;;:::i;:::-;2986:122;3140:6;3127:20;3117:30;;3170:18;3162:6;3159:30;3156:117;;;3192:79;;:::i;:::-;3156:117;3306:4;3298:6;3294:17;3282:29;;3360:3;3352:4;3344:6;3340:17;3330:8;3326:32;3323:41;3320:128;;;3367:79;;:::i;:::-;3320:128;2886:568;;;;;:::o;3477:370::-;3548:5;3597:3;3590:4;3582:6;3578:17;3574:27;3564:122;;3605:79;;:::i;:::-;3564:122;3722:6;3709:20;3747:94;3837:3;3829:6;3822:4;3814:6;3810:17;3747:94;:::i;:::-;3738:103;;3554:293;3477:370;;;;:::o;3853:133::-;3896:5;3934:6;3921:20;3912:29;;3950:30;3974:5;3950:30;:::i;:::-;3853:133;;;;:::o;3992:137::-;4037:5;4075:6;4062:20;4053:29;;4091:32;4117:5;4091:32;:::i;:::-;3992:137;;;;:::o;4135:141::-;4191:5;4222:6;4216:13;4207:22;;4238:32;4264:5;4238:32;:::i;:::-;4135:141;;;;:::o;4295:338::-;4350:5;4399:3;4392:4;4384:6;4380:17;4376:27;4366:122;;4407:79;;:::i;:::-;4366:122;4524:6;4511:20;4549:78;4623:3;4615:6;4608:4;4600:6;4596:17;4549:78;:::i;:::-;4540:87;;4356:277;4295:338;;;;:::o;4653:340::-;4709:5;4758:3;4751:4;4743:6;4739:17;4735:27;4725:122;;4766:79;;:::i;:::-;4725:122;4883:6;4870:20;4908:79;4983:3;4975:6;4968:4;4960:6;4956:17;4908:79;:::i;:::-;4899:88;;4715:278;4653:340;;;;:::o;4999:139::-;5045:5;5083:6;5070:20;5061:29;;5099:33;5126:5;5099:33;:::i;:::-;4999:139;;;;:::o;5144:329::-;5203:6;5252:2;5240:9;5231:7;5227:23;5223:32;5220:119;;;5258:79;;:::i;:::-;5220:119;5378:1;5403:53;5448:7;5439:6;5428:9;5424:22;5403:53;:::i;:::-;5393:63;;5349:117;5144:329;;;;:::o;5479:474::-;5547:6;5555;5604:2;5592:9;5583:7;5579:23;5575:32;5572:119;;;5610:79;;:::i;:::-;5572:119;5730:1;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5701:117;5857:2;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5828:118;5479:474;;;;;:::o;5959:1509::-;6113:6;6121;6129;6137;6145;6194:3;6182:9;6173:7;6169:23;6165:33;6162:120;;;6201:79;;:::i;:::-;6162:120;6321:1;6346:53;6391:7;6382:6;6371:9;6367:22;6346:53;:::i;:::-;6336:63;;6292:117;6448:2;6474:53;6519:7;6510:6;6499:9;6495:22;6474:53;:::i;:::-;6464:63;;6419:118;6604:2;6593:9;6589:18;6576:32;6635:18;6627:6;6624:30;6621:117;;;6657:79;;:::i;:::-;6621:117;6762:78;6832:7;6823:6;6812:9;6808:22;6762:78;:::i;:::-;6752:88;;6547:303;6917:2;6906:9;6902:18;6889:32;6948:18;6940:6;6937:30;6934:117;;;6970:79;;:::i;:::-;6934:117;7075:78;7145:7;7136:6;7125:9;7121:22;7075:78;:::i;:::-;7065:88;;6860:303;7230:3;7219:9;7215:19;7202:33;7262:18;7254:6;7251:30;7248:117;;;7284:79;;:::i;:::-;7248:117;7389:62;7443:7;7434:6;7423:9;7419:22;7389:62;:::i;:::-;7379:72;;7173:288;5959:1509;;;;;;;;:::o;7474:1089::-;7578:6;7586;7594;7602;7610;7659:3;7647:9;7638:7;7634:23;7630:33;7627:120;;;7666:79;;:::i;:::-;7627:120;7786:1;7811:53;7856:7;7847:6;7836:9;7832:22;7811:53;:::i;:::-;7801:63;;7757:117;7913:2;7939:53;7984:7;7975:6;7964:9;7960:22;7939:53;:::i;:::-;7929:63;;7884:118;8041:2;8067:53;8112:7;8103:6;8092:9;8088:22;8067:53;:::i;:::-;8057:63;;8012:118;8169:2;8195:53;8240:7;8231:6;8220:9;8216:22;8195:53;:::i;:::-;8185:63;;8140:118;8325:3;8314:9;8310:19;8297:33;8357:18;8349:6;8346:30;8343:117;;;8379:79;;:::i;:::-;8343:117;8484:62;8538:7;8529:6;8518:9;8514:22;8484:62;:::i;:::-;8474:72;;8268:288;7474:1089;;;;;;;;:::o;8569:1079::-;8700:6;8708;8716;8724;8732;8781:2;8769:9;8760:7;8756:23;8752:32;8749:119;;;8787:79;;:::i;:::-;8749:119;8907:1;8932:53;8977:7;8968:6;8957:9;8953:22;8932:53;:::i;:::-;8922:63;;8878:117;9062:2;9051:9;9047:18;9034:32;9093:18;9085:6;9082:30;9079:117;;;9115:79;;:::i;:::-;9079:117;9228:80;9300:7;9291:6;9280:9;9276:22;9228:80;:::i;:::-;9210:98;;;;9005:313;9385:2;9374:9;9370:18;9357:32;9416:18;9408:6;9405:30;9402:117;;;9438:79;;:::i;:::-;9402:117;9551:80;9623:7;9614:6;9603:9;9599:22;9551:80;:::i;:::-;9533:98;;;;9328:313;8569:1079;;;;;;;;:::o;9654:1039::-;9781:6;9789;9797;9846:2;9834:9;9825:7;9821:23;9817:32;9814:119;;;9852:79;;:::i;:::-;9814:119;9972:1;9997:53;10042:7;10033:6;10022:9;10018:22;9997:53;:::i;:::-;9987:63;;9943:117;10127:2;10116:9;10112:18;10099:32;10158:18;10150:6;10147:30;10144:117;;;10180:79;;:::i;:::-;10144:117;10285:78;10355:7;10346:6;10335:9;10331:22;10285:78;:::i;:::-;10275:88;;10070:303;10440:2;10429:9;10425:18;10412:32;10471:18;10463:6;10460:30;10457:117;;;10493:79;;:::i;:::-;10457:117;10598:78;10668:7;10659:6;10648:9;10644:22;10598:78;:::i;:::-;10588:88;;10383:303;9654:1039;;;;;:::o;10699:1363::-;10844:6;10852;10860;10868;10917:3;10905:9;10896:7;10892:23;10888:33;10885:120;;;10924:79;;:::i;:::-;10885:120;11044:1;11069:53;11114:7;11105:6;11094:9;11090:22;11069:53;:::i;:::-;11059:63;;11015:117;11199:2;11188:9;11184:18;11171:32;11230:18;11222:6;11219:30;11216:117;;;11252:79;;:::i;:::-;11216:117;11357:78;11427:7;11418:6;11407:9;11403:22;11357:78;:::i;:::-;11347:88;;11142:303;11512:2;11501:9;11497:18;11484:32;11543:18;11535:6;11532:30;11529:117;;;11565:79;;:::i;:::-;11529:117;11670:78;11740:7;11731:6;11720:9;11716:22;11670:78;:::i;:::-;11660:88;;11455:303;11825:2;11814:9;11810:18;11797:32;11856:18;11848:6;11845:30;11842:117;;;11878:79;;:::i;:::-;11842:117;11983:62;12037:7;12028:6;12017:9;12013:22;11983:62;:::i;:::-;11973:72;;11768:287;10699:1363;;;;;;;:::o;12068:468::-;12133:6;12141;12190:2;12178:9;12169:7;12165:23;12161:32;12158:119;;;12196:79;;:::i;:::-;12158:119;12316:1;12341:53;12386:7;12377:6;12366:9;12362:22;12341:53;:::i;:::-;12331:63;;12287:117;12443:2;12469:50;12511:7;12502:6;12491:9;12487:22;12469:50;:::i;:::-;12459:60;;12414:115;12068:468;;;;;:::o;12542:474::-;12610:6;12618;12667:2;12655:9;12646:7;12642:23;12638:32;12635:119;;;12673:79;;:::i;:::-;12635:119;12793:1;12818:53;12863:7;12854:6;12843:9;12839:22;12818:53;:::i;:::-;12808:63;;12764:117;12920:2;12946:53;12991:7;12982:6;12971:9;12967:22;12946:53;:::i;:::-;12936:63;;12891:118;12542:474;;;;;:::o;13022:619::-;13099:6;13107;13115;13164:2;13152:9;13143:7;13139:23;13135:32;13132:119;;;13170:79;;:::i;:::-;13132:119;13290:1;13315:53;13360:7;13351:6;13340:9;13336:22;13315:53;:::i;:::-;13305:63;;13261:117;13417:2;13443:53;13488:7;13479:6;13468:9;13464:22;13443:53;:::i;:::-;13433:63;;13388:118;13545:2;13571:53;13616:7;13607:6;13596:9;13592:22;13571:53;:::i;:::-;13561:63;;13516:118;13022:619;;;;;:::o;13647:943::-;13742:6;13750;13758;13766;13815:3;13803:9;13794:7;13790:23;13786:33;13783:120;;;13822:79;;:::i;:::-;13783:120;13942:1;13967:53;14012:7;14003:6;13992:9;13988:22;13967:53;:::i;:::-;13957:63;;13913:117;14069:2;14095:53;14140:7;14131:6;14120:9;14116:22;14095:53;:::i;:::-;14085:63;;14040:118;14197:2;14223:53;14268:7;14259:6;14248:9;14244:22;14223:53;:::i;:::-;14213:63;;14168:118;14353:2;14342:9;14338:18;14325:32;14384:18;14376:6;14373:30;14370:117;;;14406:79;;:::i;:::-;14370:117;14511:62;14565:7;14556:6;14545:9;14541:22;14511:62;:::i;:::-;14501:72;;14296:287;13647:943;;;;;;;:::o;14596:894::-;14714:6;14722;14771:2;14759:9;14750:7;14746:23;14742:32;14739:119;;;14777:79;;:::i;:::-;14739:119;14925:1;14914:9;14910:17;14897:31;14955:18;14947:6;14944:30;14941:117;;;14977:79;;:::i;:::-;14941:117;15082:78;15152:7;15143:6;15132:9;15128:22;15082:78;:::i;:::-;15072:88;;14868:302;15237:2;15226:9;15222:18;15209:32;15268:18;15260:6;15257:30;15254:117;;;15290:79;;:::i;:::-;15254:117;15395:78;15465:7;15456:6;15445:9;15441:22;15395:78;:::i;:::-;15385:88;;15180:303;14596:894;;;;;:::o;15496:327::-;15554:6;15603:2;15591:9;15582:7;15578:23;15574:32;15571:119;;;15609:79;;:::i;:::-;15571:119;15729:1;15754:52;15798:7;15789:6;15778:9;15774:22;15754:52;:::i;:::-;15744:62;;15700:116;15496:327;;;;:::o;15829:349::-;15898:6;15947:2;15935:9;15926:7;15922:23;15918:32;15915:119;;;15953:79;;:::i;:::-;15915:119;16073:1;16098:63;16153:7;16144:6;16133:9;16129:22;16098:63;:::i;:::-;16088:73;;16044:127;15829:349;;;;:::o;16184:509::-;16253:6;16302:2;16290:9;16281:7;16277:23;16273:32;16270:119;;;16308:79;;:::i;:::-;16270:119;16456:1;16445:9;16441:17;16428:31;16486:18;16478:6;16475:30;16472:117;;;16508:79;;:::i;:::-;16472:117;16613:63;16668:7;16659:6;16648:9;16644:22;16613:63;:::i;:::-;16603:73;;16399:287;16184:509;;;;:::o;16699:329::-;16758:6;16807:2;16795:9;16786:7;16782:23;16778:32;16775:119;;;16813:79;;:::i;:::-;16775:119;16933:1;16958:53;17003:7;16994:6;16983:9;16979:22;16958:53;:::i;:::-;16948:63;;16904:117;16699:329;;;;:::o;17034:474::-;17102:6;17110;17159:2;17147:9;17138:7;17134:23;17130:32;17127:119;;;17165:79;;:::i;:::-;17127:119;17285:1;17310:53;17355:7;17346:6;17335:9;17331:22;17310:53;:::i;:::-;17300:63;;17256:117;17412:2;17438:53;17483:7;17474:6;17463:9;17459:22;17438:53;:::i;:::-;17428:63;;17383:118;17034:474;;;;;:::o;17514:179::-;17583:10;17604:46;17646:3;17638:6;17604:46;:::i;:::-;17682:4;17677:3;17673:14;17659:28;;17514:179;;;;:::o;17699:118::-;17786:24;17804:5;17786:24;:::i;:::-;17781:3;17774:37;17699:118;;:::o;17853:732::-;17972:3;18001:54;18049:5;18001:54;:::i;:::-;18071:86;18150:6;18145:3;18071:86;:::i;:::-;18064:93;;18181:56;18231:5;18181:56;:::i;:::-;18260:7;18291:1;18276:284;18301:6;18298:1;18295:13;18276:284;;;18377:6;18371:13;18404:63;18463:3;18448:13;18404:63;:::i;:::-;18397:70;;18490:60;18543:6;18490:60;:::i;:::-;18480:70;;18336:224;18323:1;18320;18316:9;18311:14;;18276:284;;;18280:14;18576:3;18569:10;;17977:608;;;17853:732;;;;:::o;18591:109::-;18672:21;18687:5;18672:21;:::i;:::-;18667:3;18660:34;18591:109;;:::o;18706:360::-;18792:3;18820:38;18852:5;18820:38;:::i;:::-;18874:70;18937:6;18932:3;18874:70;:::i;:::-;18867:77;;18953:52;18998:6;18993:3;18986:4;18979:5;18975:16;18953:52;:::i;:::-;19030:29;19052:6;19030:29;:::i;:::-;19025:3;19021:39;19014:46;;18796:270;18706:360;;;;:::o;19072:364::-;19160:3;19188:39;19221:5;19188:39;:::i;:::-;19243:71;19307:6;19302:3;19243:71;:::i;:::-;19236:78;;19323:52;19368:6;19363:3;19356:4;19349:5;19345:16;19323:52;:::i;:::-;19400:29;19422:6;19400:29;:::i;:::-;19395:3;19391:39;19384:46;;19164:272;19072:364;;;;:::o;19442:366::-;19584:3;19605:67;19669:2;19664:3;19605:67;:::i;:::-;19598:74;;19681:93;19770:3;19681:93;:::i;:::-;19799:2;19794:3;19790:12;19783:19;;19442:366;;;:::o;19814:::-;19956:3;19977:67;20041:2;20036:3;19977:67;:::i;:::-;19970:74;;20053:93;20142:3;20053:93;:::i;:::-;20171:2;20166:3;20162:12;20155:19;;19814:366;;;:::o;20186:::-;20328:3;20349:67;20413:2;20408:3;20349:67;:::i;:::-;20342:74;;20425:93;20514:3;20425:93;:::i;:::-;20543:2;20538:3;20534:12;20527:19;;20186:366;;;:::o;20558:::-;20700:3;20721:67;20785:2;20780:3;20721:67;:::i;:::-;20714:74;;20797:93;20886:3;20797:93;:::i;:::-;20915:2;20910:3;20906:12;20899:19;;20558:366;;;:::o;20930:::-;21072:3;21093:67;21157:2;21152:3;21093:67;:::i;:::-;21086:74;;21169:93;21258:3;21169:93;:::i;:::-;21287:2;21282:3;21278:12;21271:19;;20930:366;;;:::o;21302:::-;21444:3;21465:67;21529:2;21524:3;21465:67;:::i;:::-;21458:74;;21541:93;21630:3;21541:93;:::i;:::-;21659:2;21654:3;21650:12;21643:19;;21302:366;;;:::o;21674:::-;21816:3;21837:67;21901:2;21896:3;21837:67;:::i;:::-;21830:74;;21913:93;22002:3;21913:93;:::i;:::-;22031:2;22026:3;22022:12;22015:19;;21674:366;;;:::o;22046:::-;22188:3;22209:67;22273:2;22268:3;22209:67;:::i;:::-;22202:74;;22285:93;22374:3;22285:93;:::i;:::-;22403:2;22398:3;22394:12;22387:19;;22046:366;;;:::o;22418:::-;22560:3;22581:67;22645:2;22640:3;22581:67;:::i;:::-;22574:74;;22657:93;22746:3;22657:93;:::i;:::-;22775:2;22770:3;22766:12;22759:19;;22418:366;;;:::o;22790:::-;22932:3;22953:67;23017:2;23012:3;22953:67;:::i;:::-;22946:74;;23029:93;23118:3;23029:93;:::i;:::-;23147:2;23142:3;23138:12;23131:19;;22790:366;;;:::o;23162:::-;23304:3;23325:67;23389:2;23384:3;23325:67;:::i;:::-;23318:74;;23401:93;23490:3;23401:93;:::i;:::-;23519:2;23514:3;23510:12;23503:19;;23162:366;;;:::o;23534:::-;23676:3;23697:67;23761:2;23756:3;23697:67;:::i;:::-;23690:74;;23773:93;23862:3;23773:93;:::i;:::-;23891:2;23886:3;23882:12;23875:19;;23534:366;;;:::o;23906:::-;24048:3;24069:67;24133:2;24128:3;24069:67;:::i;:::-;24062:74;;24145:93;24234:3;24145:93;:::i;:::-;24263:2;24258:3;24254:12;24247:19;;23906:366;;;:::o;24278:::-;24420:3;24441:67;24505:2;24500:3;24441:67;:::i;:::-;24434:74;;24517:93;24606:3;24517:93;:::i;:::-;24635:2;24630:3;24626:12;24619:19;;24278:366;;;:::o;24650:::-;24792:3;24813:67;24877:2;24872:3;24813:67;:::i;:::-;24806:74;;24889:93;24978:3;24889:93;:::i;:::-;25007:2;25002:3;24998:12;24991:19;;24650:366;;;:::o;25022:108::-;25099:24;25117:5;25099:24;:::i;:::-;25094:3;25087:37;25022:108;;:::o;25136:118::-;25223:24;25241:5;25223:24;:::i;:::-;25218:3;25211:37;25136:118;;:::o;25260:222::-;25353:4;25391:2;25380:9;25376:18;25368:26;;25404:71;25472:1;25461:9;25457:17;25448:6;25404:71;:::i;:::-;25260:222;;;;:::o;25488:1053::-;25811:4;25849:3;25838:9;25834:19;25826:27;;25863:71;25931:1;25920:9;25916:17;25907:6;25863:71;:::i;:::-;25944:72;26012:2;26001:9;25997:18;25988:6;25944:72;:::i;:::-;26063:9;26057:4;26053:20;26048:2;26037:9;26033:18;26026:48;26091:108;26194:4;26185:6;26091:108;:::i;:::-;26083:116;;26246:9;26240:4;26236:20;26231:2;26220:9;26216:18;26209:48;26274:108;26377:4;26368:6;26274:108;:::i;:::-;26266:116;;26430:9;26424:4;26420:20;26414:3;26403:9;26399:19;26392:49;26458:76;26529:4;26520:6;26458:76;:::i;:::-;26450:84;;25488:1053;;;;;;;;:::o;26547:751::-;26770:4;26808:3;26797:9;26793:19;26785:27;;26822:71;26890:1;26879:9;26875:17;26866:6;26822:71;:::i;:::-;26903:72;26971:2;26960:9;26956:18;26947:6;26903:72;:::i;:::-;26985;27053:2;27042:9;27038:18;27029:6;26985:72;:::i;:::-;27067;27135:2;27124:9;27120:18;27111:6;27067:72;:::i;:::-;27187:9;27181:4;27177:20;27171:3;27160:9;27156:19;27149:49;27215:76;27286:4;27277:6;27215:76;:::i;:::-;27207:84;;26547:751;;;;;;;;:::o;27304:442::-;27453:4;27491:2;27480:9;27476:18;27468:26;;27504:71;27572:1;27561:9;27557:17;27548:6;27504:71;:::i;:::-;27585:72;27653:2;27642:9;27638:18;27629:6;27585:72;:::i;:::-;27667;27735:2;27724:9;27720:18;27711:6;27667:72;:::i;:::-;27304:442;;;;;;:::o;27752:373::-;27895:4;27933:2;27922:9;27918:18;27910:26;;27982:9;27976:4;27972:20;27968:1;27957:9;27953:17;27946:47;28010:108;28113:4;28104:6;28010:108;:::i;:::-;28002:116;;27752:373;;;;:::o;28131:634::-;28352:4;28390:2;28379:9;28375:18;28367:26;;28439:9;28433:4;28429:20;28425:1;28414:9;28410:17;28403:47;28467:108;28570:4;28561:6;28467:108;:::i;:::-;28459:116;;28622:9;28616:4;28612:20;28607:2;28596:9;28592:18;28585:48;28650:108;28753:4;28744:6;28650:108;:::i;:::-;28642:116;;28131:634;;;;;:::o;28771:210::-;28858:4;28896:2;28885:9;28881:18;28873:26;;28909:65;28971:1;28960:9;28956:17;28947:6;28909:65;:::i;:::-;28771:210;;;;:::o;28987:313::-;29100:4;29138:2;29127:9;29123:18;29115:26;;29187:9;29181:4;29177:20;29173:1;29162:9;29158:17;29151:47;29215:78;29288:4;29279:6;29215:78;:::i;:::-;29207:86;;28987:313;;;;:::o;29306:419::-;29472:4;29510:2;29499:9;29495:18;29487:26;;29559:9;29553:4;29549:20;29545:1;29534:9;29530:17;29523:47;29587:131;29713:4;29587:131;:::i;:::-;29579:139;;29306:419;;;:::o;29731:::-;29897:4;29935:2;29924:9;29920:18;29912:26;;29984:9;29978:4;29974:20;29970:1;29959:9;29955:17;29948:47;30012:131;30138:4;30012:131;:::i;:::-;30004:139;;29731:419;;;:::o;30156:::-;30322:4;30360:2;30349:9;30345:18;30337:26;;30409:9;30403:4;30399:20;30395:1;30384:9;30380:17;30373:47;30437:131;30563:4;30437:131;:::i;:::-;30429:139;;30156:419;;;:::o;30581:::-;30747:4;30785:2;30774:9;30770:18;30762:26;;30834:9;30828:4;30824:20;30820:1;30809:9;30805:17;30798:47;30862:131;30988:4;30862:131;:::i;:::-;30854:139;;30581:419;;;:::o;31006:::-;31172:4;31210:2;31199:9;31195:18;31187:26;;31259:9;31253:4;31249:20;31245:1;31234:9;31230:17;31223:47;31287:131;31413:4;31287:131;:::i;:::-;31279:139;;31006:419;;;:::o;31431:::-;31597:4;31635:2;31624:9;31620:18;31612:26;;31684:9;31678:4;31674:20;31670:1;31659:9;31655:17;31648:47;31712:131;31838:4;31712:131;:::i;:::-;31704:139;;31431:419;;;:::o;31856:::-;32022:4;32060:2;32049:9;32045:18;32037:26;;32109:9;32103:4;32099:20;32095:1;32084:9;32080:17;32073:47;32137:131;32263:4;32137:131;:::i;:::-;32129:139;;31856:419;;;:::o;32281:::-;32447:4;32485:2;32474:9;32470:18;32462:26;;32534:9;32528:4;32524:20;32520:1;32509:9;32505:17;32498:47;32562:131;32688:4;32562:131;:::i;:::-;32554:139;;32281:419;;;:::o;32706:::-;32872:4;32910:2;32899:9;32895:18;32887:26;;32959:9;32953:4;32949:20;32945:1;32934:9;32930:17;32923:47;32987:131;33113:4;32987:131;:::i;:::-;32979:139;;32706:419;;;:::o;33131:::-;33297:4;33335:2;33324:9;33320:18;33312:26;;33384:9;33378:4;33374:20;33370:1;33359:9;33355:17;33348:47;33412:131;33538:4;33412:131;:::i;:::-;33404:139;;33131:419;;;:::o;33556:::-;33722:4;33760:2;33749:9;33745:18;33737:26;;33809:9;33803:4;33799:20;33795:1;33784:9;33780:17;33773:47;33837:131;33963:4;33837:131;:::i;:::-;33829:139;;33556:419;;;:::o;33981:::-;34147:4;34185:2;34174:9;34170:18;34162:26;;34234:9;34228:4;34224:20;34220:1;34209:9;34205:17;34198:47;34262:131;34388:4;34262:131;:::i;:::-;34254:139;;33981:419;;;:::o;34406:::-;34572:4;34610:2;34599:9;34595:18;34587:26;;34659:9;34653:4;34649:20;34645:1;34634:9;34630:17;34623:47;34687:131;34813:4;34687:131;:::i;:::-;34679:139;;34406:419;;;:::o;34831:::-;34997:4;35035:2;35024:9;35020:18;35012:26;;35084:9;35078:4;35074:20;35070:1;35059:9;35055:17;35048:47;35112:131;35238:4;35112:131;:::i;:::-;35104:139;;34831:419;;;:::o;35256:::-;35422:4;35460:2;35449:9;35445:18;35437:26;;35509:9;35503:4;35499:20;35495:1;35484:9;35480:17;35473:47;35537:131;35663:4;35537:131;:::i;:::-;35529:139;;35256:419;;;:::o;35681:222::-;35774:4;35812:2;35801:9;35797:18;35789:26;;35825:71;35893:1;35882:9;35878:17;35869:6;35825:71;:::i;:::-;35681:222;;;;:::o;35909:332::-;36030:4;36068:2;36057:9;36053:18;36045:26;;36081:71;36149:1;36138:9;36134:17;36125:6;36081:71;:::i;:::-;36162:72;36230:2;36219:9;36215:18;36206:6;36162:72;:::i;:::-;35909:332;;;;;:::o;36247:129::-;36281:6;36308:20;;:::i;:::-;36298:30;;36337:33;36365:4;36357:6;36337:33;:::i;:::-;36247:129;;;:::o;36382:75::-;36415:6;36448:2;36442:9;36432:19;;36382:75;:::o;36463:311::-;36540:4;36630:18;36622:6;36619:30;36616:56;;;36652:18;;:::i;:::-;36616:56;36702:4;36694:6;36690:17;36682:25;;36762:4;36756;36752:15;36744:23;;36463:311;;;:::o;36780:::-;36857:4;36947:18;36939:6;36936:30;36933:56;;;36969:18;;:::i;:::-;36933:56;37019:4;37011:6;37007:17;36999:25;;37079:4;37073;37069:15;37061:23;;36780:311;;;:::o;37097:307::-;37158:4;37248:18;37240:6;37237:30;37234:56;;;37270:18;;:::i;:::-;37234:56;37308:29;37330:6;37308:29;:::i;:::-;37300:37;;37392:4;37386;37382:15;37374:23;;37097:307;;;:::o;37410:308::-;37472:4;37562:18;37554:6;37551:30;37548:56;;;37584:18;;:::i;:::-;37548:56;37622:29;37644:6;37622:29;:::i;:::-;37614:37;;37706:4;37700;37696:15;37688:23;;37410:308;;;:::o;37724:132::-;37791:4;37814:3;37806:11;;37844:4;37839:3;37835:14;37827:22;;37724:132;;;:::o;37862:114::-;37929:6;37963:5;37957:12;37947:22;;37862:114;;;:::o;37982:98::-;38033:6;38067:5;38061:12;38051:22;;37982:98;;;:::o;38086:99::-;38138:6;38172:5;38166:12;38156:22;;38086:99;;;:::o;38191:113::-;38261:4;38293;38288:3;38284:14;38276:22;;38191:113;;;:::o;38310:184::-;38409:11;38443:6;38438:3;38431:19;38483:4;38478:3;38474:14;38459:29;;38310:184;;;;:::o;38500:168::-;38583:11;38617:6;38612:3;38605:19;38657:4;38652:3;38648:14;38633:29;;38500:168;;;;:::o;38674:169::-;38758:11;38792:6;38787:3;38780:19;38832:4;38827:3;38823:14;38808:29;;38674:169;;;;:::o;38849:305::-;38889:3;38908:20;38926:1;38908:20;:::i;:::-;38903:25;;38942:20;38960:1;38942:20;:::i;:::-;38937:25;;39096:1;39028:66;39024:74;39021:1;39018:81;39015:107;;;39102:18;;:::i;:::-;39015:107;39146:1;39143;39139:9;39132:16;;38849:305;;;;:::o;39160:191::-;39200:4;39220:20;39238:1;39220:20;:::i;:::-;39215:25;;39254:20;39272:1;39254:20;:::i;:::-;39249:25;;39293:1;39290;39287:8;39284:34;;;39298:18;;:::i;:::-;39284:34;39343:1;39340;39336:9;39328:17;;39160:191;;;;:::o;39357:96::-;39394:7;39423:24;39441:5;39423:24;:::i;:::-;39412:35;;39357:96;;;:::o;39459:90::-;39493:7;39536:5;39529:13;39522:21;39511:32;;39459:90;;;:::o;39555:149::-;39591:7;39631:66;39624:5;39620:78;39609:89;;39555:149;;;:::o;39710:126::-;39747:7;39787:42;39780:5;39776:54;39765:65;;39710:126;;;:::o;39842:77::-;39879:7;39908:5;39897:16;;39842:77;;;:::o;39925:154::-;40009:6;40004:3;39999;39986:30;40071:1;40062:6;40057:3;40053:16;40046:27;39925:154;;;:::o;40085:307::-;40153:1;40163:113;40177:6;40174:1;40171:13;40163:113;;;40262:1;40257:3;40253:11;40247:18;40243:1;40238:3;40234:11;40227:39;40199:2;40196:1;40192:10;40187:15;;40163:113;;;40294:6;40291:1;40288:13;40285:101;;;40374:1;40365:6;40360:3;40356:16;40349:27;40285:101;40134:258;40085:307;;;:::o;40398:320::-;40442:6;40479:1;40473:4;40469:12;40459:22;;40526:1;40520:4;40516:12;40547:18;40537:81;;40603:4;40595:6;40591:17;40581:27;;40537:81;40665:2;40657:6;40654:14;40634:18;40631:38;40628:84;;;40684:18;;:::i;:::-;40628:84;40449:269;40398:320;;;:::o;40724:281::-;40807:27;40829:4;40807:27;:::i;:::-;40799:6;40795:40;40937:6;40925:10;40922:22;40901:18;40889:10;40886:34;40883:62;40880:88;;;40948:18;;:::i;:::-;40880:88;40988:10;40984:2;40977:22;40767:238;40724:281;;:::o;41011:233::-;41050:3;41073:24;41091:5;41073:24;:::i;:::-;41064:33;;41119:66;41112:5;41109:77;41106:103;;;41189:18;;:::i;:::-;41106:103;41236:1;41229:5;41225:13;41218:20;;41011:233;;;:::o;41250:180::-;41298:77;41295:1;41288:88;41395:4;41392:1;41385:15;41419:4;41416:1;41409:15;41436:180;41484:77;41481:1;41474:88;41581:4;41578:1;41571:15;41605:4;41602:1;41595:15;41622:180;41670:77;41667:1;41660:88;41767:4;41764:1;41757:15;41791:4;41788:1;41781:15;41808:180;41856:77;41853:1;41846:88;41953:4;41950:1;41943:15;41977:4;41974:1;41967:15;41994:183;42029:3;42067:1;42049:16;42046:23;42043:128;;;42105:1;42102;42099;42084:23;42127:34;42158:1;42152:8;42127:34;:::i;:::-;42120:41;;42043:128;41994:183;:::o;42183:117::-;42292:1;42289;42282:12;42306:117;42415:1;42412;42405:12;42429:117;42538:1;42535;42528:12;42552:117;42661:1;42658;42651:12;42675:117;42784:1;42781;42774:12;42798:117;42907:1;42904;42897:12;42921:102;42962:6;43013:2;43009:7;43004:2;42997:5;42993:14;42989:28;42979:38;;42921:102;;;:::o;43029:106::-;43073:8;43122:5;43117:3;43113:15;43092:36;;43029:106;;;:::o;43141:239::-;43281:34;43277:1;43269:6;43265:14;43258:58;43350:22;43345:2;43337:6;43333:15;43326:47;43141:239;:::o;43386:227::-;43526:34;43522:1;43514:6;43510:14;43503:58;43595:10;43590:2;43582:6;43578:15;43571:35;43386:227;:::o;43619:230::-;43759:34;43755:1;43747:6;43743:14;43736:58;43828:13;43823:2;43815:6;43811:15;43804:38;43619:230;:::o;43855:225::-;43995:34;43991:1;43983:6;43979:14;43972:58;44064:8;44059:2;44051:6;44047:15;44040:33;43855:225;:::o;44086:223::-;44226:34;44222:1;44214:6;44210:14;44203:58;44295:6;44290:2;44282:6;44278:15;44271:31;44086:223;:::o;44315:228::-;44455:34;44451:1;44443:6;44439:14;44432:58;44524:11;44519:2;44511:6;44507:15;44500:36;44315:228;:::o;44549:224::-;44689:34;44685:1;44677:6;44673:14;44666:58;44758:7;44753:2;44745:6;44741:15;44734:32;44549:224;:::o;44779:237::-;44919:34;44915:1;44907:6;44903:14;44896:58;44988:20;44983:2;44975:6;44971:15;44964:45;44779:237;:::o;45022:222::-;45162:34;45158:1;45150:6;45146:14;45139:58;45231:5;45226:2;45218:6;45214:15;45207:30;45022:222;:::o;45250:229::-;45390:34;45386:1;45378:6;45374:14;45367:58;45459:12;45454:2;45446:6;45442:15;45435:37;45250:229;:::o;45485:182::-;45625:34;45621:1;45613:6;45609:14;45602:58;45485:182;:::o;45673:228::-;45813:34;45809:1;45801:6;45797:14;45790:58;45882:11;45877:2;45869:6;45865:15;45858:36;45673:228;:::o;45907:::-;46047:34;46043:1;46035:6;46031:14;46024:58;46116:11;46111:2;46103:6;46099:15;46092:36;45907:228;:::o;46141:227::-;46281:34;46277:1;46269:6;46265:14;46258:58;46350:10;46345:2;46337:6;46333:15;46326:35;46141:227;:::o;46374:220::-;46514:34;46510:1;46502:6;46498:14;46491:58;46583:3;46578:2;46570:6;46566:15;46559:28;46374:220;:::o;46600:711::-;46639:3;46677:4;46659:16;46656:26;46653:39;;;46685:5;;46653:39;46714:20;;:::i;:::-;46789:1;46771:16;46767:24;46764:1;46758:4;46743:49;46822:4;46816:11;46921:16;46914:4;46906:6;46902:17;46899:39;46866:18;46858:6;46855:30;46839:113;46836:146;;;46967:5;;;;46836:146;47013:6;47007:4;47003:17;47049:3;47043:10;47076:18;47068:6;47065:30;47062:43;;;47098:5;;;;;;47062:43;47146:6;47139:4;47134:3;47130:14;47126:27;47205:1;47187:16;47183:24;47177:4;47173:35;47168:3;47165:44;47162:57;;;47212:5;;;;;;;47162:57;47229;47277:6;47271:4;47267:17;47259:6;47255:30;47249:4;47229:57;:::i;:::-;47302:3;47295:10;;46643:668;;;;;46600:711;;:::o;47317:122::-;47390:24;47408:5;47390:24;:::i;:::-;47383:5;47380:35;47370:63;;47429:1;47426;47419:12;47370:63;47317:122;:::o;47445:116::-;47515:21;47530:5;47515:21;:::i;:::-;47508:5;47505:32;47495:60;;47551:1;47548;47541:12;47495:60;47445:116;:::o;47567:120::-;47639:23;47656:5;47639:23;:::i;:::-;47632:5;47629:34;47619:62;;47677:1;47674;47667:12;47619:62;47567:120;:::o;47693:122::-;47766:24;47784:5;47766:24;:::i;:::-;47759:5;47756:35;47746:63;;47805:1;47802;47795:12;47746:63;47693:122;:::o

Swarm Source

ipfs://19285075c50bc8f372f74cd44e1c4978ba4d92555c3b66d5b65947b9a56f781b
Loading