ETH Price: $3,378.89 (-7.90%)

Token

NEWKINOERC1155FORGALA (NEWKINO1155GALA)
 

Overview

Max Total Supply

2,274 NEWKINO1155GALA

Holders

1,473

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xc2c6903c19aeebcaab96bba2412204229f0f7576
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Will you play the game or will you change the game in your Gala Genesis Curry Flow shoes?

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NewkinoERC1155TokenForGala

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-29
*/

// File: @openzeppelin\contracts\utils\math\SafeMath.sol

// SPDX-License-Identifier: MIT and UNLICENSED
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

// File: node_modules\@openzeppelin\contracts\utils\introspection\IERC165.sol

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

pragma solidity ^0.8.0;

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

// File: node_modules\@openzeppelin\contracts\interfaces\IERC165.sol

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;

// File: @openzeppelin\contracts\interfaces\IERC2981.sol

// OpenZeppelin Contracts v4.4.1 (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: node_modules\@openzeppelin\contracts\utils\introspection\ERC165.sol

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

pragma solidity ^0.8.0;


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

// File: @openzeppelin\contracts\utils\introspection\ERC165Storage.sol

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

pragma solidity ^0.8.0;


/**
 * @dev Storage based implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165Storage is ERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


// File: node_modules\@openzeppelin\contracts\token\ERC1155\IERC1155.sol

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: node_modules\@openzeppelin\contracts\token\ERC1155\IERC1155Receiver.sol

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

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        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);
}

// File: node_modules\@openzeppelin\contracts\token\ERC1155\extensions\IERC1155MetadataURI.sol

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

pragma solidity ^0.8.0;


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

// File: node_modules\@openzeppelin\contracts\utils\Address.sol

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

pragma solidity ^0.8.0;

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

// File: node_modules\@openzeppelin\contracts\utils\Context.sol

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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin\contracts\token\ERC1155\ERC1155.sol

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

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

        return array;
    }
}

// File: @openzeppelin\contracts\access\Ownable.sol

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: @openzeppelin\contracts\utils\Strings.sol

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

pragma solidity ^0.8.0;

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

// File: node_modules\@openzeppelin\contracts\access\IAccessControl.sol

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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


// File: @openzeppelin\contracts\access\AccessControl.sol

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

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: contracts\roles\MinterRole.sol

pragma solidity ^0.8.3;


contract MinterRole is AccessControl {
    
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");

    modifier onlyAdmin() {
        require(isAdmin(_msgSender()), "Ownable: caller is not the admin");
        _;
    }

    modifier onlyMinter() {
        require(isMinter(_msgSender()), "Ownable: caller is not the minter");
        _;
    }

    constructor() {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
    }

    function addMinter(address _account) public onlyAdmin {
        _setupRole(MINTER_ROLE, _account);
    }

    function removeMinter(address _account) public onlyAdmin {
        revokeRole(MINTER_ROLE, _account);
    }

    function addAdmin(address _account) public onlyAdmin {
        _setupRole(DEFAULT_ADMIN_ROLE , _account);
    }

    function removeAdmin(address _account) public onlyAdmin {
        revokeRole(DEFAULT_ADMIN_ROLE , _account);
    }

    function isMinter(address _account) internal virtual view returns(bool) {
        return hasRole(MINTER_ROLE, _account);
    }

    function isAdmin(address _account) internal virtual view returns(bool) {
        return hasRole(DEFAULT_ADMIN_ROLE , _account);
    }
}

// File: contracts\token\IGalaNft.sol

pragma solidity ^0.8.3;

interface IGalaNft {
    function mintQuantities(address _user, uint _tokenId) external view returns (uint);
    function setMintQuantities(address _user, uint _tokenId, uint _quantity) external;
}

// File: contracts\token\NewkinoERC1155TokenForGala.sol

pragma solidity ^0.8.3;











contract NewkinoERC1155TokenForGala is IERC2981, ERC165Storage, Ownable, IERC1155MetadataURI, ERC1155, MinterRole {
    using Strings for uint256;
    using SafeMath for uint256;

    bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;

    string public name;
    string public symbol;

    IGalaNft public immutable oldGala;
    /// @dev royalty percent of 2nd sale. ex: 1 = 1%.
    address public immutable royalty;

    uint256 public constant royaltyPercent = 10;

    uint public constant endValue = 10000;
    // address => tokenId => quantity
    mapping (address => mapping(uint => uint)) public mintQuantities;

    //Token URI prefix
    string public tokenURIPrefix;

    /**
     * @dev Constructor Function
     * @param _name name of the token ex: Rarible
     * @param _symbol symbol of the token ex: RARI
     * @param _tokenURIPrefix token URI Prefix
    */
    constructor(
        string memory _name, 
        string memory _symbol, 
        string memory _tokenURIPrefix, 
        address _royalty,
        IGalaNft _oldGala
    ) ERC1155(_tokenURIPrefix) {
        name = _name;
        symbol = _symbol;
        tokenURIPrefix = _tokenURIPrefix;
        royalty = _royalty;
        oldGala = _oldGala;
        addAdmin(_msgSender());
        addMinter(_msgSender());
        _registerInterface(_INTERFACE_ID_ERC2981);
    }

    // Creates a new token type and assings _initialSupply to minter
    function safeMint(address _beneficiary, uint256 _id, uint256 _supply) internal {
        require(_supply != 0, "Supply should be positive");

        _mint(_beneficiary, _id, _supply, "");
    }

    /**
     * @dev public function to set the token URI prefix.
     * @param _tokenURIPrefix string URI prefix to assign
     */
    function _setTokenURIPrefix(string memory _tokenURIPrefix) public onlyAdmin {
        tokenURIPrefix = _tokenURIPrefix;
    }

    function setMintQuantities(address minter, uint tokenId, uint quantity) external onlyAdmin {
        require(minter != address(0), "minter address is not valid");
        require(tokenId >=1 && tokenId <=5, "tokenId should be from 1 to 5");
        require(quantity > 0, "quantity should be over 0");
        mintQuantities[minter][tokenId] = quantity;
    }

    function uri(uint256 _id) override(ERC1155, IERC1155MetadataURI) virtual public view returns (string memory) {
        return bytes(tokenURIPrefix).length > 0 ? string(abi.encodePacked(tokenURIPrefix, _id.toString())) : "";
    }

    function claim(uint256[] calldata _tokenIds, uint256[] calldata _supplies) external {
        require(_tokenIds.length == _supplies.length, "length should be the same");
        for(uint i = 0; i < _tokenIds.length; i++)
            require(oldGala.mintQuantities(msg.sender, _tokenIds[i]) == _supplies[i] && _supplies[i] != endValue, "supply is not valid");
        for(uint i = 0; i < _tokenIds.length; i++) {
            safeMint(msg.sender, _tokenIds[i], _supplies[i]);
            oldGala.setMintQuantities(msg.sender, _tokenIds[i], endValue);
        }
    }

    function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override(IERC2981) returns (address receiver, uint256 royaltyAmount) {
        receiver = royalty;
        royaltyAmount = salePrice.mul(royaltyPercent).div(100);
    }

    function supportsInterface(bytes4 interfaceId) public view override(IERC165, ERC165Storage, ERC1155, AccessControl) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            interfaceId == type(IAccessControl).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_tokenURIPrefix","type":"string"},{"internalType":"address","name":"_royalty","type":"address"},{"internalType":"contract IGalaNft","name":"_oldGala","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURIPrefix","type":"string"}],"name":"_setTokenURIPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_supplies","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintQuantities","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":"oldGala","outputs":[{"internalType":"contract IGalaNft","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setMintQuantities","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURIPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b5060405162005ad338038062005ad383398181016040528101906200003791906200076a565b82620000586200004c620001aa60201b60201c565b620001b260201b60201c565b62000069816200027860201b60201c565b506200008e6000801b62000082620001aa60201b60201c565b6200029460201b60201c565b8460069080519060200190620000a69291906200060e565b508360079080519060200190620000bf9291906200060e565b508260099080519060200190620000d89291906200060e565b508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050620001676200015b620001aa60201b60201c565b620002aa60201b60201c565b620001876200017b620001aa60201b60201c565b6200032460201b60201c565b6200019f632a55205a60e01b620003bb60201b60201c565b505050505062000b44565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060049080519060200190620002909291906200060e565b5050565b620002a682826200049360201b60201c565b5050565b620002ca620002be620001aa60201b60201c565b6200058560201b60201c565b6200030c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030390620008bf565b60405180910390fd5b620003216000801b826200029460201b60201c565b50565b6200034462000338620001aa60201b60201c565b6200058560201b60201c565b62000386576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200037d90620008bf565b60405180910390fd5b620003b87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6826200029460201b60201c565b50565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000427576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041e906200089d565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b620004a58282620005a360201b60201c565b620005815760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000526620001aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006200059c6000801b83620005a360201b60201c565b9050919050565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8280546200061c90620009cf565b90600052602060002090601f0160209004810192826200064057600085556200068c565b82601f106200065b57805160ff19168380011785556200068c565b828001600101855582156200068c579182015b828111156200068b5782518255916020019190600101906200066e565b5b5090506200069b91906200069f565b5090565b5b80821115620006ba576000816000905550600101620006a0565b5090565b6000620006d5620006cf846200090a565b620008e1565b905082815260208101848484011115620006f457620006f362000a9e565b5b6200070184828562000999565b509392505050565b6000815190506200071a8162000b10565b92915050565b600081519050620007318162000b2a565b92915050565b600082601f8301126200074f576200074e62000a99565b5b815162000761848260208601620006be565b91505092915050565b600080600080600060a0868803121562000789576200078862000aa8565b5b600086015167ffffffffffffffff811115620007aa57620007a962000aa3565b5b620007b88882890162000737565b955050602086015167ffffffffffffffff811115620007dc57620007db62000aa3565b5b620007ea8882890162000737565b945050604086015167ffffffffffffffff8111156200080e576200080d62000aa3565b5b6200081c8882890162000737565b93505060606200082f8882890162000709565b9250506080620008428882890162000720565b9150509295509295909350565b60006200085e601c8362000940565b91506200086b8262000abe565b602082019050919050565b60006200088560208362000940565b9150620008928262000ae7565b602082019050919050565b60006020820190508181036000830152620008b8816200084f565b9050919050565b60006020820190508181036000830152620008da8162000876565b9050919050565b6000620008ed62000900565b9050620008fb828262000a05565b919050565b6000604051905090565b600067ffffffffffffffff82111562000928576200092762000a6a565b5b620009338262000aad565b9050602081019050919050565b600082825260208201905092915050565b60006200095e8262000979565b9050919050565b6000620009728262000951565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620009b95780820151818401526020810190506200099c565b83811115620009c9576000848401525b50505050565b60006002820490506001821680620009e857607f821691505b60208210811415620009ff57620009fe62000a3b565b5b50919050565b62000a108262000aad565b810181811067ffffffffffffffff8211171562000a325762000a3162000a6a565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e600082015250565b62000b1b8162000951565b811462000b2757600080fd5b50565b62000b358162000965565b811462000b4157600080fd5b50565b60805160601c60a05160601c614f4e62000b8560003960008181610ce40152610d0b0152600081816109ed01528181610b770152610c410152614f4e6000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c80634e1273f41161011a5780639f67756d116100ad578063d53913931161007c578063d5391393146105d7578063d547741f146105f5578063e985e9c514610611578063f242432a14610641578063f2fde38b1461065d57610205565b80639f67756d14610561578063a217fddf1461057f578063a22cb4651461059d578063c0ac9983146105b957610205565b80638da5cb5b116100e95780638da5cb5b146104d957806391d14854146104f757806395d89b4114610527578063983b2d561461054557610205565b80634e1273f414610467578063538a94801461049757806370480275146104b3578063715018a6146104cf57610205565b8063248a9ca31161019d5780632eb2c2d61161016c5780632eb2c2d6146103db5780632f2ff15d146103f75780633092afd51461041357806336568abe1461042f5780633f5645081461044b57610205565b8063248a9ca31461032c57806329ee566c1461035c5780632a55205a1461037a5780632e2aaa92146103ab57610205565b80631397e91c116101d95780631397e91c146102b857806316e72abb146102d457806317088efc146102f25780631785f53c1461031057610205565b8062fdd58e1461020a57806301ffc9a71461023a57806306fdde031461026a5780630e89341c14610288575b600080fd5b610224600480360381019061021f91906134a3565b610679565b604051610231919061423a565b60405180910390f35b610254600480360381019061024f919061369c565b610743565b6040516102619190613f07565b60405180910390f35b61027261088d565b60405161027f9190613f58565b60405180910390f35b6102a2600480360381019061029d919061373f565b61091b565b6040516102af9190613f58565b60405180910390f35b6102d260048036038101906102cd91906135ae565b61097b565b005b6102dc610c39565b6040516102e9919061423a565b60405180910390f35b6102fa610c3f565b6040516103079190613f3d565b60405180910390f35b61032a60048036038101906103259190613290565b610c63565b005b6103466004803603810190610341919061362f565b610cc2565b6040516103539190613f22565b60405180910390f35b610364610ce2565b6040516103719190613d71565b60405180910390f35b610394600480360381019061038f9190613799565b610d06565b6040516103a2929190613e4e565b60405180910390f35b6103c560048036038101906103c091906134a3565b610d5c565b6040516103d2919061423a565b60405180910390f35b6103f560048036038101906103f091906132fd565b610d81565b005b610411600480360381019061040c919061365c565b610e22565b005b61042d60048036038101906104289190613290565b610e4b565b005b6104496004803603810190610444919061365c565b610ec7565b005b610465600480360381019061046091906136f6565b610f4a565b005b610481600480360381019061047c9190613536565b610fb3565b60405161048e9190613eae565b60405180910390f35b6104b160048036038101906104ac91906134e3565b6110cc565b005b6104cd60048036038101906104c89190613290565b611279565b005b6104d76112d8565b005b6104e1611360565b6040516104ee9190613d71565b60405180910390f35b610511600480360381019061050c919061365c565b61138a565b60405161051e9190613f07565b60405180910390f35b61052f6113f5565b60405161053c9190613f58565b60405180910390f35b61055f600480360381019061055a9190613290565b611483565b005b6105696114ff565b604051610576919061423a565b60405180910390f35b610587611504565b6040516105949190613f22565b60405180910390f35b6105b760048036038101906105b29190613463565b61150b565b005b6105c1611521565b6040516105ce9190613f58565b60405180910390f35b6105df6115af565b6040516105ec9190613f22565b60405180910390f35b61060f600480360381019061060a919061365c565b6115d3565b005b61062b600480360381019061062691906132bd565b6115fc565b6040516106389190613f07565b60405180910390f35b61065b600480360381019061065691906133cc565b611690565b005b61067760048036038101906106729190613290565b611731565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e19061401a565b60405180910390fd5b6002600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080e57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061087657507f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610886575061088582611829565b5b9050919050565b6006805461089a90614623565b80601f01602080910402602001604051908101604052809291908181526020018280546108c690614623565b80156109135780601f106108e857610100808354040283529160200191610913565b820191906000526020600020905b8154815290600101906020018083116108f657829003601f168201915b505050505081565b606060006009805461092c90614623565b9050116109485760405180602001604052806000815250610974565b6009610953836118a3565b604051602001610964929190613d13565b6040516020818303038152906040525b9050919050565b8181905084849050146109c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ba9061419a565b60405180910390fd5b60005b84849050811015610b29578282828181106109e4576109e361478d565b5b905060200201357f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e2aaa9233888886818110610a3b57610a3a61478d565b5b905060200201356040518363ffffffff1660e01b8152600401610a5f929190613e4e565b60206040518083038186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf919061376c565b148015610ad75750612710838383818110610acd57610acc61478d565b5b9050602002013514155b610b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0d906141fa565b60405180910390fd5b8080610b2190614686565b9150506109c6565b5060005b84849050811015610c3257610b7533868684818110610b4f57610b4e61478d565b5b90506020020135858585818110610b6957610b6861478d565b5b90506020020135611a04565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663538a948033878785818110610bc557610bc461478d565b5b905060200201356127106040518463ffffffff1660e01b8152600401610bed93929190613e77565b600060405180830381600087803b158015610c0757600080fd5b505af1158015610c1b573d6000803e3d6000fd5b505050508080610c2a90614686565b915050610b2d565b5050505050565b61271081565b7f000000000000000000000000000000000000000000000000000000000000000081565b610c73610c6e611a68565b611a70565b610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca9906140da565b60405180910390fd5b610cbf6000801b826115d3565b50565b600060056000838152602001908152602001600020600101549050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000807f00000000000000000000000000000000000000000000000000000000000000009150610d536064610d45600a86611a8690919063ffffffff16565b611a9c90919063ffffffff16565b90509250929050565b6008602052816000526040600020602052806000526040600020600091509150505481565b610d89611a68565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610dcf5750610dce85610dc9611a68565b6115fc565b5b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e05906140ba565b60405180910390fd5b610e1b8585858585611ab2565b5050505050565b610e2b82610cc2565b610e3c81610e37611a68565b611dc9565b610e468383611e66565b505050565b610e5b610e56611a68565b611a70565b610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906140da565b60405180910390fd5b610ec47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6826115d3565b50565b610ecf611a68565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f339061421a565b60405180910390fd5b610f468282611f47565b5050565b610f5a610f55611a68565b611a70565b610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f90906140da565b60405180910390fd5b8060099080519060200190610faf929190612ee8565b5050565b60608151835114610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff09061417a565b60405180910390fd5b6000835167ffffffffffffffff811115611016576110156147bc565b5b6040519080825280602002602001820160405280156110445781602001602082028036833780820191505090505b50905060005b84518110156110c1576110918582815181106110695761106861478d565b5b60200260200101518583815181106110845761108361478d565b5b6020026020010151610679565b8282815181106110a4576110a361478d565b5b602002602001018181525050806110ba90614686565b905061104a565b508091505092915050565b6110dc6110d7611a68565b611a70565b61111b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611112906140da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290613ffa565b60405180910390fd5b6001821015801561119d575060058211155b6111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d39061403a565b60405180910390fd5b6000811161121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121690613f7a565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550505050565b611289611284611a68565b611a70565b6112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf906140da565b60405180910390fd5b6112d56000801b82612029565b50565b6112e0611a68565b73ffffffffffffffffffffffffffffffffffffffff166112fe611360565b73ffffffffffffffffffffffffffffffffffffffff1614611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134b9061411a565b60405180910390fd5b61135e6000612037565b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6007805461140290614623565b80601f016020809104026020016040519081016040528092919081815260200182805461142e90614623565b801561147b5780601f106114505761010080835404028352916020019161147b565b820191906000526020600020905b81548152906001019060200180831161145e57829003601f168201915b505050505081565b61149361148e611a68565b611a70565b6114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906140da565b60405180910390fd5b6114fc7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682612029565b50565b600a81565b6000801b81565b61151d611516611a68565b83836120fd565b5050565b6009805461152e90614623565b80601f016020809104026020016040519081016040528092919081815260200182805461155a90614623565b80156115a75780601f1061157c576101008083540402835291602001916115a7565b820191906000526020600020905b81548152906001019060200180831161158a57829003601f168201915b505050505081565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6115dc82610cc2565b6115ed816115e8611a68565b611dc9565b6115f78383611f47565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611698611a68565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806116de57506116dd856116d8611a68565b6115fc565b5b61171d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117149061407a565b60405180910390fd5b61172a858585858561226a565b5050505050565b611739611a68565b73ffffffffffffffffffffffffffffffffffffffff16611757611360565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a49061411a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118149061405a565b60405180910390fd5b61182681612037565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061189c575061189b826124ef565b5b9050919050565b606060008214156118eb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506119ff565b600082905060005b6000821461191d57808061190690614686565b915050600a826119169190614444565b91506118f3565b60008167ffffffffffffffff811115611939576119386147bc565b5b6040519080825280601f01601f19166020018201604052801561196b5781602001600182028036833780820191505090505b5090505b600085146119f85760018261198491906144cf565b9150600a8561199391906146cf565b603061199f91906143ee565b60f81b8183815181106119b5576119b461478d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856119f19190614444565b945061196f565b8093505050505b919050565b6000811415611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f9061413a565b60405180910390fd5b611a63838383604051806020016040528060008152506125d1565b505050565b600033905090565b6000611a7f6000801b8361138a565b9050919050565b60008183611a949190614475565b905092915050565b60008183611aaa9190614444565b905092915050565b8151835114611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed906141ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d9061409a565b60405180910390fd5b6000611b70611a68565b9050611b80818787878787612768565b60005b8451811015611d34576000858281518110611ba157611ba061478d565b5b602002602001015190506000858381518110611bc057611bbf61478d565b5b6020026020010151905060006002600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c59906140fa565b60405180910390fd5b8181036002600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1991906143ee565b9250508190555050505080611d2d90614686565b9050611b83565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611dab929190613ed0565b60405180910390a4611dc1818787878787612770565b505050505050565b611dd3828261138a565b611e6257611df88173ffffffffffffffffffffffffffffffffffffffff166014612957565b611e068360001c6020612957565b604051602001611e17929190613d37565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e599190613f58565b60405180910390fd5b5050565b611e70828261138a565b611f435760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ee8611a68565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611f51828261138a565b156120255760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fca611a68565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6120338282611e66565b5050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561216c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121639061415a565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161225d9190613f07565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d19061409a565b60405180910390fd5b60006122e4611a68565b90506123048187876122f588612b93565b6122fe88612b93565b87612768565b60006002600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561239c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612393906140fa565b60405180910390fd5b8381036002600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836002600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461245391906143ee565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516124d0929190614255565b60405180910390a46124e6828888888888612c0d565b50505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ba57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125ca57506125c982612df4565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612641576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612638906141da565b60405180910390fd5b600061264b611a68565b905061266c8160008761265d88612b93565b61266688612b93565b87612768565b826002600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126cc91906143ee565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161274a929190614255565b60405180910390a461276181600087878787612c0d565b5050505050565b505050505050565b61278f8473ffffffffffffffffffffffffffffffffffffffff16612e6b565b1561294f578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016127d5959493929190613d8c565b602060405180830381600087803b1580156127ef57600080fd5b505af192505050801561282057506040513d601f19601f8201168201806040525081019061281d91906136c9565b60015b6128c65761282c6147eb565b806308c379a014156128895750612841614e0f565b8061284c575061288b565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128809190613f58565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bd90613f9a565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461294d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294490613fda565b60405180910390fd5b505b505050505050565b60606000600283600261296a9190614475565b61297491906143ee565b67ffffffffffffffff81111561298d5761298c6147bc565b5b6040519080825280601f01601f1916602001820160405280156129bf5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106129f7576129f661478d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612a5b57612a5a61478d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a9b9190614475565b612aa591906143ee565b90505b6001811115612b45577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ae757612ae661478d565b5b1a60f81b828281518110612afe57612afd61478d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612b3e906145f9565b9050612aa8565b5060008414612b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8090613fba565b60405180910390fd5b8091505092915050565b60606000600167ffffffffffffffff811115612bb257612bb16147bc565b5b604051908082528060200260200182016040528015612be05781602001602082028036833780820191505090505b5090508281600081518110612bf857612bf761478d565b5b60200260200101818152505080915050919050565b612c2c8473ffffffffffffffffffffffffffffffffffffffff16612e6b565b15612dec578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612c72959493929190613df4565b602060405180830381600087803b158015612c8c57600080fd5b505af1925050508015612cbd57506040513d601f19601f82011682018060405250810190612cba91906136c9565b60015b612d6357612cc96147eb565b806308c379a01415612d265750612cde614e0f565b80612ce95750612d28565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1d9190613f58565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5a90613f9a565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de190613fda565b60405180910390fd5b505b505050505050565b6000612dff82612e7e565b80612e645750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612ef490614623565b90600052602060002090601f016020900481019282612f165760008555612f5d565b82601f10612f2f57805160ff1916838001178555612f5d565b82800160010185558215612f5d579182015b82811115612f5c578251825591602001919060010190612f41565b5b509050612f6a9190612f6e565b5090565b5b80821115612f87576000816000905550600101612f6f565b5090565b6000612f9e612f99846142a3565b61427e565b90508083825260208201905082856020860282011115612fc157612fc0614817565b5b60005b85811015612ff15781612fd788826130ef565b845260208401935060208301925050600181019050612fc4565b5050509392505050565b600061300e613009846142cf565b61427e565b9050808382526020820190508285602086028201111561303157613030614817565b5b60005b8581101561306157816130478882613266565b845260208401935060208301925050600181019050613034565b5050509392505050565b600061307e613079846142fb565b61427e565b90508281526020810184848401111561309a5761309961481c565b5b6130a58482856145b7565b509392505050565b60006130c06130bb8461432c565b61427e565b9050828152602081018484840111156130dc576130db61481c565b5b6130e78482856145b7565b509392505050565b6000813590506130fe81614ea5565b92915050565b600082601f83011261311957613118614812565b5b8135613129848260208601612f8b565b91505092915050565b60008083601f84011261314857613147614812565b5b8235905067ffffffffffffffff8111156131655761316461480d565b5b60208301915083602082028301111561318157613180614817565b5b9250929050565b600082601f83011261319d5761319c614812565b5b81356131ad848260208601612ffb565b91505092915050565b6000813590506131c581614ebc565b92915050565b6000813590506131da81614ed3565b92915050565b6000813590506131ef81614eea565b92915050565b60008151905061320481614eea565b92915050565b600082601f83011261321f5761321e614812565b5b813561322f84826020860161306b565b91505092915050565b600082601f83011261324d5761324c614812565b5b813561325d8482602086016130ad565b91505092915050565b60008135905061327581614f01565b92915050565b60008151905061328a81614f01565b92915050565b6000602082840312156132a6576132a5614826565b5b60006132b4848285016130ef565b91505092915050565b600080604083850312156132d4576132d3614826565b5b60006132e2858286016130ef565b92505060206132f3858286016130ef565b9150509250929050565b600080600080600060a0868803121561331957613318614826565b5b6000613327888289016130ef565b9550506020613338888289016130ef565b945050604086013567ffffffffffffffff81111561335957613358614821565b5b61336588828901613188565b935050606086013567ffffffffffffffff81111561338657613385614821565b5b61339288828901613188565b925050608086013567ffffffffffffffff8111156133b3576133b2614821565b5b6133bf8882890161320a565b9150509295509295909350565b600080600080600060a086880312156133e8576133e7614826565b5b60006133f6888289016130ef565b9550506020613407888289016130ef565b945050604061341888828901613266565b935050606061342988828901613266565b925050608086013567ffffffffffffffff81111561344a57613449614821565b5b6134568882890161320a565b9150509295509295909350565b6000806040838503121561347a57613479614826565b5b6000613488858286016130ef565b9250506020613499858286016131b6565b9150509250929050565b600080604083850312156134ba576134b9614826565b5b60006134c8858286016130ef565b92505060206134d985828601613266565b9150509250929050565b6000806000606084860312156134fc576134fb614826565b5b600061350a868287016130ef565b935050602061351b86828701613266565b925050604061352c86828701613266565b9150509250925092565b6000806040838503121561354d5761354c614826565b5b600083013567ffffffffffffffff81111561356b5761356a614821565b5b61357785828601613104565b925050602083013567ffffffffffffffff81111561359857613597614821565b5b6135a485828601613188565b9150509250929050565b600080600080604085870312156135c8576135c7614826565b5b600085013567ffffffffffffffff8111156135e6576135e5614821565b5b6135f287828801613132565b9450945050602085013567ffffffffffffffff81111561361557613614614821565b5b61362187828801613132565b925092505092959194509250565b60006020828403121561364557613644614826565b5b6000613653848285016131cb565b91505092915050565b6000806040838503121561367357613672614826565b5b6000613681858286016131cb565b9250506020613692858286016130ef565b9150509250929050565b6000602082840312156136b2576136b1614826565b5b60006136c0848285016131e0565b91505092915050565b6000602082840312156136df576136de614826565b5b60006136ed848285016131f5565b91505092915050565b60006020828403121561370c5761370b614826565b5b600082013567ffffffffffffffff81111561372a57613729614821565b5b61373684828501613238565b91505092915050565b60006020828403121561375557613754614826565b5b600061376384828501613266565b91505092915050565b60006020828403121561378257613781614826565b5b60006137908482850161327b565b91505092915050565b600080604083850312156137b0576137af614826565b5b60006137be85828601613266565b92505060206137cf85828601613266565b9150509250929050565b60006137e58383613cf5565b60208301905092915050565b6137fa81614503565b82525050565b600061380b82614382565b61381581856143b0565b93506138208361435d565b8060005b8381101561385157815161383888826137d9565b9750613843836143a3565b925050600181019050613824565b5085935050505092915050565b61386781614515565b82525050565b61387681614521565b82525050565b60006138878261438d565b61389181856143c1565b93506138a18185602086016145c6565b6138aa8161482b565b840191505092915050565b6138be81614581565b82525050565b60006138cf82614398565b6138d981856143d2565b93506138e98185602086016145c6565b6138f28161482b565b840191505092915050565b600061390882614398565b61391281856143e3565b93506139228185602086016145c6565b80840191505092915050565b6000815461393b81614623565b61394581866143e3565b945060018216600081146139605760018114613971576139a4565b60ff198316865281860193506139a4565b61397a8561436d565b60005b8381101561399c5781548189015260018201915060208101905061397d565b838801955050505b50505092915050565b60006139ba6019836143d2565b91506139c582614849565b602082019050919050565b60006139dd6034836143d2565b91506139e882614872565b604082019050919050565b6000613a006020836143d2565b9150613a0b826148c1565b602082019050919050565b6000613a236028836143d2565b9150613a2e826148ea565b604082019050919050565b6000613a46601b836143d2565b9150613a5182614939565b602082019050919050565b6000613a69602b836143d2565b9150613a7482614962565b604082019050919050565b6000613a8c601d836143d2565b9150613a97826149b1565b602082019050919050565b6000613aaf6026836143d2565b9150613aba826149da565b604082019050919050565b6000613ad26029836143d2565b9150613add82614a29565b604082019050919050565b6000613af56025836143d2565b9150613b0082614a78565b604082019050919050565b6000613b186032836143d2565b9150613b2382614ac7565b604082019050919050565b6000613b3b6020836143d2565b9150613b4682614b16565b602082019050919050565b6000613b5e602a836143d2565b9150613b6982614b3f565b604082019050919050565b6000613b816020836143d2565b9150613b8c82614b8e565b602082019050919050565b6000613ba46019836143d2565b9150613baf82614bb7565b602082019050919050565b6000613bc76017836143e3565b9150613bd282614be0565b601782019050919050565b6000613bea6029836143d2565b9150613bf582614c09565b604082019050919050565b6000613c0d6029836143d2565b9150613c1882614c58565b604082019050919050565b6000613c306019836143d2565b9150613c3b82614ca7565b602082019050919050565b6000613c536028836143d2565b9150613c5e82614cd0565b604082019050919050565b6000613c766021836143d2565b9150613c8182614d1f565b604082019050919050565b6000613c996013836143d2565b9150613ca482614d6e565b602082019050919050565b6000613cbc6011836143e3565b9150613cc782614d97565b601182019050919050565b6000613cdf602f836143d2565b9150613cea82614dc0565b604082019050919050565b613cfe81614577565b82525050565b613d0d81614577565b82525050565b6000613d1f828561392e565b9150613d2b82846138fd565b91508190509392505050565b6000613d4282613bba565b9150613d4e82856138fd565b9150613d5982613caf565b9150613d6582846138fd565b91508190509392505050565b6000602082019050613d8660008301846137f1565b92915050565b600060a082019050613da160008301886137f1565b613dae60208301876137f1565b8181036040830152613dc08186613800565b90508181036060830152613dd48185613800565b90508181036080830152613de8818461387c565b90509695505050505050565b600060a082019050613e0960008301886137f1565b613e1660208301876137f1565b613e236040830186613d04565b613e306060830185613d04565b8181036080830152613e42818461387c565b90509695505050505050565b6000604082019050613e6360008301856137f1565b613e706020830184613d04565b9392505050565b6000606082019050613e8c60008301866137f1565b613e996020830185613d04565b613ea66040830184613d04565b949350505050565b60006020820190508181036000830152613ec88184613800565b905092915050565b60006040820190508181036000830152613eea8185613800565b90508181036020830152613efe8184613800565b90509392505050565b6000602082019050613f1c600083018461385e565b92915050565b6000602082019050613f37600083018461386d565b92915050565b6000602082019050613f5260008301846138b5565b92915050565b60006020820190508181036000830152613f7281846138c4565b905092915050565b60006020820190508181036000830152613f93816139ad565b9050919050565b60006020820190508181036000830152613fb3816139d0565b9050919050565b60006020820190508181036000830152613fd3816139f3565b9050919050565b60006020820190508181036000830152613ff381613a16565b9050919050565b6000602082019050818103600083015261401381613a39565b9050919050565b6000602082019050818103600083015261403381613a5c565b9050919050565b6000602082019050818103600083015261405381613a7f565b9050919050565b6000602082019050818103600083015261407381613aa2565b9050919050565b6000602082019050818103600083015261409381613ac5565b9050919050565b600060208201905081810360008301526140b381613ae8565b9050919050565b600060208201905081810360008301526140d381613b0b565b9050919050565b600060208201905081810360008301526140f381613b2e565b9050919050565b6000602082019050818103600083015261411381613b51565b9050919050565b6000602082019050818103600083015261413381613b74565b9050919050565b6000602082019050818103600083015261415381613b97565b9050919050565b6000602082019050818103600083015261417381613bdd565b9050919050565b6000602082019050818103600083015261419381613c00565b9050919050565b600060208201905081810360008301526141b381613c23565b9050919050565b600060208201905081810360008301526141d381613c46565b9050919050565b600060208201905081810360008301526141f381613c69565b9050919050565b6000602082019050818103600083015261421381613c8c565b9050919050565b6000602082019050818103600083015261423381613cd2565b9050919050565b600060208201905061424f6000830184613d04565b92915050565b600060408201905061426a6000830185613d04565b6142776020830184613d04565b9392505050565b6000614288614299565b90506142948282614655565b919050565b6000604051905090565b600067ffffffffffffffff8211156142be576142bd6147bc565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142ea576142e96147bc565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614316576143156147bc565b5b61431f8261482b565b9050602081019050919050565b600067ffffffffffffffff821115614347576143466147bc565b5b6143508261482b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143f982614577565b915061440483614577565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561443957614438614700565b5b828201905092915050565b600061444f82614577565b915061445a83614577565b92508261446a5761446961472f565b5b828204905092915050565b600061448082614577565b915061448b83614577565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144c4576144c3614700565b5b828202905092915050565b60006144da82614577565b91506144e583614577565b9250828210156144f8576144f7614700565b5b828203905092915050565b600061450e82614557565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061458c82614593565b9050919050565b600061459e826145a5565b9050919050565b60006145b082614557565b9050919050565b82818337600083830152505050565b60005b838110156145e45780820151818401526020810190506145c9565b838111156145f3576000848401525b50505050565b600061460482614577565b9150600082141561461857614617614700565b5b600182039050919050565b6000600282049050600182168061463b57607f821691505b6020821081141561464f5761464e61475e565b5b50919050565b61465e8261482b565b810181811067ffffffffffffffff8211171561467d5761467c6147bc565b5b80604052505050565b600061469182614577565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146c4576146c3614700565b5b600182019050919050565b60006146da82614577565b91506146e583614577565b9250826146f5576146f461472f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561480a5760046000803e61480760005161483c565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f7175616e746974792073686f756c64206265206f766572203000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f6d696e7465722061646472657373206973206e6f742076616c69640000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f746f6b656e49642073686f756c642062652066726f6d203120746f2035000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f537570706c792073686f756c6420626520706f73697469766500000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f6c656e6774682073686f756c64206265207468652073616d6500000000000000600082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f737570706c79206973206e6f742076616c696400000000000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600060443d1015614e1f57614ea2565b614e27614299565b60043d036004823e80513d602482011167ffffffffffffffff82111715614e4f575050614ea2565b808201805167ffffffffffffffff811115614e6d5750505050614ea2565b80602083010160043d038501811115614e8a575050505050614ea2565b614e9982602001850186614655565b82955050505050505b90565b614eae81614503565b8114614eb957600080fd5b50565b614ec581614515565b8114614ed057600080fd5b50565b614edc81614521565b8114614ee757600080fd5b50565b614ef38161452b565b8114614efe57600080fd5b50565b614f0a81614577565b8114614f1557600080fd5b5056fea26469706673582212201999dd5a84b6d75ca8a4c7f5c510f66db72b12e963b18d371103a5d5c126235664736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000bbf1abfa6a5cee3103f6ea44341c014631a11af7000000000000000000000000668e13b717ba91fa97214b5863171e0cbfb191e200000000000000000000000000000000000000000000000000000000000000154e45574b494e4f45524331313535464f5247414c410000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4e45574b494e4f3131353547414c410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003468747470733a2f2f6261636b656e642e6c756e616d61726b65742e696f2f6170692f6d657461646174612f67616c612f6765742f000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102055760003560e01c80634e1273f41161011a5780639f67756d116100ad578063d53913931161007c578063d5391393146105d7578063d547741f146105f5578063e985e9c514610611578063f242432a14610641578063f2fde38b1461065d57610205565b80639f67756d14610561578063a217fddf1461057f578063a22cb4651461059d578063c0ac9983146105b957610205565b80638da5cb5b116100e95780638da5cb5b146104d957806391d14854146104f757806395d89b4114610527578063983b2d561461054557610205565b80634e1273f414610467578063538a94801461049757806370480275146104b3578063715018a6146104cf57610205565b8063248a9ca31161019d5780632eb2c2d61161016c5780632eb2c2d6146103db5780632f2ff15d146103f75780633092afd51461041357806336568abe1461042f5780633f5645081461044b57610205565b8063248a9ca31461032c57806329ee566c1461035c5780632a55205a1461037a5780632e2aaa92146103ab57610205565b80631397e91c116101d95780631397e91c146102b857806316e72abb146102d457806317088efc146102f25780631785f53c1461031057610205565b8062fdd58e1461020a57806301ffc9a71461023a57806306fdde031461026a5780630e89341c14610288575b600080fd5b610224600480360381019061021f91906134a3565b610679565b604051610231919061423a565b60405180910390f35b610254600480360381019061024f919061369c565b610743565b6040516102619190613f07565b60405180910390f35b61027261088d565b60405161027f9190613f58565b60405180910390f35b6102a2600480360381019061029d919061373f565b61091b565b6040516102af9190613f58565b60405180910390f35b6102d260048036038101906102cd91906135ae565b61097b565b005b6102dc610c39565b6040516102e9919061423a565b60405180910390f35b6102fa610c3f565b6040516103079190613f3d565b60405180910390f35b61032a60048036038101906103259190613290565b610c63565b005b6103466004803603810190610341919061362f565b610cc2565b6040516103539190613f22565b60405180910390f35b610364610ce2565b6040516103719190613d71565b60405180910390f35b610394600480360381019061038f9190613799565b610d06565b6040516103a2929190613e4e565b60405180910390f35b6103c560048036038101906103c091906134a3565b610d5c565b6040516103d2919061423a565b60405180910390f35b6103f560048036038101906103f091906132fd565b610d81565b005b610411600480360381019061040c919061365c565b610e22565b005b61042d60048036038101906104289190613290565b610e4b565b005b6104496004803603810190610444919061365c565b610ec7565b005b610465600480360381019061046091906136f6565b610f4a565b005b610481600480360381019061047c9190613536565b610fb3565b60405161048e9190613eae565b60405180910390f35b6104b160048036038101906104ac91906134e3565b6110cc565b005b6104cd60048036038101906104c89190613290565b611279565b005b6104d76112d8565b005b6104e1611360565b6040516104ee9190613d71565b60405180910390f35b610511600480360381019061050c919061365c565b61138a565b60405161051e9190613f07565b60405180910390f35b61052f6113f5565b60405161053c9190613f58565b60405180910390f35b61055f600480360381019061055a9190613290565b611483565b005b6105696114ff565b604051610576919061423a565b60405180910390f35b610587611504565b6040516105949190613f22565b60405180910390f35b6105b760048036038101906105b29190613463565b61150b565b005b6105c1611521565b6040516105ce9190613f58565b60405180910390f35b6105df6115af565b6040516105ec9190613f22565b60405180910390f35b61060f600480360381019061060a919061365c565b6115d3565b005b61062b600480360381019061062691906132bd565b6115fc565b6040516106389190613f07565b60405180910390f35b61065b600480360381019061065691906133cc565b611690565b005b61067760048036038101906106729190613290565b611731565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e19061401a565b60405180910390fd5b6002600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080e57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061087657507f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610886575061088582611829565b5b9050919050565b6006805461089a90614623565b80601f01602080910402602001604051908101604052809291908181526020018280546108c690614623565b80156109135780601f106108e857610100808354040283529160200191610913565b820191906000526020600020905b8154815290600101906020018083116108f657829003601f168201915b505050505081565b606060006009805461092c90614623565b9050116109485760405180602001604052806000815250610974565b6009610953836118a3565b604051602001610964929190613d13565b6040516020818303038152906040525b9050919050565b8181905084849050146109c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ba9061419a565b60405180910390fd5b60005b84849050811015610b29578282828181106109e4576109e361478d565b5b905060200201357f000000000000000000000000668e13b717ba91fa97214b5863171e0cbfb191e273ffffffffffffffffffffffffffffffffffffffff16632e2aaa9233888886818110610a3b57610a3a61478d565b5b905060200201356040518363ffffffff1660e01b8152600401610a5f929190613e4e565b60206040518083038186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf919061376c565b148015610ad75750612710838383818110610acd57610acc61478d565b5b9050602002013514155b610b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0d906141fa565b60405180910390fd5b8080610b2190614686565b9150506109c6565b5060005b84849050811015610c3257610b7533868684818110610b4f57610b4e61478d565b5b90506020020135858585818110610b6957610b6861478d565b5b90506020020135611a04565b7f000000000000000000000000668e13b717ba91fa97214b5863171e0cbfb191e273ffffffffffffffffffffffffffffffffffffffff1663538a948033878785818110610bc557610bc461478d565b5b905060200201356127106040518463ffffffff1660e01b8152600401610bed93929190613e77565b600060405180830381600087803b158015610c0757600080fd5b505af1158015610c1b573d6000803e3d6000fd5b505050508080610c2a90614686565b915050610b2d565b5050505050565b61271081565b7f000000000000000000000000668e13b717ba91fa97214b5863171e0cbfb191e281565b610c73610c6e611a68565b611a70565b610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca9906140da565b60405180910390fd5b610cbf6000801b826115d3565b50565b600060056000838152602001908152602001600020600101549050919050565b7f000000000000000000000000bbf1abfa6a5cee3103f6ea44341c014631a11af781565b6000807f000000000000000000000000bbf1abfa6a5cee3103f6ea44341c014631a11af79150610d536064610d45600a86611a8690919063ffffffff16565b611a9c90919063ffffffff16565b90509250929050565b6008602052816000526040600020602052806000526040600020600091509150505481565b610d89611a68565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610dcf5750610dce85610dc9611a68565b6115fc565b5b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e05906140ba565b60405180910390fd5b610e1b8585858585611ab2565b5050505050565b610e2b82610cc2565b610e3c81610e37611a68565b611dc9565b610e468383611e66565b505050565b610e5b610e56611a68565b611a70565b610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e91906140da565b60405180910390fd5b610ec47f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6826115d3565b50565b610ecf611a68565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f339061421a565b60405180910390fd5b610f468282611f47565b5050565b610f5a610f55611a68565b611a70565b610f99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f90906140da565b60405180910390fd5b8060099080519060200190610faf929190612ee8565b5050565b60608151835114610ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff09061417a565b60405180910390fd5b6000835167ffffffffffffffff811115611016576110156147bc565b5b6040519080825280602002602001820160405280156110445781602001602082028036833780820191505090505b50905060005b84518110156110c1576110918582815181106110695761106861478d565b5b60200260200101518583815181106110845761108361478d565b5b6020026020010151610679565b8282815181106110a4576110a361478d565b5b602002602001018181525050806110ba90614686565b905061104a565b508091505092915050565b6110dc6110d7611a68565b611a70565b61111b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611112906140da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290613ffa565b60405180910390fd5b6001821015801561119d575060058211155b6111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d39061403a565b60405180910390fd5b6000811161121f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121690613f7a565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550505050565b611289611284611a68565b611a70565b6112c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bf906140da565b60405180910390fd5b6112d56000801b82612029565b50565b6112e0611a68565b73ffffffffffffffffffffffffffffffffffffffff166112fe611360565b73ffffffffffffffffffffffffffffffffffffffff1614611354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134b9061411a565b60405180910390fd5b61135e6000612037565b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6007805461140290614623565b80601f016020809104026020016040519081016040528092919081815260200182805461142e90614623565b801561147b5780601f106114505761010080835404028352916020019161147b565b820191906000526020600020905b81548152906001019060200180831161145e57829003601f168201915b505050505081565b61149361148e611a68565b611a70565b6114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906140da565b60405180910390fd5b6114fc7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a682612029565b50565b600a81565b6000801b81565b61151d611516611a68565b83836120fd565b5050565b6009805461152e90614623565b80601f016020809104026020016040519081016040528092919081815260200182805461155a90614623565b80156115a75780601f1061157c576101008083540402835291602001916115a7565b820191906000526020600020905b81548152906001019060200180831161158a57829003601f168201915b505050505081565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6115dc82610cc2565b6115ed816115e8611a68565b611dc9565b6115f78383611f47565b505050565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611698611a68565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806116de57506116dd856116d8611a68565b6115fc565b5b61171d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117149061407a565b60405180910390fd5b61172a858585858561226a565b5050505050565b611739611a68565b73ffffffffffffffffffffffffffffffffffffffff16611757611360565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a49061411a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118149061405a565b60405180910390fd5b61182681612037565b50565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061189c575061189b826124ef565b5b9050919050565b606060008214156118eb576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506119ff565b600082905060005b6000821461191d57808061190690614686565b915050600a826119169190614444565b91506118f3565b60008167ffffffffffffffff811115611939576119386147bc565b5b6040519080825280601f01601f19166020018201604052801561196b5781602001600182028036833780820191505090505b5090505b600085146119f85760018261198491906144cf565b9150600a8561199391906146cf565b603061199f91906143ee565b60f81b8183815181106119b5576119b461478d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856119f19190614444565b945061196f565b8093505050505b919050565b6000811415611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f9061413a565b60405180910390fd5b611a63838383604051806020016040528060008152506125d1565b505050565b600033905090565b6000611a7f6000801b8361138a565b9050919050565b60008183611a949190614475565b905092915050565b60008183611aaa9190614444565b905092915050565b8151835114611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed906141ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d9061409a565b60405180910390fd5b6000611b70611a68565b9050611b80818787878787612768565b60005b8451811015611d34576000858281518110611ba157611ba061478d565b5b602002602001015190506000858381518110611bc057611bbf61478d565b5b6020026020010151905060006002600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c59906140fa565b60405180910390fd5b8181036002600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d1991906143ee565b9250508190555050505080611d2d90614686565b9050611b83565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611dab929190613ed0565b60405180910390a4611dc1818787878787612770565b505050505050565b611dd3828261138a565b611e6257611df88173ffffffffffffffffffffffffffffffffffffffff166014612957565b611e068360001c6020612957565b604051602001611e17929190613d37565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e599190613f58565b60405180910390fd5b5050565b611e70828261138a565b611f435760016005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611ee8611a68565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611f51828261138a565b156120255760006005600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fca611a68565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6120338282611e66565b5050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561216c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121639061415a565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161225d9190613f07565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d19061409a565b60405180910390fd5b60006122e4611a68565b90506123048187876122f588612b93565b6122fe88612b93565b87612768565b60006002600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508381101561239c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612393906140fa565b60405180910390fd5b8381036002600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836002600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461245391906143ee565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516124d0929190614255565b60405180910390a46124e6828888888888612c0d565b50505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125ba57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125ca57506125c982612df4565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612641576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612638906141da565b60405180910390fd5b600061264b611a68565b905061266c8160008761265d88612b93565b61266688612b93565b87612768565b826002600086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126cc91906143ee565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161274a929190614255565b60405180910390a461276181600087878787612c0d565b5050505050565b505050505050565b61278f8473ffffffffffffffffffffffffffffffffffffffff16612e6b565b1561294f578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016127d5959493929190613d8c565b602060405180830381600087803b1580156127ef57600080fd5b505af192505050801561282057506040513d601f19601f8201168201806040525081019061281d91906136c9565b60015b6128c65761282c6147eb565b806308c379a014156128895750612841614e0f565b8061284c575061288b565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128809190613f58565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bd90613f9a565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461294d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294490613fda565b60405180910390fd5b505b505050505050565b60606000600283600261296a9190614475565b61297491906143ee565b67ffffffffffffffff81111561298d5761298c6147bc565b5b6040519080825280601f01601f1916602001820160405280156129bf5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106129f7576129f661478d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612a5b57612a5a61478d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a9b9190614475565b612aa591906143ee565b90505b6001811115612b45577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ae757612ae661478d565b5b1a60f81b828281518110612afe57612afd61478d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612b3e906145f9565b9050612aa8565b5060008414612b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8090613fba565b60405180910390fd5b8091505092915050565b60606000600167ffffffffffffffff811115612bb257612bb16147bc565b5b604051908082528060200260200182016040528015612be05781602001602082028036833780820191505090505b5090508281600081518110612bf857612bf761478d565b5b60200260200101818152505080915050919050565b612c2c8473ffffffffffffffffffffffffffffffffffffffff16612e6b565b15612dec578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612c72959493929190613df4565b602060405180830381600087803b158015612c8c57600080fd5b505af1925050508015612cbd57506040513d601f19601f82011682018060405250810190612cba91906136c9565b60015b612d6357612cc96147eb565b806308c379a01415612d265750612cde614e0f565b80612ce95750612d28565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1d9190613f58565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5a90613f9a565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de190613fda565b60405180910390fd5b505b505050505050565b6000612dff82612e7e565b80612e645750600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612ef490614623565b90600052602060002090601f016020900481019282612f165760008555612f5d565b82601f10612f2f57805160ff1916838001178555612f5d565b82800160010185558215612f5d579182015b82811115612f5c578251825591602001919060010190612f41565b5b509050612f6a9190612f6e565b5090565b5b80821115612f87576000816000905550600101612f6f565b5090565b6000612f9e612f99846142a3565b61427e565b90508083825260208201905082856020860282011115612fc157612fc0614817565b5b60005b85811015612ff15781612fd788826130ef565b845260208401935060208301925050600181019050612fc4565b5050509392505050565b600061300e613009846142cf565b61427e565b9050808382526020820190508285602086028201111561303157613030614817565b5b60005b8581101561306157816130478882613266565b845260208401935060208301925050600181019050613034565b5050509392505050565b600061307e613079846142fb565b61427e565b90508281526020810184848401111561309a5761309961481c565b5b6130a58482856145b7565b509392505050565b60006130c06130bb8461432c565b61427e565b9050828152602081018484840111156130dc576130db61481c565b5b6130e78482856145b7565b509392505050565b6000813590506130fe81614ea5565b92915050565b600082601f83011261311957613118614812565b5b8135613129848260208601612f8b565b91505092915050565b60008083601f84011261314857613147614812565b5b8235905067ffffffffffffffff8111156131655761316461480d565b5b60208301915083602082028301111561318157613180614817565b5b9250929050565b600082601f83011261319d5761319c614812565b5b81356131ad848260208601612ffb565b91505092915050565b6000813590506131c581614ebc565b92915050565b6000813590506131da81614ed3565b92915050565b6000813590506131ef81614eea565b92915050565b60008151905061320481614eea565b92915050565b600082601f83011261321f5761321e614812565b5b813561322f84826020860161306b565b91505092915050565b600082601f83011261324d5761324c614812565b5b813561325d8482602086016130ad565b91505092915050565b60008135905061327581614f01565b92915050565b60008151905061328a81614f01565b92915050565b6000602082840312156132a6576132a5614826565b5b60006132b4848285016130ef565b91505092915050565b600080604083850312156132d4576132d3614826565b5b60006132e2858286016130ef565b92505060206132f3858286016130ef565b9150509250929050565b600080600080600060a0868803121561331957613318614826565b5b6000613327888289016130ef565b9550506020613338888289016130ef565b945050604086013567ffffffffffffffff81111561335957613358614821565b5b61336588828901613188565b935050606086013567ffffffffffffffff81111561338657613385614821565b5b61339288828901613188565b925050608086013567ffffffffffffffff8111156133b3576133b2614821565b5b6133bf8882890161320a565b9150509295509295909350565b600080600080600060a086880312156133e8576133e7614826565b5b60006133f6888289016130ef565b9550506020613407888289016130ef565b945050604061341888828901613266565b935050606061342988828901613266565b925050608086013567ffffffffffffffff81111561344a57613449614821565b5b6134568882890161320a565b9150509295509295909350565b6000806040838503121561347a57613479614826565b5b6000613488858286016130ef565b9250506020613499858286016131b6565b9150509250929050565b600080604083850312156134ba576134b9614826565b5b60006134c8858286016130ef565b92505060206134d985828601613266565b9150509250929050565b6000806000606084860312156134fc576134fb614826565b5b600061350a868287016130ef565b935050602061351b86828701613266565b925050604061352c86828701613266565b9150509250925092565b6000806040838503121561354d5761354c614826565b5b600083013567ffffffffffffffff81111561356b5761356a614821565b5b61357785828601613104565b925050602083013567ffffffffffffffff81111561359857613597614821565b5b6135a485828601613188565b9150509250929050565b600080600080604085870312156135c8576135c7614826565b5b600085013567ffffffffffffffff8111156135e6576135e5614821565b5b6135f287828801613132565b9450945050602085013567ffffffffffffffff81111561361557613614614821565b5b61362187828801613132565b925092505092959194509250565b60006020828403121561364557613644614826565b5b6000613653848285016131cb565b91505092915050565b6000806040838503121561367357613672614826565b5b6000613681858286016131cb565b9250506020613692858286016130ef565b9150509250929050565b6000602082840312156136b2576136b1614826565b5b60006136c0848285016131e0565b91505092915050565b6000602082840312156136df576136de614826565b5b60006136ed848285016131f5565b91505092915050565b60006020828403121561370c5761370b614826565b5b600082013567ffffffffffffffff81111561372a57613729614821565b5b61373684828501613238565b91505092915050565b60006020828403121561375557613754614826565b5b600061376384828501613266565b91505092915050565b60006020828403121561378257613781614826565b5b60006137908482850161327b565b91505092915050565b600080604083850312156137b0576137af614826565b5b60006137be85828601613266565b92505060206137cf85828601613266565b9150509250929050565b60006137e58383613cf5565b60208301905092915050565b6137fa81614503565b82525050565b600061380b82614382565b61381581856143b0565b93506138208361435d565b8060005b8381101561385157815161383888826137d9565b9750613843836143a3565b925050600181019050613824565b5085935050505092915050565b61386781614515565b82525050565b61387681614521565b82525050565b60006138878261438d565b61389181856143c1565b93506138a18185602086016145c6565b6138aa8161482b565b840191505092915050565b6138be81614581565b82525050565b60006138cf82614398565b6138d981856143d2565b93506138e98185602086016145c6565b6138f28161482b565b840191505092915050565b600061390882614398565b61391281856143e3565b93506139228185602086016145c6565b80840191505092915050565b6000815461393b81614623565b61394581866143e3565b945060018216600081146139605760018114613971576139a4565b60ff198316865281860193506139a4565b61397a8561436d565b60005b8381101561399c5781548189015260018201915060208101905061397d565b838801955050505b50505092915050565b60006139ba6019836143d2565b91506139c582614849565b602082019050919050565b60006139dd6034836143d2565b91506139e882614872565b604082019050919050565b6000613a006020836143d2565b9150613a0b826148c1565b602082019050919050565b6000613a236028836143d2565b9150613a2e826148ea565b604082019050919050565b6000613a46601b836143d2565b9150613a5182614939565b602082019050919050565b6000613a69602b836143d2565b9150613a7482614962565b604082019050919050565b6000613a8c601d836143d2565b9150613a97826149b1565b602082019050919050565b6000613aaf6026836143d2565b9150613aba826149da565b604082019050919050565b6000613ad26029836143d2565b9150613add82614a29565b604082019050919050565b6000613af56025836143d2565b9150613b0082614a78565b604082019050919050565b6000613b186032836143d2565b9150613b2382614ac7565b604082019050919050565b6000613b3b6020836143d2565b9150613b4682614b16565b602082019050919050565b6000613b5e602a836143d2565b9150613b6982614b3f565b604082019050919050565b6000613b816020836143d2565b9150613b8c82614b8e565b602082019050919050565b6000613ba46019836143d2565b9150613baf82614bb7565b602082019050919050565b6000613bc76017836143e3565b9150613bd282614be0565b601782019050919050565b6000613bea6029836143d2565b9150613bf582614c09565b604082019050919050565b6000613c0d6029836143d2565b9150613c1882614c58565b604082019050919050565b6000613c306019836143d2565b9150613c3b82614ca7565b602082019050919050565b6000613c536028836143d2565b9150613c5e82614cd0565b604082019050919050565b6000613c766021836143d2565b9150613c8182614d1f565b604082019050919050565b6000613c996013836143d2565b9150613ca482614d6e565b602082019050919050565b6000613cbc6011836143e3565b9150613cc782614d97565b601182019050919050565b6000613cdf602f836143d2565b9150613cea82614dc0565b604082019050919050565b613cfe81614577565b82525050565b613d0d81614577565b82525050565b6000613d1f828561392e565b9150613d2b82846138fd565b91508190509392505050565b6000613d4282613bba565b9150613d4e82856138fd565b9150613d5982613caf565b9150613d6582846138fd565b91508190509392505050565b6000602082019050613d8660008301846137f1565b92915050565b600060a082019050613da160008301886137f1565b613dae60208301876137f1565b8181036040830152613dc08186613800565b90508181036060830152613dd48185613800565b90508181036080830152613de8818461387c565b90509695505050505050565b600060a082019050613e0960008301886137f1565b613e1660208301876137f1565b613e236040830186613d04565b613e306060830185613d04565b8181036080830152613e42818461387c565b90509695505050505050565b6000604082019050613e6360008301856137f1565b613e706020830184613d04565b9392505050565b6000606082019050613e8c60008301866137f1565b613e996020830185613d04565b613ea66040830184613d04565b949350505050565b60006020820190508181036000830152613ec88184613800565b905092915050565b60006040820190508181036000830152613eea8185613800565b90508181036020830152613efe8184613800565b90509392505050565b6000602082019050613f1c600083018461385e565b92915050565b6000602082019050613f37600083018461386d565b92915050565b6000602082019050613f5260008301846138b5565b92915050565b60006020820190508181036000830152613f7281846138c4565b905092915050565b60006020820190508181036000830152613f93816139ad565b9050919050565b60006020820190508181036000830152613fb3816139d0565b9050919050565b60006020820190508181036000830152613fd3816139f3565b9050919050565b60006020820190508181036000830152613ff381613a16565b9050919050565b6000602082019050818103600083015261401381613a39565b9050919050565b6000602082019050818103600083015261403381613a5c565b9050919050565b6000602082019050818103600083015261405381613a7f565b9050919050565b6000602082019050818103600083015261407381613aa2565b9050919050565b6000602082019050818103600083015261409381613ac5565b9050919050565b600060208201905081810360008301526140b381613ae8565b9050919050565b600060208201905081810360008301526140d381613b0b565b9050919050565b600060208201905081810360008301526140f381613b2e565b9050919050565b6000602082019050818103600083015261411381613b51565b9050919050565b6000602082019050818103600083015261413381613b74565b9050919050565b6000602082019050818103600083015261415381613b97565b9050919050565b6000602082019050818103600083015261417381613bdd565b9050919050565b6000602082019050818103600083015261419381613c00565b9050919050565b600060208201905081810360008301526141b381613c23565b9050919050565b600060208201905081810360008301526141d381613c46565b9050919050565b600060208201905081810360008301526141f381613c69565b9050919050565b6000602082019050818103600083015261421381613c8c565b9050919050565b6000602082019050818103600083015261423381613cd2565b9050919050565b600060208201905061424f6000830184613d04565b92915050565b600060408201905061426a6000830185613d04565b6142776020830184613d04565b9392505050565b6000614288614299565b90506142948282614655565b919050565b6000604051905090565b600067ffffffffffffffff8211156142be576142bd6147bc565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142ea576142e96147bc565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614316576143156147bc565b5b61431f8261482b565b9050602081019050919050565b600067ffffffffffffffff821115614347576143466147bc565b5b6143508261482b565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143f982614577565b915061440483614577565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561443957614438614700565b5b828201905092915050565b600061444f82614577565b915061445a83614577565b92508261446a5761446961472f565b5b828204905092915050565b600061448082614577565b915061448b83614577565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156144c4576144c3614700565b5b828202905092915050565b60006144da82614577565b91506144e583614577565b9250828210156144f8576144f7614700565b5b828203905092915050565b600061450e82614557565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061458c82614593565b9050919050565b600061459e826145a5565b9050919050565b60006145b082614557565b9050919050565b82818337600083830152505050565b60005b838110156145e45780820151818401526020810190506145c9565b838111156145f3576000848401525b50505050565b600061460482614577565b9150600082141561461857614617614700565b5b600182039050919050565b6000600282049050600182168061463b57607f821691505b6020821081141561464f5761464e61475e565b5b50919050565b61465e8261482b565b810181811067ffffffffffffffff8211171561467d5761467c6147bc565b5b80604052505050565b600061469182614577565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146c4576146c3614700565b5b600182019050919050565b60006146da82614577565b91506146e583614577565b9250826146f5576146f461472f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561480a5760046000803e61480760005161483c565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f7175616e746974792073686f756c64206265206f766572203000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f6d696e7465722061646472657373206973206e6f742076616c69640000000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f746f6b656e49642073686f756c642062652066726f6d203120746f2035000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f537570706c792073686f756c6420626520706f73697469766500000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f6c656e6774682073686f756c64206265207468652073616d6500000000000000600082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f737570706c79206973206e6f742076616c696400000000000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600060443d1015614e1f57614ea2565b614e27614299565b60043d036004823e80513d602482011167ffffffffffffffff82111715614e4f575050614ea2565b808201805167ffffffffffffffff811115614e6d5750505050614ea2565b80602083010160043d038501811115614e8a575050505050614ea2565b614e9982602001850186614655565b82955050505050505b90565b614eae81614503565b8114614eb957600080fd5b50565b614ec581614515565b8114614ed057600080fd5b50565b614edc81614521565b8114614ee757600080fd5b50565b614ef38161452b565b8114614efe57600080fd5b50565b614f0a81614577565b8114614f1557600080fd5b5056fea26469706673582212201999dd5a84b6d75ca8a4c7f5c510f66db72b12e963b18d371103a5d5c126235664736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000bbf1abfa6a5cee3103f6ea44341c014631a11af7000000000000000000000000668e13b717ba91fa97214b5863171e0cbfb191e200000000000000000000000000000000000000000000000000000000000000154e45574b494e4f45524331313535464f5247414c410000000000000000000000000000000000000000000000000000000000000000000000000000000000000f4e45574b494e4f3131353547414c410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003468747470733a2f2f6261636b656e642e6c756e616d61726b65742e696f2f6170692f6d657461646174612f67616c612f6765742f000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): NEWKINOERC1155FORGALA
