ETH Price: $2,280.74 (+2.16%)
Gas: 0.82 Gwei

Token

PKPR Charity Collective (PKPR)
 

Overview

Max Total Supply

402 PKPR

Holders

50

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

0x66b3ed4ad3fcbec1e2f80c8a931a45c7a06e6d85
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PKPRNFT

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 2022-10-16
*/

/**
 *Submitted for verification at Etherscan.io on 2022-05-10
*/

// SPDX-License-Identifier: MIT
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol


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

pragma solidity ^0.8.0;


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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.6.0) (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: address zero is not a valid owner");
        return _balances[id][account];
    }

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

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

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

        return batchBalances;
    }

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not 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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits 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 {}

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

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

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

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

        return array;
    }
}





pragma solidity ^0.8.0;


contract PKPRNFT is ERC1155, Ownable {

  uint256 public maxMintAmountPerTx = 9;
  using Counters for Counters.Counter;
  Counters.Counter private supply;
  uint256 currentIndex = 0;
    
  string public name;
  string public symbol;
  bool public paused = true;
  mapping(uint => string) public tokenURI;



  constructor() ERC1155("") {
    name = "PKPR Charity Collective";
    symbol = "PKPR";
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    _;
  }
  function totalSupply() public view returns (uint256) {
    return supply.current();
  }
   function currentId() public view returns (uint256) {
    return currentIndex;
  }

  function mint(uint _mintAmount) public payable mintCompliance(_mintAmount) {
      require(!paused, "The contract is paused!");
        uint[] memory tokenIds = new uint[](_mintAmount);
        uint[] memory amounts = new uint[](_mintAmount);
        for (uint256 i = 0; i < _mintAmount; i++) {
            supply.increment();
            tokenIds[i] = currentIndex % 9;
            amounts[i] = 1;
            currentIndex++;
        }
      _mintBatch(msg.sender, tokenIds, amounts, "");
  }

  function burn(uint _id, uint _amount) external {
    _burn(msg.sender, _id, _amount);
  }

  function burnBatch(uint[] memory _ids, uint[] memory _amounts) external {
    _burnBatch(msg.sender, _ids, _amounts);
  }

  function burnForMint(address _from, uint[] memory _burnIds, uint[] memory _burnAmounts, uint[] memory _mintIds, uint[] memory _mintAmounts) external onlyOwner {
    _burnBatch(_from, _burnIds, _burnAmounts);
    _mintBatch(_from, _mintIds, _mintAmounts, "");
  }

  function setURI(uint _id, string memory _uri) external onlyOwner {
    tokenURI[_id] = _uri;
    emit URI(_uri, _id);
  }

  function setBatchURI(uint[] memory ids, string[] memory _uris) external onlyOwner {
      for(uint256 i = 0; i < ids.length; i++) {
          tokenURI[ids[i]] = _uris[i];
          emit URI(_uris[i], ids[i]);
      }
  }

   function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function uri(uint _id) public override view returns (string memory) {
    return tokenURI[_id];
  }


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

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"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":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256[]","name":"_burnIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_burnAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_mintIds","type":"uint256[]"},{"internalType":"uint256[]","name":"_mintAmounts","type":"uint256[]"}],"name":"burnForMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"string[]","name":"_uris","type":"string[]"}],"name":"setBatchURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600960045560006006556001600960006101000a81548160ff0219169083151502179055503480156200003657600080fd5b506040518060200160405280600081525062000058816200011b60201b60201c565b50620000796200006d6200013760201b60201c565b6200013f60201b60201c565b6040518060400160405280601781526020017f504b5052204368617269747920436f6c6c65637469766500000000000000000081525060079080519060200190620000c692919062000205565b506040518060400160405280600481526020017f504b505200000000000000000000000000000000000000000000000000000000815250600890805190602001906200011492919062000205565b506200031a565b80600290805190602001906200013392919062000205565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021390620002b5565b90600052602060002090601f01602090048101928262000237576000855562000283565b82601f106200025257805160ff191683800117855562000283565b8280016001018555821562000283579182015b828111156200028257825182559160200191906001019062000265565b5b50905062000292919062000296565b5090565b5b80821115620002b157600081600090555060010162000297565b5090565b60006002820490506001821680620002ce57607f821691505b60208210811415620002e557620002e4620002eb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614542806200032a6000396000f3fe6080604052600436106101805760003560e01c806383ca4b6f116100d1578063a22cb4651161008a578063e00dd16111610064578063e00dd1611461053d578063e985e9c514610568578063f242432a146105a5578063f2fde38b146105ce57610180565b8063a22cb465146104ae578063b390c0ab146104d7578063c87b56dd1461050057610180565b806383ca4b6f146103bf578063862440e2146103e85780638da5cb5b1461041157806394354fd01461043c57806395d89b4114610467578063a0712d681461049257610180565b80631bf66f371161013e5780634e1273f4116101185780634e1273f414610317578063510f4104146103545780635c975abb1461037d578063715018a6146103a857610180565b80631bf66f37146102bb5780632eb2c2d6146102e45780633ccfd60b1461030d57610180565b8062fdd58e1461018557806301ffc9a7146101c257806306fdde03146101ff5780630e89341c1461022a57806316c38b3c1461026757806318160ddd14610290575b600080fd5b34801561019157600080fd5b506101ac60048036038101906101a7919061305e565b6105f7565b6040516101b99190613a60565b60405180910390f35b3480156101ce57600080fd5b506101e960048036038101906101e49190613233565b6106c0565b6040516101f69190613803565b60405180910390f35b34801561020b57600080fd5b506102146107a2565b604051610221919061381e565b60405180910390f35b34801561023657600080fd5b50610251600480360381019061024c919061328d565b610830565b60405161025e919061381e565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190613206565b6108d5565b005b34801561029c57600080fd5b506102a561096e565b6040516102b29190613a60565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd9190613116565b61097f565b005b3480156102f057600080fd5b5061030b60048036038101906103069190612dcd565b610ae7565b005b610315610b88565b005b34801561032357600080fd5b5061033e6004803603810190610339919061309e565b610c44565b60405161034b91906137aa565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190612f33565b610d5d565b005b34801561038957600080fd5b50610392610e06565b60405161039f9190613803565b60405180910390f35b3480156103b457600080fd5b506103bd610e19565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061318e565b610ea1565b005b3480156103f457600080fd5b5061040f600480360381019061040a91906132ba565b610eb0565b005b34801561041d57600080fd5b50610426610f90565b60405161043391906136cd565b60405180910390f35b34801561044857600080fd5b50610451610fba565b60405161045e9190613a60565b60405180910390f35b34801561047357600080fd5b5061047c610fc0565b604051610489919061381e565b60405180910390f35b6104ac60048036038101906104a7919061328d565b61104e565b005b3480156104ba57600080fd5b506104d560048036038101906104d0919061301e565b61123b565b005b3480156104e357600080fd5b506104fe60048036038101906104f99190613316565b611251565b005b34801561050c57600080fd5b506105276004803603810190610522919061328d565b611260565b604051610534919061381e565b60405180910390f35b34801561054957600080fd5b50610552611300565b60405161055f9190613a60565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190612d8d565b61130a565b60405161059c9190613803565b60405180910390f35b3480156105b157600080fd5b506105cc60048036038101906105c79190612e9c565b61139e565b005b3480156105da57600080fd5b506105f560048036038101906105f09190612d60565b61143f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065f90613900565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079b575061079a82611537565b5b9050919050565b600780546107af90613d2c565b80601f01602080910402602001604051908101604052809291908181526020018280546107db90613d2c565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b505050505081565b6060600a6000838152602001908152602001600020805461085090613d2c565b80601f016020809104026020016040519081016040528092919081815260200182805461087c90613d2c565b80156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b50505050509050919050565b6108dd6115a1565b73ffffffffffffffffffffffffffffffffffffffff166108fb610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610948906139a0565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b600061097a60056115a9565b905090565b6109876115a1565b73ffffffffffffffffffffffffffffffffffffffff166109a5610f90565b73ffffffffffffffffffffffffffffffffffffffff16146109fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f2906139a0565b60405180910390fd5b60005b8251811015610ae257818181518110610a1a57610a19613e96565b5b6020026020010151600a6000858481518110610a3957610a38613e96565b5b602002602001015181526020019081526020016000209080519060200190610a6292919061297c565b50828181518110610a7657610a75613e96565b5b60200260200101517f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b838381518110610ab257610ab1613e96565b5b6020026020010151604051610ac7919061381e565b60405180910390a28080610ada90613d8f565b9150506109fe565b505050565b610aef6115a1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b355750610b3485610b2f6115a1565b61130a565b5b610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b90613940565b60405180910390fd5b610b8185858585856115b7565b5050505050565b610b906115a1565b73ffffffffffffffffffffffffffffffffffffffff16610bae610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfb906139a0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c4257600080fd5b565b60608151835114610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190613a00565b60405180910390fd5b6000835167ffffffffffffffff811115610ca757610ca6613ec5565b5b604051908082528060200260200182016040528015610cd55781602001602082028036833780820191505090505b50905060005b8451811015610d5257610d22858281518110610cfa57610cf9613e96565b5b6020026020010151858381518110610d1557610d14613e96565b5b60200260200101516105f7565b828281518110610d3557610d34613e96565b5b60200260200101818152505080610d4b90613d8f565b9050610cdb565b508091505092915050565b610d656115a1565b73ffffffffffffffffffffffffffffffffffffffff16610d83610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd0906139a0565b60405180910390fd5b610de48585856118d9565b610dff85838360405180602001604052806000815250611ba8565b5050505050565b600960009054906101000a900460ff1681565b610e216115a1565b73ffffffffffffffffffffffffffffffffffffffff16610e3f610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c906139a0565b60405180910390fd5b610e9f6000611dd5565b565b610eac3383836118d9565b5050565b610eb86115a1565b73ffffffffffffffffffffffffffffffffffffffff16610ed6610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f23906139a0565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190610f5392919061297c565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051610f84919061381e565b60405180910390a25050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045481565b60088054610fcd90613d2c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff990613d2c565b80156110465780601f1061101b57610100808354040283529160200191611046565b820191906000526020600020905b81548152906001019060200180831161102957829003601f168201915b505050505081565b8060008111801561106157506004548111155b6110a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611097906138c0565b60405180910390fd5b600960009054906101000a900460ff16156110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e7906139c0565b60405180910390fd5b60008267ffffffffffffffff81111561110c5761110b613ec5565b5b60405190808252806020026020018201604052801561113a5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff81111561115957611158613ec5565b5b6040519080825280602002602001820160405280156111875781602001602082028036833780820191505090505b50905060005b848110156112195761119f6005611e9b565b60096006546111ae9190613dd8565b8382815181106111c1576111c0613e96565b5b60200260200101818152505060018282815181106111e2576111e1613e96565b5b6020026020010181815250506006600081548092919061120190613d8f565b9190505550808061121190613d8f565b91505061118d565b5061123533838360405180602001604052806000815250611ba8565b50505050565b61124d6112466115a1565b8383611eb1565b5050565b61125c33838361201e565b5050565b600a602052806000526040600020600091509050805461127f90613d2c565b80601f01602080910402602001604051908101604052809291908181526020018280546112ab90613d2c565b80156112f85780601f106112cd576101008083540402835291602001916112f8565b820191906000526020600020905b8154815290600101906020018083116112db57829003601f168201915b505050505081565b6000600654905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113a66115a1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113ec57506113eb856113e66115a1565b61130a565b5b61142b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611422906138e0565b60405180910390fd5b6114388585858585612265565b5050505050565b6114476115a1565b73ffffffffffffffffffffffffffffffffffffffff16611465610f90565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b2906139a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290613880565b60405180910390fd5b61153481611dd5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081600001549050919050565b81518351146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290613a20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166290613920565b60405180910390fd5b60006116756115a1565b9050611685818787878787612501565b60005b84518110156118365760008582815181106116a6576116a5613e96565b5b6020026020010151905060008583815181106116c5576116c4613e96565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d90613980565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461181b9190613c20565b925050819055505050508061182f90613d8f565b9050611688565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118ad9291906137cc565b60405180910390a46118c3818787878787612509565b6118d1818787878787612511565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194090613960565b60405180910390fd5b805182511461198d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198490613a20565b60405180910390fd5b60006119976115a1565b90506119b781856000868660405180602001604052806000815250612501565b60005b8351811015611b045760008482815181106119d8576119d7613e96565b5b6020026020010151905060008483815181106119f7576119f6613e96565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f906138a0565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611afc90613d8f565b9150506119ba565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611b7c9291906137cc565b60405180910390a4611ba281856000868660405180602001604052806000815250612509565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613a40565b60405180910390fd5b8151835114611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613a20565b60405180910390fd5b6000611c666115a1565b9050611c7781600087878787612501565b60005b8451811015611d3057838181518110611c9657611c95613e96565b5b6020026020010151600080878481518110611cb457611cb3613e96565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d169190613c20565b925050819055508080611d2890613d8f565b915050611c7a565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611da89291906137cc565b60405180910390a4611dbf81600087878787612509565b611dce81600087878787612511565b5050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f17906139e0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120119190613803565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208590613960565b60405180910390fd5b60006120986115a1565b905060006120a5846126f8565b905060006120b2846126f8565b90506120d283876000858560405180602001604052806000815250612501565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612160906138a0565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612236929190613a7b565b60405180910390a461225c84886000868660405180602001604052806000815250612509565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cc90613920565b60405180910390fd5b60006122df6115a1565b905060006122ec856126f8565b905060006122f9856126f8565b9050612309838989858589612501565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156123a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239790613980565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124559190613c20565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516124d2929190613a7b565b60405180910390a46124e8848a8a86868a612509565b6124f6848a8a8a8a8a612772565b505050505050505050565b505050505050565b505050505050565b6125308473ffffffffffffffffffffffffffffffffffffffff16612959565b156126f0578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016125769594939291906136e8565b602060405180830381600087803b15801561259057600080fd5b505af19250505080156125c157506040513d601f19601f820116820180604052508101906125be9190613260565b60015b612667576125cd613ef4565b806308c379a0141561262a57506125e261441a565b806125ed575061262c565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612621919061381e565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e90613840565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146126ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e590613860565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561271757612716613ec5565b5b6040519080825280602002602001820160405280156127455781602001602082028036833780820191505090505b509050828160008151811061275d5761275c613e96565b5b60200260200101818152505080915050919050565b6127918473ffffffffffffffffffffffffffffffffffffffff16612959565b15612951578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016127d7959493929190613750565b602060405180830381600087803b1580156127f157600080fd5b505af192505050801561282257506040513d601f19601f8201168201806040525081019061281f9190613260565b60015b6128c85761282e613ef4565b806308c379a0141561288b575061284361441a565b8061284e575061288d565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612882919061381e565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bf90613840565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461294f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294690613860565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461298890613d2c565b90600052602060002090601f0160209004810192826129aa57600085556129f1565b82601f106129c357805160ff19168380011785556129f1565b828001600101855582156129f1579182015b828111156129f05782518255916020019190600101906129d5565b5b5090506129fe9190612a02565b5090565b5b80821115612a1b576000816000905550600101612a03565b5090565b6000612a32612a2d84613ac9565b613aa4565b90508083825260208201905082856020860282011115612a5557612a54613f1b565b5b60005b85811015612a855781612a6b8882612c11565b845260208401935060208301925050600181019050612a58565b5050509392505050565b6000612aa2612a9d84613af5565b613aa4565b90508083825260208201905082856020860282011115612ac557612ac4613f1b565b5b60005b85811015612b1357813567ffffffffffffffff811115612aeb57612aea613f16565b5b808601612af88982612d1d565b85526020850194506020840193505050600181019050612ac8565b5050509392505050565b6000612b30612b2b84613b21565b613aa4565b90508083825260208201905082856020860282011115612b5357612b52613f1b565b5b60005b85811015612b835781612b698882612d4b565b845260208401935060208301925050600181019050612b56565b5050509392505050565b6000612ba0612b9b84613b4d565b613aa4565b905082815260208101848484011115612bbc57612bbb613f20565b5b612bc7848285613cea565b509392505050565b6000612be2612bdd84613b7e565b613aa4565b905082815260208101848484011115612bfe57612bfd613f20565b5b612c09848285613cea565b509392505050565b600081359050612c20816144b0565b92915050565b600082601f830112612c3b57612c3a613f16565b5b8135612c4b848260208601612a1f565b91505092915050565b600082601f830112612c6957612c68613f16565b5b8135612c79848260208601612a8f565b91505092915050565b600082601f830112612c9757612c96613f16565b5b8135612ca7848260208601612b1d565b91505092915050565b600081359050612cbf816144c7565b92915050565b600081359050612cd4816144de565b92915050565b600081519050612ce9816144de565b92915050565b600082601f830112612d0457612d03613f16565b5b8135612d14848260208601612b8d565b91505092915050565b600082601f830112612d3257612d31613f16565b5b8135612d42848260208601612bcf565b91505092915050565b600081359050612d5a816144f5565b92915050565b600060208284031215612d7657612d75613f2a565b5b6000612d8484828501612c11565b91505092915050565b60008060408385031215612da457612da3613f2a565b5b6000612db285828601612c11565b9250506020612dc385828601612c11565b9150509250929050565b600080600080600060a08688031215612de957612de8613f2a565b5b6000612df788828901612c11565b9550506020612e0888828901612c11565b945050604086013567ffffffffffffffff811115612e2957612e28613f25565b5b612e3588828901612c82565b935050606086013567ffffffffffffffff811115612e5657612e55613f25565b5b612e6288828901612c82565b925050608086013567ffffffffffffffff811115612e8357612e82613f25565b5b612e8f88828901612cef565b9150509295509295909350565b600080600080600060a08688031215612eb857612eb7613f2a565b5b6000612ec688828901612c11565b9550506020612ed788828901612c11565b9450506040612ee888828901612d4b565b9350506060612ef988828901612d4b565b925050608086013567ffffffffffffffff811115612f1a57612f19613f25565b5b612f2688828901612cef565b9150509295509295909350565b600080600080600060a08688031215612f4f57612f4e613f2a565b5b6000612f5d88828901612c11565b955050602086013567ffffffffffffffff811115612f7e57612f7d613f25565b5b612f8a88828901612c82565b945050604086013567ffffffffffffffff811115612fab57612faa613f25565b5b612fb788828901612c82565b935050606086013567ffffffffffffffff811115612fd857612fd7613f25565b5b612fe488828901612c82565b925050608086013567ffffffffffffffff81111561300557613004613f25565b5b61301188828901612c82565b9150509295509295909350565b6000806040838503121561303557613034613f2a565b5b600061304385828601612c11565b925050602061305485828601612cb0565b9150509250929050565b6000806040838503121561307557613074613f2a565b5b600061308385828601612c11565b925050602061309485828601612d4b565b9150509250929050565b600080604083850312156130b5576130b4613f2a565b5b600083013567ffffffffffffffff8111156130d3576130d2613f25565b5b6130df85828601612c26565b925050602083013567ffffffffffffffff811115613100576130ff613f25565b5b61310c85828601612c82565b9150509250929050565b6000806040838503121561312d5761312c613f2a565b5b600083013567ffffffffffffffff81111561314b5761314a613f25565b5b61315785828601612c82565b925050602083013567ffffffffffffffff81111561317857613177613f25565b5b61318485828601612c54565b9150509250929050565b600080604083850312156131a5576131a4613f2a565b5b600083013567ffffffffffffffff8111156131c3576131c2613f25565b5b6131cf85828601612c82565b925050602083013567ffffffffffffffff8111156131f0576131ef613f25565b5b6131fc85828601612c82565b9150509250929050565b60006020828403121561321c5761321b613f2a565b5b600061322a84828501612cb0565b91505092915050565b60006020828403121561324957613248613f2a565b5b600061325784828501612cc5565b91505092915050565b60006020828403121561327657613275613f2a565b5b600061328484828501612cda565b91505092915050565b6000602082840312156132a3576132a2613f2a565b5b60006132b184828501612d4b565b91505092915050565b600080604083850312156132d1576132d0613f2a565b5b60006132df85828601612d4b565b925050602083013567ffffffffffffffff811115613300576132ff613f25565b5b61330c85828601612d1d565b9150509250929050565b6000806040838503121561332d5761332c613f2a565b5b600061333b85828601612d4b565b925050602061334c85828601612d4b565b9150509250929050565b600061336283836136af565b60208301905092915050565b61337781613c76565b82525050565b600061338882613bbf565b6133928185613bed565b935061339d83613baf565b8060005b838110156133ce5781516133b58882613356565b97506133c083613be0565b9250506001810190506133a1565b5085935050505092915050565b6133e481613c88565b82525050565b60006133f582613bca565b6133ff8185613bfe565b935061340f818560208601613cf9565b61341881613f2f565b840191505092915050565b600061342e82613bd5565b6134388185613c0f565b9350613448818560208601613cf9565b61345181613f2f565b840191505092915050565b6000613469603483613c0f565b915061347482613f4d565b604082019050919050565b600061348c602883613c0f565b915061349782613f9c565b604082019050919050565b60006134af602683613c0f565b91506134ba82613feb565b604082019050919050565b60006134d2602483613c0f565b91506134dd8261403a565b604082019050919050565b60006134f5601483613c0f565b915061350082614089565b602082019050919050565b6000613518602983613c0f565b9150613523826140b2565b604082019050919050565b600061353b602a83613c0f565b915061354682614101565b604082019050919050565b600061355e602583613c0f565b915061356982614150565b604082019050919050565b6000613581603283613c0f565b915061358c8261419f565b604082019050919050565b60006135a4602383613c0f565b91506135af826141ee565b604082019050919050565b60006135c7602a83613c0f565b91506135d28261423d565b604082019050919050565b60006135ea602083613c0f565b91506135f58261428c565b602082019050919050565b600061360d601783613c0f565b9150613618826142b5565b602082019050919050565b6000613630602983613c0f565b915061363b826142de565b604082019050919050565b6000613653602983613c0f565b915061365e8261432d565b604082019050919050565b6000613676602883613c0f565b91506136818261437c565b604082019050919050565b6000613699602183613c0f565b91506136a4826143cb565b604082019050919050565b6136b881613ce0565b82525050565b6136c781613ce0565b82525050565b60006020820190506136e2600083018461336e565b92915050565b600060a0820190506136fd600083018861336e565b61370a602083018761336e565b818103604083015261371c818661337d565b90508181036060830152613730818561337d565b9050818103608083015261374481846133ea565b90509695505050505050565b600060a082019050613765600083018861336e565b613772602083018761336e565b61377f60408301866136be565b61378c60608301856136be565b818103608083015261379e81846133ea565b90509695505050505050565b600060208201905081810360008301526137c4818461337d565b905092915050565b600060408201905081810360008301526137e6818561337d565b905081810360208301526137fa818461337d565b90509392505050565b600060208201905061381860008301846133db565b92915050565b600060208201905081810360008301526138388184613423565b905092915050565b600060208201905081810360008301526138598161345c565b9050919050565b600060208201905081810360008301526138798161347f565b9050919050565b60006020820190508181036000830152613899816134a2565b9050919050565b600060208201905081810360008301526138b9816134c5565b9050919050565b600060208201905081810360008301526138d9816134e8565b9050919050565b600060208201905081810360008301526138f98161350b565b9050919050565b600060208201905081810360008301526139198161352e565b9050919050565b6000602082019050818103600083015261393981613551565b9050919050565b6000602082019050818103600083015261395981613574565b9050919050565b6000602082019050818103600083015261397981613597565b9050919050565b60006020820190508181036000830152613999816135ba565b9050919050565b600060208201905081810360008301526139b9816135dd565b9050919050565b600060208201905081810360008301526139d981613600565b9050919050565b600060208201905081810360008301526139f981613623565b9050919050565b60006020820190508181036000830152613a1981613646565b9050919050565b60006020820190508181036000830152613a3981613669565b9050919050565b60006020820190508181036000830152613a598161368c565b9050919050565b6000602082019050613a7560008301846136be565b92915050565b6000604082019050613a9060008301856136be565b613a9d60208301846136be565b9392505050565b6000613aae613abf565b9050613aba8282613d5e565b919050565b6000604051905090565b600067ffffffffffffffff821115613ae457613ae3613ec5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b1057613b0f613ec5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b3c57613b3b613ec5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b6857613b67613ec5565b5b613b7182613f2f565b9050602081019050919050565b600067ffffffffffffffff821115613b9957613b98613ec5565b5b613ba282613f2f565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613c2b82613ce0565b9150613c3683613ce0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6b57613c6a613e09565b5b828201905092915050565b6000613c8182613cc0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d17578082015181840152602081019050613cfc565b83811115613d26576000848401525b50505050565b60006002820490506001821680613d4457607f821691505b60208210811415613d5857613d57613e67565b5b50919050565b613d6782613f2f565b810181811067ffffffffffffffff82111715613d8657613d85613ec5565b5b80604052505050565b6000613d9a82613ce0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dcd57613dcc613e09565b5b600182019050919050565b6000613de382613ce0565b9150613dee83613ce0565b925082613dfe57613dfd613e38565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115613f135760046000803e613f10600051613f40565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101561442a576144ad565b614432613abf565b60043d036004823e80513d602482011167ffffffffffffffff8211171561445a5750506144ad565b808201805167ffffffffffffffff81111561447857505050506144ad565b80602083010160043d0385018111156144955750505050506144ad565b6144a482602001850186613d5e565b82955050505050505b90565b6144b981613c76565b81146144c457600080fd5b50565b6144d081613c88565b81146144db57600080fd5b50565b6144e781613c94565b81146144f257600080fd5b50565b6144fe81613ce0565b811461450957600080fd5b5056fea26469706673582212204b5d7fee3c3f9b723842eae7897a3c0377164788db74522690ac54435214792764736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101805760003560e01c806383ca4b6f116100d1578063a22cb4651161008a578063e00dd16111610064578063e00dd1611461053d578063e985e9c514610568578063f242432a146105a5578063f2fde38b146105ce57610180565b8063a22cb465146104ae578063b390c0ab146104d7578063c87b56dd1461050057610180565b806383ca4b6f146103bf578063862440e2146103e85780638da5cb5b1461041157806394354fd01461043c57806395d89b4114610467578063a0712d681461049257610180565b80631bf66f371161013e5780634e1273f4116101185780634e1273f414610317578063510f4104146103545780635c975abb1461037d578063715018a6146103a857610180565b80631bf66f37146102bb5780632eb2c2d6146102e45780633ccfd60b1461030d57610180565b8062fdd58e1461018557806301ffc9a7146101c257806306fdde03146101ff5780630e89341c1461022a57806316c38b3c1461026757806318160ddd14610290575b600080fd5b34801561019157600080fd5b506101ac60048036038101906101a7919061305e565b6105f7565b6040516101b99190613a60565b60405180910390f35b3480156101ce57600080fd5b506101e960048036038101906101e49190613233565b6106c0565b6040516101f69190613803565b60405180910390f35b34801561020b57600080fd5b506102146107a2565b604051610221919061381e565b60405180910390f35b34801561023657600080fd5b50610251600480360381019061024c919061328d565b610830565b60405161025e919061381e565b60405180910390f35b34801561027357600080fd5b5061028e60048036038101906102899190613206565b6108d5565b005b34801561029c57600080fd5b506102a561096e565b6040516102b29190613a60565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd9190613116565b61097f565b005b3480156102f057600080fd5b5061030b60048036038101906103069190612dcd565b610ae7565b005b610315610b88565b005b34801561032357600080fd5b5061033e6004803603810190610339919061309e565b610c44565b60405161034b91906137aa565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190612f33565b610d5d565b005b34801561038957600080fd5b50610392610e06565b60405161039f9190613803565b60405180910390f35b3480156103b457600080fd5b506103bd610e19565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061318e565b610ea1565b005b3480156103f457600080fd5b5061040f600480360381019061040a91906132ba565b610eb0565b005b34801561041d57600080fd5b50610426610f90565b60405161043391906136cd565b60405180910390f35b34801561044857600080fd5b50610451610fba565b60405161045e9190613a60565b60405180910390f35b34801561047357600080fd5b5061047c610fc0565b604051610489919061381e565b60405180910390f35b6104ac60048036038101906104a7919061328d565b61104e565b005b3480156104ba57600080fd5b506104d560048036038101906104d0919061301e565b61123b565b005b3480156104e357600080fd5b506104fe60048036038101906104f99190613316565b611251565b005b34801561050c57600080fd5b506105276004803603810190610522919061328d565b611260565b604051610534919061381e565b60405180910390f35b34801561054957600080fd5b50610552611300565b60405161055f9190613a60565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190612d8d565b61130a565b60405161059c9190613803565b60405180910390f35b3480156105b157600080fd5b506105cc60048036038101906105c79190612e9c565b61139e565b005b3480156105da57600080fd5b506105f560048036038101906105f09190612d60565b61143f565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065f90613900565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079b575061079a82611537565b5b9050919050565b600780546107af90613d2c565b80601f01602080910402602001604051908101604052809291908181526020018280546107db90613d2c565b80156108285780601f106107fd57610100808354040283529160200191610828565b820191906000526020600020905b81548152906001019060200180831161080b57829003601f168201915b505050505081565b6060600a6000838152602001908152602001600020805461085090613d2c565b80601f016020809104026020016040519081016040528092919081815260200182805461087c90613d2c565b80156108c95780601f1061089e576101008083540402835291602001916108c9565b820191906000526020600020905b8154815290600101906020018083116108ac57829003601f168201915b50505050509050919050565b6108dd6115a1565b73ffffffffffffffffffffffffffffffffffffffff166108fb610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610948906139a0565b60405180910390fd5b80600960006101000a81548160ff02191690831515021790555050565b600061097a60056115a9565b905090565b6109876115a1565b73ffffffffffffffffffffffffffffffffffffffff166109a5610f90565b73ffffffffffffffffffffffffffffffffffffffff16146109fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f2906139a0565b60405180910390fd5b60005b8251811015610ae257818181518110610a1a57610a19613e96565b5b6020026020010151600a6000858481518110610a3957610a38613e96565b5b602002602001015181526020019081526020016000209080519060200190610a6292919061297c565b50828181518110610a7657610a75613e96565b5b60200260200101517f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b838381518110610ab257610ab1613e96565b5b6020026020010151604051610ac7919061381e565b60405180910390a28080610ada90613d8f565b9150506109fe565b505050565b610aef6115a1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610b355750610b3485610b2f6115a1565b61130a565b5b610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b90613940565b60405180910390fd5b610b8185858585856115b7565b5050505050565b610b906115a1565b73ffffffffffffffffffffffffffffffffffffffff16610bae610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfb906139a0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610c4257600080fd5b565b60608151835114610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190613a00565b60405180910390fd5b6000835167ffffffffffffffff811115610ca757610ca6613ec5565b5b604051908082528060200260200182016040528015610cd55781602001602082028036833780820191505090505b50905060005b8451811015610d5257610d22858281518110610cfa57610cf9613e96565b5b6020026020010151858381518110610d1557610d14613e96565b5b60200260200101516105f7565b828281518110610d3557610d34613e96565b5b60200260200101818152505080610d4b90613d8f565b9050610cdb565b508091505092915050565b610d656115a1565b73ffffffffffffffffffffffffffffffffffffffff16610d83610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd0906139a0565b60405180910390fd5b610de48585856118d9565b610dff85838360405180602001604052806000815250611ba8565b5050505050565b600960009054906101000a900460ff1681565b610e216115a1565b73ffffffffffffffffffffffffffffffffffffffff16610e3f610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c906139a0565b60405180910390fd5b610e9f6000611dd5565b565b610eac3383836118d9565b5050565b610eb86115a1565b73ffffffffffffffffffffffffffffffffffffffff16610ed6610f90565b73ffffffffffffffffffffffffffffffffffffffff1614610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f23906139a0565b60405180910390fd5b80600a60008481526020019081526020016000209080519060200190610f5392919061297c565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b82604051610f84919061381e565b60405180910390a25050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60045481565b60088054610fcd90613d2c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff990613d2c565b80156110465780601f1061101b57610100808354040283529160200191611046565b820191906000526020600020905b81548152906001019060200180831161102957829003601f168201915b505050505081565b8060008111801561106157506004548111155b6110a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611097906138c0565b60405180910390fd5b600960009054906101000a900460ff16156110f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e7906139c0565b60405180910390fd5b60008267ffffffffffffffff81111561110c5761110b613ec5565b5b60405190808252806020026020018201604052801561113a5781602001602082028036833780820191505090505b50905060008367ffffffffffffffff81111561115957611158613ec5565b5b6040519080825280602002602001820160405280156111875781602001602082028036833780820191505090505b50905060005b848110156112195761119f6005611e9b565b60096006546111ae9190613dd8565b8382815181106111c1576111c0613e96565b5b60200260200101818152505060018282815181106111e2576111e1613e96565b5b6020026020010181815250506006600081548092919061120190613d8f565b9190505550808061121190613d8f565b91505061118d565b5061123533838360405180602001604052806000815250611ba8565b50505050565b61124d6112466115a1565b8383611eb1565b5050565b61125c33838361201e565b5050565b600a602052806000526040600020600091509050805461127f90613d2c565b80601f01602080910402602001604051908101604052809291908181526020018280546112ab90613d2c565b80156112f85780601f106112cd576101008083540402835291602001916112f8565b820191906000526020600020905b8154815290600101906020018083116112db57829003601f168201915b505050505081565b6000600654905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113a66115a1565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113ec57506113eb856113e66115a1565b61130a565b5b61142b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611422906138e0565b60405180910390fd5b6114388585858585612265565b5050505050565b6114476115a1565b73ffffffffffffffffffffffffffffffffffffffff16611465610f90565b73ffffffffffffffffffffffffffffffffffffffff16146114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b2906139a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290613880565b60405180910390fd5b61153481611dd5565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081600001549050919050565b81518351146115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290613a20565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561166b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166290613920565b60405180910390fd5b60006116756115a1565b9050611685818787878787612501565b60005b84518110156118365760008582815181106116a6576116a5613e96565b5b6020026020010151905060008583815181106116c5576116c4613e96565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175d90613980565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461181b9190613c20565b925050819055505050508061182f90613d8f565b9050611688565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516118ad9291906137cc565b60405180910390a46118c3818787878787612509565b6118d1818787878787612511565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194090613960565b60405180910390fd5b805182511461198d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198490613a20565b60405180910390fd5b60006119976115a1565b90506119b781856000868660405180602001604052806000815250612501565b60005b8351811015611b045760008482815181106119d8576119d7613e96565b5b6020026020010151905060008483815181106119f7576119f6613e96565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8f906138a0565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611afc90613d8f565b9150506119ba565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611b7c9291906137cc565b60405180910390a4611ba281856000868660405180602001604052806000815250612509565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613a40565b60405180910390fd5b8151835114611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5390613a20565b60405180910390fd5b6000611c666115a1565b9050611c7781600087878787612501565b60005b8451811015611d3057838181518110611c9657611c95613e96565b5b6020026020010151600080878481518110611cb457611cb3613e96565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d169190613c20565b925050819055508080611d2890613d8f565b915050611c7a565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611da89291906137cc565b60405180910390a4611dbf81600087878787612509565b611dce81600087878787612511565b5050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f17906139e0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120119190613803565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561208e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208590613960565b60405180910390fd5b60006120986115a1565b905060006120a5846126f8565b905060006120b2846126f8565b90506120d283876000858560405180602001604052806000815250612501565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612169576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612160906138a0565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612236929190613a7b565b60405180910390a461225c84886000868660405180602001604052806000815250612509565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122cc90613920565b60405180910390fd5b60006122df6115a1565b905060006122ec856126f8565b905060006122f9856126f8565b9050612309838989858589612501565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156123a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239790613980565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124559190613c20565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516124d2929190613a7b565b60405180910390a46124e8848a8a86868a612509565b6124f6848a8a8a8a8a612772565b505050505050505050565b505050505050565b505050505050565b6125308473ffffffffffffffffffffffffffffffffffffffff16612959565b156126f0578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016125769594939291906136e8565b602060405180830381600087803b15801561259057600080fd5b505af19250505080156125c157506040513d601f19601f820116820180604052508101906125be9190613260565b60015b612667576125cd613ef4565b806308c379a0141561262a57506125e261441a565b806125ed575061262c565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612621919061381e565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265e90613840565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146126ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e590613860565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff81111561271757612716613ec5565b5b6040519080825280602002602001820160405280156127455781602001602082028036833780820191505090505b509050828160008151811061275d5761275c613e96565b5b60200260200101818152505080915050919050565b6127918473ffffffffffffffffffffffffffffffffffffffff16612959565b15612951578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016127d7959493929190613750565b602060405180830381600087803b1580156127f157600080fd5b505af192505050801561282257506040513d601f19601f8201168201806040525081019061281f9190613260565b60015b6128c85761282e613ef4565b806308c379a0141561288b575061284361441a565b8061284e575061288d565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612882919061381e565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128bf90613840565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461294f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294690613860565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461298890613d2c565b90600052602060002090601f0160209004810192826129aa57600085556129f1565b82601f106129c357805160ff19168380011785556129f1565b828001600101855582156129f1579182015b828111156129f05782518255916020019190600101906129d5565b5b5090506129fe9190612a02565b5090565b5b80821115612a1b576000816000905550600101612a03565b5090565b6000612a32612a2d84613ac9565b613aa4565b90508083825260208201905082856020860282011115612a5557612a54613f1b565b5b60005b85811015612a855781612a6b8882612c11565b845260208401935060208301925050600181019050612a58565b5050509392505050565b6000612aa2612a9d84613af5565b613aa4565b90508083825260208201905082856020860282011115612ac557612ac4613f1b565b5b60005b85811015612b1357813567ffffffffffffffff811115612aeb57612aea613f16565b5b808601612af88982612d1d565b85526020850194506020840193505050600181019050612ac8565b5050509392505050565b6000612b30612b2b84613b21565b613aa4565b90508083825260208201905082856020860282011115612b5357612b52613f1b565b5b60005b85811015612b835781612b698882612d4b565b845260208401935060208301925050600181019050612b56565b5050509392505050565b6000612ba0612b9b84613b4d565b613aa4565b905082815260208101848484011115612bbc57612bbb613f20565b5b612bc7848285613cea565b509392505050565b6000612be2612bdd84613b7e565b613aa4565b905082815260208101848484011115612bfe57612bfd613f20565b5b612c09848285613cea565b509392505050565b600081359050612c20816144b0565b92915050565b600082601f830112612c3b57612c3a613f16565b5b8135612c4b848260208601612a1f565b91505092915050565b600082601f830112612c6957612c68613f16565b5b8135612c79848260208601612a8f565b91505092915050565b600082601f830112612c9757612c96613f16565b5b8135612ca7848260208601612b1d565b91505092915050565b600081359050612cbf816144c7565b92915050565b600081359050612cd4816144de565b92915050565b600081519050612ce9816144de565b92915050565b600082601f830112612d0457612d03613f16565b5b8135612d14848260208601612b8d565b91505092915050565b600082601f830112612d3257612d31613f16565b5b8135612d42848260208601612bcf565b91505092915050565b600081359050612d5a816144f5565b92915050565b600060208284031215612d7657612d75613f2a565b5b6000612d8484828501612c11565b91505092915050565b60008060408385031215612da457612da3613f2a565b5b6000612db285828601612c11565b9250506020612dc385828601612c11565b9150509250929050565b600080600080600060a08688031215612de957612de8613f2a565b5b6000612df788828901612c11565b9550506020612e0888828901612c11565b945050604086013567ffffffffffffffff811115612e2957612e28613f25565b5b612e3588828901612c82565b935050606086013567ffffffffffffffff811115612e5657612e55613f25565b5b612e6288828901612c82565b925050608086013567ffffffffffffffff811115612e8357612e82613f25565b5b612e8f88828901612cef565b9150509295509295909350565b600080600080600060a08688031215612eb857612eb7613f2a565b5b6000612ec688828901612c11565b9550506020612ed788828901612c11565b9450506040612ee888828901612d4b565b9350506060612ef988828901612d4b565b925050608086013567ffffffffffffffff811115612f1a57612f19613f25565b5b612f2688828901612cef565b9150509295509295909350565b600080600080600060a08688031215612f4f57612f4e613f2a565b5b6000612f5d88828901612c11565b955050602086013567ffffffffffffffff811115612f7e57612f7d613f25565b5b612f8a88828901612c82565b945050604086013567ffffffffffffffff811115612fab57612faa613f25565b5b612fb788828901612c82565b935050606086013567ffffffffffffffff811115612fd857612fd7613f25565b5b612fe488828901612c82565b925050608086013567ffffffffffffffff81111561300557613004613f25565b5b61301188828901612c82565b9150509295509295909350565b6000806040838503121561303557613034613f2a565b5b600061304385828601612c11565b925050602061305485828601612cb0565b9150509250929050565b6000806040838503121561307557613074613f2a565b5b600061308385828601612c11565b925050602061309485828601612d4b565b9150509250929050565b600080604083850312156130b5576130b4613f2a565b5b600083013567ffffffffffffffff8111156130d3576130d2613f25565b5b6130df85828601612c26565b925050602083013567ffffffffffffffff811115613100576130ff613f25565b5b61310c85828601612c82565b9150509250929050565b6000806040838503121561312d5761312c613f2a565b5b600083013567ffffffffffffffff81111561314b5761314a613f25565b5b61315785828601612c82565b925050602083013567ffffffffffffffff81111561317857613177613f25565b5b61318485828601612c54565b9150509250929050565b600080604083850312156131a5576131a4613f2a565b5b600083013567ffffffffffffffff8111156131c3576131c2613f25565b5b6131cf85828601612c82565b925050602083013567ffffffffffffffff8111156131f0576131ef613f25565b5b6131fc85828601612c82565b9150509250929050565b60006020828403121561321c5761321b613f2a565b5b600061322a84828501612cb0565b91505092915050565b60006020828403121561324957613248613f2a565b5b600061325784828501612cc5565b91505092915050565b60006020828403121561327657613275613f2a565b5b600061328484828501612cda565b91505092915050565b6000602082840312156132a3576132a2613f2a565b5b60006132b184828501612d4b565b91505092915050565b600080604083850312156132d1576132d0613f2a565b5b60006132df85828601612d4b565b925050602083013567ffffffffffffffff811115613300576132ff613f25565b5b61330c85828601612d1d565b9150509250929050565b6000806040838503121561332d5761332c613f2a565b5b600061333b85828601612d4b565b925050602061334c85828601612d4b565b9150509250929050565b600061336283836136af565b60208301905092915050565b61337781613c76565b82525050565b600061338882613bbf565b6133928185613bed565b935061339d83613baf565b8060005b838110156133ce5781516133b58882613356565b97506133c083613be0565b9250506001810190506133a1565b5085935050505092915050565b6133e481613c88565b82525050565b60006133f582613bca565b6133ff8185613bfe565b935061340f818560208601613cf9565b61341881613f2f565b840191505092915050565b600061342e82613bd5565b6134388185613c0f565b9350613448818560208601613cf9565b61345181613f2f565b840191505092915050565b6000613469603483613c0f565b915061347482613f4d565b604082019050919050565b600061348c602883613c0f565b915061349782613f9c565b604082019050919050565b60006134af602683613c0f565b91506134ba82613feb565b604082019050919050565b60006134d2602483613c0f565b91506134dd8261403a565b604082019050919050565b60006134f5601483613c0f565b915061350082614089565b602082019050919050565b6000613518602983613c0f565b9150613523826140b2565b604082019050919050565b600061353b602a83613c0f565b915061354682614101565b604082019050919050565b600061355e602583613c0f565b915061356982614150565b604082019050919050565b6000613581603283613c0f565b915061358c8261419f565b604082019050919050565b60006135a4602383613c0f565b91506135af826141ee565b604082019050919050565b60006135c7602a83613c0f565b91506135d28261423d565b604082019050919050565b60006135ea602083613c0f565b91506135f58261428c565b602082019050919050565b600061360d601783613c0f565b9150613618826142b5565b602082019050919050565b6000613630602983613c0f565b915061363b826142de565b604082019050919050565b6000613653602983613c0f565b915061365e8261432d565b604082019050919050565b6000613676602883613c0f565b91506136818261437c565b604082019050919050565b6000613699602183613c0f565b91506136a4826143cb565b604082019050919050565b6136b881613ce0565b82525050565b6136c781613ce0565b82525050565b60006020820190506136e2600083018461336e565b92915050565b600060a0820190506136fd600083018861336e565b61370a602083018761336e565b818103604083015261371c818661337d565b90508181036060830152613730818561337d565b9050818103608083015261374481846133ea565b90509695505050505050565b600060a082019050613765600083018861336e565b613772602083018761336e565b61377f60408301866136be565b61378c60608301856136be565b818103608083015261379e81846133ea565b90509695505050505050565b600060208201905081810360008301526137c4818461337d565b905092915050565b600060408201905081810360008301526137e6818561337d565b905081810360208301526137fa818461337d565b90509392505050565b600060208201905061381860008301846133db565b92915050565b600060208201905081810360008301526138388184613423565b905092915050565b600060208201905081810360008301526138598161345c565b9050919050565b600060208201905081810360008301526138798161347f565b9050919050565b60006020820190508181036000830152613899816134a2565b9050919050565b600060208201905081810360008301526138b9816134c5565b9050919050565b600060208201905081810360008301526138d9816134e8565b9050919050565b600060208201905081810360008301526138f98161350b565b9050919050565b600060208201905081810360008301526139198161352e565b9050919050565b6000602082019050818103600083015261393981613551565b9050919050565b6000602082019050818103600083015261395981613574565b9050919050565b6000602082019050818103600083015261397981613597565b9050919050565b60006020820190508181036000830152613999816135ba565b9050919050565b600060208201905081810360008301526139b9816135dd565b9050919050565b600060208201905081810360008301526139d981613600565b9050919050565b600060208201905081810360008301526139f981613623565b9050919050565b60006020820190508181036000830152613a1981613646565b9050919050565b60006020820190508181036000830152613a3981613669565b9050919050565b60006020820190508181036000830152613a598161368c565b9050919050565b6000602082019050613a7560008301846136be565b92915050565b6000604082019050613a9060008301856136be565b613a9d60208301846136be565b9392505050565b6000613aae613abf565b9050613aba8282613d5e565b919050565b6000604051905090565b600067ffffffffffffffff821115613ae457613ae3613ec5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b1057613b0f613ec5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b3c57613b3b613ec5565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b6857613b67613ec5565b5b613b7182613f2f565b9050602081019050919050565b600067ffffffffffffffff821115613b9957613b98613ec5565b5b613ba282613f2f565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000613c2b82613ce0565b9150613c3683613ce0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6b57613c6a613e09565b5b828201905092915050565b6000613c8182613cc0565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d17578082015181840152602081019050613cfc565b83811115613d26576000848401525b50505050565b60006002820490506001821680613d4457607f821691505b60208210811415613d5857613d57613e67565b5b50919050565b613d6782613f2f565b810181811067ffffffffffffffff82111715613d8657613d85613ec5565b5b80604052505050565b6000613d9a82613ce0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dcd57613dcc613e09565b5b600182019050919050565b6000613de382613ce0565b9150613dee83613ce0565b925082613dfe57613dfd613e38565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115613f135760046000803e613f10600051613f40565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101561442a576144ad565b614432613abf565b60043d036004823e80513d602482011167ffffffffffffffff8211171561445a5750506144ad565b808201805167ffffffffffffffff81111561447857505050506144ad565b80602083010160043d0385018111156144955750505050506144ad565b6144a482602001850186613d5e565b82955050505050505b90565b6144b981613c76565b81146144c457600080fd5b50565b6144d081613c88565b81146144db57600080fd5b50565b6144e781613c94565b81146144f257600080fd5b50565b6144fe81613ce0565b811461450957600080fd5b5056fea26469706673582212204b5d7fee3c3f9b723842eae7897a3c0377164788db74522690ac54435214792764736f6c63430008070033

