ETH Price: $2,994.61 (+0.80%)
Gas: 6 Gwei

Token

Loot Class (CLASS)
 

Overview

Max Total Supply

547 CLASS

Holders

217

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
sendbryce.eth
Balance
1 CLASS
0x79804382f29aad0e3f43f3b50ba9d9bb55ad4cab
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:
LootClass

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}




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

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

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

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

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




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

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









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

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

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

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

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

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

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

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





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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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














/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}







/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}





/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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









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


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}







/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


contract LootClass is ERC721Enumerable, ReentrancyGuard, Ownable {

    ERC721 loot = ERC721(0xFF9C1b15B16263C61d017ee9F65C50e4AE0113D7);
    
    string[] private gender = [
        "Male",
        "Female"
    ];

    string[] private race = [
        "Dragonborn",
        "Dwarf",
        "Elf",
        "Gnome",
        "Half-Elf",
        "Halfling",
        "Half-Orc",
        "Human",
        "Tiefling"
    ];

    string[] private class = [
        "Barbarian",
        "Bard",
        "Cleric",
        "Druid",
        "Fighter",
        "Monk",
        "Paladin",
        "Ranger",
        "Rogue",
        "Sorcerer",
        "Warlock",
        "Wizard"
    ];

    //generating a random number
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function getGender(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Gender", gender);
    }
    
    function getRace(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Race", race);
    }
    
    function getClass(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Class", class);
    }
    
    function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        output = string(abi.encodePacked(keyPrefix, ": ", output));

        return output;
    }

    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        string[7] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">';

        parts[1] = getGender(tokenId);

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getRace(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getClass(tokenId);

        parts[6] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Sheet #', toString(tokenId), '", "description": "Loot Class are randomized RPG style classes generated and stored on chain. Feel free to use Loot Class in any way you want.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId > 8000 && tokenId < 9576, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }
    
    function claimForLoot(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 8001, "Token ID invalid");
        require(loot.ownerOf(tokenId) == msg.sender, "Not Loot owner");
        _safeMint(_msgSender(), tokenId);
    }
    
    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 9575 && tokenId < 10001, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimForLoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getClass","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getGender","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRace","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273ff9c1b15b16263c61d017ee9f65c50e4ae0113d7600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180604001604052806040518060400160405280600481526020017f4d616c650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f46656d616c650000000000000000000000000000000000000000000000000000815250815250600d906002620000ea929190620007a6565b506040518061012001604052806040518060400160405280600a81526020017f447261676f6e626f726e0000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f447761726600000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f456c66000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f476e6f6d6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f48616c662d456c6600000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f48616c666c696e6700000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f48616c662d4f726300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f48756d616e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f546965666c696e67000000000000000000000000000000000000000000000000815250815250600e9060096200031a9291906200080d565b506040518061018001604052806040518060400160405280600981526020017f42617262617269616e000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426172640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f436c65726963000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f447275696400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f466967687465720000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d6f6e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f50616c6164696e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f52616e676572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f526f67756500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f536f72636572657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5761726c6f636b0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f57697a6172640000000000000000000000000000000000000000000000000000815250815250600f90600c620005fb92919062000874565b503480156200060957600080fd5b506040518060400160405280600a81526020017f4c6f6f7420436c617373000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f434c41535300000000000000000000000000000000000000000000000000000081525081600090805190602001906200068e929190620008db565b508060019080519060200190620006a7929190620008db565b5050506001600a81905550620006d2620006c6620006d860201b60201c565b620006e060201b60201c565b62000a5e565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255906000526020600020908101928215620007fa579160200282015b82811115620007f9578251829080519060200190620007e8929190620008db565b5091602001919060010190620007c7565b5b5090506200080991906200096c565b5090565b82805482825590600052602060002090810192821562000861579160200282015b82811115620008605782518290805190602001906200084f929190620008db565b50916020019190600101906200082e565b5b5090506200087091906200096c565b5090565b828054828255906000526020600020908101928215620008c8579160200282015b82811115620008c7578251829080519060200190620008b6929190620008db565b509160200191906001019062000895565b5b509050620008d791906200096c565b5090565b828054620008e990620009f9565b90600052602060002090601f0160209004810192826200090d576000855562000959565b82601f106200092857805160ff191683800117855562000959565b8280016001018555821562000959579182015b82811115620009585782518255916020019190600101906200093b565b5b50905062000968919062000994565b5090565b5b80821115620009905760008181620009869190620009b3565b506001016200096d565b5090565b5b80821115620009af57600081600090555060010162000995565b5090565b508054620009c190620009f9565b6000825580601f10620009d55750620009f6565b601f016020900490600052602060002090810190620009f5919062000994565b5b50565b6000600282049050600182168062000a1257607f821691505b6020821081141562000a295762000a2862000a2f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6147f98062000a6e6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80634f6ccce7116100de57806395d89b4111610097578063c87b56dd11610071578063c87b56dd1461045a578063e06d2eb51461048a578063e985e9c5146104ba578063f2fde38b146104ea57610173565b806395d89b4114610404578063a22cb46514610422578063b88d4fde1461043e57610173565b80634f6ccce71461031c578063512d62df1461034c5780636352211e1461037c57806370a08231146103ac578063715018a6146103dc5780638da5cb5b146103e657610173565b806323b872dd1161013057806323b872dd146102605780632f745c591461027c578063379607f5146102ac57806342842e0e146102c8578063434f48c4146102e457806347d8636a1461030057610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f65780630d71aba51461021257806318160ddd14610242575b600080fd5b610192600480360381019061018d91906131f4565b610506565b60405161019f9190613847565b60405180910390f35b6101b0610580565b6040516101bd9190613862565b60405180910390f35b6101e060048036038101906101db9190613246565b610612565b6040516101ed91906137e0565b60405180910390f35b610210600480360381019061020b91906131b8565b610697565b005b61022c60048036038101906102279190613246565b6107af565b6040516102399190613862565b60405180910390f35b61024a6108c9565b6040516102579190613b04565b60405180910390f35b61027a600480360381019061027591906130b2565b6108d6565b005b610296600480360381019061029191906131b8565b610936565b6040516102a39190613b04565b60405180910390f35b6102c660048036038101906102c19190613246565b6109db565b005b6102e260048036038101906102dd91906130b2565b610a96565b005b6102fe60048036038101906102f99190613246565b610ab6565b005b61031a60048036038101906103159190613246565b610bed565b005b61033660048036038101906103319190613246565b610dbf565b6040516103439190613b04565b60405180910390f35b61036660048036038101906103619190613246565b610e56565b6040516103739190613862565b60405180910390f35b61039660048036038101906103919190613246565b610f70565b6040516103a391906137e0565b60405180910390f35b6103c660048036038101906103c19190613024565b611022565b6040516103d39190613b04565b60405180910390f35b6103e46110da565b005b6103ee611162565b6040516103fb91906137e0565b60405180910390f35b61040c61118c565b6040516104199190613862565b60405180910390f35b61043c6004803603810190610437919061317c565b61121e565b005b61045860048036038101906104539190613101565b61139f565b005b610474600480360381019061046f9190613246565b611401565b6040516104819190613862565b60405180910390f35b6104a4600480360381019061049f9190613246565b6118c3565b6040516104b19190613862565b60405180910390f35b6104d460048036038101906104cf9190613076565b6119dd565b6040516104e19190613847565b60405180910390f35b61050460048036038101906104ff9190613024565b611a71565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610579575061057882611b69565b5b9050919050565b60606000805461058f90613d83565b80601f01602080910402602001604051908101604052809291908181526020018280546105bb90613d83565b80156106085780601f106105dd57610100808354040283529160200191610608565b820191906000526020600020905b8154815290600101906020018083116105eb57829003601f168201915b5050505050905090565b600061061d82611c4b565b61065c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065390613a04565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106a282610f70565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070a90613a84565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610732611cb7565b73ffffffffffffffffffffffffffffffffffffffff16148061076157506107608161075b611cb7565b6119dd565b5b6107a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079790613984565b60405180910390fd5b6107aa8383611cbf565b505050565b60606108c2826040518060400160405280600481526020017f5261636500000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156108b957838290600052602060002001805461082c90613d83565b80601f016020809104026020016040519081016040528092919081815260200182805461085890613d83565b80156108a55780601f1061087a576101008083540402835291602001916108a5565b820191906000526020600020905b81548152906001019060200180831161088857829003601f168201915b50505050508152602001906001019061080d565b50505050611d78565b9050919050565b6000600880549050905090565b6108e76108e1611cb7565b82611e31565b610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d90613aa4565b60405180910390fd5b610931838383611f0f565b505050565b600061094183611022565b8210610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097990613884565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890613ae4565b60405180910390fd5b6002600a81905550611f4081118015610a3b575061256881105b610a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7190613a44565b60405180910390fd5b610a8b610a85611cb7565b8261216b565b6001600a8190555050565b610ab18383836040518060200160405280600081525061139f565b505050565b6002600a541415610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af390613ae4565b60405180910390fd5b6002600a81905550610b0c611cb7565b73ffffffffffffffffffffffffffffffffffffffff16610b2a611162565b73ffffffffffffffffffffffffffffffffffffffff1614610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7790613a24565b60405180910390fd5b61256781118015610b92575061271181105b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc890613a44565b60405180910390fd5b610be2610bdc611162565b8261216b565b6001600a8190555050565b6002600a541415610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90613ae4565b60405180910390fd5b6002600a81905550600081118015610c4c5750611f4181105b610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290613a44565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610cfd9190613b04565b60206040518083038186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d919061304d565b73ffffffffffffffffffffffffffffffffffffffff1614610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90613904565b60405180910390fd5b610db4610dae611cb7565b8261216b565b6001600a8190555050565b6000610dc96108c9565b8210610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190613ac4565b60405180910390fd5b60088281548110610e44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6060610f69826040518060400160405280600581526020017f436c617373000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610f60578382906000526020600020018054610ed390613d83565b80601f0160208091040260200160405190810160405280929190818152602001828054610eff90613d83565b8015610f4c5780601f10610f2157610100808354040283529160200191610f4c565b820191906000526020600020905b815481529060010190602001808311610f2f57829003601f168201915b505050505081526020019060010190610eb4565b50505050611d78565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611010906139c4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a906139a4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110e2611cb7565b73ffffffffffffffffffffffffffffffffffffffff16611100611162565b73ffffffffffffffffffffffffffffffffffffffff1614611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d90613a24565b60405180910390fd5b6111606000612189565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461119b90613d83565b80601f01602080910402602001604051908101604052809291908181526020018280546111c790613d83565b80156112145780601f106111e957610100808354040283529160200191611214565b820191906000526020600020905b8154815290600101906020018083116111f757829003601f168201915b5050505050905090565b611226611cb7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90613944565b60405180910390fd5b80600560006112a1611cb7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661134e611cb7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113939190613847565b60405180910390a35050565b6113b06113aa611cb7565b83611e31565b6113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690613aa4565b60405180910390fd5b6113fb8484848461224f565b50505050565b606061140b612f17565b60405180610120016040528060fd815260200161465f60fd91398160006007811061145f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611470836118c3565b816001600781106114aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161479c6028913981600260078110611505577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611516836107af565b81600360078110611550577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161463760289139816004600781106115ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506115bc83610e56565b816005600781106115f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152508160066007811061166e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600781106116b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600781106116f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260078110611730577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518460036007811061176f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600781106117ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600781106117ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518760066007811061182c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161184797969594939291906136e5565b60405160208183030381529060405290506000611894611866866122ab565b61186f84612458565b604051602001611880929190613779565b604051602081830303815290604052612458565b9050806040516020016118a791906137be565b6040516020818303038152906040529150819350505050919050565b60606119d6826040518060400160405280600681526020017f47656e6465720000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b828210156119cd57838290600052602060002001805461194090613d83565b80601f016020809104026020016040519081016040528092919081815260200182805461196c90613d83565b80156119b95780601f1061198e576101008083540402835291602001916119b9565b820191906000526020600020905b81548152906001019060200180831161199c57829003601f168201915b505050505081526020019060010190611921565b50505050611d78565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a79611cb7565b73ffffffffffffffffffffffffffffffffffffffff16611a97611162565b73ffffffffffffffffffffffffffffffffffffffff1614611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490613a24565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b54906138c4565b60405180910390fd5b611b6681612189565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c3457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c445750611c4382612616565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d3283610f70565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000611dae84611d89876122ab565b604051602001611d9a9291906136c1565b604051602081830303815290604052612680565b9050600083845183611dc09190613e2f565b81518110611df7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508481604051602001611e1492919061374a565b604051602081830303815290604052905080925050509392505050565b6000611e3c82611c4b565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290613964565b60405180910390fd5b6000611e8683610f70565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ef557508373ffffffffffffffffffffffffffffffffffffffff16611edd84610612565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f065750611f0581856119dd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2f82610f70565b73ffffffffffffffffffffffffffffffffffffffff1614611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c90613a64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90613924565b60405180910390fd5b6120008383836126b3565b61200b600082611cbf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461205b9190613c99565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b29190613bb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6121858282604051806020016040528060008152506127c7565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61225a848484611f0f565b61226684848484612822565b6122a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229c906138a4565b60405180910390fd5b50505050565b606060008214156122f3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612453565b600082905060005b6000821461232557808061230e90613de6565b915050600a8261231e9190613c0e565b91506122fb565b60008167ffffffffffffffff811115612367577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123995781602001600182028036833780820191505090505b5090505b6000851461244c576001826123b29190613c99565b9150600a856123c19190613e2f565b60306123cd9190613bb8565b60f81b818381518110612409577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124459190613c0e565b945061239d565b8093505050505b919050565b606060008251905060008114156124815760405180602001604052806000815250915050612611565b600060036002836124929190613bb8565b61249c9190613c0e565b60046124a89190613c3f565b905060006020826124b99190613bb8565b67ffffffffffffffff8111156124f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561252a5781602001600182028036833780820191505090505b509050600060405180606001604052806040815260200161475c604091399050600181016020830160005b868110156125ce5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612555565b5060038606600181146125e857600281146125f857612603565b613d3d60f01b6002830352612603565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008160405160200161269391906136aa565b6040516020818303038152906040528051906020012060001c9050919050565b6126be8383836129b9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612701576126fc816129be565b612740565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461273f5761273e8382612a07565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127835761277e81612b74565b6127c2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127c1576127c08282612cb7565b5b5b505050565b6127d18383612d36565b6127de6000848484612822565b61281d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612814906138a4565b60405180910390fd5b505050565b60006128438473ffffffffffffffffffffffffffffffffffffffff16612f04565b156129ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261286c611cb7565b8786866040518563ffffffff1660e01b815260040161288e94939291906137fb565b602060405180830381600087803b1580156128a857600080fd5b505af19250505080156128d957506040513d601f19601f820116820180604052508101906128d6919061321d565b60015b61295c573d8060008114612909576040519150601f19603f3d011682016040523d82523d6000602084013e61290e565b606091505b50600081511415612954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294b906138a4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129b1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a1484611022565b612a1e9190613c99565b9050600060076000848152602001908152602001600020549050818114612b03576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b889190613c99565b9050600060096000848152602001908152602001600020549050600060088381548110612bde577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612c26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612cc283611022565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9d906139e4565b60405180910390fd5b612daf81611c4b565b15612def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de6906138e4565b60405180910390fd5b612dfb600083836126b3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e4b9190613bb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060e001604052806007905b6060815260200190600190039081612f265790505090565b6000612f51612f4c84613b44565b613b1f565b905082815260208101848484011115612f6957600080fd5b612f74848285613d41565b509392505050565b600081359050612f8b816145da565b92915050565b600081519050612fa0816145da565b92915050565b600081359050612fb5816145f1565b92915050565b600081359050612fca81614608565b92915050565b600081519050612fdf81614608565b92915050565b600082601f830112612ff657600080fd5b8135613006848260208601612f3e565b91505092915050565b60008135905061301e8161461f565b92915050565b60006020828403121561303657600080fd5b600061304484828501612f7c565b91505092915050565b60006020828403121561305f57600080fd5b600061306d84828501612f91565b91505092915050565b6000806040838503121561308957600080fd5b600061309785828601612f7c565b92505060206130a885828601612f7c565b9150509250929050565b6000806000606084860312156130c757600080fd5b60006130d586828701612f7c565b93505060206130e686828701612f7c565b92505060406130f78682870161300f565b9150509250925092565b6000806000806080858703121561311757600080fd5b600061312587828801612f7c565b945050602061313687828801612f7c565b93505060406131478782880161300f565b925050606085013567ffffffffffffffff81111561316457600080fd5b61317087828801612fe5565b91505092959194509250565b6000806040838503121561318f57600080fd5b600061319d85828601612f7c565b92505060206131ae85828601612fa6565b9150509250929050565b600080604083850312156131cb57600080fd5b60006131d985828601612f7c565b92505060206131ea8582860161300f565b9150509250929050565b60006020828403121561320657600080fd5b600061321484828501612fbb565b91505092915050565b60006020828403121561322f57600080fd5b600061323d84828501612fd0565b91505092915050565b60006020828403121561325857600080fd5b60006132668482850161300f565b91505092915050565b61327881613ccd565b82525050565b61328781613cdf565b82525050565b600061329882613b75565b6132a28185613b8b565b93506132b2818560208601613d50565b6132bb81613f1c565b840191505092915050565b60006132d182613b80565b6132db8185613b9c565b93506132eb818560208601613d50565b6132f481613f1c565b840191505092915050565b600061330a82613b80565b6133148185613bad565b9350613324818560208601613d50565b80840191505092915050565b600061333d602b83613b9c565b915061334882613f2d565b604082019050919050565b6000613360603283613b9c565b915061336b82613f7c565b604082019050919050565b6000613383602683613b9c565b915061338e82613fcb565b604082019050919050565b60006133a6601c83613b9c565b91506133b18261401a565b602082019050919050565b60006133c9600e83613b9c565b91506133d482614043565b602082019050919050565b60006133ec602483613b9c565b91506133f78261406c565b604082019050919050565b600061340f601983613b9c565b915061341a826140bb565b602082019050919050565b6000613432601183613bad565b915061343d826140e4565b601182019050919050565b6000613455602c83613b9c565b91506134608261410d565b604082019050919050565b6000613478603883613b9c565b91506134838261415c565b604082019050919050565b600061349b602a83613b9c565b91506134a6826141ab565b604082019050919050565b60006134be602983613b9c565b91506134c9826141fa565b604082019050919050565b60006134e1600283613bad565b91506134ec82614249565b600282019050919050565b6000613504602083613b9c565b915061350f82614272565b602082019050919050565b6000613527602c83613b9c565b91506135328261429b565b604082019050919050565b600061354a602083613b9c565b9150613555826142ea565b602082019050919050565b600061356d601083613b9c565b915061357882614313565b602082019050919050565b6000613590602983613b9c565b915061359b8261433c565b604082019050919050565b60006135b3602183613b9c565b91506135be8261438b565b604082019050919050565b60006135d6601d83613bad565b91506135e1826143da565b601d82019050919050565b60006135f9603183613b9c565b915061360482614403565b604082019050919050565b600061361c60b583613bad565b915061362782614452565b60b582019050919050565b600061363f602c83613b9c565b915061364a82614539565b604082019050919050565b6000613662600283613bad565b915061366d82614588565b600282019050919050565b6000613685601f83613b9c565b9150613690826145b1565b602082019050919050565b6136a481613d37565b82525050565b60006136b682846132ff565b915081905092915050565b60006136cd82856132ff565b91506136d982846132ff565b91508190509392505050565b60006136f1828a6132ff565b91506136fd82896132ff565b915061370982886132ff565b915061371582876132ff565b915061372182866132ff565b915061372d82856132ff565b915061373982846132ff565b915081905098975050505050505050565b600061375682856132ff565b915061376182613655565b915061376d82846132ff565b91508190509392505050565b600061378482613425565b915061379082856132ff565b915061379b8261360f565b91506137a782846132ff565b91506137b2826134d4565b91508190509392505050565b60006137c9826135c9565b91506137d582846132ff565b915081905092915050565b60006020820190506137f5600083018461326f565b92915050565b6000608082019050613810600083018761326f565b61381d602083018661326f565b61382a604083018561369b565b818103606083015261383c818461328d565b905095945050505050565b600060208201905061385c600083018461327e565b92915050565b6000602082019050818103600083015261387c81846132c6565b905092915050565b6000602082019050818103600083015261389d81613330565b9050919050565b600060208201905081810360008301526138bd81613353565b9050919050565b600060208201905081810360008301526138dd81613376565b9050919050565b600060208201905081810360008301526138fd81613399565b9050919050565b6000602082019050818103600083015261391d816133bc565b9050919050565b6000602082019050818103600083015261393d816133df565b9050919050565b6000602082019050818103600083015261395d81613402565b9050919050565b6000602082019050818103600083015261397d81613448565b9050919050565b6000602082019050818103600083015261399d8161346b565b9050919050565b600060208201905081810360008301526139bd8161348e565b9050919050565b600060208201905081810360008301526139dd816134b1565b9050919050565b600060208201905081810360008301526139fd816134f7565b9050919050565b60006020820190508181036000830152613a1d8161351a565b9050919050565b60006020820190508181036000830152613a3d8161353d565b9050919050565b60006020820190508181036000830152613a5d81613560565b9050919050565b60006020820190508181036000830152613a7d81613583565b9050919050565b60006020820190508181036000830152613a9d816135a6565b9050919050565b60006020820190508181036000830152613abd816135ec565b9050919050565b60006020820190508181036000830152613add81613632565b9050919050565b60006020820190508181036000830152613afd81613678565b9050919050565b6000602082019050613b19600083018461369b565b92915050565b6000613b29613b3a565b9050613b358282613db5565b919050565b6000604051905090565b600067ffffffffffffffff821115613b5f57613b5e613eed565b5b613b6882613f1c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bc382613d37565b9150613bce83613d37565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c0357613c02613e60565b5b828201905092915050565b6000613c1982613d37565b9150613c2483613d37565b925082613c3457613c33613e8f565b5b828204905092915050565b6000613c4a82613d37565b9150613c5583613d37565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c8e57613c8d613e60565b5b828202905092915050565b6000613ca482613d37565b9150613caf83613d37565b925082821015613cc257613cc1613e60565b5b828203905092915050565b6000613cd882613d17565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d6e578082015181840152602081019050613d53565b83811115613d7d576000848401525b50505050565b60006002820490506001821680613d9b57607f821691505b60208210811415613daf57613dae613ebe565b5b50919050565b613dbe82613f1c565b810181811067ffffffffffffffff82111715613ddd57613ddc613eed565b5b80604052505050565b6000613df182613d37565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e2457613e23613e60565b5b600182019050919050565b6000613e3a82613d37565b9150613e4583613d37565b925082613e5557613e54613e8f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f74204c6f6f74206f776e6572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b226e616d65223a202253686565742023000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a20224c6f6f7420436c61737320617260008201527f652072616e646f6d697a656420525047207374796c6520636c6173736573206760208201527f656e65726174656420616e642073746f726564206f6e20636861696e2e20466560408201527f656c206672656520746f20757365204c6f6f7420436c61737320696e20616e7960608201527f2077617920796f752077616e742e222c2022696d616765223a2022646174613a60808201527f696d6167652f7376672b786d6c3b6261736536342c000000000000000000000060a082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3a20000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6145e381613ccd565b81146145ee57600080fd5b50565b6145fa81613cdf565b811461460557600080fd5b50565b61461181613ceb565b811461461c57600080fd5b50565b61462881613d37565b811461463357600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212201a365511bc4a960a2e385789d54dc65c9f2771b7d41d5922e8b58dd8ddda0a8b64736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c80634f6ccce7116100de57806395d89b4111610097578063c87b56dd11610071578063c87b56dd1461045a578063e06d2eb51461048a578063e985e9c5146104ba578063f2fde38b146104ea57610173565b806395d89b4114610404578063a22cb46514610422578063b88d4fde1461043e57610173565b80634f6ccce71461031c578063512d62df1461034c5780636352211e1461037c57806370a08231146103ac578063715018a6146103dc5780638da5cb5b146103e657610173565b806323b872dd1161013057806323b872dd146102605780632f745c591461027c578063379607f5146102ac57806342842e0e146102c8578063434f48c4146102e457806347d8636a1461030057610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f65780630d71aba51461021257806318160ddd14610242575b600080fd5b610192600480360381019061018d91906131f4565b610506565b60405161019f9190613847565b60405180910390f35b6101b0610580565b6040516101bd9190613862565b60405180910390f35b6101e060048036038101906101db9190613246565b610612565b6040516101ed91906137e0565b60405180910390f35b610210600480360381019061020b91906131b8565b610697565b005b61022c60048036038101906102279190613246565b6107af565b6040516102399190613862565b60405180910390f35b61024a6108c9565b6040516102579190613b04565b60405180910390f35b61027a600480360381019061027591906130b2565b6108d6565b005b610296600480360381019061029191906131b8565b610936565b6040516102a39190613b04565b60405180910390f35b6102c660048036038101906102c19190613246565b6109db565b005b6102e260048036038101906102dd91906130b2565b610a96565b005b6102fe60048036038101906102f99190613246565b610ab6565b005b61031a60048036038101906103159190613246565b610bed565b005b61033660048036038101906103319190613246565b610dbf565b6040516103439190613b04565b60405180910390f35b61036660048036038101906103619190613246565b610e56565b6040516103739190613862565b60405180910390f35b61039660048036038101906103919190613246565b610f70565b6040516103a391906137e0565b60405180910390f35b6103c660048036038101906103c19190613024565b611022565b6040516103d39190613b04565b60405180910390f35b6103e46110da565b005b6103ee611162565b6040516103fb91906137e0565b60405180910390f35b61040c61118c565b6040516104199190613862565b60405180910390f35b61043c6004803603810190610437919061317c565b61121e565b005b61045860048036038101906104539190613101565b61139f565b005b610474600480360381019061046f9190613246565b611401565b6040516104819190613862565b60405180910390f35b6104a4600480360381019061049f9190613246565b6118c3565b6040516104b19190613862565b60405180910390f35b6104d460048036038101906104cf9190613076565b6119dd565b6040516104e19190613847565b60405180910390f35b61050460048036038101906104ff9190613024565b611a71565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610579575061057882611b69565b5b9050919050565b60606000805461058f90613d83565b80601f01602080910402602001604051908101604052809291908181526020018280546105bb90613d83565b80156106085780601f106105dd57610100808354040283529160200191610608565b820191906000526020600020905b8154815290600101906020018083116105eb57829003601f168201915b5050505050905090565b600061061d82611c4b565b61065c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065390613a04565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106a282610f70565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070a90613a84565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610732611cb7565b73ffffffffffffffffffffffffffffffffffffffff16148061076157506107608161075b611cb7565b6119dd565b5b6107a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079790613984565b60405180910390fd5b6107aa8383611cbf565b505050565b60606108c2826040518060400160405280600481526020017f5261636500000000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b828210156108b957838290600052602060002001805461082c90613d83565b80601f016020809104026020016040519081016040528092919081815260200182805461085890613d83565b80156108a55780601f1061087a576101008083540402835291602001916108a5565b820191906000526020600020905b81548152906001019060200180831161088857829003601f168201915b50505050508152602001906001019061080d565b50505050611d78565b9050919050565b6000600880549050905090565b6108e76108e1611cb7565b82611e31565b610926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091d90613aa4565b60405180910390fd5b610931838383611f0f565b505050565b600061094183611022565b8210610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097990613884565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a541415610a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1890613ae4565b60405180910390fd5b6002600a81905550611f4081118015610a3b575061256881105b610a7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7190613a44565b60405180910390fd5b610a8b610a85611cb7565b8261216b565b6001600a8190555050565b610ab18383836040518060200160405280600081525061139f565b505050565b6002600a541415610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af390613ae4565b60405180910390fd5b6002600a81905550610b0c611cb7565b73ffffffffffffffffffffffffffffffffffffffff16610b2a611162565b73ffffffffffffffffffffffffffffffffffffffff1614610b80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7790613a24565b60405180910390fd5b61256781118015610b92575061271181105b610bd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc890613a44565b60405180910390fd5b610be2610bdc611162565b8261216b565b6001600a8190555050565b6002600a541415610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90613ae4565b60405180910390fd5b6002600a81905550600081118015610c4c5750611f4181105b610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290613a44565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610cfd9190613b04565b60206040518083038186803b158015610d1557600080fd5b505afa158015610d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4d919061304d565b73ffffffffffffffffffffffffffffffffffffffff1614610da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9a90613904565b60405180910390fd5b610db4610dae611cb7565b8261216b565b6001600a8190555050565b6000610dc96108c9565b8210610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0190613ac4565b60405180910390fd5b60088281548110610e44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6060610f69826040518060400160405280600581526020017f436c617373000000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610f60578382906000526020600020018054610ed390613d83565b80601f0160208091040260200160405190810160405280929190818152602001828054610eff90613d83565b8015610f4c5780601f10610f2157610100808354040283529160200191610f4c565b820191906000526020600020905b815481529060010190602001808311610f2f57829003601f168201915b505050505081526020019060010190610eb4565b50505050611d78565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611019576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611010906139c4565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a906139a4565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110e2611cb7565b73ffffffffffffffffffffffffffffffffffffffff16611100611162565b73ffffffffffffffffffffffffffffffffffffffff1614611156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114d90613a24565b60405180910390fd5b6111606000612189565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461119b90613d83565b80601f01602080910402602001604051908101604052809291908181526020018280546111c790613d83565b80156112145780601f106111e957610100808354040283529160200191611214565b820191906000526020600020905b8154815290600101906020018083116111f757829003601f168201915b5050505050905090565b611226611cb7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128b90613944565b60405180910390fd5b80600560006112a1611cb7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661134e611cb7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113939190613847565b60405180910390a35050565b6113b06113aa611cb7565b83611e31565b6113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690613aa4565b60405180910390fd5b6113fb8484848461224f565b50505050565b606061140b612f17565b60405180610120016040528060fd815260200161465f60fd91398160006007811061145f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611470836118c3565b816001600781106114aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161479c6028913981600260078110611505577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611516836107af565b81600360078110611550577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161463760289139816004600781106115ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506115bc83610e56565b816005600781106115f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e000000000000000000000000000000000000008152508160066007811061166e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600781106116b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600781106116f1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260078110611730577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518460036007811061176f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600781106117ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600781106117ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518760066007811061182c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161184797969594939291906136e5565b60405160208183030381529060405290506000611894611866866122ab565b61186f84612458565b604051602001611880929190613779565b604051602081830303815290604052612458565b9050806040516020016118a791906137be565b6040516020818303038152906040529150819350505050919050565b60606119d6826040518060400160405280600681526020017f47656e6465720000000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b828210156119cd57838290600052602060002001805461194090613d83565b80601f016020809104026020016040519081016040528092919081815260200182805461196c90613d83565b80156119b95780601f1061198e576101008083540402835291602001916119b9565b820191906000526020600020905b81548152906001019060200180831161199c57829003601f168201915b505050505081526020019060010190611921565b50505050611d78565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a79611cb7565b73ffffffffffffffffffffffffffffffffffffffff16611a97611162565b73ffffffffffffffffffffffffffffffffffffffff1614611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae490613a24565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b54906138c4565b60405180910390fd5b611b6681612189565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c3457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c445750611c4382612616565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d3283610f70565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000611dae84611d89876122ab565b604051602001611d9a9291906136c1565b604051602081830303815290604052612680565b9050600083845183611dc09190613e2f565b81518110611df7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508481604051602001611e1492919061374a565b604051602081830303815290604052905080925050509392505050565b6000611e3c82611c4b565b611e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7290613964565b60405180910390fd5b6000611e8683610f70565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ef557508373ffffffffffffffffffffffffffffffffffffffff16611edd84610612565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f065750611f0581856119dd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f2f82610f70565b73ffffffffffffffffffffffffffffffffffffffff1614611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c90613a64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fec90613924565b60405180910390fd5b6120008383836126b3565b61200b600082611cbf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461205b9190613c99565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120b29190613bb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6121858282604051806020016040528060008152506127c7565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61225a848484611f0f565b61226684848484612822565b6122a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229c906138a4565b60405180910390fd5b50505050565b606060008214156122f3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612453565b600082905060005b6000821461232557808061230e90613de6565b915050600a8261231e9190613c0e565b91506122fb565b60008167ffffffffffffffff811115612367577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123995781602001600182028036833780820191505090505b5090505b6000851461244c576001826123b29190613c99565b9150600a856123c19190613e2f565b60306123cd9190613bb8565b60f81b818381518110612409577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124459190613c0e565b945061239d565b8093505050505b919050565b606060008251905060008114156124815760405180602001604052806000815250915050612611565b600060036002836124929190613bb8565b61249c9190613c0e565b60046124a89190613c3f565b905060006020826124b99190613bb8565b67ffffffffffffffff8111156124f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561252a5781602001600182028036833780820191505090505b509050600060405180606001604052806040815260200161475c604091399050600181016020830160005b868110156125ce5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050612555565b5060038606600181146125e857600281146125f857612603565b613d3d60f01b6002830352612603565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008160405160200161269391906136aa565b6040516020818303038152906040528051906020012060001c9050919050565b6126be8383836129b9565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612701576126fc816129be565b612740565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461273f5761273e8382612a07565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127835761277e81612b74565b6127c2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146127c1576127c08282612cb7565b5b5b505050565b6127d18383612d36565b6127de6000848484612822565b61281d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612814906138a4565b60405180910390fd5b505050565b60006128438473ffffffffffffffffffffffffffffffffffffffff16612f04565b156129ac578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261286c611cb7565b8786866040518563ffffffff1660e01b815260040161288e94939291906137fb565b602060405180830381600087803b1580156128a857600080fd5b505af19250505080156128d957506040513d601f19601f820116820180604052508101906128d6919061321d565b60015b61295c573d8060008114612909576040519150601f19603f3d011682016040523d82523d6000602084013e61290e565b606091505b50600081511415612954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294b906138a4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129b1565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a1484611022565b612a1e9190613c99565b9050600060076000848152602001908152602001600020549050818114612b03576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b889190613c99565b9050600060096000848152602001908152602001600020549050600060088381548110612bde577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612c26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612cc283611022565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9d906139e4565b60405180910390fd5b612daf81611c4b565b15612def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de6906138e4565b60405180910390fd5b612dfb600083836126b3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e4b9190613bb8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060e001604052806007905b6060815260200190600190039081612f265790505090565b6000612f51612f4c84613b44565b613b1f565b905082815260208101848484011115612f6957600080fd5b612f74848285613d41565b509392505050565b600081359050612f8b816145da565b92915050565b600081519050612fa0816145da565b92915050565b600081359050612fb5816145f1565b92915050565b600081359050612fca81614608565b92915050565b600081519050612fdf81614608565b92915050565b600082601f830112612ff657600080fd5b8135613006848260208601612f3e565b91505092915050565b60008135905061301e8161461f565b92915050565b60006020828403121561303657600080fd5b600061304484828501612f7c565b91505092915050565b60006020828403121561305f57600080fd5b600061306d84828501612f91565b91505092915050565b6000806040838503121561308957600080fd5b600061309785828601612f7c565b92505060206130a885828601612f7c565b9150509250929050565b6000806000606084860312156130c757600080fd5b60006130d586828701612f7c565b93505060206130e686828701612f7c565b92505060406130f78682870161300f565b9150509250925092565b6000806000806080858703121561311757600080fd5b600061312587828801612f7c565b945050602061313687828801612f7c565b93505060406131478782880161300f565b925050606085013567ffffffffffffffff81111561316457600080fd5b61317087828801612fe5565b91505092959194509250565b6000806040838503121561318f57600080fd5b600061319d85828601612f7c565b92505060206131ae85828601612fa6565b9150509250929050565b600080604083850312156131cb57600080fd5b60006131d985828601612f7c565b92505060206131ea8582860161300f565b9150509250929050565b60006020828403121561320657600080fd5b600061321484828501612fbb565b91505092915050565b60006020828403121561322f57600080fd5b600061323d84828501612fd0565b91505092915050565b60006020828403121561325857600080fd5b60006132668482850161300f565b91505092915050565b61327881613ccd565b82525050565b61328781613cdf565b82525050565b600061329882613b75565b6132a28185613b8b565b93506132b2818560208601613d50565b6132bb81613f1c565b840191505092915050565b60006132d182613b80565b6132db8185613b9c565b93506132eb818560208601613d50565b6132f481613f1c565b840191505092915050565b600061330a82613b80565b6133148185613bad565b9350613324818560208601613d50565b80840191505092915050565b600061333d602b83613b9c565b915061334882613f2d565b604082019050919050565b6000613360603283613b9c565b915061336b82613f7c565b604082019050919050565b6000613383602683613b9c565b915061338e82613fcb565b604082019050919050565b60006133a6601c83613b9c565b91506133b18261401a565b602082019050919050565b60006133c9600e83613b9c565b91506133d482614043565b602082019050919050565b60006133ec602483613b9c565b91506133f78261406c565b604082019050919050565b600061340f601983613b9c565b915061341a826140bb565b602082019050919050565b6000613432601183613bad565b915061343d826140e4565b601182019050919050565b6000613455602c83613b9c565b91506134608261410d565b604082019050919050565b6000613478603883613b9c565b91506134838261415c565b604082019050919050565b600061349b602a83613b9c565b91506134a6826141ab565b604082019050919050565b60006134be602983613b9c565b91506134c9826141fa565b604082019050919050565b60006134e1600283613bad565b91506134ec82614249565b600282019050919050565b6000613504602083613b9c565b915061350f82614272565b602082019050919050565b6000613527602c83613b9c565b91506135328261429b565b604082019050919050565b600061354a602083613b9c565b9150613555826142ea565b602082019050919050565b600061356d601083613b9c565b915061357882614313565b602082019050919050565b6000613590602983613b9c565b915061359b8261433c565b604082019050919050565b60006135b3602183613b9c565b91506135be8261438b565b604082019050919050565b60006135d6601d83613bad565b91506135e1826143da565b601d82019050919050565b60006135f9603183613b9c565b915061360482614403565b604082019050919050565b600061361c60b583613bad565b915061362782614452565b60b582019050919050565b600061363f602c83613b9c565b915061364a82614539565b604082019050919050565b6000613662600283613bad565b915061366d82614588565b600282019050919050565b6000613685601f83613b9c565b9150613690826145b1565b602082019050919050565b6136a481613d37565b82525050565b60006136b682846132ff565b915081905092915050565b60006136cd82856132ff565b91506136d982846132ff565b91508190509392505050565b60006136f1828a6132ff565b91506136fd82896132ff565b915061370982886132ff565b915061371582876132ff565b915061372182866132ff565b915061372d82856132ff565b915061373982846132ff565b915081905098975050505050505050565b600061375682856132ff565b915061376182613655565b915061376d82846132ff565b91508190509392505050565b600061378482613425565b915061379082856132ff565b915061379b8261360f565b91506137a782846132ff565b91506137b2826134d4565b91508190509392505050565b60006137c9826135c9565b91506137d582846132ff565b915081905092915050565b60006020820190506137f5600083018461326f565b92915050565b6000608082019050613810600083018761326f565b61381d602083018661326f565b61382a604083018561369b565b818103606083015261383c818461328d565b905095945050505050565b600060208201905061385c600083018461327e565b92915050565b6000602082019050818103600083015261387c81846132c6565b905092915050565b6000602082019050818103600083015261389d81613330565b9050919050565b600060208201905081810360008301526138bd81613353565b9050919050565b600060208201905081810360008301526138dd81613376565b9050919050565b600060208201905081810360008301526138fd81613399565b9050919050565b6000602082019050818103600083015261391d816133bc565b9050919050565b6000602082019050818103600083015261393d816133df565b9050919050565b6000602082019050818103600083015261395d81613402565b9050919050565b6000602082019050818103600083015261397d81613448565b9050919050565b6000602082019050818103600083015261399d8161346b565b9050919050565b600060208201905081810360008301526139bd8161348e565b9050919050565b600060208201905081810360008301526139dd816134b1565b9050919050565b600060208201905081810360008301526139fd816134f7565b9050919050565b60006020820190508181036000830152613a1d8161351a565b9050919050565b60006020820190508181036000830152613a3d8161353d565b9050919050565b60006020820190508181036000830152613a5d81613560565b9050919050565b60006020820190508181036000830152613a7d81613583565b9050919050565b60006020820190508181036000830152613a9d816135a6565b9050919050565b60006020820190508181036000830152613abd816135ec565b9050919050565b60006020820190508181036000830152613add81613632565b9050919050565b60006020820190508181036000830152613afd81613678565b9050919050565b6000602082019050613b19600083018461369b565b92915050565b6000613b29613b3a565b9050613b358282613db5565b919050565b6000604051905090565b600067ffffffffffffffff821115613b5f57613b5e613eed565b5b613b6882613f1c565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bc382613d37565b9150613bce83613d37565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c0357613c02613e60565b5b828201905092915050565b6000613c1982613d37565b9150613c2483613d37565b925082613c3457613c33613e8f565b5b828204905092915050565b6000613c4a82613d37565b9150613c5583613d37565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c8e57613c8d613e60565b5b828202905092915050565b6000613ca482613d37565b9150613caf83613d37565b925082821015613cc257613cc1613e60565b5b828203905092915050565b6000613cd882613d17565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613d6e578082015181840152602081019050613d53565b83811115613d7d576000848401525b50505050565b60006002820490506001821680613d9b57607f821691505b60208210811415613daf57613dae613ebe565b5b50919050565b613dbe82613f1c565b810181811067ffffffffffffffff82111715613ddd57613ddc613eed565b5b80604052505050565b6000613df182613d37565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e2457613e23613e60565b5b600182019050919050565b6000613e3a82613d37565b9150613e4583613d37565b925082613e5557613e54613e8f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f74204c6f6f74206f776e6572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b226e616d65223a202253686565742023000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a20224c6f6f7420436c61737320617260008201527f652072616e646f6d697a656420525047207374796c6520636c6173736573206760208201527f656e65726174656420616e642073746f726564206f6e20636861696e2e20466560408201527f656c206672656520746f20757365204c6f6f7420436c61737320696e20616e7960608201527f2077617920796f752077616e742e222c2022696d616765223a2022646174613a60808201527f696d6167652f7376672b786d6c3b6261736536342c000000000000000000000060a082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3a20000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6145e381613ccd565b81146145ee57600080fd5b50565b6145fa81613cdf565b811461460557600080fd5b50565b61461181613ceb565b811461461c57600080fd5b50565b61462881613d37565b811461463357600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212201a365511bc4a960a2e385789d54dc65c9f2771b7d41d5922e8b58dd8ddda0a8b64736f6c63430008040033

