ETH Price: $2,521.92 (-5.11%)

ArtAI (ARTAI)
 

Overview

TokenID

7054

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

For Second Generation Eponyms: https://opensea.io/collection/eponym-gen2 Eponym is a state-of-the-art generative algorithm that produces fine, abstract art, in under 1 minute, using an innovative text-to-image generator. Any word or phrase, can be transformed into a beautiful 1/1 art piece, forever etched onto the Ethereum blockchain as the visual representation of your phrase. The program was developed over the last 2 years by the world’s best generative art engineers.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ArtAI

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-11
*/

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


pragma solidity ^0.8.0;


/**
 * @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 Emitted when `owner` pays to purchase a specific image id.
     */
    event Purchase(address indexed owner, string imageId, string name);

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

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;

contract Ownable {
    address _owner;

    constructor() {
        _owner = msg.sender;
    }

    modifier onlyOwner() {
        require(
            msg.sender == _owner,
            "Only the contract owner may call this function"
        );
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0));
        _owner = newOwner;
    }

    function withdrawBalance() external onlyOwner {
        payable(_owner).transfer(address(this).balance);
    }

    function withdrawAmountTo(address _recipient, uint256 _amount)
        external
        onlyOwner
    {
        require(address(this).balance >= _amount);
        payable(_recipient).transfer(_amount);
    }
}

pragma solidity ^0.8.0;