Deployed Bytecode Sourcemap

40907:2442:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25491:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24514:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41104:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43121:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43038:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41486:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42806:225;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27429:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43230:114;;;:::i;:::-;;25887:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42405:265;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41152:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4334:103;;;;;;;;;;;;;:::i;:::-;;42276:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42676:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3683:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40951:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41127:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41669:504;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26484:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42179:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41182:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41580:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26711:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26951:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4592:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25491:230;25577:7;25624:1;25605:21;;:7;:21;;;;25597:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25691:9;:13;25701:2;25691:13;;;;;;;;;;;:22;25705:7;25691:22;;;;;;;;;;;;;;;;25684:29;;25491:230;;;;:::o;24514:310::-;24616:4;24668:26;24653:41;;;:11;:41;;;;:110;;;;24726:37;24711:52;;;:11;:52;;;;24653:110;:163;;;;24780:36;24804:11;24780:23;:36::i;:::-;24653:163;24633:183;;24514:310;;;:::o;41104:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43121:101::-;43174:13;43203:8;:13;43212:3;43203:13;;;;;;;;;;;43196:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43121:101;;;:::o;43038:77::-;3914:12;:10;:12::i;:::-;3903:23;;:7;:5;:7::i;:::-;:23;;;3895:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43103:6:::1;43094;;:15;;;;;;;;;;;;;;;;;;43038:77:::0;:::o;41486:89::-;41530:7;41553:16;:6;:14;:16::i;:::-;41546:23;;41486:89;:::o;42806:225::-;3914:12;:10;:12::i;:::-;3903:23;;:7;:5;:7::i;:::-;:23;;;3895:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42901:9:::1;42897:129;42920:3;:10;42916:1;:14;42897:129;;;42969:5;42975:1;42969:8;;;;;;;;:::i;:::-;;;;;;;;42950;:16;42959:3;42963:1;42959:6;;;;;;;;:::i;:::-;;;;;;;;42950:16;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;43009:3;43013:1;43009:6;;;;;;;;:::i;:::-;;;;;;;;42995:21;42999:5;43005:1;42999:8;;;;;;;;:::i;:::-;;;;;;;;42995:21;;;;;;:::i;:::-;;;;;;;;42932:3;;;;;:::i;:::-;;;;42897:129;;;;42806:225:::0;;:::o;27429:442::-;27670:12;:10;:12::i;:::-;27662:20;;:4;:20;;;:60;;;;27686:36;27703:4;27709:12;:10;:12::i;:::-;27686:16;:36::i;:::-;27662:60;27640:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;27811:52;27834:4;27840:2;27844:3;27849:7;27858:4;27811:22;:52::i;:::-;27429:442;;;;;:::o;43230:114::-;3914:12;:10;:12::i;:::-;3903:23;;:7;:5;:7::i;:::-;:23;;;3895:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43298:10:::1;43290:24;;:47;43315:21;43290:47;;;;;;;;;;;;;;;;;;;;;;;43282:56;;;::::0;::::1;;43230:114::o:0;25887:524::-;26043:16;26104:3;:10;26085:8;:15;:29;26077:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;26173:30;26220:8;:15;26206:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26173:63;;26254:9;26249:122;26273:8;:15;26269:1;:19;26249:122;;;26329:30;26339:8;26348:1;26339:11;;;;;;;;:::i;:::-;;;;;;;;26352:3;26356:1;26352:6;;;;;;;;:::i;:::-;;;;;;;;26329:9;:30::i;:::-;26310:13;26324:1;26310:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;26290:3;;;;:::i;:::-;;;26249:122;;;;26390:13;26383:20;;;25887:524;;;;:::o;42405:265::-;3914:12;:10;:12::i;:::-;3903:23;;:7;:5;:7::i;:::-;:23;;;3895:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42571:41:::1;42582:5;42589:8;42599:12;42571:10;:41::i;:::-;42619:45;42630:5;42637:8;42647:12;42619:45;;;;;;;;;;;::::0;:10:::1;:45::i;:::-;42405:265:::0;;;;;:::o;41152:25::-;;;;;;;;;;;;;:::o;4334:103::-;3914:12;:10;:12::i;:::-;3903:23;;:7;:5;:7::i;:::-;:23;;;3895:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4399:30:::1;4426:1;4399:18;:30::i;:::-;4334:103::o:0;42276:123::-;42355:38;42366:10;42378:4;42384:8;42355:10;:38::i;:::-;42276:123;;:::o;42676:124::-;3914:12;:10;:12::i;:::-;3903:23;;:7;:5;:7::i;:::-;:23;;;3895:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42764:4:::1;42748:8;:13;42757:3;42748:13;;;;;;;;;;;:20;;;;;;;;;;;;:::i;:::-;;42790:3;42780:14;42784:4;42780:14;;;;;;:::i;:::-;;;;;;;;42676:124:::0;;:::o;3683:87::-;3729:7;3756:6;;;;;;;;;;;3749:13;;3683:87;:::o;40951:37::-;;;;:::o;41127:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41669:504::-;41731:11;41405:1;41391:11;:15;:52;;;;;41425:18;;41410:11;:33;;41391:52;41383:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41762:6:::1;;;;;;;;;;;41761:7;41753:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;41807:22;41843:11;41832:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41807:48;;41866:21;41901:11;41890:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41866:47;;41929:9;41924:190;41948:11;41944:1;:15;41924:190;;;41981:18;:6;:16;:18::i;:::-;42043:1;42028:12;;:16;;;;:::i;:::-;42014:8;42023:1;42014:11;;;;;;;;:::i;:::-;;;;;;;:30;;;::::0;::::1;42072:1;42059:7;42067:1;42059:10;;;;;;;;:::i;:::-;;;;;;;:14;;;::::0;::::1;42088:12;;:14;;;;;;;;;:::i;:::-;;;;;;41961:3;;;;;:::i;:::-;;;;41924:190;;;;42122:45;42133:10;42145:8;42155:7;42122:45;;;;;;;;;;;::::0;:10:::1;:45::i;:::-;41744:429;;41669:504:::0;;:::o;26484:155::-;26579:52;26598:12;:10;:12::i;:::-;26612:8;26622;26579:18;:52::i;:::-;26484:155;;:::o;42179:91::-;42233:31;42239:10;42251:3;42256:7;42233:5;:31::i;:::-;42179:91;;:::o;41182:39::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41580:83::-;41622:7;41645:12;;41638:19;;41580:83;:::o;26711:168::-;26810:4;26834:18;:27;26853:7;26834:27;;;;;;;;;;;;;;;:37;26862:8;26834:37;;;;;;;;;;;;;;;;;;;;;;;;;26827:44;;26711:168;;;;:::o;26951:401::-;27167:12;:10;:12::i;:::-;27159:20;;:4;:20;;;:60;;;;27183:36;27200:4;27206:12;:10;:12::i;:::-;27183:16;:36::i;:::-;27159:60;27137:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;27299:45;27317:4;27323:2;27327;27331:6;27339:4;27299:17;:45::i;:::-;26951:401;;;;;:::o;4592:201::-;3914:12;:10;:12::i;:::-;3903:23;;:7;:5;:7::i;:::-;:23;;;3895:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4701:1:::1;4681:22;;:8;:22;;;;4673:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4757:28;4776:8;4757:18;:28::i;:::-;4592:201:::0;:::o;15595:157::-;15680:4;15719:25;15704:40;;;:11;:40;;;;15697:47;;15595:157;;;:::o;2354:98::-;2407:7;2434:10;2427:17;;2354:98;:::o;1029:114::-;1094:7;1121;:14;;;1114:21;;1029:114;;;:::o;29667:1146::-;29894:7;:14;29880:3;:10;:28;29872:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;29986:1;29972:16;;:2;:16;;;;29964:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;30043:16;30062:12;:10;:12::i;:::-;30043:31;;30087:60;30108:8;30118:4;30124:2;30128:3;30133:7;30142:4;30087:20;:60::i;:::-;30165:9;30160:421;30184:3;:10;30180:1;:14;30160:421;;;30216:10;30229:3;30233:1;30229:6;;;;;;;;:::i;:::-;;;;;;;;30216:19;;30250:14;30267:7;30275:1;30267:10;;;;;;;;:::i;:::-;;;;;;;;30250:27;;30294:19;30316:9;:13;30326:2;30316:13;;;;;;;;;;;:19;30330:4;30316:19;;;;;;;;;;;;;;;;30294:41;;30373:6;30358:11;:21;;30350:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;30506:6;30492:11;:20;30470:9;:13;30480:2;30470:13;;;;;;;;;;;:19;30484:4;30470:19;;;;;;;;;;;;;;;:42;;;;30563:6;30542:9;:13;30552:2;30542:13;;;;;;;;;;;:17;30556:2;30542:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;30201:380;;;30196:3;;;;:::i;:::-;;;30160:421;;;;30628:2;30598:47;;30622:4;30598:47;;30612:8;30598:47;;;30632:3;30637:7;30598:47;;;;;;;:::i;:::-;;;;;;;;30658:59;30678:8;30688:4;30694:2;30698:3;30703:7;30712:4;30658:19;:59::i;:::-;30730:75;30766:8;30776:4;30782:2;30786:3;30791:7;30800:4;30730:35;:75::i;:::-;29861:952;29667:1146;;;;;:::o;35290:969::-;35458:1;35442:18;;:4;:18;;;;35434:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35533:7;:14;35519:3;:10;:28;35511:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35605:16;35624:12;:10;:12::i;:::-;35605:31;;35649:66;35670:8;35680:4;35694:1;35698:3;35703:7;35649:66;;;;;;;;;;;;:20;:66::i;:::-;35733:9;35728:373;35752:3;:10;35748:1;:14;35728:373;;;35784:10;35797:3;35801:1;35797:6;;;;;;;;:::i;:::-;;;;;;;;35784:19;;35818:14;35835:7;35843:1;35835:10;;;;;;;;:::i;:::-;;;;;;;;35818:27;;35862:19;35884:9;:13;35894:2;35884:13;;;;;;;;;;;:19;35898:4;35884:19;;;;;;;;;;;;;;;;35862:41;;35941:6;35926:11;:21;;35918:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;36068:6;36054:11;:20;36032:9;:13;36042:2;36032:13;;;;;;;;;;;:19;36046:4;36032:19;;;;;;;;;;;;;;;:42;;;;35769:332;;;35764:3;;;;;:::i;:::-;;;;35728:373;;;;36156:1;36118:55;;36142:4;36118:55;;36132:8;36118:55;;;36160:3;36165:7;36118:55;;;;;;;:::i;:::-;;;;;;;;36186:65;36206:8;36216:4;36230:1;36234:3;36239:7;36186:65;;;;;;;;;;;;:19;:65::i;:::-;35423:836;35290:969;;;:::o;33216:813::-;33408:1;33394:16;;:2;:16;;;;33386:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33481:7;:14;33467:3;:10;:28;33459:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;33553:16;33572:12;:10;:12::i;:::-;33553:31;;33597:66;33618:8;33636:1;33640:2;33644:3;33649:7;33658:4;33597:20;:66::i;:::-;33681:9;33676:103;33700:3;:10;33696:1;:14;33676:103;;;33757:7;33765:1;33757:10;;;;;;;;:::i;:::-;;;;;;;;33732:9;:17;33742:3;33746:1;33742:6;;;;;;;;:::i;:::-;;;;;;;;33732:17;;;;;;;;;;;:21;33750:2;33732:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;33712:3;;;;;:::i;:::-;;;;33676:103;;;;33832:2;33796:53;;33828:1;33796:53;;33810:8;33796:53;;;33836:3;33841:7;33796:53;;;;;;;:::i;:::-;;;;;;;;33862:65;33882:8;33900:1;33904:2;33908:3;33913:7;33922:4;33862:19;:65::i;:::-;33940:81;33976:8;33994:1;33998:2;34002:3;34007:7;34016:4;33940:35;:81::i;:::-;33375:654;33216:813;;;;:::o;4953:191::-;5027:16;5046:6;;;;;;;;;;;5027:25;;5072:8;5063:6;;:17;;;;;;;;;;;;;;;;;;5127:8;5096:40;;5117:8;5096:40;;;;;;;;;;;;5016:128;4953:191;:::o;1151:127::-;1258:1;1240:7;:14;;;:19;;;;;;;;;;;1151:127;:::o;36401:331::-;36556:8;36547:17;;:5;:17;;;;36539:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36659:8;36621:18;:25;36640:5;36621:25;;;;;;;;;;;;;;;:35;36647:8;36621:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36705:8;36683:41;;36698:5;36683:41;;;36715:8;36683:41;;;;;;:::i;:::-;;;;;;;;36401:331;;;:::o;34279:808::-;34422:1;34406:18;;:4;:18;;;;34398:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34477:16;34496:12;:10;:12::i;:::-;34477:31;;34519:20;34542:21;34560:2;34542:17;:21::i;:::-;34519:44;;34574:24;34601:25;34619:6;34601:17;:25::i;:::-;34574:52;;34639:66;34660:8;34670:4;34684:1;34688:3;34693:7;34639:66;;;;;;;;;;;;:20;:66::i;:::-;34718:19;34740:9;:13;34750:2;34740:13;;;;;;;;;;;:19;34754:4;34740:19;;;;;;;;;;;;;;;;34718:41;;34793:6;34778:11;:21;;34770:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;34912:6;34898:11;:20;34876:9;:13;34886:2;34876:13;;;;;;;;;;;:19;34890:4;34876:19;;;;;;;;;;;;;;;:42;;;;34986:1;34947:54;;34972:4;34947:54;;34962:8;34947:54;;;34990:2;34994:6;34947:54;;;;;;;:::i;:::-;;;;;;;;35014:65;35034:8;35044:4;35058:1;35062:3;35067:7;35014:65;;;;;;;;;;;;:19;:65::i;:::-;34387:700;;;;34279:808;;;:::o;28335:974::-;28537:1;28523:16;;:2;:16;;;;28515:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;28594:16;28613:12;:10;:12::i;:::-;28594:31;;28636:20;28659:21;28677:2;28659:17;:21::i;:::-;28636:44;;28691:24;28718:25;28736:6;28718:17;:25::i;:::-;28691:52;;28756:60;28777:8;28787:4;28793:2;28797:3;28802:7;28811:4;28756:20;:60::i;:::-;28829:19;28851:9;:13;28861:2;28851:13;;;;;;;;;;;:19;28865:4;28851:19;;;;;;;;;;;;;;;;28829:41;;28904:6;28889:11;:21;;28881:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29029:6;29015:11;:20;28993:9;:13;29003:2;28993:13;;;;;;;;;;;:19;29007:4;28993:19;;;;;;;;;;;;;;;:42;;;;29078:6;29057:9;:13;29067:2;29057:13;;;;;;;;;;;:17;29071:2;29057:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29133:2;29102:46;;29127:4;29102:46;;29117:8;29102:46;;;29137:2;29141:6;29102:46;;;;;;;:::i;:::-;;;;;;;;29161:59;29181:8;29191:4;29197:2;29201:3;29206:7;29215:4;29161:19;:59::i;:::-;29233:68;29264:8;29274:4;29280:2;29284;29288:6;29296:4;29233:30;:68::i;:::-;28504:805;;;;28335:974;;;;;:::o;37688:221::-;;;;;;;:::o;38864:220::-;;;;;;;:::o;39844:813::-;40084:15;:2;:13;;;:15::i;:::-;40080:570;;;40137:2;40120:43;;;40164:8;40174:4;40180:3;40185:7;40194:4;40120:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40116:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;40512:6;40505:14;;;;;;;;;;;:::i;:::-;;;;;;;;40116:523;;;40561:62;;;;;;;;;;:::i;:::-;;;;;;;;40116:523;40293:48;;;40281:60;;;:8;:60;;;;40277:159;;40366:50;;;;;;;;;;:::i;:::-;;;;;;;;40277:159;40200:251;40080:570;39844:813;;;;;;:::o;40665:198::-;40731:16;40760:22;40799:1;40785:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40760:41;;40823:7;40812:5;40818:1;40812:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;40850:5;40843:12;;;40665:198;;;:::o;39092:744::-;39307:15;:2;:13;;;:15::i;:::-;39303:526;;;39360:2;39343:38;;;39382:8;39392:4;39398:2;39402:6;39410:4;39343:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39339:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;39691:6;39684:14;;;;;;;;;;;:::i;:::-;;;;;;;;39339:479;;;39740:62;;;;;;;;;;:::i;:::-;;;;;;;;39339:479;39477:43;;;39465:55;;;:8;:55;;;;39461:154;;39545:50;;;;;;;;;;:::i;:::-;;;;;;;;39461:154;39416:214;39303:526;39092:744;;;;;;:::o;6437:326::-;6497:4;6754:1;6732:7;:19;;;:23;6725:30;;6437:326;;;:::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;768:957::-;874:5;899:91;915:74;982:6;915:74;:::i;:::-;899:91;:::i;:::-;890:100;;1010:5;1039:6;1032:5;1025:21;1073:4;1066:5;1062:16;1055:23;;1099:6;1149:3;1141:4;1133:6;1129:17;1124:3;1120:27;1117:36;1114:143;;;1168:79;;:::i;:::-;1114:143;1281:1;1266:453;1291:6;1288:1;1285:13;1266:453;;;1373:3;1360:17;1409:18;1396:11;1393:35;1390:122;;;1431:79;;:::i;:::-;1390:122;1555:11;1547:6;1543:24;1593:47;1636:3;1624:10;1593:47;:::i;:::-;1588:3;1581:60;1670:4;1665:3;1661:14;1654:21;;1704:4;1699:3;1695:14;1688:21;;1326:393;;1313:1;1310;1306:9;1301:14;;1266:453;;;1270:14;880:845;;768:957;;;;;:::o;1748:722::-;1844:5;1869:81;1885:64;1942:6;1885:64;:::i;:::-;1869:81;:::i;:::-;1860:90;;1970:5;1999:6;1992:5;1985:21;2033:4;2026:5;2022:16;2015:23;;2059:6;2109:3;2101:4;2093:6;2089:17;2084:3;2080:27;2077:36;2074:143;;;2128:79;;:::i;:::-;2074:143;2241:1;2226:238;2251:6;2248:1;2245:13;2226:238;;;2319:3;2348:37;2381:3;2369:10;2348:37;:::i;:::-;2343:3;2336:50;2415:4;2410:3;2406:14;2399:21;;2449:4;2444:3;2440:14;2433:21;;2286:178;2273:1;2270;2266:9;2261:14;;2226:238;;;2230:14;1850:620;;1748:722;;;;;:::o;2476:410::-;2553:5;2578:65;2594:48;2635:6;2594:48;:::i;:::-;2578:65;:::i;:::-;2569:74;;2666:6;2659:5;2652:21;2704:4;2697:5;2693:16;2742:3;2733:6;2728:3;2724:16;2721:25;2718:112;;;2749:79;;:::i;:::-;2718:112;2839:41;2873:6;2868:3;2863;2839:41;:::i;:::-;2559:327;2476:410;;;;;:::o;2892:412::-;2970:5;2995:66;3011:49;3053:6;3011:49;:::i;:::-;2995:66;:::i;:::-;2986:75;;3084:6;3077:5;3070:21;3122:4;3115:5;3111:16;3160:3;3151:6;3146:3;3142:16;3139:25;3136:112;;;3167:79;;:::i;:::-;3136:112;3257:41;3291:6;3286:3;3281;3257:41;:::i;:::-;2976:328;2892:412;;;;;:::o;3310:139::-;3356:5;3394:6;3381:20;3372:29;;3410:33;3437:5;3410:33;:::i;:::-;3310:139;;;;:::o;3472:370::-;3543:5;3592:3;3585:4;3577:6;3573:17;3569:27;3559:122;;3600:79;;:::i;:::-;3559:122;3717:6;3704:20;3742:94;3832:3;3824:6;3817:4;3809:6;3805:17;3742:94;:::i;:::-;3733:103;;3549:293;3472:370;;;;:::o;3864:390::-;3945:5;3994:3;3987:4;3979:6;3975:17;3971:27;3961:122;;4002:79;;:::i;:::-;3961:122;4119:6;4106:20;4144:104;4244:3;4236:6;4229:4;4221:6;4217:17;4144:104;:::i;:::-;4135:113;;3951:303;3864:390;;;;:::o;4277:370::-;4348:5;4397:3;4390:4;4382:6;4378:17;4374:27;4364:122;;4405:79;;:::i;:::-;4364:122;4522:6;4509:20;4547:94;4637:3;4629:6;4622:4;4614:6;4610:17;4547:94;:::i;:::-;4538:103;;4354:293;4277:370;;;;:::o;4653:133::-;4696:5;4734:6;4721:20;4712:29;;4750:30;4774:5;4750:30;:::i;:::-;4653:133;;;;:::o;4792:137::-;4837:5;4875:6;4862:20;4853:29;;4891:32;4917:5;4891:32;:::i;:::-;4792:137;;;;:::o;4935:141::-;4991:5;5022:6;5016:13;5007:22;;5038:32;5064:5;5038:32;:::i;:::-;4935:141;;;;:::o;5095:338::-;5150:5;5199:3;5192:4;5184:6;5180:17;5176:27;5166:122;;5207:79;;:::i;:::-;5166:122;5324:6;5311:20;5349:78;5423:3;5415:6;5408:4;5400:6;5396:17;5349:78;:::i;:::-;5340:87;;5156:277;5095:338;;;;:::o;5453:340::-;5509:5;5558:3;5551:4;5543:6;5539:17;5535:27;5525:122;;5566:79;;:::i;:::-;5525:122;5683:6;5670:20;5708:79;5783:3;5775:6;5768:4;5760:6;5756:17;5708:79;:::i;:::-;5699:88;;5515:278;5453:340;;;;:::o;5799:139::-;5845:5;5883:6;5870:20;5861:29;;5899:33;5926:5;5899:33;:::i;:::-;5799:139;;;;:::o;5944:329::-;6003:6;6052:2;6040:9;6031:7;6027:23;6023:32;6020:119;;;6058:79;;:::i;:::-;6020:119;6178:1;6203:53;6248:7;6239:6;6228:9;6224:22;6203:53;:::i;:::-;6193:63;;6149:117;5944:329;;;;:::o;6279:474::-;6347:6;6355;6404:2;6392:9;6383:7;6379:23;6375:32;6372:119;;;6410:79;;:::i;:::-;6372:119;6530:1;6555:53;6600:7;6591:6;6580:9;6576:22;6555:53;:::i;:::-;6545:63;;6501:117;6657:2;6683:53;6728:7;6719:6;6708:9;6704:22;6683:53;:::i;:::-;6673:63;;6628:118;6279:474;;;;;:::o;6759:1509::-;6913:6;6921;6929;6937;6945;6994:3;6982:9;6973:7;6969:23;6965:33;6962:120;;;7001:79;;:::i;:::-;6962:120;7121:1;7146:53;7191:7;7182:6;7171:9;7167:22;7146:53;:::i;:::-;7136:63;;7092:117;7248:2;7274:53;7319:7;7310:6;7299:9;7295:22;7274:53;:::i;:::-;7264:63;;7219:118;7404:2;7393:9;7389:18;7376:32;7435:18;7427:6;7424:30;7421:117;;;7457:79;;:::i;:::-;7421:117;7562:78;7632:7;7623:6;7612:9;7608:22;7562:78;:::i;:::-;7552:88;;7347:303;7717:2;7706:9;7702:18;7689:32;7748:18;7740:6;7737:30;7734:117;;;7770:79;;:::i;:::-;7734:117;7875:78;7945:7;7936:6;7925:9;7921:22;7875:78;:::i;:::-;7865:88;;7660:303;8030:3;8019:9;8015:19;8002:33;8062:18;8054:6;8051:30;8048:117;;;8084:79;;:::i;:::-;8048:117;8189:62;8243:7;8234:6;8223:9;8219:22;8189:62;:::i;:::-;8179:72;;7973:288;6759:1509;;;;;;;;:::o;8274:1089::-;8378:6;8386;8394;8402;8410;8459:3;8447:9;8438:7;8434:23;8430:33;8427:120;;;8466:79;;:::i;:::-;8427:120;8586:1;8611:53;8656:7;8647:6;8636:9;8632:22;8611:53;:::i;:::-;8601:63;;8557:117;8713:2;8739:53;8784:7;8775:6;8764:9;8760:22;8739:53;:::i;:::-;8729:63;;8684:118;8841:2;8867:53;8912:7;8903:6;8892:9;8888:22;8867:53;:::i;:::-;8857:63;;8812:118;8969:2;8995:53;9040:7;9031:6;9020:9;9016:22;8995:53;:::i;:::-;8985:63;;8940:118;9125:3;9114:9;9110:19;9097:33;9157:18;9149:6;9146:30;9143:117;;;9179:79;;:::i;:::-;9143:117;9284:62;9338:7;9329:6;9318:9;9314:22;9284:62;:::i;:::-;9274:72;;9068:288;8274:1089;;;;;;;;:::o;9369:1751::-;9564:6;9572;9580;9588;9596;9645:3;9633:9;9624:7;9620:23;9616:33;9613:120;;;9652:79;;:::i;:::-;9613:120;9772:1;9797:53;9842:7;9833:6;9822:9;9818:22;9797:53;:::i;:::-;9787:63;;9743:117;9927:2;9916:9;9912:18;9899:32;9958:18;9950:6;9947:30;9944:117;;;9980:79;;:::i;:::-;9944:117;10085:78;10155:7;10146:6;10135:9;10131:22;10085:78;:::i;:::-;10075:88;;9870:303;10240:2;10229:9;10225:18;10212:32;10271:18;10263:6;10260:30;10257:117;;;10293:79;;:::i;:::-;10257:117;10398:78;10468:7;10459:6;10448:9;10444:22;10398:78;:::i;:::-;10388:88;;10183:303;10553:2;10542:9;10538:18;10525:32;10584:18;10576:6;10573:30;10570:117;;;10606:79;;:::i;:::-;10570:117;10711:78;10781:7;10772:6;10761:9;10757:22;10711:78;:::i;:::-;10701:88;;10496:303;10866:3;10855:9;10851:19;10838:33;10898:18;10890:6;10887:30;10884:117;;;10920:79;;:::i;:::-;10884:117;11025:78;11095:7;11086:6;11075:9;11071:22;11025:78;:::i;:::-;11015:88;;10809:304;9369:1751;;;;;;;;:::o;11126:468::-;11191:6;11199;11248:2;11236:9;11227:7;11223:23;11219:32;11216:119;;;11254:79;;:::i;:::-;11216:119;11374:1;11399:53;11444:7;11435:6;11424:9;11420:22;11399:53;:::i;:::-;11389:63;;11345:117;11501:2;11527:50;11569:7;11560:6;11549:9;11545:22;11527:50;:::i;:::-;11517:60;;11472:115;11126:468;;;;;:::o;11600:474::-;11668:6;11676;11725:2;11713:9;11704:7;11700:23;11696:32;11693:119;;;11731:79;;:::i;:::-;11693:119;11851:1;11876:53;11921:7;11912:6;11901:9;11897:22;11876:53;:::i;:::-;11866:63;;11822:117;11978:2;12004:53;12049:7;12040:6;12029:9;12025:22;12004:53;:::i;:::-;11994:63;;11949:118;11600:474;;;;;:::o;12080:894::-;12198:6;12206;12255:2;12243:9;12234:7;12230:23;12226:32;12223:119;;;12261:79;;:::i;:::-;12223:119;12409:1;12398:9;12394:17;12381:31;12439:18;12431:6;12428:30;12425:117;;;12461:79;;:::i;:::-;12425:117;12566:78;12636:7;12627:6;12616:9;12612:22;12566:78;:::i;:::-;12556:88;;12352:302;12721:2;12710:9;12706:18;12693:32;12752:18;12744:6;12741:30;12738:117;;;12774:79;;:::i;:::-;12738:117;12879:78;12949:7;12940:6;12929:9;12925:22;12879:78;:::i;:::-;12869:88;;12664:303;12080:894;;;;;:::o;12980:914::-;13108:6;13116;13165:2;13153:9;13144:7;13140:23;13136:32;13133:119;;;13171:79;;:::i;:::-;13133:119;13319:1;13308:9;13304:17;13291:31;13349:18;13341:6;13338:30;13335:117;;;13371:79;;:::i;:::-;13335:117;13476:78;13546:7;13537:6;13526:9;13522:22;13476:78;:::i;:::-;13466:88;;13262:302;13631:2;13620:9;13616:18;13603:32;13662:18;13654:6;13651:30;13648:117;;;13684:79;;:::i;:::-;13648:117;13789:88;13869:7;13860:6;13849:9;13845:22;13789:88;:::i;:::-;13779:98;;13574:313;12980:914;;;;;:::o;13900:894::-;14018:6;14026;14075:2;14063:9;14054:7;14050:23;14046:32;14043:119;;;14081:79;;:::i;:::-;14043:119;14229:1;14218:9;14214:17;14201:31;14259:18;14251:6;14248:30;14245:117;;;14281:79;;:::i;:::-;14245:117;14386:78;14456:7;14447:6;14436:9;14432:22;14386:78;:::i;:::-;14376:88;;14172:302;14541:2;14530:9;14526:18;14513:32;14572:18;14564:6;14561:30;14558:117;;;14594:79;;:::i;:::-;14558:117;14699:78;14769:7;14760:6;14749:9;14745:22;14699:78;:::i;:::-;14689:88;;14484:303;13900:894;;;;;:::o;14800:323::-;14856:6;14905:2;14893:9;14884:7;14880:23;14876:32;14873:119;;;14911:79;;:::i;:::-;14873:119;15031:1;15056:50;15098:7;15089:6;15078:9;15074:22;15056:50;:::i;:::-;15046:60;;15002:114;14800:323;;;;:::o;15129:327::-;15187:6;15236:2;15224:9;15215:7;15211:23;15207:32;15204:119;;;15242:79;;:::i;:::-;15204:119;15362:1;15387:52;15431:7;15422:6;15411:9;15407:22;15387:52;:::i;:::-;15377:62;;15333:116;15129:327;;;;:::o;15462:349::-;15531:6;15580:2;15568:9;15559:7;15555:23;15551:32;15548:119;;;15586:79;;:::i;:::-;15548:119;15706:1;15731:63;15786:7;15777:6;15766:9;15762:22;15731:63;:::i;:::-;15721:73;;15677:127;15462:349;;;;:::o;15817:329::-;15876:6;15925:2;15913:9;15904:7;15900:23;15896:32;15893:119;;;15931:79;;:::i;:::-;15893:119;16051:1;16076:53;16121:7;16112:6;16101:9;16097:22;16076:53;:::i;:::-;16066:63;;16022:117;15817:329;;;;:::o;16152:654::-;16230:6;16238;16287:2;16275:9;16266:7;16262:23;16258:32;16255:119;;;16293:79;;:::i;:::-;16255:119;16413:1;16438:53;16483:7;16474:6;16463:9;16459:22;16438:53;:::i;:::-;16428:63;;16384:117;16568:2;16557:9;16553:18;16540:32;16599:18;16591:6;16588:30;16585:117;;;16621:79;;:::i;:::-;16585:117;16726:63;16781:7;16772:6;16761:9;16757:22;16726:63;:::i;:::-;16716:73;;16511:288;16152:654;;;;;:::o;16812:474::-;16880:6;16888;16937:2;16925:9;16916:7;16912:23;16908:32;16905:119;;;16943:79;;:::i;:::-;16905:119;17063:1;17088:53;17133:7;17124:6;17113:9;17109:22;17088:53;:::i;:::-;17078:63;;17034:117;17190:2;17216:53;17261:7;17252:6;17241:9;17237:22;17216:53;:::i;:::-;17206:63;;17161:118;16812:474;;;;;:::o;17292:179::-;17361:10;17382:46;17424:3;17416:6;17382:46;:::i;:::-;17460:4;17455:3;17451:14;17437:28;;17292:179;;;;:::o;17477:118::-;17564:24;17582:5;17564:24;:::i;:::-;17559:3;17552:37;17477:118;;:::o;17631:732::-;17750:3;17779:54;17827:5;17779:54;:::i;:::-;17849:86;17928:6;17923:3;17849:86;:::i;:::-;17842:93;;17959:56;18009:5;17959:56;:::i;:::-;18038:7;18069:1;18054:284;18079:6;18076:1;18073:13;18054:284;;;18155:6;18149:13;18182:63;18241:3;18226:13;18182:63;:::i;:::-;18175:70;;18268:60;18321:6;18268:60;:::i;:::-;18258:70;;18114:224;18101:1;18098;18094:9;18089:14;;18054:284;;;18058:14;18354:3;18347:10;;17755:608;;;17631:732;;;;:::o;18369:109::-;18450:21;18465:5;18450:21;:::i;:::-;18445:3;18438:34;18369:109;;:::o;18484:360::-;18570:3;18598:38;18630:5;18598:38;:::i;:::-;18652:70;18715:6;18710:3;18652:70;:::i;:::-;18645:77;;18731:52;18776:6;18771:3;18764:4;18757:5;18753:16;18731:52;:::i;:::-;18808:29;18830:6;18808:29;:::i;:::-;18803:3;18799:39;18792:46;;18574:270;18484:360;;;;:::o;18850:364::-;18938:3;18966:39;18999:5;18966:39;:::i;:::-;19021:71;19085:6;19080:3;19021:71;:::i;:::-;19014:78;;19101:52;19146:6;19141:3;19134:4;19127:5;19123:16;19101:52;:::i;:::-;19178:29;19200:6;19178:29;:::i;:::-;19173:3;19169:39;19162:46;;18942:272;18850:364;;;;:::o;19220:366::-;19362:3;19383:67;19447:2;19442:3;19383:67;:::i;:::-;19376:74;;19459:93;19548:3;19459:93;:::i;:::-;19577:2;19572:3;19568:12;19561:19;;19220:366;;;:::o;19592:::-;19734:3;19755:67;19819:2;19814:3;19755:67;:::i;:::-;19748:74;;19831:93;19920:3;19831:93;:::i;:::-;19949:2;19944:3;19940:12;19933:19;;19592:366;;;:::o;19964:::-;20106:3;20127:67;20191:2;20186:3;20127:67;:::i;:::-;20120:74;;20203:93;20292:3;20203:93;:::i;:::-;20321:2;20316:3;20312:12;20305:19;;19964:366;;;:::o;20336:::-;20478:3;20499:67;20563:2;20558:3;20499:67;:::i;:::-;20492:74;;20575:93;20664:3;20575:93;:::i;:::-;20693:2;20688:3;20684:12;20677:19;;20336:366;;;:::o;20708:::-;20850:3;20871:67;20935:2;20930:3;20871:67;:::i;:::-;20864:74;;20947:93;21036:3;20947:93;:::i;:::-;21065:2;21060:3;21056:12;21049:19;;20708:366;;;:::o;21080:::-;21222:3;21243:67;21307:2;21302:3;21243:67;:::i;:::-;21236:74;;21319:93;21408:3;21319:93;:::i;:::-;21437:2;21432:3;21428:12;21421:19;;21080:366;;;:::o;21452:::-;21594:3;21615:67;21679:2;21674:3;21615:67;:::i;:::-;21608:74;;21691:93;21780:3;21691:93;:::i;:::-;21809:2;21804:3;21800:12;21793:19;;21452:366;;;:::o;21824:::-;21966:3;21987:67;22051:2;22046:3;21987:67;:::i;:::-;21980:74;;22063:93;22152:3;22063:93;:::i;:::-;22181:2;22176:3;22172:12;22165:19;;21824:366;;;:::o;22196:::-;22338:3;22359:67;22423:2;22418:3;22359:67;:::i;:::-;22352:74;;22435:93;22524:3;22435:93;:::i;:::-;22553:2;22548:3;22544:12;22537:19;;22196:366;;;:::o;22568:::-;22710:3;22731:67;22795:2;22790:3;22731:67;:::i;:::-;22724:74;;22807:93;22896:3;22807:93;:::i;:::-;22925:2;22920:3;22916:12;22909:19;;22568:366;;;:::o;22940:::-;23082:3;23103:67;23167:2;23162:3;23103:67;:::i;:::-;23096:74;;23179:93;23268:3;23179:93;:::i;:::-;23297:2;23292:3;23288:12;23281:19;;22940:366;;;:::o;23312:::-;23454:3;23475:67;23539:2;23534:3;23475:67;:::i;:::-;23468:74;;23551:93;23640:3;23551:93;:::i;:::-;23669:2;23664:3;23660:12;23653:19;;23312:366;;;:::o;23684:::-;23826:3;23847:67;23911:2;23906:3;23847:67;:::i;:::-;23840:74;;23923:93;24012:3;23923:93;:::i;:::-;24041:2;24036:3;24032:12;24025:19;;23684:366;;;:::o;24056:::-;24198:3;24219:67;24283:2;24278:3;24219:67;:::i;:::-;24212:74;;24295:93;24384:3;24295:93;:::i;:::-;24413:2;24408:3;24404:12;24397:19;;24056:366;;;:::o;24428:::-;24570:3;24591:67;24655:2;24650:3;24591:67;:::i;:::-;24584:74;;24667:93;24756:3;24667:93;:::i;:::-;24785:2;24780:3;24776:12;24769:19;;24428:366;;;:::o;24800:::-;24942:3;24963:67;25027:2;25022:3;24963:67;:::i;:::-;24956:74;;25039:93;25128:3;25039:93;:::i;:::-;25157:2;25152:3;25148:12;25141:19;;24800:366;;;:::o;25172:::-;25314:3;25335:67;25399:2;25394:3;25335:67;:::i;:::-;25328:74;;25411:93;25500:3;25411:93;:::i;:::-;25529:2;25524:3;25520:12;25513:19;;25172:366;;;:::o;25544:108::-;25621:24;25639:5;25621:24;:::i;:::-;25616:3;25609:37;25544:108;;:::o;25658:118::-;25745:24;25763:5;25745:24;:::i;:::-;25740:3;25733:37;25658:118;;:::o;25782:222::-;25875:4;25913:2;25902:9;25898:18;25890:26;;25926:71;25994:1;25983:9;25979:17;25970:6;25926:71;:::i;:::-;25782:222;;;;:::o;26010:1053::-;26333:4;26371:3;26360:9;26356:19;26348:27;;26385:71;26453:1;26442:9;26438:17;26429:6;26385:71;:::i;:::-;26466:72;26534:2;26523:9;26519:18;26510:6;26466:72;:::i;:::-;26585:9;26579:4;26575:20;26570:2;26559:9;26555:18;26548:48;26613:108;26716:4;26707:6;26613:108;:::i;:::-;26605:116;;26768:9;26762:4;26758:20;26753:2;26742:9;26738:18;26731:48;26796:108;26899:4;26890:6;26796:108;:::i;:::-;26788:116;;26952:9;26946:4;26942:20;26936:3;26925:9;26921:19;26914:49;26980:76;27051:4;27042:6;26980:76;:::i;:::-;26972:84;;26010:1053;;;;;;;;:::o;27069:751::-;27292:4;27330:3;27319:9;27315:19;27307:27;;27344:71;27412:1;27401:9;27397:17;27388:6;27344:71;:::i;:::-;27425:72;27493:2;27482:9;27478:18;27469:6;27425:72;:::i;:::-;27507;27575:2;27564:9;27560:18;27551:6;27507:72;:::i;:::-;27589;27657:2;27646:9;27642:18;27633:6;27589:72;:::i;:::-;27709:9;27703:4;27699:20;27693:3;27682:9;27678:19;27671:49;27737:76;27808:4;27799:6;27737:76;:::i;:::-;27729:84;;27069:751;;;;;;;;:::o;27826:373::-;27969:4;28007:2;27996:9;27992:18;27984:26;;28056:9;28050:4;28046:20;28042:1;28031:9;28027:17;28020:47;28084:108;28187:4;28178:6;28084:108;:::i;:::-;28076:116;;27826:373;;;;:::o;28205:634::-;28426:4;28464:2;28453:9;28449:18;28441:26;;28513:9;28507:4;28503:20;28499:1;28488:9;28484:17;28477:47;28541:108;28644:4;28635:6;28541:108;:::i;:::-;28533:116;;28696:9;28690:4;28686:20;28681:2;28670:9;28666:18;28659:48;28724:108;28827:4;28818:6;28724:108;:::i;:::-;28716:116;;28205:634;;;;;:::o;28845:210::-;28932:4;28970:2;28959:9;28955:18;28947:26;;28983:65;29045:1;29034:9;29030:17;29021:6;28983:65;:::i;:::-;28845:210;;;;:::o;29061:313::-;29174:4;29212:2;29201:9;29197:18;29189:26;;29261:9;29255:4;29251:20;29247:1;29236:9;29232:17;29225:47;29289:78;29362:4;29353:6;29289:78;:::i;:::-;29281:86;;29061:313;;;;:::o;29380:419::-;29546:4;29584:2;29573:9;29569:18;29561:26;;29633:9;29627:4;29623:20;29619:1;29608:9;29604:17;29597:47;29661:131;29787:4;29661:131;:::i;:::-;29653:139;;29380:419;;;:::o;29805:::-;29971:4;30009:2;29998:9;29994:18;29986:26;;30058:9;30052:4;30048:20;30044:1;30033:9;30029:17;30022:47;30086:131;30212:4;30086:131;:::i;:::-;30078:139;;29805:419;;;:::o;30230:::-;30396:4;30434:2;30423:9;30419:18;30411:26;;30483:9;30477:4;30473:20;30469:1;30458:9;30454:17;30447:47;30511:131;30637:4;30511:131;:::i;:::-;30503:139;;30230:419;;;:::o;30655:::-;30821:4;30859:2;30848:9;30844:18;30836:26;;30908:9;30902:4;30898:20;30894:1;30883:9;30879:17;30872:47;30936:131;31062:4;30936:131;:::i;:::-;30928:139;;30655:419;;;:::o;31080:::-;31246:4;31284:2;31273:9;31269:18;31261:26;;31333:9;31327:4;31323:20;31319:1;31308:9;31304:17;31297:47;31361:131;31487:4;31361:131;:::i;:::-;31353:139;;31080:419;;;:::o;31505:::-;31671:4;31709:2;31698:9;31694:18;31686:26;;31758:9;31752:4;31748:20;31744:1;31733:9;31729:17;31722:47;31786:131;31912:4;31786:131;:::i;:::-;31778:139;;31505:419;;;:::o;31930:::-;32096:4;32134:2;32123:9;32119:18;32111:26;;32183:9;32177:4;32173:20;32169:1;32158:9;32154:17;32147:47;32211:131;32337:4;32211:131;:::i;:::-;32203:139;;31930:419;;;:::o;32355:::-;32521:4;32559:2;32548:9;32544:18;32536:26;;32608:9;32602:4;32598:20;32594:1;32583:9;32579:17;32572:47;32636:131;32762:4;32636:131;:::i;:::-;32628:139;;32355:419;;;:::o;32780:::-;32946:4;32984:2;32973:9;32969:18;32961:26;;33033:9;33027:4;33023:20;33019:1;33008:9;33004:17;32997:47;33061:131;33187:4;33061:131;:::i;:::-;33053:139;;32780:419;;;:::o;33205:::-;33371:4;33409:2;33398:9;33394:18;33386:26;;33458:9;33452:4;33448:20;33444:1;33433:9;33429:17;33422:47;33486:131;33612:4;33486:131;:::i;:::-;33478:139;;33205:419;;;:::o;33630:::-;33796:4;33834:2;33823:9;33819:18;33811:26;;33883:9;33877:4;33873:20;33869:1;33858:9;33854:17;33847:47;33911:131;34037:4;33911:131;:::i;:::-;33903:139;;33630:419;;;:::o;34055:::-;34221:4;34259:2;34248:9;34244:18;34236:26;;34308:9;34302:4;34298:20;34294:1;34283:9;34279:17;34272:47;34336:131;34462:4;34336:131;:::i;:::-;34328:139;;34055:419;;;:::o;34480:::-;34646:4;34684:2;34673:9;34669:18;34661:26;;34733:9;34727:4;34723:20;34719:1;34708:9;34704:17;34697:47;34761:131;34887:4;34761:131;:::i;:::-;34753:139;;34480:419;;;:::o;34905:::-;35071:4;35109:2;35098:9;35094:18;35086:26;;35158:9;35152:4;35148:20;35144:1;35133:9;35129:17;35122:47;35186:131;35312:4;35186:131;:::i;:::-;35178:139;;34905:419;;;:::o;35330:::-;35496:4;35534:2;35523:9;35519:18;35511:26;;35583:9;35577:4;35573:20;35569:1;35558:9;35554:17;35547:47;35611:131;35737:4;35611:131;:::i;:::-;35603:139;;35330:419;;;:::o;35755:::-;35921:4;35959:2;35948:9;35944:18;35936:26;;36008:9;36002:4;35998:20;35994:1;35983:9;35979:17;35972:47;36036:131;36162:4;36036:131;:::i;:::-;36028:139;;35755:419;;;:::o;36180:::-;36346:4;36384:2;36373:9;36369:18;36361:26;;36433:9;36427:4;36423:20;36419:1;36408:9;36404:17;36397:47;36461:131;36587:4;36461:131;:::i;:::-;36453:139;;36180:419;;;:::o;36605:222::-;36698:4;36736:2;36725:9;36721:18;36713:26;;36749:71;36817:1;36806:9;36802:17;36793:6;36749:71;:::i;:::-;36605:222;;;;:::o;36833:332::-;36954:4;36992:2;36981:9;36977:18;36969:26;;37005:71;37073:1;37062:9;37058:17;37049:6;37005:71;:::i;:::-;37086:72;37154:2;37143:9;37139:18;37130:6;37086:72;:::i;:::-;36833:332;;;;;:::o;37171:129::-;37205:6;37232:20;;:::i;:::-;37222:30;;37261:33;37289:4;37281:6;37261:33;:::i;:::-;37171:129;;;:::o;37306:75::-;37339:6;37372:2;37366:9;37356:19;;37306:75;:::o;37387:311::-;37464:4;37554:18;37546:6;37543:30;37540:56;;;37576:18;;:::i;:::-;37540:56;37626:4;37618:6;37614:17;37606:25;;37686:4;37680;37676:15;37668:23;;37387:311;;;:::o;37704:321::-;37791:4;37881:18;37873:6;37870:30;37867:56;;;37903:18;;:::i;:::-;37867:56;37953:4;37945:6;37941:17;37933:25;;38013:4;38007;38003:15;37995:23;;37704:321;;;:::o;38031:311::-;38108:4;38198:18;38190:6;38187:30;38184:56;;;38220:18;;:::i;:::-;38184:56;38270:4;38262:6;38258:17;38250:25;;38330:4;38324;38320:15;38312:23;;38031:311;;;:::o;38348:307::-;38409:4;38499:18;38491:6;38488:30;38485:56;;;38521:18;;:::i;:::-;38485:56;38559:29;38581:6;38559:29;:::i;:::-;38551:37;;38643:4;38637;38633:15;38625:23;;38348:307;;;:::o;38661:308::-;38723:4;38813:18;38805:6;38802:30;38799:56;;;38835:18;;:::i;:::-;38799:56;38873:29;38895:6;38873:29;:::i;:::-;38865:37;;38957:4;38951;38947:15;38939:23;;38661:308;;;:::o;38975:132::-;39042:4;39065:3;39057:11;;39095:4;39090:3;39086:14;39078:22;;38975:132;;;:::o;39113:114::-;39180:6;39214:5;39208:12;39198:22;;39113:114;;;:::o;39233:98::-;39284:6;39318:5;39312:12;39302:22;;39233:98;;;:::o;39337:99::-;39389:6;39423:5;39417:12;39407:22;;39337:99;;;:::o;39442:113::-;39512:4;39544;39539:3;39535:14;39527:22;;39442:113;;;:::o;39561:184::-;39660:11;39694:6;39689:3;39682:19;39734:4;39729:3;39725:14;39710:29;;39561:184;;;;:::o;39751:168::-;39834:11;39868:6;39863:3;39856:19;39908:4;39903:3;39899:14;39884:29;;39751:168;;;;:::o;39925:169::-;40009:11;40043:6;40038:3;40031:19;40083:4;40078:3;40074:14;40059:29;;39925:169;;;;:::o;40100:305::-;40140:3;40159:20;40177:1;40159:20;:::i;:::-;40154:25;;40193:20;40211:1;40193:20;:::i;:::-;40188:25;;40347:1;40279:66;40275:74;40272:1;40269:81;40266:107;;;40353:18;;:::i;:::-;40266:107;40397:1;40394;40390:9;40383:16;;40100:305;;;;:::o;40411:96::-;40448:7;40477:24;40495:5;40477:24;:::i;:::-;40466:35;;40411:96;;;:::o;40513:90::-;40547:7;40590:5;40583:13;40576:21;40565:32;;40513:90;;;:::o;40609:149::-;40645:7;40685:66;40678:5;40674:78;40663:89;;40609:149;;;:::o;40764:126::-;40801:7;40841:42;40834:5;40830:54;40819:65;;40764:126;;;:::o;40896:77::-;40933:7;40962:5;40951:16;;40896:77;;;:::o;40979:154::-;41063:6;41058:3;41053;41040:30;41125:1;41116:6;41111:3;41107:16;41100:27;40979:154;;;:::o;41139:307::-;41207:1;41217:113;41231:6;41228:1;41225:13;41217:113;;;41316:1;41311:3;41307:11;41301:18;41297:1;41292:3;41288:11;41281:39;41253:2;41250:1;41246:10;41241:15;;41217:113;;;41348:6;41345:1;41342:13;41339:101;;;41428:1;41419:6;41414:3;41410:16;41403:27;41339:101;41188:258;41139:307;;;:::o;41452:320::-;41496:6;41533:1;41527:4;41523:12;41513:22;;41580:1;41574:4;41570:12;41601:18;41591:81;;41657:4;41649:6;41645:17;41635:27;;41591:81;41719:2;41711:6;41708:14;41688:18;41685:38;41682:84;;;41738:18;;:::i;:::-;41682:84;41503:269;41452:320;;;:::o;41778:281::-;41861:27;41883:4;41861:27;:::i;:::-;41853:6;41849:40;41991:6;41979:10;41976:22;41955:18;41943:10;41940:34;41937:62;41934:88;;;42002:18;;:::i;:::-;41934:88;42042:10;42038:2;42031:22;41821:238;41778:281;;:::o;42065:233::-;42104:3;42127:24;42145:5;42127:24;:::i;:::-;42118:33;;42173:66;42166:5;42163:77;42160:103;;;42243:18;;:::i;:::-;42160:103;42290:1;42283:5;42279:13;42272:20;;42065:233;;;:::o;42304:176::-;42336:1;42353:20;42371:1;42353:20;:::i;:::-;42348:25;;42387:20;42405:1;42387:20;:::i;:::-;42382:25;;42426:1;42416:35;;42431:18;;:::i;:::-;42416:35;42472:1;42469;42465:9;42460:14;;42304:176;;;;:::o;42486:180::-;42534:77;42531:1;42524:88;42631:4;42628:1;42621:15;42655:4;42652:1;42645:15;42672:180;42720:77;42717:1;42710:88;42817:4;42814:1;42807:15;42841:4;42838:1;42831:15;42858:180;42906:77;42903:1;42896:88;43003:4;43000:1;42993:15;43027:4;43024:1;43017:15;43044:180;43092:77;43089:1;43082:88;43189:4;43186:1;43179:15;43213:4;43210:1;43203:15;43230:180;43278:77;43275:1;43268:88;43375:4;43372:1;43365:15;43399:4;43396:1;43389:15;43416:183;43451:3;43489:1;43471:16;43468:23;43465:128;;;43527:1;43524;43521;43506:23;43549:34;43580:1;43574:8;43549:34;:::i;:::-;43542:41;;43465:128;43416:183;:::o;43605:117::-;43714:1;43711;43704:12;43728:117;43837:1;43834;43827:12;43851:117;43960:1;43957;43950:12;43974:117;44083:1;44080;44073:12;44097:117;44206:1;44203;44196:12;44220:102;44261:6;44312:2;44308:7;44303:2;44296:5;44292:14;44288:28;44278:38;;44220:102;;;:::o;44328:106::-;44372:8;44421:5;44416:3;44412:15;44391:36;;44328:106;;;:::o;44440:239::-;44580:34;44576:1;44568:6;44564:14;44557:58;44649:22;44644:2;44636:6;44632:15;44625:47;44440:239;:::o;44685:227::-;44825:34;44821:1;44813:6;44809:14;44802:58;44894:10;44889:2;44881:6;44877:15;44870:35;44685:227;:::o;44918:225::-;45058:34;45054:1;45046:6;45042:14;45035:58;45127:8;45122:2;45114:6;45110:15;45103:33;44918:225;:::o;45149:223::-;45289:34;45285:1;45277:6;45273:14;45266:58;45358:6;45353:2;45345:6;45341:15;45334:31;45149:223;:::o;45378:170::-;45518:22;45514:1;45506:6;45502:14;45495:46;45378:170;:::o;45554:228::-;45694:34;45690:1;45682:6;45678:14;45671:58;45763:11;45758:2;45750:6;45746:15;45739:36;45554:228;:::o;45788:229::-;45928:34;45924:1;45916:6;45912:14;45905:58;45997:12;45992:2;45984:6;45980:15;45973:37;45788:229;:::o;46023:224::-;46163:34;46159:1;46151:6;46147:14;46140:58;46232:7;46227:2;46219:6;46215:15;46208:32;46023:224;:::o;46253:237::-;46393:34;46389:1;46381:6;46377:14;46370:58;46462:20;46457:2;46449:6;46445:15;46438:45;46253:237;:::o;46496:222::-;46636:34;46632:1;46624:6;46620:14;46613:58;46705:5;46700:2;46692:6;46688:15;46681:30;46496:222;:::o;46724:229::-;46864:34;46860:1;46852:6;46848:14;46841:58;46933:12;46928:2;46920:6;46916:15;46909:37;46724:229;:::o;46959:182::-;47099:34;47095:1;47087:6;47083:14;47076:58;46959:182;:::o;47147:173::-;47287:25;47283:1;47275:6;47271:14;47264:49;47147:173;:::o;47326:228::-;47466:34;47462:1;47454:6;47450:14;47443:58;47535:11;47530:2;47522:6;47518:15;47511:36;47326:228;:::o;47560:::-;47700:34;47696:1;47688:6;47684:14;47677:58;47769:11;47764:2;47756:6;47752:15;47745:36;47560:228;:::o;47794:227::-;47934:34;47930:1;47922:6;47918:14;47911:58;48003:10;47998:2;47990:6;47986:15;47979:35;47794:227;:::o;48027:220::-;48167:34;48163:1;48155:6;48151:14;48144:58;48236:3;48231:2;48223:6;48219:15;48212:28;48027:220;:::o;48253:711::-;48292:3;48330:4;48312:16;48309:26;48306:39;;;48338:5;;48306:39;48367:20;;:::i;:::-;48442:1;48424:16;48420:24;48417:1;48411:4;48396:49;48475:4;48469:11;48574:16;48567:4;48559:6;48555:17;48552:39;48519:18;48511:6;48508:30;48492:113;48489:146;;;48620:5;;;;48489:146;48666:6;48660:4;48656:17;48702:3;48696:10;48729:18;48721:6;48718:30;48715:43;;;48751:5;;;;;;48715:43;48799:6;48792:4;48787:3;48783:14;48779:27;48858:1;48840:16;48836:24;48830:4;48826:35;48821:3;48818:44;48815:57;;;48865:5;;;;;;;48815:57;48882;48930:6;48924:4;48920:17;48912:6;48908:30;48902:4;48882:57;:::i;:::-;48955:3;48948:10;;48296:668;;;;;48253:711;;:::o;48970:122::-;49043:24;49061:5;49043:24;:::i;:::-;49036:5;49033:35;49023:63;;49082:1;49079;49072:12;49023:63;48970:122;:::o;49098:116::-;49168:21;49183:5;49168:21;:::i;:::-;49161:5;49158:32;49148:60;;49204:1;49201;49194:12;49148:60;49098:116;:::o;49220:120::-;49292:23;49309:5;49292:23;:::i;:::-;49285:5;49282:34;49272:62;;49330:1;49327;49320:12;49272:62;49220:120;:::o;49346:122::-;49419:24;49437:5;49419:24;:::i;:::-;49412:5;49409:35;49399:63;;49458:1;49455;49448:12;49399:63;49346:122;:::o

Swarm Source

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