Arg [1] : _symbol (string): NEWKINO1155GALA
Arg [2] : _tokenURIPrefix (string): https://backend.lunamarket.io/api/metadata/gala/get/
Arg [3] : _royalty (address): 0xBbF1abFA6a5Cee3103f6ea44341c014631A11AF7
Arg [4] : _oldGala (address): 0x668e13b717BA91Fa97214B5863171E0cBfb191e2

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000bbf1abfa6a5cee3103f6ea44341c014631a11af7
Arg [4] : 000000000000000000000000668e13b717ba91fa97214b5863171e0cbfb191e2
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [6] : 4e45574b494e4f45524331313535464f5247414c410000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [8] : 4e45574b494e4f3131353547414c410000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000034
Arg [10] : 68747470733a2f2f6261636b656e642e6c756e616d61726b65742e696f2f6170
Arg [11] : 692f6d657461646174612f67616c612f6765742f000000000000000000000000


Deployed Bytecode Sourcemap

60420:3792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30013:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63812:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60675:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62743:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62982:572;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60917:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60729:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59640:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55205:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60824:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63562:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;61000:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31952:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55590:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59402:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56638:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62237:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30410:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62372:363;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59519:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45227:103;;;:::i;:::-;;44576:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54090:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60700:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59288:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60865:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53181:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31007:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61097:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58877:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55982:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31234:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31474:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45485:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30013:231;30099:7;30146:1;30127:21;;:7;:21;;;;30119:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;30214:9;:13;30224:2;30214:13;;;;;;;;;;;:22;30228:7;30214:22;;;;;;;;;;;;;;;;30207:29;;30013:231;;;;:::o;63812:397::-;63937:4;63989:26;63974:41;;;:11;:41;;;;:110;;;;64047:37;64032:52;;;:11;:52;;;;63974:110;:174;;;;64116:32;64101:47;;;:11;:47;;;;63974:174;:227;;;;64165:36;64189:11;64165:23;:36::i;:::-;63974:227;63954:247;;63812:397;;;:::o;60675:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62743:231::-;62837:13;62901:1;62876:14;62870:28;;;;;:::i;:::-;;;:32;:96;;;;;;;;;;;;;;;;;62929:14;62945;:3;:12;:14::i;:::-;62912:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62870:96;62863:103;;62743:231;;;:::o;62982:572::-;63105:9;;:16;;63085:9;;:16;;:36;63077:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;63166:6;63162:180;63182:9;;:16;;63178:1;:20;63162:180;;;63278:9;;63288:1;63278:12;;;;;;;:::i;:::-;;;;;;;;63226:7;:22;;;63249:10;63261:9;;63271:1;63261:12;;;;;;;:::i;:::-;;;;;;;;63226:48;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;:92;;;;;60949:5;63294:9;;63304:1;63294:12;;;;;;;:::i;:::-;;;;;;;;:24;;63226:92;63218:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;63200:3;;;;;:::i;:::-;;;;63162:180;;;;63357:6;63353:194;63373:9;;:16;;63369:1;:20;63353:194;;;63411:48;63420:10;63432:9;;63442:1;63432:12;;;;;;;:::i;:::-;;;;;;;;63446:9;;63456:1;63446:12;;;;;;;:::i;:::-;;;;;;;;63411:8;:48::i;:::-;63474:7;:25;;;63500:10;63512:9;;63522:1;63512:12;;;;;;;:::i;:::-;;;;;;;;60949:5;63474:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63391:3;;;;;:::i;:::-;;;;63353:194;;;;62982:572;;;;:::o;60917:37::-;60949:5;60917:37;:::o;60729:33::-;;;:::o;59640:116::-;58988:21;58996:12;:10;:12::i;:::-;58988:7;:21::i;:::-;58980:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59707:41:::1;53226:4;59718:18:::0;::::1;59739:8;59707:10;:41::i;:::-;59640:116:::0;:::o;55205:123::-;55271:7;55298:6;:12;55305:4;55298:12;;;;;;;;;;;:22;;;55291:29;;55205:123;;;:::o;60824:32::-;;;:::o;63562:242::-;63661:16;63679:21;63724:7;63713:18;;63758:38;63792:3;63758:29;60906:2;63758:9;:13;;:29;;;;:::i;:::-;:33;;:38;;;;:::i;:::-;63742:54;;63562:242;;;;;:::o;61000:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31952:442::-;32193:12;:10;:12::i;:::-;32185:20;;:4;:20;;;:60;;;;32209:36;32226:4;32232:12;:10;:12::i;:::-;32209:16;:36::i;:::-;32185:60;32163:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;32334:52;32357:4;32363:2;32367:3;32372:7;32381:4;32334:22;:52::i;:::-;31952:442;;;;;:::o;55590:147::-;55673:18;55686:4;55673:12;:18::i;:::-;53672:30;53683:4;53689:12;:10;:12::i;:::-;53672:10;:30::i;:::-;55704:25:::1;55715:4;55721:7;55704:10;:25::i;:::-;55590:147:::0;;;:::o;59402:109::-;58988:21;58996:12;:10;:12::i;:::-;58988:7;:21::i;:::-;58980:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59470:33:::1;58915:24;59494:8;59470:10;:33::i;:::-;59402:109:::0;:::o;56638:218::-;56745:12;:10;:12::i;:::-;56734:23;;:7;:23;;;56726:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;56822:26;56834:4;56840:7;56822:11;:26::i;:::-;56638:218;;:::o;62237:127::-;58988:21;58996:12;:10;:12::i;:::-;58988:7;:21::i;:::-;58980:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62341:15:::1;62324:14;:32;;;;;;;;;;;;:::i;:::-;;62237:127:::0;:::o;30410:524::-;30566:16;30627:3;:10;30608:8;:15;:29;30600:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;30696:30;30743:8;:15;30729:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30696:63;;30777:9;30772:122;30796:8;:15;30792:1;:19;30772:122;;;30852:30;30862:8;30871:1;30862:11;;;;;;;;:::i;:::-;;;;;;;;30875:3;30879:1;30875:6;;;;;;;;:::i;:::-;;;;;;;;30852:9;:30::i;:::-;30833:13;30847:1;30833:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;30813:3;;;;:::i;:::-;;;30772:122;;;;30913:13;30906:20;;;30410:524;;;;:::o;62372:363::-;58988:21;58996:12;:10;:12::i;:::-;58988:7;:21::i;:::-;58980:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62500:1:::1;62482:20;;:6;:20;;;;62474:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;62563:1;62553:7;:11;;:26;;;;;62578:1;62568:7;:11;;62553:26;62545:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62643:1;62632:8;:12;62624:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;62719:8;62685:14;:22;62700:6;62685:22;;;;;;;;;;;;;;;:31;62708:7;62685:31;;;;;;;;;;;:42;;;;62372:363:::0;;;:::o;59519:113::-;58988:21;58996:12;:10;:12::i;:::-;58988:7;:21::i;:::-;58980:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59583:41:::1;53226:4;59594:18:::0;::::1;59615:8;59583:10;:41::i;:::-;59519:113:::0;:::o;45227:103::-;44807:12;:10;:12::i;:::-;44796:23;;:7;:5;:7::i;:::-;:23;;;44788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45292:30:::1;45319:1;45292:18;:30::i;:::-;45227:103::o:0;44576:87::-;44622:7;44649:6;;;;;;;;;;;44642:13;;44576:87;:::o;54090:139::-;54168:4;54192:6;:12;54199:4;54192:12;;;;;;;;;;;:20;;:29;54213:7;54192:29;;;;;;;;;;;;;;;;;;;;;;;;;54185:36;;54090:139;;;;:::o;60700:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59288:106::-;58988:21;58996:12;:10;:12::i;:::-;58988:7;:21::i;:::-;58980:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;59353:33:::1;58915:24;59377:8;59353:10;:33::i;:::-;59288:106:::0;:::o;60865:43::-;60906:2;60865:43;:::o;53181:49::-;53226:4;53181:49;;;:::o;31007:155::-;31102:52;31121:12;:10;:12::i;:::-;31135:8;31145;31102:18;:52::i;:::-;31007:155;;:::o;61097:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58877:62::-;58915:24;58877:62;:::o;55982:149::-;56066:18;56079:4;56066:12;:18::i;:::-;53672:30;53683:4;53689:12;:10;:12::i;:::-;53672:10;:30::i;:::-;56097:26:::1;56109:4;56115:7;56097:11;:26::i;:::-;55982:149:::0;;;:::o;31234:168::-;31333:4;31357:18;:27;31376:7;31357:27;;;;;;;;;;;;;;;:37;31385:8;31357:37;;;;;;;;;;;;;;;;;;;;;;;;;31350:44;;31234:168;;;;:::o;31474:401::-;31690:12;:10;:12::i;:::-;31682:20;;:4;:20;;;:60;;;;31706:36;31723:4;31729:12;:10;:12::i;:::-;31706:16;:36::i;:::-;31682:60;31660:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;31822:45;31840:4;31846:2;31850;31854:6;31862:4;31822:17;:45::i;:::-;31474:401;;;;;:::o;45485:201::-;44807:12;:10;:12::i;:::-;44796:23;;:7;:5;:7::i;:::-;:23;;;44788:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45594:1:::1;45574:22;;:8;:22;;;;45566:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45650:28;45669:8;45650:18;:28::i;:::-;45485:201:::0;:::o;53794:204::-;53879:4;53918:32;53903:47;;;:11;:47;;;;:87;;;;53954:36;53978:11;53954:23;:36::i;:::-;53903:87;53896:94;;53794:204;;;:::o;46407:723::-;46463:13;46693:1;46684:5;:10;46680:53;;;46711:10;;;;;;;;;;;;;;;;;;;;;46680:53;46743:12;46758:5;46743:20;;46774:14;46799:78;46814:1;46806:4;:9;46799:78;;46832:8;;;;;:::i;:::-;;;;46863:2;46855:10;;;;;:::i;:::-;;;46799:78;;;46887:19;46919:6;46909:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46887:39;;46937:154;46953:1;46944:5;:10;46937:154;;46981:1;46971:11;;;;;:::i;:::-;;;47048:2;47040:5;:10;;;;:::i;:::-;47027:2;:24;;;;:::i;:::-;47014:39;;46997:6;47004;46997:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;47077:2;47068:11;;;;;:::i;:::-;;;46937:154;;;47115:6;47101:21;;;;;46407:723;;;;:::o;61896:198::-;62005:1;61994:7;:12;;61986:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;62049:37;62055:12;62069:3;62074:7;62049:37;;;;;;;;;;;;:5;:37::i;:::-;61896:198;;;:::o;27747:98::-;27800:7;27827:10;27820:17;;27747:98;:::o;59900:135::-;59965:4;59989:38;53226:4;59997:18;;60018:8;59989:7;:38::i;:::-;59982:45;;59900:135;;;:::o;3646:98::-;3704:7;3735:1;3731;:5;;;;:::i;:::-;3724:12;;3646:98;;;;:::o;4045:::-;4103:7;4134:1;4130;:5;;;;:::i;:::-;4123:12;;4045:98;;;;:::o;34036:1074::-;34263:7;:14;34249:3;:10;:28;34241:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34355:1;34341:16;;:2;:16;;;;34333:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34412:16;34431:12;:10;:12::i;:::-;34412:31;;34456:60;34477:8;34487:4;34493:2;34497:3;34502:7;34511:4;34456:20;:60::i;:::-;34534:9;34529:421;34553:3;:10;34549:1;:14;34529:421;;;34585:10;34598:3;34602:1;34598:6;;;;;;;;:::i;:::-;;;;;;;;34585:19;;34619:14;34636:7;34644:1;34636:10;;;;;;;;:::i;:::-;;;;;;;;34619:27;;34663:19;34685:9;:13;34695:2;34685:13;;;;;;;;;;;:19;34699:4;34685:19;;;;;;;;;;;;;;;;34663:41;;34742:6;34727:11;:21;;34719:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;34875:6;34861:11;:20;34839:9;:13;34849:2;34839:13;;;;;;;;;;;:19;34853:4;34839:19;;;;;;;;;;;;;;;:42;;;;34932:6;34911:9;:13;34921:2;34911:13;;;;;;;;;;;:17;34925:2;34911:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;34570:380;;;34565:3;;;;:::i;:::-;;;34529:421;;;;34997:2;34967:47;;34991:4;34967:47;;34981:8;34967:47;;;35001:3;35006:7;34967:47;;;;;;;:::i;:::-;;;;;;;;35027:75;35063:8;35073:4;35079:2;35083:3;35088:7;35097:4;35027:35;:75::i;:::-;34230:880;34036:1074;;;;;:::o;54519:497::-;54600:22;54608:4;54614:7;54600;:22::i;:::-;54595:414;;54788:41;54816:7;54788:41;;54826:2;54788:19;:41::i;:::-;54902:38;54930:4;54922:13;;54937:2;54902:19;:38::i;:::-;54693:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54639:358;;;;;;;;;;;:::i;:::-;;;;;;;;54595:414;54519:497;;:::o;58139:238::-;58223:22;58231:4;58237:7;58223;:22::i;:::-;58218:152;;58294:4;58262:6;:12;58269:4;58262:12;;;;;;;;;;;:20;;:29;58283:7;58262:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;58345:12;:10;:12::i;:::-;58318:40;;58336:7;58318:40;;58330:4;58318:40;;;;;;;;;;58218:152;58139:238;;:::o;58509:239::-;58593:22;58601:4;58607:7;58593;:22::i;:::-;58589:152;;;58664:5;58632:6;:12;58639:4;58632:12;;;;;;;;;;;:20;;:29;58653:7;58632:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;58716:12;:10;:12::i;:::-;58689:40;;58707:7;58689:40;;58701:4;58689:40;;;;;;;;;;58589:152;58509:239;;:::o;57515:112::-;57594:25;57605:4;57611:7;57594:10;:25::i;:::-;57515:112;;:::o;45846:191::-;45920:16;45939:6;;;;;;;;;;;45920:25;;45965:8;45956:6;;:17;;;;;;;;;;;;;;;;;;46020:8;45989:40;;46010:8;45989:40;;;;;;;;;;;;45909:128;45846:191;:::o;40222:331::-;40377:8;40368:17;;:5;:17;;;;40360:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40480:8;40442:18;:25;40461:5;40442:25;;;;;;;;;;;;;;;:35;40468:8;40442:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;40526:8;40504:41;;40519:5;40504:41;;;40536:8;40504:41;;;;;;:::i;:::-;;;;;;;;40222:331;;;:::o;32858:820::-;33060:1;33046:16;;:2;:16;;;;33038:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33117:16;33136:12;:10;:12::i;:::-;33117:31;;33161:96;33182:8;33192:4;33198:2;33202:21;33220:2;33202:17;:21::i;:::-;33225:25;33243:6;33225:17;:25::i;:::-;33252:4;33161:20;:96::i;:::-;33270:19;33292:9;:13;33302:2;33292:13;;;;;;;;;;;:19;33306:4;33292:19;;;;;;;;;;;;;;;;33270:41;;33345:6;33330:11;:21;;33322:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33470:6;33456:11;:20;33434:9;:13;33444:2;33434:13;;;;;;;;;;;:19;33448:4;33434:19;;;;;;;;;;;;;;;:42;;;;33519:6;33498:9;:13;33508:2;33498:13;;;;;;;;;;;:17;33512:2;33498:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;33574:2;33543:46;;33568:4;33543:46;;33558:8;33543:46;;;33578:2;33582:6;33543:46;;;;;;;:::i;:::-;;;;;;;;33602:68;33633:8;33643:4;33649:2;33653;33657:6;33665:4;33602:30;:68::i;:::-;33027:651;;32858:820;;;;;:::o;29036:310::-;29138:4;29190:26;29175:41;;;:11;:41;;;;:110;;;;29248:37;29233:52;;;:11;:52;;;;29175:110;:163;;;;29302:36;29326:11;29302:23;:36::i;:::-;29175:163;29155:183;;29036:310;;;:::o;36428:569::-;36595:1;36581:16;;:2;:16;;;;36573:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;36648:16;36667:12;:10;:12::i;:::-;36648:31;;36692:102;36713:8;36731:1;36735:2;36739:21;36757:2;36739:17;:21::i;:::-;36762:25;36780:6;36762:17;:25::i;:::-;36789:4;36692:20;:102::i;:::-;36828:6;36807:9;:13;36817:2;36807:13;;;;;;;;;;;:17;36821:2;36807:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;36887:2;36850:52;;36883:1;36850:52;;36865:8;36850:52;;;36891:2;36895:6;36850:52;;;;;;;:::i;:::-;;;;;;;;36915:74;36946:8;36964:1;36968:2;36972;36976:6;36984:4;36915:30;:74::i;:::-;36562:435;36428:569;;;;:::o;41509:221::-;;;;;;;:::o;42490:813::-;42730:15;:2;:13;;;:15::i;:::-;42726:570;;;42783:2;42766:43;;;42810:8;42820:4;42826:3;42831:7;42840:4;42766:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42762:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;43158:6;43151:14;;;;;;;;;;;:::i;:::-;;;;;;;;42762:523;;;43207:62;;;;;;;;;;:::i;:::-;;;;;;;;42762:523;42939:48;;;42927:60;;;:8;:60;;;;42923:159;;43012:50;;;;;;;;;;:::i;:::-;;;;;;;;42923:159;42846:251;42726:570;42490:813;;;;;;:::o;47708:451::-;47783:13;47809:19;47854:1;47845:6;47841:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;47831:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47809:47;;47867:15;:6;47874:1;47867:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;47893;:6;47900:1;47893:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;47924:9;47949:1;47940:6;47936:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;47924:26;;47919:135;47956:1;47952;:5;47919:135;;;47991:12;48012:3;48004:5;:11;47991:25;;;;;;;:::i;:::-;;;;;47979:6;47986:1;47979:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;48041:1;48031:11;;;;;47959:3;;;;:::i;:::-;;;47919:135;;;;48081:1;48072:5;:10;48064:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;48144:6;48130:21;;;47708:451;;;;:::o;43311:198::-;43377:16;43406:22;43445:1;43431:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43406:41;;43469:7;43458:5;43464:1;43458:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;43496:5;43489:12;;;43311:198;;;:::o;41738:744::-;41953:15;:2;:13;;;:15::i;:::-;41949:526;;;42006:2;41989:38;;;42028:8;42038:4;42044:2;42048:6;42056:4;41989:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41985:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;42337:6;42330:14;;;;;;;;;;;:::i;:::-;;;;;;;;41985:479;;;42386:62;;;;;;;;;;:::i;:::-;;;;;;;;41985:479;42123:43;;;42111:55;;;:8;:55;;;;42107:154;;42191:50;;;;;;;;;;:::i;:::-;;;;;;;;42107:154;42062:214;41949:526;41738:744;;;;;;:::o;10651:190::-;10736:4;10760:36;10784:11;10760:23;:36::i;:::-;:73;;;;10800:20;:33;10821:11;10800:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10760:73;10753:80;;10651:190;;;:::o;19726:387::-;19786:4;19994:12;20061:7;20049:20;20041:28;;20104:1;20097:4;:8;20090:15;;;19726:387;;;:::o;9852:157::-;9937:4;9976:25;9961:40;;;:11;:40;;;;9954:47;;9852:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:568::-;2959:8;2969:6;3019:3;3012:4;3004:6;3000:17;2996:27;2986:122;;3027:79;;:::i;:::-;2986:122;3140:6;3127:20;3117:30;;3170:18;3162:6;3159:30;3156:117;;;3192:79;;:::i;:::-;3156:117;3306:4;3298:6;3294:17;3282:29;;3360:3;3352:4;3344:6;3340:17;3330:8;3326:32;3323:41;3320:128;;;3367:79;;:::i;:::-;3320:128;2886:568;;;;;:::o;3477:370::-;3548:5;3597:3;3590:4;3582:6;3578:17;3574:27;3564:122;;3605:79;;:::i;:::-;3564:122;3722:6;3709:20;3747:94;3837:3;3829:6;3822:4;3814:6;3810:17;3747:94;:::i;:::-;3738:103;;3554:293;3477:370;;;;:::o;3853:133::-;3896:5;3934:6;3921:20;3912:29;;3950:30;3974:5;3950:30;:::i;:::-;3853:133;;;;:::o;3992:139::-;4038:5;4076:6;4063:20;4054:29;;4092:33;4119:5;4092:33;:::i;:::-;3992:139;;;;:::o;4137:137::-;4182:5;4220:6;4207:20;4198:29;;4236:32;4262:5;4236:32;:::i;:::-;4137:137;;;;:::o;4280:141::-;4336:5;4367:6;4361:13;4352:22;;4383:32;4409:5;4383:32;:::i;:::-;4280:141;;;;:::o;4440:338::-;4495:5;4544:3;4537:4;4529:6;4525:17;4521:27;4511:122;;4552:79;;:::i;:::-;4511:122;4669:6;4656:20;4694:78;4768:3;4760:6;4753:4;4745:6;4741:17;4694:78;:::i;:::-;4685:87;;4501:277;4440:338;;;;:::o;4798:340::-;4854:5;4903:3;4896:4;4888:6;4884:17;4880:27;4870:122;;4911:79;;:::i;:::-;4870:122;5028:6;5015:20;5053:79;5128:3;5120:6;5113:4;5105:6;5101:17;5053:79;:::i;:::-;5044:88;;4860:278;4798:340;;;;:::o;5144:139::-;5190:5;5228:6;5215:20;5206:29;;5244:33;5271:5;5244:33;:::i;:::-;5144:139;;;;:::o;5289:143::-;5346:5;5377:6;5371:13;5362:22;;5393:33;5420:5;5393:33;:::i;:::-;5289:143;;;;:::o;5438:329::-;5497:6;5546:2;5534:9;5525:7;5521:23;5517:32;5514:119;;;5552:79;;:::i;:::-;5514:119;5672:1;5697:53;5742:7;5733:6;5722:9;5718:22;5697:53;:::i;:::-;5687:63;;5643:117;5438:329;;;;:::o;5773:474::-;5841:6;5849;5898:2;5886:9;5877:7;5873:23;5869:32;5866:119;;;5904:79;;:::i;:::-;5866:119;6024:1;6049:53;6094:7;6085:6;6074:9;6070:22;6049:53;:::i;:::-;6039:63;;5995:117;6151:2;6177:53;6222:7;6213:6;6202:9;6198:22;6177:53;:::i;:::-;6167:63;;6122:118;5773:474;;;;;:::o;6253:1509::-;6407:6;6415;6423;6431;6439;6488:3;6476:9;6467:7;6463:23;6459:33;6456:120;;;6495:79;;:::i;:::-;6456:120;6615:1;6640:53;6685:7;6676:6;6665:9;6661:22;6640:53;:::i;:::-;6630:63;;6586:117;6742:2;6768:53;6813:7;6804:6;6793:9;6789:22;6768:53;:::i;:::-;6758:63;;6713:118;6898:2;6887:9;6883:18;6870:32;6929:18;6921:6;6918:30;6915:117;;;6951:79;;:::i;:::-;6915:117;7056:78;7126:7;7117:6;7106:9;7102:22;7056:78;:::i;:::-;7046:88;;6841:303;7211:2;7200:9;7196:18;7183:32;7242:18;7234:6;7231:30;7228:117;;;7264:79;;:::i;:::-;7228:117;7369:78;7439:7;7430:6;7419:9;7415:22;7369:78;:::i;:::-;7359:88;;7154:303;7524:3;7513:9;7509:19;7496:33;7556:18;7548:6;7545:30;7542:117;;;7578:79;;:::i;:::-;7542:117;7683:62;7737:7;7728:6;7717:9;7713:22;7683:62;:::i;:::-;7673:72;;7467:288;6253:1509;;;;;;;;:::o;7768:1089::-;7872:6;7880;7888;7896;7904;7953:3;7941:9;7932:7;7928:23;7924:33;7921:120;;;7960:79;;:::i;:::-;7921:120;8080:1;8105:53;8150:7;8141:6;8130:9;8126:22;8105:53;:::i;:::-;8095:63;;8051:117;8207:2;8233:53;8278:7;8269:6;8258:9;8254:22;8233:53;:::i;:::-;8223:63;;8178:118;8335:2;8361:53;8406:7;8397:6;8386:9;8382:22;8361:53;:::i;:::-;8351:63;;8306:118;8463:2;8489:53;8534:7;8525:6;8514:9;8510:22;8489:53;:::i;:::-;8479:63;;8434:118;8619:3;8608:9;8604:19;8591:33;8651:18;8643:6;8640:30;8637:117;;;8673:79;;:::i;:::-;8637:117;8778:62;8832:7;8823:6;8812:9;8808:22;8778:62;:::i;:::-;8768:72;;8562:288;7768:1089;;;;;;;;:::o;8863:468::-;8928:6;8936;8985:2;8973:9;8964:7;8960:23;8956:32;8953:119;;;8991:79;;:::i;:::-;8953:119;9111:1;9136:53;9181:7;9172:6;9161:9;9157:22;9136:53;:::i;:::-;9126:63;;9082:117;9238:2;9264:50;9306:7;9297:6;9286:9;9282:22;9264:50;:::i;:::-;9254:60;;9209:115;8863:468;;;;;:::o;9337:474::-;9405:6;9413;9462:2;9450:9;9441:7;9437:23;9433:32;9430:119;;;9468:79;;:::i;:::-;9430:119;9588:1;9613:53;9658:7;9649:6;9638:9;9634:22;9613:53;:::i;:::-;9603:63;;9559:117;9715:2;9741:53;9786:7;9777:6;9766:9;9762:22;9741:53;:::i;:::-;9731:63;;9686:118;9337:474;;;;;:::o;9817:619::-;9894:6;9902;9910;9959:2;9947:9;9938:7;9934:23;9930:32;9927:119;;;9965:79;;:::i;:::-;9927:119;10085:1;10110:53;10155:7;10146:6;10135:9;10131:22;10110:53;:::i;:::-;10100:63;;10056:117;10212:2;10238:53;10283:7;10274:6;10263:9;10259:22;10238:53;:::i;:::-;10228:63;;10183:118;10340:2;10366:53;10411:7;10402:6;10391:9;10387:22;10366:53;:::i;:::-;10356:63;;10311:118;9817:619;;;;;:::o;10442:894::-;10560:6;10568;10617:2;10605:9;10596:7;10592:23;10588:32;10585:119;;;10623:79;;:::i;:::-;10585:119;10771:1;10760:9;10756:17;10743:31;10801:18;10793:6;10790:30;10787:117;;;10823:79;;:::i;:::-;10787:117;10928:78;10998:7;10989:6;10978:9;10974:22;10928:78;:::i;:::-;10918:88;;10714:302;11083:2;11072:9;11068:18;11055:32;11114:18;11106:6;11103:30;11100:117;;;11136:79;;:::i;:::-;11100:117;11241:78;11311:7;11302:6;11291:9;11287:22;11241:78;:::i;:::-;11231:88;;11026:303;10442:894;;;;;:::o;11342:934::-;11464:6;11472;11480;11488;11537:2;11525:9;11516:7;11512:23;11508:32;11505:119;;;11543:79;;:::i;:::-;11505:119;11691:1;11680:9;11676:17;11663:31;11721:18;11713:6;11710:30;11707:117;;;11743:79;;:::i;:::-;11707:117;11856:80;11928:7;11919:6;11908:9;11904:22;11856:80;:::i;:::-;11838:98;;;;11634:312;12013:2;12002:9;11998:18;11985:32;12044:18;12036:6;12033:30;12030:117;;;12066:79;;:::i;:::-;12030:117;12179:80;12251:7;12242:6;12231:9;12227:22;12179:80;:::i;:::-;12161:98;;;;11956:313;11342:934;;;;;;;:::o;12282:329::-;12341:6;12390:2;12378:9;12369:7;12365:23;12361:32;12358:119;;;12396:79;;:::i;:::-;12358:119;12516:1;12541:53;12586:7;12577:6;12566:9;12562:22;12541:53;:::i;:::-;12531:63;;12487:117;12282:329;;;;:::o;12617:474::-;12685:6;12693;12742:2;12730:9;12721:7;12717:23;12713:32;12710:119;;;12748:79;;:::i;:::-;12710:119;12868:1;12893:53;12938:7;12929:6;12918:9;12914:22;12893:53;:::i;:::-;12883:63;;12839:117;12995:2;13021:53;13066:7;13057:6;13046:9;13042:22;13021:53;:::i;:::-;13011:63;;12966:118;12617:474;;;;;:::o;13097:327::-;13155:6;13204:2;13192:9;13183:7;13179:23;13175:32;13172:119;;;13210:79;;:::i;:::-;13172:119;13330:1;13355:52;13399:7;13390:6;13379:9;13375:22;13355:52;:::i;:::-;13345:62;;13301:116;13097:327;;;;:::o;13430:349::-;13499:6;13548:2;13536:9;13527:7;13523:23;13519:32;13516:119;;;13554:79;;:::i;:::-;13516:119;13674:1;13699:63;13754:7;13745:6;13734:9;13730:22;13699:63;:::i;:::-;13689:73;;13645:127;13430:349;;;;:::o;13785:509::-;13854:6;13903:2;13891:9;13882:7;13878:23;13874:32;13871:119;;;13909:79;;:::i;:::-;13871:119;14057:1;14046:9;14042:17;14029:31;14087:18;14079:6;14076:30;14073:117;;;14109:79;;:::i;:::-;14073:117;14214:63;14269:7;14260:6;14249:9;14245:22;14214:63;:::i;:::-;14204:73;;14000:287;13785:509;;;;:::o;14300:329::-;14359:6;14408:2;14396:9;14387:7;14383:23;14379:32;14376:119;;;14414:79;;:::i;:::-;14376:119;14534:1;14559:53;14604:7;14595:6;14584:9;14580:22;14559:53;:::i;:::-;14549:63;;14505:117;14300:329;;;;:::o;14635:351::-;14705:6;14754:2;14742:9;14733:7;14729:23;14725:32;14722:119;;;14760:79;;:::i;:::-;14722:119;14880:1;14905:64;14961:7;14952:6;14941:9;14937:22;14905:64;:::i;:::-;14895:74;;14851:128;14635:351;;;;:::o;14992:474::-;15060:6;15068;15117:2;15105:9;15096:7;15092:23;15088:32;15085:119;;;15123:79;;:::i;:::-;15085:119;15243:1;15268:53;15313:7;15304:6;15293:9;15289:22;15268:53;:::i;:::-;15258:63;;15214:117;15370:2;15396:53;15441:7;15432:6;15421:9;15417:22;15396:53;:::i;:::-;15386:63;;15341:118;14992:474;;;;;:::o;15472:179::-;15541:10;15562:46;15604:3;15596:6;15562:46;:::i;:::-;15640:4;15635:3;15631:14;15617:28;;15472:179;;;;:::o;15657:118::-;15744:24;15762:5;15744:24;:::i;:::-;15739:3;15732:37;15657:118;;:::o;15811:732::-;15930:3;15959:54;16007:5;15959:54;:::i;:::-;16029:86;16108:6;16103:3;16029:86;:::i;:::-;16022:93;;16139:56;16189:5;16139:56;:::i;:::-;16218:7;16249:1;16234:284;16259:6;16256:1;16253:13;16234:284;;;16335:6;16329:13;16362:63;16421:3;16406:13;16362:63;:::i;:::-;16355:70;;16448:60;16501:6;16448:60;:::i;:::-;16438:70;;16294:224;16281:1;16278;16274:9;16269:14;;16234:284;;;16238:14;16534:3;16527:10;;15935:608;;;15811:732;;;;:::o;16549:109::-;16630:21;16645:5;16630:21;:::i;:::-;16625:3;16618:34;16549:109;;:::o;16664:118::-;16751:24;16769:5;16751:24;:::i;:::-;16746:3;16739:37;16664:118;;:::o;16788:360::-;16874:3;16902:38;16934:5;16902:38;:::i;:::-;16956:70;17019:6;17014:3;16956:70;:::i;:::-;16949:77;;17035:52;17080:6;17075:3;17068:4;17061:5;17057:16;17035:52;:::i;:::-;17112:29;17134:6;17112:29;:::i;:::-;17107:3;17103:39;17096:46;;16878:270;16788:360;;;;:::o;17154:165::-;17258:54;17306:5;17258:54;:::i;:::-;17253:3;17246:67;17154:165;;:::o;17325:364::-;17413:3;17441:39;17474:5;17441:39;:::i;:::-;17496:71;17560:6;17555:3;17496:71;:::i;:::-;17489:78;;17576:52;17621:6;17616:3;17609:4;17602:5;17598:16;17576:52;:::i;:::-;17653:29;17675:6;17653:29;:::i;:::-;17648:3;17644:39;17637:46;;17417:272;17325:364;;;;:::o;17695:377::-;17801:3;17829:39;17862:5;17829:39;:::i;:::-;17884:89;17966:6;17961:3;17884:89;:::i;:::-;17877:96;;17982:52;18027:6;18022:3;18015:4;18008:5;18004:16;17982:52;:::i;:::-;18059:6;18054:3;18050:16;18043:23;;17805:267;17695:377;;;;:::o;18102:845::-;18205:3;18242:5;18236:12;18271:36;18297:9;18271:36;:::i;:::-;18323:89;18405:6;18400:3;18323:89;:::i;:::-;18316:96;;18443:1;18432:9;18428:17;18459:1;18454:137;;;;18605:1;18600:341;;;;18421:520;;18454:137;18538:4;18534:9;18523;18519:25;18514:3;18507:38;18574:6;18569:3;18565:16;18558:23;;18454:137;;18600:341;18667:38;18699:5;18667:38;:::i;:::-;18727:1;18741:154;18755:6;18752:1;18749:13;18741:154;;;18829:7;18823:14;18819:1;18814:3;18810:11;18803:35;18879:1;18870:7;18866:15;18855:26;;18777:4;18774:1;18770:12;18765:17;;18741:154;;;18924:6;18919:3;18915:16;18908:23;;18607:334;;18421:520;;18209:738;;18102:845;;;;:::o;18953:366::-;19095:3;19116:67;19180:2;19175:3;19116:67;:::i;:::-;19109:74;;19192:93;19281:3;19192:93;:::i;:::-;19310:2;19305:3;19301:12;19294:19;;18953:366;;;:::o;19325:::-;19467:3;19488:67;19552:2;19547:3;19488:67;:::i;:::-;19481:74;;19564:93;19653:3;19564:93;:::i;:::-;19682:2;19677:3;19673:12;19666:19;;19325:366;;;:::o;19697:::-;19839:3;19860:67;19924:2;19919:3;19860:67;:::i;:::-;19853:74;;19936:93;20025:3;19936:93;:::i;:::-;20054:2;20049:3;20045:12;20038:19;;19697:366;;;:::o;20069:::-;20211:3;20232:67;20296:2;20291:3;20232:67;:::i;:::-;20225:74;;20308:93;20397:3;20308:93;:::i;:::-;20426:2;20421:3;20417:12;20410:19;;20069:366;;;:::o;20441:::-;20583:3;20604:67;20668:2;20663:3;20604:67;:::i;:::-;20597:74;;20680:93;20769:3;20680:93;:::i;:::-;20798:2;20793:3;20789:12;20782:19;;20441:366;;;:::o;20813:::-;20955:3;20976:67;21040:2;21035:3;20976:67;:::i;:::-;20969:74;;21052:93;21141:3;21052:93;:::i;:::-;21170:2;21165:3;21161:12;21154:19;;20813:366;;;:::o;21185:::-;21327:3;21348:67;21412:2;21407:3;21348:67;:::i;:::-;21341:74;;21424:93;21513:3;21424:93;:::i;:::-;21542:2;21537:3;21533:12;21526:19;;21185:366;;;:::o;21557:::-;21699:3;21720:67;21784:2;21779:3;21720:67;:::i;:::-;21713:74;;21796:93;21885:3;21796:93;:::i;:::-;21914:2;21909:3;21905:12;21898:19;;21557:366;;;:::o;21929:::-;22071:3;22092:67;22156:2;22151:3;22092:67;:::i;:::-;22085:74;;22168:93;22257:3;22168:93;:::i;:::-;22286:2;22281:3;22277:12;22270:19;;21929:366;;;:::o;22301:::-;22443:3;22464:67;22528:2;22523:3;22464:67;:::i;:::-;22457:74;;22540:93;22629:3;22540:93;:::i;:::-;22658:2;22653:3;22649:12;22642:19;;22301:366;;;:::o;22673:::-;22815:3;22836:67;22900:2;22895:3;22836:67;:::i;:::-;22829:74;;22912:93;23001:3;22912:93;:::i;:::-;23030:2;23025:3;23021:12;23014:19;;22673:366;;;:::o;23045:::-;23187:3;23208:67;23272:2;23267:3;23208:67;:::i;:::-;23201:74;;23284:93;23373:3;23284:93;:::i;:::-;23402:2;23397:3;23393:12;23386:19;;23045:366;;;:::o;23417:::-;23559:3;23580:67;23644:2;23639:3;23580:67;:::i;:::-;23573:74;;23656:93;23745:3;23656:93;:::i;:::-;23774:2;23769:3;23765:12;23758:19;;23417:366;;;:::o;23789:::-;23931:3;23952:67;24016:2;24011:3;23952:67;:::i;:::-;23945:74;;24028:93;24117:3;24028:93;:::i;:::-;24146:2;24141:3;24137:12;24130:19;;23789:366;;;:::o;24161:::-;24303:3;24324:67;24388:2;24383:3;24324:67;:::i;:::-;24317:74;;24400:93;24489:3;24400:93;:::i;:::-;24518:2;24513:3;24509:12;24502:19;;24161:366;;;:::o;24533:402::-;24693:3;24714:85;24796:2;24791:3;24714:85;:::i;:::-;24707:92;;24808:93;24897:3;24808:93;:::i;:::-;24926:2;24921:3;24917:12;24910:19;;24533:402;;;:::o;24941:366::-;25083:3;25104:67;25168:2;25163:3;25104:67;:::i;:::-;25097:74;;25180:93;25269:3;25180:93;:::i;:::-;25298:2;25293:3;25289:12;25282:19;;24941:366;;;:::o;25313:::-;25455:3;25476:67;25540:2;25535:3;25476:67;:::i;:::-;25469:74;;25552:93;25641:3;25552:93;:::i;:::-;25670:2;25665:3;25661:12;25654:19;;25313:366;;;:::o;25685:::-;25827:3;25848:67;25912:2;25907:3;25848:67;:::i;:::-;25841:74;;25924:93;26013:3;25924:93;:::i;:::-;26042:2;26037:3;26033:12;26026:19;;25685:366;;;:::o;26057:::-;26199:3;26220:67;26284:2;26279:3;26220:67;:::i;:::-;26213:74;;26296:93;26385:3;26296:93;:::i;:::-;26414:2;26409:3;26405:12;26398:19;;26057:366;;;:::o;26429:::-;26571:3;26592:67;26656:2;26651:3;26592:67;:::i;:::-;26585:74;;26668:93;26757:3;26668:93;:::i;:::-;26786:2;26781:3;26777:12;26770:19;;26429:366;;;:::o;26801:::-;26943:3;26964:67;27028:2;27023:3;26964:67;:::i;:::-;26957:74;;27040:93;27129:3;27040:93;:::i;:::-;27158:2;27153:3;27149:12;27142:19;;26801:366;;;:::o;27173:402::-;27333:3;27354:85;27436:2;27431:3;27354:85;:::i;:::-;27347:92;;27448:93;27537:3;27448:93;:::i;:::-;27566:2;27561:3;27557:12;27550:19;;27173:402;;;:::o;27581:366::-;27723:3;27744:67;27808:2;27803:3;27744:67;:::i;:::-;27737:74;;27820:93;27909:3;27820:93;:::i;:::-;27938:2;27933:3;27929:12;27922:19;;27581:366;;;:::o;27953:108::-;28030:24;28048:5;28030:24;:::i;:::-;28025:3;28018:37;27953:108;;:::o;28067:118::-;28154:24;28172:5;28154:24;:::i;:::-;28149:3;28142:37;28067:118;;:::o;28191:429::-;28368:3;28390:92;28478:3;28469:6;28390:92;:::i;:::-;28383:99;;28499:95;28590:3;28581:6;28499:95;:::i;:::-;28492:102;;28611:3;28604:10;;28191:429;;;;;:::o;28626:967::-;29008:3;29030:148;29174:3;29030:148;:::i;:::-;29023:155;;29195:95;29286:3;29277:6;29195:95;:::i;:::-;29188:102;;29307:148;29451:3;29307:148;:::i;:::-;29300:155;;29472:95;29563:3;29554:6;29472:95;:::i;:::-;29465:102;;29584:3;29577:10;;28626:967;;;;;:::o;29599:222::-;29692:4;29730:2;29719:9;29715:18;29707:26;;29743:71;29811:1;29800:9;29796:17;29787:6;29743:71;:::i;:::-;29599:222;;;;:::o;29827:1053::-;30150:4;30188:3;30177:9;30173:19;30165:27;;30202:71;30270:1;30259:9;30255:17;30246:6;30202:71;:::i;:::-;30283:72;30351:2;30340:9;30336:18;30327:6;30283:72;:::i;:::-;30402:9;30396:4;30392:20;30387:2;30376:9;30372:18;30365:48;30430:108;30533:4;30524:6;30430:108;:::i;:::-;30422:116;;30585:9;30579:4;30575:20;30570:2;30559:9;30555:18;30548:48;30613:108;30716:4;30707:6;30613:108;:::i;:::-;30605:116;;30769:9;30763:4;30759:20;30753:3;30742:9;30738:19;30731:49;30797:76;30868:4;30859:6;30797:76;:::i;:::-;30789:84;;29827:1053;;;;;;;;:::o;30886:751::-;31109:4;31147:3;31136:9;31132:19;31124:27;;31161:71;31229:1;31218:9;31214:17;31205:6;31161:71;:::i;:::-;31242:72;31310:2;31299:9;31295:18;31286:6;31242:72;:::i;:::-;31324;31392:2;31381:9;31377:18;31368:6;31324:72;:::i;:::-;31406;31474:2;31463:9;31459:18;31450:6;31406:72;:::i;:::-;31526:9;31520:4;31516:20;31510:3;31499:9;31495:19;31488:49;31554:76;31625:4;31616:6;31554:76;:::i;:::-;31546:84;;30886:751;;;;;;;;:::o;31643:332::-;31764:4;31802:2;31791:9;31787:18;31779:26;;31815:71;31883:1;31872:9;31868:17;31859:6;31815:71;:::i;:::-;31896:72;31964:2;31953:9;31949:18;31940:6;31896:72;:::i;:::-;31643:332;;;;;:::o;31981:442::-;32130:4;32168:2;32157:9;32153:18;32145:26;;32181:71;32249:1;32238:9;32234:17;32225:6;32181:71;:::i;:::-;32262:72;32330:2;32319:9;32315:18;32306:6;32262:72;:::i;:::-;32344;32412:2;32401:9;32397:18;32388:6;32344:72;:::i;:::-;31981:442;;;;;;:::o;32429:373::-;32572:4;32610:2;32599:9;32595:18;32587:26;;32659:9;32653:4;32649:20;32645:1;32634:9;32630:17;32623:47;32687:108;32790:4;32781:6;32687:108;:::i;:::-;32679:116;;32429:373;;;;:::o;32808:634::-;33029:4;33067:2;33056:9;33052:18;33044:26;;33116:9;33110:4;33106:20;33102:1;33091:9;33087:17;33080:47;33144:108;33247:4;33238:6;33144:108;:::i;:::-;33136:116;;33299:9;33293:4;33289:20;33284:2;33273:9;33269:18;33262:48;33327:108;33430:4;33421:6;33327:108;:::i;:::-;33319:116;;32808:634;;;;;:::o;33448:210::-;33535:4;33573:2;33562:9;33558:18;33550:26;;33586:65;33648:1;33637:9;33633:17;33624:6;33586:65;:::i;:::-;33448:210;;;;:::o;33664:222::-;33757:4;33795:2;33784:9;33780:18;33772:26;;33808:71;33876:1;33865:9;33861:17;33852:6;33808:71;:::i;:::-;33664:222;;;;:::o;33892:256::-;34002:4;34040:2;34029:9;34025:18;34017:26;;34053:88;34138:1;34127:9;34123:17;34114:6;34053:88;:::i;:::-;33892:256;;;;:::o;34154:313::-;34267:4;34305:2;34294:9;34290:18;34282:26;;34354:9;34348:4;34344:20;34340:1;34329:9;34325:17;34318:47;34382:78;34455:4;34446:6;34382:78;:::i;:::-;34374:86;;34154:313;;;;:::o;34473:419::-;34639:4;34677:2;34666:9;34662:18;34654:26;;34726:9;34720:4;34716:20;34712:1;34701:9;34697:17;34690:47;34754:131;34880:4;34754:131;:::i;:::-;34746:139;;34473:419;;;:::o;34898:::-;35064:4;35102:2;35091:9;35087:18;35079:26;;35151:9;35145:4;35141:20;35137:1;35126:9;35122:17;35115:47;35179:131;35305:4;35179:131;:::i;:::-;35171:139;;34898:419;;;:::o;35323:::-;35489:4;35527:2;35516:9;35512:18;35504:26;;35576:9;35570:4;35566:20;35562:1;35551:9;35547:17;35540:47;35604:131;35730:4;35604:131;:::i;:::-;35596:139;;35323:419;;;:::o;35748:::-;35914:4;35952:2;35941:9;35937:18;35929:26;;36001:9;35995:4;35991:20;35987:1;35976:9;35972:17;35965:47;36029:131;36155:4;36029:131;:::i;:::-;36021:139;;35748:419;;;:::o;36173:::-;36339:4;36377:2;36366:9;36362:18;36354:26;;36426:9;36420:4;36416:20;36412:1;36401:9;36397:17;36390:47;36454:131;36580:4;36454:131;:::i;:::-;36446:139;;36173:419;;;:::o;36598:::-;36764:4;36802:2;36791:9;36787:18;36779:26;;36851:9;36845:4;36841:20;36837:1;36826:9;36822:17;36815:47;36879:131;37005:4;36879:131;:::i;:::-;36871:139;;36598:419;;;:::o;37023:::-;37189:4;37227:2;37216:9;37212:18;37204:26;;37276:9;37270:4;37266:20;37262:1;37251:9;37247:17;37240:47;37304:131;37430:4;37304:131;:::i;:::-;37296:139;;37023:419;;;:::o;37448:::-;37614:4;37652:2;37641:9;37637:18;37629:26;;37701:9;37695:4;37691:20;37687:1;37676:9;37672:17;37665:47;37729:131;37855:4;37729:131;:::i;:::-;37721:139;;37448:419;;;:::o;37873:::-;38039:4;38077:2;38066:9;38062:18;38054:26;;38126:9;38120:4;38116:20;38112:1;38101:9;38097:17;38090:47;38154:131;38280:4;38154:131;:::i;:::-;38146:139;;37873:419;;;:::o;38298:::-;38464:4;38502:2;38491:9;38487:18;38479:26;;38551:9;38545:4;38541:20;38537:1;38526:9;38522:17;38515:47;38579:131;38705:4;38579:131;:::i;:::-;38571:139;;38298:419;;;:::o;38723:::-;38889:4;38927:2;38916:9;38912:18;38904:26;;38976:9;38970:4;38966:20;38962:1;38951:9;38947:17;38940:47;39004:131;39130:4;39004:131;:::i;:::-;38996:139;;38723:419;;;:::o;39148:::-;39314:4;39352:2;39341:9;39337:18;39329:26;;39401:9;39395:4;39391:20;39387:1;39376:9;39372:17;39365:47;39429:131;39555:4;39429:131;:::i;:::-;39421:139;;39148:419;;;:::o;39573:::-;39739:4;39777:2;39766:9;39762:18;39754:26;;39826:9;39820:4;39816:20;39812:1;39801:9;39797:17;39790:47;39854:131;39980:4;39854:131;:::i;:::-;39846:139;;39573:419;;;:::o;39998:::-;40164:4;40202:2;40191:9;40187:18;40179:26;;40251:9;40245:4;40241:20;40237:1;40226:9;40222:17;40215:47;40279:131;40405:4;40279:131;:::i;:::-;40271:139;;39998:419;;;:::o;40423:::-;40589:4;40627:2;40616:9;40612:18;40604:26;;40676:9;40670:4;40666:20;40662:1;40651:9;40647:17;40640:47;40704:131;40830:4;40704:131;:::i;:::-;40696:139;;40423:419;;;:::o;40848:::-;41014:4;41052:2;41041:9;41037:18;41029:26;;41101:9;41095:4;41091:20;41087:1;41076:9;41072:17;41065:47;41129:131;41255:4;41129:131;:::i;:::-;41121:139;;40848:419;;;:::o;41273:::-;41439:4;41477:2;41466:9;41462:18;41454:26;;41526:9;41520:4;41516:20;41512:1;41501:9;41497:17;41490:47;41554:131;41680:4;41554:131;:::i;:::-;41546:139;;41273:419;;;:::o;41698:::-;41864:4;41902:2;41891:9;41887:18;41879:26;;41951:9;41945:4;41941:20;41937:1;41926:9;41922:17;41915:47;41979:131;42105:4;41979:131;:::i;:::-;41971:139;;41698:419;;;:::o;42123:::-;42289:4;42327:2;42316:9;42312:18;42304:26;;42376:9;42370:4;42366:20;42362:1;42351:9;42347:17;42340:47;42404:131;42530:4;42404:131;:::i;:::-;42396:139;;42123:419;;;:::o;42548:::-;42714:4;42752:2;42741:9;42737:18;42729:26;;42801:9;42795:4;42791:20;42787:1;42776:9;42772:17;42765:47;42829:131;42955:4;42829:131;:::i;:::-;42821:139;;42548:419;;;:::o;42973:::-;43139:4;43177:2;43166:9;43162:18;43154:26;;43226:9;43220:4;43216:20;43212:1;43201:9;43197:17;43190:47;43254:131;43380:4;43254:131;:::i;:::-;43246:139;;42973:419;;;:::o;43398:::-;43564:4;43602:2;43591:9;43587:18;43579:26;;43651:9;43645:4;43641:20;43637:1;43626:9;43622:17;43615:47;43679:131;43805:4;43679:131;:::i;:::-;43671:139;;43398:419;;;:::o;43823:222::-;43916:4;43954:2;43943:9;43939:18;43931:26;;43967:71;44035:1;44024:9;44020:17;44011:6;43967:71;:::i;:::-;43823:222;;;;:::o;44051:332::-;44172:4;44210:2;44199:9;44195:18;44187:26;;44223:71;44291:1;44280:9;44276:17;44267:6;44223:71;:::i;:::-;44304:72;44372:2;44361:9;44357:18;44348:6;44304:72;:::i;:::-;44051:332;;;;;:::o;44389:129::-;44423:6;44450:20;;:::i;:::-;44440:30;;44479:33;44507:4;44499:6;44479:33;:::i;:::-;44389:129;;;:::o;44524:75::-;44557:6;44590:2;44584:9;44574:19;;44524:75;:::o;44605:311::-;44682:4;44772:18;44764:6;44761:30;44758:56;;;44794:18;;:::i;:::-;44758:56;44844:4;44836:6;44832:17;44824:25;;44904:4;44898;44894:15;44886:23;;44605:311;;;:::o;44922:::-;44999:4;45089:18;45081:6;45078:30;45075:56;;;45111:18;;:::i;:::-;45075:56;45161:4;45153:6;45149:17;45141:25;;45221:4;45215;45211:15;45203:23;;44922:311;;;:::o;45239:307::-;45300:4;45390:18;45382:6;45379:30;45376:56;;;45412:18;;:::i;:::-;45376:56;45450:29;45472:6;45450:29;:::i;:::-;45442:37;;45534:4;45528;45524:15;45516:23;;45239:307;;;:::o;45552:308::-;45614:4;45704:18;45696:6;45693:30;45690:56;;;45726:18;;:::i;:::-;45690:56;45764:29;45786:6;45764:29;:::i;:::-;45756:37;;45848:4;45842;45838:15;45830:23;;45552:308;;;:::o;45866:132::-;45933:4;45956:3;45948:11;;45986:4;45981:3;45977:14;45969:22;;45866:132;;;:::o;46004:141::-;46053:4;46076:3;46068:11;;46099:3;46096:1;46089:14;46133:4;46130:1;46120:18;46112:26;;46004:141;;;:::o;46151:114::-;46218:6;46252:5;46246:12;46236:22;;46151:114;;;:::o;46271:98::-;46322:6;46356:5;46350:12;46340:22;;46271:98;;;:::o;46375:99::-;46427:6;46461:5;46455:12;46445:22;;46375:99;;;:::o;46480:113::-;46550:4;46582;46577:3;46573:14;46565:22;;46480:113;;;:::o;46599:184::-;46698:11;46732:6;46727:3;46720:19;46772:4;46767:3;46763:14;46748:29;;46599:184;;;;:::o;46789:168::-;46872:11;46906:6;46901:3;46894:19;46946:4;46941:3;46937:14;46922:29;;46789:168;;;;:::o;46963:169::-;47047:11;47081:6;47076:3;47069:19;47121:4;47116:3;47112:14;47097:29;;46963:169;;;;:::o;47138:148::-;47240:11;47277:3;47262:18;;47138:148;;;;:::o;47292:305::-;47332:3;47351:20;47369:1;47351:20;:::i;:::-;47346:25;;47385:20;47403:1;47385:20;:::i;:::-;47380:25;;47539:1;47471:66;47467:74;47464:1;47461:81;47458:107;;;47545:18;;:::i;:::-;47458:107;47589:1;47586;47582:9;47575:16;;47292:305;;;;:::o;47603:185::-;47643:1;47660:20;47678:1;47660:20;:::i;:::-;47655:25;;47694:20;47712:1;47694:20;:::i;:::-;47689:25;;47733:1;47723:35;;47738:18;;:::i;:::-;47723:35;47780:1;47777;47773:9;47768:14;;47603:185;;;;:::o;47794:348::-;47834:7;47857:20;47875:1;47857:20;:::i;:::-;47852:25;;47891:20;47909:1;47891:20;:::i;:::-;47886:25;;48079:1;48011:66;48007:74;48004:1;48001:81;47996:1;47989:9;47982:17;47978:105;47975:131;;;48086:18;;:::i;:::-;47975:131;48134:1;48131;48127:9;48116:20;;47794:348;;;;:::o;48148:191::-;48188:4;48208:20;48226:1;48208:20;:::i;:::-;48203:25;;48242:20;48260:1;48242:20;:::i;:::-;48237:25;;48281:1;48278;48275:8;48272:34;;;48286:18;;:::i;:::-;48272:34;48331:1;48328;48324:9;48316:17;;48148:191;;;;:::o;48345:96::-;48382:7;48411:24;48429:5;48411:24;:::i;:::-;48400:35;;48345:96;;;:::o;48447:90::-;48481:7;48524:5;48517:13;48510:21;48499:32;;48447:90;;;:::o;48543:77::-;48580:7;48609:5;48598:16;;48543:77;;;:::o;48626:149::-;48662:7;48702:66;48695:5;48691:78;48680:89;;48626:149;;;:::o;48781:126::-;48818:7;48858:42;48851:5;48847:54;48836:65;;48781:126;;;:::o;48913:77::-;48950:7;48979:5;48968:16;;48913:77;;;:::o;48996:143::-;49063:9;49096:37;49127:5;49096:37;:::i;:::-;49083:50;;48996:143;;;:::o;49145:126::-;49195:9;49228:37;49259:5;49228:37;:::i;:::-;49215:50;;49145:126;;;:::o;49277:113::-;49327:9;49360:24;49378:5;49360:24;:::i;:::-;49347:37;;49277:113;;;:::o;49396:154::-;49480:6;49475:3;49470;49457:30;49542:1;49533:6;49528:3;49524:16;49517:27;49396:154;;;:::o;49556:307::-;49624:1;49634:113;49648:6;49645:1;49642:13;49634:113;;;49733:1;49728:3;49724:11;49718:18;49714:1;49709:3;49705:11;49698:39;49670:2;49667:1;49663:10;49658:15;;49634:113;;;49765:6;49762:1;49759:13;49756:101;;;49845:1;49836:6;49831:3;49827:16;49820:27;49756:101;49605:258;49556:307;;;:::o;49869:171::-;49908:3;49931:24;49949:5;49931:24;:::i;:::-;49922:33;;49977:4;49970:5;49967:15;49964:41;;;49985:18;;:::i;:::-;49964:41;50032:1;50025:5;50021:13;50014:20;;49869:171;;;:::o;50046:320::-;50090:6;50127:1;50121:4;50117:12;50107:22;;50174:1;50168:4;50164:12;50195:18;50185:81;;50251:4;50243:6;50239:17;50229:27;;50185:81;50313:2;50305:6;50302:14;50282:18;50279:38;50276:84;;;50332:18;;:::i;:::-;50276:84;50097:269;50046:320;;;:::o;50372:281::-;50455:27;50477:4;50455:27;:::i;:::-;50447:6;50443:40;50585:6;50573:10;50570:22;50549:18;50537:10;50534:34;50531:62;50528:88;;;50596:18;;:::i;:::-;50528:88;50636:10;50632:2;50625:22;50415:238;50372:281;;:::o;50659:233::-;50698:3;50721:24;50739:5;50721:24;:::i;:::-;50712:33;;50767:66;50760:5;50757:77;50754:103;;;50837:18;;:::i;:::-;50754:103;50884:1;50877:5;50873:13;50866:20;;50659:233;;;:::o;50898:176::-;50930:1;50947:20;50965:1;50947:20;:::i;:::-;50942:25;;50981:20;50999:1;50981:20;:::i;:::-;50976:25;;51020:1;51010:35;;51025:18;;:::i;:::-;51010:35;51066:1;51063;51059:9;51054:14;;50898:176;;;;:::o;51080:180::-;51128:77;51125:1;51118:88;51225:4;51222:1;51215:15;51249:4;51246:1;51239:15;51266:180;51314:77;51311:1;51304:88;51411:4;51408:1;51401:15;51435:4;51432:1;51425:15;51452:180;51500:77;51497:1;51490:88;51597:4;51594:1;51587:15;51621:4;51618:1;51611:15;51638:180;51686:77;51683:1;51676:88;51783:4;51780:1;51773:15;51807:4;51804:1;51797:15;51824:180;51872:77;51869:1;51862:88;51969:4;51966:1;51959:15;51993:4;51990:1;51983:15;52010:183;52045:3;52083:1;52065:16;52062:23;52059:128;;;52121:1;52118;52115;52100:23;52143:34;52174:1;52168:8;52143:34;:::i;:::-;52136:41;;52059:128;52010:183;:::o;52199:117::-;52308:1;52305;52298:12;52322:117;52431:1;52428;52421:12;52445:117;52554:1;52551;52544:12;52568:117;52677:1;52674;52667:12;52691:117;52800:1;52797;52790:12;52814:117;52923:1;52920;52913:12;52937:102;52978:6;53029:2;53025:7;53020:2;53013:5;53009:14;53005:28;52995:38;;52937:102;;;:::o;53045:106::-;53089:8;53138:5;53133:3;53129:15;53108:36;;53045:106;;;:::o;53157:175::-;53297:27;53293:1;53285:6;53281:14;53274:51;53157:175;:::o;53338:239::-;53478:34;53474:1;53466:6;53462:14;53455:58;53547:22;53542:2;53534:6;53530:15;53523:47;53338:239;:::o;53583:182::-;53723:34;53719:1;53711:6;53707:14;53700:58;53583:182;:::o;53771:227::-;53911:34;53907:1;53899:6;53895:14;53888:58;53980:10;53975:2;53967:6;53963:15;53956:35;53771:227;:::o;54004:177::-;54144:29;54140:1;54132:6;54128:14;54121:53;54004:177;:::o;54187:230::-;54327:34;54323:1;54315:6;54311:14;54304:58;54396:13;54391:2;54383:6;54379:15;54372:38;54187:230;:::o;54423:179::-;54563:31;54559:1;54551:6;54547:14;54540:55;54423:179;:::o;54608:225::-;54748:34;54744:1;54736:6;54732:14;54725:58;54817:8;54812:2;54804:6;54800:15;54793:33;54608:225;:::o;54839:228::-;54979:34;54975:1;54967:6;54963:14;54956:58;55048:11;55043:2;55035:6;55031:15;55024:36;54839:228;:::o;55073:224::-;55213:34;55209:1;55201:6;55197:14;55190:58;55282:7;55277:2;55269:6;55265:15;55258:32;55073:224;:::o;55303:237::-;55443:34;55439:1;55431:6;55427:14;55420:58;55512:20;55507:2;55499:6;55495:15;55488:45;55303:237;:::o;55546:182::-;55686:34;55682:1;55674:6;55670:14;55663:58;55546:182;:::o;55734:229::-;55874:34;55870:1;55862:6;55858:14;55851:58;55943:12;55938:2;55930:6;55926:15;55919:37;55734:229;:::o;55969:182::-;56109:34;56105:1;56097:6;56093:14;56086:58;55969:182;:::o;56157:175::-;56297:27;56293:1;56285:6;56281:14;56274:51;56157:175;:::o;56338:173::-;56478:25;56474:1;56466:6;56462:14;56455:49;56338:173;:::o;56517:228::-;56657:34;56653:1;56645:6;56641:14;56634:58;56726:11;56721:2;56713:6;56709:15;56702:36;56517:228;:::o;56751:::-;56891:34;56887:1;56879:6;56875:14;56868:58;56960:11;56955:2;56947:6;56943:15;56936:36;56751:228;:::o;56985:175::-;57125:27;57121:1;57113:6;57109:14;57102:51;56985:175;:::o;57166:227::-;57306:34;57302:1;57294:6;57290:14;57283:58;57375:10;57370:2;57362:6;57358:15;57351:35;57166:227;:::o;57399:220::-;57539:34;57535:1;57527:6;57523:14;57516:58;57608:3;57603:2;57595:6;57591:15;57584:28;57399:220;:::o;57625:169::-;57765:21;57761:1;57753:6;57749:14;57742:45;57625:169;:::o;57800:167::-;57940:19;57936:1;57928:6;57924:14;57917:43;57800:167;:::o;57973:234::-;58113:34;58109:1;58101:6;58097:14;58090:58;58182:17;58177:2;58169:6;58165:15;58158:42;57973:234;:::o;58213:711::-;58252:3;58290:4;58272:16;58269:26;58266:39;;;58298:5;;58266:39;58327:20;;:::i;:::-;58402:1;58384:16;58380:24;58377:1;58371:4;58356:49;58435:4;58429:11;58534:16;58527:4;58519:6;58515:17;58512:39;58479:18;58471:6;58468:30;58452:113;58449:146;;;58580:5;;;;58449:146;58626:6;58620:4;58616:17;58662:3;58656:10;58689:18;58681:6;58678:30;58675:43;;;58711:5;;;;;;58675:43;58759:6;58752:4;58747:3;58743:14;58739:27;58818:1;58800:16;58796:24;58790:4;58786:35;58781:3;58778:44;58775:57;;;58825:5;;;;;;;58775:57;58842;58890:6;58884:4;58880:17;58872:6;58868:30;58862:4;58842:57;:::i;:::-;58915:3;58908:10;;58256:668;;;;;58213:711;;:::o;58930:122::-;59003:24;59021:5;59003:24;:::i;:::-;58996:5;58993:35;58983:63;;59042:1;59039;59032:12;58983:63;58930:122;:::o;59058:116::-;59128:21;59143:5;59128:21;:::i;:::-;59121:5;59118:32;59108:60;;59164:1;59161;59154:12;59108:60;59058:116;:::o;59180:122::-;59253:24;59271:5;59253:24;:::i;:::-;59246:5;59243:35;59233:63;;59292:1;59289;59282:12;59233:63;59180:122;:::o;59308:120::-;59380:23;59397:5;59380:23;:::i;:::-;59373:5;59370:34;59360:62;;59418:1;59415;59408:12;59360:62;59308:120;:::o;59434:122::-;59507:24;59525:5;59507:24;:::i;:::-;59500:5;59497:35;59487:63;;59546:1;59543;59536:12;59487:63;59434:122;:::o

Swarm Source

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