ETH Price: $3,503.62 (+3.93%)
Gas: 4 Gwei

Token

ArtAI2 (ARTAI2)
 

Overview

Max Total Supply

5,000 ARTAI2

Holders

741

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
vgf.eth
Balance
1 ARTAI2
0x6cf69059dd4a86987bc8a4c334b83ea8fa9f4037
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Each EpoStory is a series of text driven AI generated images created by the community using the Eponym generator.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ArtAI

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1337 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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;


interface IArtAI is IERC721 {
    function tokenIdForName(string memory _paintingName)
        external
        view
        returns (uint256);

    function tokenInfo(uint256 _tokenId)
        external
        view
        returns (
            string memory _imageHash,
            string memory _imageName,
            string memory _imageId
        );
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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;



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

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

    bool private _paused;
    bool private _allowMinting;
    bool private _allowExtending;

    /**
     * @dev Initializes the contract in paused state.
     */
    constructor() {
        _paused = true;
        _allowMinting = false;
        _allowExtending = false;
    }

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

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

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

    modifier whenMintingOpen() {
        require(!paused() && _allowMinting, "Minting is not open");
        _;
    }

    modifier whenExtendingOpen() {
        require(!paused() && _allowExtending, "Extending is not open");
        _;
    }

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }

    function openExtending() external onlyOwner {
        _openExtending();
    }

    function closeExtending() external onlyOwner {
        _closeExtending();
    }

    function openMinting() external onlyOwner {
        _openMinting();
    }

    function closeMinting() external onlyOwner {
        _closeMinting();
    }

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

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

    function _openMinting() internal virtual whenNotPaused {
        _allowMinting = true;
    }

    function _closeMinting() internal virtual {
        _allowMinting = false;
    }

    function _openExtending() internal virtual whenNotPaused {
        _allowExtending = true;
    }

    function _closeExtending() internal virtual {
        _allowExtending = false;
    }
}

pragma solidity ^0.8.0;


/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address, RecoverError)
    {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature)
        internal
        pure
        returns (address)
    {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(
                vs,
                0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
            )
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (
            uint256(s) >
            0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0
        ) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash)
        internal
        pure
        returns (bytes32)
    {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return
            keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
            );
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n",
                    Strings.toString(s.length),
                    s
                )
            );
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", domainSeparator, structHash)
            );
    }
}
pragma solidity ^0.8.0;