contract ArtAI is Context, ERC165, IERC721, IERC721Metadata, Ownable {
    /**
     * @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}.
     */

    using Address for address;
    using Strings for uint256;

    // Max total supply
    uint256 public maxSupply = 10000;
    // Max painting name length
    uint256 private _maxImageNameLength = 100;
    // purchase price
    uint256 private _purchasePrice = 80000000000000000 wei;

    // baseURI for Metadata
    string private _metadataURI = "https://art-ai.com/api/tokenInfo/";

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Token supply
    uint256 private _tokenSupply = 0;

    // 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;

    // Mapping from image name to its purchased status
    mapping(string => bool) private _namePurchases;

    // Mapping from image name to its token id
    mapping(string => uint256) private _nameToTokenId;

    // Token Id to image hash
    mapping(uint256 => string) private _tokenImageHashes;

    // Token Id to image name
    mapping(uint256 => string) private _tokenIdToName;

    // Token Id to image id
    mapping(uint256 => string) private _tokenIdToImageId;

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

    function tokenIdForName(string memory _paintingName)
        external
        view
        returns (uint256)
    {
        return _nameToTokenId[_paintingName];
    }

    function setBaseURI(string memory newURI) external onlyOwner {
        _metadataURI = newURI;
    }

    function setPurchasePrice(uint256 newPrice) external onlyOwner {
        _purchasePrice = newPrice;
    }

    function totalSupply() external view returns (uint256) {
        return maxSupply;
    }

    function tokenSupply() external view returns (uint256) {
        return _tokenSupply;
    }

    function purchasePrice() external view returns (uint256) {
        return _purchasePrice;
    }

    function _mint(
        address _owner,
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId
    ) private returns (uint256) {
        uint256 _newTokenId = _tokenSupply + 1;

        _safeMint(_owner, _newTokenId);
        _namePurchases[_imageName] = true;
        _nameToTokenId[_imageName] = _newTokenId;
        _tokenImageHashes[_newTokenId] = _imageHash;
        _tokenIdToName[_newTokenId] = _imageName;
        _tokenIdToImageId[_newTokenId] = _imageId;

        return _newTokenId;
    }

    function mint(
        string memory _imageHash,
        string memory _imageName,
        string memory _imageId
    ) external payable returns (uint256) {
        require(_tokenSupply < maxSupply, "Maximum supply has been reached");
        require(
            bytes(_imageName).length <= _maxImageNameLength,
            "Name of the image is too long"
        );
        require(msg.value >= _purchasePrice, "Insufficient message value");
        require(
            !_namePurchases[_imageName],
            "That named piece has already been purchased"
        );
        uint256 _newTokenId = _mint(
            msg.sender,
            _imageName,
            _imageHash,
            _imageId
        );

        return _newTokenId;
    }

    function ownerMint(
        address _owner,
        string memory _imageHash,
        string memory _imageName,
        string memory _imageId
    ) external onlyOwner returns (uint256) {
        require(_tokenSupply < maxSupply, "Maximum supply has been reached");
        require(
            bytes(_imageName).length <= _maxImageNameLength,
            "Name of the image is too long"
        );
        require(
            !_namePurchases[_imageName],
            "That named piece has already been purchased"
        );
        uint256 _newTokenId = _mint(_owner, _imageName, _imageHash, _imageId);

        return _newTokenId;
    }

    function tokenInfo(uint256 _tokenId)
        external
        view
        returns (
            string memory _imageHash,
            string memory _imageName,
            string memory _imageId
        )
    {
        return (
            _tokenImageHashes[_tokenId],
            _tokenIdToName[_tokenId],
            _tokenIdToImageId[_tokenId]
        );
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ArtAI.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 = ArtAI.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;
        _tokenSupply += 1;

        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 = ArtAI.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(
            ArtAI.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(ArtAI.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.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 {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"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":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"imageId","type":"string"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"Purchase","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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_imageHash","type":"string"},{"internalType":"string","name":"_imageName","type":"string"},{"internalType":"string","name":"_imageId","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_imageHash","type":"string"},{"internalType":"string","name":"_imageName","type":"string"},{"internalType":"string","name":"_imageId","type":"string"}],"name":"ownerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"purchasePrice","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":"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":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPurchasePrice","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":"string","name":"_paintingName","type":"string"}],"name":"tokenIdForName","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenInfo","outputs":[{"internalType":"string","name":"_imageHash","type":"string"},{"internalType":"string","name":"_imageName","type":"string"},{"internalType":"string","name":"_imageId","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSupply","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"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawAmountTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600155606460025567011c37937e08000060035560405180606001604052806021815260200162003ff860219139600490805190602001906200004c929190620000ff565b5060006007553480156200005f57600080fd5b50604051620040193803806200401983398181016040528101906200008591906200034c565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160059080519060200190620000dd929190620000ff565b508060069080519060200190620000f6929190620000ff565b50505062000436565b8280546200010d9062000400565b90600052602060002090601f0160209004810192826200013157600085556200017d565b82601f106200014c57805160ff19168380011785556200017d565b828001600101855582156200017d579182015b828111156200017c5782518255916020019190600101906200015f565b5b5090506200018c919062000190565b5090565b5b80821115620001ab57600081600090555060010162000191565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200021882620001cd565b810181811067ffffffffffffffff821117156200023a5762000239620001de565b5b80604052505050565b60006200024f620001af565b90506200025d82826200020d565b919050565b600067ffffffffffffffff82111562000280576200027f620001de565b5b6200028b82620001cd565b9050602081019050919050565b60005b83811015620002b85780820151818401526020810190506200029b565b83811115620002c8576000848401525b50505050565b6000620002e5620002df8462000262565b62000243565b905082815260208101848484011115620003045762000303620001c8565b5b6200031184828562000298565b509392505050565b600082601f830112620003315762000330620001c3565b5b815162000343848260208601620002ce565b91505092915050565b60008060408385031215620003665762000365620001b9565b5b600083015167ffffffffffffffff811115620003875762000386620001be565b5b620003958582860162000319565b925050602083015167ffffffffffffffff811115620003b957620003b8620001be565b5b620003c78582860162000319565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200041957607f821691505b6020821081141562000430576200042f620003d1565b5b50919050565b613bb280620004466000396000f3fe60806040526004361061019c5760003560e01c80638da5cb5b116100ec578063d645ddf61161008a578063e465f1f511610064578063e465f1f5146105e1578063e985e9c51461060a578063f2d1f35214610647578063f2fde38b146106845761019c565b8063d645ddf61461055d578063d72966621461058d578063defd6c5f146105b65761019c565b8063b88d4fde116100c6578063b88d4fde1461048d578063c87b56dd146104b6578063cc33c875146104f3578063d5abeb01146105325761019c565b80638da5cb5b1461040e57806395d89b4114610439578063a22cb465146104645761019c565b806342842e0e116101595780636352211e116101335780636352211e1461032c57806370a08231146103695780637824407f146103a65780638460dd08146103d15761019c565b806342842e0e146102c357806355f804b3146102ec5780635fd8c710146103155761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c3919061261e565b6106ad565b6040516101d59190612666565b60405180910390f35b3480156101ea57600080fd5b506101f361078f565b604051610200919061271a565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612772565b610821565b60405161023d91906127e0565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612827565b6108a6565b005b34801561027b57600080fd5b506102846109be565b6040516102919190612876565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612891565b6109c8565b005b3480156102cf57600080fd5b506102ea60048036038101906102e59190612891565b610a28565b005b3480156102f857600080fd5b50610313600480360381019061030e9190612a19565b610a48565b005b34801561032157600080fd5b5061032a610af0565b005b34801561033857600080fd5b50610353600480360381019061034e9190612772565b610be7565b60405161036091906127e0565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190612a62565b610c99565b60405161039d9190612876565b60405180910390f35b3480156103b257600080fd5b506103bb610d51565b6040516103c89190612876565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190612a19565b610d5b565b6040516104059190612876565b60405180910390f35b34801561041a57600080fd5b50610423610d83565b60405161043091906127e0565b60405180910390f35b34801561044557600080fd5b5061044e610dac565b60405161045b919061271a565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190612abb565b610e3e565b005b34801561049957600080fd5b506104b460048036038101906104af9190612b9c565b610fbf565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612772565b611021565b6040516104ea919061271a565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190612772565b6110c8565b60405161052993929190612c1f565b60405180910390f35b34801561053e57600080fd5b506105476112b7565b6040516105549190612876565b60405180910390f35b61057760048036038101906105729190612c6b565b6112bd565b6040516105849190612876565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af9190612772565b611417565b005b3480156105c257600080fd5b506105cb6114af565b6040516105d89190612876565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190612827565b6114b9565b005b34801561061657600080fd5b50610631600480360381019061062c9190612d12565b61159f565b60405161063e9190612666565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190612d52565b611633565b60405161067b9190612876565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190612a62565b6117d8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107885750610787826118e3565b5b9050919050565b60606005805461079e90612e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546107ca90612e3c565b80156108175780601f106107ec57610100808354040283529160200191610817565b820191906000526020600020905b8154815290600101906020018083116107fa57829003601f168201915b5050505050905090565b600061082c8261194d565b61086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086290612ee0565b60405180910390fd5b600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b182610be7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091990612f72565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109416119b9565b73ffffffffffffffffffffffffffffffffffffffff161480610970575061096f8161096a6119b9565b61159f565b5b6109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613004565b60405180910390fd5b6109b983836119c1565b505050565b6000600154905090565b6109d96109d36119b9565b82611a7a565b610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90613096565b60405180910390fd5b610a23838383611b58565b505050565b610a4383838360405180602001604052806000815250610fbf565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90613128565b60405180910390fd5b8060049080519060200190610aec92919061250f565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590613128565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610be4573d6000803e3d6000fd5b50565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c87906131ba565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d019061324c565b60405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600754905090565b6000600d82604051610d6d91906132a8565b9081526020016040518091039020549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060068054610dbb90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610de790612e3c565b8015610e345780601f10610e0957610100808354040283529160200191610e34565b820191906000526020600020905b815481529060010190602001808311610e1757829003601f168201915b5050505050905090565b610e466119b9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab9061330b565b60405180910390fd5b80600b6000610ec16119b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f6e6119b9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fb39190612666565b60405180910390a35050565b610fd0610fca6119b9565b83611a7a565b61100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690613096565b60405180910390fd5b61101b84848484611db4565b50505050565b606061102c8261194d565b61106b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110629061339d565b60405180910390fd5b6000611075611e10565b9050600081511161109557604051806020016040528060008152506110c0565b8061109f84611ea2565b6040516020016110b09291906133bd565b6040516020818303038152906040525b915050919050565b6060806060600e6000858152602001908152602001600020600f60008681526020019081526020016000206010600087815260200190815260200160002082805461111290612e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461113e90612e3c565b801561118b5780601f106111605761010080835404028352916020019161118b565b820191906000526020600020905b81548152906001019060200180831161116e57829003601f168201915b5050505050925081805461119e90612e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546111ca90612e3c565b80156112175780601f106111ec57610100808354040283529160200191611217565b820191906000526020600020905b8154815290600101906020018083116111fa57829003601f168201915b5050505050915080805461122a90612e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461125690612e3c565b80156112a35780601f10611278576101008083540402835291602001916112a3565b820191906000526020600020905b81548152906001019060200180831161128657829003601f168201915b505050505090509250925092509193909250565b60015481565b600060015460075410611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc9061342d565b60405180910390fd5b6002548351111561134b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290613499565b60405180910390fd5b600354341015611390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138790613505565b60405180910390fd5b600c836040516113a091906132a8565b908152602001604051809103902060009054906101000a900460ff16156113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f390613597565b60405180910390fd5b600061140a33858786612003565b9050809150509392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90613128565b60405180910390fd5b8060038190555050565b6000600354905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90613128565b60405180910390fd5b8047101561155457600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561159a573d6000803e3d6000fd5b505050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb90613128565b60405180910390fd5b6001546007541061170a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117019061342d565b60405180910390fd5b60025483511115611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790613499565b60405180910390fd5b600c8360405161176091906132a8565b908152602001604051809103902060009054906101000a900460ff16156117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b390613597565b60405180910390fd5b60006117ca86858786612003565b905080915050949350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d90613128565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a057600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a3483610be7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a858261194d565b611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90613629565b60405180910390fd5b6000611acf83610be7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3e57508373ffffffffffffffffffffffffffffffffffffffff16611b2684610821565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b4f5750611b4e818561159f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b7882610be7565b73ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc5906136bb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c359061374d565b60405180910390fd5b611c498383836120ff565b611c546000826119c1565b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca4919061379c565b925050819055506001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfb91906137d0565b92505081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611dbf848484611b58565b611dcb84848484612104565b611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190613898565b60405180910390fd5b50505050565b606060048054611e1f90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4b90612e3c565b8015611e985780601f10611e6d57610100808354040283529160200191611e98565b820191906000526020600020905b815481529060010190602001808311611e7b57829003601f168201915b5050505050905090565b60606000821415611eea576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ffe565b600082905060005b60008214611f1c578080611f05906138b8565b915050600a82611f159190613930565b9150611ef2565b60008167ffffffffffffffff811115611f3857611f376128ee565b5b6040519080825280601f01601f191660200182016040528015611f6a5781602001600182028036833780820191505090505b5090505b60008514611ff757600182611f83919061379c565b9150600a85611f929190613961565b6030611f9e91906137d0565b60f81b818381518110611fb457611fb3613992565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ff09190613930565b9450611f6e565b8093505050505b919050565b600080600160075461201591906137d0565b9050612021868261229b565b6001600c8660405161203391906132a8565b908152602001604051809103902060006101000a81548160ff02191690831515021790555080600d8660405161206991906132a8565b90815260200160405180910390208190555083600e600083815260200190815260200160002090805190602001906120a292919061250f565b5084600f600083815260200190815260200160002090805190602001906120ca92919061250f565b50826010600083815260200190815260200160002090805190602001906120f292919061250f565b5080915050949350505050565b505050565b60006121258473ffffffffffffffffffffffffffffffffffffffff166122b9565b1561228e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261214e6119b9565b8786866040518563ffffffff1660e01b81526004016121709493929190613a16565b602060405180830381600087803b15801561218a57600080fd5b505af19250505080156121bb57506040513d601f19601f820116820180604052508101906121b89190613a77565b60015b61223e573d80600081146121eb576040519150601f19603f3d011682016040523d82523d6000602084013e6121f0565b606091505b50600081511415612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90613898565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612293565b600190505b949350505050565b6122b58282604051806020016040528060008152506122cc565b5050565b600080823b905060008111915050919050565b6122d68383612327565b6122e36000848484612104565b612322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231990613898565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e90613af0565b60405180910390fd5b6123a08161194d565b156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d790613b5c565b60405180910390fd5b6123ec600083836120ff565b6001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461243c91906137d0565b92505081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008282546124a891906137d0565b92505081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461251b90612e3c565b90600052602060002090601f01602090048101928261253d5760008555612584565b82601f1061255657805160ff1916838001178555612584565b82800160010185558215612584579182015b82811115612583578251825591602001919060010190612568565b5b5090506125919190612595565b5090565b5b808211156125ae576000816000905550600101612596565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125fb816125c6565b811461260657600080fd5b50565b600081359050612618816125f2565b92915050565b600060208284031215612634576126336125bc565b5b600061264284828501612609565b91505092915050565b60008115159050919050565b6126608161264b565b82525050565b600060208201905061267b6000830184612657565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126bb5780820151818401526020810190506126a0565b838111156126ca576000848401525b50505050565b6000601f19601f8301169050919050565b60006126ec82612681565b6126f6818561268c565b935061270681856020860161269d565b61270f816126d0565b840191505092915050565b6000602082019050818103600083015261273481846126e1565b905092915050565b6000819050919050565b61274f8161273c565b811461275a57600080fd5b50565b60008135905061276c81612746565b92915050565b600060208284031215612788576127876125bc565b5b60006127968482850161275d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127ca8261279f565b9050919050565b6127da816127bf565b82525050565b60006020820190506127f560008301846127d1565b92915050565b612804816127bf565b811461280f57600080fd5b50565b600081359050612821816127fb565b92915050565b6000806040838503121561283e5761283d6125bc565b5b600061284c85828601612812565b925050602061285d8582860161275d565b9150509250929050565b6128708161273c565b82525050565b600060208201905061288b6000830184612867565b92915050565b6000806000606084860312156128aa576128a96125bc565b5b60006128b886828701612812565b93505060206128c986828701612812565b92505060406128da8682870161275d565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612926826126d0565b810181811067ffffffffffffffff82111715612945576129446128ee565b5b80604052505050565b60006129586125b2565b9050612964828261291d565b919050565b600067ffffffffffffffff821115612984576129836128ee565b5b61298d826126d0565b9050602081019050919050565b82818337600083830152505050565b60006129bc6129b784612969565b61294e565b9050828152602081018484840111156129d8576129d76128e9565b5b6129e384828561299a565b509392505050565b600082601f830112612a00576129ff6128e4565b5b8135612a108482602086016129a9565b91505092915050565b600060208284031215612a2f57612a2e6125bc565b5b600082013567ffffffffffffffff811115612a4d57612a4c6125c1565b5b612a59848285016129eb565b91505092915050565b600060208284031215612a7857612a776125bc565b5b6000612a8684828501612812565b91505092915050565b612a988161264b565b8114612aa357600080fd5b50565b600081359050612ab581612a8f565b92915050565b60008060408385031215612ad257612ad16125bc565b5b6000612ae085828601612812565b9250506020612af185828601612aa6565b9150509250929050565b600067ffffffffffffffff821115612b1657612b156128ee565b5b612b1f826126d0565b9050602081019050919050565b6000612b3f612b3a84612afb565b61294e565b905082815260208101848484011115612b5b57612b5a6128e9565b5b612b6684828561299a565b509392505050565b600082601f830112612b8357612b826128e4565b5b8135612b93848260208601612b2c565b91505092915050565b60008060008060808587031215612bb657612bb56125bc565b5b6000612bc487828801612812565b9450506020612bd587828801612812565b9350506040612be68782880161275d565b925050606085013567ffffffffffffffff811115612c0757612c066125c1565b5b612c1387828801612b6e565b91505092959194509250565b60006060820190508181036000830152612c3981866126e1565b90508181036020830152612c4d81856126e1565b90508181036040830152612c6181846126e1565b9050949350505050565b600080600060608486031215612c8457612c836125bc565b5b600084013567ffffffffffffffff811115612ca257612ca16125c1565b5b612cae868287016129eb565b935050602084013567ffffffffffffffff811115612ccf57612cce6125c1565b5b612cdb868287016129eb565b925050604084013567ffffffffffffffff811115612cfc57612cfb6125c1565b5b612d08868287016129eb565b9150509250925092565b60008060408385031215612d2957612d286125bc565b5b6000612d3785828601612812565b9250506020612d4885828601612812565b9150509250929050565b60008060008060808587031215612d6c57612d6b6125bc565b5b6000612d7a87828801612812565b945050602085013567ffffffffffffffff811115612d9b57612d9a6125c1565b5b612da7878288016129eb565b935050604085013567ffffffffffffffff811115612dc857612dc76125c1565b5b612dd4878288016129eb565b925050606085013567ffffffffffffffff811115612df557612df46125c1565b5b612e01878288016129eb565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e5457607f821691505b60208210811415612e6857612e67612e0d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612eca602c8361268c565b9150612ed582612e6e565b604082019050919050565b60006020820190508181036000830152612ef981612ebd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f5c60218361268c565b9150612f6782612f00565b604082019050919050565b60006020820190508181036000830152612f8b81612f4f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612fee60388361268c565b9150612ff982612f92565b604082019050919050565b6000602082019050818103600083015261301d81612fe1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061308060318361268c565b915061308b82613024565b604082019050919050565b600060208201905081810360008301526130af81613073565b9050919050565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d61792063616c6c60008201527f20746869732066756e6374696f6e000000000000000000000000000000000000602082015250565b6000613112602e8361268c565b915061311d826130b6565b604082019050919050565b6000602082019050818103600083015261314181613105565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006131a460298361268c565b91506131af82613148565b604082019050919050565b600060208201905081810360008301526131d381613197565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613236602a8361268c565b9150613241826131da565b604082019050919050565b6000602082019050818103600083015261326581613229565b9050919050565b600081905092915050565b600061328282612681565b61328c818561326c565b935061329c81856020860161269d565b80840191505092915050565b60006132b48284613277565b915081905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132f560198361268c565b9150613300826132bf565b602082019050919050565b60006020820190508181036000830152613324816132e8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613387602f8361268c565b91506133928261332b565b604082019050919050565b600060208201905081810360008301526133b68161337a565b9050919050565b60006133c98285613277565b91506133d58284613277565b91508190509392505050565b7f4d6178696d756d20737570706c7920686173206265656e207265616368656400600082015250565b6000613417601f8361268c565b9150613422826133e1565b602082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f4e616d65206f662074686520696d61676520697320746f6f206c6f6e67000000600082015250565b6000613483601d8361268c565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f496e73756666696369656e74206d6573736167652076616c7565000000000000600082015250565b60006134ef601a8361268c565b91506134fa826134b9565b602082019050919050565b6000602082019050818103600083015261351e816134e2565b9050919050565b7f54686174206e616d65642070696563652068617320616c72656164792062656560008201527f6e20707572636861736564000000000000000000000000000000000000000000602082015250565b6000613581602b8361268c565b915061358c82613525565b604082019050919050565b600060208201905081810360008301526135b081613574565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613613602c8361268c565b915061361e826135b7565b604082019050919050565b6000602082019050818103600083015261364281613606565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006136a560298361268c565b91506136b082613649565b604082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061373760248361268c565b9150613742826136db565b604082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137a78261273c565b91506137b28361273c565b9250828210156137c5576137c461376d565b5b828203905092915050565b60006137db8261273c565b91506137e68361273c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561381b5761381a61376d565b5b828201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061388260328361268c565b915061388d82613826565b604082019050919050565b600060208201905081810360008301526138b181613875565b9050919050565b60006138c38261273c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138f6576138f561376d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061393b8261273c565b91506139468361273c565b92508261395657613955613901565b5b828204905092915050565b600061396c8261273c565b91506139778361273c565b92508261398757613986613901565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006139e8826139c1565b6139f281856139cc565b9350613a0281856020860161269d565b613a0b816126d0565b840191505092915050565b6000608082019050613a2b60008301876127d1565b613a3860208301866127d1565b613a456040830185612867565b8181036060830152613a5781846139dd565b905095945050505050565b600081519050613a71816125f2565b92915050565b600060208284031215613a8d57613a8c6125bc565b5b6000613a9b84828501613a62565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613ada60208361268c565b9150613ae582613aa4565b602082019050919050565b60006020820190508181036000830152613b0981613acd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613b46601c8361268c565b9150613b5182613b10565b602082019050919050565b60006020820190508181036000830152613b7581613b39565b905091905056fea264697066735822122089e93c66d7c2f1ccf9a88aa51225682ef2e02e2e96f5e15cceb7142822a40b8d64736f6c6343000809003368747470733a2f2f6172742d61692e636f6d2f6170692f746f6b656e496e666f2f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005417274414900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054152544149000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061019c5760003560e01c80638da5cb5b116100ec578063d645ddf61161008a578063e465f1f511610064578063e465f1f5146105e1578063e985e9c51461060a578063f2d1f35214610647578063f2fde38b146106845761019c565b8063d645ddf61461055d578063d72966621461058d578063defd6c5f146105b65761019c565b8063b88d4fde116100c6578063b88d4fde1461048d578063c87b56dd146104b6578063cc33c875146104f3578063d5abeb01146105325761019c565b80638da5cb5b1461040e57806395d89b4114610439578063a22cb465146104645761019c565b806342842e0e116101595780636352211e116101335780636352211e1461032c57806370a08231146103695780637824407f146103a65780638460dd08146103d15761019c565b806342842e0e146102c357806355f804b3146102ec5780635fd8c710146103155761019c565b806301ffc9a7146101a157806306fdde03146101de578063081812fc14610209578063095ea7b31461024657806318160ddd1461026f57806323b872dd1461029a575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c3919061261e565b6106ad565b6040516101d59190612666565b60405180910390f35b3480156101ea57600080fd5b506101f361078f565b604051610200919061271a565b60405180910390f35b34801561021557600080fd5b50610230600480360381019061022b9190612772565b610821565b60405161023d91906127e0565b60405180910390f35b34801561025257600080fd5b5061026d60048036038101906102689190612827565b6108a6565b005b34801561027b57600080fd5b506102846109be565b6040516102919190612876565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc9190612891565b6109c8565b005b3480156102cf57600080fd5b506102ea60048036038101906102e59190612891565b610a28565b005b3480156102f857600080fd5b50610313600480360381019061030e9190612a19565b610a48565b005b34801561032157600080fd5b5061032a610af0565b005b34801561033857600080fd5b50610353600480360381019061034e9190612772565b610be7565b60405161036091906127e0565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190612a62565b610c99565b60405161039d9190612876565b60405180910390f35b3480156103b257600080fd5b506103bb610d51565b6040516103c89190612876565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190612a19565b610d5b565b6040516104059190612876565b60405180910390f35b34801561041a57600080fd5b50610423610d83565b60405161043091906127e0565b60405180910390f35b34801561044557600080fd5b5061044e610dac565b60405161045b919061271a565b60405180910390f35b34801561047057600080fd5b5061048b60048036038101906104869190612abb565b610e3e565b005b34801561049957600080fd5b506104b460048036038101906104af9190612b9c565b610fbf565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190612772565b611021565b6040516104ea919061271a565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190612772565b6110c8565b60405161052993929190612c1f565b60405180910390f35b34801561053e57600080fd5b506105476112b7565b6040516105549190612876565b60405180910390f35b61057760048036038101906105729190612c6b565b6112bd565b6040516105849190612876565b60405180910390f35b34801561059957600080fd5b506105b460048036038101906105af9190612772565b611417565b005b3480156105c257600080fd5b506105cb6114af565b6040516105d89190612876565b60405180910390f35b3480156105ed57600080fd5b5061060860048036038101906106039190612827565b6114b9565b005b34801561061657600080fd5b50610631600480360381019061062c9190612d12565b61159f565b60405161063e9190612666565b60405180910390f35b34801561065357600080fd5b5061066e60048036038101906106699190612d52565b611633565b60405161067b9190612876565b60405180910390f35b34801561069057600080fd5b506106ab60048036038101906106a69190612a62565b6117d8565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107885750610787826118e3565b5b9050919050565b60606005805461079e90612e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546107ca90612e3c565b80156108175780601f106107ec57610100808354040283529160200191610817565b820191906000526020600020905b8154815290600101906020018083116107fa57829003601f168201915b5050505050905090565b600061082c8261194d565b61086b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086290612ee0565b60405180910390fd5b600a600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b182610be7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091990612f72565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109416119b9565b73ffffffffffffffffffffffffffffffffffffffff161480610970575061096f8161096a6119b9565b61159f565b5b6109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613004565b60405180910390fd5b6109b983836119c1565b505050565b6000600154905090565b6109d96109d36119b9565b82611a7a565b610a18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0f90613096565b60405180910390fd5b610a23838383611b58565b505050565b610a4383838360405180602001604052806000815250610fbf565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90613128565b60405180910390fd5b8060049080519060200190610aec92919061250f565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590613128565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610be4573d6000803e3d6000fd5b50565b6000806008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c87906131ba565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d019061324c565b60405180910390fd5b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600754905090565b6000600d82604051610d6d91906132a8565b9081526020016040518091039020549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060068054610dbb90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054610de790612e3c565b8015610e345780601f10610e0957610100808354040283529160200191610e34565b820191906000526020600020905b815481529060010190602001808311610e1757829003601f168201915b5050505050905090565b610e466119b9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eab9061330b565b60405180910390fd5b80600b6000610ec16119b9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f6e6119b9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fb39190612666565b60405180910390a35050565b610fd0610fca6119b9565b83611a7a565b61100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100690613096565b60405180910390fd5b61101b84848484611db4565b50505050565b606061102c8261194d565b61106b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110629061339d565b60405180910390fd5b6000611075611e10565b9050600081511161109557604051806020016040528060008152506110c0565b8061109f84611ea2565b6040516020016110b09291906133bd565b6040516020818303038152906040525b915050919050565b6060806060600e6000858152602001908152602001600020600f60008681526020019081526020016000206010600087815260200190815260200160002082805461111290612e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461113e90612e3c565b801561118b5780601f106111605761010080835404028352916020019161118b565b820191906000526020600020905b81548152906001019060200180831161116e57829003601f168201915b5050505050925081805461119e90612e3c565b80601f01602080910402602001604051908101604052809291908181526020018280546111ca90612e3c565b80156112175780601f106111ec57610100808354040283529160200191611217565b820191906000526020600020905b8154815290600101906020018083116111fa57829003601f168201915b5050505050915080805461122a90612e3c565b80601f016020809104026020016040519081016040528092919081815260200182805461125690612e3c565b80156112a35780601f10611278576101008083540402835291602001916112a3565b820191906000526020600020905b81548152906001019060200180831161128657829003601f168201915b505050505090509250925092509193909250565b60015481565b600060015460075410611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc9061342d565b60405180910390fd5b6002548351111561134b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134290613499565b60405180910390fd5b600354341015611390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138790613505565b60405180910390fd5b600c836040516113a091906132a8565b908152602001604051809103902060009054906101000a900460ff16156113fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f390613597565b60405180910390fd5b600061140a33858786612003565b9050809150509392505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c90613128565b60405180910390fd5b8060038190555050565b6000600354905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e90613128565b60405180910390fd5b8047101561155457600080fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561159a573d6000803e3d6000fd5b505050565b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb90613128565b60405180910390fd5b6001546007541061170a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117019061342d565b60405180910390fd5b60025483511115611750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174790613499565b60405180910390fd5b600c8360405161176091906132a8565b908152602001604051809103902060009054906101000a900460ff16156117bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b390613597565b60405180910390fd5b60006117ca86858786612003565b905080915050949350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d90613128565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a057600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b81600a600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a3483610be7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a858261194d565b611ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abb90613629565b60405180910390fd5b6000611acf83610be7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3e57508373ffffffffffffffffffffffffffffffffffffffff16611b2684610821565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b4f5750611b4e818561159f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b7882610be7565b73ffffffffffffffffffffffffffffffffffffffff1614611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc5906136bb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c359061374d565b60405180910390fd5b611c498383836120ff565b611c546000826119c1565b6001600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ca4919061379c565b925050819055506001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cfb91906137d0565b92505081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611dbf848484611b58565b611dcb84848484612104565b611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190613898565b60405180910390fd5b50505050565b606060048054611e1f90612e3c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4b90612e3c565b8015611e985780601f10611e6d57610100808354040283529160200191611e98565b820191906000526020600020905b815481529060010190602001808311611e7b57829003601f168201915b5050505050905090565b60606000821415611eea576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ffe565b600082905060005b60008214611f1c578080611f05906138b8565b915050600a82611f159190613930565b9150611ef2565b60008167ffffffffffffffff811115611f3857611f376128ee565b5b6040519080825280601f01601f191660200182016040528015611f6a5781602001600182028036833780820191505090505b5090505b60008514611ff757600182611f83919061379c565b9150600a85611f929190613961565b6030611f9e91906137d0565b60f81b818381518110611fb457611fb3613992565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ff09190613930565b9450611f6e565b8093505050505b919050565b600080600160075461201591906137d0565b9050612021868261229b565b6001600c8660405161203391906132a8565b908152602001604051809103902060006101000a81548160ff02191690831515021790555080600d8660405161206991906132a8565b90815260200160405180910390208190555083600e600083815260200190815260200160002090805190602001906120a292919061250f565b5084600f600083815260200190815260200160002090805190602001906120ca92919061250f565b50826010600083815260200190815260200160002090805190602001906120f292919061250f565b5080915050949350505050565b505050565b60006121258473ffffffffffffffffffffffffffffffffffffffff166122b9565b1561228e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261214e6119b9565b8786866040518563ffffffff1660e01b81526004016121709493929190613a16565b602060405180830381600087803b15801561218a57600080fd5b505af19250505080156121bb57506040513d601f19601f820116820180604052508101906121b89190613a77565b60015b61223e573d80600081146121eb576040519150601f19603f3d011682016040523d82523d6000602084013e6121f0565b606091505b50600081511415612236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222d90613898565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612293565b600190505b949350505050565b6122b58282604051806020016040528060008152506122cc565b5050565b600080823b905060008111915050919050565b6122d68383612327565b6122e36000848484612104565b612322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231990613898565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e90613af0565b60405180910390fd5b6123a08161194d565b156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d790613b5c565b60405180910390fd5b6123ec600083836120ff565b6001600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461243c91906137d0565b92505081905550816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008282546124a891906137d0565b92505081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461251b90612e3c565b90600052602060002090601f01602090048101928261253d5760008555612584565b82601f1061255657805160ff1916838001178555612584565b82800160010185558215612584579182015b82811115612583578251825591602001919060010190612568565b5b5090506125919190612595565b5090565b5b808211156125ae576000816000905550600101612596565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125fb816125c6565b811461260657600080fd5b50565b600081359050612618816125f2565b92915050565b600060208284031215612634576126336125bc565b5b600061264284828501612609565b91505092915050565b60008115159050919050565b6126608161264b565b82525050565b600060208201905061267b6000830184612657565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156126bb5780820151818401526020810190506126a0565b838111156126ca576000848401525b50505050565b6000601f19601f8301169050919050565b60006126ec82612681565b6126f6818561268c565b935061270681856020860161269d565b61270f816126d0565b840191505092915050565b6000602082019050818103600083015261273481846126e1565b905092915050565b6000819050919050565b61274f8161273c565b811461275a57600080fd5b50565b60008135905061276c81612746565b92915050565b600060208284031215612788576127876125bc565b5b60006127968482850161275d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127ca8261279f565b9050919050565b6127da816127bf565b82525050565b60006020820190506127f560008301846127d1565b92915050565b612804816127bf565b811461280f57600080fd5b50565b600081359050612821816127fb565b92915050565b6000806040838503121561283e5761283d6125bc565b5b600061284c85828601612812565b925050602061285d8582860161275d565b9150509250929050565b6128708161273c565b82525050565b600060208201905061288b6000830184612867565b92915050565b6000806000606084860312156128aa576128a96125bc565b5b60006128b886828701612812565b93505060206128c986828701612812565b92505060406128da8682870161275d565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612926826126d0565b810181811067ffffffffffffffff82111715612945576129446128ee565b5b80604052505050565b60006129586125b2565b9050612964828261291d565b919050565b600067ffffffffffffffff821115612984576129836128ee565b5b61298d826126d0565b9050602081019050919050565b82818337600083830152505050565b60006129bc6129b784612969565b61294e565b9050828152602081018484840111156129d8576129d76128e9565b5b6129e384828561299a565b509392505050565b600082601f830112612a00576129ff6128e4565b5b8135612a108482602086016129a9565b91505092915050565b600060208284031215612a2f57612a2e6125bc565b5b600082013567ffffffffffffffff811115612a4d57612a4c6125c1565b5b612a59848285016129eb565b91505092915050565b600060208284031215612a7857612a776125bc565b5b6000612a8684828501612812565b91505092915050565b612a988161264b565b8114612aa357600080fd5b50565b600081359050612ab581612a8f565b92915050565b60008060408385031215612ad257612ad16125bc565b5b6000612ae085828601612812565b9250506020612af185828601612aa6565b9150509250929050565b600067ffffffffffffffff821115612b1657612b156128ee565b5b612b1f826126d0565b9050602081019050919050565b6000612b3f612b3a84612afb565b61294e565b905082815260208101848484011115612b5b57612b5a6128e9565b5b612b6684828561299a565b509392505050565b600082601f830112612b8357612b826128e4565b5b8135612b93848260208601612b2c565b91505092915050565b60008060008060808587031215612bb657612bb56125bc565b5b6000612bc487828801612812565b9450506020612bd587828801612812565b9350506040612be68782880161275d565b925050606085013567ffffffffffffffff811115612c0757612c066125c1565b5b612c1387828801612b6e565b91505092959194509250565b60006060820190508181036000830152612c3981866126e1565b90508181036020830152612c4d81856126e1565b90508181036040830152612c6181846126e1565b9050949350505050565b600080600060608486031215612c8457612c836125bc565b5b600084013567ffffffffffffffff811115612ca257612ca16125c1565b5b612cae868287016129eb565b935050602084013567ffffffffffffffff811115612ccf57612cce6125c1565b5b612cdb868287016129eb565b925050604084013567ffffffffffffffff811115612cfc57612cfb6125c1565b5b612d08868287016129eb565b9150509250925092565b60008060408385031215612d2957612d286125bc565b5b6000612d3785828601612812565b9250506020612d4885828601612812565b9150509250929050565b60008060008060808587031215612d6c57612d6b6125bc565b5b6000612d7a87828801612812565b945050602085013567ffffffffffffffff811115612d9b57612d9a6125c1565b5b612da7878288016129eb565b935050604085013567ffffffffffffffff811115612dc857612dc76125c1565b5b612dd4878288016129eb565b925050606085013567ffffffffffffffff811115612df557612df46125c1565b5b612e01878288016129eb565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e5457607f821691505b60208210811415612e6857612e67612e0d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612eca602c8361268c565b9150612ed582612e6e565b604082019050919050565b60006020820190508181036000830152612ef981612ebd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612f5c60218361268c565b9150612f6782612f00565b604082019050919050565b60006020820190508181036000830152612f8b81612f4f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612fee60388361268c565b9150612ff982612f92565b604082019050919050565b6000602082019050818103600083015261301d81612fe1565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061308060318361268c565b915061308b82613024565b604082019050919050565b600060208201905081810360008301526130af81613073565b9050919050565b7f4f6e6c792074686520636f6e7472616374206f776e6572206d61792063616c6c60008201527f20746869732066756e6374696f6e000000000000000000000000000000000000602082015250565b6000613112602e8361268c565b915061311d826130b6565b604082019050919050565b6000602082019050818103600083015261314181613105565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006131a460298361268c565b91506131af82613148565b604082019050919050565b600060208201905081810360008301526131d381613197565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613236602a8361268c565b9150613241826131da565b604082019050919050565b6000602082019050818103600083015261326581613229565b9050919050565b600081905092915050565b600061328282612681565b61328c818561326c565b935061329c81856020860161269d565b80840191505092915050565b60006132b48284613277565b915081905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132f560198361268c565b9150613300826132bf565b602082019050919050565b60006020820190508181036000830152613324816132e8565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613387602f8361268c565b91506133928261332b565b604082019050919050565b600060208201905081810360008301526133b68161337a565b9050919050565b60006133c98285613277565b91506133d58284613277565b91508190509392505050565b7f4d6178696d756d20737570706c7920686173206265656e207265616368656400600082015250565b6000613417601f8361268c565b9150613422826133e1565b602082019050919050565b600060208201905081810360008301526134468161340a565b9050919050565b7f4e616d65206f662074686520696d61676520697320746f6f206c6f6e67000000600082015250565b6000613483601d8361268c565b915061348e8261344d565b602082019050919050565b600060208201905081810360008301526134b281613476565b9050919050565b7f496e73756666696369656e74206d6573736167652076616c7565000000000000600082015250565b60006134ef601a8361268c565b91506134fa826134b9565b602082019050919050565b6000602082019050818103600083015261351e816134e2565b9050919050565b7f54686174206e616d65642070696563652068617320616c72656164792062656560008201527f6e20707572636861736564000000000000000000000000000000000000000000602082015250565b6000613581602b8361268c565b915061358c82613525565b604082019050919050565b600060208201905081810360008301526135b081613574565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613613602c8361268c565b915061361e826135b7565b604082019050919050565b6000602082019050818103600083015261364281613606565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006136a560298361268c565b91506136b082613649565b604082019050919050565b600060208201905081810360008301526136d481613698565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061373760248361268c565b9150613742826136db565b604082019050919050565b600060208201905081810360008301526137668161372a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137a78261273c565b91506137b28361273c565b9250828210156137c5576137c461376d565b5b828203905092915050565b60006137db8261273c565b91506137e68361273c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561381b5761381a61376d565b5b828201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061388260328361268c565b915061388d82613826565b604082019050919050565b600060208201905081810360008301526138b181613875565b9050919050565b60006138c38261273c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138f6576138f561376d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061393b8261273c565b91506139468361273c565b92508261395657613955613901565b5b828204905092915050565b600061396c8261273c565b91506139778361273c565b92508261398757613986613901565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006139e8826139c1565b6139f281856139cc565b9350613a0281856020860161269d565b613a0b816126d0565b840191505092915050565b6000608082019050613a2b60008301876127d1565b613a3860208301866127d1565b613a456040830185612867565b8181036060830152613a5781846139dd565b905095945050505050565b600081519050613a71816125f2565b92915050565b600060208284031215613a8d57613a8c6125bc565b5b6000613a9b84828501613a62565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613ada60208361268c565b9150613ae582613aa4565b602082019050919050565b60006020820190508181036000830152613b0981613acd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613b46601c8361268c565b9150613b5182613b10565b602082019050919050565b60006020820190508181036000830152613b7581613b39565b905091905056fea264697066735822122089e93c66d7c2f1ccf9a88aa51225682ef2e02e2e96f5e15cceb7142822a40b8d64736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005417274414900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054152544149000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): ArtAI
Arg [1] : symbol_ (string): ARTAI

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [3] : 4172744149000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 4152544149000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

20586:18356:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25830:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26999:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28701:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28225:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23067:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29760:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30207:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22843:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20203:112;;;;;;;;;;;;;:::i;:::-;;26606:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26249:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23165:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22663:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19958:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27168:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29081:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30463:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27343:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25380:378;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;21027:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23938:769;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22952:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23266:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20323:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29479:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24715:657;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20053:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25830:355;25977:4;26034:25;26019:40;;;:11;:40;;;;:105;;;;26091:33;26076:48;;;:11;:48;;;;26019:105;:158;;;;26141:36;26165:11;26141:23;:36::i;:::-;26019:158;25999:178;;25830:355;;;:::o;26999:100::-;27053:13;27086:5;27079:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26999:100;:::o;28701:308::-;28822:7;28869:16;28877:7;28869;:16::i;:::-;28847:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28977:15;:24;28993:7;28977:24;;;;;;;;;;;;;;;;;;;;;28970:31;;28701:308;;;:::o;28225:410::-;28306:13;28322:22;28336:7;28322:13;:22::i;:::-;28306:38;;28369:5;28363:11;;:2;:11;;;;28355:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28463:5;28447:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28472:37;28489:5;28496:12;:10;:12::i;:::-;28472:16;:37::i;:::-;28447:62;28425:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;28606:21;28615:2;28619:7;28606:8;:21::i;:::-;28295:340;28225:410;;:::o;23067:90::-;23113:7;23140:9;;23133:16;;23067:90;:::o;29760:376::-;29969:41;29988:12;:10;:12::i;:::-;30002:7;29969:18;:41::i;:::-;29947:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30100:28;30110:4;30116:2;30120:7;30100:9;:28::i;:::-;29760:376;;;:::o;30207:185::-;30345:39;30362:4;30368:2;30372:7;30345:39;;;;;;;;;;;;:16;:39::i;:::-;30207:185;;;:::o;22843:101::-;19850:6;;;;;;;;;;19836:20;;:10;:20;;;19814:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;22930:6:::1;22915:12;:21;;;;;;;;;;;;:::i;:::-;;22843:101:::0;:::o;20203:112::-;19850:6;;;;;;;;;;19836:20;;:10;:20;;;19814:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;20268:6:::1;::::0;::::1;;;;;;;;20260:24;;:47;20285:21;20260:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;20203:112::o:0;26606:326::-;26723:7;26748:13;26764:7;:16;26772:7;26764:16;;;;;;;;;;;;;;;;;;;;;26748:32;;26830:1;26813:19;;:5;:19;;;;26791:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26919:5;26912:12;;;26606:326;;;:::o;26249:295::-;26366:7;26430:1;26413:19;;:5;:19;;;;26391:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26520:9;:16;26530:5;26520:16;;;;;;;;;;;;;;;;26513:23;;26249:295;;;:::o;23165:93::-;23211:7;23238:12;;23231:19;;23165:93;:::o;22663:172::-;22766:7;22798:14;22813:13;22798:29;;;;;;:::i;:::-;;;;;;;;;;;;;;22791:36;;22663:172;;;:::o;19958:87::-;20004:7;20031:6;;;;;;;;;;;20024:13;;19958:87;:::o;27168:104::-;27224:13;27257:7;27250:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27168:104;:::o;29081:327::-;29228:12;:10;:12::i;:::-;29216:24;;:8;:24;;;;29208:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29328:8;29283:18;:32;29302:12;:10;:12::i;:::-;29283:32;;;;;;;;;;;;;;;:42;29316:8;29283:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29381:8;29352:48;;29367:12;:10;:12::i;:::-;29352:48;;;29391:8;29352:48;;;;;;:::i;:::-;;;;;;;;29081:327;;:::o;30463:365::-;30652:41;30671:12;:10;:12::i;:::-;30685:7;30652:18;:41::i;:::-;30630:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30781:39;30795:4;30801:2;30805:7;30814:5;30781:13;:39::i;:::-;30463:365;;;;:::o;27343:468::-;27461:13;27514:16;27522:7;27514;:16::i;:::-;27492:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;27618:21;27642:10;:8;:10::i;:::-;27618:34;;27707:1;27689:7;27683:21;:25;:120;;;;;;;;;;;;;;;;;27752:7;27761:18;:7;:16;:18::i;:::-;27735:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27683:120;27663:140;;;27343:468;;;:::o;25380:378::-;25481:24;25520;25559:22;25631:17;:27;25649:8;25631:27;;;;;;;;;;;25673:14;:24;25688:8;25673:24;;;;;;;;;;;25712:17;:27;25730:8;25712:27;;;;;;;;;;;25609:141;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25380:378;;;;;:::o;21027:32::-;;;;:::o;23938:769::-;24088:7;24131:9;;24116:12;;:24;24108:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24237:19;;24215:10;24209:24;:47;;24187:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;24345:14;;24332:9;:27;;24324:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24424:14;24439:10;24424:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24423:27;24401:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;24532:19;24554:114;24574:10;24599;24624;24649:8;24554:5;:114::i;:::-;24532:136;;24688:11;24681:18;;;23938:769;;;;;:::o;22952:107::-;19850:6;;;;;;;;;;19836:20;;:10;:20;;;19814:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;23043:8:::1;23026:14;:25;;;;22952:107:::0;:::o;23266:97::-;23314:7;23341:14;;23334:21;;23266:97;:::o;20323:213::-;19850:6;;;;;;;;;;19836:20;;:10;:20;;;19814:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;20472:7:::1;20447:21;:32;;20439:41;;;::::0;::::1;;20499:10;20491:28;;:37;20520:7;20491:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;20323:213:::0;;:::o;29479:214::-;29621:4;29650:18;:25;29669:5;29650:25;;;;;;;;;;;;;;;:35;29676:8;29650:35;;;;;;;;;;;;;;;;;;;;;;;;;29643:42;;29479:214;;;;:::o;24715:657::-;24897:7;19850:6;;;;;;;;;;;19836:20;;:10;:20;;;19814:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;24940:9:::1;;24925:12;;:24;24917:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25046:19;;25024:10;25018:24;:47;;24996:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;25156:14;25171:10;25156:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25155:27;25133:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;25264:19;25286:47;25292:6;25300:10;25312;25324:8;25286:5;:47::i;:::-;25264:69;;25353:11;25346:18;;;24715:657:::0;;;;;;:::o;20053:142::-;19850:6;;;;;;;;;;19836:20;;:10;:20;;;19814:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;20156:1:::1;20136:22;;:8;:22;;;;20128:31;;;::::0;::::1;;20179:8;20170:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;20053:142:::0;:::o;19434:207::-;19564:4;19608:25;19593:40;;;:11;:40;;;;19586:47;;19434:207;;;:::o;32375:127::-;32440:4;32492:1;32464:30;;:7;:16;32472:7;32464:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32457:37;;32375:127;;;:::o;16449:98::-;16502:7;16529:10;16522:17;;16449:98;:::o;36523:173::-;36625:2;36598:15;:24;36614:7;36598:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36680:7;36676:2;36643:45;;36652:22;36666:7;36652:13;:22::i;:::-;36643:45;;;;;;;;;;;;36523:173;;:::o;32669:451::-;32798:4;32842:16;32850:7;32842;:16::i;:::-;32820:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32941:13;32957:22;32971:7;32957:13;:22::i;:::-;32941:38;;33009:5;32998:16;;:7;:16;;;:64;;;;33055:7;33031:31;;:20;33043:7;33031:11;:20::i;:::-;:31;;;32998:64;:113;;;;33079:32;33096:5;33103:7;33079:16;:32::i;:::-;32998:113;32990:122;;;32669:451;;;;:::o;35791:614::-;35963:4;35937:30;;:22;35951:7;35937:13;:22::i;:::-;:30;;;35915:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;36069:1;36055:16;;:2;:16;;;;36047:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36125:39;36146:4;36152:2;36156:7;36125:20;:39::i;:::-;36229:29;36246:1;36250:7;36229:8;:29::i;:::-;36290:1;36271:9;:15;36281:4;36271:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36319:1;36302:9;:13;36312:2;36302:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36350:2;36331:7;:16;36339:7;36331:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36389:7;36385:2;36370:27;;36379:4;36370:27;;;;;;;;;;;;35791:614;;;:::o;31710:352::-;31867:28;31877:4;31883:2;31887:7;31867:9;:28::i;:::-;31928:48;31951:4;31957:2;31961:7;31970:5;31928:22;:48::i;:::-;31906:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;31710:352;;;;:::o;28059:104::-;28110:13;28143:12;28136:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28059:104;:::o;16916:723::-;16972:13;17202:1;17193:5;:10;17189:53;;;17220:10;;;;;;;;;;;;;;;;;;;;;17189:53;17252:12;17267:5;17252:20;;17283:14;17308:78;17323:1;17315:4;:9;17308:78;;17341:8;;;;;:::i;:::-;;;;17372:2;17364:10;;;;;:::i;:::-;;;17308:78;;;17396:19;17428:6;17418:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17396:39;;17446:154;17462:1;17453:5;:10;17446:154;;17490:1;17480:11;;;;;:::i;:::-;;;17557:2;17549:5;:10;;;;:::i;:::-;17536:2;:24;;;;:::i;:::-;17523:39;;17506:6;17513;17506:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17586:2;17577:11;;;;;:::i;:::-;;;17446:154;;;17624:6;17610:21;;;;;16916:723;;;;:::o;23371:559::-;23538:7;23558:19;23595:1;23580:12;;:16;;;;:::i;:::-;23558:38;;23609:30;23619:6;23627:11;23609:9;:30::i;:::-;23679:4;23650:14;23665:10;23650:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;23723:11;23694:14;23709:10;23694:26;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;;23778:10;23745:17;:30;23763:11;23745:30;;;;;;;;;;;:43;;;;;;;;;;;;:::i;:::-;;23829:10;23799:14;:27;23814:11;23799:27;;;;;;;;;;;:40;;;;;;;;;;;;:::i;:::-;;23883:8;23850:17;:30;23868:11;23850:30;;;;;;;;;;;:41;;;;;;;;;;;;:::i;:::-;;23911:11;23904:18;;;23371:559;;;;;;:::o;38813:126::-;;;;:::o;37261:980::-;37416:4;37437:15;:2;:13;;;:15::i;:::-;37433:801;;;37506:2;37490:36;;;37549:12;:10;:12::i;:::-;37584:4;37611:7;37641:5;37490:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37469:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37865:1;37848:6;:13;:18;37844:320;;;37891:108;;;;;;;;;;:::i;:::-;;;;;;;;37844:320;38114:6;38108:13;38099:6;38095:2;38091:15;38084:38;37469:710;37739:41;;;37729:51;;;:6;:51;;;;37722:58;;;;;37433:801;38218:4;38211:11;;37261:980;;;;;;;:::o;33462:110::-;33538:26;33548:2;33552:7;33538:26;;;;;;;;;;;;:9;:26::i;:::-;33462:110;;:::o;8082:387::-;8142:4;8350:12;8417:7;8405:20;8397:28;;8460:1;8453:4;:8;8446:15;;;8082:387;;;:::o;33799:321::-;33929:18;33935:2;33939:7;33929:5;:18::i;:::-;33980:54;34011:1;34015:2;34019:7;34028:5;33980:22;:54::i;:::-;33958:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33799:321;;;:::o;34456:410::-;34550:1;34536:16;;:2;:16;;;;34528:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34609:16;34617:7;34609;:16::i;:::-;34608:17;34600:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34671:45;34700:1;34704:2;34708:7;34671:20;:45::i;:::-;34746:1;34729:9;:13;34739:2;34729:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34777:2;34758:7;:16;34766:7;34758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34806:1;34790:12;;:17;;;;;;;:::i;:::-;;;;;;;;34850:7;34846:2;34825:33;;34842:1;34825:33;;;;;;;;;;;;34456:410;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:180;6209:77;6206:1;6199:88;6306:4;6303:1;6296:15;6330:4;6327:1;6320:15;6347:281;6430:27;6452:4;6430:27;:::i;:::-;6422:6;6418:40;6560:6;6548:10;6545:22;6524:18;6512:10;6509:34;6506:62;6503:88;;;6571:18;;:::i;:::-;6503:88;6611:10;6607:2;6600:22;6390:238;6347:281;;:::o;6634:129::-;6668:6;6695:20;;:::i;:::-;6685:30;;6724:33;6752:4;6744:6;6724:33;:::i;:::-;6634:129;;;:::o;6769:308::-;6831:4;6921:18;6913:6;6910:30;6907:56;;;6943:18;;:::i;:::-;6907:56;6981:29;7003:6;6981:29;:::i;:::-;6973:37;;7065:4;7059;7055:15;7047:23;;6769:308;;;:::o;7083:154::-;7167:6;7162:3;7157;7144:30;7229:1;7220:6;7215:3;7211:16;7204:27;7083:154;;;:::o;7243:412::-;7321:5;7346:66;7362:49;7404:6;7362:49;:::i;:::-;7346:66;:::i;:::-;7337:75;;7435:6;7428:5;7421:21;7473:4;7466:5;7462:16;7511:3;7502:6;7497:3;7493:16;7490:25;7487:112;;;7518:79;;:::i;:::-;7487:112;7608:41;7642:6;7637:3;7632;7608:41;:::i;:::-;7327:328;7243:412;;;;;:::o;7675:340::-;7731:5;7780:3;7773:4;7765:6;7761:17;7757:27;7747:122;;7788:79;;:::i;:::-;7747:122;7905:6;7892:20;7930:79;8005:3;7997:6;7990:4;7982:6;7978:17;7930:79;:::i;:::-;7921:88;;7737:278;7675:340;;;;:::o;8021:509::-;8090:6;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8293:1;8282:9;8278:17;8265:31;8323:18;8315:6;8312:30;8309:117;;;8345:79;;:::i;:::-;8309:117;8450:63;8505:7;8496:6;8485:9;8481:22;8450:63;:::i;:::-;8440:73;;8236:287;8021:509;;;;:::o;8536:329::-;8595:6;8644:2;8632:9;8623:7;8619:23;8615:32;8612:119;;;8650:79;;:::i;:::-;8612:119;8770:1;8795:53;8840:7;8831:6;8820:9;8816:22;8795:53;:::i;:::-;8785:63;;8741:117;8536:329;;;;:::o;8871:116::-;8941:21;8956:5;8941:21;:::i;:::-;8934:5;8931:32;8921:60;;8977:1;8974;8967:12;8921:60;8871:116;:::o;8993:133::-;9036:5;9074:6;9061:20;9052:29;;9090:30;9114:5;9090:30;:::i;:::-;8993:133;;;;:::o;9132:468::-;9197:6;9205;9254:2;9242:9;9233:7;9229:23;9225:32;9222:119;;;9260:79;;:::i;:::-;9222:119;9380:1;9405:53;9450:7;9441:6;9430:9;9426:22;9405:53;:::i;:::-;9395:63;;9351:117;9507:2;9533:50;9575:7;9566:6;9555:9;9551:22;9533:50;:::i;:::-;9523:60;;9478:115;9132:468;;;;;:::o;9606:307::-;9667:4;9757:18;9749:6;9746:30;9743:56;;;9779:18;;:::i;:::-;9743:56;9817:29;9839:6;9817:29;:::i;:::-;9809:37;;9901:4;9895;9891:15;9883:23;;9606:307;;;:::o;9919:410::-;9996:5;10021:65;10037:48;10078:6;10037:48;:::i;:::-;10021:65;:::i;:::-;10012:74;;10109:6;10102:5;10095:21;10147:4;10140:5;10136:16;10185:3;10176:6;10171:3;10167:16;10164:25;10161:112;;;10192:79;;:::i;:::-;10161:112;10282:41;10316:6;10311:3;10306;10282:41;:::i;:::-;10002:327;9919:410;;;;;:::o;10348:338::-;10403:5;10452:3;10445:4;10437:6;10433:17;10429:27;10419:122;;10460:79;;:::i;:::-;10419:122;10577:6;10564:20;10602:78;10676:3;10668:6;10661:4;10653:6;10649:17;10602:78;:::i;:::-;10593:87;;10409:277;10348:338;;;;:::o;10692:943::-;10787:6;10795;10803;10811;10860:3;10848:9;10839:7;10835:23;10831:33;10828:120;;;10867:79;;:::i;:::-;10828:120;10987:1;11012:53;11057:7;11048:6;11037:9;11033:22;11012:53;:::i;:::-;11002:63;;10958:117;11114:2;11140:53;11185:7;11176:6;11165:9;11161:22;11140:53;:::i;:::-;11130:63;;11085:118;11242:2;11268:53;11313:7;11304:6;11293:9;11289:22;11268:53;:::i;:::-;11258:63;;11213:118;11398:2;11387:9;11383:18;11370:32;11429:18;11421:6;11418:30;11415:117;;;11451:79;;:::i;:::-;11415:117;11556:62;11610:7;11601:6;11590:9;11586:22;11556:62;:::i;:::-;11546:72;;11341:287;10692:943;;;;;;;:::o;11641:715::-;11850:4;11888:2;11877:9;11873:18;11865:26;;11937:9;11931:4;11927:20;11923:1;11912:9;11908:17;11901:47;11965:78;12038:4;12029:6;11965:78;:::i;:::-;11957:86;;12090:9;12084:4;12080:20;12075:2;12064:9;12060:18;12053:48;12118:78;12191:4;12182:6;12118:78;:::i;:::-;12110:86;;12243:9;12237:4;12233:20;12228:2;12217:9;12213:18;12206:48;12271:78;12344:4;12335:6;12271:78;:::i;:::-;12263:86;;11641:715;;;;;;:::o;12362:1159::-;12469:6;12477;12485;12534:2;12522:9;12513:7;12509:23;12505:32;12502:119;;;12540:79;;:::i;:::-;12502:119;12688:1;12677:9;12673:17;12660:31;12718:18;12710:6;12707:30;12704:117;;;12740:79;;:::i;:::-;12704:117;12845:63;12900:7;12891:6;12880:9;12876:22;12845:63;:::i;:::-;12835:73;;12631:287;12985:2;12974:9;12970:18;12957:32;13016:18;13008:6;13005:30;13002:117;;;13038:79;;:::i;:::-;13002:117;13143:63;13198:7;13189:6;13178:9;13174:22;13143:63;:::i;:::-;13133:73;;12928:288;13283:2;13272:9;13268:18;13255:32;13314:18;13306:6;13303:30;13300:117;;;13336:79;;:::i;:::-;13300:117;13441:63;13496:7;13487:6;13476:9;13472:22;13441:63;:::i;:::-;13431:73;;13226:288;12362:1159;;;;;:::o;13527:474::-;13595:6;13603;13652:2;13640:9;13631:7;13627:23;13623:32;13620:119;;;13658:79;;:::i;:::-;13620:119;13778:1;13803:53;13848:7;13839:6;13828:9;13824:22;13803:53;:::i;:::-;13793:63;;13749:117;13905:2;13931:53;13976:7;13967:6;13956:9;13952:22;13931:53;:::i;:::-;13921:63;;13876:118;13527:474;;;;;:::o;14007:1305::-;14123:6;14131;14139;14147;14196:3;14184:9;14175:7;14171:23;14167:33;14164:120;;;14203:79;;:::i;:::-;14164:120;14323:1;14348:53;14393:7;14384:6;14373:9;14369:22;14348:53;:::i;:::-;14338:63;;14294:117;14478:2;14467:9;14463:18;14450:32;14509:18;14501:6;14498:30;14495:117;;;14531:79;;:::i;:::-;14495:117;14636:63;14691:7;14682:6;14671:9;14667:22;14636:63;:::i;:::-;14626:73;;14421:288;14776:2;14765:9;14761:18;14748:32;14807:18;14799:6;14796:30;14793:117;;;14829:79;;:::i;:::-;14793:117;14934:63;14989:7;14980:6;14969:9;14965:22;14934:63;:::i;:::-;14924:73;;14719:288;15074:2;15063:9;15059:18;15046:32;15105:18;15097:6;15094:30;15091:117;;;15127:79;;:::i;:::-;15091:117;15232:63;15287:7;15278:6;15267:9;15263:22;15232:63;:::i;:::-;15222:73;;15017:288;14007:1305;;;;;;;:::o;15318:180::-;15366:77;15363:1;15356:88;15463:4;15460:1;15453:15;15487:4;15484:1;15477:15;15504:320;15548:6;15585:1;15579:4;15575:12;15565:22;;15632:1;15626:4;15622:12;15653:18;15643:81;;15709:4;15701:6;15697:17;15687:27;;15643:81;15771:2;15763:6;15760:14;15740:18;15737:38;15734:84;;;15790:18;;:::i;:::-;15734:84;15555:269;15504:320;;;:::o;15830:231::-;15970:34;15966:1;15958:6;15954:14;15947:58;16039:14;16034:2;16026:6;16022:15;16015:39;15830:231;:::o;16067:366::-;16209:3;16230:67;16294:2;16289:3;16230:67;:::i;:::-;16223:74;;16306:93;16395:3;16306:93;:::i;:::-;16424:2;16419:3;16415:12;16408:19;;16067:366;;;:::o;16439:419::-;16605:4;16643:2;16632:9;16628:18;16620:26;;16692:9;16686:4;16682:20;16678:1;16667:9;16663:17;16656:47;16720:131;16846:4;16720:131;:::i;:::-;16712:139;;16439:419;;;:::o;16864:220::-;17004:34;17000:1;16992:6;16988:14;16981:58;17073:3;17068:2;17060:6;17056:15;17049:28;16864:220;:::o;17090:366::-;17232:3;17253:67;17317:2;17312:3;17253:67;:::i;:::-;17246:74;;17329:93;17418:3;17329:93;:::i;:::-;17447:2;17442:3;17438:12;17431:19;;17090:366;;;:::o;17462:419::-;17628:4;17666:2;17655:9;17651:18;17643:26;;17715:9;17709:4;17705:20;17701:1;17690:9;17686:17;17679:47;17743:131;17869:4;17743:131;:::i;:::-;17735:139;;17462:419;;;:::o;17887:243::-;18027:34;18023:1;18015:6;18011:14;18004:58;18096:26;18091:2;18083:6;18079:15;18072:51;17887:243;:::o;18136:366::-;18278:3;18299:67;18363:2;18358:3;18299:67;:::i;:::-;18292:74;;18375:93;18464:3;18375:93;:::i;:::-;18493:2;18488:3;18484:12;18477:19;;18136:366;;;:::o;18508:419::-;18674:4;18712:2;18701:9;18697:18;18689:26;;18761:9;18755:4;18751:20;18747:1;18736:9;18732:17;18725:47;18789:131;18915:4;18789:131;:::i;:::-;18781:139;;18508:419;;;:::o;18933:236::-;19073:34;19069:1;19061:6;19057:14;19050:58;19142:19;19137:2;19129:6;19125:15;19118:44;18933:236;:::o;19175:366::-;19317:3;19338:67;19402:2;19397:3;19338:67;:::i;:::-;19331:74;;19414:93;19503:3;19414:93;:::i;:::-;19532:2;19527:3;19523:12;19516:19;;19175:366;;;:::o;19547:419::-;19713:4;19751:2;19740:9;19736:18;19728:26;;19800:9;19794:4;19790:20;19786:1;19775:9;19771:17;19764:47;19828:131;19954:4;19828:131;:::i;:::-;19820:139;;19547:419;;;:::o;19972:233::-;20112:34;20108:1;20100:6;20096:14;20089:58;20181:16;20176:2;20168:6;20164:15;20157:41;19972:233;:::o;20211:366::-;20353:3;20374:67;20438:2;20433:3;20374:67;:::i;:::-;20367:74;;20450:93;20539:3;20450:93;:::i;:::-;20568:2;20563:3;20559:12;20552:19;;20211:366;;;:::o;20583:419::-;20749:4;20787:2;20776:9;20772:18;20764:26;;20836:9;20830:4;20826:20;20822:1;20811:9;20807:17;20800:47;20864:131;20990:4;20864:131;:::i;:::-;20856:139;;20583:419;;;:::o;21008:228::-;21148:34;21144:1;21136:6;21132:14;21125:58;21217:11;21212:2;21204:6;21200:15;21193:36;21008:228;:::o;21242:366::-;21384:3;21405:67;21469:2;21464:3;21405:67;:::i;:::-;21398:74;;21481:93;21570:3;21481:93;:::i;:::-;21599:2;21594:3;21590:12;21583:19;;21242:366;;;:::o;21614:419::-;21780:4;21818:2;21807:9;21803:18;21795:26;;21867:9;21861:4;21857:20;21853:1;21842:9;21838:17;21831:47;21895:131;22021:4;21895:131;:::i;:::-;21887:139;;21614:419;;;:::o;22039:229::-;22179:34;22175:1;22167:6;22163:14;22156:58;22248:12;22243:2;22235:6;22231:15;22224:37;22039:229;:::o;22274:366::-;22416:3;22437:67;22501:2;22496:3;22437:67;:::i;:::-;22430:74;;22513:93;22602:3;22513:93;:::i;:::-;22631:2;22626:3;22622:12;22615:19;;22274:366;;;:::o;22646:419::-;22812:4;22850:2;22839:9;22835:18;22827:26;;22899:9;22893:4;22889:20;22885:1;22874:9;22870:17;22863:47;22927:131;23053:4;22927:131;:::i;:::-;22919:139;;22646:419;;;:::o;23071:148::-;23173:11;23210:3;23195:18;;23071:148;;;;:::o;23225:377::-;23331:3;23359:39;23392:5;23359:39;:::i;:::-;23414:89;23496:6;23491:3;23414:89;:::i;:::-;23407:96;;23512:52;23557:6;23552:3;23545:4;23538:5;23534:16;23512:52;:::i;:::-;23589:6;23584:3;23580:16;23573:23;;23335:267;23225:377;;;;:::o;23608:275::-;23740:3;23762:95;23853:3;23844:6;23762:95;:::i;:::-;23755:102;;23874:3;23867:10;;23608:275;;;;:::o;23889:175::-;24029:27;24025:1;24017:6;24013:14;24006:51;23889:175;:::o;24070:366::-;24212:3;24233:67;24297:2;24292:3;24233:67;:::i;:::-;24226:74;;24309:93;24398:3;24309:93;:::i;:::-;24427:2;24422:3;24418:12;24411:19;;24070:366;;;:::o;24442:419::-;24608:4;24646:2;24635:9;24631:18;24623:26;;24695:9;24689:4;24685:20;24681:1;24670:9;24666:17;24659:47;24723:131;24849:4;24723:131;:::i;:::-;24715:139;;24442:419;;;:::o;24867:234::-;25007:34;25003:1;24995:6;24991:14;24984:58;25076:17;25071:2;25063:6;25059:15;25052:42;24867:234;:::o;25107:366::-;25249:3;25270:67;25334:2;25329:3;25270:67;:::i;:::-;25263:74;;25346:93;25435:3;25346:93;:::i;:::-;25464:2;25459:3;25455:12;25448:19;;25107:366;;;:::o;25479:419::-;25645:4;25683:2;25672:9;25668:18;25660:26;;25732:9;25726:4;25722:20;25718:1;25707:9;25703:17;25696:47;25760:131;25886:4;25760:131;:::i;:::-;25752:139;;25479:419;;;:::o;25904:435::-;26084:3;26106:95;26197:3;26188:6;26106:95;:::i;:::-;26099:102;;26218:95;26309:3;26300:6;26218:95;:::i;:::-;26211:102;;26330:3;26323:10;;25904:435;;;;;:::o;26345:181::-;26485:33;26481:1;26473:6;26469:14;26462:57;26345:181;:::o;26532:366::-;26674:3;26695:67;26759:2;26754:3;26695:67;:::i;:::-;26688:74;;26771:93;26860:3;26771:93;:::i;:::-;26889:2;26884:3;26880:12;26873:19;;26532:366;;;:::o;26904:419::-;27070:4;27108:2;27097:9;27093:18;27085:26;;27157:9;27151:4;27147:20;27143:1;27132:9;27128:17;27121:47;27185:131;27311:4;27185:131;:::i;:::-;27177:139;;26904:419;;;:::o;27329:179::-;27469:31;27465:1;27457:6;27453:14;27446:55;27329:179;:::o;27514:366::-;27656:3;27677:67;27741:2;27736:3;27677:67;:::i;:::-;27670:74;;27753:93;27842:3;27753:93;:::i;:::-;27871:2;27866:3;27862:12;27855:19;;27514:366;;;:::o;27886:419::-;28052:4;28090:2;28079:9;28075:18;28067:26;;28139:9;28133:4;28129:20;28125:1;28114:9;28110:17;28103:47;28167:131;28293:4;28167:131;:::i;:::-;28159:139;;27886:419;;;:::o;28311:176::-;28451:28;28447:1;28439:6;28435:14;28428:52;28311:176;:::o;28493:366::-;28635:3;28656:67;28720:2;28715:3;28656:67;:::i;:::-;28649:74;;28732:93;28821:3;28732:93;:::i;:::-;28850:2;28845:3;28841:12;28834:19;;28493:366;;;:::o;28865:419::-;29031:4;29069:2;29058:9;29054:18;29046:26;;29118:9;29112:4;29108:20;29104:1;29093:9;29089:17;29082:47;29146:131;29272:4;29146:131;:::i;:::-;29138:139;;28865:419;;;:::o;29290:230::-;29430:34;29426:1;29418:6;29414:14;29407:58;29499:13;29494:2;29486:6;29482:15;29475:38;29290:230;:::o;29526:366::-;29668:3;29689:67;29753:2;29748:3;29689:67;:::i;:::-;29682:74;;29765:93;29854:3;29765:93;:::i;:::-;29883:2;29878:3;29874:12;29867:19;;29526:366;;;:::o;29898:419::-;30064:4;30102:2;30091:9;30087:18;30079:26;;30151:9;30145:4;30141:20;30137:1;30126:9;30122:17;30115:47;30179:131;30305:4;30179:131;:::i;:::-;30171:139;;29898:419;;;:::o;30323:231::-;30463:34;30459:1;30451:6;30447:14;30440:58;30532:14;30527:2;30519:6;30515:15;30508:39;30323:231;:::o;30560:366::-;30702:3;30723:67;30787:2;30782:3;30723:67;:::i;:::-;30716:74;;30799:93;30888:3;30799:93;:::i;:::-;30917:2;30912:3;30908:12;30901:19;;30560:366;;;:::o;30932:419::-;31098:4;31136:2;31125:9;31121:18;31113:26;;31185:9;31179:4;31175:20;31171:1;31160:9;31156:17;31149:47;31213:131;31339:4;31213:131;:::i;:::-;31205:139;;30932:419;;;:::o;31357:228::-;31497:34;31493:1;31485:6;31481:14;31474:58;31566:11;31561:2;31553:6;31549:15;31542:36;31357:228;:::o;31591:366::-;31733:3;31754:67;31818:2;31813:3;31754:67;:::i;:::-;31747:74;;31830:93;31919:3;31830:93;:::i;:::-;31948:2;31943:3;31939:12;31932:19;;31591:366;;;:::o;31963:419::-;32129:4;32167:2;32156:9;32152:18;32144:26;;32216:9;32210:4;32206:20;32202:1;32191:9;32187:17;32180:47;32244:131;32370:4;32244:131;:::i;:::-;32236:139;;31963:419;;;:::o;32388:223::-;32528:34;32524:1;32516:6;32512:14;32505:58;32597:6;32592:2;32584:6;32580:15;32573:31;32388:223;:::o;32617:366::-;32759:3;32780:67;32844:2;32839:3;32780:67;:::i;:::-;32773:74;;32856:93;32945:3;32856:93;:::i;:::-;32974:2;32969:3;32965:12;32958:19;;32617:366;;;:::o;32989:419::-;33155:4;33193:2;33182:9;33178:18;33170:26;;33242:9;33236:4;33232:20;33228:1;33217:9;33213:17;33206:47;33270:131;33396:4;33270:131;:::i;:::-;33262:139;;32989:419;;;:::o;33414:180::-;33462:77;33459:1;33452:88;33559:4;33556:1;33549:15;33583:4;33580:1;33573:15;33600:191;33640:4;33660:20;33678:1;33660:20;:::i;:::-;33655:25;;33694:20;33712:1;33694:20;:::i;:::-;33689:25;;33733:1;33730;33727:8;33724:34;;;33738:18;;:::i;:::-;33724:34;33783:1;33780;33776:9;33768:17;;33600:191;;;;:::o;33797:305::-;33837:3;33856:20;33874:1;33856:20;:::i;:::-;33851:25;;33890:20;33908:1;33890:20;:::i;:::-;33885:25;;34044:1;33976:66;33972:74;33969:1;33966:81;33963:107;;;34050:18;;:::i;:::-;33963:107;34094:1;34091;34087:9;34080:16;;33797:305;;;;:::o;34108:237::-;34248:34;34244:1;34236:6;34232:14;34225:58;34317:20;34312:2;34304:6;34300:15;34293:45;34108:237;:::o;34351:366::-;34493:3;34514:67;34578:2;34573:3;34514:67;:::i;:::-;34507:74;;34590:93;34679:3;34590:93;:::i;:::-;34708:2;34703:3;34699:12;34692:19;;34351:366;;;:::o;34723:419::-;34889:4;34927:2;34916:9;34912:18;34904:26;;34976:9;34970:4;34966:20;34962:1;34951:9;34947:17;34940:47;35004:131;35130:4;35004:131;:::i;:::-;34996:139;;34723:419;;;:::o;35148:233::-;35187:3;35210:24;35228:5;35210:24;:::i;:::-;35201:33;;35256:66;35249:5;35246:77;35243:103;;;35326:18;;:::i;:::-;35243:103;35373:1;35366:5;35362:13;35355:20;;35148:233;;;:::o;35387:180::-;35435:77;35432:1;35425:88;35532:4;35529:1;35522:15;35556:4;35553:1;35546:15;35573:185;35613:1;35630:20;35648:1;35630:20;:::i;:::-;35625:25;;35664:20;35682:1;35664:20;:::i;:::-;35659:25;;35703:1;35693:35;;35708:18;;:::i;:::-;35693:35;35750:1;35747;35743:9;35738:14;;35573:185;;;;:::o;35764:176::-;35796:1;35813:20;35831:1;35813:20;:::i;:::-;35808:25;;35847:20;35865:1;35847:20;:::i;:::-;35842:25;;35886:1;35876:35;;35891:18;;:::i;:::-;35876:35;35932:1;35929;35925:9;35920:14;;35764:176;;;;:::o;35946:180::-;35994:77;35991:1;35984:88;36091:4;36088:1;36081:15;36115:4;36112:1;36105:15;36132:98;36183:6;36217:5;36211:12;36201:22;;36132:98;;;:::o;36236:168::-;36319:11;36353:6;36348:3;36341:19;36393:4;36388:3;36384:14;36369:29;;36236:168;;;;:::o;36410:360::-;36496:3;36524:38;36556:5;36524:38;:::i;:::-;36578:70;36641:6;36636:3;36578:70;:::i;:::-;36571:77;;36657:52;36702:6;36697:3;36690:4;36683:5;36679:16;36657:52;:::i;:::-;36734:29;36756:6;36734:29;:::i;:::-;36729:3;36725:39;36718:46;;36500:270;36410:360;;;;:::o;36776:640::-;36971:4;37009:3;36998:9;36994:19;36986:27;;37023:71;37091:1;37080:9;37076:17;37067:6;37023:71;:::i;:::-;37104:72;37172:2;37161:9;37157:18;37148:6;37104:72;:::i;:::-;37186;37254:2;37243:9;37239:18;37230:6;37186:72;:::i;:::-;37305:9;37299:4;37295:20;37290:2;37279:9;37275:18;37268:48;37333:76;37404:4;37395:6;37333:76;:::i;:::-;37325:84;;36776:640;;;;;;;:::o;37422:141::-;37478:5;37509:6;37503:13;37494:22;;37525:32;37551:5;37525:32;:::i;:::-;37422:141;;;;:::o;37569:349::-;37638:6;37687:2;37675:9;37666:7;37662:23;37658:32;37655:119;;;37693:79;;:::i;:::-;37655:119;37813:1;37838:63;37893:7;37884:6;37873:9;37869:22;37838:63;:::i;:::-;37828:73;;37784:127;37569:349;;;;:::o;37924:182::-;38064:34;38060:1;38052:6;38048:14;38041:58;37924:182;:::o;38112:366::-;38254:3;38275:67;38339:2;38334:3;38275:67;:::i;:::-;38268:74;;38351:93;38440:3;38351:93;:::i;:::-;38469:2;38464:3;38460:12;38453:19;;38112:366;;;:::o;38484:419::-;38650:4;38688:2;38677:9;38673:18;38665:26;;38737:9;38731:4;38727:20;38723:1;38712:9;38708:17;38701:47;38765:131;38891:4;38765:131;:::i;:::-;38757:139;;38484:419;;;:::o;38909:178::-;39049:30;39045:1;39037:6;39033:14;39026:54;38909:178;:::o;39093:366::-;39235:3;39256:67;39320:2;39315:3;39256:67;:::i;:::-;39249:74;;39332:93;39421:3;39332:93;:::i;:::-;39450:2;39445:3;39441:12;39434:19;;39093:366;;;:::o;39465:419::-;39631:4;39669:2;39658:9;39654:18;39646:26;;39718:9;39712:4;39708:20;39704:1;39693:9;39689:17;39682:47;39746:131;39872:4;39746:131;:::i;:::-;39738:139;;39465:419;;;:::o

Swarm Source

ipfs://89e93c66d7c2f1ccf9a88aa51225682ef2e02e2e96f5e15cceb7142822a40b8d
Loading...
Loading
Loading...
Loading
[ 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.