ETH Price: $3,095.10 (+0.74%)
Gas: 4 Gwei

Token

Hymns (For Adventurers) (LootHymns)
 

Overview

Max Total Supply

0 LootHymns

Holders

441

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x97b0fbbc81044442fdcd88b2be36b3df190fe411
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
LootHymns

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-04
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.4.22 <0.9.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);
}

//
/**
 * @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;
}

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

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

//
/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
            }
        }
    }
}

//
/**
 * @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;
    }
}

//
/**
 * @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;
    }
}

//
/**
 * @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
    {
        require(
            _msgSender() != operator,
            "ERC1155: setting approval status for self"
        );

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

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

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

        _doSafeTransferAcceptanceCheck(
            operator,
            address(0),
            account,
            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 `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

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

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

        emit TransferSingle(operator, account, 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 account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(
            ids.length == amounts.length,
            "ERC1155: ids and amounts length mismatch"
        );

        address operator = _msgSender();

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

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

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

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @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;
    }
}

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

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

    bool private _paused;

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

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

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

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

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

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

//
/**
 * @dev ERC1155 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Pausable is ERC1155, Pausable {
    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    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);

        require(!paused(), "ERC1155Pausable: token transfer while paused");
    }
}

//
/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

//
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

//
contract OwnableDelegateProxy {

}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

interface Loot {
    function balanceOf(address owner) external view returns (uint256 balance);
}

contract LootHymns is Context, ERC1155Pausable, Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    using Strings for string;

    address proxyRegistryAddress;
    bool public mintingAllowed = false;
    bool public onlyLootHolders = true;
    string public name;
    string public symbol;
    string public baseURI;
    uint256 constant TOTAL_TYPES = 52;
    uint256 constant BASIS_POINTS = 2530;
    uint256 public maxMintsAllowed = 8000;
    uint256 public maxTokensPerMint = 10;
    uint256 public mintingFee = 20000000000000000;
    uint256 public totalMintsSupply = 0;
    address public lootContractAddress =
        0xFF9C1b15B16263C61d017ee9F65C50e4AE0113D7;
    uint256 internal nonce = 0;

    mapping(uint256 => uint256) public tokenSupply;

    Loot internal lootContract = Loot(lootContractAddress);

    constructor(
        string memory _uri,
        string memory _name,
        string memory _symbol,
        address _proxyRegistryAddress
    ) ERC1155(_uri) {
        proxyRegistryAddress = _proxyRegistryAddress;
        name = _name;
        symbol = _symbol;
        baseURI = _uri;
    }

    event Minted(address indexed to, uint256 id);
    event BatchMinted(address indexed to, uint256[] ids);

    function mint() public payable nonReentrant {
        require(mintingAllowed, "Minting Not Active");
        require(
            totalMintsSupply < maxMintsAllowed,
            "All Tokens Have Been Minted"
        );
        if (onlyLootHolders) {
            require(
                lootContract.balanceOf(_msgSender()) > 0,
                "Minting Currently Available For LOOT Owners Only"
            );
        }
        require(mintingFee <= msg.value, "Not Enough Ether Required To Mint");

        (uint256[] memory token, uint256[] memory amount) = pluckTokens(1);
        super._mint(_msgSender(), token[0], amount[0], _msgData());
        emit Minted(_msgSender(), token[0]);
        tokenSupply[token[0]] = tokenSupply[token[0]] + amount[0];
        totalMintsSupply = totalMintsSupply + amount[0];
    }

    function mintBatch(uint256 _amount) public payable nonReentrant {
        require(mintingAllowed, "Minting Not Active");
        require(
            totalMintsSupply < maxMintsAllowed,
            "All Tokens Have Been Minted"
        );
        if (onlyLootHolders) {
            require(
                lootContract.balanceOf(_msgSender()) > 0,
                "Minting Currently Available For LOOT Owners Only"
            );
        }
        require(_amount <= maxTokensPerMint, "Exceeded Max Tokens Per Mint");
        require(
            (totalMintsSupply + _amount) <= maxMintsAllowed,
            "This Amount will exceed the total Mints allowed"
        );

        require(
            (mintingFee * _amount) <= msg.value,
            "Not Enough Ether Required To Mint"
        );

        (uint256[] memory tokens, uint256[] memory amounts) = pluckTokens(
            _amount
        );
        super._mintBatch(_msgSender(), tokens, amounts, _msgData());
        emit BatchMinted(_msgSender(), tokens);
        for (uint256 i = 0; i < tokens.length; i++) {
            uint256 _tokenId = tokens[i];
            uint256 _quantity = amounts[i];
            tokenSupply[_tokenId] = tokenSupply[_tokenId] + _quantity;
            totalMintsSupply = totalMintsSupply + _quantity;
        }
    }

    function uri(uint256 _tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        return string(abi.encodePacked(baseURI, "/", uint2str(_tokenId)));
    }

    function reserve(uint256[] memory tokenIds, uint256[] memory amounts)
        public
        nonReentrant
        onlyOwner
    {
        super._mintBatch(_msgSender(), tokenIds, amounts, _msgData());
        emit BatchMinted(_msgSender(), tokenIds);
        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 _tokenId = tokenIds[i];
            uint256 _quantity = amounts[i];
            tokenSupply[_tokenId] = tokenSupply[_tokenId] + _quantity;
            totalMintsSupply = totalMintsSupply + _quantity;
        }
    }

    function pluckTokens(uint256 _amount)
        internal
        virtual
        returns (uint256[] memory, uint256[] memory)
    {
        uint256[] memory tokensIds = new uint256[](_amount);
        uint256[] memory tokenAmounts = new uint256[](_amount);
        for (uint256 i = 0; i < _amount; i++) {
            uint256 target = rand();
            uint256 tokenId = weighted(target);
            require(
                tokenId >= 0 && tokenId <= TOTAL_TYPES - 1,
                "Token ID Out Of Range"
            );
            tokensIds[i] = tokenId;
            tokenAmounts[i] = 1;
        }
        return (tokensIds, tokenAmounts);
    }

    function weighted(uint256 target) internal virtual returns (uint256) {
        for (uint256 i = 0; i < TOTAL_TYPES - 1; i++) {
            if (target < weights[i]) return i;
            target -= weights[i];
        }
        return 0;
    }

    function rand() internal virtual returns (uint256) {
        nonce++;
        uint256 seed = uint256(
            keccak256(
                abi.encodePacked(
                    block.timestamp +
                        block.difficulty +
                        ((
                            uint256(keccak256(abi.encodePacked(block.coinbase)))
                        ) / (block.timestamp)) +
                        block.gaslimit +
                        ((uint256(keccak256(abi.encodePacked(msg.sender)))) /
                            (block.timestamp)) +
                        block.number,
                    nonce
                )
            )
        );
        return (seed - ((seed / BASIS_POINTS) * BASIS_POINTS));
    }

    function _getSupply(uint256 _id) internal virtual returns (uint256) {
        return tokenSupply[_id];
    }

    function setURI(string memory _uri) public onlyOwner {
        _setURI(_uri);
        baseURI = _uri;
    }

    function flipMintState() public onlyOwner {
        mintingAllowed = !mintingAllowed;
    }

    function flipSaleState() public onlyOwner {
        onlyLootHolders = !onlyLootHolders;
    }

    function setMintingFee(uint256 _fee) public onlyOwner {
        mintingFee = _fee;
    }

    function setMaxMintsAllowed(uint256 _mints) public onlyOwner {
        maxMintsAllowed = _mints;
    }

    function setMaxTokensPerMint(uint256 _max) public onlyOwner {
        maxTokensPerMint = _max;
    }

    function pause() public virtual onlyOwner {
        _pause();
    }

    function unpause() public virtual onlyOwner {
        _unpause();
    }

    function withdraw() public payable onlyOwner {
        require(
            payable(_msgSender()).send(address(this).balance),
            "Unable to Withdraw ETH"
        );
    }

    function isApprovedForAll(address _owner, address _operator)
        public
        view
        override
        returns (bool isOperator)
    {
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(_owner)) == _operator) {
            return true;
        }
        return ERC1155.isApprovedForAll(_owner, _operator);
    }

    function uint2str(uint256 _i)
        internal
        pure
        returns (string memory _uintAsString)
    {
        if (_i == 0) {
            return "0";
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len;
        while (_i != 0) {
            k = k - 1;
            uint8 temp = (48 + uint8(_i - (_i / 10) * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    uint256[] internal weights = [
        100,
        100,
        100,
        95,
        95,
        90,
        90,
        90,
        86,
        80,
        80,
        80,
        80,
        79,
        78,
        75,
        75,
        75,
        62,
        61,
        60,
        55,
        55,
        55,
        54,
        53,
        50,
        50,
        35,
        35,
        35,
        30,
        30,
        30,
        30,
        25,
        24,
        20,
        15,
        12,
        10,
        10,
        9,
        9,
        9,
        8,
        8,
        8,
        3,
        3,
        3,
        3
    ];
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"BatchMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lootContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsAllowed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokensPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyLootHolders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"reserve","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":"uint256","name":"_mints","type":"uint256"}],"name":"setMaxMintsAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxTokensPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setMintingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMintsSupply","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600560146101000a81548160ff0219169083151502179055506001600560156101000a81548160ff021916908315150217905550611f40600955600a805566470de4df820000600b556000600c5573ff9c1b15b16263c61d017ee9f65c50e4ae0113d7600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e55600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806106800160405280606460ff168152602001606460ff168152602001606460ff168152602001605f60ff168152602001605f60ff168152602001605a60ff168152602001605a60ff168152602001605a60ff168152602001605660ff168152602001605060ff168152602001605060ff168152602001605060ff168152602001605060ff168152602001604f60ff168152602001604e60ff168152602001604b60ff168152602001604b60ff168152602001604b60ff168152602001603e60ff168152602001603d60ff168152602001603c60ff168152602001603760ff168152602001603760ff168152602001603760ff168152602001603660ff168152602001603560ff168152602001603260ff168152602001603260ff168152602001602360ff168152602001602360ff168152602001602360ff168152602001601e60ff168152602001601e60ff168152602001601e60ff168152602001601e60ff168152602001601960ff168152602001601860ff168152602001601460ff168152602001600f60ff168152602001600c60ff168152602001600a60ff168152602001600a60ff168152602001600960ff168152602001600960ff168152602001600960ff168152602001600860ff168152602001600860ff168152602001600860ff168152602001600360ff168152602001600360ff168152602001600360ff168152602001600360ff168152506011906034620003359291906200053f565b503480156200034357600080fd5b506040516200658d3803806200658d8339818101604052810190620003699190620006cf565b836200037b816200045560201b60201c565b506000600360006101000a81548160ff021916908315150217905550620003b7620003ab6200047160201b60201c565b6200047960201b60201c565b600160048190555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600690805190602001906200041892919062000596565b5081600790805190602001906200043192919062000596565b5083600890805190602001906200044a92919062000596565b505050505062000944565b80600290805190602001906200046d92919062000596565b5050565b600033905090565b6000600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562000583579160200282015b8281111562000582578251829060ff1690559160200191906001019062000560565b5b50905062000592919062000627565b5090565b828054620005a4906200084f565b90600052602060002090601f016020900481019282620005c8576000855562000614565b82601f10620005e357805160ff191683800117855562000614565b8280016001018555821562000614579182015b8281111562000613578251825591602001919060010190620005f6565b5b50905062000623919062000627565b5090565b5b808211156200064257600081600090555060010162000628565b5090565b60006200065d6200065784620007af565b62000786565b9050828152602081018484840111156200067657600080fd5b6200068384828562000819565b509392505050565b6000815190506200069c816200092a565b92915050565b600082601f830112620006b457600080fd5b8151620006c684826020860162000646565b91505092915050565b60008060008060808587031215620006e657600080fd5b600085015167ffffffffffffffff8111156200070157600080fd5b6200070f87828801620006a2565b945050602085015167ffffffffffffffff8111156200072d57600080fd5b6200073b87828801620006a2565b935050604085015167ffffffffffffffff8111156200075957600080fd5b6200076787828801620006a2565b92505060606200077a878288016200068b565b91505092959194509250565b600062000792620007a5565b9050620007a0828262000885565b919050565b6000604051905090565b600067ffffffffffffffff821115620007cd57620007cc620008ea565b5b620007d88262000919565b9050602081019050919050565b6000620007f282620007f9565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620008395780820151818401526020810190506200081c565b8381111562000849576000848401525b50505050565b600060028204905060018216806200086857607f821691505b602082108114156200087f576200087e620008bb565b5b50919050565b620008908262000919565b810181811067ffffffffffffffff82111715620008b257620008b1620008ea565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6200093581620007e5565b81146200094157600080fd5b50565b615c3980620009546000396000f3fe6080604052600436106102035760003560e01c80635a64ad951161011857806395d89b41116100a0578063e2adb2521161006f578063e2adb252146106ab578063e985e9c5146106d6578063ee601f2114610713578063f242432a1461073c578063f2fde38b1461076557610203565b806395d89b411461060157806396532d1c1461062c578063a22cb46514610657578063a8af32e91461068057610203565b8063715018a6116100e7578063715018a614610554578063762cda3c1461056b5780637d9677a2146105945780638456cb59146105bf5780638da5cb5b146105d657610203565b80635a64ad95146104aa5780635c975abb146104d55780635ec88893146105005780636c0360eb1461052957610203565b8063238a47091161019b5780633ccfd60b1161016a5780633ccfd60b1461040a5780633f4ba83a146104145780634e1273f41461042b578063598125d11461046857806359c74f291461049357610203565b8063238a4709146103645780632693ebf21461038d5780632eb2c2d6146103ca57806334918dfd146103f357610203565b80630e89341c116101d75780630e89341c146102d65780631249c58b14610313578063174654711461031d57806320e409b41461034857610203565b8062fdd58e1461020857806301ffc9a71461024557806302fe53051461028257806306fdde03146102ab575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a91906141a7565b61078e565b60405161023c9190614e94565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906142bb565b610857565b6040516102799190614b37565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190614336565b610939565b005b3480156102b757600080fd5b506102c06109d8565b6040516102cd9190614b52565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190614377565b610a66565b60405161030a9190614b52565b60405180910390f35b61031b610a9a565b005b34801561032957600080fd5b50610332610fac565b60405161033f9190614e94565b60405180910390f35b610362600480360381019061035d9190614377565b610fb2565b005b34801561037057600080fd5b5061038b60048036038101906103869190614377565b61144b565b005b34801561039957600080fd5b506103b460048036038101906103af9190614377565b6114d1565b6040516103c19190614e94565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec919061401d565b6114e9565b005b3480156103ff57600080fd5b5061040861158a565b005b610412611632565b005b34801561042057600080fd5b5061042961172b565b005b34801561043757600080fd5b50610452600480360381019061044d91906141e3565b6117b1565b60405161045f9190614ade565b60405180910390f35b34801561047457600080fd5b5061047d611962565b60405161048a9190614e94565b60405180910390f35b34801561049f57600080fd5b506104a8611968565b005b3480156104b657600080fd5b506104bf611a10565b6040516104cc9190614e94565b60405180910390f35b3480156104e157600080fd5b506104ea611a16565b6040516104f79190614b37565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190614377565b611a2d565b005b34801561053557600080fd5b5061053e611ab3565b60405161054b9190614b52565b60405180910390f35b34801561056057600080fd5b50610569611b41565b005b34801561057757600080fd5b50610592600480360381019061058d9190614377565b611bc9565b005b3480156105a057600080fd5b506105a9611c4f565b6040516105b69190614e94565b60405180910390f35b3480156105cb57600080fd5b506105d4611c55565b005b3480156105e257600080fd5b506105eb611cdb565b6040516105f89190614a01565b60405180910390f35b34801561060d57600080fd5b50610616611d05565b6040516106239190614b52565b60405180910390f35b34801561063857600080fd5b50610641611d93565b60405161064e9190614b37565b60405180910390f35b34801561066357600080fd5b5061067e6004803603810190610679919061416b565b611da6565b005b34801561068c57600080fd5b50610695611f27565b6040516106a29190614a01565b60405180910390f35b3480156106b757600080fd5b506106c0611f4d565b6040516106cd9190614b37565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f89190613fe1565b611f60565b60405161070a9190614b37565b60405180910390f35b34801561071f57600080fd5b5061073a6004803603810190610735919061424f565b612062565b005b34801561074857600080fd5b50610763600480360381019061075e91906140dc565b6122e0565b005b34801561077157600080fd5b5061078c60048036038101906107879190613fb8565b612381565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690614bf4565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610932575061093182612479565b5b9050919050565b6109416124e3565b73ffffffffffffffffffffffffffffffffffffffff1661095f611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146109b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ac90614d94565b60405180910390fd5b6109be816124eb565b80600890805190602001906109d4929190613c86565b5050565b600680546109e59061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a119061527b565b8015610a5e5780601f10610a3357610100808354040283529160200191610a5e565b820191906000526020600020905b815481529060010190602001808311610a4157829003601f168201915b505050505081565b60606008610a7383612505565b604051602001610a849291906149a6565b6040516020818303038152906040529050919050565b60026004541415610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790614e74565b60405180910390fd5b6002600481905550600560149054906101000a900460ff16610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e90614dd4565b60405180910390fd5b600954600c5410610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490614d54565b60405180910390fd5b600560159054906101000a900460ff1615610c87576000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610bda6124e3565b6040518263ffffffff1660e01b8152600401610bf69190614a01565b60206040518083038186803b158015610c0e57600080fd5b505afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4691906143a0565b11610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90614c54565b60405180910390fd5b5b34600b541115610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390614db4565b60405180910390fd5b600080610cd960016126da565b91509150610dbc610ce86124e3565b83600081518110610d22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183600081518110610d64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610d746128f4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612901565b610dc46124e3565b73ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe83600081518110610e35577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604051610e4a9190614e94565b60405180910390a280600081518110610e8c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600f600084600081518110610ed2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002054610ef39190615048565b600f600084600081518110610f31577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000208190555080600081518110610f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600c54610f9a9190615048565b600c8190555050506001600481905550565b600a5481565b60026004541415610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90614e74565b60405180910390fd5b6002600481905550600560149054906101000a900460ff1661104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690614dd4565b60405180910390fd5b600954600c5410611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c90614d54565b60405180910390fd5b600560159054906101000a900460ff161561119f576000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316110f26124e3565b6040518263ffffffff1660e01b815260040161110e9190614a01565b60206040518083038186803b15801561112657600080fd5b505afa15801561113a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115e91906143a0565b1161119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614c54565b60405180910390fd5b5b600a548111156111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db90614cf4565b60405180910390fd5b60095481600c546111f59190615048565b1115611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90614cb4565b60405180910390fd5b3481600b546112459190615106565b1115611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90614db4565b60405180910390fd5b600080611292836126da565b915091506112f36112a16124e3565b83836112ab6128f4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a97565b6112fb6124e3565b73ffffffffffffffffffffffffffffffffffffffff167f0fccc44f8f4572066001d167eac735aa3f72308ef306fd3af1b0bb0b6a7ba90f836040516113409190614ade565b60405180910390a260005b825181101561143d57600083828151811061138f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008383815181106113d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080600f6000848152602001908152602001600020546113fd9190615048565b600f60008481526020019081526020016000208190555080600c546114229190615048565b600c8190555050508080611435906152de565b91505061134b565b505050600160048190555050565b6114536124e3565b73ffffffffffffffffffffffffffffffffffffffff16611471611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be90614d94565b60405180910390fd5b80600b8190555050565b600f6020528060005260406000206000915090505481565b6114f16124e3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806115375750611536856115316124e3565b611f60565b5b611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d90614d34565b60405180910390fd5b6115838585858585612d01565b5050505050565b6115926124e3565b73ffffffffffffffffffffffffffffffffffffffff166115b0611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90614d94565b60405180910390fd5b600560159054906101000a900460ff1615600560156101000a81548160ff021916908315150217905550565b61163a6124e3565b73ffffffffffffffffffffffffffffffffffffffff16611658611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a590614d94565b60405180910390fd5b6116b66124e3565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090614c34565b60405180910390fd5b565b6117336124e3565b73ffffffffffffffffffffffffffffffffffffffff16611751611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90614d94565b60405180910390fd5b6117af613061565b565b606081518351146117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90614e14565b60405180910390fd5b6000835167ffffffffffffffff81111561183a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156118685781602001602082028036833780820191505090505b50905060005b8451811015611957576119018582815181106118b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106118f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161078e565b82828151811061193a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080611950906152de565b905061186e565b508091505092915050565b600c5481565b6119706124e3565b73ffffffffffffffffffffffffffffffffffffffff1661198e611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90614d94565b60405180910390fd5b600560149054906101000a900460ff1615600560146101000a81548160ff021916908315150217905550565b600b5481565b6000600360009054906101000a900460ff16905090565b611a356124e3565b73ffffffffffffffffffffffffffffffffffffffff16611a53611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090614d94565b60405180910390fd5b8060098190555050565b60088054611ac09061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054611aec9061527b565b8015611b395780601f10611b0e57610100808354040283529160200191611b39565b820191906000526020600020905b815481529060010190602001808311611b1c57829003601f168201915b505050505081565b611b496124e3565b73ffffffffffffffffffffffffffffffffffffffff16611b67611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490614d94565b60405180910390fd5b611bc76000613103565b565b611bd16124e3565b73ffffffffffffffffffffffffffffffffffffffff16611bef611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90614d94565b60405180910390fd5b80600a8190555050565b60095481565b611c5d6124e3565b73ffffffffffffffffffffffffffffffffffffffff16611c7b611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc890614d94565b60405180910390fd5b611cd96131c9565b565b6000600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60078054611d129061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3e9061527b565b8015611d8b5780601f10611d6057610100808354040283529160200191611d8b565b820191906000526020600020905b815481529060010190602001808311611d6e57829003601f168201915b505050505081565b600560149054906101000a900460ff1681565b8173ffffffffffffffffffffffffffffffffffffffff16611dc56124e3565b73ffffffffffffffffffffffffffffffffffffffff161415611e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1390614df4565b60405180910390fd5b8060016000611e296124e3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ed66124e3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f1b9190614b37565b60405180910390a35050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560159054906101000a900460ff1681565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611fd89190614a01565b60206040518083038186803b158015611ff057600080fd5b505afa158015612004573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612028919061430d565b73ffffffffffffffffffffffffffffffffffffffff16141561204e57600191505061205c565b612058848461326c565b9150505b92915050565b600260045414156120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614e74565b60405180910390fd5b60026004819055506120b86124e3565b73ffffffffffffffffffffffffffffffffffffffff166120d6611cdb565b73ffffffffffffffffffffffffffffffffffffffff161461212c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212390614d94565b60405180910390fd5b6121896121376124e3565b83836121416128f4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a97565b6121916124e3565b73ffffffffffffffffffffffffffffffffffffffff167f0fccc44f8f4572066001d167eac735aa3f72308ef306fd3af1b0bb0b6a7ba90f836040516121d69190614ade565b60405180910390a260005b82518110156122d3576000838281518110612225577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600083838151811061226a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080600f6000848152602001908152602001600020546122939190615048565b600f60008481526020019081526020016000208190555080600c546122b89190615048565b600c81905550505080806122cb906152de565b9150506121e1565b5060016004819055505050565b6122e86124e3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061232e575061232d856123286124e3565b611f60565b5b61236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236490614c94565b60405180910390fd5b61237a8585858585613300565b5050505050565b6123896124e3565b73ffffffffffffffffffffffffffffffffffffffff166123a7611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490614d94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490614c14565b60405180910390fd5b61247681613103565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8060029080519060200190612501929190613c86565b5050565b6060600082141561254d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126d5565b600082905060005b6000821461257f578080612568906152de565b915050600a8261257891906150d5565b9150612555565b60008167ffffffffffffffff8111156125c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125f35781602001600182028036833780820191505090505b50905060008290505b600086146126cd576001816126119190615160565b90506000600a808861262391906150d5565b61262d9190615106565b876126389190615160565b6030612644919061509e565b905060008160f81b905080848481518110612688577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886126c491906150d5565b975050506125fc565b819450505050505b919050565b60608060008367ffffffffffffffff81111561271f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561274d5781602001602082028036833780820191505090505b50905060008467ffffffffffffffff811115612792577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156127c05781602001602082028036833780820191505090505b50905060005b858110156128e65760006127d8613582565b905060006127e582613697565b9050600081101580156128055750600160346128019190615160565b8111155b612844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283b90614bd4565b60405180910390fd5b8085848151811061287e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060018484815181106128c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050505080806128de906152de565b9150506127c6565b508181935093505050915091565b3660008036915091509091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296890614e54565b60405180910390fd5b600061297b6124e3565b905061299c8160008761298d88613779565b61299688613779565b8761383f565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129fb9190615048565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612a79929190614eaf565b60405180910390a4612a908160008787878761389d565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afe90614e54565b60405180910390fd5b8151835114612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290614e34565b60405180910390fd5b6000612b556124e3565b9050612b668160008787878761383f565b60005b8451811015612c6b57838181518110612bab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600080878481518110612bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c519190615048565b925050819055508080612c63906152de565b915050612b69565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612ce3929190614b00565b60405180910390a4612cfa81600087878787613a84565b5050505050565b8151835114612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c90614e34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac90614d14565b60405180910390fd5b6000612dbf6124e3565b9050612dcf81878787878761383f565b60005b8451811015612fcc576000858281518110612e16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110612e5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef390614d74565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fb19190615048565b9250508190555050505080612fc5906152de565b9050612dd2565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613043929190614b00565b60405180910390a4613059818787878787613a84565b505050505050565b613069611a16565b6130a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309f90614bb4565b60405180910390fd5b6000600360006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130ec6124e3565b6040516130f99190614a01565b60405180910390a1565b6000600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131d1611a16565b15613211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320890614cd4565b60405180910390fd5b6001600360006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586132556124e3565b6040516132629190614a01565b60405180910390a1565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336790614d14565b60405180910390fd5b600061337a6124e3565b905061339a81878761338b88613779565b61339488613779565b8761383f565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342890614d74565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134e69190615048565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051613563929190614eaf565b60405180910390a461357982888888888861389d565b50505050505050565b6000600e6000815480929190613597906152de565b919050555060004342336040516020016135b19190614970565b6040516020818303038152906040528051906020012060001c6135d491906150d5565b4542416040516020016135e7919061498b565b6040516020818303038152906040528051906020012060001c61360a91906150d5565b44426136169190615048565b6136209190615048565b61362a9190615048565b6136349190615048565b61363e9190615048565b600e546040516020016136529291906149d5565b6040516020818303038152906040528051906020012060001c90506109e2808261367c91906150d5565b6136869190615106565b816136919190615160565b91505090565b600080600090505b600160346136ad9190615160565b81101561376e57601181815481106136ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001548310156137095780915050613774565b60118181548110613743577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154836137599190615160565b92508080613766906152de565b91505061369f565b50600090505b919050565b60606000600167ffffffffffffffff8111156137be577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156137ec5781602001602082028036833780820191505090505b509050828160008151811061382a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b61384d868686868686613c6b565b613855611a16565b15613895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388c90614c74565b60405180910390fd5b505050505050565b6138bc8473ffffffffffffffffffffffffffffffffffffffff16613c73565b15613a7c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613902959493929190614a84565b602060405180830381600087803b15801561391c57600080fd5b505af192505050801561394d57506040513d601f19601f8201168201806040525081019061394a91906142e4565b60015b6139f357613959615423565b806308c379a014156139b6575061396e615afa565b8061397957506139b8565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ad9190614b52565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ea90614b74565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7190614b94565b60405180910390fd5b505b505050505050565b613aa38473ffffffffffffffffffffffffffffffffffffffff16613c73565b15613c63578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613ae9959493929190614a1c565b602060405180830381600087803b158015613b0357600080fd5b505af1925050508015613b3457506040513d601f19601f82011682018060405250810190613b3191906142e4565b60015b613bda57613b40615423565b806308c379a01415613b9d5750613b55615afa565b80613b605750613b9f565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b949190614b52565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd190614b74565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5890614b94565b60405180910390fd5b505b505050505050565b505050505050565b600080823b905060008111915050919050565b828054613c929061527b565b90600052602060002090601f016020900481019282613cb45760008555613cfb565b82601f10613ccd57805160ff1916838001178555613cfb565b82800160010185558215613cfb579182015b82811115613cfa578251825591602001919060010190613cdf565b5b509050613d089190613d0c565b5090565b5b80821115613d25576000816000905550600101613d0d565b5090565b6000613d3c613d3784614efd565b614ed8565b90508083825260208201905082856020860282011115613d5b57600080fd5b60005b85811015613d8b5781613d718882613e7d565b845260208401935060208301925050600181019050613d5e565b5050509392505050565b6000613da8613da384614f29565b614ed8565b90508083825260208201905082856020860282011115613dc757600080fd5b60005b85811015613df75781613ddd8882613f8e565b845260208401935060208301925050600181019050613dca565b5050509392505050565b6000613e14613e0f84614f55565b614ed8565b905082815260208101848484011115613e2c57600080fd5b613e37848285615239565b509392505050565b6000613e52613e4d84614f86565b614ed8565b905082815260208101848484011115613e6a57600080fd5b613e75848285615239565b509392505050565b600081359050613e8c81615b90565b92915050565b600082601f830112613ea357600080fd5b8135613eb3848260208601613d29565b91505092915050565b600082601f830112613ecd57600080fd5b8135613edd848260208601613d95565b91505092915050565b600081359050613ef581615ba7565b92915050565b600081359050613f0a81615bbe565b92915050565b600081519050613f1f81615bbe565b92915050565b600082601f830112613f3657600080fd5b8135613f46848260208601613e01565b91505092915050565b600081519050613f5e81615bd5565b92915050565b600082601f830112613f7557600080fd5b8135613f85848260208601613e3f565b91505092915050565b600081359050613f9d81615bec565b92915050565b600081519050613fb281615bec565b92915050565b600060208284031215613fca57600080fd5b6000613fd884828501613e7d565b91505092915050565b60008060408385031215613ff457600080fd5b600061400285828601613e7d565b925050602061401385828601613e7d565b9150509250929050565b600080600080600060a0868803121561403557600080fd5b600061404388828901613e7d565b955050602061405488828901613e7d565b945050604086013567ffffffffffffffff81111561407157600080fd5b61407d88828901613ebc565b935050606086013567ffffffffffffffff81111561409a57600080fd5b6140a688828901613ebc565b925050608086013567ffffffffffffffff8111156140c357600080fd5b6140cf88828901613f25565b9150509295509295909350565b600080600080600060a086880312156140f457600080fd5b600061410288828901613e7d565b955050602061411388828901613e7d565b945050604061412488828901613f8e565b935050606061413588828901613f8e565b925050608086013567ffffffffffffffff81111561415257600080fd5b61415e88828901613f25565b9150509295509295909350565b6000806040838503121561417e57600080fd5b600061418c85828601613e7d565b925050602061419d85828601613ee6565b9150509250929050565b600080604083850312156141ba57600080fd5b60006141c885828601613e7d565b92505060206141d985828601613f8e565b9150509250929050565b600080604083850312156141f657600080fd5b600083013567ffffffffffffffff81111561421057600080fd5b61421c85828601613e92565b925050602083013567ffffffffffffffff81111561423957600080fd5b61424585828601613ebc565b9150509250929050565b6000806040838503121561426257600080fd5b600083013567ffffffffffffffff81111561427c57600080fd5b61428885828601613ebc565b925050602083013567ffffffffffffffff8111156142a557600080fd5b6142b185828601613ebc565b9150509250929050565b6000602082840312156142cd57600080fd5b60006142db84828501613efb565b91505092915050565b6000602082840312156142f657600080fd5b600061430484828501613f10565b91505092915050565b60006020828403121561431f57600080fd5b600061432d84828501613f4f565b91505092915050565b60006020828403121561434857600080fd5b600082013567ffffffffffffffff81111561436257600080fd5b61436e84828501613f64565b91505092915050565b60006020828403121561438957600080fd5b600061439784828501613f8e565b91505092915050565b6000602082840312156143b257600080fd5b60006143c084828501613fa3565b91505092915050565b60006143d5838361493b565b60208301905092915050565b6143f26143ed826151a6565b615339565b82525050565b61440181615194565b82525050565b61441861441382615194565b615327565b82525050565b600061442982614fdc565b614433818561500a565b935061443e83614fb7565b8060005b8381101561446f57815161445688826143c9565b975061446183614ffd565b925050600181019050614442565b5085935050505092915050565b614485816151b8565b82525050565b600061449682614fe7565b6144a0818561501b565b93506144b0818560208601615248565b6144b981615445565b840191505092915050565b60006144cf82614ff2565b6144d9818561502c565b93506144e9818560208601615248565b6144f281615445565b840191505092915050565b600061450882614ff2565b614512818561503d565b9350614522818560208601615248565b80840191505092915050565b6000815461453b8161527b565b614545818661503d565b945060018216600081146145605760018114614571576145a4565b60ff198316865281860193506145a4565b61457a85614fc7565b60005b8381101561459c5781548189015260018201915060208101905061457d565b838801955050505b50505092915050565b60006145ba60348361502c565b91506145c582615470565b604082019050919050565b60006145dd60288361502c565b91506145e8826154bf565b604082019050919050565b600061460060148361502c565b915061460b8261550e565b602082019050919050565b600061462360158361502c565b915061462e82615537565b602082019050919050565b6000614646602b8361502c565b915061465182615560565b604082019050919050565b600061466960268361502c565b9150614674826155af565b604082019050919050565b600061468c60168361502c565b9150614697826155fe565b602082019050919050565b60006146af60308361502c565b91506146ba82615627565b604082019050919050565b60006146d2602c8361502c565b91506146dd82615676565b604082019050919050565b60006146f560298361502c565b9150614700826156c5565b604082019050919050565b6000614718602f8361502c565b915061472382615714565b604082019050919050565b600061473b60108361502c565b915061474682615763565b602082019050919050565b600061475e601c8361502c565b91506147698261578c565b602082019050919050565b600061478160258361502c565b915061478c826157b5565b604082019050919050565b60006147a460328361502c565b91506147af82615804565b604082019050919050565b60006147c7601b8361502c565b91506147d282615853565b602082019050919050565b60006147ea602a8361502c565b91506147f58261587c565b604082019050919050565b600061480d60208361502c565b9150614818826158cb565b602082019050919050565b600061483060218361502c565b915061483b826158f4565b604082019050919050565b600061485360128361502c565b915061485e82615943565b602082019050919050565b600061487660298361502c565b91506148818261596c565b604082019050919050565b600061489960298361502c565b91506148a4826159bb565b604082019050919050565b60006148bc60288361502c565b91506148c782615a0a565b604082019050919050565b60006148df60218361502c565b91506148ea82615a59565b604082019050919050565b6000614902601f8361502c565b915061490d82615aa8565b602082019050919050565b600061492560018361503d565b915061493082615ad1565b600182019050919050565b61494481615222565b82525050565b61495381615222565b82525050565b61496a61496582615222565b61535d565b82525050565b600061497c8284614407565b60148201915081905092915050565b600061499782846143e1565b60148201915081905092915050565b60006149b2828561452e565b91506149bd82614918565b91506149c982846144fd565b91508190509392505050565b60006149e18285614959565b6020820191506149f18284614959565b6020820191508190509392505050565b6000602082019050614a1660008301846143f8565b92915050565b600060a082019050614a3160008301886143f8565b614a3e60208301876143f8565b8181036040830152614a50818661441e565b90508181036060830152614a64818561441e565b90508181036080830152614a78818461448b565b90509695505050505050565b600060a082019050614a9960008301886143f8565b614aa660208301876143f8565b614ab3604083018661494a565b614ac0606083018561494a565b8181036080830152614ad2818461448b565b90509695505050505050565b60006020820190508181036000830152614af8818461441e565b905092915050565b60006040820190508181036000830152614b1a818561441e565b90508181036020830152614b2e818461441e565b90509392505050565b6000602082019050614b4c600083018461447c565b92915050565b60006020820190508181036000830152614b6c81846144c4565b905092915050565b60006020820190508181036000830152614b8d816145ad565b9050919050565b60006020820190508181036000830152614bad816145d0565b9050919050565b60006020820190508181036000830152614bcd816145f3565b9050919050565b60006020820190508181036000830152614bed81614616565b9050919050565b60006020820190508181036000830152614c0d81614639565b9050919050565b60006020820190508181036000830152614c2d8161465c565b9050919050565b60006020820190508181036000830152614c4d8161467f565b9050919050565b60006020820190508181036000830152614c6d816146a2565b9050919050565b60006020820190508181036000830152614c8d816146c5565b9050919050565b60006020820190508181036000830152614cad816146e8565b9050919050565b60006020820190508181036000830152614ccd8161470b565b9050919050565b60006020820190508181036000830152614ced8161472e565b9050919050565b60006020820190508181036000830152614d0d81614751565b9050919050565b60006020820190508181036000830152614d2d81614774565b9050919050565b60006020820190508181036000830152614d4d81614797565b9050919050565b60006020820190508181036000830152614d6d816147ba565b9050919050565b60006020820190508181036000830152614d8d816147dd565b9050919050565b60006020820190508181036000830152614dad81614800565b9050919050565b60006020820190508181036000830152614dcd81614823565b9050919050565b60006020820190508181036000830152614ded81614846565b9050919050565b60006020820190508181036000830152614e0d81614869565b9050919050565b60006020820190508181036000830152614e2d8161488c565b9050919050565b60006020820190508181036000830152614e4d816148af565b9050919050565b60006020820190508181036000830152614e6d816148d2565b9050919050565b60006020820190508181036000830152614e8d816148f5565b9050919050565b6000602082019050614ea9600083018461494a565b92915050565b6000604082019050614ec4600083018561494a565b614ed1602083018461494a565b9392505050565b6000614ee2614ef3565b9050614eee82826152ad565b919050565b6000604051905090565b600067ffffffffffffffff821115614f1857614f176153f4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f4457614f436153f4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f7057614f6f6153f4565b5b614f7982615445565b9050602081019050919050565b600067ffffffffffffffff821115614fa157614fa06153f4565b5b614faa82615445565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061505382615222565b915061505e83615222565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561509357615092615367565b5b828201905092915050565b60006150a98261522c565b91506150b48361522c565b92508260ff038211156150ca576150c9615367565b5b828201905092915050565b60006150e082615222565b91506150eb83615222565b9250826150fb576150fa615396565b5b828204905092915050565b600061511182615222565b915061511c83615222565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561515557615154615367565b5b828202905092915050565b600061516b82615222565b915061517683615222565b92508282101561518957615188615367565b5b828203905092915050565b600061519f82615202565b9050919050565b60006151b182615202565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006151fb82615194565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561526657808201518184015260208101905061524b565b83811115615275576000848401525b50505050565b6000600282049050600182168061529357607f821691505b602082108114156152a7576152a66153c5565b5b50919050565b6152b682615445565b810181811067ffffffffffffffff821117156152d5576152d46153f4565b5b80604052505050565b60006152e982615222565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561531c5761531b615367565b5b600182019050919050565b60006153328261534b565b9050919050565b60006153448261534b565b9050919050565b600061535682615456565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156154425760046000803e61543f600051615463565b90505b90565b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f546f6b656e204944204f7574204f662052616e67650000000000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f556e61626c6520746f2057697468647261772045544800000000000000000000600082015250565b7f4d696e74696e672043757272656e746c7920417661696c61626c6520466f722060008201527f4c4f4f54204f776e657273204f6e6c7900000000000000000000000000000000602082015250565b7f455243313135355061757361626c653a20746f6b656e207472616e736665722060008201527f7768696c65207061757365640000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5468697320416d6f756e742077696c6c206578636565642074686520746f746160008201527f6c204d696e747320616c6c6f7765640000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4578636565646564204d617820546f6b656e7320506572204d696e7400000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f416c6c20546f6b656e732048617665204265656e204d696e7465640000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420456e6f75676820457468657220526571756972656420546f204d696e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67204e6f74204163746976650000000000000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600060443d1015615b0a57615b8d565b615b12614ef3565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b3a575050615b8d565b808201805167ffffffffffffffff811115615b585750505050615b8d565b80602083010160043d038501811115615b75575050505050615b8d565b615b84826020018501866152ad565b82955050505050505b90565b615b9981615194565b8114615ba457600080fd5b50565b615bb0816151b8565b8114615bbb57600080fd5b50565b615bc7816151c4565b8114615bd257600080fd5b50565b615bde816151f0565b8114615be957600080fd5b50565b615bf581615222565b8114615c0057600080fd5b5056fea26469706673582212204d9a21fb14d2dbd69305114db827f46324d1d29e93651bc5b6f47c73234324d964736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f68796d6e732e6d7970696e6174612e636c6f75642f697066732f516d5664766239766d6b64554670574c34425337374276533832514d6a564867694238546e61716e506852696f3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001748796d6e732028466f7220416476656e7475726572732900000000000000000000000000000000000000000000000000000000000000000000000000000000094c6f6f7448796d6e730000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102035760003560e01c80635a64ad951161011857806395d89b41116100a0578063e2adb2521161006f578063e2adb252146106ab578063e985e9c5146106d6578063ee601f2114610713578063f242432a1461073c578063f2fde38b1461076557610203565b806395d89b411461060157806396532d1c1461062c578063a22cb46514610657578063a8af32e91461068057610203565b8063715018a6116100e7578063715018a614610554578063762cda3c1461056b5780637d9677a2146105945780638456cb59146105bf5780638da5cb5b146105d657610203565b80635a64ad95146104aa5780635c975abb146104d55780635ec88893146105005780636c0360eb1461052957610203565b8063238a47091161019b5780633ccfd60b1161016a5780633ccfd60b1461040a5780633f4ba83a146104145780634e1273f41461042b578063598125d11461046857806359c74f291461049357610203565b8063238a4709146103645780632693ebf21461038d5780632eb2c2d6146103ca57806334918dfd146103f357610203565b80630e89341c116101d75780630e89341c146102d65780631249c58b14610313578063174654711461031d57806320e409b41461034857610203565b8062fdd58e1461020857806301ffc9a71461024557806302fe53051461028257806306fdde03146102ab575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a91906141a7565b61078e565b60405161023c9190614e94565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906142bb565b610857565b6040516102799190614b37565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190614336565b610939565b005b3480156102b757600080fd5b506102c06109d8565b6040516102cd9190614b52565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190614377565b610a66565b60405161030a9190614b52565b60405180910390f35b61031b610a9a565b005b34801561032957600080fd5b50610332610fac565b60405161033f9190614e94565b60405180910390f35b610362600480360381019061035d9190614377565b610fb2565b005b34801561037057600080fd5b5061038b60048036038101906103869190614377565b61144b565b005b34801561039957600080fd5b506103b460048036038101906103af9190614377565b6114d1565b6040516103c19190614e94565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec919061401d565b6114e9565b005b3480156103ff57600080fd5b5061040861158a565b005b610412611632565b005b34801561042057600080fd5b5061042961172b565b005b34801561043757600080fd5b50610452600480360381019061044d91906141e3565b6117b1565b60405161045f9190614ade565b60405180910390f35b34801561047457600080fd5b5061047d611962565b60405161048a9190614e94565b60405180910390f35b34801561049f57600080fd5b506104a8611968565b005b3480156104b657600080fd5b506104bf611a10565b6040516104cc9190614e94565b60405180910390f35b3480156104e157600080fd5b506104ea611a16565b6040516104f79190614b37565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190614377565b611a2d565b005b34801561053557600080fd5b5061053e611ab3565b60405161054b9190614b52565b60405180910390f35b34801561056057600080fd5b50610569611b41565b005b34801561057757600080fd5b50610592600480360381019061058d9190614377565b611bc9565b005b3480156105a057600080fd5b506105a9611c4f565b6040516105b69190614e94565b60405180910390f35b3480156105cb57600080fd5b506105d4611c55565b005b3480156105e257600080fd5b506105eb611cdb565b6040516105f89190614a01565b60405180910390f35b34801561060d57600080fd5b50610616611d05565b6040516106239190614b52565b60405180910390f35b34801561063857600080fd5b50610641611d93565b60405161064e9190614b37565b60405180910390f35b34801561066357600080fd5b5061067e6004803603810190610679919061416b565b611da6565b005b34801561068c57600080fd5b50610695611f27565b6040516106a29190614a01565b60405180910390f35b3480156106b757600080fd5b506106c0611f4d565b6040516106cd9190614b37565b60405180910390f35b3480156106e257600080fd5b506106fd60048036038101906106f89190613fe1565b611f60565b60405161070a9190614b37565b60405180910390f35b34801561071f57600080fd5b5061073a6004803603810190610735919061424f565b612062565b005b34801561074857600080fd5b50610763600480360381019061075e91906140dc565b6122e0565b005b34801561077157600080fd5b5061078c60048036038101906107879190613fb8565b612381565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f690614bf4565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061092257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610932575061093182612479565b5b9050919050565b6109416124e3565b73ffffffffffffffffffffffffffffffffffffffff1661095f611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146109b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ac90614d94565b60405180910390fd5b6109be816124eb565b80600890805190602001906109d4929190613c86565b5050565b600680546109e59061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a119061527b565b8015610a5e5780601f10610a3357610100808354040283529160200191610a5e565b820191906000526020600020905b815481529060010190602001808311610a4157829003601f168201915b505050505081565b60606008610a7383612505565b604051602001610a849291906149a6565b6040516020818303038152906040529050919050565b60026004541415610ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad790614e74565b60405180910390fd5b6002600481905550600560149054906101000a900460ff16610b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2e90614dd4565b60405180910390fd5b600954600c5410610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490614d54565b60405180910390fd5b600560159054906101000a900460ff1615610c87576000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610bda6124e3565b6040518263ffffffff1660e01b8152600401610bf69190614a01565b60206040518083038186803b158015610c0e57600080fd5b505afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4691906143a0565b11610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90614c54565b60405180910390fd5b5b34600b541115610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390614db4565b60405180910390fd5b600080610cd960016126da565b91509150610dbc610ce86124e3565b83600081518110610d22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183600081518110610d64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610d746128f4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612901565b610dc46124e3565b73ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe83600081518110610e35577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151604051610e4a9190614e94565b60405180910390a280600081518110610e8c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600f600084600081518110610ed2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002054610ef39190615048565b600f600084600081518110610f31577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015181526020019081526020016000208190555080600081518110610f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600c54610f9a9190615048565b600c8190555050506001600481905550565b600a5481565b60026004541415610ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fef90614e74565b60405180910390fd5b6002600481905550600560149054906101000a900460ff1661104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104690614dd4565b60405180910390fd5b600954600c5410611095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108c90614d54565b60405180910390fd5b600560159054906101000a900460ff161561119f576000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316110f26124e3565b6040518263ffffffff1660e01b815260040161110e9190614a01565b60206040518083038186803b15801561112657600080fd5b505afa15801561113a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115e91906143a0565b1161119e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119590614c54565b60405180910390fd5b5b600a548111156111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db90614cf4565b60405180910390fd5b60095481600c546111f59190615048565b1115611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90614cb4565b60405180910390fd5b3481600b546112459190615106565b1115611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90614db4565b60405180910390fd5b600080611292836126da565b915091506112f36112a16124e3565b83836112ab6128f4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a97565b6112fb6124e3565b73ffffffffffffffffffffffffffffffffffffffff167f0fccc44f8f4572066001d167eac735aa3f72308ef306fd3af1b0bb0b6a7ba90f836040516113409190614ade565b60405180910390a260005b825181101561143d57600083828151811061138f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905060008383815181106113d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080600f6000848152602001908152602001600020546113fd9190615048565b600f60008481526020019081526020016000208190555080600c546114229190615048565b600c8190555050508080611435906152de565b91505061134b565b505050600160048190555050565b6114536124e3565b73ffffffffffffffffffffffffffffffffffffffff16611471611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146114c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114be90614d94565b60405180910390fd5b80600b8190555050565b600f6020528060005260406000206000915090505481565b6114f16124e3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806115375750611536856115316124e3565b611f60565b5b611576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156d90614d34565b60405180910390fd5b6115838585858585612d01565b5050505050565b6115926124e3565b73ffffffffffffffffffffffffffffffffffffffff166115b0611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90614d94565b60405180910390fd5b600560159054906101000a900460ff1615600560156101000a81548160ff021916908315150217905550565b61163a6124e3565b73ffffffffffffffffffffffffffffffffffffffff16611658611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146116ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a590614d94565b60405180910390fd5b6116b66124e3565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090614c34565b60405180910390fd5b565b6117336124e3565b73ffffffffffffffffffffffffffffffffffffffff16611751611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146117a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179e90614d94565b60405180910390fd5b6117af613061565b565b606081518351146117f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ee90614e14565b60405180910390fd5b6000835167ffffffffffffffff81111561183a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156118685781602001602082028036833780820191505090505b50905060005b8451811015611957576119018582815181106118b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106118f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161078e565b82828151811061193a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080611950906152de565b905061186e565b508091505092915050565b600c5481565b6119706124e3565b73ffffffffffffffffffffffffffffffffffffffff1661198e611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90614d94565b60405180910390fd5b600560149054906101000a900460ff1615600560146101000a81548160ff021916908315150217905550565b600b5481565b6000600360009054906101000a900460ff16905090565b611a356124e3565b73ffffffffffffffffffffffffffffffffffffffff16611a53611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090614d94565b60405180910390fd5b8060098190555050565b60088054611ac09061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054611aec9061527b565b8015611b395780601f10611b0e57610100808354040283529160200191611b39565b820191906000526020600020905b815481529060010190602001808311611b1c57829003601f168201915b505050505081565b611b496124e3565b73ffffffffffffffffffffffffffffffffffffffff16611b67611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490614d94565b60405180910390fd5b611bc76000613103565b565b611bd16124e3565b73ffffffffffffffffffffffffffffffffffffffff16611bef611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90614d94565b60405180910390fd5b80600a8190555050565b60095481565b611c5d6124e3565b73ffffffffffffffffffffffffffffffffffffffff16611c7b611cdb565b73ffffffffffffffffffffffffffffffffffffffff1614611cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc890614d94565b60405180910390fd5b611cd96131c9565b565b6000600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60078054611d129061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3e9061527b565b8015611d8b5780601f10611d6057610100808354040283529160200191611d8b565b820191906000526020600020905b815481529060010190602001808311611d6e57829003601f168201915b505050505081565b600560149054906101000a900460ff1681565b8173ffffffffffffffffffffffffffffffffffffffff16611dc56124e3565b73ffffffffffffffffffffffffffffffffffffffff161415611e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1390614df4565b60405180910390fd5b8060016000611e296124e3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ed66124e3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f1b9190614b37565b60405180910390a35050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560159054906101000a900460ff1681565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611fd89190614a01565b60206040518083038186803b158015611ff057600080fd5b505afa158015612004573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612028919061430d565b73ffffffffffffffffffffffffffffffffffffffff16141561204e57600191505061205c565b612058848461326c565b9150505b92915050565b600260045414156120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614e74565b60405180910390fd5b60026004819055506120b86124e3565b73ffffffffffffffffffffffffffffffffffffffff166120d6611cdb565b73ffffffffffffffffffffffffffffffffffffffff161461212c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212390614d94565b60405180910390fd5b6121896121376124e3565b83836121416128f4565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612a97565b6121916124e3565b73ffffffffffffffffffffffffffffffffffffffff167f0fccc44f8f4572066001d167eac735aa3f72308ef306fd3af1b0bb0b6a7ba90f836040516121d69190614ade565b60405180910390a260005b82518110156122d3576000838281518110612225577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600083838151811061226a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080600f6000848152602001908152602001600020546122939190615048565b600f60008481526020019081526020016000208190555080600c546122b89190615048565b600c81905550505080806122cb906152de565b9150506121e1565b5060016004819055505050565b6122e86124e3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061232e575061232d856123286124e3565b611f60565b5b61236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236490614c94565b60405180910390fd5b61237a8585858585613300565b5050505050565b6123896124e3565b73ffffffffffffffffffffffffffffffffffffffff166123a7611cdb565b73ffffffffffffffffffffffffffffffffffffffff16146123fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f490614d94565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561246d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246490614c14565b60405180910390fd5b61247681613103565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b8060029080519060200190612501929190613c86565b5050565b6060600082141561254d576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506126d5565b600082905060005b6000821461257f578080612568906152de565b915050600a8261257891906150d5565b9150612555565b60008167ffffffffffffffff8111156125c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125f35781602001600182028036833780820191505090505b50905060008290505b600086146126cd576001816126119190615160565b90506000600a808861262391906150d5565b61262d9190615106565b876126389190615160565b6030612644919061509e565b905060008160f81b905080848481518110612688577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886126c491906150d5565b975050506125fc565b819450505050505b919050565b60608060008367ffffffffffffffff81111561271f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561274d5781602001602082028036833780820191505090505b50905060008467ffffffffffffffff811115612792577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156127c05781602001602082028036833780820191505090505b50905060005b858110156128e65760006127d8613582565b905060006127e582613697565b9050600081101580156128055750600160346128019190615160565b8111155b612844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283b90614bd4565b60405180910390fd5b8085848151811061287e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505060018484815181106128c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050505080806128de906152de565b9150506127c6565b508181935093505050915091565b3660008036915091509091565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296890614e54565b60405180910390fd5b600061297b6124e3565b905061299c8160008761298d88613779565b61299688613779565b8761383f565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129fb9190615048565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612a79929190614eaf565b60405180910390a4612a908160008787878761389d565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afe90614e54565b60405180910390fd5b8151835114612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290614e34565b60405180910390fd5b6000612b556124e3565b9050612b668160008787878761383f565b60005b8451811015612c6b57838181518110612bab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600080878481518110612bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c519190615048565b925050819055508080612c63906152de565b915050612b69565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612ce3929190614b00565b60405180910390a4612cfa81600087878787613a84565b5050505050565b8151835114612d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3c90614e34565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dac90614d14565b60405180910390fd5b6000612dbf6124e3565b9050612dcf81878787878761383f565b60005b8451811015612fcc576000858281518110612e16577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110612e5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ef390614d74565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fb19190615048565b9250508190555050505080612fc5906152de565b9050612dd2565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051613043929190614b00565b60405180910390a4613059818787878787613a84565b505050505050565b613069611a16565b6130a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161309f90614bb4565b60405180910390fd5b6000600360006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130ec6124e3565b6040516130f99190614a01565b60405180910390a1565b6000600360019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6131d1611a16565b15613211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320890614cd4565b60405180910390fd5b6001600360006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586132556124e3565b6040516132629190614a01565b60405180910390a1565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336790614d14565b60405180910390fd5b600061337a6124e3565b905061339a81878761338b88613779565b61339488613779565b8761383f565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015613431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342890614d74565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134e69190615048565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051613563929190614eaf565b60405180910390a461357982888888888861389d565b50505050505050565b6000600e6000815480929190613597906152de565b919050555060004342336040516020016135b19190614970565b6040516020818303038152906040528051906020012060001c6135d491906150d5565b4542416040516020016135e7919061498b565b6040516020818303038152906040528051906020012060001c61360a91906150d5565b44426136169190615048565b6136209190615048565b61362a9190615048565b6136349190615048565b61363e9190615048565b600e546040516020016136529291906149d5565b6040516020818303038152906040528051906020012060001c90506109e2808261367c91906150d5565b6136869190615106565b816136919190615160565b91505090565b600080600090505b600160346136ad9190615160565b81101561376e57601181815481106136ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001548310156137095780915050613774565b60118181548110613743577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154836137599190615160565b92508080613766906152de565b91505061369f565b50600090505b919050565b60606000600167ffffffffffffffff8111156137be577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156137ec5781602001602082028036833780820191505090505b509050828160008151811061382a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b61384d868686868686613c6b565b613855611a16565b15613895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388c90614c74565b60405180910390fd5b505050505050565b6138bc8473ffffffffffffffffffffffffffffffffffffffff16613c73565b15613a7c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613902959493929190614a84565b602060405180830381600087803b15801561391c57600080fd5b505af192505050801561394d57506040513d601f19601f8201168201806040525081019061394a91906142e4565b60015b6139f357613959615423565b806308c379a014156139b6575061396e615afa565b8061397957506139b8565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ad9190614b52565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ea90614b74565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7190614b94565b60405180910390fd5b505b505050505050565b613aa38473ffffffffffffffffffffffffffffffffffffffff16613c73565b15613c63578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613ae9959493929190614a1c565b602060405180830381600087803b158015613b0357600080fd5b505af1925050508015613b3457506040513d601f19601f82011682018060405250810190613b3191906142e4565b60015b613bda57613b40615423565b806308c379a01415613b9d5750613b55615afa565b80613b605750613b9f565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b949190614b52565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd190614b74565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5890614b94565b60405180910390fd5b505b505050505050565b505050505050565b600080823b905060008111915050919050565b828054613c929061527b565b90600052602060002090601f016020900481019282613cb45760008555613cfb565b82601f10613ccd57805160ff1916838001178555613cfb565b82800160010185558215613cfb579182015b82811115613cfa578251825591602001919060010190613cdf565b5b509050613d089190613d0c565b5090565b5b80821115613d25576000816000905550600101613d0d565b5090565b6000613d3c613d3784614efd565b614ed8565b90508083825260208201905082856020860282011115613d5b57600080fd5b60005b85811015613d8b5781613d718882613e7d565b845260208401935060208301925050600181019050613d5e565b5050509392505050565b6000613da8613da384614f29565b614ed8565b90508083825260208201905082856020860282011115613dc757600080fd5b60005b85811015613df75781613ddd8882613f8e565b845260208401935060208301925050600181019050613dca565b5050509392505050565b6000613e14613e0f84614f55565b614ed8565b905082815260208101848484011115613e2c57600080fd5b613e37848285615239565b509392505050565b6000613e52613e4d84614f86565b614ed8565b905082815260208101848484011115613e6a57600080fd5b613e75848285615239565b509392505050565b600081359050613e8c81615b90565b92915050565b600082601f830112613ea357600080fd5b8135613eb3848260208601613d29565b91505092915050565b600082601f830112613ecd57600080fd5b8135613edd848260208601613d95565b91505092915050565b600081359050613ef581615ba7565b92915050565b600081359050613f0a81615bbe565b92915050565b600081519050613f1f81615bbe565b92915050565b600082601f830112613f3657600080fd5b8135613f46848260208601613e01565b91505092915050565b600081519050613f5e81615bd5565b92915050565b600082601f830112613f7557600080fd5b8135613f85848260208601613e3f565b91505092915050565b600081359050613f9d81615bec565b92915050565b600081519050613fb281615bec565b92915050565b600060208284031215613fca57600080fd5b6000613fd884828501613e7d565b91505092915050565b60008060408385031215613ff457600080fd5b600061400285828601613e7d565b925050602061401385828601613e7d565b9150509250929050565b600080600080600060a0868803121561403557600080fd5b600061404388828901613e7d565b955050602061405488828901613e7d565b945050604086013567ffffffffffffffff81111561407157600080fd5b61407d88828901613ebc565b935050606086013567ffffffffffffffff81111561409a57600080fd5b6140a688828901613ebc565b925050608086013567ffffffffffffffff8111156140c357600080fd5b6140cf88828901613f25565b9150509295509295909350565b600080600080600060a086880312156140f457600080fd5b600061410288828901613e7d565b955050602061411388828901613e7d565b945050604061412488828901613f8e565b935050606061413588828901613f8e565b925050608086013567ffffffffffffffff81111561415257600080fd5b61415e88828901613f25565b9150509295509295909350565b6000806040838503121561417e57600080fd5b600061418c85828601613e7d565b925050602061419d85828601613ee6565b9150509250929050565b600080604083850312156141ba57600080fd5b60006141c885828601613e7d565b92505060206141d985828601613f8e565b9150509250929050565b600080604083850312156141f657600080fd5b600083013567ffffffffffffffff81111561421057600080fd5b61421c85828601613e92565b925050602083013567ffffffffffffffff81111561423957600080fd5b61424585828601613ebc565b9150509250929050565b6000806040838503121561426257600080fd5b600083013567ffffffffffffffff81111561427c57600080fd5b61428885828601613ebc565b925050602083013567ffffffffffffffff8111156142a557600080fd5b6142b185828601613ebc565b9150509250929050565b6000602082840312156142cd57600080fd5b60006142db84828501613efb565b91505092915050565b6000602082840312156142f657600080fd5b600061430484828501613f10565b91505092915050565b60006020828403121561431f57600080fd5b600061432d84828501613f4f565b91505092915050565b60006020828403121561434857600080fd5b600082013567ffffffffffffffff81111561436257600080fd5b61436e84828501613f64565b91505092915050565b60006020828403121561438957600080fd5b600061439784828501613f8e565b91505092915050565b6000602082840312156143b257600080fd5b60006143c084828501613fa3565b91505092915050565b60006143d5838361493b565b60208301905092915050565b6143f26143ed826151a6565b615339565b82525050565b61440181615194565b82525050565b61441861441382615194565b615327565b82525050565b600061442982614fdc565b614433818561500a565b935061443e83614fb7565b8060005b8381101561446f57815161445688826143c9565b975061446183614ffd565b925050600181019050614442565b5085935050505092915050565b614485816151b8565b82525050565b600061449682614fe7565b6144a0818561501b565b93506144b0818560208601615248565b6144b981615445565b840191505092915050565b60006144cf82614ff2565b6144d9818561502c565b93506144e9818560208601615248565b6144f281615445565b840191505092915050565b600061450882614ff2565b614512818561503d565b9350614522818560208601615248565b80840191505092915050565b6000815461453b8161527b565b614545818661503d565b945060018216600081146145605760018114614571576145a4565b60ff198316865281860193506145a4565b61457a85614fc7565b60005b8381101561459c5781548189015260018201915060208101905061457d565b838801955050505b50505092915050565b60006145ba60348361502c565b91506145c582615470565b604082019050919050565b60006145dd60288361502c565b91506145e8826154bf565b604082019050919050565b600061460060148361502c565b915061460b8261550e565b602082019050919050565b600061462360158361502c565b915061462e82615537565b602082019050919050565b6000614646602b8361502c565b915061465182615560565b604082019050919050565b600061466960268361502c565b9150614674826155af565b604082019050919050565b600061468c60168361502c565b9150614697826155fe565b602082019050919050565b60006146af60308361502c565b91506146ba82615627565b604082019050919050565b60006146d2602c8361502c565b91506146dd82615676565b604082019050919050565b60006146f560298361502c565b9150614700826156c5565b604082019050919050565b6000614718602f8361502c565b915061472382615714565b604082019050919050565b600061473b60108361502c565b915061474682615763565b602082019050919050565b600061475e601c8361502c565b91506147698261578c565b602082019050919050565b600061478160258361502c565b915061478c826157b5565b604082019050919050565b60006147a460328361502c565b91506147af82615804565b604082019050919050565b60006147c7601b8361502c565b91506147d282615853565b602082019050919050565b60006147ea602a8361502c565b91506147f58261587c565b604082019050919050565b600061480d60208361502c565b9150614818826158cb565b602082019050919050565b600061483060218361502c565b915061483b826158f4565b604082019050919050565b600061485360128361502c565b915061485e82615943565b602082019050919050565b600061487660298361502c565b91506148818261596c565b604082019050919050565b600061489960298361502c565b91506148a4826159bb565b604082019050919050565b60006148bc60288361502c565b91506148c782615a0a565b604082019050919050565b60006148df60218361502c565b91506148ea82615a59565b604082019050919050565b6000614902601f8361502c565b915061490d82615aa8565b602082019050919050565b600061492560018361503d565b915061493082615ad1565b600182019050919050565b61494481615222565b82525050565b61495381615222565b82525050565b61496a61496582615222565b61535d565b82525050565b600061497c8284614407565b60148201915081905092915050565b600061499782846143e1565b60148201915081905092915050565b60006149b2828561452e565b91506149bd82614918565b91506149c982846144fd565b91508190509392505050565b60006149e18285614959565b6020820191506149f18284614959565b6020820191508190509392505050565b6000602082019050614a1660008301846143f8565b92915050565b600060a082019050614a3160008301886143f8565b614a3e60208301876143f8565b8181036040830152614a50818661441e565b90508181036060830152614a64818561441e565b90508181036080830152614a78818461448b565b90509695505050505050565b600060a082019050614a9960008301886143f8565b614aa660208301876143f8565b614ab3604083018661494a565b614ac0606083018561494a565b8181036080830152614ad2818461448b565b90509695505050505050565b60006020820190508181036000830152614af8818461441e565b905092915050565b60006040820190508181036000830152614b1a818561441e565b90508181036020830152614b2e818461441e565b90509392505050565b6000602082019050614b4c600083018461447c565b92915050565b60006020820190508181036000830152614b6c81846144c4565b905092915050565b60006020820190508181036000830152614b8d816145ad565b9050919050565b60006020820190508181036000830152614bad816145d0565b9050919050565b60006020820190508181036000830152614bcd816145f3565b9050919050565b60006020820190508181036000830152614bed81614616565b9050919050565b60006020820190508181036000830152614c0d81614639565b9050919050565b60006020820190508181036000830152614c2d8161465c565b9050919050565b60006020820190508181036000830152614c4d8161467f565b9050919050565b60006020820190508181036000830152614c6d816146a2565b9050919050565b60006020820190508181036000830152614c8d816146c5565b9050919050565b60006020820190508181036000830152614cad816146e8565b9050919050565b60006020820190508181036000830152614ccd8161470b565b9050919050565b60006020820190508181036000830152614ced8161472e565b9050919050565b60006020820190508181036000830152614d0d81614751565b9050919050565b60006020820190508181036000830152614d2d81614774565b9050919050565b60006020820190508181036000830152614d4d81614797565b9050919050565b60006020820190508181036000830152614d6d816147ba565b9050919050565b60006020820190508181036000830152614d8d816147dd565b9050919050565b60006020820190508181036000830152614dad81614800565b9050919050565b60006020820190508181036000830152614dcd81614823565b9050919050565b60006020820190508181036000830152614ded81614846565b9050919050565b60006020820190508181036000830152614e0d81614869565b9050919050565b60006020820190508181036000830152614e2d8161488c565b9050919050565b60006020820190508181036000830152614e4d816148af565b9050919050565b60006020820190508181036000830152614e6d816148d2565b9050919050565b60006020820190508181036000830152614e8d816148f5565b9050919050565b6000602082019050614ea9600083018461494a565b92915050565b6000604082019050614ec4600083018561494a565b614ed1602083018461494a565b9392505050565b6000614ee2614ef3565b9050614eee82826152ad565b919050565b6000604051905090565b600067ffffffffffffffff821115614f1857614f176153f4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f4457614f436153f4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614f7057614f6f6153f4565b5b614f7982615445565b9050602081019050919050565b600067ffffffffffffffff821115614fa157614fa06153f4565b5b614faa82615445565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061505382615222565b915061505e83615222565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561509357615092615367565b5b828201905092915050565b60006150a98261522c565b91506150b48361522c565b92508260ff038211156150ca576150c9615367565b5b828201905092915050565b60006150e082615222565b91506150eb83615222565b9250826150fb576150fa615396565b5b828204905092915050565b600061511182615222565b915061511c83615222565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561515557615154615367565b5b828202905092915050565b600061516b82615222565b915061517683615222565b92508282101561518957615188615367565b5b828203905092915050565b600061519f82615202565b9050919050565b60006151b182615202565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006151fb82615194565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561526657808201518184015260208101905061524b565b83811115615275576000848401525b50505050565b6000600282049050600182168061529357607f821691505b602082108114156152a7576152a66153c5565b5b50919050565b6152b682615445565b810181811067ffffffffffffffff821117156152d5576152d46153f4565b5b80604052505050565b60006152e982615222565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561531c5761531b615367565b5b600182019050919050565b60006153328261534b565b9050919050565b60006153448261534b565b9050919050565b600061535682615456565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156154425760046000803e61543f600051615463565b90505b90565b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f546f6b656e204944204f7574204f662052616e67650000000000000000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f556e61626c6520746f2057697468647261772045544800000000000000000000600082015250565b7f4d696e74696e672043757272656e746c7920417661696c61626c6520466f722060008201527f4c4f4f54204f776e657273204f6e6c7900000000000000000000000000000000602082015250565b7f455243313135355061757361626c653a20746f6b656e207472616e736665722060008201527f7768696c65207061757365640000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5468697320416d6f756e742077696c6c206578636565642074686520746f746160008201527f6c204d696e747320616c6c6f7765640000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4578636565646564204d617820546f6b656e7320506572204d696e7400000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f416c6c20546f6b656e732048617665204265656e204d696e7465640000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420456e6f75676820457468657220526571756972656420546f204d696e60008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e67204e6f74204163746976650000000000000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b600060443d1015615b0a57615b8d565b615b12614ef3565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b3a575050615b8d565b808201805167ffffffffffffffff811115615b585750505050615b8d565b80602083010160043d038501811115615b75575050505050615b8d565b615b84826020018501866152ad565b82955050505050505b90565b615b9981615194565b8114615ba457600080fd5b50565b615bb0816151b8565b8114615bbb57600080fd5b50565b615bc7816151c4565b8114615bd257600080fd5b50565b615bde816151f0565b8114615be957600080fd5b50565b615bf581615222565b8114615c0057600080fd5b5056fea26469706673582212204d9a21fb14d2dbd69305114db827f46324d1d29e93651bc5b6f47c73234324d964736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f68796d6e732e6d7970696e6174612e636c6f75642f697066732f516d5664766239766d6b64554670574c34425337374276533832514d6a564867694238546e61716e506852696f3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001748796d6e732028466f7220416476656e7475726572732900000000000000000000000000000000000000000000000000000000000000000000000000000000094c6f6f7448796d6e730000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://hymns.mypinata.cloud/ipfs/QmVdvb9vmkdUFpWL4BS77BvS82QMjVHgiB8TnaqnPhRio8
Arg [1] : _name (string): Hymns (For Adventurers)
Arg [2] : _symbol (string): LootHymns
Arg [3] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [5] : 68747470733a2f2f68796d6e732e6d7970696e6174612e636c6f75642f697066
Arg [6] : 732f516d5664766239766d6b64554670574c34425337374276533832514d6a56
Arg [7] : 4867694238546e61716e506852696f3800000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [9] : 48796d6e732028466f7220416476656e74757265727329000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [11] : 4c6f6f7448796d6e730000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51886:8816:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19942:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18915:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57964:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52149:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55358:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53163:838;;;:::i;:::-;;52356:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54009:1341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58286:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52623:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22280:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58183:95;;;;;;;;;;;;;:::i;:::-;;58764:185;;;:::i;:::-;;58683:73;;;;;;;;;;;;;:::i;:::-;;20426:561;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52451:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58082:93;;;;;;;;;;;;;:::i;:::-;;52399:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35631:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58384:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52201:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39331:94;;;;;;;;;;;;;:::i;:::-;;58496:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52312:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58606:69;;;;;;;;;;;;;:::i;:::-;;38680:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52174:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52067:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21060:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52493:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52108:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58957:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55584:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21802:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39580:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19942:318;20073:7;20139:1;20120:21;;:7;:21;;;;20098:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;20230:9;:13;20240:2;20230:13;;;;;;;;;;;:22;20244:7;20230:22;;;;;;;;;;;;;;;;20223:29;;19942:318;;;;:::o;18915:360::-;19062:4;19119:26;19104:41;;;:11;:41;;;;:110;;;;19177:37;19162:52;;;:11;:52;;;;19104:110;:163;;;;19231:36;19255:11;19231:23;:36::i;:::-;19104:163;19084:183;;18915:360;;;:::o;57964:110::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58028:13:::1;58036:4;58028:7;:13::i;:::-;58062:4;58052:7;:14;;;;;;;;;;;;:::i;:::-;;57964:110:::0;:::o;52149:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55358:218::-;55472:13;55534:7;55548:18;55557:8;55548;:18::i;:::-;55517:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55503:65;;55358:218;;;:::o;53163:838::-;50701:1;51297:7;;:19;;51289:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50701:1;51430:7;:18;;;;53226:14:::1;;;;;;;;;;;53218:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;53315:15;;53296:16;;:34;53274:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;53400:15;;;;;;;;;;;53396:198;;;53497:1;53458:12;;;;;;;;;;;:22;;;53481:12;:10;:12::i;:::-;53458:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;53432:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;53396:198;53626:9;53612:10;;:23;;53604:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53687:22;53711:23:::0;53738:14:::1;53750:1;53738:11;:14::i;:::-;53686:66;;;;53763:58;53775:12;:10;:12::i;:::-;53789:5;53795:1;53789:8;;;;;;;;;;;;;;;;;;;;;;53799:6;53806:1;53799:9;;;;;;;;;;;;;;;;;;;;;;53810:10;:8;:10::i;:::-;53763:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;:58::i;:::-;53844:12;:10;:12::i;:::-;53837:30;;;53858:5;53864:1;53858:8;;;;;;;;;;;;;;;;;;;;;;53837:30;;;;;;:::i;:::-;;;;;;;;53926:6;53933:1;53926:9;;;;;;;;;;;;;;;;;;;;;;53902:11;:21;53914:5;53920:1;53914:8;;;;;;;;;;;;;;;;;;;;;;53902:21;;;;;;;;;;;;:33;;;;:::i;:::-;53878:11;:21;53890:5;53896:1;53890:8;;;;;;;;;;;;;;;;;;;;;;53878:21;;;;;;;;;;;:57;;;;53984:6;53991:1;53984:9;;;;;;;;;;;;;;;;;;;;;;53965:16;;:28;;;;:::i;:::-;53946:16;:47;;;;51461:1;;50657::::0;51609:7;:22;;;;53163:838::o;52356:36::-;;;;:::o;54009:1341::-;50701:1;51297:7;;:19;;51289:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50701:1;51430:7;:18;;;;54092:14:::1;;;;;;;;;;;54084:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;54181:15;;54162:16;;:34;54140:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;54266:15;;;;;;;;;;;54262:198;;;54363:1;54324:12;;;;;;;;;;;:22;;;54347:12;:10;:12::i;:::-;54324:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;54298:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;54262:198;54489:16;;54478:7;:27;;54470:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54603:15;;54591:7;54572:16;;:26;;;;:::i;:::-;54571:47;;54549:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;54754:9;54742:7;54729:10;;:20;;;;:::i;:::-;54728:35;;54706:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;54838:23;54863:24:::0;54891:44:::1;54917:7;54891:11;:44::i;:::-;54837:98;;;;54946:59;54963:12;:10;:12::i;:::-;54977:6;54985:7;54994:10;:8;:10::i;:::-;54946:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:59::i;:::-;55033:12;:10;:12::i;:::-;55021:33;;;55047:6;55021:33;;;;;;:::i;:::-;;;;;;;;55070:9;55065:278;55089:6;:13;55085:1;:17;55065:278;;;55124:16;55143:6;55150:1;55143:9;;;;;;;;;;;;;;;;;;;;;;55124:28;;55167:17;55187:7;55195:1;55187:10;;;;;;;;;;;;;;;;;;;;;;55167:30;;55260:9;55236:11;:21;55248:8;55236:21;;;;;;;;;;;;:33;;;;:::i;:::-;55212:11;:21;55224:8;55212:21;;;;;;;;;;;:57;;;;55322:9;55303:16;;:28;;;;:::i;:::-;55284:16;:47;;;;55065:278;;55104:3;;;;;:::i;:::-;;;;55065:278;;;;51461:1;;50657::::0;51609:7;:22;;;;54009:1341;:::o;58286:90::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58364:4:::1;58351:10;:17;;;;58286:90:::0;:::o;52623:46::-;;;;;;;;;;;;;;;;;:::o;22280:442::-;22521:12;:10;:12::i;:::-;22513:20;;:4;:20;;;:60;;;;22537:36;22554:4;22560:12;:10;:12::i;:::-;22537:16;:36::i;:::-;22513:60;22491:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;22662:52;22685:4;22691:2;22695:3;22700:7;22709:4;22662:22;:52::i;:::-;22280:442;;;;;:::o;58183:95::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58255:15:::1;;;;;;;;;;;58254:16;58236:15;;:34;;;;;;;;;;;;;;;;;;58183:95::o:0;58764:185::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58850:12:::1;:10;:12::i;:::-;58842:26;;:49;58869:21;58842:49;;;;;;;;;;;;;;;;;;;;;;;58820:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;58764:185::o:0;58683:73::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58738:10:::1;:8;:10::i;:::-;58683:73::o:0;20426:561::-;20582:16;20657:3;:10;20638:8;:15;:29;20616:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;20749:30;20796:8;:15;20782:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20749:63;;20830:9;20825:122;20849:8;:15;20845:1;:19;20825:122;;;20905:30;20915:8;20924:1;20915:11;;;;;;;;;;;;;;;;;;;;;;20928:3;20932:1;20928:6;;;;;;;;;;;;;;;;;;;;;;20905:9;:30::i;:::-;20886:13;20900:1;20886:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;20866:3;;;;:::i;:::-;;;20825:122;;;;20966:13;20959:20;;;20426:561;;;;:::o;52451:35::-;;;;:::o;58082:93::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58153:14:::1;;;;;;;;;;;58152:15;58135:14;;:32;;;;;;;;;;;;;;;;;;58082:93::o:0;52399:45::-;;;;:::o;35631:86::-;35678:4;35702:7;;;;;;;;;;;35695:14;;35631:86;:::o;58384:104::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58474:6:::1;58456:15;:24;;;;58384:104:::0;:::o;52201:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39331:94::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39396:21:::1;39414:1;39396:9;:21::i;:::-;39331:94::o:0;58496:102::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58586:4:::1;58567:16;:23;;;;58496:102:::0;:::o;52312:37::-;;;;:::o;58606:69::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58659:8:::1;:6;:8::i;:::-;58606:69::o:0;38680:87::-;38726:7;38753:6;;;;;;;;;;;38746:13;;38680:87;:::o;52174:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52067:34::-;;;;;;;;;;;;;:::o;21060:380::-;21225:8;21209:24;;:12;:10;:12::i;:::-;:24;;;;21187:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;21360:8;21315:18;:32;21334:12;:10;:12::i;:::-;21315:32;;;;;;;;;;;;;;;:42;21348:8;21315:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;21413:8;21384:48;;21399:12;:10;:12::i;:::-;21384:48;;;21423:8;21384:48;;;;;;:::i;:::-;;;;;;;;21060:380;;:::o;52493:88::-;;;;;;;;;;;;;:::o;52108:34::-;;;;;;;;;;;;;:::o;58957:399::-;59084:15;59117:27;59161:20;;;;;;;;;;;59117:65;;59239:9;59197:51;;59205:13;:21;;;59227:6;59205:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59197:51;;;59193:95;;;59272:4;59265:11;;;;;59193:95;59305:43;59330:6;59338:9;59305:24;:43::i;:::-;59298:50;;;58957:399;;;;;:::o;55584:555::-;50701:1;51297:7;;:19;;51289:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50701:1;51430:7;:18;;;;38911:12:::1;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55727:61:::2;55744:12;:10;:12::i;:::-;55758:8;55768:7;55777:10;:8;:10::i;:::-;55727:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:61::i;:::-;55816:12;:10;:12::i;:::-;55804:35;;;55830:8;55804:35;;;;;;:::i;:::-;;;;;;;;55855:9;55850:282;55874:8;:15;55870:1;:19;55850:282;;;55911:16;55930:8;55939:1;55930:11;;;;;;;;;;;;;;;;;;;;;;55911:30;;55956:17;55976:7;55984:1;55976:10;;;;;;;;;;;;;;;;;;;;;;55956:30;;56049:9;56025:11;:21;56037:8;56025:21;;;;;;;;;;;;:33;;;;:::i;:::-;56001:11;:21;56013:8;56001:21;;;;;;;;;;;:57;;;;56111:9;56092:16;;:28;;;;:::i;:::-;56073:16;:47;;;;55850:282;;55891:3;;;;;:::i;:::-;;;;55850:282;;;;50657:1:::0;51609:7;:22;;;;55584:555;;:::o;21802:401::-;22018:12;:10;:12::i;:::-;22010:20;;:4;:20;;;:60;;;;22034:36;22051:4;22057:12;:10;:12::i;:::-;22034:16;:36::i;:::-;22010:60;21988:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;22150:45;22168:4;22174:2;22178;22182:6;22190:4;22150:17;:45::i;:::-;21802:401;;;;;:::o;39580:229::-;38911:12;:10;:12::i;:::-;38900:23;;:7;:5;:7::i;:::-;:23;;;38892:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39703:1:::1;39683:22;;:8;:22;;;;39661:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;39782:19;39792:8;39782:9;:19::i;:::-;39580:229:::0;:::o;17787:207::-;17917:4;17961:25;17946:40;;;:11;:40;;;;17939:47;;17787:207;;;:::o;16871:98::-;16924:7;16951:10;16944:17;;16871:98;:::o;26583:88::-;26657:6;26650:4;:13;;;;;;;;;;;;:::i;:::-;;26583:88;:::o;59364:621::-;59444:27;59499:1;59493:2;:7;59489:50;;;59517:10;;;;;;;;;;;;;;;;;;;;;59489:50;59549:9;59561:2;59549:14;;59574:11;59596:69;59608:1;59603;:6;59596:69;;59626:5;;;;;:::i;:::-;;;;59651:2;59646:7;;;;;:::i;:::-;;;59596:69;;;59675:17;59705:3;59695:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59675:34;;59720:9;59732:3;59720:15;;59746:202;59759:1;59753:2;:7;59746:202;;59785:1;59781;:5;;;;:::i;:::-;59777:9;;59801:10;59843:2;59837;59832;:7;;;;:::i;:::-;59831:14;;;;:::i;:::-;59826:2;:19;;;;:::i;:::-;59815:2;:31;;;;:::i;:::-;59801:46;;59862:9;59881:4;59874:12;;59862:24;;59911:2;59901:4;59906:1;59901:7;;;;;;;;;;;;;;;;;;;:12;;;;;;;;;;;59934:2;59928:8;;;;;:::i;:::-;;;59746:202;;;;;59972:4;59958:19;;;;;;59364:621;;;;:::o;56147:668::-;56238:16;56256;56290:26;56333:7;56319:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56290:51;;56352:29;56398:7;56384:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56352:54;;56422:9;56417:348;56441:7;56437:1;:11;56417:348;;;56470:14;56487:6;:4;:6::i;:::-;56470:23;;56508:15;56526:16;56535:6;56526:8;:16::i;:::-;56508:34;;56594:1;56583:7;:12;;:42;;;;;56624:1;52260:2;56610:15;;;;:::i;:::-;56599:7;:26;;56583:42;56557:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;56712:7;56697:9;56707:1;56697:12;;;;;;;;;;;;;;;;;;;;;:22;;;;;56752:1;56734:12;56747:1;56734:15;;;;;;;;;;;;;;;;;;;;;:19;;;;;56417:348;;56450:3;;;;;:::i;:::-;;;;56417:348;;;;56783:9;56794:12;56775:32;;;;;;56147:668;;;:::o;16977:101::-;17028:14;;17062:8;;17055:15;;;;16977:101;;:::o;27072:777::-;27249:1;27230:21;;:7;:21;;;;27222:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27302:16;27321:12;:10;:12::i;:::-;27302:31;;27346:196;27381:8;27412:1;27429:7;27451:21;27469:2;27451:17;:21::i;:::-;27487:25;27505:6;27487:17;:25::i;:::-;27527:4;27346:20;:196::i;:::-;27581:6;27555:9;:13;27565:2;27555:13;;;;;;;;;;;:22;27569:7;27555:22;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;27640:7;27603:57;;27636:1;27603:57;;27618:8;27603:57;;;27649:2;27653:6;27603:57;;;;;;;:::i;:::-;;;;;;;;27673:168;27718:8;27749:1;27766:7;27788:2;27805:6;27826:4;27673:30;:168::i;:::-;27072:777;;;;;:::o;28205:861::-;28397:1;28383:16;;:2;:16;;;;28375:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28484:7;:14;28470:3;:10;:28;28448:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;28579:16;28598:12;:10;:12::i;:::-;28579:31;;28623:66;28644:8;28662:1;28666:2;28670:3;28675:7;28684:4;28623:20;:66::i;:::-;28707:9;28702:103;28726:3;:10;28722:1;:14;28702:103;;;28783:7;28791:1;28783:10;;;;;;;;;;;;;;;;;;;;;;28758:9;:17;28768:3;28772:1;28768:6;;;;;;;;;;;;;;;;;;;;;;28758:17;;;;;;;;;;;:21;28776:2;28758:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;28738:3;;;;;:::i;:::-;;;;28702:103;;;;28858:2;28822:53;;28854:1;28822:53;;28836:8;28822:53;;;28862:3;28867:7;28822:53;;;;;;;:::i;:::-;;;;;;;;28888:170;28938:8;28969:1;28986:2;29003:3;29021:7;29043:4;28888:35;:170::i;:::-;28205:861;;;;;:::o;24490:1249::-;24731:7;:14;24717:3;:10;:28;24695:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;24846:1;24832:16;;:2;:16;;;;24824:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24903:16;24922:12;:10;:12::i;:::-;24903:31;;24947:60;24968:8;24978:4;24984:2;24988:3;24993:7;25002:4;24947:20;:60::i;:::-;25025:9;25020:470;25044:3;:10;25040:1;:14;25020:470;;;25076:10;25089:3;25093:1;25089:6;;;;;;;;;;;;;;;;;;;;;;25076:19;;25110:14;25127:7;25135:1;25127:10;;;;;;;;;;;;;;;;;;;;;;25110:27;;25154:19;25176:9;:13;25186:2;25176:13;;;;;;;;;;;:19;25190:4;25176:19;;;;;;;;;;;;;;;;25154:41;;25251:6;25236:11;:21;;25210:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;25415:6;25401:11;:20;25379:9;:13;25389:2;25379:13;;;;;;;;;;;:19;25393:4;25379:19;;;;;;;;;;;;;;;:42;;;;25472:6;25451:9;:13;25461:2;25451:13;;;;;;;;;;;:17;25465:2;25451:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;25020:470;;;25056:3;;;;:::i;:::-;;;25020:470;;;;25537:2;25507:47;;25531:4;25507:47;;25521:8;25507:47;;;25541:3;25546:7;25507:47;;;;;;;:::i;:::-;;;;;;;;25567:164;25617:8;25640:4;25659:2;25676:3;25694:7;25716:4;25567:35;:164::i;:::-;24490:1249;;;;;;:::o;36690:120::-;36234:8;:6;:8::i;:::-;36226:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;36759:5:::1;36749:7;;:15;;;;;;;;;;;;;;;;;;36780:22;36789:12;:10;:12::i;:::-;36780:22;;;;;;:::i;:::-;;;;;;;;36690:120::o:0;39817:173::-;39873:16;39892:6;;;;;;;;;;;39873:25;;39918:8;39909:6;;:17;;;;;;;;;;;;;;;;;;39973:8;39942:40;;39963:8;39942:40;;;;;;;;;;;;39817:173;;:::o;36431:118::-;35957:8;:6;:8::i;:::-;35956:9;35948:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;36501:4:::1;36491:7;;:14;;;;;;;;;;;;;;;;;;36521:20;36528:12;:10;:12::i;:::-;36521:20;;;;;;:::i;:::-;;;;;;;;36431:118::o:0;21512:218::-;21656:4;21685:18;:27;21704:7;21685:27;;;;;;;;;;;;;;;:37;21713:8;21685:37;;;;;;;;;;;;;;;;;;;;;;;;;21678:44;;21512:218;;;;:::o;23186:946::-;23388:1;23374:16;;:2;:16;;;;23366:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;23445:16;23464:12;:10;:12::i;:::-;23445:31;;23489:185;23524:8;23547:4;23566:2;23583:21;23601:2;23583:17;:21::i;:::-;23619:25;23637:6;23619:17;:25::i;:::-;23659:4;23489:20;:185::i;:::-;23687:19;23709:9;:13;23719:2;23709:13;;;;;;;;;;;:19;23723:4;23709:19;;;;;;;;;;;;;;;;23687:41;;23776:6;23761:11;:21;;23739:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;23924:6;23910:11;:20;23888:9;:13;23898:2;23888:13;;;;;;;;;;;:19;23902:4;23888:19;;;;;;;;;;;;;;;:42;;;;23973:6;23952:9;:13;23962:2;23952:13;;;;;;;;;;;:17;23966:2;23952:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;24028:2;23997:46;;24022:4;23997:46;;24012:8;23997:46;;;24032:2;24036:6;23997:46;;;;;;;:::i;:::-;;;;;;;;24056:68;24087:8;24097:4;24103:2;24107;24111:6;24119:4;24056:30;:68::i;:::-;23186:946;;;;;;;:::o;57078:760::-;57120:7;57140:5;;:7;;;;;;;;;:::i;:::-;;;;;;57158:12;57680;57635:15;57588:10;57571:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;57561:39;;;;;;57553:48;;57552:99;;;;:::i;:::-;57509:14;57464:15;57416:14;57399:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;57389:43;;;;;;57381:52;;57350:130;;;;:::i;:::-;57305:16;57262:15;:59;;;;:::i;:::-;:219;;;;:::i;:::-;:261;;;;:::i;:::-;:390;;;;:::i;:::-;:430;;;;:::i;:::-;57715:5;;57223:516;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57195:559;;;;;;57173:592;;57158:607;;52301:4;;57793;:19;;;;:::i;:::-;57792:36;;;;:::i;:::-;57784:4;:45;;;;:::i;:::-;57776:54;;;57078:760;:::o;56823:247::-;56883:7;56908:9;56920:1;56908:13;;56903:141;56941:1;52260:2;56927:15;;;;:::i;:::-;56923:1;:19;56903:141;;;56977:7;56985:1;56977:10;;;;;;;;;;;;;;;;;;;;;;;;56968:6;:19;56964:33;;;56996:1;56989:8;;;;;56964:33;57022:7;57030:1;57022:10;;;;;;;;;;;;;;;;;;;;;;;;57012:20;;;;;:::i;:::-;;;56944:3;;;;;:::i;:::-;;;;56903:141;;;;57061:1;57054:8;;56823:247;;;;:::o;34407:230::-;34500:16;34534:22;34573:1;34559:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34534:41;;34597:7;34586:5;34592:1;34586:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;34624:5;34617:12;;;34407:230;;;:::o;37342:392::-;37581:66;37608:8;37618:4;37624:2;37628:3;37633:7;37642:4;37581:26;:66::i;:::-;37669:8;:6;:8::i;:::-;37668:9;37660:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37342:392;;;;;;:::o;32518:898::-;32733:15;:2;:13;;;:15::i;:::-;32729:680;;;32803:2;32786:38;;;32847:8;32878:4;32905:2;32930:6;32959:4;32786:196;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32765:633;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;33271:6;33264:14;;;;;;;;;;;:::i;:::-;;;;;;;;32765:633;;;33320:62;;;;;;;;;;:::i;:::-;;;;;;;;32765:633;33057:43;;;33045:55;;;:8;:55;;;;33041:154;;33125:50;;;;;;;;;;:::i;:::-;;;;;;;;33041:154;32996:214;32729:680;32518:898;;;;;;:::o;33424:975::-;33664:15;:2;:13;;;:15::i;:::-;33660:732;;;33734:2;33717:43;;;33783:8;33814:4;33841:3;33867:7;33897:4;33717:203;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33696:685;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;34254:6;34247:14;;;;;;;;;;;:::i;:::-;;;;;;;;33696:685;;;34303:62;;;;;;;;;;:::i;:::-;;;;;;;;33696:685;34017:48;;;34005:60;;;:8;:60;;;;33979:199;;34108:50;;;;;;;;;;:::i;:::-;;;;;;;;33979:199;33934:259;33660:732;33424:975;;;;;;:::o;32289:221::-;;;;;;;:::o;8529:387::-;8589:4;8797:12;8864:7;8852:20;8844:28;;8907:1;8900:4;:8;8893:15;;;8529:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655: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:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2225:303::-;2296:5;2345:3;2338:4;2330:6;2326:17;2322:27;2312:2;;2363:1;2360;2353:12;2312:2;2403:6;2390:20;2428:94;2518:3;2510:6;2503:4;2495:6;2491:17;2428:94;:::i;:::-;2419:103;;2302:226;;;;;:::o;2551:303::-;2622:5;2671:3;2664:4;2656:6;2652:17;2648:27;2638:2;;2689:1;2686;2679:12;2638:2;2729:6;2716:20;2754:94;2844:3;2836:6;2829:4;2821:6;2817:17;2754:94;:::i;:::-;2745:103;;2628:226;;;;;:::o;2860:133::-;2903:5;2941:6;2928:20;2919:29;;2957:30;2981:5;2957:30;:::i;:::-;2909:84;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;3050:86;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3204:79;;;;:::o;3302:271::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:2;;3424:1;3421;3414:12;3373:2;3464:6;3451:20;3489:78;3563:3;3555:6;3548:4;3540:6;3536:17;3489:78;:::i;:::-;3480:87;;3363:210;;;;;:::o;3579:201::-;3665:5;3696:6;3690:13;3681:22;;3712:62;3768:5;3712:62;:::i;:::-;3671:109;;;;:::o;3800:273::-;3856:5;3905:3;3898:4;3890:6;3886:17;3882:27;3872:2;;3923:1;3920;3913:12;3872:2;3963:6;3950:20;3988:79;4063:3;4055:6;4048:4;4040:6;4036:17;3988:79;:::i;:::-;3979:88;;3862:211;;;;;:::o;4079:139::-;4125:5;4163:6;4150:20;4141:29;;4179:33;4206:5;4179:33;:::i;:::-;4131:87;;;;:::o;4224:143::-;4281:5;4312:6;4306:13;4297:22;;4328:33;4355:5;4328:33;:::i;:::-;4287:80;;;;:::o;4373:262::-;4432:6;4481:2;4469:9;4460:7;4456:23;4452:32;4449:2;;;4497:1;4494;4487:12;4449:2;4540:1;4565:53;4610:7;4601:6;4590:9;4586:22;4565:53;:::i;:::-;4555:63;;4511:117;4439:196;;;;:::o;4641:407::-;4709:6;4717;4766:2;4754:9;4745:7;4741:23;4737:32;4734:2;;;4782:1;4779;4772:12;4734:2;4825:1;4850:53;4895:7;4886:6;4875:9;4871:22;4850:53;:::i;:::-;4840:63;;4796:117;4952:2;4978:53;5023:7;5014:6;5003:9;4999:22;4978:53;:::i;:::-;4968:63;;4923:118;4724:324;;;;;:::o;5054:1241::-;5208:6;5216;5224;5232;5240;5289:3;5277:9;5268:7;5264:23;5260:33;5257:2;;;5306:1;5303;5296:12;5257:2;5349:1;5374:53;5419:7;5410:6;5399:9;5395:22;5374:53;:::i;:::-;5364:63;;5320:117;5476:2;5502:53;5547:7;5538:6;5527:9;5523:22;5502:53;:::i;:::-;5492:63;;5447:118;5632:2;5621:9;5617:18;5604:32;5663:18;5655:6;5652:30;5649:2;;;5695:1;5692;5685:12;5649:2;5723:78;5793:7;5784:6;5773:9;5769:22;5723:78;:::i;:::-;5713:88;;5575:236;5878:2;5867:9;5863:18;5850:32;5909:18;5901:6;5898:30;5895:2;;;5941:1;5938;5931:12;5895:2;5969:78;6039:7;6030:6;6019:9;6015:22;5969:78;:::i;:::-;5959:88;;5821:236;6124:3;6113:9;6109:19;6096:33;6156:18;6148:6;6145:30;6142:2;;;6188:1;6185;6178:12;6142:2;6216:62;6270:7;6261:6;6250:9;6246:22;6216:62;:::i;:::-;6206:72;;6067:221;5247:1048;;;;;;;;:::o;6301:955::-;6405:6;6413;6421;6429;6437;6486:3;6474:9;6465:7;6461:23;6457:33;6454:2;;;6503:1;6500;6493:12;6454:2;6546:1;6571:53;6616:7;6607:6;6596:9;6592:22;6571:53;:::i;:::-;6561:63;;6517:117;6673:2;6699:53;6744:7;6735:6;6724:9;6720:22;6699:53;:::i;:::-;6689:63;;6644:118;6801:2;6827:53;6872:7;6863:6;6852:9;6848:22;6827:53;:::i;:::-;6817:63;;6772:118;6929:2;6955:53;7000:7;6991:6;6980:9;6976:22;6955:53;:::i;:::-;6945:63;;6900:118;7085:3;7074:9;7070:19;7057:33;7117:18;7109:6;7106:30;7103:2;;;7149:1;7146;7139:12;7103:2;7177:62;7231:7;7222:6;7211:9;7207:22;7177:62;:::i;:::-;7167:72;;7028:221;6444:812;;;;;;;;:::o;7262:401::-;7327:6;7335;7384:2;7372:9;7363:7;7359:23;7355:32;7352:2;;;7400:1;7397;7390:12;7352:2;7443:1;7468:53;7513:7;7504:6;7493:9;7489:22;7468:53;:::i;:::-;7458:63;;7414:117;7570:2;7596:50;7638:7;7629:6;7618:9;7614:22;7596:50;:::i;:::-;7586:60;;7541:115;7342:321;;;;;:::o;7669:407::-;7737:6;7745;7794:2;7782:9;7773:7;7769:23;7765:32;7762:2;;;7810:1;7807;7800:12;7762:2;7853:1;7878:53;7923:7;7914:6;7903:9;7899:22;7878:53;:::i;:::-;7868:63;;7824:117;7980:2;8006:53;8051:7;8042:6;8031:9;8027:22;8006:53;:::i;:::-;7996:63;;7951:118;7752:324;;;;;:::o;8082:693::-;8200:6;8208;8257:2;8245:9;8236:7;8232:23;8228:32;8225:2;;;8273:1;8270;8263:12;8225:2;8344:1;8333:9;8329:17;8316:31;8374:18;8366:6;8363:30;8360:2;;;8406:1;8403;8396:12;8360:2;8434:78;8504:7;8495:6;8484:9;8480:22;8434:78;:::i;:::-;8424:88;;8287:235;8589:2;8578:9;8574:18;8561:32;8620:18;8612:6;8609:30;8606:2;;;8652:1;8649;8642:12;8606:2;8680:78;8750:7;8741:6;8730:9;8726:22;8680:78;:::i;:::-;8670:88;;8532:236;8215:560;;;;;:::o;8781:693::-;8899:6;8907;8956:2;8944:9;8935:7;8931:23;8927:32;8924:2;;;8972:1;8969;8962:12;8924:2;9043:1;9032:9;9028:17;9015:31;9073:18;9065:6;9062:30;9059:2;;;9105:1;9102;9095:12;9059:2;9133:78;9203:7;9194:6;9183:9;9179:22;9133:78;:::i;:::-;9123:88;;8986:235;9288:2;9277:9;9273:18;9260:32;9319:18;9311:6;9308:30;9305:2;;;9351:1;9348;9341:12;9305:2;9379:78;9449:7;9440:6;9429:9;9425:22;9379:78;:::i;:::-;9369:88;;9231:236;8914:560;;;;;:::o;9480:260::-;9538:6;9587:2;9575:9;9566:7;9562:23;9558:32;9555:2;;;9603:1;9600;9593:12;9555:2;9646:1;9671:52;9715:7;9706:6;9695:9;9691:22;9671:52;:::i;:::-;9661:62;;9617:116;9545:195;;;;:::o;9746:282::-;9815:6;9864:2;9852:9;9843:7;9839:23;9835:32;9832:2;;;9880:1;9877;9870:12;9832:2;9923:1;9948:63;10003:7;9994:6;9983:9;9979:22;9948:63;:::i;:::-;9938:73;;9894:127;9822:206;;;;:::o;10034:342::-;10133:6;10182:2;10170:9;10161:7;10157:23;10153:32;10150:2;;;10198:1;10195;10188:12;10150:2;10241:1;10266:93;10351:7;10342:6;10331:9;10327:22;10266:93;:::i;:::-;10256:103;;10212:157;10140:236;;;;:::o;10382:375::-;10451:6;10500:2;10488:9;10479:7;10475:23;10471:32;10468:2;;;10516:1;10513;10506:12;10468:2;10587:1;10576:9;10572:17;10559:31;10617:18;10609:6;10606:30;10603:2;;;10649:1;10646;10639:12;10603:2;10677:63;10732:7;10723:6;10712:9;10708:22;10677:63;:::i;:::-;10667:73;;10530:220;10458:299;;;;:::o;10763:262::-;10822:6;10871:2;10859:9;10850:7;10846:23;10842:32;10839:2;;;10887:1;10884;10877:12;10839:2;10930:1;10955:53;11000:7;10991:6;10980:9;10976:22;10955:53;:::i;:::-;10945:63;;10901:117;10829:196;;;;:::o;11031:284::-;11101:6;11150:2;11138:9;11129:7;11125:23;11121:32;11118:2;;;11166:1;11163;11156:12;11118:2;11209:1;11234:64;11290:7;11281:6;11270:9;11266:22;11234:64;:::i;:::-;11224:74;;11180:128;11108:207;;;;:::o;11321:179::-;11390:10;11411:46;11453:3;11445:6;11411:46;:::i;:::-;11489:4;11484:3;11480:14;11466:28;;11401:99;;;;:::o;11506:189::-;11627:61;11655:32;11681:5;11655:32;:::i;:::-;11627:61;:::i;:::-;11622:3;11615:74;11605:90;;:::o;11701:118::-;11788:24;11806:5;11788:24;:::i;:::-;11783:3;11776:37;11766:53;;:::o;11825:157::-;11930:45;11950:24;11968:5;11950:24;:::i;:::-;11930:45;:::i;:::-;11925:3;11918:58;11908:74;;:::o;12018:732::-;12137:3;12166:54;12214:5;12166:54;:::i;:::-;12236:86;12315:6;12310:3;12236:86;:::i;:::-;12229:93;;12346:56;12396:5;12346:56;:::i;:::-;12425:7;12456:1;12441:284;12466:6;12463:1;12460:13;12441:284;;;12542:6;12536:13;12569:63;12628:3;12613:13;12569:63;:::i;:::-;12562:70;;12655:60;12708:6;12655:60;:::i;:::-;12645:70;;12501:224;12488:1;12485;12481:9;12476:14;;12441:284;;;12445:14;12741:3;12734:10;;12142:608;;;;;;;:::o;12756:109::-;12837:21;12852:5;12837:21;:::i;:::-;12832:3;12825:34;12815:50;;:::o;12871:360::-;12957:3;12985:38;13017:5;12985:38;:::i;:::-;13039:70;13102:6;13097:3;13039:70;:::i;:::-;13032:77;;13118:52;13163:6;13158:3;13151:4;13144:5;13140:16;13118:52;:::i;:::-;13195:29;13217:6;13195:29;:::i;:::-;13190:3;13186:39;13179:46;;12961:270;;;;;:::o;13237:364::-;13325:3;13353:39;13386:5;13353:39;:::i;:::-;13408:71;13472:6;13467:3;13408:71;:::i;:::-;13401:78;;13488:52;13533:6;13528:3;13521:4;13514:5;13510:16;13488:52;:::i;:::-;13565:29;13587:6;13565:29;:::i;:::-;13560:3;13556:39;13549:46;;13329:272;;;;;:::o;13607:377::-;13713:3;13741:39;13774:5;13741:39;:::i;:::-;13796:89;13878:6;13873:3;13796:89;:::i;:::-;13789:96;;13894:52;13939:6;13934:3;13927:4;13920:5;13916:16;13894:52;:::i;:::-;13971:6;13966:3;13962:16;13955:23;;13717:267;;;;;:::o;14014:845::-;14117:3;14154:5;14148:12;14183:36;14209:9;14183:36;:::i;:::-;14235:89;14317:6;14312:3;14235:89;:::i;:::-;14228:96;;14355:1;14344:9;14340:17;14371:1;14366:137;;;;14517:1;14512:341;;;;14333:520;;14366:137;14450:4;14446:9;14435;14431:25;14426:3;14419:38;14486:6;14481:3;14477:16;14470:23;;14366:137;;14512:341;14579:38;14611:5;14579:38;:::i;:::-;14639:1;14653:154;14667:6;14664:1;14661:13;14653:154;;;14741:7;14735:14;14731:1;14726:3;14722:11;14715:35;14791:1;14782:7;14778:15;14767:26;;14689:4;14686:1;14682:12;14677:17;;14653:154;;;14836:6;14831:3;14827:16;14820:23;;14519:334;;14333:520;;14121:738;;;;;;:::o;14865:366::-;15007:3;15028:67;15092:2;15087:3;15028:67;:::i;:::-;15021:74;;15104:93;15193:3;15104:93;:::i;:::-;15222:2;15217:3;15213:12;15206:19;;15011:220;;;:::o;15237:366::-;15379:3;15400:67;15464:2;15459:3;15400:67;:::i;:::-;15393:74;;15476:93;15565:3;15476:93;:::i;:::-;15594:2;15589:3;15585:12;15578:19;;15383:220;;;:::o;15609:366::-;15751:3;15772:67;15836:2;15831:3;15772:67;:::i;:::-;15765:74;;15848:93;15937:3;15848:93;:::i;:::-;15966:2;15961:3;15957:12;15950:19;;15755:220;;;:::o;15981:366::-;16123:3;16144:67;16208:2;16203:3;16144:67;:::i;:::-;16137:74;;16220:93;16309:3;16220:93;:::i;:::-;16338:2;16333:3;16329:12;16322:19;;16127:220;;;:::o;16353:366::-;16495:3;16516:67;16580:2;16575:3;16516:67;:::i;:::-;16509:74;;16592:93;16681:3;16592:93;:::i;:::-;16710:2;16705:3;16701:12;16694:19;;16499:220;;;:::o;16725:366::-;16867:3;16888:67;16952:2;16947:3;16888:67;:::i;:::-;16881:74;;16964:93;17053:3;16964:93;:::i;:::-;17082:2;17077:3;17073:12;17066:19;;16871:220;;;:::o;17097:366::-;17239:3;17260:67;17324:2;17319:3;17260:67;:::i;:::-;17253:74;;17336:93;17425:3;17336:93;:::i;:::-;17454:2;17449:3;17445:12;17438:19;;17243:220;;;:::o;17469:366::-;17611:3;17632:67;17696:2;17691:3;17632:67;:::i;:::-;17625:74;;17708:93;17797:3;17708:93;:::i;:::-;17826:2;17821:3;17817:12;17810:19;;17615:220;;;:::o;17841:366::-;17983:3;18004:67;18068:2;18063:3;18004:67;:::i;:::-;17997:74;;18080:93;18169:3;18080:93;:::i;:::-;18198:2;18193:3;18189:12;18182:19;;17987:220;;;:::o;18213:366::-;18355:3;18376:67;18440:2;18435:3;18376:67;:::i;:::-;18369:74;;18452:93;18541:3;18452:93;:::i;:::-;18570:2;18565:3;18561:12;18554:19;;18359:220;;;:::o;18585:366::-;18727:3;18748:67;18812:2;18807:3;18748:67;:::i;:::-;18741:74;;18824:93;18913:3;18824:93;:::i;:::-;18942:2;18937:3;18933:12;18926:19;;18731:220;;;:::o;18957:366::-;19099:3;19120:67;19184:2;19179:3;19120:67;:::i;:::-;19113:74;;19196:93;19285:3;19196:93;:::i;:::-;19314:2;19309:3;19305:12;19298:19;;19103:220;;;:::o;19329:366::-;19471:3;19492:67;19556:2;19551:3;19492:67;:::i;:::-;19485:74;;19568:93;19657:3;19568:93;:::i;:::-;19686:2;19681:3;19677:12;19670:19;;19475:220;;;:::o;19701:366::-;19843:3;19864:67;19928:2;19923:3;19864:67;:::i;:::-;19857:74;;19940:93;20029:3;19940:93;:::i;:::-;20058:2;20053:3;20049:12;20042:19;;19847:220;;;:::o;20073:366::-;20215:3;20236:67;20300:2;20295:3;20236:67;:::i;:::-;20229:74;;20312:93;20401:3;20312:93;:::i;:::-;20430:2;20425:3;20421:12;20414:19;;20219:220;;;:::o;20445:366::-;20587:3;20608:67;20672:2;20667:3;20608:67;:::i;:::-;20601:74;;20684:93;20773:3;20684:93;:::i;:::-;20802:2;20797:3;20793:12;20786:19;;20591:220;;;:::o;20817:366::-;20959:3;20980:67;21044:2;21039:3;20980:67;:::i;:::-;20973:74;;21056:93;21145:3;21056:93;:::i;:::-;21174:2;21169:3;21165:12;21158:19;;20963:220;;;:::o;21189:366::-;21331:3;21352:67;21416:2;21411:3;21352:67;:::i;:::-;21345:74;;21428:93;21517:3;21428:93;:::i;:::-;21546:2;21541:3;21537:12;21530:19;;21335:220;;;:::o;21561:366::-;21703:3;21724:67;21788:2;21783:3;21724:67;:::i;:::-;21717:74;;21800:93;21889:3;21800:93;:::i;:::-;21918:2;21913:3;21909:12;21902:19;;21707:220;;;:::o;21933:366::-;22075:3;22096:67;22160:2;22155:3;22096:67;:::i;:::-;22089:74;;22172:93;22261:3;22172:93;:::i;:::-;22290:2;22285:3;22281:12;22274:19;;22079:220;;;:::o;22305:366::-;22447:3;22468:67;22532:2;22527:3;22468:67;:::i;:::-;22461:74;;22544:93;22633:3;22544:93;:::i;:::-;22662:2;22657:3;22653:12;22646:19;;22451:220;;;:::o;22677:366::-;22819:3;22840:67;22904:2;22899:3;22840:67;:::i;:::-;22833:74;;22916:93;23005:3;22916:93;:::i;:::-;23034:2;23029:3;23025:12;23018:19;;22823:220;;;:::o;23049:366::-;23191:3;23212:67;23276:2;23271:3;23212:67;:::i;:::-;23205:74;;23288:93;23377:3;23288:93;:::i;:::-;23406:2;23401:3;23397:12;23390:19;;23195:220;;;:::o;23421:366::-;23563:3;23584:67;23648:2;23643:3;23584:67;:::i;:::-;23577:74;;23660:93;23749:3;23660:93;:::i;:::-;23778:2;23773:3;23769:12;23762:19;;23567:220;;;:::o;23793:366::-;23935:3;23956:67;24020:2;24015:3;23956:67;:::i;:::-;23949:74;;24032:93;24121:3;24032:93;:::i;:::-;24150:2;24145:3;24141:12;24134:19;;23939:220;;;:::o;24165:400::-;24325:3;24346:84;24428:1;24423:3;24346:84;:::i;:::-;24339:91;;24439:93;24528:3;24439:93;:::i;:::-;24557:1;24552:3;24548:11;24541:18;;24329:236;;;:::o;24571:108::-;24648:24;24666:5;24648:24;:::i;:::-;24643:3;24636:37;24626:53;;:::o;24685:118::-;24772:24;24790:5;24772:24;:::i;:::-;24767:3;24760:37;24750:53;;:::o;24809:157::-;24914:45;24934:24;24952:5;24934:24;:::i;:::-;24914:45;:::i;:::-;24909:3;24902:58;24892:74;;:::o;24972:256::-;25084:3;25099:75;25170:3;25161:6;25099:75;:::i;:::-;25199:2;25194:3;25190:12;25183:19;;25219:3;25212:10;;25088:140;;;;:::o;25234:288::-;25362:3;25377:91;25464:3;25455:6;25377:91;:::i;:::-;25493:2;25488:3;25484:12;25477:19;;25513:3;25506:10;;25366:156;;;;:::o;25528:695::-;25806:3;25828:92;25916:3;25907:6;25828:92;:::i;:::-;25821:99;;25937:148;26081:3;25937:148;:::i;:::-;25930:155;;26102:95;26193:3;26184:6;26102:95;:::i;:::-;26095:102;;26214:3;26207:10;;25810:413;;;;;:::o;26229:397::-;26369:3;26384:75;26455:3;26446:6;26384:75;:::i;:::-;26484:2;26479:3;26475:12;26468:19;;26497:75;26568:3;26559:6;26497:75;:::i;:::-;26597:2;26592:3;26588:12;26581:19;;26617:3;26610:10;;26373:253;;;;;:::o;26632:222::-;26725:4;26763:2;26752:9;26748:18;26740:26;;26776:71;26844:1;26833:9;26829:17;26820:6;26776:71;:::i;:::-;26730:124;;;;:::o;26860:1053::-;27183:4;27221:3;27210:9;27206:19;27198:27;;27235:71;27303:1;27292:9;27288:17;27279:6;27235:71;:::i;:::-;27316:72;27384:2;27373:9;27369:18;27360:6;27316:72;:::i;:::-;27435:9;27429:4;27425:20;27420:2;27409:9;27405:18;27398:48;27463:108;27566:4;27557:6;27463:108;:::i;:::-;27455:116;;27618:9;27612:4;27608:20;27603:2;27592:9;27588:18;27581:48;27646:108;27749:4;27740:6;27646:108;:::i;:::-;27638:116;;27802:9;27796:4;27792:20;27786:3;27775:9;27771:19;27764:49;27830:76;27901:4;27892:6;27830:76;:::i;:::-;27822:84;;27188:725;;;;;;;;:::o;27919:751::-;28142:4;28180:3;28169:9;28165:19;28157:27;;28194:71;28262:1;28251:9;28247:17;28238:6;28194:71;:::i;:::-;28275:72;28343:2;28332:9;28328:18;28319:6;28275:72;:::i;:::-;28357;28425:2;28414:9;28410:18;28401:6;28357:72;:::i;:::-;28439;28507:2;28496:9;28492:18;28483:6;28439:72;:::i;:::-;28559:9;28553:4;28549:20;28543:3;28532:9;28528:19;28521:49;28587:76;28658:4;28649:6;28587:76;:::i;:::-;28579:84;;28147:523;;;;;;;;:::o;28676:373::-;28819:4;28857:2;28846:9;28842:18;28834:26;;28906:9;28900:4;28896:20;28892:1;28881:9;28877:17;28870:47;28934:108;29037:4;29028:6;28934:108;:::i;:::-;28926:116;;28824:225;;;;:::o;29055:634::-;29276:4;29314:2;29303:9;29299:18;29291:26;;29363:9;29357:4;29353:20;29349:1;29338:9;29334:17;29327:47;29391:108;29494:4;29485:6;29391:108;:::i;:::-;29383:116;;29546:9;29540:4;29536:20;29531:2;29520:9;29516:18;29509:48;29574:108;29677:4;29668:6;29574:108;:::i;:::-;29566:116;;29281:408;;;;;:::o;29695:210::-;29782:4;29820:2;29809:9;29805:18;29797:26;;29833:65;29895:1;29884:9;29880:17;29871:6;29833:65;:::i;:::-;29787:118;;;;:::o;29911:313::-;30024:4;30062:2;30051:9;30047:18;30039:26;;30111:9;30105:4;30101:20;30097:1;30086:9;30082:17;30075:47;30139:78;30212:4;30203:6;30139:78;:::i;:::-;30131:86;;30029:195;;;;:::o;30230:419::-;30396:4;30434:2;30423:9;30419:18;30411:26;;30483:9;30477:4;30473:20;30469:1;30458:9;30454:17;30447:47;30511:131;30637:4;30511:131;:::i;:::-;30503:139;;30401:248;;;:::o;30655:419::-;30821:4;30859:2;30848:9;30844:18;30836:26;;30908:9;30902:4;30898:20;30894:1;30883:9;30879:17;30872:47;30936:131;31062:4;30936:131;:::i;:::-;30928:139;;30826:248;;;:::o;31080:419::-;31246:4;31284:2;31273:9;31269:18;31261:26;;31333:9;31327:4;31323:20;31319:1;31308:9;31304:17;31297:47;31361:131;31487:4;31361:131;:::i;:::-;31353:139;;31251:248;;;:::o;31505:419::-;31671:4;31709:2;31698:9;31694:18;31686:26;;31758:9;31752:4;31748:20;31744:1;31733:9;31729:17;31722:47;31786:131;31912:4;31786:131;:::i;:::-;31778:139;;31676:248;;;:::o;31930:419::-;32096:4;32134:2;32123:9;32119:18;32111:26;;32183:9;32177:4;32173:20;32169:1;32158:9;32154:17;32147:47;32211:131;32337:4;32211:131;:::i;:::-;32203:139;;32101:248;;;:::o;32355:419::-;32521:4;32559:2;32548:9;32544:18;32536:26;;32608:9;32602:4;32598:20;32594:1;32583:9;32579:17;32572:47;32636:131;32762:4;32636:131;:::i;:::-;32628:139;;32526:248;;;:::o;32780:419::-;32946:4;32984:2;32973:9;32969:18;32961:26;;33033:9;33027:4;33023:20;33019:1;33008:9;33004:17;32997:47;33061:131;33187:4;33061:131;:::i;:::-;33053:139;;32951:248;;;:::o;33205:419::-;33371:4;33409:2;33398:9;33394:18;33386:26;;33458:9;33452:4;33448:20;33444:1;33433:9;33429:17;33422:47;33486:131;33612:4;33486:131;:::i;:::-;33478:139;;33376:248;;;:::o;33630:419::-;33796:4;33834:2;33823:9;33819:18;33811:26;;33883:9;33877:4;33873:20;33869:1;33858:9;33854:17;33847:47;33911:131;34037:4;33911:131;:::i;:::-;33903:139;;33801:248;;;:::o;34055:419::-;34221:4;34259:2;34248:9;34244:18;34236:26;;34308:9;34302:4;34298:20;34294:1;34283:9;34279:17;34272:47;34336:131;34462:4;34336:131;:::i;:::-;34328:139;;34226:248;;;:::o;34480:419::-;34646:4;34684:2;34673:9;34669:18;34661:26;;34733:9;34727:4;34723:20;34719:1;34708:9;34704:17;34697:47;34761:131;34887:4;34761:131;:::i;:::-;34753:139;;34651:248;;;:::o;34905:419::-;35071:4;35109:2;35098:9;35094:18;35086:26;;35158:9;35152:4;35148:20;35144:1;35133:9;35129:17;35122:47;35186:131;35312:4;35186:131;:::i;:::-;35178:139;;35076:248;;;:::o;35330:419::-;35496:4;35534:2;35523:9;35519:18;35511:26;;35583:9;35577:4;35573:20;35569:1;35558:9;35554:17;35547:47;35611:131;35737:4;35611:131;:::i;:::-;35603:139;;35501:248;;;:::o;35755:419::-;35921:4;35959:2;35948:9;35944:18;35936:26;;36008:9;36002:4;35998:20;35994:1;35983:9;35979:17;35972:47;36036:131;36162:4;36036:131;:::i;:::-;36028:139;;35926:248;;;:::o;36180:419::-;36346:4;36384:2;36373:9;36369:18;36361:26;;36433:9;36427:4;36423:20;36419:1;36408:9;36404:17;36397:47;36461:131;36587:4;36461:131;:::i;:::-;36453:139;;36351:248;;;:::o;36605:419::-;36771:4;36809:2;36798:9;36794:18;36786:26;;36858:9;36852:4;36848:20;36844:1;36833:9;36829:17;36822:47;36886:131;37012:4;36886:131;:::i;:::-;36878:139;;36776:248;;;:::o;37030:419::-;37196:4;37234:2;37223:9;37219:18;37211:26;;37283:9;37277:4;37273:20;37269:1;37258:9;37254:17;37247:47;37311:131;37437:4;37311:131;:::i;:::-;37303:139;;37201:248;;;:::o;37455:419::-;37621:4;37659:2;37648:9;37644:18;37636:26;;37708:9;37702:4;37698:20;37694:1;37683:9;37679:17;37672:47;37736:131;37862:4;37736:131;:::i;:::-;37728:139;;37626:248;;;:::o;37880:419::-;38046:4;38084:2;38073:9;38069:18;38061:26;;38133:9;38127:4;38123:20;38119:1;38108:9;38104:17;38097:47;38161:131;38287:4;38161:131;:::i;:::-;38153:139;;38051:248;;;:::o;38305:419::-;38471:4;38509:2;38498:9;38494:18;38486:26;;38558:9;38552:4;38548:20;38544:1;38533:9;38529:17;38522:47;38586:131;38712:4;38586:131;:::i;:::-;38578:139;;38476:248;;;:::o;38730:419::-;38896:4;38934:2;38923:9;38919:18;38911:26;;38983:9;38977:4;38973:20;38969:1;38958:9;38954:17;38947:47;39011:131;39137:4;39011:131;:::i;:::-;39003:139;;38901:248;;;:::o;39155:419::-;39321:4;39359:2;39348:9;39344:18;39336:26;;39408:9;39402:4;39398:20;39394:1;39383:9;39379:17;39372:47;39436:131;39562:4;39436:131;:::i;:::-;39428:139;;39326:248;;;:::o;39580:419::-;39746:4;39784:2;39773:9;39769:18;39761:26;;39833:9;39827:4;39823:20;39819:1;39808:9;39804:17;39797:47;39861:131;39987:4;39861:131;:::i;:::-;39853:139;;39751:248;;;:::o;40005:419::-;40171:4;40209:2;40198:9;40194:18;40186:26;;40258:9;40252:4;40248:20;40244:1;40233:9;40229:17;40222:47;40286:131;40412:4;40286:131;:::i;:::-;40278:139;;40176:248;;;:::o;40430:419::-;40596:4;40634:2;40623:9;40619:18;40611:26;;40683:9;40677:4;40673:20;40669:1;40658:9;40654:17;40647:47;40711:131;40837:4;40711:131;:::i;:::-;40703:139;;40601:248;;;:::o;40855:222::-;40948:4;40986:2;40975:9;40971:18;40963:26;;40999:71;41067:1;41056:9;41052:17;41043:6;40999:71;:::i;:::-;40953:124;;;;:::o;41083:332::-;41204:4;41242:2;41231:9;41227:18;41219:26;;41255:71;41323:1;41312:9;41308:17;41299:6;41255:71;:::i;:::-;41336:72;41404:2;41393:9;41389:18;41380:6;41336:72;:::i;:::-;41209:206;;;;;:::o;41421:129::-;41455:6;41482:20;;:::i;:::-;41472:30;;41511:33;41539:4;41531:6;41511:33;:::i;:::-;41462:88;;;:::o;41556:75::-;41589:6;41622:2;41616:9;41606:19;;41596:35;:::o;41637:311::-;41714:4;41804:18;41796:6;41793:30;41790:2;;;41826:18;;:::i;:::-;41790:2;41876:4;41868:6;41864:17;41856:25;;41936:4;41930;41926:15;41918:23;;41719:229;;;:::o;41954:311::-;42031:4;42121:18;42113:6;42110:30;42107:2;;;42143:18;;:::i;:::-;42107:2;42193:4;42185:6;42181:17;42173:25;;42253:4;42247;42243:15;42235:23;;42036:229;;;:::o;42271:307::-;42332:4;42422:18;42414:6;42411:30;42408:2;;;42444:18;;:::i;:::-;42408:2;42482:29;42504:6;42482:29;:::i;:::-;42474:37;;42566:4;42560;42556:15;42548:23;;42337:241;;;:::o;42584:308::-;42646:4;42736:18;42728:6;42725:30;42722:2;;;42758:18;;:::i;:::-;42722:2;42796:29;42818:6;42796:29;:::i;:::-;42788:37;;42880:4;42874;42870:15;42862:23;;42651:241;;;:::o;42898:132::-;42965:4;42988:3;42980:11;;43018:4;43013:3;43009:14;43001:22;;42970:60;;;:::o;43036:141::-;43085:4;43108:3;43100:11;;43131:3;43128:1;43121:14;43165:4;43162:1;43152:18;43144:26;;43090:87;;;:::o;43183:114::-;43250:6;43284:5;43278:12;43268:22;;43257:40;;;:::o;43303:98::-;43354:6;43388:5;43382:12;43372:22;;43361:40;;;:::o;43407:99::-;43459:6;43493:5;43487:12;43477:22;;43466:40;;;:::o;43512:113::-;43582:4;43614;43609:3;43605:14;43597:22;;43587:38;;;:::o;43631:184::-;43730:11;43764:6;43759:3;43752:19;43804:4;43799:3;43795:14;43780:29;;43742:73;;;;:::o;43821:168::-;43904:11;43938:6;43933:3;43926:19;43978:4;43973:3;43969:14;43954:29;;43916:73;;;;:::o;43995:169::-;44079:11;44113:6;44108:3;44101:19;44153:4;44148:3;44144:14;44129:29;;44091:73;;;;:::o;44170:148::-;44272:11;44309:3;44294:18;;44284:34;;;;:::o;44324:305::-;44364:3;44383:20;44401:1;44383:20;:::i;:::-;44378:25;;44417:20;44435:1;44417:20;:::i;:::-;44412:25;;44571:1;44503:66;44499:74;44496:1;44493:81;44490:2;;;44577:18;;:::i;:::-;44490:2;44621:1;44618;44614:9;44607:16;;44368:261;;;;:::o;44635:237::-;44673:3;44692:18;44708:1;44692:18;:::i;:::-;44687:23;;44724:18;44740:1;44724:18;:::i;:::-;44719:23;;44814:1;44808:4;44804:12;44801:1;44798:19;44795:2;;;44820:18;;:::i;:::-;44795:2;44864:1;44861;44857:9;44850:16;;44677:195;;;;:::o;44878:185::-;44918:1;44935:20;44953:1;44935:20;:::i;:::-;44930:25;;44969:20;44987:1;44969:20;:::i;:::-;44964:25;;45008:1;44998:2;;45013:18;;:::i;:::-;44998:2;45055:1;45052;45048:9;45043:14;;44920:143;;;;:::o;45069:348::-;45109:7;45132:20;45150:1;45132:20;:::i;:::-;45127:25;;45166:20;45184:1;45166:20;:::i;:::-;45161:25;;45354:1;45286:66;45282:74;45279:1;45276:81;45271:1;45264:9;45257:17;45253:105;45250:2;;;45361:18;;:::i;:::-;45250:2;45409:1;45406;45402:9;45391:20;;45117:300;;;;:::o;45423:191::-;45463:4;45483:20;45501:1;45483:20;:::i;:::-;45478:25;;45517:20;45535:1;45517:20;:::i;:::-;45512:25;;45556:1;45553;45550:8;45547:2;;;45561:18;;:::i;:::-;45547:2;45606:1;45603;45599:9;45591:17;;45468:146;;;;:::o;45620:96::-;45657:7;45686:24;45704:5;45686:24;:::i;:::-;45675:35;;45665:51;;;:::o;45722:104::-;45767:7;45796:24;45814:5;45796:24;:::i;:::-;45785:35;;45775:51;;;:::o;45832:90::-;45866:7;45909:5;45902:13;45895:21;45884:32;;45874:48;;;:::o;45928:149::-;45964:7;46004:66;45997:5;45993:78;45982:89;;45972:105;;;:::o;46083:125::-;46149:7;46178:24;46196:5;46178:24;:::i;:::-;46167:35;;46157:51;;;:::o;46214:126::-;46251:7;46291:42;46284:5;46280:54;46269:65;;46259:81;;;:::o;46346:77::-;46383:7;46412:5;46401:16;;46391:32;;;:::o;46429:86::-;46464:7;46504:4;46497:5;46493:16;46482:27;;46472:43;;;:::o;46521:154::-;46605:6;46600:3;46595;46582:30;46667:1;46658:6;46653:3;46649:16;46642:27;46572:103;;;:::o;46681:307::-;46749:1;46759:113;46773:6;46770:1;46767:13;46759:113;;;46858:1;46853:3;46849:11;46843:18;46839:1;46834:3;46830:11;46823:39;46795:2;46792:1;46788:10;46783:15;;46759:113;;;46890:6;46887:1;46884:13;46881:2;;;46970:1;46961:6;46956:3;46952:16;46945:27;46881:2;46730:258;;;;:::o;46994:320::-;47038:6;47075:1;47069:4;47065:12;47055:22;;47122:1;47116:4;47112:12;47143:18;47133:2;;47199:4;47191:6;47187:17;47177:27;;47133:2;47261;47253:6;47250:14;47230:18;47227:38;47224:2;;;47280:18;;:::i;:::-;47224:2;47045:269;;;;:::o;47320:281::-;47403:27;47425:4;47403:27;:::i;:::-;47395:6;47391:40;47533:6;47521:10;47518:22;47497:18;47485:10;47482:34;47479:62;47476:2;;;47544:18;;:::i;:::-;47476:2;47584:10;47580:2;47573:22;47363:238;;;:::o;47607:233::-;47646:3;47669:24;47687:5;47669:24;:::i;:::-;47660:33;;47715:66;47708:5;47705:77;47702:2;;;47785:18;;:::i;:::-;47702:2;47832:1;47825:5;47821:13;47814:20;;47650:190;;;:::o;47846:100::-;47885:7;47914:26;47934:5;47914:26;:::i;:::-;47903:37;;47893:53;;;:::o;47952:108::-;47999:7;48028:26;48048:5;48028:26;:::i;:::-;48017:37;;48007:53;;;:::o;48066:94::-;48105:7;48134:20;48148:5;48134:20;:::i;:::-;48123:31;;48113:47;;;:::o;48166:79::-;48205:7;48234:5;48223:16;;48213:32;;;:::o;48251:180::-;48299:77;48296:1;48289:88;48396:4;48393:1;48386:15;48420:4;48417:1;48410:15;48437:180;48485:77;48482:1;48475:88;48582:4;48579:1;48572:15;48606:4;48603:1;48596:15;48623:180;48671:77;48668:1;48661:88;48768:4;48765:1;48758:15;48792:4;48789:1;48782:15;48809:180;48857:77;48854:1;48847:88;48954:4;48951:1;48944:15;48978:4;48975:1;48968:15;48995:183;49030:3;49068:1;49050:16;49047:23;49044:2;;;49106:1;49103;49100;49085:23;49128:34;49159:1;49153:8;49128:34;:::i;:::-;49121:41;;49044:2;49034:144;:::o;49184:102::-;49225:6;49276:2;49272:7;49267:2;49260:5;49256:14;49252:28;49242:38;;49232:54;;;:::o;49292:94::-;49325:8;49373:5;49369:2;49365:14;49344:35;;49334:52;;;:::o;49392:106::-;49436:8;49485:5;49480:3;49476:15;49455:36;;49445:53;;;:::o;49504:239::-;49644:34;49640:1;49632:6;49628:14;49621:58;49713:22;49708:2;49700:6;49696:15;49689:47;49610:133;:::o;49749:227::-;49889:34;49885:1;49877:6;49873:14;49866:58;49958:10;49953:2;49945:6;49941:15;49934:35;49855:121;:::o;49982:170::-;50122:22;50118:1;50110:6;50106:14;50099:46;50088:64;:::o;50158:171::-;50298:23;50294:1;50286:6;50282:14;50275:47;50264:65;:::o;50335:230::-;50475:34;50471:1;50463:6;50459:14;50452:58;50544:13;50539:2;50531:6;50527:15;50520:38;50441:124;:::o;50571:225::-;50711:34;50707:1;50699:6;50695:14;50688:58;50780:8;50775:2;50767:6;50763:15;50756:33;50677:119;:::o;50802:172::-;50942:24;50938:1;50930:6;50926:14;50919:48;50908:66;:::o;50980:235::-;51120:34;51116:1;51108:6;51104:14;51097:58;51189:18;51184:2;51176:6;51172:15;51165:43;51086:129;:::o;51221:231::-;51361:34;51357:1;51349:6;51345:14;51338:58;51430:14;51425:2;51417:6;51413:15;51406:39;51327:125;:::o;51458:228::-;51598:34;51594:1;51586:6;51582:14;51575:58;51667:11;51662:2;51654:6;51650:15;51643:36;51564:122;:::o;51692:234::-;51832:34;51828:1;51820:6;51816:14;51809:58;51901:17;51896:2;51888:6;51884:15;51877:42;51798:128;:::o;51932:166::-;52072:18;52068:1;52060:6;52056:14;52049:42;52038:60;:::o;52104:178::-;52244:30;52240:1;52232:6;52228:14;52221:54;52210:72;:::o;52288:224::-;52428:34;52424:1;52416:6;52412:14;52405:58;52497:7;52492:2;52484:6;52480:15;52473:32;52394:118;:::o;52518:237::-;52658:34;52654:1;52646:6;52642:14;52635:58;52727:20;52722:2;52714:6;52710:15;52703:45;52624:131;:::o;52761:177::-;52901:29;52897:1;52889:6;52885:14;52878:53;52867:71;:::o;52944:229::-;53084:34;53080:1;53072:6;53068:14;53061:58;53153:12;53148:2;53140:6;53136:15;53129:37;53050:123;:::o;53179:182::-;53319:34;53315:1;53307:6;53303:14;53296:58;53285:76;:::o;53367:220::-;53507:34;53503:1;53495:6;53491:14;53484:58;53576:3;53571:2;53563:6;53559:15;53552:28;53473:114;:::o;53593:168::-;53733:20;53729:1;53721:6;53717:14;53710:44;53699:62;:::o;53767:228::-;53907:34;53903:1;53895:6;53891:14;53884:58;53976:11;53971:2;53963:6;53959:15;53952:36;53873:122;:::o;54001:228::-;54141:34;54137:1;54129:6;54125:14;54118:58;54210:11;54205:2;54197:6;54193:15;54186:36;54107:122;:::o;54235:227::-;54375:34;54371:1;54363:6;54359:14;54352:58;54444:10;54439:2;54431:6;54427:15;54420:35;54341:121;:::o;54468:220::-;54608:34;54604:1;54596:6;54592:14;54585:58;54677:3;54672:2;54664:6;54660:15;54653:28;54574:114;:::o;54694:181::-;54834:33;54830:1;54822:6;54818:14;54811:57;54800:75;:::o;54881:151::-;55021:3;55017:1;55009:6;55005:14;54998:27;54987:45;:::o;55038:711::-;55077:3;55115:4;55097:16;55094:26;55091:2;;;55123:5;;55091:2;55152:20;;:::i;:::-;55227:1;55209:16;55205:24;55202:1;55196:4;55181:49;55260:4;55254:11;55359:16;55352:4;55344:6;55340:17;55337:39;55304:18;55296:6;55293:30;55277:113;55274:2;;;55405:5;;;;55274:2;55451:6;55445:4;55441:17;55487:3;55481:10;55514:18;55506:6;55503:30;55500:2;;;55536:5;;;;;;55500:2;55584:6;55577:4;55572:3;55568:14;55564:27;55643:1;55625:16;55621:24;55615:4;55611:35;55606:3;55603:44;55600:2;;;55650:5;;;;;;;55600:2;55667:57;55715:6;55709:4;55705:17;55697:6;55693:30;55687:4;55667:57;:::i;:::-;55740:3;55733:10;;55081:668;;;;;;;:::o;55755:122::-;55828:24;55846:5;55828:24;:::i;:::-;55821:5;55818:35;55808:2;;55867:1;55864;55857:12;55808:2;55798:79;:::o;55883:116::-;55953:21;55968:5;55953:21;:::i;:::-;55946:5;55943:32;55933:2;;55989:1;55986;55979:12;55933:2;55923:76;:::o;56005:120::-;56077:23;56094:5;56077:23;:::i;:::-;56070:5;56067:34;56057:2;;56115:1;56112;56105:12;56057:2;56047:78;:::o;56131:180::-;56233:53;56280:5;56233:53;:::i;:::-;56226:5;56223:64;56213:2;;56301:1;56298;56291:12;56213:2;56203:108;:::o;56317:122::-;56390:24;56408:5;56390:24;:::i;:::-;56383:5;56380:35;56370:2;;56429:1;56426;56419:12;56370:2;56360:79;:::o

Swarm Source

ipfs://4d9a21fb14d2dbd69305114db827f46324d1d29e93651bc5b6f47c73234324d9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.