contract ArtAI is Context, ERC165, IERC721, IERC721Metadata, Ownable, Pausable {
    /**
     * @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;
    using ECDSA for bytes;

    event Burn(
        address indexed owner,
        uint256 indexed tokenId1,
        uint256 indexed tokenId2
    );
    event Extend(
        address owner,
        uint256 tokenId,
        string oldHash,
        string newHash,
        string oldName,
        string newName,
        string oldId,
        string newId
    );

    // Max total supply
    uint256 public maxSupply = 5000;
    // Max painting name length
    uint256 private _maxImageNameLength = 100;
    // purchase price
    uint256 public _purchasePrice = 50000000000000000 wei;
    // public signer address
    address private _messageSigner;
    // graveyard address
    address private _graveyardAddress =
        0x000000000000000000000000000000000000dEaD;
    // price in burn tokens for a mint
    uint256 private _mintCostInBurnTokens = 1;
    // Gen 1 Address
    address private _gen1Address = 0xaA20f900e24cA7Ed897C44D92012158f436ef791;

    // Paintbrush ERC20 address
    address private _paintbrushAddress;

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

    // Min Paintbrush balance to extend
    uint256 public _minPaintbrushesToExtend;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Token supply
    uint256 public _tokenSupply;

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

    // Status of signed messages
    mapping(bytes => bool) private _usedSignedMessages;

    // used IPFS hashes
    mapping(string => bool) private _usedIPFSHashes;

    // used image IDs
    mapping(string => bool) private _usedImageIds;

    // Burn counts 'tokens' for addresses
    mapping(address => uint256) private _burnTokens;

    // Gen 1 Available names for address
    mapping(address => mapping(string => bool)) private _availableBurnedNames;

    // Gen 2 available names for a token id
    mapping(uint256 => mapping(string => bool)) private _availableExtendedNames;

    /**
     * @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 isExtensionNameAvailableForToken(
        uint256 _tokenId,
        string memory _imageName
    ) external view returns (bool) {
        return _availableExtendedNames[_tokenId][_imageName];
    }

    function isNameAvailableForAddress(
        address _address,
        string memory _imageName
    ) external view returns (bool) {
        return _availableBurnedNames[_address][_imageName];
    }

    function setPaintbrushAddress(address newAddress) external onlyOwner {
        _paintbrushAddress = newAddress;
    }

    function setMinPaintbrushesToExtend(uint256 amount) external onlyOwner {
        _minPaintbrushesToExtend = amount;
    }

    function setGen1Address(address newAddress) external onlyOwner {
        _gen1Address = newAddress;
    }

    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 setMessageSigner(address newSigner) external onlyOwner {
        _messageSigner = newSigner;
    }

    function burnTokenBalance(address owner) public view returns (uint256) {
        return _burnTokens[owner];
    }

    function lockMinting() external onlyOwner {
        maxSupply = _tokenSupply;
        _closeMinting();
    }

    function _burn(uint256 _tokenId1, uint256 _tokenId2) private {
        IArtAI(_gen1Address).safeTransferFrom(
            msg.sender,
            _graveyardAddress,
            _tokenId1
        );
        IArtAI(_gen1Address).safeTransferFrom(
            msg.sender,
            _graveyardAddress,
            _tokenId2
        );
        (, string memory _name1, ) = IArtAI(_gen1Address).tokenInfo(_tokenId1);
        (, string memory _name2, ) = IArtAI(_gen1Address).tokenInfo(_tokenId2);

        _availableBurnedNames[msg.sender][_name1] = true;
        _availableBurnedNames[msg.sender][_name2] = true;
        _burnTokens[msg.sender] += 1;

        emit Burn(msg.sender, _tokenId1, _tokenId2);
    }

    function _verifyName(string memory _imageName) private view returns (bool) {
        if (_namePurchases[_imageName]) {
            return false;
        }
        if (IArtAI(_gen1Address).tokenIdForName(_imageName) != 0) {
            return _availableBurnedNames[msg.sender][_imageName];
        }
        return true;
    }

    function _verifyName(string memory _imageName, uint256 _tokenId)
        private
        view
        returns (bool)
    {
        if (_availableExtendedNames[_tokenId][_imageName]) {
            return true;
        }
        return _verifyName(_imageName);
    }

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

        _safeMint(_owner, _newTokenId);
        _updateStoredValues(
            _imageName,
            _imageHash,
            _imageId,
            _signedMessage,
            _newTokenId
        );
        _burnTokens[msg.sender] -= 1;

        return _newTokenId;
    }

    function _verifySignedMessage(
        string memory _imageHash,
        string memory _imageId,
        string memory _imageName,
        bytes memory _signedMessage
    ) internal returns (bool) {
        if (_usedSignedMessages[_signedMessage]) {
            return false;
        }

        bytes32 _message = ECDSA.toEthSignedMessageHash(
            abi.encodePacked(_imageId, _imageHash, _imageName)
        );

        address signer = ECDSA.recover(_message, _signedMessage);

        if (signer != _messageSigner) {
            return false;
        }

        _usedSignedMessages[_signedMessage] = true;
        return true;
    }

    function _verifyParams(
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        bytes memory _signedMessage
    ) internal {
        require(!_usedImageIds[_imageId], "ImageID");
        require(!_usedIPFSHashes[_imageHash], "IPFS hash");
        require(bytes(_imageName).length <= _maxImageNameLength, "Name");
        require(msg.value >= _purchasePrice, "value");
        require(_verifyName(_imageName), "name purchased");
        require(
            _verifySignedMessage(
                _imageHash,
                _imageId,
                _imageName,
                _signedMessage
            ),
            "Signature"
        );
    }

    function _verifyParams(
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        bytes memory _signedMessage,
        uint256 _tokenId
    ) internal {
        require(!_usedImageIds[_imageId], "ImageID");
        require(!_usedIPFSHashes[_imageHash], "IPFS hash");
        require(bytes(_imageName).length <= _maxImageNameLength, "Name");
        require(msg.value >= _purchasePrice, "value");
        require(_verifyName(_imageName, _tokenId), "name purchased");
        require(
            _verifySignedMessage(
                _imageHash,
                _imageId,
                _imageName,
                _signedMessage
            ),
            "Signature"
        );
    }

    function _updateStoredValues(
        string memory _imageName,
        string memory _imageHash,
        string memory _imageId,
        bytes memory _signedMessage,
        uint256 _tokenId
    ) private {
        _namePurchases[_imageName] = true;
        _usedSignedMessages[_signedMessage] = true;
        _usedImageIds[_imageId] = true;
        _usedIPFSHashes[_imageHash] = true;
        _availableExtendedNames[_tokenId][_imageName] = true;

        _nameToTokenId[_imageName] = _tokenId;
        _tokenImageHashes[_tokenId] = _imageHash;
        _tokenIdToName[_tokenId] = _imageName;
        _tokenIdToImageId[_tokenId] = _imageId;
    }

    function _extend(
        uint256 _tokenId,
        string memory _imageHash,
        string memory _imageName,
        string memory _imageId,
        bytes memory _signedMessage
    ) private {
        string memory oldHash = _tokenImageHashes[_tokenId];
        string memory oldName = _tokenIdToName[_tokenId];
        string memory oldId = _tokenIdToImageId[_tokenId];

        _updateStoredValues(
            _imageName,
            _imageHash,
            _imageId,
            _signedMessage,
            _tokenId
        );

        emit Extend(
            msg.sender,
            _tokenId,
            oldHash,
            _imageHash,
            oldName,
            _imageName,
            oldId,
            _imageId
        );
    }

    function extend(
        uint256 _tokenId,
        string memory _imageHash,
        string memory _imageName,
        string memory _imageId,
        bytes memory _signedMessage
    ) external payable whenExtendingOpen {
        require(ownerOf(_tokenId) == msg.sender, "Ownership");
        require(
            IERC721(_gen1Address).balanceOf(msg.sender) > 0 ||
                IERC20(_paintbrushAddress).balanceOf(msg.sender) >=
                _minPaintbrushesToExtend,
            "Balance"
        );
        _verifyParams(
            _imageName,
            _imageHash,
            _imageId,
            _signedMessage,
            _tokenId
        );

        _extend(_tokenId, _imageHash, _imageName, _imageId, _signedMessage);
    }

    function burn(uint256 _tokenId1, uint256 _tokenId2)
        external
        whenMintingOpen
    {
        require(_tokenId1 != _tokenId2, "same tokens");
        IERC721 iface = IERC721(_gen1Address);
        require(iface.ownerOf(_tokenId1) == msg.sender, "Ownership");
        require(iface.ownerOf(_tokenId2) == msg.sender, "Ownership");
        require(
            iface.isApprovedForAll(msg.sender, address(this)),
            "transfer perms"
        );

        _burn(_tokenId1, _tokenId2);
    }

    function mint(
        string memory _imageHash,
        string memory _imageName,
        string memory _imageId,
        bytes memory _signedMessage
    ) external payable whenMintingOpen returns (uint256) {
        require(_tokenSupply < maxSupply, "Maximum supply");
        require(
            _burnTokens[msg.sender] >= _mintCostInBurnTokens,
            "burn tokens"
        );
        _verifyParams(_imageName, _imageHash, _imageId, _signedMessage);
        uint256 _newTokenId = _mint(
            msg.sender,
            _imageName,
            _imageHash,
            _imageId,
            _signedMessage
        );

        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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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: 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 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: not own");
        require(to != address(0), "ERC721: 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: 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":true,"internalType":"uint256","name":"tokenId1","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenId2","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"oldHash","type":"string"},{"indexed":false,"internalType":"string","name":"newHash","type":"string"},{"indexed":false,"internalType":"string","name":"oldName","type":"string"},{"indexed":false,"internalType":"string","name":"newName","type":"string"},{"indexed":false,"internalType":"string","name":"oldId","type":"string"},{"indexed":false,"internalType":"string","name":"newId","type":"string"}],"name":"Extend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_minPaintbrushesToExtend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_purchasePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"_tokenId1","type":"uint256"},{"internalType":"uint256","name":"_tokenId2","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"burnTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeExtending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_imageHash","type":"string"},{"internalType":"string","name":"_imageName","type":"string"},{"internalType":"string","name":"_imageId","type":"string"},{"internalType":"bytes","name":"_signedMessage","type":"bytes"}],"name":"extend","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_imageName","type":"string"}],"name":"isExtensionNameAvailableForToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"string","name":"_imageName","type":"string"}],"name":"isNameAvailableForAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMinting","outputs":[],"stateMutability":"nonpayable","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"},{"internalType":"bytes","name":"_signedMessage","type":"bytes"}],"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":"openExtending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"address","name":"newAddress","type":"address"}],"name":"setGen1Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setMessageSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinPaintbrushesToExtend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setPaintbrushAddress","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":[{"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":[],"name":"unpause","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"}]

6113886001908155606460025566b1a2bc2ec50000600355600580546001600160a01b031990811661dead179091556006919091556007805490911673aa20f900e24ca7ed897c44d92012158f436ef79117905560e060405260256080818152906200479660a03980516200007d916009916020909101906200010b565b503480156200008b57600080fd5b50604051620047bb380380620047bb833981016040819052620000ae916200027e565b60008054600160a01b6001600160a81b03199091163360ff60a01b1916171761ffff60a81b191690558151620000ec90600b9060208501906200010b565b5080516200010290600c9060208401906200010b565b50505062000325565b8280546200011990620002e8565b90600052602060002090601f0160209004810192826200013d576000855562000188565b82601f106200015857805160ff191683800117855562000188565b8280016001018555821562000188579182015b82811115620001885782518255916020019190600101906200016b565b50620001969291506200019a565b5090565b5b808211156200019657600081556001016200019b565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001d957600080fd5b81516001600160401b0380821115620001f657620001f6620001b1565b604051601f8301601f19908116603f01168101908282118183101715620002215762000221620001b1565b816040528381526020925086838588010111156200023e57600080fd5b600091505b8382101562000262578582018301518183018401529082019062000243565b83821115620002745760008385830101525b9695505050505050565b600080604083850312156200029257600080fd5b82516001600160401b0380821115620002aa57600080fd5b620002b886838701620001c7565b93506020850151915080821115620002cf57600080fd5b50620002de85828601620001c7565b9150509250929050565b600181811c90821680620002fd57607f821691505b602082108114156200031f57634e487b7160e01b600052602260045260246000fd5b50919050565b61446180620003356000396000f3fe6080604052600436106102e75760003560e01c80638460dd0811610184578063be8efe22116100d6578063d5abeb011161008a578063e985e9c511610064578063e985e9c5146107b9578063f2fde38b14610802578063f729810c1461082257600080fd5b8063d5abeb0114610763578063d729666214610779578063e465f1f51461079957600080fd5b8063c87b56dd116100bb578063c87b56dd146106de578063cc33c875146106fe578063cc8fef891461072d57600080fd5b8063be8efe22146106ab578063c45bed24146106be57600080fd5b8063a22cb46511610138578063b390c0ab11610112578063b390c0ab14610655578063b88d4fde14610675578063bc969e321461069557600080fd5b8063a22cb465146105ff578063a7fcb40a1461061f578063ae76e8fb1461063f57600080fd5b80638da5cb5b116101695780638da5cb5b146105ac57806395d89b41146105ca5780639888d9c1146105df57600080fd5b80638460dd081461057757806387491c601461059757600080fd5b806345b908091161023d5780635fd8c710116101f15780636ba9fd38116101cb5780636ba9fd381461052d57806370a08231146105425780638456cb591461056257600080fd5b80635fd8c710146104e2578063629b05f0146104f75780636352211e1461050d57600080fd5b80634b36df53116102225780634b36df531461048357806355f804b3146104a35780635c975abb146104c357600080fd5b806345b908091461045b5780634aed03871461046e57600080fd5b80630d7982ad1161029f57806323b872dd1161027957806323b872dd146104065780633f4ba83a1461042657806342842e0e1461043b57600080fd5b80630d7982ad146103bd578063105e1c70146103d257806318160ddd146103e757600080fd5b806306fdde03116102d057806306fdde0314610343578063081812fc14610365578063095ea7b31461039d57600080fd5b806301ffc9a7146102ec578063068d4fcc14610321575b600080fd5b3480156102f857600080fd5b5061030c610307366004613ab9565b610842565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b5061034161033c366004613aeb565b6108df565b005b34801561034f57600080fd5b50610358610965565b6040516103189190613b60565b34801561037157600080fd5b50610385610380366004613b73565b6109f7565b6040516001600160a01b039091168152602001610318565b3480156103a957600080fd5b506103416103b8366004613b8c565b610a77565b3480156103c957600080fd5b50610341610b83565b3480156103de57600080fd5b50610341610bfc565b3480156103f357600080fd5b506001545b604051908152602001610318565b34801561041257600080fd5b50610341610421366004613bb8565b610c88565b34801561043257600080fd5b50610341610ce9565b34801561044757600080fd5b50610341610456366004613bb8565b610d50565b610341610469366004613cbe565b610d6b565b34801561047a57600080fd5b50610341610faa565b34801561048f57600080fd5b5061034161049e366004613aeb565b611011565b3480156104af57600080fd5b506103416104be366004613d75565b611092565b3480156104cf57600080fd5b50600054600160a01b900460ff1661030c565b3480156104ee57600080fd5b50610341611108565b34801561050357600080fd5b506103f8600d5481565b34801561051957600080fd5b50610385610528366004613b73565b6111a4565b34801561053957600080fd5b50610341611209565b34801561054e57600080fd5b506103f861055d366004613aeb565b611270565b34801561056e57600080fd5b506103416112e4565b34801561058357600080fd5b506103f8610592366004613d75565b61134b565b3480156105a357600080fd5b50610341611373565b3480156105b857600080fd5b506000546001600160a01b0316610385565b3480156105d657600080fd5b506103586113e4565b3480156105eb57600080fd5b5061030c6105fa366004613daa565b6113f3565b34801561060b57600080fd5b5061034161061a366004613e08565b611434565b34801561062b57600080fd5b5061030c61063a366004613e41565b6114f9565b34801561064b57600080fd5b506103f860035481565b34801561066157600080fd5b50610341610670366004613e72565b611515565b34801561068157600080fd5b50610341610690366004613e94565b61183e565b3480156106a157600080fd5b506103f8600a5481565b6103f86106b9366004613f00565b6118a6565b3480156106ca57600080fd5b506103416106d9366004613aeb565b6119f1565b3480156106ea57600080fd5b506103586106f9366004613b73565b611a72565b34801561070a57600080fd5b5061071e610719366004613b73565b611b5b565b60405161031893929190613fa1565b34801561073957600080fd5b506103f8610748366004613aeb565b6001600160a01b03166000908152601a602052604090205490565b34801561076f57600080fd5b506103f860015481565b34801561078557600080fd5b50610341610794366004613b73565b611d38565b3480156107a557600080fd5b506103416107b4366004613b8c565b611d9c565b3480156107c557600080fd5b5061030c6107d4366004613fe4565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205460ff1690565b34801561080e57600080fd5b5061034161081d366004613aeb565b611e3e565b34801561082e57600080fd5b5061034161083d366004613b73565b611ed2565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806108a557506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108d957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6000546001600160a01b031633146109435760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b60648201526084015b60405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6060600b805461097490614012565b80601f01602080910402602001604051908101604052809291908181526020018280546109a090614012565b80156109ed5780601f106109c2576101008083540402835291602001916109ed565b820191906000526020600020905b8154815290600101906020018083116109d057829003601f168201915b5050505050905090565b6000818152600e60205260408120546001600160a01b0316610a5b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161093a565b506000908152601060205260409020546001600160a01b031690565b6000610a82826111a4565b9050806001600160a01b0316836001600160a01b03161415610ae65760405162461bcd60e51b815260206004820152601560248201527f4552433732313a2063757272656e74206f776e65720000000000000000000000604482015260640161093a565b336001600160a01b0382161480610b025750610b0281336107d4565b610b745760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161093a565b610b7e8383611f36565b505050565b6000546001600160a01b03163314610be25760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600d54600155610bfa6000805460ff60a81b19169055565b565b6000546001600160a01b03163314610c5b5760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055565b610c923382611fa4565b610cde5760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f7665640000604482015260640161093a565b610b7e838383612082565b6000546001600160a01b03163314610d485760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa612204565b610b7e8383836040518060200160405280600081525061183e565b600054600160a01b900460ff16158015610da15750600054760100000000000000000000000000000000000000000000900460ff165b610ded5760405162461bcd60e51b815260206004820152601560248201527f457874656e64696e67206973206e6f74206f70656e0000000000000000000000604482015260640161093a565b33610df7866111a4565b6001600160a01b031614610e395760405162461bcd60e51b815260206004820152600960248201526804f776e6572736869760bc1b604482015260640161093a565b6007546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610e7d57600080fd5b505afa158015610e91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb5919061404d565b1180610f3d5750600a546008546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610f0257600080fd5b505afa158015610f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3a919061404d565b10155b610f895760405162461bcd60e51b815260206004820152600760248201527f42616c616e636500000000000000000000000000000000000000000000000000604482015260640161093a565b610f9683858484896122c5565b610fa385858585856124b3565b5050505050565b6000546001600160a01b031633146110095760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa6126e8565b6000546001600160a01b031633146110705760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146110f15760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b8051611104906009906020840190613a0a565b5050565b6000546001600160a01b031633146111675760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f193505050501580156111a1573d6000803e3d6000fd5b50565b6000818152600e60205260408120546001600160a01b0316806108d95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161093a565b6000546001600160a01b031633146112685760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa612785565b60006001600160a01b0382166112c85760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f2061646472657373000000000000000000000000604482015260640161093a565b506001600160a01b03166000908152600f602052604090205490565b6000546001600160a01b031633146113435760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa6127f4565b600060138260405161135d9190614066565b9081526020016040518091039020549050919050565b6000546001600160a01b031633146113d25760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa6000805460ff60a81b19169055565b6060600c805461097490614012565b6001600160a01b0382166000908152601b60205260408082209051611419908490614066565b9081526040519081900360200190205460ff16905092915050565b6001600160a01b03821633141561148d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093a565b3360008181526011602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152601c60205260408082209051611419908490614066565b600054600160a01b900460ff161580156115385750600054600160a81b900460ff165b6115845760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206973206e6f74206f70656e00000000000000000000000000604482015260640161093a565b808214156115d45760405162461bcd60e51b815260206004820152600b60248201527f73616d6520746f6b656e73000000000000000000000000000000000000000000604482015260640161093a565b6007546040516331a9108f60e11b8152600481018490526001600160a01b039091169033908290636352211e9060240160206040518083038186803b15801561161c57600080fd5b505afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116549190614082565b6001600160a01b0316146116965760405162461bcd60e51b815260206004820152600960248201526804f776e6572736869760bc1b604482015260640161093a565b6040516331a9108f60e11b81526004810183905233906001600160a01b03831690636352211e9060240160206040518083038186803b1580156116d857600080fd5b505afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190614082565b6001600160a01b0316146117525760405162461bcd60e51b815260206004820152600960248201526804f776e6572736869760bc1b604482015260640161093a565b6040517fe985e9c50000000000000000000000000000000000000000000000000000000081523360048201523060248201526001600160a01b0382169063e985e9c59060440160206040518083038186803b1580156117b057600080fd5b505afa1580156117c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e8919061409f565b6118345760405162461bcd60e51b815260206004820152600e60248201527f7472616e73666572207065726d73000000000000000000000000000000000000604482015260640161093a565b610b7e83836128a4565b6118483383611fa4565b6118945760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f7665640000604482015260640161093a565b6118a084848484612b66565b50505050565b60008054600160a01b900460ff161580156118ca5750600054600160a81b900460ff165b6119165760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206973206e6f74206f70656e00000000000000000000000000604482015260640161093a565b600154600d54106119695760405162461bcd60e51b815260206004820152600e60248201527f4d6178696d756d20737570706c79000000000000000000000000000000000000604482015260640161093a565b600654336000908152601a602052604090205410156119ca5760405162461bcd60e51b815260206004820152600b60248201527f6275726e20746f6b656e73000000000000000000000000000000000000000000604482015260640161093a565b6119d684868585612bd8565b60006119e53386888787612dc5565b9150505b949350505050565b6000546001600160a01b03163314611a505760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600e60205260409020546060906001600160a01b0316611aff5760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a206e6f6e6578697374656e7420746f6b6560448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b6000611b09612e20565b90506000815111611b295760405180602001604052806000815250611b54565b80611b3384612e2f565b604051602001611b449291906140bc565b6040516020818303038152906040525b9392505050565b6000818152601460209081526040808320601583528184206016909352922082546060938493849391929091908390611b9390614012565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbf90614012565b8015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b50505050509250818054611c1f90614012565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4b90614012565b8015611c985780601f10611c6d57610100808354040283529160200191611c98565b820191906000526020600020905b815481529060010190602001808311611c7b57829003601f168201915b50505050509150808054611cab90614012565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd790614012565b8015611d245780601f10611cf957610100808354040283529160200191611d24565b820191906000526020600020905b815481529060010190602001808311611d0757829003601f168201915b505050505090509250925092509193909250565b6000546001600160a01b03163314611d975760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600355565b6000546001600160a01b03163314611dfb5760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b80471015611e0857600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610b7e573d6000803e3d6000fd5b6000546001600160a01b03163314611e9d5760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b6001600160a01b038116611eb057600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611f315760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600a55565b600081815260106020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f6b826111a4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600e60205260408120546001600160a01b03166120085760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161093a565b6000612013836111a4565b9050806001600160a01b0316846001600160a01b0316148061204e5750836001600160a01b0316612043846109f7565b6001600160a01b0316145b806119e957506001600160a01b0380821660009081526011602090815260408083209388168352929052205460ff166119e9565b826001600160a01b0316612095826111a4565b6001600160a01b0316146120eb5760405162461bcd60e51b815260206004820152600f60248201527f4552433732313a206e6f74206f776e0000000000000000000000000000000000604482015260640161093a565b6001600160a01b0382166121415760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f2061646472657373000000000000000000000000604482015260640161093a565b61214c600082611f36565b6001600160a01b0383166000908152600f60205260408120805460019290612175908490614101565b90915550506001600160a01b0382166000908152600f602052604081208054600192906121a3908490614118565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600054600160a01b900460ff1661225d5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161093a565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6019836040516122d59190614066565b9081526040519081900360200190205460ff161561231f5760405162461bcd60e51b8152602060048201526007602482015266125b5859d9525160ca1b604482015260640161093a565b60188460405161232f9190614066565b9081526040519081900360200190205460ff161561238f5760405162461bcd60e51b815260206004820152600960248201527f4950465320686173680000000000000000000000000000000000000000000000604482015260640161093a565b600254855111156123cb5760405162461bcd60e51b815260040161093a906020808252600490820152634e616d6560e01b604082015260600190565b6003543410156124055760405162461bcd60e51b815260206004820152600560248201526476616c756560d81b604482015260640161093a565b61240f8582612f61565b61245b5760405162461bcd60e51b815260206004820152600e60248201527f6e616d6520707572636861736564000000000000000000000000000000000000604482015260640161093a565b61246784848785612fa6565b610fa35760405162461bcd60e51b815260206004820152600960248201527f5369676e61747572650000000000000000000000000000000000000000000000604482015260640161093a565b600085815260146020526040812080546124cc90614012565b80601f01602080910402602001604051908101604052809291908181526020018280546124f890614012565b80156125455780601f1061251a57610100808354040283529160200191612545565b820191906000526020600020905b81548152906001019060200180831161252857829003601f168201915b50505050509050600060156000888152602001908152602001600020805461256c90614012565b80601f016020809104026020016040519081016040528092919081815260200182805461259890614012565b80156125e55780601f106125ba576101008083540402835291602001916125e5565b820191906000526020600020905b8154815290600101906020018083116125c857829003601f168201915b50505050509050600060166000898152602001908152602001600020805461260c90614012565b80601f016020809104026020016040519081016040528092919081815260200182805461263890614012565b80156126855780601f1061265a57610100808354040283529160200191612685565b820191906000526020600020905b81548152906001019060200180831161266857829003601f168201915b50505050509050612699868887878c613077565b7f8a82bb3d9fc2e751a6ea5817c6f91dba9b5065061f1adbbb84a87a09b5b48de03389858a868b878c6040516126d6989796959493929190614130565b60405180910390a15050505050505050565b600054600160a01b900460ff16156127425760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161093a565b600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16760100000000000000000000000000000000000000000000179055565b600054600160a01b900460ff16156127df5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161093a565b6000805460ff60a81b1916600160a81b179055565b600054600160a01b900460ff161561284e5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161093a565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122a83390565b600754600554604051632142170760e11b81523360048201526001600160a01b039182166024820152604481018590529116906342842e0e90606401600060405180830381600087803b1580156128fa57600080fd5b505af115801561290e573d6000803e3d6000fd5b5050600754600554604051632142170760e11b81523360048201526001600160a01b03918216602482015260448101869052911692506342842e0e9150606401600060405180830381600087803b15801561296857600080fd5b505af115801561297c573d6000803e3d6000fd5b505060075460405163cc33c87560e01b815260048101869052600093506001600160a01b03909116915063cc33c8759060240160006040518083038186803b1580156129c757600080fd5b505afa1580156129db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a039190810190614211565b5060075460405163cc33c87560e01b815260048101869052919350600092506001600160a01b03169063cc33c8759060240160006040518083038186803b158015612a4d57600080fd5b505afa158015612a61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a899190810190614211565b50336000908152601b60205260409081902090519193506001925090612ab0908590614066565b9081526040805160209281900383018120805460ff191694151594909417909355336000908152601b9092529020600191612aec908490614066565b9081526040805160209281900383019020805460ff191693151593909317909255336000908152601a909152908120805460019290612b2c908490614118565b90915550506040518390859033907f49995e5dd6158cf69ad3e9777c46755a1a826a446c6416992167462dad033b2a90600090a450505050565b612b71848484612082565b612b7d84848484613203565b6118a05760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b606482015260840161093a565b601982604051612be89190614066565b9081526040519081900360200190205460ff1615612c325760405162461bcd60e51b8152602060048201526007602482015266125b5859d9525160ca1b604482015260640161093a565b601883604051612c429190614066565b9081526040519081900360200190205460ff1615612ca25760405162461bcd60e51b815260206004820152600960248201527f4950465320686173680000000000000000000000000000000000000000000000604482015260640161093a565b60025484511115612cde5760405162461bcd60e51b815260040161093a906020808252600490820152634e616d6560e01b604082015260600190565b600354341015612d185760405162461bcd60e51b815260206004820152600560248201526476616c756560d81b604482015260640161093a565b612d218461334c565b612d6d5760405162461bcd60e51b815260206004820152600e60248201527f6e616d6520707572636861736564000000000000000000000000000000000000604482015260640161093a565b612d7983838684612fa6565b6118a05760405162461bcd60e51b815260206004820152600960248201527f5369676e61747572650000000000000000000000000000000000000000000000604482015260640161093a565b600080600d546001612dd79190614118565b9050612de3878261345b565b612df08686868685613077565b336000908152601a60205260408120805460019290612e10908490614101565b9091555090979650505050505050565b60606009805461097490614012565b606081612e6f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612e995780612e8381614299565b9150612e929050600a836142ca565b9150612e73565b60008167ffffffffffffffff811115612eb457612eb4613bf9565b6040519080825280601f01601f191660200182016040528015612ede576020820181803683370190505b5090505b84156119e957612ef3600183614101565b9150612f00600a866142de565b612f0b906030614118565b60f81b818381518110612f2057612f206142f2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f5a600a866142ca565b9450612ee2565b6000818152601c60205260408082209051612f7d908590614066565b9081526040519081900360200190205460ff1615612f9d575060016108d9565b611b548361334c565b6000601782604051612fb89190614066565b9081526040519081900360200190205460ff1615612fd8575060006119e9565b6000613006858786604051602001612ff293929190614308565b604051602081830303815290604052613475565b9050600061301482856134b0565b6004549091506001600160a01b03808316911614613037576000925050506119e9565b60016017856040516130499190614066565b908152604051908190036020019020805491151560ff19909216919091179055506001915050949350505050565b60016012866040516130899190614066565b908152604051908190036020018120805492151560ff19909316929092179091556001906017906130bb908590614066565b908152604051908190036020018120805492151560ff19909316929092179091556001906019906130ed908690614066565b908152604051908190036020018120805492151560ff199093169290921790915560019060189061311f908790614066565b9081526040805160209281900383018120805460ff1916941515949094179093556000848152601c909252902060019161315a908890614066565b908152604051908190036020018120805492151560ff1990931692909217909155819060139061318b908890614066565b9081526040805160209281900383019020929092556000838152601482529190912085516131bb92870190613a0a565b50600081815260156020908152604090912086516131db92880190613a0a565b50600081815260166020908152604090912084516131fb92860190613a0a565b505050505050565b60006001600160a01b0384163b1561334457604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061324790339089908890889060040161434b565b602060405180830381600087803b15801561326157600080fd5b505af1925050508015613291575060408051601f3d908101601f1916820190925261328e9181019061437d565b60015b61332a573d8080156132bf576040519150601f19603f3d011682016040523d82523d6000602084013e6132c4565b606091505b5080516133225760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b606482015260840161093a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119e9565b5060016119e9565b600060128260405161335e9190614066565b9081526040519081900360200190205460ff161561337e57506000919050565b6007546040517f8460dd080000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690638460dd08906133c7908590600401613b60565b60206040518083038186803b1580156133df57600080fd5b505afa1580156133f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613417919061404d565b1561345357336000908152601b602052604090819020905161343a908490614066565b9081526040519081900360200190205460ff1692915050565b506001919050565b6111048282604051806020016040528060008152506134d4565b60006134818251612e2f565b8260405160200161349392919061439a565b604051602081830303815290604052805190602001209050919050565b60008060006134bf8585613546565b915091506134cc816135b6565b509392505050565b6134de8383613771565b6134eb6000848484613203565b610b7e5760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b606482015260840161093a565b60008082516041141561357d5760208301516040840151606085015160001a613571878285856138d5565b945094505050506135af565b8251604014156135a7576020830151604084015161359c8683836139c2565b9350935050506135af565b506000905060025b9250929050565b60008160048111156135ca576135ca6143f5565b14156135d35750565b60018160048111156135e7576135e76143f5565b14156136355760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161093a565b6002816004811115613649576136496143f5565b14156136975760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161093a565b60038160048111156136ab576136ab6143f5565b14156137045760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161093a565b6004816004811115613718576137186143f5565b14156111a15760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161093a565b6001600160a01b0382166137c75760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f2061646472657373000000000000000000000000604482015260640161093a565b6000818152600e60205260409020546001600160a01b03161561382c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161093a565b6001600160a01b0382166000908152600f60205260408120805460019290613855908490614118565b90915550506000818152600e6020526040812080546001600160a01b0319166001600160a01b038516179055600d805460019290613894908490614118565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561390c57506000905060036139b9565b8460ff16601b1415801561392457508460ff16601c14155b1561393557506000905060046139b9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613989573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166139b2576000600192509250506139b9565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016139fc878288856138d5565b935093505050935093915050565b828054613a1690614012565b90600052602060002090601f016020900481019282613a385760008555613a7e565b82601f10613a5157805160ff1916838001178555613a7e565b82800160010185558215613a7e579182015b82811115613a7e578251825591602001919060010190613a63565b50613a8a929150613a8e565b5090565b5b80821115613a8a5760008155600101613a8f565b6001600160e01b0319811681146111a157600080fd5b600060208284031215613acb57600080fd5b8135611b5481613aa3565b6001600160a01b03811681146111a157600080fd5b600060208284031215613afd57600080fd5b8135611b5481613ad6565b60005b83811015613b23578181015183820152602001613b0b565b838111156118a05750506000910152565b60008151808452613b4c816020860160208601613b08565b601f01601f19169290920160200192915050565b602081526000611b546020830184613b34565b600060208284031215613b8557600080fd5b5035919050565b60008060408385031215613b9f57600080fd5b8235613baa81613ad6565b946020939093013593505050565b600080600060608486031215613bcd57600080fd5b8335613bd881613ad6565b92506020840135613be881613ad6565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613c3857613c38613bf9565b604052919050565b600067ffffffffffffffff821115613c5a57613c5a613bf9565b50601f01601f191660200190565b600082601f830112613c7957600080fd5b8135613c8c613c8782613c40565b613c0f565b818152846020838601011115613ca157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613cd657600080fd5b85359450602086013567ffffffffffffffff80821115613cf557600080fd5b613d0189838a01613c68565b95506040880135915080821115613d1757600080fd5b613d2389838a01613c68565b94506060880135915080821115613d3957600080fd5b613d4589838a01613c68565b93506080880135915080821115613d5b57600080fd5b50613d6888828901613c68565b9150509295509295909350565b600060208284031215613d8757600080fd5b813567ffffffffffffffff811115613d9e57600080fd5b6119e984828501613c68565b60008060408385031215613dbd57600080fd5b8235613dc881613ad6565b9150602083013567ffffffffffffffff811115613de457600080fd5b613df085828601613c68565b9150509250929050565b80151581146111a157600080fd5b60008060408385031215613e1b57600080fd5b8235613e2681613ad6565b91506020830135613e3681613dfa565b809150509250929050565b60008060408385031215613e5457600080fd5b82359150602083013567ffffffffffffffff811115613de457600080fd5b60008060408385031215613e8557600080fd5b50508035926020909101359150565b60008060008060808587031215613eaa57600080fd5b8435613eb581613ad6565b93506020850135613ec581613ad6565b925060408501359150606085013567ffffffffffffffff811115613ee857600080fd5b613ef487828801613c68565b91505092959194509250565b60008060008060808587031215613f1657600080fd5b843567ffffffffffffffff80821115613f2e57600080fd5b613f3a88838901613c68565b95506020870135915080821115613f5057600080fd5b613f5c88838901613c68565b94506040870135915080821115613f7257600080fd5b613f7e88838901613c68565b93506060870135915080821115613f9457600080fd5b50613ef487828801613c68565b606081526000613fb46060830186613b34565b8281036020840152613fc68186613b34565b90508281036040840152613fda8185613b34565b9695505050505050565b60008060408385031215613ff757600080fd5b823561400281613ad6565b91506020830135613e3681613ad6565b600181811c9082168061402657607f821691505b6020821081141561404757634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561405f57600080fd5b5051919050565b60008251614078818460208701613b08565b9190910192915050565b60006020828403121561409457600080fd5b8151611b5481613ad6565b6000602082840312156140b157600080fd5b8151611b5481613dfa565b600083516140ce818460208801613b08565b8351908301906140e2818360208801613b08565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600082821015614113576141136140eb565b500390565b6000821982111561412b5761412b6140eb565b500190565b60006101006001600160a01b038b1683528960208401528060408401526141598184018a613b34565b9050828103606084015261416d8189613b34565b905082810360808401526141818188613b34565b905082810360a08401526141958187613b34565b905082810360c08401526141a98186613b34565b905082810360e08401526141bd8185613b34565b9b9a5050505050505050505050565b600082601f8301126141dd57600080fd5b81516141eb613c8782613c40565b81815284602083860101111561420057600080fd5b6119e9826020830160208701613b08565b60008060006060848603121561422657600080fd5b835167ffffffffffffffff8082111561423e57600080fd5b61424a878388016141cc565b9450602086015191508082111561426057600080fd5b61426c878388016141cc565b9350604086015191508082111561428257600080fd5b5061428f868287016141cc565b9150509250925092565b60006000198214156142ad576142ad6140eb565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826142d9576142d96142b4565b500490565b6000826142ed576142ed6142b4565b500690565b634e487b7160e01b600052603260045260246000fd5b6000845161431a818460208901613b08565b84519083019061432e818360208901613b08565b8451910190614341818360208801613b08565b0195945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613fda6080830184613b34565b60006020828403121561438f57600080fd5b8151611b5481613aa3565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516143d281601a850160208801613b08565b8351908301906143e981601a840160208801613b08565b01601a01949350505050565b634e487b7160e01b600052602160045260246000fdfe4f6e6c792074686520636f6e7472616374206f776e6572206d61792063616c6ca26469706673582212202ffcd6eddbef9504bd86c5f9489b1103c50eec240578f32ee63d5c2e108e05c464736f6c6343000809003368747470733a2f2f6172742d61692e636f6d2f6170692f67656e322f6d657461646174612f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000006417274414932000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064152544149320000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102e75760003560e01c80638460dd0811610184578063be8efe22116100d6578063d5abeb011161008a578063e985e9c511610064578063e985e9c5146107b9578063f2fde38b14610802578063f729810c1461082257600080fd5b8063d5abeb0114610763578063d729666214610779578063e465f1f51461079957600080fd5b8063c87b56dd116100bb578063c87b56dd146106de578063cc33c875146106fe578063cc8fef891461072d57600080fd5b8063be8efe22146106ab578063c45bed24146106be57600080fd5b8063a22cb46511610138578063b390c0ab11610112578063b390c0ab14610655578063b88d4fde14610675578063bc969e321461069557600080fd5b8063a22cb465146105ff578063a7fcb40a1461061f578063ae76e8fb1461063f57600080fd5b80638da5cb5b116101695780638da5cb5b146105ac57806395d89b41146105ca5780639888d9c1146105df57600080fd5b80638460dd081461057757806387491c601461059757600080fd5b806345b908091161023d5780635fd8c710116101f15780636ba9fd38116101cb5780636ba9fd381461052d57806370a08231146105425780638456cb591461056257600080fd5b80635fd8c710146104e2578063629b05f0146104f75780636352211e1461050d57600080fd5b80634b36df53116102225780634b36df531461048357806355f804b3146104a35780635c975abb146104c357600080fd5b806345b908091461045b5780634aed03871461046e57600080fd5b80630d7982ad1161029f57806323b872dd1161027957806323b872dd146104065780633f4ba83a1461042657806342842e0e1461043b57600080fd5b80630d7982ad146103bd578063105e1c70146103d257806318160ddd146103e757600080fd5b806306fdde03116102d057806306fdde0314610343578063081812fc14610365578063095ea7b31461039d57600080fd5b806301ffc9a7146102ec578063068d4fcc14610321575b600080fd5b3480156102f857600080fd5b5061030c610307366004613ab9565b610842565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b5061034161033c366004613aeb565b6108df565b005b34801561034f57600080fd5b50610358610965565b6040516103189190613b60565b34801561037157600080fd5b50610385610380366004613b73565b6109f7565b6040516001600160a01b039091168152602001610318565b3480156103a957600080fd5b506103416103b8366004613b8c565b610a77565b3480156103c957600080fd5b50610341610b83565b3480156103de57600080fd5b50610341610bfc565b3480156103f357600080fd5b506001545b604051908152602001610318565b34801561041257600080fd5b50610341610421366004613bb8565b610c88565b34801561043257600080fd5b50610341610ce9565b34801561044757600080fd5b50610341610456366004613bb8565b610d50565b610341610469366004613cbe565b610d6b565b34801561047a57600080fd5b50610341610faa565b34801561048f57600080fd5b5061034161049e366004613aeb565b611011565b3480156104af57600080fd5b506103416104be366004613d75565b611092565b3480156104cf57600080fd5b50600054600160a01b900460ff1661030c565b3480156104ee57600080fd5b50610341611108565b34801561050357600080fd5b506103f8600d5481565b34801561051957600080fd5b50610385610528366004613b73565b6111a4565b34801561053957600080fd5b50610341611209565b34801561054e57600080fd5b506103f861055d366004613aeb565b611270565b34801561056e57600080fd5b506103416112e4565b34801561058357600080fd5b506103f8610592366004613d75565b61134b565b3480156105a357600080fd5b50610341611373565b3480156105b857600080fd5b506000546001600160a01b0316610385565b3480156105d657600080fd5b506103586113e4565b3480156105eb57600080fd5b5061030c6105fa366004613daa565b6113f3565b34801561060b57600080fd5b5061034161061a366004613e08565b611434565b34801561062b57600080fd5b5061030c61063a366004613e41565b6114f9565b34801561064b57600080fd5b506103f860035481565b34801561066157600080fd5b50610341610670366004613e72565b611515565b34801561068157600080fd5b50610341610690366004613e94565b61183e565b3480156106a157600080fd5b506103f8600a5481565b6103f86106b9366004613f00565b6118a6565b3480156106ca57600080fd5b506103416106d9366004613aeb565b6119f1565b3480156106ea57600080fd5b506103586106f9366004613b73565b611a72565b34801561070a57600080fd5b5061071e610719366004613b73565b611b5b565b60405161031893929190613fa1565b34801561073957600080fd5b506103f8610748366004613aeb565b6001600160a01b03166000908152601a602052604090205490565b34801561076f57600080fd5b506103f860015481565b34801561078557600080fd5b50610341610794366004613b73565b611d38565b3480156107a557600080fd5b506103416107b4366004613b8c565b611d9c565b3480156107c557600080fd5b5061030c6107d4366004613fe4565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205460ff1690565b34801561080e57600080fd5b5061034161081d366004613aeb565b611e3e565b34801561082e57600080fd5b5061034161083d366004613b73565b611ed2565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806108a557506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108d957507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6000546001600160a01b031633146109435760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b60648201526084015b60405180910390fd5b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6060600b805461097490614012565b80601f01602080910402602001604051908101604052809291908181526020018280546109a090614012565b80156109ed5780601f106109c2576101008083540402835291602001916109ed565b820191906000526020600020905b8154815290600101906020018083116109d057829003601f168201915b5050505050905090565b6000818152600e60205260408120546001600160a01b0316610a5b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161093a565b506000908152601060205260409020546001600160a01b031690565b6000610a82826111a4565b9050806001600160a01b0316836001600160a01b03161415610ae65760405162461bcd60e51b815260206004820152601560248201527f4552433732313a2063757272656e74206f776e65720000000000000000000000604482015260640161093a565b336001600160a01b0382161480610b025750610b0281336107d4565b610b745760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161093a565b610b7e8383611f36565b505050565b6000546001600160a01b03163314610be25760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600d54600155610bfa6000805460ff60a81b19169055565b565b6000546001600160a01b03163314610c5b5760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff169055565b610c923382611fa4565b610cde5760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f7665640000604482015260640161093a565b610b7e838383612082565b6000546001600160a01b03163314610d485760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa612204565b610b7e8383836040518060200160405280600081525061183e565b600054600160a01b900460ff16158015610da15750600054760100000000000000000000000000000000000000000000900460ff165b610ded5760405162461bcd60e51b815260206004820152601560248201527f457874656e64696e67206973206e6f74206f70656e0000000000000000000000604482015260640161093a565b33610df7866111a4565b6001600160a01b031614610e395760405162461bcd60e51b815260206004820152600960248201526804f776e6572736869760bc1b604482015260640161093a565b6007546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610e7d57600080fd5b505afa158015610e91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb5919061404d565b1180610f3d5750600a546008546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610f0257600080fd5b505afa158015610f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3a919061404d565b10155b610f895760405162461bcd60e51b815260206004820152600760248201527f42616c616e636500000000000000000000000000000000000000000000000000604482015260640161093a565b610f9683858484896122c5565b610fa385858585856124b3565b5050505050565b6000546001600160a01b031633146110095760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa6126e8565b6000546001600160a01b031633146110705760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146110f15760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b8051611104906009906020840190613a0a565b5050565b6000546001600160a01b031633146111675760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f193505050501580156111a1573d6000803e3d6000fd5b50565b6000818152600e60205260408120546001600160a01b0316806108d95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161093a565b6000546001600160a01b031633146112685760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa612785565b60006001600160a01b0382166112c85760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f2061646472657373000000000000000000000000604482015260640161093a565b506001600160a01b03166000908152600f602052604090205490565b6000546001600160a01b031633146113435760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa6127f4565b600060138260405161135d9190614066565b9081526020016040518091039020549050919050565b6000546001600160a01b031633146113d25760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b610bfa6000805460ff60a81b19169055565b6060600c805461097490614012565b6001600160a01b0382166000908152601b60205260408082209051611419908490614066565b9081526040519081900360200190205460ff16905092915050565b6001600160a01b03821633141561148d5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161093a565b3360008181526011602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000828152601c60205260408082209051611419908490614066565b600054600160a01b900460ff161580156115385750600054600160a81b900460ff165b6115845760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206973206e6f74206f70656e00000000000000000000000000604482015260640161093a565b808214156115d45760405162461bcd60e51b815260206004820152600b60248201527f73616d6520746f6b656e73000000000000000000000000000000000000000000604482015260640161093a565b6007546040516331a9108f60e11b8152600481018490526001600160a01b039091169033908290636352211e9060240160206040518083038186803b15801561161c57600080fd5b505afa158015611630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116549190614082565b6001600160a01b0316146116965760405162461bcd60e51b815260206004820152600960248201526804f776e6572736869760bc1b604482015260640161093a565b6040516331a9108f60e11b81526004810183905233906001600160a01b03831690636352211e9060240160206040518083038186803b1580156116d857600080fd5b505afa1580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190614082565b6001600160a01b0316146117525760405162461bcd60e51b815260206004820152600960248201526804f776e6572736869760bc1b604482015260640161093a565b6040517fe985e9c50000000000000000000000000000000000000000000000000000000081523360048201523060248201526001600160a01b0382169063e985e9c59060440160206040518083038186803b1580156117b057600080fd5b505afa1580156117c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e8919061409f565b6118345760405162461bcd60e51b815260206004820152600e60248201527f7472616e73666572207065726d73000000000000000000000000000000000000604482015260640161093a565b610b7e83836128a4565b6118483383611fa4565b6118945760405162461bcd60e51b815260206004820152601e60248201527f4552433732313a206e6f74206f776e6572206e6f7220617070726f7665640000604482015260640161093a565b6118a084848484612b66565b50505050565b60008054600160a01b900460ff161580156118ca5750600054600160a81b900460ff165b6119165760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206973206e6f74206f70656e00000000000000000000000000604482015260640161093a565b600154600d54106119695760405162461bcd60e51b815260206004820152600e60248201527f4d6178696d756d20737570706c79000000000000000000000000000000000000604482015260640161093a565b600654336000908152601a602052604090205410156119ca5760405162461bcd60e51b815260206004820152600b60248201527f6275726e20746f6b656e73000000000000000000000000000000000000000000604482015260640161093a565b6119d684868585612bd8565b60006119e53386888787612dc5565b9150505b949350505050565b6000546001600160a01b03163314611a505760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600e60205260409020546060906001600160a01b0316611aff5760405162461bcd60e51b815260206004820152602160248201527f4552433732314d657461646174613a206e6f6e6578697374656e7420746f6b6560448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015260840161093a565b6000611b09612e20565b90506000815111611b295760405180602001604052806000815250611b54565b80611b3384612e2f565b604051602001611b449291906140bc565b6040516020818303038152906040525b9392505050565b6000818152601460209081526040808320601583528184206016909352922082546060938493849391929091908390611b9390614012565b80601f0160208091040260200160405190810160405280929190818152602001828054611bbf90614012565b8015611c0c5780601f10611be157610100808354040283529160200191611c0c565b820191906000526020600020905b815481529060010190602001808311611bef57829003601f168201915b50505050509250818054611c1f90614012565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4b90614012565b8015611c985780601f10611c6d57610100808354040283529160200191611c98565b820191906000526020600020905b815481529060010190602001808311611c7b57829003601f168201915b50505050509150808054611cab90614012565b80601f0160208091040260200160405190810160405280929190818152602001828054611cd790614012565b8015611d245780601f10611cf957610100808354040283529160200191611d24565b820191906000526020600020905b815481529060010190602001808311611d0757829003601f168201915b505050505090509250925092509193909250565b6000546001600160a01b03163314611d975760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600355565b6000546001600160a01b03163314611dfb5760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b80471015611e0857600080fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610b7e573d6000803e3d6000fd5b6000546001600160a01b03163314611e9d5760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b6001600160a01b038116611eb057600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611f315760405162461bcd60e51b815260206004820152602e602482015260008051602061440c83398151915260448201526d103a3434b990333ab731ba34b7b760911b606482015260840161093a565b600a55565b600081815260106020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f6b826111a4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600e60205260408120546001600160a01b03166120085760405162461bcd60e51b815260206004820152601960248201527f4552433732313a206e6f6e6578697374656e7420746f6b656e00000000000000604482015260640161093a565b6000612013836111a4565b9050806001600160a01b0316846001600160a01b0316148061204e5750836001600160a01b0316612043846109f7565b6001600160a01b0316145b806119e957506001600160a01b0380821660009081526011602090815260408083209388168352929052205460ff166119e9565b826001600160a01b0316612095826111a4565b6001600160a01b0316146120eb5760405162461bcd60e51b815260206004820152600f60248201527f4552433732313a206e6f74206f776e0000000000000000000000000000000000604482015260640161093a565b6001600160a01b0382166121415760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f2061646472657373000000000000000000000000604482015260640161093a565b61214c600082611f36565b6001600160a01b0383166000908152600f60205260408120805460019290612175908490614101565b90915550506001600160a01b0382166000908152600f602052604081208054600192906121a3908490614118565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600054600160a01b900460ff1661225d5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161093a565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6019836040516122d59190614066565b9081526040519081900360200190205460ff161561231f5760405162461bcd60e51b8152602060048201526007602482015266125b5859d9525160ca1b604482015260640161093a565b60188460405161232f9190614066565b9081526040519081900360200190205460ff161561238f5760405162461bcd60e51b815260206004820152600960248201527f4950465320686173680000000000000000000000000000000000000000000000604482015260640161093a565b600254855111156123cb5760405162461bcd60e51b815260040161093a906020808252600490820152634e616d6560e01b604082015260600190565b6003543410156124055760405162461bcd60e51b815260206004820152600560248201526476616c756560d81b604482015260640161093a565b61240f8582612f61565b61245b5760405162461bcd60e51b815260206004820152600e60248201527f6e616d6520707572636861736564000000000000000000000000000000000000604482015260640161093a565b61246784848785612fa6565b610fa35760405162461bcd60e51b815260206004820152600960248201527f5369676e61747572650000000000000000000000000000000000000000000000604482015260640161093a565b600085815260146020526040812080546124cc90614012565b80601f01602080910402602001604051908101604052809291908181526020018280546124f890614012565b80156125455780601f1061251a57610100808354040283529160200191612545565b820191906000526020600020905b81548152906001019060200180831161252857829003601f168201915b50505050509050600060156000888152602001908152602001600020805461256c90614012565b80601f016020809104026020016040519081016040528092919081815260200182805461259890614012565b80156125e55780601f106125ba576101008083540402835291602001916125e5565b820191906000526020600020905b8154815290600101906020018083116125c857829003601f168201915b50505050509050600060166000898152602001908152602001600020805461260c90614012565b80601f016020809104026020016040519081016040528092919081815260200182805461263890614012565b80156126855780601f1061265a57610100808354040283529160200191612685565b820191906000526020600020905b81548152906001019060200180831161266857829003601f168201915b50505050509050612699868887878c613077565b7f8a82bb3d9fc2e751a6ea5817c6f91dba9b5065061f1adbbb84a87a09b5b48de03389858a868b878c6040516126d6989796959493929190614130565b60405180910390a15050505050505050565b600054600160a01b900460ff16156127425760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161093a565b600080547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16760100000000000000000000000000000000000000000000179055565b600054600160a01b900460ff16156127df5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161093a565b6000805460ff60a81b1916600160a81b179055565b600054600160a01b900460ff161561284e5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161093a565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122a83390565b600754600554604051632142170760e11b81523360048201526001600160a01b039182166024820152604481018590529116906342842e0e90606401600060405180830381600087803b1580156128fa57600080fd5b505af115801561290e573d6000803e3d6000fd5b5050600754600554604051632142170760e11b81523360048201526001600160a01b03918216602482015260448101869052911692506342842e0e9150606401600060405180830381600087803b15801561296857600080fd5b505af115801561297c573d6000803e3d6000fd5b505060075460405163cc33c87560e01b815260048101869052600093506001600160a01b03909116915063cc33c8759060240160006040518083038186803b1580156129c757600080fd5b505afa1580156129db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a039190810190614211565b5060075460405163cc33c87560e01b815260048101869052919350600092506001600160a01b03169063cc33c8759060240160006040518083038186803b158015612a4d57600080fd5b505afa158015612a61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a899190810190614211565b50336000908152601b60205260409081902090519193506001925090612ab0908590614066565b9081526040805160209281900383018120805460ff191694151594909417909355336000908152601b9092529020600191612aec908490614066565b9081526040805160209281900383019020805460ff191693151593909317909255336000908152601a909152908120805460019290612b2c908490614118565b90915550506040518390859033907f49995e5dd6158cf69ad3e9777c46755a1a826a446c6416992167462dad033b2a90600090a450505050565b612b71848484612082565b612b7d84848484613203565b6118a05760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b606482015260840161093a565b601982604051612be89190614066565b9081526040519081900360200190205460ff1615612c325760405162461bcd60e51b8152602060048201526007602482015266125b5859d9525160ca1b604482015260640161093a565b601883604051612c429190614066565b9081526040519081900360200190205460ff1615612ca25760405162461bcd60e51b815260206004820152600960248201527f4950465320686173680000000000000000000000000000000000000000000000604482015260640161093a565b60025484511115612cde5760405162461bcd60e51b815260040161093a906020808252600490820152634e616d6560e01b604082015260600190565b600354341015612d185760405162461bcd60e51b815260206004820152600560248201526476616c756560d81b604482015260640161093a565b612d218461334c565b612d6d5760405162461bcd60e51b815260206004820152600e60248201527f6e616d6520707572636861736564000000000000000000000000000000000000604482015260640161093a565b612d7983838684612fa6565b6118a05760405162461bcd60e51b815260206004820152600960248201527f5369676e61747572650000000000000000000000000000000000000000000000604482015260640161093a565b600080600d546001612dd79190614118565b9050612de3878261345b565b612df08686868685613077565b336000908152601a60205260408120805460019290612e10908490614101565b9091555090979650505050505050565b60606009805461097490614012565b606081612e6f57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612e995780612e8381614299565b9150612e929050600a836142ca565b9150612e73565b60008167ffffffffffffffff811115612eb457612eb4613bf9565b6040519080825280601f01601f191660200182016040528015612ede576020820181803683370190505b5090505b84156119e957612ef3600183614101565b9150612f00600a866142de565b612f0b906030614118565b60f81b818381518110612f2057612f206142f2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612f5a600a866142ca565b9450612ee2565b6000818152601c60205260408082209051612f7d908590614066565b9081526040519081900360200190205460ff1615612f9d575060016108d9565b611b548361334c565b6000601782604051612fb89190614066565b9081526040519081900360200190205460ff1615612fd8575060006119e9565b6000613006858786604051602001612ff293929190614308565b604051602081830303815290604052613475565b9050600061301482856134b0565b6004549091506001600160a01b03808316911614613037576000925050506119e9565b60016017856040516130499190614066565b908152604051908190036020019020805491151560ff19909216919091179055506001915050949350505050565b60016012866040516130899190614066565b908152604051908190036020018120805492151560ff19909316929092179091556001906017906130bb908590614066565b908152604051908190036020018120805492151560ff19909316929092179091556001906019906130ed908690614066565b908152604051908190036020018120805492151560ff199093169290921790915560019060189061311f908790614066565b9081526040805160209281900383018120805460ff1916941515949094179093556000848152601c909252902060019161315a908890614066565b908152604051908190036020018120805492151560ff1990931692909217909155819060139061318b908890614066565b9081526040805160209281900383019020929092556000838152601482529190912085516131bb92870190613a0a565b50600081815260156020908152604090912086516131db92880190613a0a565b50600081815260166020908152604090912084516131fb92860190613a0a565b505050505050565b60006001600160a01b0384163b1561334457604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061324790339089908890889060040161434b565b602060405180830381600087803b15801561326157600080fd5b505af1925050508015613291575060408051601f3d908101601f1916820190925261328e9181019061437d565b60015b61332a573d8080156132bf576040519150601f19603f3d011682016040523d82523d6000602084013e6132c4565b606091505b5080516133225760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b606482015260840161093a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506119e9565b5060016119e9565b600060128260405161335e9190614066565b9081526040519081900360200190205460ff161561337e57506000919050565b6007546040517f8460dd080000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690638460dd08906133c7908590600401613b60565b60206040518083038186803b1580156133df57600080fd5b505afa1580156133f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613417919061404d565b1561345357336000908152601b602052604090819020905161343a908490614066565b9081526040519081900360200190205460ff1692915050565b506001919050565b6111048282604051806020016040528060008152506134d4565b60006134818251612e2f565b8260405160200161349392919061439a565b604051602081830303815290604052805190602001209050919050565b60008060006134bf8585613546565b915091506134cc816135b6565b509392505050565b6134de8383613771565b6134eb6000848484613203565b610b7e5760405162461bcd60e51b815260206004820152602660248201527f4552433732313a206e6f6e20455243373231526563656976657220696d706c6560448201526536b2b73a32b960d11b606482015260840161093a565b60008082516041141561357d5760208301516040840151606085015160001a613571878285856138d5565b945094505050506135af565b8251604014156135a7576020830151604084015161359c8683836139c2565b9350935050506135af565b506000905060025b9250929050565b60008160048111156135ca576135ca6143f5565b14156135d35750565b60018160048111156135e7576135e76143f5565b14156136355760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161093a565b6002816004811115613649576136496143f5565b14156136975760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161093a565b60038160048111156136ab576136ab6143f5565b14156137045760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161093a565b6004816004811115613718576137186143f5565b14156111a15760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161093a565b6001600160a01b0382166137c75760405162461bcd60e51b815260206004820152601460248201527f4552433732313a207a65726f2061646472657373000000000000000000000000604482015260640161093a565b6000818152600e60205260409020546001600160a01b03161561382c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161093a565b6001600160a01b0382166000908152600f60205260408120805460019290613855908490614118565b90915550506000818152600e6020526040812080546001600160a01b0319166001600160a01b038516179055600d805460019290613894908490614118565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561390c57506000905060036139b9565b8460ff16601b1415801561392457508460ff16601c14155b1561393557506000905060046139b9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613989573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166139b2576000600192509250506139b9565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831660ff84901c601b016139fc878288856138d5565b935093505050935093915050565b828054613a1690614012565b90600052602060002090601f016020900481019282613a385760008555613a7e565b82601f10613a5157805160ff1916838001178555613a7e565b82800160010185558215613a7e579182015b82811115613a7e578251825591602001919060010190613a63565b50613a8a929150613a8e565b5090565b5b80821115613a8a5760008155600101613a8f565b6001600160e01b0319811681146111a157600080fd5b600060208284031215613acb57600080fd5b8135611b5481613aa3565b6001600160a01b03811681146111a157600080fd5b600060208284031215613afd57600080fd5b8135611b5481613ad6565b60005b83811015613b23578181015183820152602001613b0b565b838111156118a05750506000910152565b60008151808452613b4c816020860160208601613b08565b601f01601f19169290920160200192915050565b602081526000611b546020830184613b34565b600060208284031215613b8557600080fd5b5035919050565b60008060408385031215613b9f57600080fd5b8235613baa81613ad6565b946020939093013593505050565b600080600060608486031215613bcd57600080fd5b8335613bd881613ad6565b92506020840135613be881613ad6565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613c3857613c38613bf9565b604052919050565b600067ffffffffffffffff821115613c5a57613c5a613bf9565b50601f01601f191660200190565b600082601f830112613c7957600080fd5b8135613c8c613c8782613c40565b613c0f565b818152846020838601011115613ca157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215613cd657600080fd5b85359450602086013567ffffffffffffffff80821115613cf557600080fd5b613d0189838a01613c68565b95506040880135915080821115613d1757600080fd5b613d2389838a01613c68565b94506060880135915080821115613d3957600080fd5b613d4589838a01613c68565b93506080880135915080821115613d5b57600080fd5b50613d6888828901613c68565b9150509295509295909350565b600060208284031215613d8757600080fd5b813567ffffffffffffffff811115613d9e57600080fd5b6119e984828501613c68565b60008060408385031215613dbd57600080fd5b8235613dc881613ad6565b9150602083013567ffffffffffffffff811115613de457600080fd5b613df085828601613c68565b9150509250929050565b80151581146111a157600080fd5b60008060408385031215613e1b57600080fd5b8235613e2681613ad6565b91506020830135613e3681613dfa565b809150509250929050565b60008060408385031215613e5457600080fd5b82359150602083013567ffffffffffffffff811115613de457600080fd5b60008060408385031215613e8557600080fd5b50508035926020909101359150565b60008060008060808587031215613eaa57600080fd5b8435613eb581613ad6565b93506020850135613ec581613ad6565b925060408501359150606085013567ffffffffffffffff811115613ee857600080fd5b613ef487828801613c68565b91505092959194509250565b60008060008060808587031215613f1657600080fd5b843567ffffffffffffffff80821115613f2e57600080fd5b613f3a88838901613c68565b95506020870135915080821115613f5057600080fd5b613f5c88838901613c68565b94506040870135915080821115613f7257600080fd5b613f7e88838901613c68565b93506060870135915080821115613f9457600080fd5b50613ef487828801613c68565b606081526000613fb46060830186613b34565b8281036020840152613fc68186613b34565b90508281036040840152613fda8185613b34565b9695505050505050565b60008060408385031215613ff757600080fd5b823561400281613ad6565b91506020830135613e3681613ad6565b600181811c9082168061402657607f821691505b6020821081141561404757634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561405f57600080fd5b5051919050565b60008251614078818460208701613b08565b9190910192915050565b60006020828403121561409457600080fd5b8151611b5481613ad6565b6000602082840312156140b157600080fd5b8151611b5481613dfa565b600083516140ce818460208801613b08565b8351908301906140e2818360208801613b08565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b600082821015614113576141136140eb565b500390565b6000821982111561412b5761412b6140eb565b500190565b60006101006001600160a01b038b1683528960208401528060408401526141598184018a613b34565b9050828103606084015261416d8189613b34565b905082810360808401526141818188613b34565b905082810360a08401526141958187613b34565b905082810360c08401526141a98186613b34565b905082810360e08401526141bd8185613b34565b9b9a5050505050505050505050565b600082601f8301126141dd57600080fd5b81516141eb613c8782613c40565b81815284602083860101111561420057600080fd5b6119e9826020830160208701613b08565b60008060006060848603121561422657600080fd5b835167ffffffffffffffff8082111561423e57600080fd5b61424a878388016141cc565b9450602086015191508082111561426057600080fd5b61426c878388016141cc565b9350604086015191508082111561428257600080fd5b5061428f868287016141cc565b9150509250925092565b60006000198214156142ad576142ad6140eb565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826142d9576142d96142b4565b500490565b6000826142ed576142ed6142b4565b500690565b634e487b7160e01b600052603260045260246000fd5b6000845161431a818460208901613b08565b84519083019061432e818360208901613b08565b8451910190614341818360208801613b08565b0195945050505050565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613fda6080830184613b34565b60006020828403121561438f57600080fd5b8151611b5481613aa3565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516143d281601a850160208801613b08565b8351908301906143e981601a840160208801613b08565b01601a01949350505050565b634e487b7160e01b600052602160045260246000fdfe4f6e6c792074686520636f6e7472616374206f776e6572206d61792063616c6ca26469706673582212202ffcd6eddbef9504bd86c5f9489b1103c50eec240578f32ee63d5c2e108e05c464736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000006417274414932000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064152544149320000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): ArtAI2
Arg [1] : symbol_ (string): ARTAI2

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [3] : 4172744149320000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4152544149320000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

37216:25274:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50466:355;;;;;;;;;;-1:-1:-1;50466:355:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;50466:355:0;;;;;;;;41510:107;;;;;;;;;;-1:-1:-1;41510:107:0;;;;;:::i;:::-;;:::i;:::-;;51523:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;53162:252::-;;;;;;;;;;-1:-1:-1;53162:252:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2149:55:1;;;2131:74;;2119:2;2104:18;53162:252:0;1985:226:1;52698:398:0;;;;;;;;;;-1:-1:-1;52698:398:0;;;;;:::i;:::-;;:::i;42367:111::-;;;;;;;;;;;;;:::i;26101:81::-;;;;;;;;;;;;;:::i;42029:90::-;;;;;;;;;;-1:-1:-1;42102:9:0;;42029:90;;;2682:25:1;;;2670:2;2655:18;42029:90:0;2536:177:1;54165:357:0;;;;;;;;;;-1:-1:-1;54165:357:0;;;;;:::i;:::-;;:::i;25939:67::-;;;;;;;;;;;;;:::i;54593:185::-;;;;;;;;;;-1:-1:-1;54593:185:0;;;;;:::i;:::-;;:::i;48022:767::-;;;;;;:::i;:::-;;:::i;26014:79::-;;;;;;;;;;;;;:::i;42127:109::-;;;;;;;;;;-1:-1:-1;42127:109:0;;;;;:::i;:::-;;:::i;41805:101::-;;;;;;;;;;-1:-1:-1;41805:101:0;;;;;:::i;:::-;;:::i;24950:86::-;;;;;;;;;;-1:-1:-1;24997:4:0;25021:7;-1:-1:-1;;;25021:7:0;;;;24950:86;;23456:112;;;;;;;;;;;;;:::i;39019:27::-;;;;;;;;;;;;;;;;51183:273;;;;;;;;;;-1:-1:-1;51183:273:0;;;;;:::i;:::-;;:::i;26190:75::-;;;;;;;;;;;;;:::i;50885:236::-;;;;;;;;;;-1:-1:-1;50885:236:0;;;;;:::i;:::-;;:::i;25868:63::-;;;;;;;;;;;;;:::i;41625:172::-;;;;;;;;;;-1:-1:-1;41625:172:0;;;;;:::i;:::-;;:::i;26273:77::-;;;;;;;;;;;;;:::i;23211:87::-;;;;;;;;;;-1:-1:-1;23257:7:0;23284:6;-1:-1:-1;;;;;23284:6:0;23211:87;;51692:104;;;;;;;;;;;;;:::i;41042:202::-;;;;;;;;;;-1:-1:-1;41042:202:0;;;;;:::i;:::-;;:::i;53486:327::-;;;;;;;;;;-1:-1:-1;53486:327:0;;;;;:::i;:::-;;:::i;40823:211::-;;;;;;;;;;-1:-1:-1;40823:211:0;;;;;:::i;:::-;;:::i;38187:53::-;;;;;;;;;;;;;;;;48797:519;;;;;;;;;;-1:-1:-1;48797:519:0;;;;;:::i;:::-;;:::i;54849:346::-;;;;;;;;;;-1:-1:-1;54849:346:0;;;;;:::i;:::-;;:::i;38850:39::-;;;;;;;;;;;;;;;;49324:684;;;;;;:::i;:::-;;:::i;41252:119::-;;;;;;;;;;-1:-1:-1;41252:119:0;;;;;:::i;:::-;;:::i;51867:417::-;;;;;;;;;;-1:-1:-1;51867:417:0;;;;;:::i;:::-;;:::i;50016:378::-;;;;;;;;;;-1:-1:-1;50016:378:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;42244:115::-;;;;;;;;;;-1:-1:-1;42244:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;42333:18:0;42306:7;42333:18;;;:11;:18;;;;;;;42244:115;38045:31;;;;;;;;;;;;;;;;41914:107;;;;;;;;;;-1:-1:-1;41914:107:0;;;;;:::i;:::-;;:::i;23576:213::-;;;;;;;;;;-1:-1:-1;23576:213:0;;;;;:::i;:::-;;:::i;53884:214::-;;;;;;;;;;-1:-1:-1;53884:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;54055:25:0;;;54026:4;54055:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;53884:214;23306:142;;;;;;;;;;-1:-1:-1;23306:142:0;;;;;:::i;:::-;;:::i;41379:123::-;;;;;;;;;;-1:-1:-1;41379:123:0;;;;;:::i;:::-;;:::i;50466:355::-;50613:4;-1:-1:-1;;;;;;50655:40:0;;50670:25;50655:40;;:105;;-1:-1:-1;;;;;;;50712:48:0;;50727:33;50712:48;50655:105;:158;;;-1:-1:-1;22861:25:0;-1:-1:-1;;;;;;22846:40:0;;;50777:36;50635:178;50466:355;-1:-1:-1;;50466:355:0:o;41510:107::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;;;;;;;;;41584:12:::1;:25:::0;;-1:-1:-1;;;;;;41584:25:0::1;-1:-1:-1::0;;;;;41584:25:0;;;::::1;::::0;;;::::1;::::0;;41510:107::o;51523:100::-;51577:13;51610:5;51603:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51523:100;:::o;53162:252::-;53283:7;56819:16;;;:7;:16;;;;;;-1:-1:-1;;;;;56819:16:0;53308:54;;;;-1:-1:-1;;;53308:54:0;;10895:2:1;53308:54:0;;;10877:21:1;10934:2;10914:18;;;10907:30;10973:27;10953:18;;;10946:55;11018:18;;53308:54:0;10693:349:1;53308:54:0;-1:-1:-1;53382:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;53382:24:0;;53162:252::o;52698:398::-;52779:13;52795:22;52809:7;52795:13;:22::i;:::-;52779:38;;52842:5;-1:-1:-1;;;;;52836:11:0;:2;-1:-1:-1;;;;;52836:11:0;;;52828:45;;;;-1:-1:-1;;;52828:45:0;;11249:2:1;52828:45:0;;;11231:21:1;11288:2;11268:18;;;11261:30;11327:23;11307:18;;;11300:51;11368:18;;52828:45:0;11047:345:1;52828:45:0;19782:10;-1:-1:-1;;;;;52908:21:0;;;;:62;;-1:-1:-1;52933:37:0;52950:5;19782:10;53884:214;:::i;52933:37::-;52886:168;;;;-1:-1:-1;;;52886:168:0;;11599:2:1;52886:168:0;;;11581:21:1;11638:2;11618:18;;;11611:30;11677:34;11657:18;;;11650:62;11748:26;11728:18;;;11721:54;11792:19;;52886:168:0;11397:420:1;52886:168:0;53067:21;53076:2;53080:7;53067:8;:21::i;:::-;52768:328;52698:398;;:::o;42367:111::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;42432:12:::1;::::0;42420:9:::1;:24:::0;42455:15:::1;27052:5:::0;27036:21;;-1:-1:-1;;;;27036:21:0;;;26983:82;42455:15:::1;42367:111::o:0;26101:81::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;26157:17:::1;27252:5:::0;27234:23;;;;;;27179:86;54165:357;54374:41;19782:10;54407:7;54374:18;:41::i;:::-;54352:121;;;;-1:-1:-1;;;54352:121:0;;12024:2:1;54352:121:0;;;12006:21:1;12063:2;12043:18;;;12036:30;12102:32;12082:18;;;12075:60;12152:18;;54352:121:0;11822:354:1;54352:121:0;54486:28;54496:4;54502:2;54506:7;54486:9;:28::i;25939:67::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;25988:10:::1;:8;:10::i;54593:185::-:0;54731:39;54748:4;54754:2;54758:7;54731:39;;;;;;;;;;;;:16;:39::i;48022:767::-;24997:4;25021:7;-1:-1:-1;;;25021:7:0;;;;25786:9;:28;;;;-1:-1:-1;25799:15:0;;;;;;;25786:28;25778:62;;;;-1:-1:-1;;;25778:62:0;;12383:2:1;25778:62:0;;;12365:21:1;12422:2;12402:18;;;12395:30;12461:23;12441:18;;;12434:51;12502:18;;25778:62:0;12181:345:1;25778:62:0;48288:10:::1;48267:17;48275:8:::0;48267:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;48267:31:0::1;;48259:53;;;::::0;-1:-1:-1;;;48259:53:0;;12733:2:1;48259:53:0::1;::::0;::::1;12715:21:1::0;12772:1;12752:18;;;12745:29;-1:-1:-1;;;12790:18:1;;;12783:39;12839:18;;48259:53:0::1;12531:332:1::0;48259:53:0::1;48353:12;::::0;48345:43:::1;::::0;-1:-1:-1;;;48345:43:0;;48377:10:::1;48345:43;::::0;::::1;2131:74:1::0;48391:1:0::1;::::0;-1:-1:-1;;;;;48353:12:0::1;::::0;48345:31:::1;::::0;2104:18:1;;48345:43:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;:161;;;-1:-1:-1::0;48482:24:0::1;::::0;48420:18:::1;::::0;48413:48:::1;::::0;-1:-1:-1;;;48413:48:0;;48450:10:::1;48413:48;::::0;::::1;2131:74:1::0;-1:-1:-1;;;;;48420:18:0;;::::1;::::0;48413:36:::1;::::0;2104:18:1;;48413:48:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:93;;48345:161;48323:218;;;::::0;-1:-1:-1;;;48323:218:0;;13259:2:1;48323:218:0::1;::::0;::::1;13241:21:1::0;13298:1;13278:18;;;13271:29;13336:9;13316:18;;;13309:37;13363:18;;48323:218:0::1;13057:330:1::0;48323:218:0::1;48552:149;48580:10;48605;48630:8;48653:14;48682:8;48552:13;:149::i;:::-;48714:67;48722:8;48732:10;48744;48756:8;48766:14;48714:7;:67::i;:::-;48022:767:::0;;;;;:::o;26014:79::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;26069:16:::1;:14;:16::i;42127:109::-:0;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;42202:14:::1;:26:::0;;-1:-1:-1;;;;;;42202:26:0::1;-1:-1:-1::0;;;;;42202:26:0;;;::::1;::::0;;;::::1;::::0;;42127:109::o;41805:101::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;41877:21;;::::1;::::0;:12:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;41805:101:::0;:::o;23456:112::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;23521:6:::1;::::0;;23513:47:::1;::::0;-1:-1:-1;;;;;23521:6:0;;::::1;::::0;23538:21:::1;23513:47:::0;::::1;;;::::0;23538:21;;23513:47;23521:6;23513:47;23538:21;23521:6;23513:47;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;23456:112::o:0;51183:273::-;51300:7;51341:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51341:16:0;51376:19;51368:57;;;;-1:-1:-1;;;51368:57:0;;10895:2:1;51368:57:0;;;10877:21:1;10934:2;10914:18;;;10907:30;10973:27;10953:18;;;10946:55;11018:18;;51368:57:0;10693:349:1;26190:75:0;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;26243:14:::1;:12;:14::i;50885:236::-:0;51002:7;-1:-1:-1;;;;;51035:19:0;;51027:52;;;;-1:-1:-1;;;51027:52:0;;13594:2:1;51027:52:0;;;13576:21:1;13633:2;13613:18;;;13606:30;13672:22;13652:18;;;13645:50;13712:18;;51027:52:0;13392:344:1;51027:52:0;-1:-1:-1;;;;;;51097:16:0;;;;;:9;:16;;;;;;;50885:236::o;25868:63::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;25915:8:::1;:6;:8::i;41625:172::-:0;41728:7;41760:14;41775:13;41760:29;;;;;;:::i;:::-;;;;;;;;;;;;;;41753:36;;41625:172;;;:::o;26273:77::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;26327:15:::1;27052:5:::0;27036:21;;-1:-1:-1;;;;27036:21:0;;;26983:82;51692:104;51748:13;51781:7;51774:14;;;;;:::i;41042:202::-;-1:-1:-1;;;;;41193:31:0;;41169:4;41193:31;;;:21;:31;;;;;;:43;;;;41225:10;;41193:43;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;41042:202:0;;;;:::o;53486:327::-;-1:-1:-1;;;;;53621:24:0;;19782:10;53621:24;;53613:62;;;;-1:-1:-1;;;53613:62:0;;14224:2:1;53613:62:0;;;14206:21:1;14263:2;14243:18;;;14236:30;14302:27;14282:18;;;14275:55;14347:18;;53613:62:0;14022:349:1;53613:62:0;19782:10;53688:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;53688:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;53688:53:0;;;;;;;;;;53757:48;;586:41:1;;;53688:42:0;;19782:10;53757:48;;559:18:1;53757:48:0;;;;;;;53486:327;;:::o;40823:211::-;40957:4;40981:33;;;:23;:33;;;;;;:45;;;;41015:10;;40981:45;:::i;48797:519::-;24997:4;25021:7;-1:-1:-1;;;25021:7:0;;;;25660:9;:26;;;;-1:-1:-1;25673:13:0;;-1:-1:-1;;;25673:13:0;;;;25660:26;25652:58;;;;-1:-1:-1;;;25652:58:0;;14578:2:1;25652:58:0;;;14560:21:1;14617:2;14597:18;;;14590:30;14656:21;14636:18;;;14629:49;14695:18;;25652:58:0;14376:343:1;25652:58:0;48929:9:::1;48916;:22;;48908:46;;;::::0;-1:-1:-1;;;48908:46:0;;14926:2:1;48908:46:0::1;::::0;::::1;14908:21:1::0;14965:2;14945:18;;;14938:30;15004:13;14984:18;;;14977:41;15035:18;;48908:46:0::1;14724:335:1::0;48908:46:0::1;48989:12;::::0;49021:24:::1;::::0;-1:-1:-1;;;49021:24:0;;::::1;::::0;::::1;2682:25:1::0;;;-1:-1:-1;;;;;48989:12:0;;::::1;::::0;49049:10:::1;::::0;48989:12;;49021:13:::1;::::0;2655:18:1;;49021:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49021:38:0::1;;49013:60;;;::::0;-1:-1:-1;;;49013:60:0;;12733:2:1;49013:60:0::1;::::0;::::1;12715:21:1::0;12772:1;12752:18;;;12745:29;-1:-1:-1;;;12790:18:1;;;12783:39;12839:18;;49013:60:0::1;12531:332:1::0;49013:60:0::1;49092:24;::::0;-1:-1:-1;;;49092:24:0;;::::1;::::0;::::1;2682:25:1::0;;;49120:10:0::1;::::0;-1:-1:-1;;;;;49092:13:0;::::1;::::0;::::1;::::0;2655:18:1;;49092:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;49092:38:0::1;;49084:60;;;::::0;-1:-1:-1;;;49084:60:0;;12733:2:1;49084:60:0::1;::::0;::::1;12715:21:1::0;12772:1;12752:18;;;12745:29;-1:-1:-1;;;12790:18:1;;;12783:39;12839:18;;49084:60:0::1;12531:332:1::0;49084:60:0::1;49177:49;::::0;;;;49200:10:::1;49177:49;::::0;::::1;15555:34:1::0;49220:4:0::1;15605:18:1::0;;;15598:43;-1:-1:-1;;;;;49177:22:0;::::1;::::0;::::1;::::0;15467:18:1;;49177:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49155:113;;;::::0;-1:-1:-1;;;49155:113:0;;16104:2:1;49155:113:0::1;::::0;::::1;16086:21:1::0;16143:2;16123:18;;;16116:30;16182:16;16162:18;;;16155:44;16216:18;;49155:113:0::1;15902:338:1::0;49155:113:0::1;49281:27;49287:9;49298;49281:5;:27::i;54849:346::-:0;55038:41;19782:10;55071:7;55038:18;:41::i;:::-;55016:121;;;;-1:-1:-1;;;55016:121:0;;12024:2:1;55016:121:0;;;12006:21:1;12063:2;12043:18;;;12036:30;12102:32;12082:18;;;12075:60;12152:18;;55016:121:0;11822:354:1;55016:121:0;55148:39;55162:4;55168:2;55172:7;55181:5;55148:13;:39::i;:::-;54849:346;;;;:::o;49324:684::-;49528:7;25021;;-1:-1:-1;;;25021:7:0;;;;25660:9;:26;;;;-1:-1:-1;25673:13:0;;-1:-1:-1;;;25673:13:0;;;;25660:26;25652:58;;;;-1:-1:-1;;;25652:58:0;;14578:2:1;25652:58:0;;;14560:21:1;14617:2;14597:18;;;14590:30;14656:21;14636:18;;;14629:49;14695:18;;25652:58:0;14376:343:1;25652:58:0;49571:9:::1;;49556:12;;:24;49548:51;;;::::0;-1:-1:-1;;;49548:51:0;;16447:2:1;49548:51:0::1;::::0;::::1;16429:21:1::0;16486:2;16466:18;;;16459:30;16525:16;16505:18;;;16498:44;16559:18;;49548:51:0::1;16245:338:1::0;49548:51:0::1;49659:21;::::0;49644:10:::1;49632:23;::::0;;;:11:::1;:23;::::0;;;;;:48:::1;;49610:109;;;::::0;-1:-1:-1;;;49610:109:0;;16790:2:1;49610:109:0::1;::::0;::::1;16772:21:1::0;16829:2;16809:18;;;16802:30;16868:13;16848:18;;;16841:41;16899:18;;49610:109:0::1;16588:335:1::0;49610:109:0::1;49730:63;49744:10;49756;49768:8;49778:14;49730:13;:63::i;:::-;49804:19;49826:143;49846:10;49871;49896;49921:8;49944:14;49826:5;:143::i;:::-;49804:165:::0;-1:-1:-1;;25721:1:0::1;49324:684:::0;;;;;;:::o;41252:119::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;41332:18:::1;:31:::0;;-1:-1:-1;;;;;;41332:31:0::1;-1:-1:-1::0;;;;;41332:31:0;;;::::1;::::0;;;::::1;::::0;;41252:119::o;51867:417::-;56795:4;56819:16;;;:7;:16;;;;;;51985:13;;-1:-1:-1;;;;;56819:16:0;52016:62;;;;-1:-1:-1;;;52016:62:0;;17130:2:1;52016:62:0;;;17112:21:1;17169:2;17149:18;;;17142:30;17208:34;17188:18;;;17181:62;17279:3;17259:18;;;17252:31;17300:19;;52016:62:0;16928:397:1;52016:62:0;52091:21;52115:10;:8;:10::i;:::-;52091:34;;52180:1;52162:7;52156:21;:25;:120;;;;;;;;;;;;;;;;;52225:7;52234:18;:7;:16;:18::i;:::-;52208:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52156:120;52136:140;51867:417;-1:-1:-1;;;51867:417:0:o;50016:378::-;50267:27;;;;:17;:27;;;;;;;;50309:14;:24;;;;;50348:17;:27;;;;;50245:141;;50117:24;;;;;;50267:27;;50309:24;;50348:27;50267;;50245:141;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50016:378;;;;;:::o;41914:107::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;41988:14:::1;:25:::0;41914:107::o;23576:213::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;23725:7:::1;23700:21;:32;;23692:41;;;::::0;::::1;;23744:37;::::0;-1:-1:-1;;;;;23744:28:0;::::1;::::0;:37;::::1;;;::::0;23773:7;;23744:37:::1;::::0;;;23773:7;23744:28;:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;23306:142:::0;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;-1:-1:-1;;;;;23389:22:0;::::1;23381:31;;;::::0;::::1;;23423:6;:17:::0;;-1:-1:-1;;;;;;23423:17:0::1;-1:-1:-1::0;;;;;23423:17:0;;;::::1;::::0;;;::::1;::::0;;23306:142::o;41379:123::-;23103:6;;-1:-1:-1;;;;;23103:6:0;23089:10;:20;23067:116;;;;-1:-1:-1;;;23067:116:0;;10038:2:1;23067:116:0;;;10020:21:1;10077:2;10057:18;;;10050:30;-1:-1:-1;;;;;;;;;;;10096:18:1;;;10089:62;-1:-1:-1;;;10167:18:1;;;10160:44;10221:19;;23067:116:0;9836:410:1;23067:116:0;41461:24:::1;:33:::0;41379:123::o;60131:173::-;60206:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;60206:29:0;-1:-1:-1;;;;;60206:29:0;;;;;;;;:24;;60260:22;60206:24;60260:13;:22::i;:::-;-1:-1:-1;;;;;60251:45:0;;;;;;;;;;;60131:173;;:::o;57024:395::-;57153:4;56819:16;;;:7;:16;;;;;;-1:-1:-1;;;;;56819:16:0;57175:54;;;;-1:-1:-1;;;57175:54:0;;10895:2:1;57175:54:0;;;10877:21:1;10934:2;10914:18;;;10907:30;10973:27;10953:18;;;10946:55;11018:18;;57175:54:0;10693:349:1;57175:54:0;57240:13;57256:22;57270:7;57256:13;:22::i;:::-;57240:38;;57308:5;-1:-1:-1;;;;;57297:16:0;:7;-1:-1:-1;;;;;57297:16:0;;:64;;;;57354:7;-1:-1:-1;;;;;57330:31:0;:20;57342:7;57330:11;:20::i;:::-;-1:-1:-1;;;;;57330:31:0;;57297:64;:113;;;-1:-1:-1;;;;;;54055:25:0;;;54026:4;54055:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;57378:32;53884:214;59478:535;59636:4;-1:-1:-1;;;;;59610:30:0;:22;59624:7;59610:13;:22::i;:::-;-1:-1:-1;;;;;59610:30:0;;59602:58;;;;-1:-1:-1;;;59602:58:0;;18007:2:1;59602:58:0;;;17989:21:1;18046:2;18026:18;;;18019:30;18085:17;18065:18;;;18058:45;18120:18;;59602:58:0;17805:339:1;59602:58:0;-1:-1:-1;;;;;59679:16:0;;59671:49;;;;-1:-1:-1;;;59671:49:0;;13594:2:1;59671:49:0;;;13576:21:1;13633:2;13613:18;;;13606:30;13672:22;13652:18;;;13645:50;13712:18;;59671:49:0;13392:344:1;59671:49:0;59837:29;59854:1;59858:7;59837:8;:29::i;:::-;-1:-1:-1;;;;;59879:15:0;;;;;;:9;:15;;;;;:20;;59898:1;;59879:15;:20;;59898:1;;59879:20;:::i;:::-;;;;-1:-1:-1;;;;;;;59910:13:0;;;;;;:9;:13;;;;;:18;;59927:1;;59910:13;:18;;59927:1;;59910:18;:::i;:::-;;;;-1:-1:-1;;59939:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;59939:21:0;-1:-1:-1;;;;;59939:21:0;;;;;;;;;59978:27;;59939:16;;59978:27;;;;;;;59478:535;;;:::o;26753:120::-;24997:4;25021:7;-1:-1:-1;;;25021:7:0;;;;25545:41;;;;-1:-1:-1;;;25545:41:0;;18803:2:1;25545:41:0;;;18785:21:1;18842:2;18822:18;;;18815:30;18881:22;18861:18;;;18854:50;18921:18;;25545:41:0;18601:344:1;25545:41:0;26822:5:::1;26812:15:::0;;;::::1;::::0;;26843:22:::1;19782:10:::0;26852:12:::1;26843:22;::::0;-1:-1:-1;;;;;2149:55:1;;;2131:74;;2119:2;2104:18;26843:22:0::1;;;;;;;26753:120::o:0;45801:756::-;46028:13;46042:8;46028:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46027:24;46019:44;;;;-1:-1:-1;;;46019:44:0;;19152:2:1;46019:44:0;;;19134:21:1;19191:1;19171:18;;;19164:29;-1:-1:-1;;;19209:18:1;;;19202:37;19256:18;;46019:44:0;18950:330:1;46019:44:0;46083:15;46099:10;46083:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;46082:28;46074:50;;;;-1:-1:-1;;;46074:50:0;;19487:2:1;46074:50:0;;;19469:21:1;19526:1;19506:18;;;19499:29;19564:11;19544:18;;;19537:39;19593:18;;46074:50:0;19285:332:1;46074:50:0;46171:19;;46149:10;46143:24;:47;;46135:64;;;;-1:-1:-1;;;46135:64:0;;;;;;19824:2:1;19806:21;;;19863:1;19843:18;;;19836:29;-1:-1:-1;;;19896:2:1;19881:18;;19874:34;19940:2;19925:18;;19622:327;46135:64:0;46231:14;;46218:9;:27;;46210:45;;;;-1:-1:-1;;;46210:45:0;;20156:2:1;46210:45:0;;;20138:21:1;20195:1;20175:18;;;20168:29;-1:-1:-1;;;20213:18:1;;;20206:35;20258:18;;46210:45:0;19954:328:1;46210:45:0;46274:33;46286:10;46298:8;46274:11;:33::i;:::-;46266:60;;;;-1:-1:-1;;;46266:60:0;;20489:2:1;46266:60:0;;;20471:21:1;20528:2;20508:18;;;20501:30;20567:16;20547:18;;;20540:44;20601:18;;46266:60:0;20287:338:1;46266:60:0;46359:153;46398:10;46427:8;46454:10;46483:14;46359:20;:153::i;:::-;46337:212;;;;-1:-1:-1;;;46337:212:0;;20832:2:1;46337:212:0;;;20814:21:1;20871:1;20851:18;;;20844:29;20909:11;20889:18;;;20882:39;20938:18;;46337:212:0;20630:332:1;47237:777:0;47448:21;47472:27;;;:17;:27;;;;;47448:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47510:21;47534:14;:24;47549:8;47534:24;;;;;;;;;;;47510:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47569:19;47591:17;:27;47609:8;47591:27;;;;;;;;;;;47569:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47631:155;47665:10;47690;47715:8;47738:14;47767:8;47631:19;:155::i;:::-;47804:202;47825:10;47850:8;47873:7;47895:10;47920:7;47942:10;47967:5;47987:8;47804:202;;;;;;;;;;;;;:::i;:::-;;;;;;;;47437:577;;;47237:777;;;;;:::o;27073:98::-;24997:4;25021:7;-1:-1:-1;;;25021:7:0;;;;25275:9;25267:38;;;;-1:-1:-1;;;25267:38:0;;22426:2:1;25267:38:0;;;22408:21:1;22465:2;22445:18;;;22438:30;22504:18;22484;;;22477:46;22540:18;;25267:38:0;22224:340:1;25267:38:0;27141:15:::1;:22:::0;;;::::1;::::0;::::1;::::0;;27073:98::o;26881:94::-;24997:4;25021:7;-1:-1:-1;;;25021:7:0;;;;25275:9;25267:38;;;;-1:-1:-1;;;25267:38:0;;22426:2:1;25267:38:0;;;22408:21:1;22465:2;22445:18;;;22438:30;22504:18;22484;;;22477:46;22540:18;;25267:38:0;22224:340:1;25267:38:0;26947:13:::1;:20:::0;;-1:-1:-1;;;;26947:20:0::1;-1:-1:-1::0;;;26947:20:0::1;::::0;;26881:94::o;26494:118::-;24997:4;25021:7;-1:-1:-1;;;25021:7:0;;;;25275:9;25267:38;;;;-1:-1:-1;;;25267:38:0;;22426:2:1;25267:38:0;;;22408:21:1;22465:2;22445:18;;;22438:30;22504:18;22484;;;22477:46;22540:18;;25267:38:0;22224:340:1;25267:38:0;26554:7:::1;:14:::0;;;::::1;-1:-1:-1::0;;;26554:14:0::1;::::0;;26584:20:::1;26591:12;19782:10:::0;;19702:98;42486:726;42565:12;;42635:17;;42558:129;;-1:-1:-1;;;42558:129:0;;42610:10;42558:129;;;22832:34:1;-1:-1:-1;;;;;42635:17:0;;;22882:18:1;;;22875:43;22934:18;;;22927:34;;;42565:12:0;;;42558:37;;22744:18:1;;42558:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42705:12:0;;42775:17;;42698:129;;-1:-1:-1;;;42698:129:0;;42750:10;42698:129;;;22832:34:1;-1:-1:-1;;;;;42775:17:0;;;22882:18:1;;;22875:43;22934:18;;;22927:34;;;42705:12:0;;;-1:-1:-1;42698:37:0;;-1:-1:-1;22744:18:1;;42698:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42874:12:0;;42867:41;;-1:-1:-1;;;42867:41:0;;;;;2682:25:1;;;42841:20:0;;-1:-1:-1;;;;;;42874:12:0;;;;-1:-1:-1;42867:30:0;;2655:18:1;;42867:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42867:41:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;42955:12:0;;42948:41;;-1:-1:-1;;;42948:41:0;;;;;2682:25:1;;;42838:70:0;;-1:-1:-1;42922:20:0;;-1:-1:-1;;;;;;42955:12:0;;42948:30;;2655:18:1;;42948:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42948:41:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;43024:10:0;43002:33;;;;:21;:33;;;;;;;:41;;42919:70;;-1:-1:-1;43046:4:0;;-1:-1:-1;43002:33:0;:41;;43036:6;;43002:41;:::i;:::-;;;;;;;;;;;;;;;;:48;;-1:-1:-1;;43002:48:0;;;;;;;;;;;43083:10;-1:-1:-1;43061:33:0;;;:21;:33;;;;;-1:-1:-1;;43061:41:0;;43095:6;;43061:41;:::i;:::-;;;;;;;;;;;;;;;;:48;;-1:-1:-1;;43061:48:0;;;;;;;;;;;43132:10;-1:-1:-1;43120:23:0;;;:11;:23;;;;;;:28;;-1:-1:-1;;;43120:28:0;;-1:-1:-1;;43120:28:0;:::i;:::-;;;;-1:-1:-1;;43166:38:0;;43194:9;;43183;;43171:10;;43166:38;;;;;42547:665;;42486:726;;:::o;56077:340::-;56234:28;56244:4;56250:2;56254:7;56234:9;:28::i;:::-;56295:48;56318:4;56324:2;56328:7;56337:5;56295:22;:48::i;:::-;56273:136;;;;-1:-1:-1;;;56273:136:0;;24380:2:1;56273:136:0;;;24362:21:1;24419:2;24399:18;;;24392:30;24458:34;24438:18;;;24431:62;-1:-1:-1;;;24509:18:1;;;24502:36;24555:19;;56273:136:0;24178:402:1;45074:719:0;45274:13;45288:8;45274:23;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;45273:24;45265:44;;;;-1:-1:-1;;;45265:44:0;;19152:2:1;45265:44:0;;;19134:21:1;19191:1;19171:18;;;19164:29;-1:-1:-1;;;19209:18:1;;;19202:37;19256:18;;45265:44:0;18950:330:1;45265:44:0;45329:15;45345:10;45329:27;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;45328:28;45320:50;;;;-1:-1:-1;;;45320:50:0;;19487:2:1;45320:50:0;;;19469:21:1;19526:1;19506:18;;;19499:29;19564:11;19544:18;;;19537:39;19593:18;;45320:50:0;19285:332:1;45320:50:0;45417:19;;45395:10;45389:24;:47;;45381:64;;;;-1:-1:-1;;;45381:64:0;;;;;;19824:2:1;19806:21;;;19863:1;19843:18;;;19836:29;-1:-1:-1;;;19896:2:1;19881:18;;19874:34;19940:2;19925:18;;19622:327;45381:64:0;45477:14;;45464:9;:27;;45456:45;;;;-1:-1:-1;;;45456:45:0;;20156:2:1;45456:45:0;;;20138:21:1;20195:1;20175:18;;;20168:29;-1:-1:-1;;;20213:18:1;;;20206:35;20258:18;;45456:45:0;19954:328:1;45456:45:0;45520:23;45532:10;45520:11;:23::i;:::-;45512:50;;;;-1:-1:-1;;;45512:50:0;;20489:2:1;45512:50:0;;;20471:21:1;20528:2;20508:18;;;20501:30;20567:16;20547:18;;;20540:44;20601:18;;45512:50:0;20287:338:1;45512:50:0;45595:153;45634:10;45663:8;45690:10;45719:14;45595:20;:153::i;:::-;45573:212;;;;-1:-1:-1;;;45573:212:0;;20832:2:1;45573:212:0;;;20814:21:1;20871:1;20851:18;;;20844:29;20909:11;20889:18;;;20882:39;20938:18;;45573:212:0;20630:332:1;43842:553:0;44047:7;44067:19;44089:12;;44104:1;44089:16;;;;:::i;:::-;44067:38;;44118:30;44128:6;44136:11;44118:9;:30::i;:::-;44159:158;44193:10;44218;44243:8;44266:14;44295:11;44159:19;:158::i;:::-;44340:10;44328:23;;;;:11;:23;;;;;:28;;44355:1;;44328:23;:28;;44355:1;;44328:28;:::i;:::-;;;;-1:-1:-1;44376:11:0;;43842:553;-1:-1:-1;;;;;;;43842:553:0:o;52532:104::-;52583:13;52616:12;52609:19;;;;;:::i;20169:723::-;20225:13;20446:10;20442:53;;-1:-1:-1;;20473:10:0;;;;;;;;;;;;;;;;;;20169:723::o;20442:53::-;20520:5;20505:12;20561:78;20568:9;;20561:78;;20594:8;;;;:::i;:::-;;-1:-1:-1;20617:10:0;;-1:-1:-1;20625:2:0;20617:10;;:::i;:::-;;;20561:78;;;20649:19;20681:6;20671:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20671:17:0;;20649:39;;20699:154;20706:10;;20699:154;;20733:11;20743:1;20733:11;;:::i;:::-;;-1:-1:-1;20802:10:0;20810:2;20802:5;:10;:::i;:::-;20789:24;;:2;:24;:::i;:::-;20776:39;;20759:6;20766;20759:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;20830:11:0;20839:2;20830:11;;:::i;:::-;;;20699:154;;43561:273;43675:4;43701:33;;;:23;:33;;;;;;:45;;;;43735:10;;43701:45;:::i;:::-;;;;;;;;;;;;;;;;;43697:89;;;-1:-1:-1;43770:4:0;43763:11;;43697:89;43803:23;43815:10;43803:11;:23::i;44403:663::-;44599:4;44620:19;44640:14;44620:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;44616:80;;;-1:-1:-1;44679:5:0;44672:12;;44616:80;44708:16;44727:104;44787:8;44797:10;44809;44770:50;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44727:28;:104::i;:::-;44708:123;;44844:14;44861:39;44875:8;44885:14;44861:13;:39::i;:::-;44927:14;;44844:56;;-1:-1:-1;;;;;;44917:24:0;;;44927:14;;44917:24;44913:69;;44965:5;44958:12;;;;;;44913:69;45032:4;44994:19;45014:14;44994:35;;;;;;:::i;:::-;;;;;;;;;;;;;;:42;;;;;-1:-1:-1;;44994:42:0;;;;;;;;;-1:-1:-1;44994:42:0;;-1:-1:-1;;44403:663:0;;;;;;:::o;46565:664::-;46817:4;46788:14;46803:10;46788:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:33;;;;;-1:-1:-1;;46788:33:0;;;;;;;;;;;;46832:19;;:35;;46852:14;;46832:35;:::i;:::-;;;;;;;;;;;;;;:42;;;;;-1:-1:-1;;46832:42:0;;;;;;;;;;;;46885:13;;:23;;46899:8;;46885:23;:::i;:::-;;;;;;;;;;;;;;:30;;;;;-1:-1:-1;;46885:30:0;;;;;;;;;;;;46926:15;;:27;;46942:10;;46926:27;:::i;:::-;;;;;;;;;;;;;;;;:34;;-1:-1:-1;;46926:34:0;;;;;;;;;;;-1:-1:-1;46971:33:0;;;:23;:33;;;;;-1:-1:-1;;46971:45:0;;47005:10;;46971:45;:::i;:::-;;;;;;;;;;;;;;:52;;;;;-1:-1:-1;;46971:52:0;;;;;;;;;;47065:8;;47036:14;;:26;;47051:10;;47036:26;:::i;:::-;;;;;;;;;;;;;;;;:37;;;;47084:27;;;;:17;:27;;;;;;:40;;;;;;;;:::i;:::-;-1:-1:-1;47135:24:0;;;;:14;:24;;;;;;;;:37;;;;;;;;:::i;:::-;-1:-1:-1;47183:27:0;;;;:17;:27;;;;;;;;:38;;;;;;;;:::i;:::-;;46565:664;;;;;:::o;60869:920::-;61024:4;-1:-1:-1;;;;;61045:13:0;;11660:20;11708:8;61041:741;;61098:175;;-1:-1:-1;;;61098:175:0;;-1:-1:-1;;;;;61098:36:0;;;;;:175;;19782:10;;61192:4;;61219:7;;61249:5;;61098:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61098:175:0;;;;;;;;-1:-1:-1;;61098:175:0;;;;;;;;;;;;:::i;:::-;;;61077:650;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61456:13:0;;61452:260;;61499:48;;-1:-1:-1;;;61499:48:0;;24380:2:1;61499:48:0;;;24362:21:1;24419:2;24399:18;;;24392:30;24458:34;24438:18;;;24431:62;-1:-1:-1;;;24509:18:1;;;24502:36;24555:19;;61499:48:0;24178:402:1;61452:260:0;61662:6;61656:13;61647:6;61643:2;61639:15;61632:38;61077:650;-1:-1:-1;;;;;;61337:51:0;-1:-1:-1;;;61337:51:0;;-1:-1:-1;61330:58:0;;61041:741;-1:-1:-1;61766:4:0;61759:11;;43220:333;43289:4;43310:14;43325:10;43310:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;43306:71;;;-1:-1:-1;43360:5:0;;43220:333;-1:-1:-1;43220:333:0:o;43306:71::-;43398:12;;43391:47;;;;;-1:-1:-1;;;;;43398:12:0;;;;43391:35;;:47;;43427:10;;43391:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;43387:137;;43489:10;43467:33;;;;:21;:33;;;;;;;:45;;;;43501:10;;43467:45;:::i;:::-;;;;;;;;;;;;;;;;;;43220:333;-1:-1:-1;;43220:333:0:o;43387:137::-;-1:-1:-1;43541:4:0;;43220:333;-1:-1:-1;43220:333:0:o;57761:110::-;57837:26;57847:2;57851:7;57837:26;;;;;;;;;;;;:9;:26::i;36180:357::-;36278:7;36445:26;36462:1;:8;36445:16;:26::i;:::-;36494:1;36351:163;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36323:206;;;;;;36303:226;;36180:357;;;:::o;31572:263::-;31677:7;31703:17;31722:18;31744:27;31755:4;31761:9;31744:10;:27::i;:::-;31702:69;;;;31782:18;31794:5;31782:11;:18::i;:::-;-1:-1:-1;31818:9:0;31572:263;-1:-1:-1;;;31572:263:0:o;58098:309::-;58228:18;58234:2;58238:7;58228:5;:18::i;:::-;58279:54;58310:1;58314:2;58318:7;58327:5;58279:22;:54::i;:::-;58257:142;;;;-1:-1:-1;;;58257:142:0;;24380:2:1;58257:142:0;;;24362:21:1;24419:2;24399:18;;;24392:30;24458:34;24438:18;;;24431:62;-1:-1:-1;;;24509:18:1;;;24502:36;24555:19;;58257:142:0;24178:402:1;29430:1340:0;29538:7;29547:12;29777:9;:16;29797:2;29777:22;29773:990;;;30073:4;30058:20;;30052:27;30123:4;30108:20;;30102:27;30181:4;30166:20;;30160:27;29816:9;30152:36;30224:25;30235:4;30152:36;30052:27;30102;30224:10;:25::i;:::-;30217:32;;;;;;;;;29773:990;30271:9;:16;30291:2;30271:22;30267:496;;;30546:4;30531:20;;30525:27;30597:4;30582:20;;30576:27;30639:23;30650:4;30525:27;30576;30639:10;:23::i;:::-;30632:30;;;;;;;;30267:496;-1:-1:-1;30711:1:0;;-1:-1:-1;30715:35:0;30267:496;29430:1340;;;;;:::o;27701:643::-;27779:20;27770:5;:29;;;;;;;;:::i;:::-;;27766:571;;;27701:643;:::o;27766:571::-;27877:29;27868:5;:38;;;;;;;;:::i;:::-;;27864:473;;;27923:34;;-1:-1:-1;;;27923:34:0;;28135:2:1;27923:34:0;;;28117:21:1;28174:2;28154:18;;;28147:30;28213:26;28193:18;;;28186:54;28257:18;;27923:34:0;27933:348:1;27864:473:0;27988:35;27979:5;:44;;;;;;;;:::i;:::-;;27975:362;;;28040:41;;-1:-1:-1;;;28040:41:0;;28488:2:1;28040:41:0;;;28470:21:1;28527:2;28507:18;;;28500:30;28566:33;28546:18;;;28539:61;28617:18;;28040:41:0;28286:355:1;27975:362:0;28112:30;28103:5;:39;;;;;;;;:::i;:::-;;28099:238;;;28159:44;;-1:-1:-1;;;28159:44:0;;28848:2:1;28159:44:0;;;28830:21:1;28887:2;28867:18;;;28860:30;28926:34;28906:18;;;28899:62;-1:-1:-1;;;28977:18:1;;;28970:32;29019:19;;28159:44:0;28646:398:1;28099:238:0;28234:30;28225:5;:39;;;;;;;;:::i;:::-;;28221:116;;;28281:44;;-1:-1:-1;;;28281:44:0;;29251:2:1;28281:44:0;;;29233:21:1;29290:2;29270:18;;;29263:30;29329:34;29309:18;;;29302:62;-1:-1:-1;;;29380:18:1;;;29373:32;29422:19;;28281:44:0;29049:398:1;58743::0;-1:-1:-1;;;;;58823:16:0;;58815:49;;;;-1:-1:-1;;;58815:49:0;;13594:2:1;58815:49:0;;;13576:21:1;13633:2;13613:18;;;13606:30;13672:22;13652:18;;;13645:50;13712:18;;58815:49:0;13392:344:1;58815:49:0;56795:4;56819:16;;;:7;:16;;;;;;-1:-1:-1;;;;;56819:16:0;:30;58875:58;;;;-1:-1:-1;;;58875:58:0;;29654:2:1;58875:58:0;;;29636:21:1;29693:2;29673:18;;;29666:30;29732;29712:18;;;29705:58;29780:18;;58875:58:0;29452:352:1;58875:58:0;-1:-1:-1;;;;;59004:13:0;;;;;;:9;:13;;;;;:18;;59021:1;;59004:13;:18;;59021:1;;59004:18;:::i;:::-;;;;-1:-1:-1;;59033:16:0;;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;59033:21:0;-1:-1:-1;;;;;59033:21:0;;;;;59065:12;:17;;-1:-1:-1;;59033:16:0;59065:17;;-1:-1:-1;;59065:17:0;:::i;:::-;;;;-1:-1:-1;;59100:33:0;;59125:7;;-1:-1:-1;;;;;59100:33:0;;;59117:1;;59100:33;;59117:1;;59100:33;58743:398;;:::o;33152:1669::-;33283:7;;34244:66;34218:92;;34200:200;;;-1:-1:-1;34353:1:0;;-1:-1:-1;34357:30:0;34337:51;;34200:200;34414:1;:7;;34419:2;34414:7;;:18;;;;;34425:1;:7;;34430:2;34425:7;;34414:18;34410:102;;;-1:-1:-1;34465:1:0;;-1:-1:-1;34469:30:0;34449:51;;34410:102;34626:24;;;34609:14;34626:24;;;;;;;;;30036:25:1;;;30109:4;30097:17;;30077:18;;;30070:45;;;;30131:18;;;30124:34;;;30174:18;;;30167:34;;;34626:24:0;;30008:19:1;;34626:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34626:24:0;;-1:-1:-1;;34626:24:0;;;-1:-1:-1;;;;;;;34665:20:0;;34661:103;;34718:1;34722:29;34702:50;;;;;;;34661:103;34784:6;-1:-1:-1;34792:20:0;;-1:-1:-1;33152:1669:0;;;;;;;;:::o;32098:440::-;32212:7;;32356:66;32313:124;;32464:3;32460:12;;;32474:2;32456:21;32505:25;32516:4;32456:21;32525:1;32313:124;32505:10;:25::i;:::-;32498:32;;;;;;32098:440;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:154::-;-1:-1:-1;;;;;717:5:1;713:54;706:5;703:65;693:93;;782:1;779;772:12;797:247;856:6;909:2;897:9;888:7;884:23;880:32;877:52;;;925:1;922;915:12;877:52;964:9;951:23;983:31;1008:5;983:31;:::i;1049:258::-;1121:1;1131:113;1145:6;1142:1;1139:13;1131:113;;;1221:11;;;1215:18;1202:11;;;1195:39;1167:2;1160:10;1131:113;;;1262:6;1259:1;1256:13;1253:48;;;-1:-1:-1;;1297:1:1;1279:16;;1272:27;1049:258::o;1312:::-;1354:3;1392:5;1386:12;1419:6;1414:3;1407:19;1435:63;1491:6;1484:4;1479:3;1475:14;1468:4;1461:5;1457:16;1435:63;:::i;:::-;1552:2;1531:15;-1:-1:-1;;1527:29:1;1518:39;;;;1559:4;1514:50;;1312:258;-1:-1:-1;;1312:258:1:o;1575:220::-;1724:2;1713:9;1706:21;1687:4;1744:45;1785:2;1774:9;1770:18;1762:6;1744:45;:::i;1800:180::-;1859:6;1912:2;1900:9;1891:7;1887:23;1883:32;1880:52;;;1928:1;1925;1918:12;1880:52;-1:-1:-1;1951:23:1;;1800:180;-1:-1:-1;1800:180:1:o;2216:315::-;2284:6;2292;2345:2;2333:9;2324:7;2320:23;2316:32;2313:52;;;2361:1;2358;2351:12;2313:52;2400:9;2387:23;2419:31;2444:5;2419:31;:::i;:::-;2469:5;2521:2;2506:18;;;;2493:32;;-1:-1:-1;;;2216:315:1:o;2718:456::-;2795:6;2803;2811;2864:2;2852:9;2843:7;2839:23;2835:32;2832:52;;;2880:1;2877;2870:12;2832:52;2919:9;2906:23;2938:31;2963:5;2938:31;:::i;:::-;2988:5;-1:-1:-1;3045:2:1;3030:18;;3017:32;3058:33;3017:32;3058:33;:::i;:::-;2718:456;;3110:7;;-1:-1:-1;;;3164:2:1;3149:18;;;;3136:32;;2718:456::o;3179:184::-;-1:-1:-1;;;3228:1:1;3221:88;3328:4;3325:1;3318:15;3352:4;3349:1;3342:15;3368:275;3439:2;3433:9;3504:2;3485:13;;-1:-1:-1;;3481:27:1;3469:40;;3539:18;3524:34;;3560:22;;;3521:62;3518:88;;;3586:18;;:::i;:::-;3622:2;3615:22;3368:275;;-1:-1:-1;3368:275:1:o;3648:187::-;3697:4;3730:18;3722:6;3719:30;3716:56;;;3752:18;;:::i;:::-;-1:-1:-1;3818:2:1;3797:15;-1:-1:-1;;3793:29:1;3824:4;3789:40;;3648:187::o;3840:464::-;3883:5;3936:3;3929:4;3921:6;3917:17;3913:27;3903:55;;3954:1;3951;3944:12;3903:55;3990:6;3977:20;4021:49;4037:32;4066:2;4037:32;:::i;:::-;4021:49;:::i;:::-;4095:2;4086:7;4079:19;4141:3;4134:4;4129:2;4121:6;4117:15;4113:26;4110:35;4107:55;;;4158:1;4155;4148:12;4107:55;4223:2;4216:4;4208:6;4204:17;4197:4;4188:7;4184:18;4171:55;4271:1;4246:16;;;4264:4;4242:27;4235:38;;;;4250:7;3840:464;-1:-1:-1;;;3840:464:1:o;4309:1012::-;4443:6;4451;4459;4467;4475;4528:3;4516:9;4507:7;4503:23;4499:33;4496:53;;;4545:1;4542;4535:12;4496:53;4581:9;4568:23;4558:33;;4642:2;4631:9;4627:18;4614:32;4665:18;4706:2;4698:6;4695:14;4692:34;;;4722:1;4719;4712:12;4692:34;4745:50;4787:7;4778:6;4767:9;4763:22;4745:50;:::i;:::-;4735:60;;4848:2;4837:9;4833:18;4820:32;4804:48;;4877:2;4867:8;4864:16;4861:36;;;4893:1;4890;4883:12;4861:36;4916:52;4960:7;4949:8;4938:9;4934:24;4916:52;:::i;:::-;4906:62;;5021:2;5010:9;5006:18;4993:32;4977:48;;5050:2;5040:8;5037:16;5034:36;;;5066:1;5063;5056:12;5034:36;5089:52;5133:7;5122:8;5111:9;5107:24;5089:52;:::i;:::-;5079:62;;5194:3;5183:9;5179:19;5166:33;5150:49;;5224:2;5214:8;5211:16;5208:36;;;5240:1;5237;5230:12;5208:36;;5263:52;5307:7;5296:8;5285:9;5281:24;5263:52;:::i;:::-;5253:62;;;4309:1012;;;;;;;;:::o;5326:322::-;5395:6;5448:2;5436:9;5427:7;5423:23;5419:32;5416:52;;;5464:1;5461;5454:12;5416:52;5504:9;5491:23;5537:18;5529:6;5526:30;5523:50;;;5569:1;5566;5559:12;5523:50;5592;5634:7;5625:6;5614:9;5610:22;5592:50;:::i;5653:457::-;5731:6;5739;5792:2;5780:9;5771:7;5767:23;5763:32;5760:52;;;5808:1;5805;5798:12;5760:52;5847:9;5834:23;5866:31;5891:5;5866:31;:::i;:::-;5916:5;-1:-1:-1;5972:2:1;5957:18;;5944:32;5999:18;5988:30;;5985:50;;;6031:1;6028;6021:12;5985:50;6054;6096:7;6087:6;6076:9;6072:22;6054:50;:::i;:::-;6044:60;;;5653:457;;;;;:::o;6115:118::-;6201:5;6194:13;6187:21;6180:5;6177:32;6167:60;;6223:1;6220;6213:12;6238:382;6303:6;6311;6364:2;6352:9;6343:7;6339:23;6335:32;6332:52;;;6380:1;6377;6370:12;6332:52;6419:9;6406:23;6438:31;6463:5;6438:31;:::i;:::-;6488:5;-1:-1:-1;6545:2:1;6530:18;;6517:32;6558:30;6517:32;6558:30;:::i;:::-;6607:7;6597:17;;;6238:382;;;;;:::o;6625:390::-;6703:6;6711;6764:2;6752:9;6743:7;6739:23;6735:32;6732:52;;;6780:1;6777;6770:12;6732:52;6816:9;6803:23;6793:33;;6877:2;6866:9;6862:18;6849:32;6904:18;6896:6;6893:30;6890:50;;;6936:1;6933;6926:12;7020:248;7088:6;7096;7149:2;7137:9;7128:7;7124:23;7120:32;7117:52;;;7165:1;7162;7155:12;7117:52;-1:-1:-1;;7188:23:1;;;7258:2;7243:18;;;7230:32;;-1:-1:-1;7020:248:1:o;7273:666::-;7368:6;7376;7384;7392;7445:3;7433:9;7424:7;7420:23;7416:33;7413:53;;;7462:1;7459;7452:12;7413:53;7501:9;7488:23;7520:31;7545:5;7520:31;:::i;:::-;7570:5;-1:-1:-1;7627:2:1;7612:18;;7599:32;7640:33;7599:32;7640:33;:::i;:::-;7692:7;-1:-1:-1;7746:2:1;7731:18;;7718:32;;-1:-1:-1;7801:2:1;7786:18;;7773:32;7828:18;7817:30;;7814:50;;;7860:1;7857;7850:12;7814:50;7883;7925:7;7916:6;7905:9;7901:22;7883:50;:::i;:::-;7873:60;;;7273:666;;;;;;;:::o;7944:943::-;8069:6;8077;8085;8093;8146:3;8134:9;8125:7;8121:23;8117:33;8114:53;;;8163:1;8160;8153:12;8114:53;8203:9;8190:23;8232:18;8273:2;8265:6;8262:14;8259:34;;;8289:1;8286;8279:12;8259:34;8312:50;8354:7;8345:6;8334:9;8330:22;8312:50;:::i;:::-;8302:60;;8415:2;8404:9;8400:18;8387:32;8371:48;;8444:2;8434:8;8431:16;8428:36;;;8460:1;8457;8450:12;8428:36;8483:52;8527:7;8516:8;8505:9;8501:24;8483:52;:::i;:::-;8473:62;;8588:2;8577:9;8573:18;8560:32;8544:48;;8617:2;8607:8;8604:16;8601:36;;;8633:1;8630;8623:12;8601:36;8656:52;8700:7;8689:8;8678:9;8674:24;8656:52;:::i;:::-;8646:62;;8761:2;8750:9;8746:18;8733:32;8717:48;;8790:2;8780:8;8777:16;8774:36;;;8806:1;8803;8796:12;8774:36;;8829:52;8873:7;8862:8;8851:9;8847:24;8829:52;:::i;8892:546::-;9137:2;9126:9;9119:21;9100:4;9163:45;9204:2;9193:9;9189:18;9181:6;9163:45;:::i;:::-;9256:9;9248:6;9244:22;9239:2;9228:9;9224:18;9217:50;9290:33;9316:6;9308;9290:33;:::i;:::-;9276:47;;9371:9;9363:6;9359:22;9354:2;9343:9;9339:18;9332:50;9399:33;9425:6;9417;9399:33;:::i;:::-;9391:41;8892:546;-1:-1:-1;;;;;;8892:546:1:o;9443:388::-;9511:6;9519;9572:2;9560:9;9551:7;9547:23;9543:32;9540:52;;;9588:1;9585;9578:12;9540:52;9627:9;9614:23;9646:31;9671:5;9646:31;:::i;:::-;9696:5;-1:-1:-1;9753:2:1;9738:18;;9725:32;9766:33;9725:32;9766:33;:::i;10251:437::-;10330:1;10326:12;;;;10373;;;10394:61;;10448:4;10440:6;10436:17;10426:27;;10394:61;10501:2;10493:6;10490:14;10470:18;10467:38;10464:218;;;-1:-1:-1;;;10535:1:1;10528:88;10639:4;10636:1;10629:15;10667:4;10664:1;10657:15;10464:218;;10251:437;;;:::o;12868:184::-;12938:6;12991:2;12979:9;12970:7;12966:23;12962:32;12959:52;;;13007:1;13004;12997:12;12959:52;-1:-1:-1;13030:16:1;;12868:184;-1:-1:-1;12868:184:1:o;13741:276::-;13872:3;13910:6;13904:13;13926:53;13972:6;13967:3;13960:4;13952:6;13948:17;13926:53;:::i;:::-;13995:16;;;;;13741:276;-1:-1:-1;;13741:276:1:o;15064:251::-;15134:6;15187:2;15175:9;15166:7;15162:23;15158:32;15155:52;;;15203:1;15200;15193:12;15155:52;15235:9;15229:16;15254:31;15279:5;15254:31;:::i;15652:245::-;15719:6;15772:2;15760:9;15751:7;15747:23;15743:32;15740:52;;;15788:1;15785;15778:12;15740:52;15820:9;15814:16;15839:28;15861:5;15839:28;:::i;17330:470::-;17509:3;17547:6;17541:13;17563:53;17609:6;17604:3;17597:4;17589:6;17585:17;17563:53;:::i;:::-;17679:13;;17638:16;;;;17701:57;17679:13;17638:16;17735:4;17723:17;;17701:57;:::i;:::-;17774:20;;17330:470;-1:-1:-1;;;;17330:470:1:o;18149:184::-;-1:-1:-1;;;18198:1:1;18191:88;18298:4;18295:1;18288:15;18322:4;18319:1;18312:15;18338:125;18378:4;18406:1;18403;18400:8;18397:34;;;18411:18;;:::i;:::-;-1:-1:-1;18448:9:1;;18338:125::o;18468:128::-;18508:3;18539:1;18535:6;18532:1;18529:13;18526:39;;;18545:18;;:::i;:::-;-1:-1:-1;18581:9:1;;18468:128::o;20967:1252::-;21375:4;21404:3;-1:-1:-1;;;;;21438:6:1;21434:55;21423:9;21416:74;21526:6;21521:2;21510:9;21506:18;21499:34;21569:2;21564;21553:9;21549:18;21542:30;21595:45;21636:2;21625:9;21621:18;21613:6;21595:45;:::i;:::-;21581:59;;21688:9;21680:6;21676:22;21671:2;21660:9;21656:18;21649:50;21722:33;21748:6;21740;21722:33;:::i;:::-;21708:47;;21804:9;21796:6;21792:22;21786:3;21775:9;21771:19;21764:51;21838:33;21864:6;21856;21838:33;:::i;:::-;21824:47;;21920:9;21912:6;21908:22;21902:3;21891:9;21887:19;21880:51;21954:33;21980:6;21972;21954:33;:::i;:::-;21940:47;;22036:9;22028:6;22024:22;22018:3;22007:9;22003:19;21996:51;22070:33;22096:6;22088;22070:33;:::i;:::-;22056:47;;22152:9;22144:6;22140:22;22134:3;22123:9;22119:19;22112:51;22180:33;22206:6;22198;22180:33;:::i;:::-;22172:41;20967:1252;-1:-1:-1;;;;;;;;;;;20967:1252:1:o;22972:430::-;23026:5;23079:3;23072:4;23064:6;23060:17;23056:27;23046:55;;23097:1;23094;23087:12;23046:55;23126:6;23120:13;23157:49;23173:32;23202:2;23173:32;:::i;23157:49::-;23231:2;23222:7;23215:19;23277:3;23270:4;23265:2;23257:6;23253:15;23249:26;23246:35;23243:55;;;23294:1;23291;23284:12;23243:55;23307:64;23368:2;23361:4;23352:7;23348:18;23341:4;23333:6;23329:17;23307:64;:::i;23407:766::-;23525:6;23533;23541;23594:2;23582:9;23573:7;23569:23;23565:32;23562:52;;;23610:1;23607;23600:12;23562:52;23643:9;23637:16;23672:18;23713:2;23705:6;23702:14;23699:34;;;23729:1;23726;23719:12;23699:34;23752:61;23805:7;23796:6;23785:9;23781:22;23752:61;:::i;:::-;23742:71;;23859:2;23848:9;23844:18;23838:25;23822:41;;23888:2;23878:8;23875:16;23872:36;;;23904:1;23901;23894:12;23872:36;23927:63;23982:7;23971:8;23960:9;23956:24;23927:63;:::i;:::-;23917:73;;24036:2;24025:9;24021:18;24015:25;23999:41;;24065:2;24055:8;24052:16;24049:36;;;24081:1;24078;24071:12;24049:36;;24104:63;24159:7;24148:8;24137:9;24133:24;24104:63;:::i;:::-;24094:73;;;23407:766;;;;;:::o;24585:135::-;24624:3;-1:-1:-1;;24645:17:1;;24642:43;;;24665:18;;:::i;:::-;-1:-1:-1;24712:1:1;24701:13;;24585:135::o;24725:184::-;-1:-1:-1;;;24774:1:1;24767:88;24874:4;24871:1;24864:15;24898:4;24895:1;24888:15;24914:120;24954:1;24980;24970:35;;24985:18;;:::i;:::-;-1:-1:-1;25019:9:1;;24914:120::o;25039:112::-;25071:1;25097;25087:35;;25102:18;;:::i;:::-;-1:-1:-1;25136:9:1;;25039:112::o;25156:184::-;-1:-1:-1;;;25205:1:1;25198:88;25305:4;25302:1;25295:15;25329:4;25326:1;25319:15;25624:664;25851:3;25889:6;25883:13;25905:53;25951:6;25946:3;25939:4;25931:6;25927:17;25905:53;:::i;:::-;26021:13;;25980:16;;;;26043:57;26021:13;25980:16;26077:4;26065:17;;26043:57;:::i;:::-;26167:13;;26122:20;;;26189:57;26167:13;26122:20;26223:4;26211:17;;26189:57;:::i;:::-;26262:20;;25624:664;-1:-1:-1;;;;;25624:664:1:o;26293:512::-;26487:4;-1:-1:-1;;;;;26597:2:1;26589:6;26585:15;26574:9;26567:34;26649:2;26641:6;26637:15;26632:2;26621:9;26617:18;26610:43;;26689:6;26684:2;26673:9;26669:18;26662:34;26732:3;26727:2;26716:9;26712:18;26705:31;26753:46;26794:3;26783:9;26779:19;26771:6;26753:46;:::i;26810:249::-;26879:6;26932:2;26920:9;26911:7;26907:23;26903:32;26900:52;;;26948:1;26945;26938:12;26900:52;26980:9;26974:16;26999:30;27023:5;26999:30;:::i;27064:675::-;27372:66;27367:3;27360:79;27342:3;27468:6;27462:13;27484:62;27539:6;27534:2;27529:3;27525:12;27518:4;27510:6;27506:17;27484:62;:::i;:::-;27606:13;;27565:16;;;;27628:63;27606:13;27677:2;27669:11;;27662:4;27650:17;;27628:63;:::i;:::-;27711:17;27730:2;27707:26;;27064:675;-1:-1:-1;;;;27064:675:1:o;27744:184::-;-1:-1:-1;;;27793:1:1;27786:88;27893:4;27890:1;27883:15;27917:4;27914:1;27907:15

Swarm Source

ipfs://2ffcd6eddbef9504bd86c5f9489b1103c50eec240578f32ee63d5c2e108e05c4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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