Deployed Bytecode Sourcemap

44490:4436:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38340:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25454:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27013:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26536:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45533:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38980:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27903:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38648:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47491:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28313:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47942:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47678:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39170:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45669:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25148:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24878:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9846:94;;;:::i;:::-;;9195:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25623:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27306:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28569:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46203:1280;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45391:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27672:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10095:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38340:224;38442:4;38481:35;38466:50;;;:11;:50;;;;:90;;;;38520:36;38544:11;38520:23;:36::i;:::-;38466:90;38459:97;;38340:224;;;:::o;25454:100::-;25508:13;25541:5;25534:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25454:100;:::o;27013:221::-;27089:7;27117:16;27125:7;27117;:16::i;:::-;27109:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27202:15;:24;27218:7;27202:24;;;;;;;;;;;;;;;;;;;;;27195:31;;27013:221;;;:::o;26536:411::-;26617:13;26633:23;26648:7;26633:14;:23::i;:::-;26617:39;;26681:5;26675:11;;:2;:11;;;;26667:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26775:5;26759:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26784:37;26801:5;26808:12;:10;:12::i;:::-;26784:16;:37::i;:::-;26759:62;26737:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26918:21;26927:2;26931:7;26918:8;:21::i;:::-;26536:411;;;:::o;45533:124::-;45588:13;45621:28;45627:7;45621:28;;;;;;;;;;;;;;;;;45644:4;45621:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:28::i;:::-;45614:35;;45533:124;;;:::o;38980:113::-;39041:7;39068:10;:17;;;;39061:24;;38980:113;:::o;27903:339::-;28098:41;28117:12;:10;:12::i;:::-;28131:7;28098:18;:41::i;:::-;28090:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28206:28;28216:4;28222:2;28226:7;28206:9;:28::i;:::-;27903:339;;;:::o;38648:256::-;38745:7;38781:23;38798:5;38781:16;:23::i;:::-;38773:5;:31;38765:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38870:12;:19;38883:5;38870:19;;;;;;;;;;;;;;;:26;38890:5;38870:26;;;;;;;;;;;;38863:33;;38648:256;;;;:::o;47491:175::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;47572:4:::1;47562:7;:14;:32;;;;;47590:4;47580:7;:14;47562:32;47554:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47626:32;47636:12;:10;:12::i;:::-;47650:7;47626:9;:32::i;:::-;12090:1:::0;13042:7;:22;;;;47491:175;:::o;28313:185::-;28451:39;28468:4;28474:2;28478:7;28451:39;;;;;;;;;;;;:16;:39::i;:::-;28313:185;;;:::o;47942:186::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;9426:12:::1;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48038:4:::2;48028:7;:14;:33;;;;;48056:5;48046:7;:15;48028:33;48020:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48093:27;48103:7;:5;:7::i;:::-;48112;48093:9;:27::i;:::-;12090:1:::0;13042:7;:22;;;;47942:186;:::o;47678:252::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;47766:1:::1;47756:7;:11;:29;;;;;47781:4;47771:7;:14;47756:29;47748:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47850:10;47825:35;;:4;;;;;;;;;;;:12;;;47838:7;47825:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;;47817:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47890:32;47900:12;:10;:12::i;:::-;47914:7;47890:9;:32::i;:::-;12090:1:::0;13042:7;:22;;;;47678:252;:::o;39170:233::-;39245:7;39281:30;:28;:30::i;:::-;39273:5;:38;39265:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39378:10;39389:5;39378:17;;;;;;;;;;;;;;;;;;;;;;;;39371:24;;39170:233;;;:::o;45669:127::-;45725:13;45758:30;45764:7;45758:30;;;;;;;;;;;;;;;;;45782:5;45758:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:30::i;:::-;45751:37;;45669:127;;;:::o;25148:239::-;25220:7;25240:13;25256:7;:16;25264:7;25256:16;;;;;;;;;;;;;;;;;;;;;25240:32;;25308:1;25291:19;;:5;:19;;;;25283:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25374:5;25367:12;;;25148:239;;;:::o;24878:208::-;24950:7;24995:1;24978:19;;:5;:19;;;;24970:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25062:9;:16;25072:5;25062:16;;;;;;;;;;;;;;;;25055:23;;24878:208;;;:::o;9846:94::-;9426:12;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9911:21:::1;9929:1;9911:9;:21::i;:::-;9846:94::o:0;9195:87::-;9241:7;9268:6;;;;;;;;;;;9261:13;;9195:87;:::o;25623:104::-;25679:13;25712:7;25705:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25623:104;:::o;27306:295::-;27421:12;:10;:12::i;:::-;27409:24;;:8;:24;;;;27401:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27521:8;27476:18;:32;27495:12;:10;:12::i;:::-;27476:32;;;;;;;;;;;;;;;:42;27509:8;27476:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27574:8;27545:48;;27560:12;:10;:12::i;:::-;27545:48;;;27584:8;27545:48;;;;;;:::i;:::-;;;;;;;;27306:295;;:::o;28569:328::-;28744:41;28763:12;:10;:12::i;:::-;28777:7;28744:18;:41::i;:::-;28736:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28850:39;28864:4;28870:2;28874:7;28883:5;28850:13;:39::i;:::-;28569:328;;;;:::o;46203:1280::-;46268:13;46294:22;;:::i;:::-;46327:266;;;;;;;;;;;;;;;;;:5;46333:1;46327:8;;;;;;;;;;;;;;;;;;:266;;;;46617:18;46627:7;46617:9;:18::i;:::-;46606:5;46612:1;46606:8;;;;;;;;;;;;;;;;;;:29;;;;46648:53;;;;;;;;;;;;;;;;;:5;46654:1;46648:8;;;;;;;;;;;;;;;;;;:53;;;;46725:16;46733:7;46725;:16::i;:::-;46714:5;46720:1;46714:8;;;;;;;;;;;;;;;;;;:27;;;;46754:53;;;;;;;;;;;;;;;;;:5;46760:1;46754:8;;;;;;;;;;;;;;;;;;:53;;;;46831:17;46840:7;46831:8;:17::i;:::-;46820:5;46826:1;46820:8;;;;;;;;;;;;;;;;;;:28;;;;46861:26;;;;;;;;;;;;;;;;;:5;46867:1;46861:8;;;;;;;;;;;;;;;;;;:26;;;;46900:20;46947:5;46953:1;46947:8;;;;;;;;;;;;;;;;;;;46957:5;46963:1;46957:8;;;;;;;;;;;;;;;;;;;46967:5;46973:1;46967:8;;;;;;;;;;;;;;;;;;;46977:5;46983:1;46977:8;;;;;;;;;;;;;;;;;;;46987:5;46993:1;46987:8;;;;;;;;;;;;;;;;;;;46997:5;47003:1;46997:8;;;;;;;;;;;;;;;;;;;47007:5;47013:1;47007:8;;;;;;;;;;;;;;;;;;;46930:86;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46900:117;;47038:18;47059:307;47124:17;47133:7;47124:8;:17::i;:::-;47328:28;47348:6;47328:13;:28::i;:::-;47086:277;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47059:13;:307::i;:::-;47038:328;;47443:4;47393:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;47377:72;;47469:6;47462:13;;;;;46203:1280;;;:::o;45391:130::-;45448:13;45481:32;45487:7;45481:32;;;;;;;;;;;;;;;;;45506:6;45481:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:32::i;:::-;45474:39;;45391:130;;;:::o;27672:164::-;27769:4;27793:18;:25;27812:5;27793:25;;;;;;;;;;;;;;;:35;27819:8;27793:35;;;;;;;;;;;;;;;;;;;;;;;;;27786:42;;27672:164;;;;:::o;10095:192::-;9426:12;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10204:1:::1;10184:22;;:8;:22;;;;10176:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10260:19;10270:8;10260:9;:19::i;:::-;10095:192:::0;:::o;24509:305::-;24611:4;24663:25;24648:40;;;:11;:40;;;;:105;;;;24720:33;24705:48;;;:11;:48;;;;24648:105;:158;;;;24770:36;24794:11;24770:23;:36::i;:::-;24648:158;24628:178;;24509:305;;;:::o;30407:127::-;30472:4;30524:1;30496:30;;:7;:16;30504:7;30496:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30489:37;;30407:127;;;:::o;8055:98::-;8108:7;8135:10;8128:17;;8055:98;:::o;34389:174::-;34491:2;34464:15;:24;34480:7;34464:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34547:7;34543:2;34509:46;;34518:23;34533:7;34518:14;:23::i;:::-;34509:46;;;;;;;;;;;;34389:174;;:::o;45808:387::-;45917:13;45943:12;45958:62;45989:9;46000:17;46009:7;46000:8;:17::i;:::-;45972:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45958:6;:62::i;:::-;45943:77;;46031:20;46054:11;46073;:18;46066:4;:25;;;;:::i;:::-;46054:38;;;;;;;;;;;;;;;;;;;;;;46031:61;;46136:9;46153:6;46119:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46103:58;;46181:6;46174:13;;;;45808:387;;;;;:::o;30701:348::-;30794:4;30819:16;30827:7;30819;:16::i;:::-;30811:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30895:13;30911:23;30926:7;30911:14;:23::i;:::-;30895:39;;30964:5;30953:16;;:7;:16;;;:51;;;;30997:7;30973:31;;:20;30985:7;30973:11;:20::i;:::-;:31;;;30953:51;:87;;;;31008:32;31025:5;31032:7;31008:16;:32::i;:::-;30953:87;30945:96;;;30701:348;;;;:::o;33693:578::-;33852:4;33825:31;;:23;33840:7;33825:14;:23::i;:::-;:31;;;33817:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33935:1;33921:16;;:2;:16;;;;33913:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33991:39;34012:4;34018:2;34022:7;33991:20;:39::i;:::-;34095:29;34112:1;34116:7;34095:8;:29::i;:::-;34156:1;34137:9;:15;34147:4;34137:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34185:1;34168:9;:13;34178:2;34168:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34216:2;34197:7;:16;34205:7;34197:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34255:7;34251:2;34236:27;;34245:4;34236:27;;;;;;;;;;;;33693:578;;;:::o;31391:110::-;31467:26;31477:2;31481:7;31467:26;;;;;;;;;;;;:9;:26::i;:::-;31391:110;;:::o;10295:173::-;10351:16;10370:6;;;;;;;;;;;10351:25;;10396:8;10387:6;;:17;;;;;;;;;;;;;;;;;;10451:8;10420:40;;10441:8;10420:40;;;;;;;;;;;;10295:173;;:::o;29779:315::-;29936:28;29946:4;29952:2;29956:7;29936:9;:28::i;:::-;29983:48;30006:4;30012:2;30016:7;30025:5;29983:22;:48::i;:::-;29975:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29779:315;;;;:::o;48140:715::-;48196:13;48418:1;48409:5;:10;48405:53;;;48436:10;;;;;;;;;;;;;;;;;;;;;48405:53;48468:12;48483:5;48468:20;;48499:14;48524:78;48539:1;48531:4;:9;48524:78;;48557:8;;;;;:::i;:::-;;;;48588:2;48580:10;;;;;:::i;:::-;;;48524:78;;;48612:19;48644:6;48634:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48612:39;;48662:154;48678:1;48669:5;:10;48662:154;;48706:1;48696:11;;;;;:::i;:::-;;;48773:2;48765:5;:10;;;;:::i;:::-;48752:2;:24;;;;:::i;:::-;48739:39;;48722:6;48729;48722:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;48802:2;48793:11;;;;;:::i;:::-;;;48662:154;;;48840:6;48826:21;;;;;48140:715;;;;:::o;49277:1607::-;49335:13;49361:11;49375:4;:11;49361:25;;49408:1;49401:3;:8;49397:23;;;49411:9;;;;;;;;;;;;;;;;;49397:23;49472:18;49510:1;49505;49499:3;:7;;;;:::i;:::-;49498:13;;;;:::i;:::-;49493:1;:19;;;;:::i;:::-;49472:40;;49570:19;49615:2;49602:10;:15;;;;:::i;:::-;49592:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49570:48;;49631:18;49652:5;;;;;;;;;;;;;;;;;49631:26;;49721:1;49714:5;49710:13;49766:2;49758:6;49754:15;49817:1;49785:777;49840:3;49837:1;49834:10;49785:777;;;49895:1;49892;49888:9;49883:14;;49953:8;49948:1;49942:4;49938:12;49932:19;49928:34;50033:4;50025:5;50021:2;50017:14;50013:25;50003:8;49999:40;49993:47;50072:3;50069:1;50065:11;50058:18;;50163:4;50154;50146:5;50142:2;50138:14;50134:25;50124:8;50120:40;50114:47;50110:58;50105:3;50101:68;50094:75;;50201:3;50198:1;50194:11;50187:18;;50291:4;50282;50274:5;50271:1;50267:13;50263:24;50253:8;50249:39;50243:46;50239:57;50234:3;50230:67;50223:74;;50329:3;50326:1;50322:11;50315:18;;50411:4;50402;50395:5;50391:16;50381:8;50377:31;50371:38;50367:49;50362:3;50358:59;50351:66;;50451:3;50446;50442:13;50435:20;;50493:3;50482:9;50475:22;50545:1;50534:9;50530:17;50517:30;;49864:698;;49785:777;;;49789:44;50594:1;50589:3;50585:11;50615:1;50610:84;;;;50713:1;50708:82;;;;50578:212;;50610:84;50671:6;50666:3;50662:16;50658:1;50647:9;50643:17;50636:43;50610:84;;50708:82;50769:4;50764:3;50760:14;50756:1;50745:9;50741:17;50734:41;50578:212;;50821:10;50813:6;50806:26;49679:1164;;50869:6;50855:21;;;;;;49277:1607;;;;:::o;23116:157::-;23201:4;23240:25;23225:40;;;:11;:40;;;;23218:47;;23116:157;;;:::o;45241:138::-;45301:7;45363:5;45346:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;45336:34;;;;;;45328:43;;45321:50;;45241:138;;;:::o;40016:589::-;40160:45;40187:4;40193:2;40197:7;40160:26;:45::i;:::-;40238:1;40222:18;;:4;:18;;;40218:187;;;40257:40;40289:7;40257:31;:40::i;:::-;40218:187;;;40327:2;40319:10;;:4;:10;;;40315:90;;40346:47;40379:4;40385:7;40346:32;:47::i;:::-;40315:90;40218:187;40433:1;40419:16;;:2;:16;;;40415:183;;;40452:45;40489:7;40452:36;:45::i;:::-;40415:183;;;40525:4;40519:10;;:2;:10;;;40515:83;;40546:40;40574:2;40578:7;40546:27;:40::i;:::-;40515:83;40415:183;40016:589;;;:::o;31728:321::-;31858:18;31864:2;31868:7;31858:5;:18::i;:::-;31909:54;31940:1;31944:2;31948:7;31957:5;31909:22;:54::i;:::-;31887:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31728:321;;;:::o;35128:803::-;35283:4;35304:15;:2;:13;;;:15::i;:::-;35300:624;;;35356:2;35340:36;;;35377:12;:10;:12::i;:::-;35391:4;35397:7;35406:5;35340:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35336:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35603:1;35586:6;:13;:18;35582:272;;;35629:60;;;;;;;;;;:::i;:::-;;;;;;;;35582:272;35804:6;35798:13;35789:6;35785:2;35781:15;35774:38;35336:533;35473:45;;;35463:55;;;:6;:55;;;;35456:62;;;;;35300:624;35908:4;35901:11;;35128:803;;;;;;;:::o;36503:126::-;;;;:::o;41328:164::-;41432:10;:17;;;;41405:15;:24;41421:7;41405:24;;;;;;;;;;;:44;;;;41460:10;41476:7;41460:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41328:164;:::o;42119:988::-;42385:22;42435:1;42410:22;42427:4;42410:16;:22::i;:::-;:26;;;;:::i;:::-;42385:51;;42447:18;42468:17;:26;42486:7;42468:26;;;;;;;;;;;;42447:47;;42615:14;42601:10;:28;42597:328;;42646:19;42668:12;:18;42681:4;42668:18;;;;;;;;;;;;;;;:34;42687:14;42668:34;;;;;;;;;;;;42646:56;;42752:11;42719:12;:18;42732:4;42719:18;;;;;;;;;;;;;;;:30;42738:10;42719:30;;;;;;;;;;;:44;;;;42869:10;42836:17;:30;42854:11;42836:30;;;;;;;;;;;:43;;;;42597:328;;43021:17;:26;43039:7;43021:26;;;;;;;;;;;43014:33;;;43065:12;:18;43078:4;43065:18;;;;;;;;;;;;;;;:34;43084:14;43065:34;;;;;;;;;;;43058:41;;;42119:988;;;;:::o;43402:1079::-;43655:22;43700:1;43680:10;:17;;;;:21;;;;:::i;:::-;43655:46;;43712:18;43733:15;:24;43749:7;43733:24;;;;;;;;;;;;43712:45;;44084:19;44106:10;44117:14;44106:26;;;;;;;;;;;;;;;;;;;;;;;;44084:48;;44170:11;44145:10;44156;44145:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44281:10;44250:15;:28;44266:11;44250:28;;;;;;;;;;;:41;;;;44422:15;:24;44438:7;44422:24;;;;;;;;;;;44415:31;;;44457:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43402:1079;;;;:::o;40906:221::-;40991:14;41008:20;41025:2;41008:16;:20::i;:::-;40991:37;;41066:7;41039:12;:16;41052:2;41039:16;;;;;;;;;;;;;;;:24;41056:6;41039:24;;;;;;;;;;;:34;;;;41113:6;41084:17;:26;41102:7;41084:26;;;;;;;;;;;:35;;;;40906:221;;;:::o;32385:382::-;32479:1;32465:16;;:2;:16;;;;32457:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32538:16;32546:7;32538;:16::i;:::-;32537:17;32529:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32600:45;32629:1;32633:2;32637:7;32600:20;:45::i;:::-;32675:1;32658:9;:13;32668:2;32658:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32706:2;32687:7;:16;32695:7;32687:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32751:7;32747:2;32726:33;;32743:1;32726:33;;;;;;;;;;;;32385:382;;:::o;15288:387::-;15348:4;15556:12;15623:7;15611:20;15603:28;;15666:1;15659:4;:8;15652:15;;;15288:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:143::-;558:5;589:6;583:13;574:22;;605:33;632:5;605:33;:::i;:::-;564:80;;;;:::o;650:133::-;693:5;731:6;718:20;709:29;;747:30;771:5;747:30;:::i;:::-;699:84;;;;:::o;789:137::-;834:5;872:6;859:20;850:29;;888:32;914:5;888:32;:::i;:::-;840:86;;;;:::o;932:141::-;988:5;1019:6;1013:13;1004:22;;1035:32;1061:5;1035:32;:::i;:::-;994:79;;;;:::o;1092:271::-;1147:5;1196:3;1189:4;1181:6;1177:17;1173:27;1163:2;;1214:1;1211;1204:12;1163:2;1254:6;1241:20;1279:78;1353:3;1345:6;1338:4;1330:6;1326:17;1279:78;:::i;:::-;1270:87;;1153:210;;;;;:::o;1369:139::-;1415:5;1453:6;1440:20;1431:29;;1469:33;1496:5;1469:33;:::i;:::-;1421:87;;;;:::o;1514:262::-;1573:6;1622:2;1610:9;1601:7;1597:23;1593:32;1590:2;;;1638:1;1635;1628:12;1590:2;1681:1;1706:53;1751:7;1742:6;1731:9;1727:22;1706:53;:::i;:::-;1696:63;;1652:117;1580:196;;;;:::o;1782:284::-;1852:6;1901:2;1889:9;1880:7;1876:23;1872:32;1869:2;;;1917:1;1914;1907:12;1869:2;1960:1;1985:64;2041:7;2032:6;2021:9;2017:22;1985:64;:::i;:::-;1975:74;;1931:128;1859:207;;;;:::o;2072:407::-;2140:6;2148;2197:2;2185:9;2176:7;2172:23;2168:32;2165:2;;;2213:1;2210;2203:12;2165:2;2256:1;2281:53;2326:7;2317:6;2306:9;2302:22;2281:53;:::i;:::-;2271:63;;2227:117;2383:2;2409:53;2454:7;2445:6;2434:9;2430:22;2409:53;:::i;:::-;2399:63;;2354:118;2155:324;;;;;:::o;2485:552::-;2562:6;2570;2578;2627:2;2615:9;2606:7;2602:23;2598:32;2595:2;;;2643:1;2640;2633:12;2595:2;2686:1;2711:53;2756:7;2747:6;2736:9;2732:22;2711:53;:::i;:::-;2701:63;;2657:117;2813:2;2839:53;2884:7;2875:6;2864:9;2860:22;2839:53;:::i;:::-;2829:63;;2784:118;2941:2;2967:53;3012:7;3003:6;2992:9;2988:22;2967:53;:::i;:::-;2957:63;;2912:118;2585:452;;;;;:::o;3043:809::-;3138:6;3146;3154;3162;3211:3;3199:9;3190:7;3186:23;3182:33;3179:2;;;3228:1;3225;3218:12;3179:2;3271:1;3296:53;3341:7;3332:6;3321:9;3317:22;3296:53;:::i;:::-;3286:63;;3242:117;3398:2;3424:53;3469:7;3460:6;3449:9;3445:22;3424:53;:::i;:::-;3414:63;;3369:118;3526:2;3552:53;3597:7;3588:6;3577:9;3573:22;3552:53;:::i;:::-;3542:63;;3497:118;3682:2;3671:9;3667:18;3654:32;3713:18;3705:6;3702:30;3699:2;;;3745:1;3742;3735:12;3699:2;3773:62;3827:7;3818:6;3807:9;3803:22;3773:62;:::i;:::-;3763:72;;3625:220;3169:683;;;;;;;:::o;3858:401::-;3923:6;3931;3980:2;3968:9;3959:7;3955:23;3951:32;3948:2;;;3996:1;3993;3986:12;3948:2;4039:1;4064:53;4109:7;4100:6;4089:9;4085:22;4064:53;:::i;:::-;4054:63;;4010:117;4166:2;4192:50;4234:7;4225:6;4214:9;4210:22;4192:50;:::i;:::-;4182:60;;4137:115;3938:321;;;;;:::o;4265:407::-;4333:6;4341;4390:2;4378:9;4369:7;4365:23;4361:32;4358:2;;;4406:1;4403;4396:12;4358:2;4449:1;4474:53;4519:7;4510:6;4499:9;4495:22;4474:53;:::i;:::-;4464:63;;4420:117;4576:2;4602:53;4647:7;4638:6;4627:9;4623:22;4602:53;:::i;:::-;4592:63;;4547:118;4348:324;;;;;:::o;4678:260::-;4736:6;4785:2;4773:9;4764:7;4760:23;4756:32;4753:2;;;4801:1;4798;4791:12;4753:2;4844:1;4869:52;4913:7;4904:6;4893:9;4889:22;4869:52;:::i;:::-;4859:62;;4815:116;4743:195;;;;:::o;4944:282::-;5013:6;5062:2;5050:9;5041:7;5037:23;5033:32;5030:2;;;5078:1;5075;5068:12;5030:2;5121:1;5146:63;5201:7;5192:6;5181:9;5177:22;5146:63;:::i;:::-;5136:73;;5092:127;5020:206;;;;:::o;5232:262::-;5291:6;5340:2;5328:9;5319:7;5315:23;5311:32;5308:2;;;5356:1;5353;5346:12;5308:2;5399:1;5424:53;5469:7;5460:6;5449:9;5445:22;5424:53;:::i;:::-;5414:63;;5370:117;5298:196;;;;:::o;5500:118::-;5587:24;5605:5;5587:24;:::i;:::-;5582:3;5575:37;5565:53;;:::o;5624:109::-;5705:21;5720:5;5705:21;:::i;:::-;5700:3;5693:34;5683:50;;:::o;5739:360::-;5825:3;5853:38;5885:5;5853:38;:::i;:::-;5907:70;5970:6;5965:3;5907:70;:::i;:::-;5900:77;;5986:52;6031:6;6026:3;6019:4;6012:5;6008:16;5986:52;:::i;:::-;6063:29;6085:6;6063:29;:::i;:::-;6058:3;6054:39;6047:46;;5829:270;;;;;:::o;6105:364::-;6193:3;6221:39;6254:5;6221:39;:::i;:::-;6276:71;6340:6;6335:3;6276:71;:::i;:::-;6269:78;;6356:52;6401:6;6396:3;6389:4;6382:5;6378:16;6356:52;:::i;:::-;6433:29;6455:6;6433:29;:::i;:::-;6428:3;6424:39;6417:46;;6197:272;;;;;:::o;6475:377::-;6581:3;6609:39;6642:5;6609:39;:::i;:::-;6664:89;6746:6;6741:3;6664:89;:::i;:::-;6657:96;;6762:52;6807:6;6802:3;6795:4;6788:5;6784:16;6762:52;:::i;:::-;6839:6;6834:3;6830:16;6823:23;;6585:267;;;;;:::o;6858:366::-;7000:3;7021:67;7085:2;7080:3;7021:67;:::i;:::-;7014:74;;7097:93;7186:3;7097:93;:::i;:::-;7215:2;7210:3;7206:12;7199:19;;7004:220;;;:::o;7230:366::-;7372:3;7393:67;7457:2;7452:3;7393:67;:::i;:::-;7386:74;;7469:93;7558:3;7469:93;:::i;:::-;7587:2;7582:3;7578:12;7571:19;;7376:220;;;:::o;7602:366::-;7744:3;7765:67;7829:2;7824:3;7765:67;:::i;:::-;7758:74;;7841:93;7930:3;7841:93;:::i;:::-;7959:2;7954:3;7950:12;7943:19;;7748:220;;;:::o;7974:366::-;8116:3;8137:67;8201:2;8196:3;8137:67;:::i;:::-;8130:74;;8213:93;8302:3;8213:93;:::i;:::-;8331:2;8326:3;8322:12;8315:19;;8120:220;;;:::o;8346:366::-;8488:3;8509:67;8573:2;8568:3;8509:67;:::i;:::-;8502:74;;8585:93;8674:3;8585:93;:::i;:::-;8703:2;8698:3;8694:12;8687:19;;8492:220;;;:::o;8718:366::-;8860:3;8881:67;8945:2;8940:3;8881:67;:::i;:::-;8874:74;;8957:93;9046:3;8957:93;:::i;:::-;9075:2;9070:3;9066:12;9059:19;;8864:220;;;:::o;9090:366::-;9232:3;9253:67;9317:2;9312:3;9253:67;:::i;:::-;9246:74;;9329:93;9418:3;9329:93;:::i;:::-;9447:2;9442:3;9438:12;9431:19;;9236:220;;;:::o;9462:402::-;9622:3;9643:85;9725:2;9720:3;9643:85;:::i;:::-;9636:92;;9737:93;9826:3;9737:93;:::i;:::-;9855:2;9850:3;9846:12;9839:19;;9626:238;;;:::o;9870:366::-;10012:3;10033:67;10097:2;10092:3;10033:67;:::i;:::-;10026:74;;10109:93;10198:3;10109:93;:::i;:::-;10227:2;10222:3;10218:12;10211:19;;10016:220;;;:::o;10242:366::-;10384:3;10405:67;10469:2;10464:3;10405:67;:::i;:::-;10398:74;;10481:93;10570:3;10481:93;:::i;:::-;10599:2;10594:3;10590:12;10583:19;;10388:220;;;:::o;10614:366::-;10756:3;10777:67;10841:2;10836:3;10777:67;:::i;:::-;10770:74;;10853:93;10942:3;10853:93;:::i;:::-;10971:2;10966:3;10962:12;10955:19;;10760:220;;;:::o;10986:366::-;11128:3;11149:67;11213:2;11208:3;11149:67;:::i;:::-;11142:74;;11225:93;11314:3;11225:93;:::i;:::-;11343:2;11338:3;11334:12;11327:19;;11132:220;;;:::o;11358:400::-;11518:3;11539:84;11621:1;11616:3;11539:84;:::i;:::-;11532:91;;11632:93;11721:3;11632:93;:::i;:::-;11750:1;11745:3;11741:11;11734:18;;11522:236;;;:::o;11764:366::-;11906:3;11927:67;11991:2;11986:3;11927:67;:::i;:::-;11920:74;;12003:93;12092:3;12003:93;:::i;:::-;12121:2;12116:3;12112:12;12105:19;;11910:220;;;:::o;12136:366::-;12278:3;12299:67;12363:2;12358:3;12299:67;:::i;:::-;12292:74;;12375:93;12464:3;12375:93;:::i;:::-;12493:2;12488:3;12484:12;12477:19;;12282:220;;;:::o;12508:366::-;12650:3;12671:67;12735:2;12730:3;12671:67;:::i;:::-;12664:74;;12747:93;12836:3;12747:93;:::i;:::-;12865:2;12860:3;12856:12;12849:19;;12654:220;;;:::o;12880:366::-;13022:3;13043:67;13107:2;13102:3;13043:67;:::i;:::-;13036:74;;13119:93;13208:3;13119:93;:::i;:::-;13237:2;13232:3;13228:12;13221:19;;13026:220;;;:::o;13252:366::-;13394:3;13415:67;13479:2;13474:3;13415:67;:::i;:::-;13408:74;;13491:93;13580:3;13491:93;:::i;:::-;13609:2;13604:3;13600:12;13593:19;;13398:220;;;:::o;13624:366::-;13766:3;13787:67;13851:2;13846:3;13787:67;:::i;:::-;13780:74;;13863:93;13952:3;13863:93;:::i;:::-;13981:2;13976:3;13972:12;13965:19;;13770:220;;;:::o;13996:402::-;14156:3;14177:85;14259:2;14254:3;14177:85;:::i;:::-;14170:92;;14271:93;14360:3;14271:93;:::i;:::-;14389:2;14384:3;14380:12;14373:19;;14160:238;;;:::o;14404:366::-;14546:3;14567:67;14631:2;14626:3;14567:67;:::i;:::-;14560:74;;14643:93;14732:3;14643:93;:::i;:::-;14761:2;14756:3;14752:12;14745:19;;14550:220;;;:::o;14776:404::-;14936:3;14957:86;15039:3;15034;14957:86;:::i;:::-;14950:93;;15052;15141:3;15052:93;:::i;:::-;15170:3;15165;15161:13;15154:20;;14940:240;;;:::o;15186:366::-;15328:3;15349:67;15413:2;15408:3;15349:67;:::i;:::-;15342:74;;15425:93;15514:3;15425:93;:::i;:::-;15543:2;15538:3;15534:12;15527:19;;15332:220;;;:::o;15558:400::-;15718:3;15739:84;15821:1;15816:3;15739:84;:::i;:::-;15732:91;;15832:93;15921:3;15832:93;:::i;:::-;15950:1;15945:3;15941:11;15934:18;;15722:236;;;:::o;15964:366::-;16106:3;16127:67;16191:2;16186:3;16127:67;:::i;:::-;16120:74;;16203:93;16292:3;16203:93;:::i;:::-;16321:2;16316:3;16312:12;16305:19;;16110:220;;;:::o;16336:118::-;16423:24;16441:5;16423:24;:::i;:::-;16418:3;16411:37;16401:53;;:::o;16460:275::-;16592:3;16614:95;16705:3;16696:6;16614:95;:::i;:::-;16607:102;;16726:3;16719:10;;16596:139;;;;:::o;16741:435::-;16921:3;16943:95;17034:3;17025:6;16943:95;:::i;:::-;16936:102;;17055:95;17146:3;17137:6;17055:95;:::i;:::-;17048:102;;17167:3;17160:10;;16925:251;;;;;:::o;17182:1235::-;17602:3;17624:95;17715:3;17706:6;17624:95;:::i;:::-;17617:102;;17736:95;17827:3;17818:6;17736:95;:::i;:::-;17729:102;;17848:95;17939:3;17930:6;17848:95;:::i;:::-;17841:102;;17960:95;18051:3;18042:6;17960:95;:::i;:::-;17953:102;;18072:95;18163:3;18154:6;18072:95;:::i;:::-;18065:102;;18184:95;18275:3;18266:6;18184:95;:::i;:::-;18177:102;;18296:95;18387:3;18378:6;18296:95;:::i;:::-;18289:102;;18408:3;18401:10;;17606:811;;;;;;;;;;:::o;18423:701::-;18704:3;18726:95;18817:3;18808:6;18726:95;:::i;:::-;18719:102;;18838:148;18982:3;18838:148;:::i;:::-;18831:155;;19003:95;19094:3;19085:6;19003:95;:::i;:::-;18996:102;;19115:3;19108:10;;18708:416;;;;;:::o;19130:1233::-;19613:3;19635:148;19779:3;19635:148;:::i;:::-;19628:155;;19800:95;19891:3;19882:6;19800:95;:::i;:::-;19793:102;;19912:148;20056:3;19912:148;:::i;:::-;19905:155;;20077:95;20168:3;20159:6;20077:95;:::i;:::-;20070:102;;20189:148;20333:3;20189:148;:::i;:::-;20182:155;;20354:3;20347:10;;19617:746;;;;;:::o;20369:541::-;20602:3;20624:148;20768:3;20624:148;:::i;:::-;20617:155;;20789:95;20880:3;20871:6;20789:95;:::i;:::-;20782:102;;20901:3;20894:10;;20606:304;;;;:::o;20916:222::-;21009:4;21047:2;21036:9;21032:18;21024:26;;21060:71;21128:1;21117:9;21113:17;21104:6;21060:71;:::i;:::-;21014:124;;;;:::o;21144:640::-;21339:4;21377:3;21366:9;21362:19;21354:27;;21391:71;21459:1;21448:9;21444:17;21435:6;21391:71;:::i;:::-;21472:72;21540:2;21529:9;21525:18;21516:6;21472:72;:::i;:::-;21554;21622:2;21611:9;21607:18;21598:6;21554:72;:::i;:::-;21673:9;21667:4;21663:20;21658:2;21647:9;21643:18;21636:48;21701:76;21772:4;21763:6;21701:76;:::i;:::-;21693:84;;21344:440;;;;;;;:::o;21790:210::-;21877:4;21915:2;21904:9;21900:18;21892:26;;21928:65;21990:1;21979:9;21975:17;21966:6;21928:65;:::i;:::-;21882:118;;;;:::o;22006:313::-;22119:4;22157:2;22146:9;22142:18;22134:26;;22206:9;22200:4;22196:20;22192:1;22181:9;22177:17;22170:47;22234:78;22307:4;22298:6;22234:78;:::i;:::-;22226:86;;22124:195;;;;:::o;22325:419::-;22491:4;22529:2;22518:9;22514:18;22506:26;;22578:9;22572:4;22568:20;22564:1;22553:9;22549:17;22542:47;22606:131;22732:4;22606:131;:::i;:::-;22598:139;;22496:248;;;:::o;22750:419::-;22916:4;22954:2;22943:9;22939:18;22931:26;;23003:9;22997:4;22993:20;22989:1;22978:9;22974:17;22967:47;23031:131;23157:4;23031:131;:::i;:::-;23023:139;;22921:248;;;:::o;23175:419::-;23341:4;23379:2;23368:9;23364:18;23356:26;;23428:9;23422:4;23418:20;23414:1;23403:9;23399:17;23392:47;23456:131;23582:4;23456:131;:::i;:::-;23448:139;;23346:248;;;:::o;23600:419::-;23766:4;23804:2;23793:9;23789:18;23781:26;;23853:9;23847:4;23843:20;23839:1;23828:9;23824:17;23817:47;23881:131;24007:4;23881:131;:::i;:::-;23873:139;;23771:248;;;:::o;24025:419::-;24191:4;24229:2;24218:9;24214:18;24206:26;;24278:9;24272:4;24268:20;24264:1;24253:9;24249:17;24242:47;24306:131;24432:4;24306:131;:::i;:::-;24298:139;;24196:248;;;:::o;24450:419::-;24616:4;24654:2;24643:9;24639:18;24631:26;;24703:9;24697:4;24693:20;24689:1;24678:9;24674:17;24667:47;24731:131;24857:4;24731:131;:::i;:::-;24723:139;;24621:248;;;:::o;24875:419::-;25041:4;25079:2;25068:9;25064:18;25056:26;;25128:9;25122:4;25118:20;25114:1;25103:9;25099:17;25092:47;25156:131;25282:4;25156:131;:::i;:::-;25148:139;;25046:248;;;:::o;25300:419::-;25466:4;25504:2;25493:9;25489:18;25481:26;;25553:9;25547:4;25543:20;25539:1;25528:9;25524:17;25517:47;25581:131;25707:4;25581:131;:::i;:::-;25573:139;;25471:248;;;:::o;25725:419::-;25891:4;25929:2;25918:9;25914:18;25906:26;;25978:9;25972:4;25968:20;25964:1;25953:9;25949:17;25942:47;26006:131;26132:4;26006:131;:::i;:::-;25998:139;;25896:248;;;:::o;26150:419::-;26316:4;26354:2;26343:9;26339:18;26331:26;;26403:9;26397:4;26393:20;26389:1;26378:9;26374:17;26367:47;26431:131;26557:4;26431:131;:::i;:::-;26423:139;;26321:248;;;:::o;26575:419::-;26741:4;26779:2;26768:9;26764:18;26756:26;;26828:9;26822:4;26818:20;26814:1;26803:9;26799:17;26792:47;26856:131;26982:4;26856:131;:::i;:::-;26848:139;;26746:248;;;:::o;27000:419::-;27166:4;27204:2;27193:9;27189:18;27181:26;;27253:9;27247:4;27243:20;27239:1;27228:9;27224:17;27217:47;27281:131;27407:4;27281:131;:::i;:::-;27273:139;;27171:248;;;:::o;27425:419::-;27591:4;27629:2;27618:9;27614:18;27606:26;;27678:9;27672:4;27668:20;27664:1;27653:9;27649:17;27642:47;27706:131;27832:4;27706:131;:::i;:::-;27698:139;;27596:248;;;:::o;27850:419::-;28016:4;28054:2;28043:9;28039:18;28031:26;;28103:9;28097:4;28093:20;28089:1;28078:9;28074:17;28067:47;28131:131;28257:4;28131:131;:::i;:::-;28123:139;;28021:248;;;:::o;28275:419::-;28441:4;28479:2;28468:9;28464:18;28456:26;;28528:9;28522:4;28518:20;28514:1;28503:9;28499:17;28492:47;28556:131;28682:4;28556:131;:::i;:::-;28548:139;;28446:248;;;:::o;28700:419::-;28866:4;28904:2;28893:9;28889:18;28881:26;;28953:9;28947:4;28943:20;28939:1;28928:9;28924:17;28917:47;28981:131;29107:4;28981:131;:::i;:::-;28973:139;;28871:248;;;:::o;29125:419::-;29291:4;29329:2;29318:9;29314:18;29306:26;;29378:9;29372:4;29368:20;29364:1;29353:9;29349:17;29342:47;29406:131;29532:4;29406:131;:::i;:::-;29398:139;;29296:248;;;:::o;29550:419::-;29716:4;29754:2;29743:9;29739:18;29731:26;;29803:9;29797:4;29793:20;29789:1;29778:9;29774:17;29767:47;29831:131;29957:4;29831:131;:::i;:::-;29823:139;;29721:248;;;:::o;29975:419::-;30141:4;30179:2;30168:9;30164:18;30156:26;;30228:9;30222:4;30218:20;30214:1;30203:9;30199:17;30192:47;30256:131;30382:4;30256:131;:::i;:::-;30248:139;;30146:248;;;:::o;30400:419::-;30566:4;30604:2;30593:9;30589:18;30581:26;;30653:9;30647:4;30643:20;30639:1;30628:9;30624:17;30617:47;30681:131;30807:4;30681:131;:::i;:::-;30673:139;;30571:248;;;:::o;30825:222::-;30918:4;30956:2;30945:9;30941:18;30933:26;;30969:71;31037:1;31026:9;31022:17;31013:6;30969:71;:::i;:::-;30923:124;;;;:::o;31053:129::-;31087:6;31114:20;;:::i;:::-;31104:30;;31143:33;31171:4;31163:6;31143:33;:::i;:::-;31094:88;;;:::o;31188:75::-;31221:6;31254:2;31248:9;31238:19;;31228:35;:::o;31269:307::-;31330:4;31420:18;31412:6;31409:30;31406:2;;;31442:18;;:::i;:::-;31406:2;31480:29;31502:6;31480:29;:::i;:::-;31472:37;;31564:4;31558;31554:15;31546:23;;31335:241;;;:::o;31582:98::-;31633:6;31667:5;31661:12;31651:22;;31640:40;;;:::o;31686:99::-;31738:6;31772:5;31766:12;31756:22;;31745:40;;;:::o;31791:168::-;31874:11;31908:6;31903:3;31896:19;31948:4;31943:3;31939:14;31924:29;;31886:73;;;;:::o;31965:169::-;32049:11;32083:6;32078:3;32071:19;32123:4;32118:3;32114:14;32099:29;;32061:73;;;;:::o;32140:148::-;32242:11;32279:3;32264:18;;32254:34;;;;:::o;32294:305::-;32334:3;32353:20;32371:1;32353:20;:::i;:::-;32348:25;;32387:20;32405:1;32387:20;:::i;:::-;32382:25;;32541:1;32473:66;32469:74;32466:1;32463:81;32460:2;;;32547:18;;:::i;:::-;32460:2;32591:1;32588;32584:9;32577:16;;32338:261;;;;:::o;32605:185::-;32645:1;32662:20;32680:1;32662:20;:::i;:::-;32657:25;;32696:20;32714:1;32696:20;:::i;:::-;32691:25;;32735:1;32725:2;;32740:18;;:::i;:::-;32725:2;32782:1;32779;32775:9;32770:14;;32647:143;;;;:::o;32796:348::-;32836:7;32859:20;32877:1;32859:20;:::i;:::-;32854:25;;32893:20;32911:1;32893:20;:::i;:::-;32888:25;;33081:1;33013:66;33009:74;33006:1;33003:81;32998:1;32991:9;32984:17;32980:105;32977:2;;;33088:18;;:::i;:::-;32977:2;33136:1;33133;33129:9;33118:20;;32844:300;;;;:::o;33150:191::-;33190:4;33210:20;33228:1;33210:20;:::i;:::-;33205:25;;33244:20;33262:1;33244:20;:::i;:::-;33239:25;;33283:1;33280;33277:8;33274:2;;;33288:18;;:::i;:::-;33274:2;33333:1;33330;33326:9;33318:17;;33195:146;;;;:::o;33347:96::-;33384:7;33413:24;33431:5;33413:24;:::i;:::-;33402:35;;33392:51;;;:::o;33449:90::-;33483:7;33526:5;33519:13;33512:21;33501:32;;33491:48;;;:::o;33545:149::-;33581:7;33621:66;33614:5;33610:78;33599:89;;33589:105;;;:::o;33700:126::-;33737:7;33777:42;33770:5;33766:54;33755:65;;33745:81;;;:::o;33832:77::-;33869:7;33898:5;33887:16;;33877:32;;;:::o;33915:154::-;33999:6;33994:3;33989;33976:30;34061:1;34052:6;34047:3;34043:16;34036:27;33966:103;;;:::o;34075:307::-;34143:1;34153:113;34167:6;34164:1;34161:13;34153:113;;;34252:1;34247:3;34243:11;34237:18;34233:1;34228:3;34224:11;34217:39;34189:2;34186:1;34182:10;34177:15;;34153:113;;;34284:6;34281:1;34278:13;34275:2;;;34364:1;34355:6;34350:3;34346:16;34339:27;34275:2;34124:258;;;;:::o;34388:320::-;34432:6;34469:1;34463:4;34459:12;34449:22;;34516:1;34510:4;34506:12;34537:18;34527:2;;34593:4;34585:6;34581:17;34571:27;;34527:2;34655;34647:6;34644:14;34624:18;34621:38;34618:2;;;34674:18;;:::i;:::-;34618:2;34439:269;;;;:::o;34714:281::-;34797:27;34819:4;34797:27;:::i;:::-;34789:6;34785:40;34927:6;34915:10;34912:22;34891:18;34879:10;34876:34;34873:62;34870:2;;;34938:18;;:::i;:::-;34870:2;34978:10;34974:2;34967:22;34757:238;;;:::o;35001:233::-;35040:3;35063:24;35081:5;35063:24;:::i;:::-;35054:33;;35109:66;35102:5;35099:77;35096:2;;;35179:18;;:::i;:::-;35096:2;35226:1;35219:5;35215:13;35208:20;;35044:190;;;:::o;35240:176::-;35272:1;35289:20;35307:1;35289:20;:::i;:::-;35284:25;;35323:20;35341:1;35323:20;:::i;:::-;35318:25;;35362:1;35352:2;;35367:18;;:::i;:::-;35352:2;35408:1;35405;35401:9;35396:14;;35274:142;;;;:::o;35422:180::-;35470:77;35467:1;35460:88;35567:4;35564:1;35557:15;35591:4;35588:1;35581:15;35608:180;35656:77;35653:1;35646:88;35753:4;35750:1;35743:15;35777:4;35774:1;35767:15;35794:180;35842:77;35839:1;35832:88;35939:4;35936:1;35929:15;35963:4;35960:1;35953:15;35980:180;36028:77;36025:1;36018:88;36125:4;36122:1;36115:15;36149:4;36146:1;36139:15;36166:102;36207:6;36258:2;36254:7;36249:2;36242:5;36238:14;36234:28;36224:38;;36214:54;;;:::o;36274:230::-;36414:34;36410:1;36402:6;36398:14;36391:58;36483:13;36478:2;36470:6;36466:15;36459:38;36380:124;:::o;36510:237::-;36650:34;36646:1;36638:6;36634:14;36627:58;36719:20;36714:2;36706:6;36702:15;36695:45;36616:131;:::o;36753:225::-;36893:34;36889:1;36881:6;36877:14;36870:58;36962:8;36957:2;36949:6;36945:15;36938:33;36859:119;:::o;36984:178::-;37124:30;37120:1;37112:6;37108:14;37101:54;37090:72;:::o;37168:164::-;37308:16;37304:1;37296:6;37292:14;37285:40;37274:58;:::o;37338:223::-;37478:34;37474:1;37466:6;37462:14;37455:58;37547:6;37542:2;37534:6;37530:15;37523:31;37444:117;:::o;37567:175::-;37707:27;37703:1;37695:6;37691:14;37684:51;37673:69;:::o;37748:214::-;37888:66;37884:1;37876:6;37872:14;37865:90;37854:108;:::o;37968:231::-;38108:34;38104:1;38096:6;38092:14;38085:58;38177:14;38172:2;38164:6;38160:15;38153:39;38074:125;:::o;38205:243::-;38345:34;38341:1;38333:6;38329:14;38322:58;38414:26;38409:2;38401:6;38397:15;38390:51;38311:137;:::o;38454:229::-;38594:34;38590:1;38582:6;38578:14;38571:58;38663:12;38658:2;38650:6;38646:15;38639:37;38560:123;:::o;38689:228::-;38829:34;38825:1;38817:6;38813:14;38806:58;38898:11;38893:2;38885:6;38881:15;38874:36;38795:122;:::o;38923:214::-;39063:66;39059:1;39051:6;39047:14;39040:90;39029:108;:::o;39143:182::-;39283:34;39279:1;39271:6;39267:14;39260:58;39249:76;:::o;39331:231::-;39471:34;39467:1;39459:6;39455:14;39448:58;39540:14;39535:2;39527:6;39523:15;39516:39;39437:125;:::o;39568:182::-;39708:34;39704:1;39696:6;39692:14;39685:58;39674:76;:::o;39756:166::-;39896:18;39892:1;39884:6;39880:14;39873:42;39862:60;:::o;39928:228::-;40068:34;40064:1;40056:6;40052:14;40045:58;40137:11;40132:2;40124:6;40120:15;40113:36;40034:122;:::o;40162:220::-;40302:34;40298:1;40290:6;40286:14;40279:58;40371:3;40366:2;40358:6;40354:15;40347:28;40268:114;:::o;40388:179::-;40528:31;40524:1;40516:6;40512:14;40505:55;40494:73;:::o;40573:236::-;40713:34;40709:1;40701:6;40697:14;40690:58;40782:19;40777:2;40769:6;40765:15;40758:44;40679:130;:::o;40815:582::-;40955:66;40951:1;40943:6;40939:14;40932:90;41056:34;41051:2;41043:6;41039:15;41032:59;41125:34;41120:2;41112:6;41108:15;41101:59;41194:34;41189:2;41181:6;41177:15;41170:59;41264:66;41258:3;41250:6;41246:16;41239:92;41366:23;41360:3;41352:6;41348:16;41341:49;40921:476;:::o;41403:231::-;41543:34;41539:1;41531:6;41527:14;41520:58;41612:14;41607:2;41599:6;41595:15;41588:39;41509:125;:::o;41640:152::-;41780:4;41776:1;41768:6;41764:14;41757:28;41746:46;:::o;41798:181::-;41938:33;41934:1;41926:6;41922:14;41915:57;41904:75;:::o;41985:122::-;42058:24;42076:5;42058:24;:::i;:::-;42051:5;42048:35;42038:2;;42097:1;42094;42087:12;42038:2;42028:79;:::o;42113:116::-;42183:21;42198:5;42183:21;:::i;:::-;42176:5;42173:32;42163:2;;42219:1;42216;42209:12;42163:2;42153:76;:::o;42235:120::-;42307:23;42324:5;42307:23;:::i;:::-;42300:5;42297:34;42287:2;;42345:1;42342;42335:12;42287:2;42277:78;:::o;42361:122::-;42434:24;42452:5;42434:24;:::i;:::-;42427:5;42424:35;42414:2;;42473:1;42470;42463:12;42414:2;42404:79;:::o

Swarm Source

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