ETH Price: $2,361.05 (+1.42%)

Token

InfiniGods: Elder Gods (GODS)
 

Overview

Max Total Supply

4,489 GODS

Holders

614

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
14 GODS
0xaba33fa6f071f3bc44d83d7d72c8e35f7fe88a95
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Elder Gods is a collection of 4,488 unique gaming assets that rule over the InfiniGods Universe (IGU). As our Gen 0 collection, the Elder Gods will forever be the most powerful characters across all games.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ElderGODS

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-07
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

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

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

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

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

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

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

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

    /**
     * @dev 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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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: caller is not token owner or 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: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

interface IElderGods {
    function isSloth(uint256 tokenId) external view returns (bool);
}

interface IERC4907 {

    // Logged when the user of an NFT is changed or expires is changed
    /// @notice Emitted when the `user` of an NFT or the `expires` of the `user` is changed
    /// The zero address for user indicates that there is no user address
    event UpdateUser(uint256 indexed tokenId, address indexed user, uint64 expires);

    /// @notice set the user and expires of an NFT
    /// @dev The zero address indicates there is no user
    /// Throws if `tokenId` is not valid NFT
    /// @param user  The new user of the NFT
    /// @param expires  UNIX timestamp, The new user could use the NFT before expires
    function setUser(uint256 tokenId, address user, uint64 expires) external;

    /// @notice Get the user address of an NFT
    /// @dev The zero address indicates that there is no user or the user is expired
    /// @param tokenId The NFT to get the user address for
    /// @return The user address for this NFT
    function userOf(uint256 tokenId) external view returns(address);

    /// @notice Get the user expires of an NFT
    /// @dev The zero value indicates that there is no user
    /// @param tokenId The NFT to get the user expires for
    /// @return The user expires for this NFT
    function userExpires(uint256 tokenId) external view returns(uint256);
}

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

contract ElderGODS is ERC721Enumerable, Ownable, IERC4907, ReentrancyGuard, DefaultOperatorFilterer {
    using Address for address payable;
    using Strings for uint256;
    using SafeERC20 for IERC20;

    mapping (uint256  => bool) public isSloth; 

    uint256 private constant MAX_SUPPLY = 4488;

    address public immutable ELDERGODS_old;

    uint256 private airdropTokenCount;

    string private baseURI_;
    string private baseExtension_ = ".json";

    address private treasury = 0xB85e653e74060b092eF14C410d5FDf397bEc856d;

    constructor (string memory name_, string memory symbol_, address _ig) ERC721(name_, symbol_) {
        ELDERGODS_old = _ig;
        allowedTokens[WETH] = true;
        allowedTokens[address(0)] = true;
        treasury = 0xB85e653e74060b092eF14C410d5FDf397bEc856d;
    }

    function airdrop(uint256 gasLimit) external onlyOwner nonReentrant {
        address to;
        uint256 last;
        for (uint256 x = airdropTokenCount + 1; x <= IERC721Enumerable(ELDERGODS_old).totalSupply() && gasleft() > gasLimit;) {
            to = IERC721(ELDERGODS_old).ownerOf(x);
            if (IElderGods(ELDERGODS_old).isSloth(x)) {
                isSloth[x] = true;
            }
            _safeMint(to, x);
            last = x;
            unchecked {
                ++ x;
            }
        }
        airdropTokenCount = last;
    }

    function getEldersSupply() external view returns (uint256) {
        return IERC721Enumerable(ELDERGODS_old).totalSupply();
    }

    function returnToTreasury(uint256 gasLimit) external onlyOwner nonReentrant {
        require(totalSupply() >= IERC721Enumerable(ELDERGODS_old).totalSupply(), "GODS: Not all airdropped");
        require(treasury != address(0), "GODS: To address(0)");
        while (totalSupply() <= MAX_SUPPLY && gasleft() > gasLimit) {
            _safeMint(treasury, totalSupply() + 1);
        }
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        _requireMinted(tokenId);
        return bytes(baseURI_).length > 0 ? string(abi.encodePacked(baseURI_, tokenId.toString(), baseExtension_)) : "";
    }

    /// @dev EIP4907

    uint256 public godsFee;
    uint256 private constant denominator = 1000;
    bool public canRent;

    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    mapping (address => bool) public allowedTokens;

    struct Rent {
        address user;
        uint64 expires;
    }

    mapping (uint256 => Rent) public rent;

    struct RentBids {
        uint256 tokenId;
        uint256 price;
        address user;
        uint256 expiry;
        address payToken;
        uint64 duration;
    }

    mapping (uint256 => RentBids) public rentBids;
    uint256 public rentBidsCounter;

    struct RentableItems {
        uint256 price;
        address lender;
        uint64 expiry;
        address payToken;
        uint64 duration;
    }

    mapping (uint256 => RentableItems) public rentableItems;

    event BidPlaced(uint256 indexed bidId, uint256 tokenId, uint64 expiry, uint64 duration, uint256 price, address token);
    event BidDeleted(uint256 bidId);
    event NFTListedForRent(uint256 tokenId, uint64 expiry, uint64 duration, uint256 price, address token);
    event NFTDeletedFromRent(uint256 tokenId);

    modifier rentability() {
        require(canRent, "GODS: Rent is currently disabled");
        _;
    }

    function setUser(uint256 tokenId, address user, uint64 expires) public override rentability {
        require(_msgSender() == ownerOf(tokenId), "GODS: Not owner");
        _setUser(tokenId, user, expires);
    }

    function _setUser(uint256 tokenId, address _user, uint64 _expires) internal {
        _requireMinted(tokenId);
        require(rent[tokenId].user == address(0) || rent[tokenId].expires < block.timestamp, "GODS: Currently Rented");
        rent[tokenId] = Rent({
            user: _user,
            expires: _expires
        });
        emit UpdateUser(tokenId, _user, _expires);
    }

    function userOf(uint256 tokenId) external view returns (address) {
        _requireMinted(tokenId);
        return rent[tokenId].expires < block.timestamp ? address(0) : rent[tokenId].user;
    }

    function userExpires(uint256 tokenId) external view returns(uint256) {
        _requireMinted(tokenId);
        return rent[tokenId].expires < block.timestamp ? 0 : rent[tokenId].expires;
    }

    function putForRent(uint256 _tokenId, uint64 _expiry, uint64 _duration, uint256 _price, address _token) external rentability {
        _requireMinted(_tokenId);
        require(allowedTokens[_token], "GODS: Unrecognised token");
        require(_msgSender() == ownerOf(_tokenId), "GODS: Not Authorised");
        require(_price >= denominator, "GODS: Price too small");
        require(rent[_tokenId].user == address(0) || rent[_tokenId].expires < block.timestamp, "GODS: Currently Rented");
        rentableItems[_tokenId] = RentableItems({
            price: _price,
            lender: _msgSender(),
            expiry: _expiry,
            payToken: _token,
            duration: _duration
        });
        emit NFTListedForRent(_tokenId, _expiry, _duration, _price, _token);
    }

    function deleteFromRent(uint256 _tokenId) external {
        _requireMinted(_tokenId);
        require(_msgSender() == ownerOf(_tokenId), "GODS: Not Authorised");
        rentableItems[_tokenId].expiry = 0;
        emit NFTDeletedFromRent(_tokenId);
    }

    function acceptRent(uint256 _tokenId) external payable rentability nonReentrant {
        _requireMinted(_tokenId);
        require(_msgSender() != ownerOf(_tokenId), "GODS: Cannot rent own token");
        require(ownerOf(_tokenId) == rentableItems[_tokenId].lender, "GODS: Lender cannot rent");
        require(rentableItems[_tokenId].expiry >= block.timestamp, "GODS: Offer expired");
        rentableItems[_tokenId].expiry = 0;
        uint256 cost = rentableItems[_tokenId].price;
        if (godsFee > 0) {
            uint256 toOwner = cost * (denominator - godsFee) / denominator;
            uint256 toTreasury = cost - toOwner;
            if (rentableItems[_tokenId].payToken == address(0)) {
                require(msg.value == rentableItems[_tokenId].price, "GODS: Incorrect amount payed");
                (bool sent,) = ownerOf(_tokenId).call{value: address(this).balance}("");
                require(sent, "Failed to send Ether");
            } else {
                IERC20(rentableItems[_tokenId].payToken).safeTransferFrom(_msgSender(), ownerOf(_tokenId), toOwner);
                if (toTreasury > 0) {
                    IERC20(rentableItems[_tokenId].payToken).safeTransferFrom(_msgSender(), treasury, toTreasury);
                }
            }
        } else {
            if (rentableItems[_tokenId].payToken == address(0)) {
                (bool sent,) = ownerOf(_tokenId).call{value: address(this).balance}("");
                require(sent, "Failed to send Ether");
            } else {
                IERC20(rentableItems[_tokenId].payToken).safeTransferFrom(_msgSender(), ownerOf(_tokenId), cost);
            }
        }
        _setUser(_tokenId, _msgSender(), uint64(block.timestamp + rentableItems[_tokenId].duration));
    }

    function placeBid(uint256 _tokenId, uint64 _expiry, uint64 _duration, uint256 _price, address _token) external rentability {
        _requireMinted(_tokenId);
        require(allowedTokens[_token] && _token != address(0), "GODS: Unrecognised token");
        require(_expiry >= block.timestamp, "GODS: Invalid expiry");
        require(_price >= denominator, "GODS: Fee too small");
        rentBidsCounter ++;
        rentBids[rentBidsCounter] = RentBids({
            tokenId: _tokenId,
            price: _price,
            user: _msgSender(),
            expiry: _expiry,
            payToken: _token,
            duration: _duration
        });
        emit BidPlaced(rentBidsCounter, _tokenId, _expiry, _duration, _price, _token);
    }

    function deleteBid(uint256 bidId) external {
        require(_msgSender() == rentBids[bidId].user, "GODS: Not authorised");
        require(block.timestamp >= rentBids[bidId].expiry, "GODS: Bid expired");
        rentBids[bidId].expiry = 0;
        emit BidDeleted(bidId);
    }

    function acceptBid(uint256 bidId) external rentability nonReentrant {
        RentBids memory bid = rentBids[bidId];
        require(ownerOf(bid.tokenId) == _msgSender(), "GODS: Caller is not the owner");
        require(rent[bid.tokenId].user == address(0) || rent[bid.tokenId].expires < block.timestamp, "GODS: Currently Rented");
        require(bid.expiry >= block.timestamp, "GODS: Bid expired");
        rentBids[bidId].expiry = 0;
        uint256 cost = bid.price;
        if (godsFee > 0) {
            uint256 toOwner = cost * (denominator - godsFee) / denominator;
            uint256 toTreasury = cost - toOwner;
            IERC20(bid.payToken).safeTransferFrom(bid.user, ownerOf(bid.tokenId), toOwner);
            if (toTreasury > 0) {
                IERC20(bid.payToken).safeTransferFrom(bid.user, treasury, toTreasury);
            }
        } else {
            IERC20(bid.payToken).safeTransferFrom(bid.user, ownerOf(bid.tokenId), cost);
        }
        setUser(bid.tokenId, bid.user, uint64(block.timestamp) + bid.duration);
    } 
    
    /// @dev onlyOwner

    function modifyAllowedTokens(address[] calldata tokenList, bool value) external onlyOwner {
        for (uint256 i; i < tokenList.length;) {
            allowedTokens[tokenList[i]] = value;
            unchecked {
                ++i;
            }
        }
        assert(allowedTokens[WETH] == true);
    }

    function changeTreasuryAddress(address _newTreasury) external onlyOwner {
        treasury = _newTreasury;
    }

    function changeRentFee(uint256 _newFee) external onlyOwner {
        require(_newFee < denominator, "GODS: Fee too high");
        godsFee = _newFee;
    }

    function setRentStatus(bool status) external onlyOwner {
        canRent = status;
    }

    function setBaseURI(string memory _base) external onlyOwner {
        baseURI_ = _base;
    }

    function setBaseExtension(string memory _ext) external onlyOwner {
        baseExtension_ = _ext;
    }

    function withdrawFunds() external onlyOwner {
        (bool sent,) = owner().call{value: address(this).balance}("");
        require(sent, "Failed to send Ether");
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable) returns (bool) {
        return
            interfaceId == type(IERC4907).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @dev OperatorFilterRegistry

    function setApprovalForAll(address operator, bool approved) public override(IERC721, ERC721) onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override(IERC721, ERC721) onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override(IERC721, ERC721) onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override(IERC721, ERC721) onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override(IERC721, ERC721)
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function changeOperatorFilterRegistryAddress(address newRegistry) external onlyOwner {
        OperatorFilterer.OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(newRegistry);
    }

    receive() external payable {
        revert("GODS: Unrecognised method");
    }

    fallback() external payable {
        revert("GODS: Unrecognised method");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"_ig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":false,"internalType":"uint256","name":"bidId","type":"uint256"}],"name":"BidDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"expiry","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"duration","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"BidPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NFTDeletedFromRent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"expiry","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"duration","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"NFTListedForRent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint64","name":"expires","type":"uint64"}],"name":"UpdateUser","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ELDERGODS_old","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bidId","type":"uint256"}],"name":"acceptBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"acceptRent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasLimit","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":[],"name":"canRent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"changeOperatorFilterRegistryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"changeRentFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasury","type":"address"}],"name":"changeTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bidId","type":"uint256"}],"name":"deleteBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"deleteFromRent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEldersSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"godsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"","type":"uint256"}],"name":"isSloth","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenList","type":"address[]"},{"internalType":"bool","name":"value","type":"bool"}],"name":"modifyAllowedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint64","name":"_expiry","type":"uint64"},{"internalType":"uint64","name":"_duration","type":"uint64"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"placeBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint64","name":"_expiry","type":"uint64"},{"internalType":"uint64","name":"_duration","type":"uint64"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"address","name":"_token","type":"address"}],"name":"putForRent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rent","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"expires","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rentBids","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint64","name":"duration","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rentBidsCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rentableItems","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"lender","type":"address"},{"internalType":"uint64","name":"expiry","type":"uint64"},{"internalType":"address","name":"payToken","type":"address"},{"internalType":"uint64","name":"duration","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasLimit","type":"uint256"}],"name":"returnToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ext","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_base","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setRentStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"expires","type":"uint64"}],"name":"setUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"userExpires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"userOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

600c80546001600160a01b0319166daaeb6d7670e522a718067333cd4e17905560e0604052600560a090815264173539b7b760d91b60c052601090620000469082620003c2565b50601180546001600160a01b03191673b85e653e74060b092ef14c410d5fdf397bec856d1790553480156200007a57600080fd5b506040516200467d3803806200467d8339810160408190526200009d916200053d565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600184846000620000c48382620003c2565b506001620000d38282620003c2565b505050620000f0620000ea620002c760201b60201c565b620002cb565b6001600b55600c546001600160a01b03163b15620002265780156200017d57600c54604051633e9f1edf60e11b81523060048201526001600160a01b03848116602483015290911690637d3e3dbe906044015b600060405180830381600087803b1580156200015e57600080fd5b505af115801562000173573d6000803e3d6000fd5b5050505062000226565b6001600160a01b03821615620001c657600c5460405163a0af290360e01b81523060048201526001600160a01b0384811660248301529091169063a0af29039060440162000143565b600c54604051632210724360e11b81523060048201526001600160a01b0390911690634420e48690602401600060405180830381600087803b1580156200020c57600080fd5b505af115801562000221573d6000803e3d6000fd5b505050505b50506001600160a01b0316608052505060146020527f87303f144ffb2d9f4aca90a0e9e77718a587dc422035d9cb2b7c0ec93e3268cc805460ff199081166001908117909255600080527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c80549091169091179055601180546001600160a01b03191673b85e653e74060b092ef14c410d5fdf397bec856d179055620005ca565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200034857607f821691505b6020821081036200036957634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003bd57600081815260208120601f850160051c81016020861015620003985750805b601f850160051c820191505b81811015620003b957828155600101620003a4565b5050505b505050565b81516001600160401b03811115620003de57620003de6200031d565b620003f681620003ef845462000333565b846200036f565b602080601f8311600181146200042e5760008415620004155750858301515b600019600386901b1c1916600185901b178555620003b9565b600085815260208120601f198616915b828110156200045f578886015182559484019460019091019084016200043e565b50858210156200047e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082601f830112620004a057600080fd5b81516001600160401b0380821115620004bd57620004bd6200031d565b604051601f8301601f19908116603f01168101908282118183101715620004e857620004e86200031d565b816040528381526020925086838588010111156200050557600080fd5b600091505b838210156200052957858201830151818301840152908201906200050a565b600093810190920192909252949350505050565b6000806000606084860312156200055357600080fd5b83516001600160401b03808211156200056b57600080fd5b62000579878388016200048e565b945060208601519150808211156200059057600080fd5b506200059f868287016200048e565b604086015190935090506001600160a01b0381168114620005bf57600080fd5b809150509250925092565b6080516140746200060960003960008181610b1601528181611a7d01528181611c2a01528181611cd301528181611d5f015261244f01526140746000f3fe6080604052600436106102cd5760003560e01c80637456be7d11610175578063c2f1f14a116100dc578063e744092e11610095578063e985e9c51161006f578063e985e9c514610a86578063f065d72414610acf578063f2fde38b14610ae4578063f6d22bdc14610b045761031b565b8063e744092e14610a2a578063e7a7fa4c14610a5a578063e8f2029814610a705761031b565b8063c2f1f14a14610967578063c87b56dd14610987578063d8c3bb5b146109a7578063da3ef23f146109d7578063e030565e146109f7578063e05a20e714610a175761031b565b806397dc4a131161012e57806397dc4a131461089f578063a22cb465146108bf578063a6f353f0146108df578063aa19a7c5146108ff578063ad5c46481461091f578063b88d4fde146109475761031b565b80637456be7d1461079d5780638bebfca91461080c5780638da5cb5b1461082c5780638fc88c481461084a57806392d80ead1461086a57806395d89b411461088a5761031b565b806341f434341161023457806355f804b3116101ed5780636352211e116101c75780636352211e1461072e57806370a082311461074e578063715018a61461076e578063736a1fdd146107835761031b565b806355f804b3146106ce5780635be310cc146106ee5780635de8dc411461070e5761031b565b806341f434341461059057806342842e0e146105b057806343175240146105d0578063442e351b146105f0578063451588381461068e5780634f6ccce7146106ae5761031b565b80631f52a0d1116102865780631f52a0d11461044f5780632279bc06146104fb57806323b872dd1461051b57806324600fc31461053b5780632b1fd58a146105505780632f745c59146105705761031b565b806301ffc9a71461035f57806306fdde0314610394578063081812fc146103b6578063095ea7b3146103ee5780630d189fcc1461041057806318160ddd146104305761031b565b3661031b5760405162461bcd60e51b815260206004820152601960248201527811d3d114ce88155b9c9958dbd9db9a5cd959081b595d1a1bd9603a1b60448201526064015b60405180910390fd5b60405162461bcd60e51b815260206004820152601960248201527811d3d114ce88155b9c9958dbd9db9a5cd959081b595d1a1bd9603a1b6044820152606401610312565b34801561036b57600080fd5b5061037f61037a3660046136b9565b610b38565b60405190151581526020015b60405180910390f35b3480156103a057600080fd5b506103a9610b63565b60405161038b919061372d565b3480156103c257600080fd5b506103d66103d1366004613740565b610bf5565b6040516001600160a01b03909116815260200161038b565b3480156103fa57600080fd5b5061040e61040936600461376e565b610c1c565b005b34801561041c57600080fd5b5061040e61042b3660046137a8565b610c35565b34801561043c57600080fd5b506008545b60405190815260200161038b565b34801561045b57600080fd5b506104b661046a366004613740565b60166020526000908152604090208054600182015460028301546003840154600490940154929391926001600160a01b039182169291811690600160a01b90046001600160401b031686565b6040805196875260208701959095526001600160a01b039384169486019490945260608501919091521660808301526001600160401b031660a082015260c00161038b565b34801561050757600080fd5b5061040e610516366004613849565b610cf8565b34801561052757600080fd5b5061040e6105363660046138a4565b610f85565b34801561054757600080fd5b5061040e610fb0565b34801561055c57600080fd5b5061040e61056b366004613740565b61103f565b34801561057c57600080fd5b5061044161058b36600461376e565b6112fa565b34801561059c57600080fd5b50600c546103d6906001600160a01b031681565b3480156105bc57600080fd5b5061040e6105cb3660046138a4565b611390565b3480156105dc57600080fd5b5061040e6105eb366004613740565b6113b5565b3480156105fc57600080fd5b5061065361060b366004613740565b60186020526000908152604090208054600182015460029092015490916001600160a01b03808216926001600160401b03600160a01b93849004811693928216929091041685565b604080519586526001600160a01b0394851660208701526001600160401b03938416908601529216606084015216608082015260a00161038b565b34801561069a57600080fd5b5061040e6106a9366004613740565b61147e565b3480156106ba57600080fd5b506104416106c9366004613740565b6114d1565b3480156106da57600080fd5b5061040e6106e9366004613970565b611564565b3480156106fa57600080fd5b5061040e610709366004613849565b61157c565b34801561071a57600080fd5b5061040e6107293660046139b8565b6117dc565b34801561073a57600080fd5b506103d6610749366004613740565b611806565b34801561075a57600080fd5b506104416107693660046139b8565b611866565b34801561077a57600080fd5b5061040e6118ec565b34801561078f57600080fd5b5060135461037f9060ff1681565b3480156107a957600080fd5b506107e56107b8366004613740565b6015602052600090815260409020546001600160a01b03811690600160a01b90046001600160401b031682565b604080516001600160a01b0390931683526001600160401b0390911660208301520161038b565b34801561081857600080fd5b5061040e610827366004613740565b611900565b34801561083857600080fd5b50600a546001600160a01b03166103d6565b34801561085657600080fd5b50610441610865366004613740565b611a04565b34801561087657600080fd5b5061040e610885366004613740565b611a6b565b34801561089657600080fd5b506103a9611bf2565b3480156108ab57600080fd5b5061040e6108ba366004613740565b611c01565b3480156108cb57600080fd5b5061040e6108da3660046139d5565b611e15565b3480156108eb57600080fd5b5061040e6108fa3660046139b8565b611e29565b34801561090b57600080fd5b5061040e61091a366004613a0e565b611e53565b34801561092b57600080fd5b506103d673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561095357600080fd5b5061040e610962366004613a2b565b611e6e565b34801561097357600080fd5b506103d6610982366004613740565b611e9b565b34801561099357600080fd5b506103a96109a2366004613740565b611ef1565b3480156109b357600080fd5b5061037f6109c2366004613740565b600d6020526000908152604090205460ff1681565b3480156109e357600080fd5b5061040e6109f2366004613970565b611f5b565b348015610a0357600080fd5b5061040e610a12366004613aaa565b611f6f565b61040e610a25366004613740565b611ff7565b348015610a3657600080fd5b5061037f610a453660046139b8565b60146020526000908152604090205460ff1681565b348015610a6657600080fd5b5061044160175481565b348015610a7c57600080fd5b5061044160125481565b348015610a9257600080fd5b5061037f610aa1366004613ae8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610adb57600080fd5b5061044161244b565b348015610af057600080fd5b5061040e610aff3660046139b8565b6124d4565b348015610b1057600080fd5b506103d67f000000000000000000000000000000000000000000000000000000000000000081565b60006001600160e01b03198216632b424ad760e21b1480610b5d5750610b5d8261254a565b92915050565b606060008054610b7290613b16565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9e90613b16565b8015610beb5780601f10610bc057610100808354040283529160200191610beb565b820191906000526020600020905b815481529060010190602001808311610bce57829003601f168201915b5050505050905090565b6000610c008261256f565b506000908152600460205260409020546001600160a01b031690565b81610c26816125ce565b610c30838361267c565b505050565b610c3d61278c565b60005b82811015610ca4578160146000868685818110610c5f57610c5f613b50565b9050602002016020810190610c7491906139b8565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610c40565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260005260146020527f87303f144ffb2d9f4aca90a0e9e77718a587dc422035d9cb2b7c0ec93e3268cc5460ff161515600114610c3057610c30613b66565b60135460ff16610d1a5760405162461bcd60e51b815260040161031290613b7c565b610d238561256f565b6001600160a01b03811660009081526014602052604090205460ff16610d865760405162461bcd60e51b815260206004820152601860248201527723a7a2299d102ab73932b1b7b3b734b9b2b2103a37b5b2b760411b6044820152606401610312565b610d8f85611806565b6001600160a01b0316336001600160a01b031614610de65760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08105d5d1a1bdc9a5cd95960621b6044820152606401610312565b6103e8821015610e305760405162461bcd60e51b815260206004820152601560248201527411d3d114ce88141c9a58d9481d1bdbc81cdb585b1b605a1b6044820152606401610312565b6000858152601560205260409020546001600160a01b03161580610e72575060008581526015602052604090205442600160a01b9091046001600160401b0316105b610e8e5760405162461bcd60e51b815260040161031290613bb1565b6040518060a00160405280838152602001610ea63390565b6001600160a01b0390811682526001600160401b0387811660208085019190915285831660408086019190915288831660609586015260008b8152601883528190208651815591860151600183018054888401519287166001600160e01b031991821617600160a01b93871684021790915595870151600290930180546080909801519390951696909516959095179116909202919091179055517f42ace40e3037b2aee9817523cd2d9f78d8d970ff4f312efcd0ce62bb8155c8ef90610f769087908790879087908790613be1565b60405180910390a15050505050565b826001600160a01b0381163314610f9f57610f9f336125ce565b610faa8484846127e6565b50505050565b610fb861278c565b6000610fcc600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611016576040519150601f19603f3d011682016040523d82523d6000602084013e61101b565b606091505b505090508061103c5760405162461bcd60e51b815260040161031290613c19565b50565b60135460ff166110615760405162461bcd60e51b815260040161031290613b7c565b611069612817565b600081815260166020908152604091829020825160c0810184528154815260018201549281019290925260028101546001600160a01b039081169383019390935260038101546060830152600401549182166080820152600160a01b9091046001600160401b031660a0820152336001600160a01b03166110ed8260000151611806565b6001600160a01b0316146111435760405162461bcd60e51b815260206004820152601d60248201527f474f44533a2043616c6c6572206973206e6f7420746865206f776e65720000006044820152606401610312565b80516000908152601560205260409020546001600160a01b031615806111895750805160009081526015602052604090205442600160a01b9091046001600160401b0316105b6111a55760405162461bcd60e51b815260040161031290613bb1565b42816060015110156111ed5760405162461bcd60e51b815260206004820152601160248201527011d3d114ce88109a5908195e1c1a5c9959607a1b6044820152606401610312565b6000828152601660209081526040822060030191909155810151601254156112a65760006103e86012546103e86112249190613c5d565b61122e9084613c70565b6112389190613c9d565b905060006112468284613c5d565b9050611273846040015161125d8660000151611806565b60808701516001600160a01b0316919085612870565b801561129f576040840151601154608086015161129f926001600160a01b039182169290911684612870565b50506112d1565b6112d182604001516112bb8460000151611806565b60808501516001600160a01b0316919084612870565b6112ee826000015183604001518460a0015142610a129190613cb1565b505061103c6001600b55565b600061130583611866565b82106113675760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610312565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b826001600160a01b03811633146113aa576113aa336125ce565b610faa8484846128ca565b6113be8161256f565b6113c781611806565b6001600160a01b0316336001600160a01b03161461141e5760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08105d5d1a1bdc9a5cd95960621b6044820152606401610312565b60008181526018602052604090819020600101805467ffffffffffffffff60a01b19169055517fba0cfc80212aa6a8565e0a9ad22bc7d9b199899af209dedb6cef0df681077ea4906114739083815260200190565b60405180910390a150565b61148661278c565b6103e881106114cc5760405162461bcd60e51b815260206004820152601260248201527108e9e88a674408ccaca40e8dede40d0d2ced60731b6044820152606401610312565b601255565b60006114dc60085490565b821061153f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610312565b6008828154811061155257611552613b50565b90600052602060002001549050919050565b61156c61278c565b600f6115788282613d26565b5050565b60135460ff1661159e5760405162461bcd60e51b815260040161031290613b7c565b6115a78561256f565b6001600160a01b03811660009081526014602052604090205460ff1680156115d757506001600160a01b03811615155b61161e5760405162461bcd60e51b815260206004820152601860248201527723a7a2299d102ab73932b1b7b3b734b9b2b2103a37b5b2b760411b6044820152606401610312565b42846001600160401b0316101561166e5760405162461bcd60e51b8152602060048201526014602482015273474f44533a20496e76616c69642065787069727960601b6044820152606401610312565b6103e88210156116b65760405162461bcd60e51b815260206004820152601360248201527211d3d114ce88119959481d1bdbc81cdb585b1b606a1b6044820152606401610312565b601780549060006116c683613de5565b91905055506040518060c001604052808681526020018381526020016116e93390565b6001600160a01b0390811682526001600160401b038781166020808501919091528583166040808601919091528883166060958601526017805460009081526016845282902087518155928701516001840155868201516002840180546001600160a01b03191691871691909117905594860151600383015560808601516004909201805460a090970151929094166001600160e01b031990961695909517600160a01b91909216021790555490517f77052b2367afdecb08333686669392683def2caf5e5d8a8d56a22dd073262aec906117cd9088908890889088908890613be1565b60405180910390a25050505050565b6117e461278c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b031680610b5d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610312565b60006001600160a01b0382166118d05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610312565b506001600160a01b031660009081526003602052604090205490565b6118f461278c565b6118fe60006128e5565b565b6000818152601660205260409020600201546001600160a01b0316336001600160a01b0316146119695760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08185d5d1a1bdc9a5cd95960621b6044820152606401610312565b6000818152601660205260409020600301544210156119be5760405162461bcd60e51b815260206004820152601160248201527011d3d114ce88109a5908195e1c1a5c9959607a1b6044820152606401610312565b60008181526016602052604080822060030191909155517f69ab749e4aaa54cb895bf6b476d031e7eb383e9f296e97f0329f74b066e32981906114739083815260200190565b6000611a0f8261256f565b60008281526015602052604090205442600160a01b9091046001600160401b031610611a5957600082815260156020526040902054600160a01b90046001600160401b0316611a5c565b60005b6001600160401b031692915050565b611a7361278c565b611a7b612817565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd9190613dfe565b6008541015611b4e5760405162461bcd60e51b815260206004820152601860248201527f474f44533a204e6f7420616c6c2061697264726f7070656400000000000000006044820152606401610312565b6011546001600160a01b0316611b9c5760405162461bcd60e51b8152602060048201526013602482015272474f44533a20546f206164647265737328302960681b6044820152606401610312565b611188611ba860085490565b11158015611bb55750805a115b15611be857601154611be3906001600160a01b0316611bd360085490565b611bde906001613e17565b612937565b611b9c565b61103c6001600b55565b606060018054610b7290613b16565b611c0961278c565b611c11612817565b6000806000600e546001611c259190613e17565b90505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caa9190613dfe565b8111158015611cb85750835a115b15611e06576040516331a9108f60e11b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015611d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d469190613e2a565b60405163d8c3bb5b60e01b8152600481018390529093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d8c3bb5b90602401602060405180830381865afa158015611dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd29190613e47565b15611df1576000818152600d60205260409020805460ff191660011790555b611dfb8382612937565b905060018101611c28565b50600e555061103c6001600b55565b81611e1f816125ce565b610c308383612951565b611e3161278c565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b611e5b61278c565b6013805460ff1916911515919091179055565b836001600160a01b0381163314611e8857611e88336125ce565b611e948585858561295c565b5050505050565b6000611ea68261256f565b60008281526015602052604090205442600160a01b9091046001600160401b031610611ee9576000828152601560205260409020546001600160a01b0316610b5d565b600092915050565b6060611efc8261256f565b6000600f8054611f0b90613b16565b905011611f275760405180602001604052806000815250610b5d565b600f611f328361298e565b6010604051602001611f4693929190613ed7565b60405160208183030381529060405292915050565b611f6361278c565b60106115788282613d26565b60135460ff16611f915760405162461bcd60e51b815260040161031290613b7c565b611f9a83611806565b6001600160a01b0316336001600160a01b031614611fec5760405162461bcd60e51b815260206004820152600f60248201526e23a7a2299d102737ba1037bbb732b960891b6044820152606401610312565b610c30838383612a96565b60135460ff166120195760405162461bcd60e51b815260040161031290613b7c565b612021612817565b61202a8161256f565b61203381611806565b6001600160a01b0316330361208a5760405162461bcd60e51b815260206004820152601b60248201527f474f44533a2043616e6e6f742072656e74206f776e20746f6b656e00000000006044820152606401610312565b6000818152601860205260409020600101546001600160a01b03166120ae82611806565b6001600160a01b0316146121045760405162461bcd60e51b815260206004820152601860248201527f474f44533a204c656e6465722063616e6e6f742072656e7400000000000000006044820152606401610312565b60008181526018602052604090206001015442600160a01b9091046001600160401b0316101561216c5760405162461bcd60e51b815260206004820152601360248201527211d3d114ce8813d999995c88195e1c1a5c9959606a1b6044820152606401610312565b600081815260186020526040902060018101805467ffffffffffffffff60a01b19169055546012541561233a5760006103e86012546103e86121ae9190613c5d565b6121b89084613c70565b6121c29190613c9d565b905060006121d08284613c5d565b6000858152601860205260409020600201549091506001600160a01b03166122d057600084815260186020526040902054341461224f5760405162461bcd60e51b815260206004820152601c60248201527f474f44533a20496e636f727265637420616d6f756e74207061796564000000006044820152606401610312565b600061225a85611806565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146122a4576040519150601f19603f3d011682016040523d82523d6000602084013e6122a9565b606091505b50509050806122ca5760405162461bcd60e51b815260040161031290613c19565b50612333565b612300336122dd86611806565b6000878152601860205260409020600201546001600160a01b0316919085612870565b801561233357612333336011546000878152601860205260409020600201546001600160a01b0390811692911684612870565b505061240a565b6000828152601860205260409020600201546001600160a01b03166123da57600061236483611806565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146123ae576040519150601f19603f3d011682016040523d82523d6000602084013e6123b3565b606091505b50509050806123d45760405162461bcd60e51b815260040161031290613c19565b5061240a565b61240a336123e784611806565b6000858152601860205260409020600201546001600160a01b0316919084612870565b612440823360008581526018602052604090206002015461243b90600160a01b90046001600160401b031642613e17565b612a96565b5061103c6001600b55565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cf9190613dfe565b905090565b6124dc61278c565b6001600160a01b0381166125415760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610312565b61103c816128e5565b60006001600160e01b0319821663780e9d6360e01b1480610b5d5750610b5d82612b94565b6000818152600260205260409020546001600160a01b031661103c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610312565b600c546001600160a01b03163b1561103c57600c54604051633185c44d60e21b81523060048201526001600160a01b0383811660248301529091169063c617113490604401602060405180830381865afa158015612630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126549190613e47565b61103c57604051633b79c77360e21b81526001600160a01b0382166004820152602401610312565b600061268782611806565b9050806001600160a01b0316836001600160a01b0316036126f45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610312565b336001600160a01b038216148061271057506127108133610aa1565b6127825760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610312565b610c308383612be4565b600a546001600160a01b031633146118fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610312565b6127f03382612c52565b61280c5760405162461bcd60e51b815260040161031290613eff565b610c30838383612cd0565b6002600b54036128695760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610312565b6002600b55565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610faa908590612e86565b610c3083838360405180602001604052806000815250611e6e565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611578828260405180602001604052806000815250612f58565b611578338383612f8b565b6129663383612c52565b6129825760405162461bcd60e51b815260040161031290613eff565b610faa84848484613051565b6060816000036129b55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129df57806129c981613de5565b91506129d89050600a83613c9d565b91506129b9565b6000816001600160401b038111156129f9576129f96138e5565b6040519080825280601f01601f191660200182016040528015612a23576020820181803683370190505b5090505b8415612a8e57612a38600183613c5d565b9150612a45600a86613f4c565b612a50906030613e17565b60f81b818381518110612a6557612a65613b50565b60200101906001600160f81b031916908160001a905350612a87600a86613c9d565b9450612a27565b949350505050565b612a9f8361256f565b6000838152601560205260409020546001600160a01b03161580612ae1575060008381526015602052604090205442600160a01b9091046001600160401b0316105b612afd5760405162461bcd60e51b815260040161031290613bb1565b6040805180820182526001600160a01b038481168083526001600160401b03858116602080860182815260008b81526015835288902096518754915196166001600160e01b031990911617600160a01b959093169490940291909117909355925191825285917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe91015b60405180910390a3505050565b60006001600160e01b031982166380ac58cd60e01b1480612bc557506001600160e01b03198216635b5e139f60e01b145b80610b5d57506301ffc9a760e01b6001600160e01b0319831614610b5d565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c1982611806565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612c5e83611806565b9050806001600160a01b0316846001600160a01b03161480612ca557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80612a8e5750836001600160a01b0316612cbe84610bf5565b6001600160a01b031614949350505050565b826001600160a01b0316612ce382611806565b6001600160a01b031614612d475760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610312565b6001600160a01b038216612da95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610312565b612db4838383613084565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b038616835260039091528120805460019290612df7908490613c5d565b90915550506001600160a01b0382166000908152600360205260408120805460019290612e25908490613e17565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612edb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661313c9092919063ffffffff16565b805190915015610c305780806020019051810190612ef99190613e47565b610c305760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610312565b612f62838361314b565b612f6f6000848484613299565b610c305760405162461bcd60e51b815260040161031290613f60565b816001600160a01b0316836001600160a01b031603612fec5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610312565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101612b87565b61305c848484612cd0565b61306884848484613299565b610faa5760405162461bcd60e51b815260040161031290613f60565b6001600160a01b0383166130df576130da81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613102565b816001600160a01b0316836001600160a01b03161461310257613102838261339a565b6001600160a01b03821661311957610c3081613437565b826001600160a01b0316826001600160a01b031614610c3057610c3082826134e6565b6060612a8e848460008561352a565b6001600160a01b0382166131a15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610312565b6000818152600260205260409020546001600160a01b0316156132065760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610312565b61321260008383613084565b6001600160a01b038216600090815260036020526040812080546001929061323b908490613e17565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561338f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906132dd903390899088908890600401613fb2565b6020604051808303816000875af1925050508015613318575060408051601f3d908101601f1916820190925261331591810190613fef565b60015b613375573d808015613346576040519150601f19603f3d011682016040523d82523d6000602084013e61334b565b606091505b50805160000361336d5760405162461bcd60e51b815260040161031290613f60565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a8e565b506001949350505050565b600060016133a784611866565b6133b19190613c5d565b600083815260076020526040902054909150808214613404576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061344990600190613c5d565b6000838152600960205260408120546008805493945090928490811061347157613471613b50565b90600052602060002001549050806008838154811061349257613492613b50565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806134ca576134ca61400c565b6001900381819060005260206000200160009055905550505050565b60006134f183611866565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60608247101561358b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610312565b600080866001600160a01b031685876040516135a79190614022565b60006040518083038185875af1925050503d80600081146135e4576040519150601f19603f3d011682016040523d82523d6000602084013e6135e9565b606091505b50915091506135fa87838387613605565b979650505050505050565b6060831561367457825160000361366d576001600160a01b0385163b61366d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610312565b5081612a8e565b612a8e83838151156136895781518083602001fd5b8060405162461bcd60e51b8152600401610312919061372d565b6001600160e01b03198116811461103c57600080fd5b6000602082840312156136cb57600080fd5b81356136d6816136a3565b9392505050565b60005b838110156136f85781810151838201526020016136e0565b50506000910152565b600081518084526137198160208601602086016136dd565b601f01601f19169290920160200192915050565b6020815260006136d66020830184613701565b60006020828403121561375257600080fd5b5035919050565b6001600160a01b038116811461103c57600080fd5b6000806040838503121561378157600080fd5b823561378c81613759565b946020939093013593505050565b801515811461103c57600080fd5b6000806000604084860312156137bd57600080fd5b83356001600160401b03808211156137d457600080fd5b818601915086601f8301126137e857600080fd5b8135818111156137f757600080fd5b8760208260051b850101111561380c57600080fd5b602092830195509350508401356138228161379a565b809150509250925092565b80356001600160401b038116811461384457600080fd5b919050565b600080600080600060a0868803121561386157600080fd5b853594506138716020870161382d565b935061387f6040870161382d565b925060608601359150608086013561389681613759565b809150509295509295909350565b6000806000606084860312156138b957600080fd5b83356138c481613759565b925060208401356138d481613759565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115613915576139156138e5565b604051601f8501601f19908116603f0116810190828211818310171561393d5761393d6138e5565b8160405280935085815286868601111561395657600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561398257600080fd5b81356001600160401b0381111561399857600080fd5b8201601f810184136139a957600080fd5b612a8e848235602084016138fb565b6000602082840312156139ca57600080fd5b81356136d681613759565b600080604083850312156139e857600080fd5b82356139f381613759565b91506020830135613a038161379a565b809150509250929050565b600060208284031215613a2057600080fd5b81356136d68161379a565b60008060008060808587031215613a4157600080fd5b8435613a4c81613759565b93506020850135613a5c81613759565b92506040850135915060608501356001600160401b03811115613a7e57600080fd5b8501601f81018713613a8f57600080fd5b613a9e878235602084016138fb565b91505092959194509250565b600080600060608486031215613abf57600080fd5b833592506020840135613ad181613759565b9150613adf6040850161382d565b90509250925092565b60008060408385031215613afb57600080fd5b8235613b0681613759565b91506020830135613a0381613759565b600181811c90821680613b2a57607f821691505b602082108103613b4a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6020808252818101527f474f44533a2052656e742069732063757272656e746c792064697361626c6564604082015260600190565b60208082526016908201527511d3d114ce8810dd5c9c995b9d1b1e4814995b9d195960521b604082015260600190565b9485526001600160401b03938416602086015291909216604084015260608301919091526001600160a01b0316608082015260a00190565b6020808252601490820152732330b4b632b2103a379039b2b7321022ba3432b960611b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b5d57610b5d613c47565b8082028115828204841417610b5d57610b5d613c47565b634e487b7160e01b600052601260045260246000fd5b600082613cac57613cac613c87565b500490565b6001600160401b03818116838216019080821115613cd157613cd1613c47565b5092915050565b601f821115610c3057600081815260208120601f850160051c81016020861015613cff5750805b601f850160051c820191505b81811015613d1e57828155600101613d0b565b505050505050565b81516001600160401b03811115613d3f57613d3f6138e5565b613d5381613d4d8454613b16565b84613cd8565b602080601f831160018114613d885760008415613d705750858301515b600019600386901b1c1916600185901b178555613d1e565b600085815260208120601f198616915b82811015613db757888601518255948401946001909101908401613d98565b5085821015613dd55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613df757613df7613c47565b5060010190565b600060208284031215613e1057600080fd5b5051919050565b80820180821115610b5d57610b5d613c47565b600060208284031215613e3c57600080fd5b81516136d681613759565b600060208284031215613e5957600080fd5b81516136d68161379a565b60008154613e7181613b16565b60018281168015613e895760018114613e9e57613ecd565b60ff1984168752821515830287019450613ecd565b8560005260208060002060005b85811015613ec45781548a820152908401908201613eab565b50505082870194505b5050505092915050565b6000613ee38286613e64565b8451613ef38183602089016136dd565b6135fa81830186613e64565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600082613f5b57613f5b613c87565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613fe590830184613701565b9695505050505050565b60006020828403121561400157600080fd5b81516136d6816136a3565b634e487b7160e01b600052603160045260246000fd5b600082516140348184602087016136dd565b919091019291505056fea26469706673582212207a22010f2816782453f5aea0c3b94f19819d5ec8bdcd016a9c7d8a1563beacd864736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002a7334c0361b33526f2793e808a4b79d0b87af200000000000000000000000000000000000000000000000000000000000000016496e66696e69476f64733a20456c64657220476f6473000000000000000000000000000000000000000000000000000000000000000000000000000000000004474f445300000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102cd5760003560e01c80637456be7d11610175578063c2f1f14a116100dc578063e744092e11610095578063e985e9c51161006f578063e985e9c514610a86578063f065d72414610acf578063f2fde38b14610ae4578063f6d22bdc14610b045761031b565b8063e744092e14610a2a578063e7a7fa4c14610a5a578063e8f2029814610a705761031b565b8063c2f1f14a14610967578063c87b56dd14610987578063d8c3bb5b146109a7578063da3ef23f146109d7578063e030565e146109f7578063e05a20e714610a175761031b565b806397dc4a131161012e57806397dc4a131461089f578063a22cb465146108bf578063a6f353f0146108df578063aa19a7c5146108ff578063ad5c46481461091f578063b88d4fde146109475761031b565b80637456be7d1461079d5780638bebfca91461080c5780638da5cb5b1461082c5780638fc88c481461084a57806392d80ead1461086a57806395d89b411461088a5761031b565b806341f434341161023457806355f804b3116101ed5780636352211e116101c75780636352211e1461072e57806370a082311461074e578063715018a61461076e578063736a1fdd146107835761031b565b806355f804b3146106ce5780635be310cc146106ee5780635de8dc411461070e5761031b565b806341f434341461059057806342842e0e146105b057806343175240146105d0578063442e351b146105f0578063451588381461068e5780634f6ccce7146106ae5761031b565b80631f52a0d1116102865780631f52a0d11461044f5780632279bc06146104fb57806323b872dd1461051b57806324600fc31461053b5780632b1fd58a146105505780632f745c59146105705761031b565b806301ffc9a71461035f57806306fdde0314610394578063081812fc146103b6578063095ea7b3146103ee5780630d189fcc1461041057806318160ddd146104305761031b565b3661031b5760405162461bcd60e51b815260206004820152601960248201527811d3d114ce88155b9c9958dbd9db9a5cd959081b595d1a1bd9603a1b60448201526064015b60405180910390fd5b60405162461bcd60e51b815260206004820152601960248201527811d3d114ce88155b9c9958dbd9db9a5cd959081b595d1a1bd9603a1b6044820152606401610312565b34801561036b57600080fd5b5061037f61037a3660046136b9565b610b38565b60405190151581526020015b60405180910390f35b3480156103a057600080fd5b506103a9610b63565b60405161038b919061372d565b3480156103c257600080fd5b506103d66103d1366004613740565b610bf5565b6040516001600160a01b03909116815260200161038b565b3480156103fa57600080fd5b5061040e61040936600461376e565b610c1c565b005b34801561041c57600080fd5b5061040e61042b3660046137a8565b610c35565b34801561043c57600080fd5b506008545b60405190815260200161038b565b34801561045b57600080fd5b506104b661046a366004613740565b60166020526000908152604090208054600182015460028301546003840154600490940154929391926001600160a01b039182169291811690600160a01b90046001600160401b031686565b6040805196875260208701959095526001600160a01b039384169486019490945260608501919091521660808301526001600160401b031660a082015260c00161038b565b34801561050757600080fd5b5061040e610516366004613849565b610cf8565b34801561052757600080fd5b5061040e6105363660046138a4565b610f85565b34801561054757600080fd5b5061040e610fb0565b34801561055c57600080fd5b5061040e61056b366004613740565b61103f565b34801561057c57600080fd5b5061044161058b36600461376e565b6112fa565b34801561059c57600080fd5b50600c546103d6906001600160a01b031681565b3480156105bc57600080fd5b5061040e6105cb3660046138a4565b611390565b3480156105dc57600080fd5b5061040e6105eb366004613740565b6113b5565b3480156105fc57600080fd5b5061065361060b366004613740565b60186020526000908152604090208054600182015460029092015490916001600160a01b03808216926001600160401b03600160a01b93849004811693928216929091041685565b604080519586526001600160a01b0394851660208701526001600160401b03938416908601529216606084015216608082015260a00161038b565b34801561069a57600080fd5b5061040e6106a9366004613740565b61147e565b3480156106ba57600080fd5b506104416106c9366004613740565b6114d1565b3480156106da57600080fd5b5061040e6106e9366004613970565b611564565b3480156106fa57600080fd5b5061040e610709366004613849565b61157c565b34801561071a57600080fd5b5061040e6107293660046139b8565b6117dc565b34801561073a57600080fd5b506103d6610749366004613740565b611806565b34801561075a57600080fd5b506104416107693660046139b8565b611866565b34801561077a57600080fd5b5061040e6118ec565b34801561078f57600080fd5b5060135461037f9060ff1681565b3480156107a957600080fd5b506107e56107b8366004613740565b6015602052600090815260409020546001600160a01b03811690600160a01b90046001600160401b031682565b604080516001600160a01b0390931683526001600160401b0390911660208301520161038b565b34801561081857600080fd5b5061040e610827366004613740565b611900565b34801561083857600080fd5b50600a546001600160a01b03166103d6565b34801561085657600080fd5b50610441610865366004613740565b611a04565b34801561087657600080fd5b5061040e610885366004613740565b611a6b565b34801561089657600080fd5b506103a9611bf2565b3480156108ab57600080fd5b5061040e6108ba366004613740565b611c01565b3480156108cb57600080fd5b5061040e6108da3660046139d5565b611e15565b3480156108eb57600080fd5b5061040e6108fa3660046139b8565b611e29565b34801561090b57600080fd5b5061040e61091a366004613a0e565b611e53565b34801561092b57600080fd5b506103d673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561095357600080fd5b5061040e610962366004613a2b565b611e6e565b34801561097357600080fd5b506103d6610982366004613740565b611e9b565b34801561099357600080fd5b506103a96109a2366004613740565b611ef1565b3480156109b357600080fd5b5061037f6109c2366004613740565b600d6020526000908152604090205460ff1681565b3480156109e357600080fd5b5061040e6109f2366004613970565b611f5b565b348015610a0357600080fd5b5061040e610a12366004613aaa565b611f6f565b61040e610a25366004613740565b611ff7565b348015610a3657600080fd5b5061037f610a453660046139b8565b60146020526000908152604090205460ff1681565b348015610a6657600080fd5b5061044160175481565b348015610a7c57600080fd5b5061044160125481565b348015610a9257600080fd5b5061037f610aa1366004613ae8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610adb57600080fd5b5061044161244b565b348015610af057600080fd5b5061040e610aff3660046139b8565b6124d4565b348015610b1057600080fd5b506103d67f0000000000000000000000002a7334c0361b33526f2793e808a4b79d0b87af2081565b60006001600160e01b03198216632b424ad760e21b1480610b5d5750610b5d8261254a565b92915050565b606060008054610b7290613b16565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9e90613b16565b8015610beb5780601f10610bc057610100808354040283529160200191610beb565b820191906000526020600020905b815481529060010190602001808311610bce57829003601f168201915b5050505050905090565b6000610c008261256f565b506000908152600460205260409020546001600160a01b031690565b81610c26816125ce565b610c30838361267c565b505050565b610c3d61278c565b60005b82811015610ca4578160146000868685818110610c5f57610c5f613b50565b9050602002016020810190610c7491906139b8565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101610c40565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260005260146020527f87303f144ffb2d9f4aca90a0e9e77718a587dc422035d9cb2b7c0ec93e3268cc5460ff161515600114610c3057610c30613b66565b60135460ff16610d1a5760405162461bcd60e51b815260040161031290613b7c565b610d238561256f565b6001600160a01b03811660009081526014602052604090205460ff16610d865760405162461bcd60e51b815260206004820152601860248201527723a7a2299d102ab73932b1b7b3b734b9b2b2103a37b5b2b760411b6044820152606401610312565b610d8f85611806565b6001600160a01b0316336001600160a01b031614610de65760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08105d5d1a1bdc9a5cd95960621b6044820152606401610312565b6103e8821015610e305760405162461bcd60e51b815260206004820152601560248201527411d3d114ce88141c9a58d9481d1bdbc81cdb585b1b605a1b6044820152606401610312565b6000858152601560205260409020546001600160a01b03161580610e72575060008581526015602052604090205442600160a01b9091046001600160401b0316105b610e8e5760405162461bcd60e51b815260040161031290613bb1565b6040518060a00160405280838152602001610ea63390565b6001600160a01b0390811682526001600160401b0387811660208085019190915285831660408086019190915288831660609586015260008b8152601883528190208651815591860151600183018054888401519287166001600160e01b031991821617600160a01b93871684021790915595870151600290930180546080909801519390951696909516959095179116909202919091179055517f42ace40e3037b2aee9817523cd2d9f78d8d970ff4f312efcd0ce62bb8155c8ef90610f769087908790879087908790613be1565b60405180910390a15050505050565b826001600160a01b0381163314610f9f57610f9f336125ce565b610faa8484846127e6565b50505050565b610fb861278c565b6000610fcc600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611016576040519150601f19603f3d011682016040523d82523d6000602084013e61101b565b606091505b505090508061103c5760405162461bcd60e51b815260040161031290613c19565b50565b60135460ff166110615760405162461bcd60e51b815260040161031290613b7c565b611069612817565b600081815260166020908152604091829020825160c0810184528154815260018201549281019290925260028101546001600160a01b039081169383019390935260038101546060830152600401549182166080820152600160a01b9091046001600160401b031660a0820152336001600160a01b03166110ed8260000151611806565b6001600160a01b0316146111435760405162461bcd60e51b815260206004820152601d60248201527f474f44533a2043616c6c6572206973206e6f7420746865206f776e65720000006044820152606401610312565b80516000908152601560205260409020546001600160a01b031615806111895750805160009081526015602052604090205442600160a01b9091046001600160401b0316105b6111a55760405162461bcd60e51b815260040161031290613bb1565b42816060015110156111ed5760405162461bcd60e51b815260206004820152601160248201527011d3d114ce88109a5908195e1c1a5c9959607a1b6044820152606401610312565b6000828152601660209081526040822060030191909155810151601254156112a65760006103e86012546103e86112249190613c5d565b61122e9084613c70565b6112389190613c9d565b905060006112468284613c5d565b9050611273846040015161125d8660000151611806565b60808701516001600160a01b0316919085612870565b801561129f576040840151601154608086015161129f926001600160a01b039182169290911684612870565b50506112d1565b6112d182604001516112bb8460000151611806565b60808501516001600160a01b0316919084612870565b6112ee826000015183604001518460a0015142610a129190613cb1565b505061103c6001600b55565b600061130583611866565b82106113675760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610312565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b826001600160a01b03811633146113aa576113aa336125ce565b610faa8484846128ca565b6113be8161256f565b6113c781611806565b6001600160a01b0316336001600160a01b03161461141e5760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08105d5d1a1bdc9a5cd95960621b6044820152606401610312565b60008181526018602052604090819020600101805467ffffffffffffffff60a01b19169055517fba0cfc80212aa6a8565e0a9ad22bc7d9b199899af209dedb6cef0df681077ea4906114739083815260200190565b60405180910390a150565b61148661278c565b6103e881106114cc5760405162461bcd60e51b815260206004820152601260248201527108e9e88a674408ccaca40e8dede40d0d2ced60731b6044820152606401610312565b601255565b60006114dc60085490565b821061153f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610312565b6008828154811061155257611552613b50565b90600052602060002001549050919050565b61156c61278c565b600f6115788282613d26565b5050565b60135460ff1661159e5760405162461bcd60e51b815260040161031290613b7c565b6115a78561256f565b6001600160a01b03811660009081526014602052604090205460ff1680156115d757506001600160a01b03811615155b61161e5760405162461bcd60e51b815260206004820152601860248201527723a7a2299d102ab73932b1b7b3b734b9b2b2103a37b5b2b760411b6044820152606401610312565b42846001600160401b0316101561166e5760405162461bcd60e51b8152602060048201526014602482015273474f44533a20496e76616c69642065787069727960601b6044820152606401610312565b6103e88210156116b65760405162461bcd60e51b815260206004820152601360248201527211d3d114ce88119959481d1bdbc81cdb585b1b606a1b6044820152606401610312565b601780549060006116c683613de5565b91905055506040518060c001604052808681526020018381526020016116e93390565b6001600160a01b0390811682526001600160401b038781166020808501919091528583166040808601919091528883166060958601526017805460009081526016845282902087518155928701516001840155868201516002840180546001600160a01b03191691871691909117905594860151600383015560808601516004909201805460a090970151929094166001600160e01b031990961695909517600160a01b91909216021790555490517f77052b2367afdecb08333686669392683def2caf5e5d8a8d56a22dd073262aec906117cd9088908890889088908890613be1565b60405180910390a25050505050565b6117e461278c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b031680610b5d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610312565b60006001600160a01b0382166118d05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610312565b506001600160a01b031660009081526003602052604090205490565b6118f461278c565b6118fe60006128e5565b565b6000818152601660205260409020600201546001600160a01b0316336001600160a01b0316146119695760405162461bcd60e51b815260206004820152601460248201527311d3d114ce88139bdd08185d5d1a1bdc9a5cd95960621b6044820152606401610312565b6000818152601660205260409020600301544210156119be5760405162461bcd60e51b815260206004820152601160248201527011d3d114ce88109a5908195e1c1a5c9959607a1b6044820152606401610312565b60008181526016602052604080822060030191909155517f69ab749e4aaa54cb895bf6b476d031e7eb383e9f296e97f0329f74b066e32981906114739083815260200190565b6000611a0f8261256f565b60008281526015602052604090205442600160a01b9091046001600160401b031610611a5957600082815260156020526040902054600160a01b90046001600160401b0316611a5c565b60005b6001600160401b031692915050565b611a7361278c565b611a7b612817565b7f0000000000000000000000002a7334c0361b33526f2793e808a4b79d0b87af206001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611afd9190613dfe565b6008541015611b4e5760405162461bcd60e51b815260206004820152601860248201527f474f44533a204e6f7420616c6c2061697264726f7070656400000000000000006044820152606401610312565b6011546001600160a01b0316611b9c5760405162461bcd60e51b8152602060048201526013602482015272474f44533a20546f206164647265737328302960681b6044820152606401610312565b611188611ba860085490565b11158015611bb55750805a115b15611be857601154611be3906001600160a01b0316611bd360085490565b611bde906001613e17565b612937565b611b9c565b61103c6001600b55565b606060018054610b7290613b16565b611c0961278c565b611c11612817565b6000806000600e546001611c259190613e17565b90505b7f0000000000000000000000002a7334c0361b33526f2793e808a4b79d0b87af206001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caa9190613dfe565b8111158015611cb85750835a115b15611e06576040516331a9108f60e11b8152600481018290527f0000000000000000000000002a7334c0361b33526f2793e808a4b79d0b87af206001600160a01b031690636352211e90602401602060405180830381865afa158015611d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d469190613e2a565b60405163d8c3bb5b60e01b8152600481018390529093507f0000000000000000000000002a7334c0361b33526f2793e808a4b79d0b87af206001600160a01b03169063d8c3bb5b90602401602060405180830381865afa158015611dae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd29190613e47565b15611df1576000818152600d60205260409020805460ff191660011790555b611dfb8382612937565b905060018101611c28565b50600e555061103c6001600b55565b81611e1f816125ce565b610c308383612951565b611e3161278c565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b611e5b61278c565b6013805460ff1916911515919091179055565b836001600160a01b0381163314611e8857611e88336125ce565b611e948585858561295c565b5050505050565b6000611ea68261256f565b60008281526015602052604090205442600160a01b9091046001600160401b031610611ee9576000828152601560205260409020546001600160a01b0316610b5d565b600092915050565b6060611efc8261256f565b6000600f8054611f0b90613b16565b905011611f275760405180602001604052806000815250610b5d565b600f611f328361298e565b6010604051602001611f4693929190613ed7565b60405160208183030381529060405292915050565b611f6361278c565b60106115788282613d26565b60135460ff16611f915760405162461bcd60e51b815260040161031290613b7c565b611f9a83611806565b6001600160a01b0316336001600160a01b031614611fec5760405162461bcd60e51b815260206004820152600f60248201526e23a7a2299d102737ba1037bbb732b960891b6044820152606401610312565b610c30838383612a96565b60135460ff166120195760405162461bcd60e51b815260040161031290613b7c565b612021612817565b61202a8161256f565b61203381611806565b6001600160a01b0316330361208a5760405162461bcd60e51b815260206004820152601b60248201527f474f44533a2043616e6e6f742072656e74206f776e20746f6b656e00000000006044820152606401610312565b6000818152601860205260409020600101546001600160a01b03166120ae82611806565b6001600160a01b0316146121045760405162461bcd60e51b815260206004820152601860248201527f474f44533a204c656e6465722063616e6e6f742072656e7400000000000000006044820152606401610312565b60008181526018602052604090206001015442600160a01b9091046001600160401b0316101561216c5760405162461bcd60e51b815260206004820152601360248201527211d3d114ce8813d999995c88195e1c1a5c9959606a1b6044820152606401610312565b600081815260186020526040902060018101805467ffffffffffffffff60a01b19169055546012541561233a5760006103e86012546103e86121ae9190613c5d565b6121b89084613c70565b6121c29190613c9d565b905060006121d08284613c5d565b6000858152601860205260409020600201549091506001600160a01b03166122d057600084815260186020526040902054341461224f5760405162461bcd60e51b815260206004820152601c60248201527f474f44533a20496e636f727265637420616d6f756e74207061796564000000006044820152606401610312565b600061225a85611806565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146122a4576040519150601f19603f3d011682016040523d82523d6000602084013e6122a9565b606091505b50509050806122ca5760405162461bcd60e51b815260040161031290613c19565b50612333565b612300336122dd86611806565b6000878152601860205260409020600201546001600160a01b0316919085612870565b801561233357612333336011546000878152601860205260409020600201546001600160a01b0390811692911684612870565b505061240a565b6000828152601860205260409020600201546001600160a01b03166123da57600061236483611806565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146123ae576040519150601f19603f3d011682016040523d82523d6000602084013e6123b3565b606091505b50509050806123d45760405162461bcd60e51b815260040161031290613c19565b5061240a565b61240a336123e784611806565b6000858152601860205260409020600201546001600160a01b0316919084612870565b612440823360008581526018602052604090206002015461243b90600160a01b90046001600160401b031642613e17565b612a96565b5061103c6001600b55565b60007f0000000000000000000000002a7334c0361b33526f2793e808a4b79d0b87af206001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cf9190613dfe565b905090565b6124dc61278c565b6001600160a01b0381166125415760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610312565b61103c816128e5565b60006001600160e01b0319821663780e9d6360e01b1480610b5d5750610b5d82612b94565b6000818152600260205260409020546001600160a01b031661103c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610312565b600c546001600160a01b03163b1561103c57600c54604051633185c44d60e21b81523060048201526001600160a01b0383811660248301529091169063c617113490604401602060405180830381865afa158015612630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126549190613e47565b61103c57604051633b79c77360e21b81526001600160a01b0382166004820152602401610312565b600061268782611806565b9050806001600160a01b0316836001600160a01b0316036126f45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610312565b336001600160a01b038216148061271057506127108133610aa1565b6127825760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610312565b610c308383612be4565b600a546001600160a01b031633146118fe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610312565b6127f03382612c52565b61280c5760405162461bcd60e51b815260040161031290613eff565b610c30838383612cd0565b6002600b54036128695760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610312565b6002600b55565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610faa908590612e86565b610c3083838360405180602001604052806000815250611e6e565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611578828260405180602001604052806000815250612f58565b611578338383612f8b565b6129663383612c52565b6129825760405162461bcd60e51b815260040161031290613eff565b610faa84848484613051565b6060816000036129b55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156129df57806129c981613de5565b91506129d89050600a83613c9d565b91506129b9565b6000816001600160401b038111156129f9576129f96138e5565b6040519080825280601f01601f191660200182016040528015612a23576020820181803683370190505b5090505b8415612a8e57612a38600183613c5d565b9150612a45600a86613f4c565b612a50906030613e17565b60f81b818381518110612a6557612a65613b50565b60200101906001600160f81b031916908160001a905350612a87600a86613c9d565b9450612a27565b949350505050565b612a9f8361256f565b6000838152601560205260409020546001600160a01b03161580612ae1575060008381526015602052604090205442600160a01b9091046001600160401b0316105b612afd5760405162461bcd60e51b815260040161031290613bb1565b6040805180820182526001600160a01b038481168083526001600160401b03858116602080860182815260008b81526015835288902096518754915196166001600160e01b031990911617600160a01b959093169490940291909117909355925191825285917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe91015b60405180910390a3505050565b60006001600160e01b031982166380ac58cd60e01b1480612bc557506001600160e01b03198216635b5e139f60e01b145b80610b5d57506301ffc9a760e01b6001600160e01b0319831614610b5d565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612c1982611806565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612c5e83611806565b9050806001600160a01b0316846001600160a01b03161480612ca557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80612a8e5750836001600160a01b0316612cbe84610bf5565b6001600160a01b031614949350505050565b826001600160a01b0316612ce382611806565b6001600160a01b031614612d475760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610312565b6001600160a01b038216612da95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610312565b612db4838383613084565b600081815260046020908152604080832080546001600160a01b03191690556001600160a01b038616835260039091528120805460019290612df7908490613c5d565b90915550506001600160a01b0382166000908152600360205260408120805460019290612e25908490613e17565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000612edb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661313c9092919063ffffffff16565b805190915015610c305780806020019051810190612ef99190613e47565b610c305760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610312565b612f62838361314b565b612f6f6000848484613299565b610c305760405162461bcd60e51b815260040161031290613f60565b816001600160a01b0316836001600160a01b031603612fec5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610312565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319101612b87565b61305c848484612cd0565b61306884848484613299565b610faa5760405162461bcd60e51b815260040161031290613f60565b6001600160a01b0383166130df576130da81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613102565b816001600160a01b0316836001600160a01b03161461310257613102838261339a565b6001600160a01b03821661311957610c3081613437565b826001600160a01b0316826001600160a01b031614610c3057610c3082826134e6565b6060612a8e848460008561352a565b6001600160a01b0382166131a15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610312565b6000818152600260205260409020546001600160a01b0316156132065760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610312565b61321260008383613084565b6001600160a01b038216600090815260036020526040812080546001929061323b908490613e17565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561338f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906132dd903390899088908890600401613fb2565b6020604051808303816000875af1925050508015613318575060408051601f3d908101601f1916820190925261331591810190613fef565b60015b613375573d808015613346576040519150601f19603f3d011682016040523d82523d6000602084013e61334b565b606091505b50805160000361336d5760405162461bcd60e51b815260040161031290613f60565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a8e565b506001949350505050565b600060016133a784611866565b6133b19190613c5d565b600083815260076020526040902054909150808214613404576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061344990600190613c5d565b6000838152600960205260408120546008805493945090928490811061347157613471613b50565b90600052602060002001549050806008838154811061349257613492613b50565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806134ca576134ca61400c565b6001900381819060005260206000200160009055905550505050565b60006134f183611866565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60608247101561358b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610312565b600080866001600160a01b031685876040516135a79190614022565b60006040518083038185875af1925050503d80600081146135e4576040519150601f19603f3d011682016040523d82523d6000602084013e6135e9565b606091505b50915091506135fa87838387613605565b979650505050505050565b6060831561367457825160000361366d576001600160a01b0385163b61366d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610312565b5081612a8e565b612a8e83838151156136895781518083602001fd5b8060405162461bcd60e51b8152600401610312919061372d565b6001600160e01b03198116811461103c57600080fd5b6000602082840312156136cb57600080fd5b81356136d6816136a3565b9392505050565b60005b838110156136f85781810151838201526020016136e0565b50506000910152565b600081518084526137198160208601602086016136dd565b601f01601f19169290920160200192915050565b6020815260006136d66020830184613701565b60006020828403121561375257600080fd5b5035919050565b6001600160a01b038116811461103c57600080fd5b6000806040838503121561378157600080fd5b823561378c81613759565b946020939093013593505050565b801515811461103c57600080fd5b6000806000604084860312156137bd57600080fd5b83356001600160401b03808211156137d457600080fd5b818601915086601f8301126137e857600080fd5b8135818111156137f757600080fd5b8760208260051b850101111561380c57600080fd5b602092830195509350508401356138228161379a565b809150509250925092565b80356001600160401b038116811461384457600080fd5b919050565b600080600080600060a0868803121561386157600080fd5b853594506138716020870161382d565b935061387f6040870161382d565b925060608601359150608086013561389681613759565b809150509295509295909350565b6000806000606084860312156138b957600080fd5b83356138c481613759565b925060208401356138d481613759565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b0380841115613915576139156138e5565b604051601f8501601f19908116603f0116810190828211818310171561393d5761393d6138e5565b8160405280935085815286868601111561395657600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561398257600080fd5b81356001600160401b0381111561399857600080fd5b8201601f810184136139a957600080fd5b612a8e848235602084016138fb565b6000602082840312156139ca57600080fd5b81356136d681613759565b600080604083850312156139e857600080fd5b82356139f381613759565b91506020830135613a038161379a565b809150509250929050565b600060208284031215613a2057600080fd5b81356136d68161379a565b60008060008060808587031215613a4157600080fd5b8435613a4c81613759565b93506020850135613a5c81613759565b92506040850135915060608501356001600160401b03811115613a7e57600080fd5b8501601f81018713613a8f57600080fd5b613a9e878235602084016138fb565b91505092959194509250565b600080600060608486031215613abf57600080fd5b833592506020840135613ad181613759565b9150613adf6040850161382d565b90509250925092565b60008060408385031215613afb57600080fd5b8235613b0681613759565b91506020830135613a0381613759565b600181811c90821680613b2a57607f821691505b602082108103613b4a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b6020808252818101527f474f44533a2052656e742069732063757272656e746c792064697361626c6564604082015260600190565b60208082526016908201527511d3d114ce8810dd5c9c995b9d1b1e4814995b9d195960521b604082015260600190565b9485526001600160401b03938416602086015291909216604084015260608301919091526001600160a01b0316608082015260a00190565b6020808252601490820152732330b4b632b2103a379039b2b7321022ba3432b960611b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610b5d57610b5d613c47565b8082028115828204841417610b5d57610b5d613c47565b634e487b7160e01b600052601260045260246000fd5b600082613cac57613cac613c87565b500490565b6001600160401b03818116838216019080821115613cd157613cd1613c47565b5092915050565b601f821115610c3057600081815260208120601f850160051c81016020861015613cff5750805b601f850160051c820191505b81811015613d1e57828155600101613d0b565b505050505050565b81516001600160401b03811115613d3f57613d3f6138e5565b613d5381613d4d8454613b16565b84613cd8565b602080601f831160018114613d885760008415613d705750858301515b600019600386901b1c1916600185901b178555613d1e565b600085815260208120601f198616915b82811015613db757888601518255948401946001909101908401613d98565b5085821015613dd55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613df757613df7613c47565b5060010190565b600060208284031215613e1057600080fd5b5051919050565b80820180821115610b5d57610b5d613c47565b600060208284031215613e3c57600080fd5b81516136d681613759565b600060208284031215613e5957600080fd5b81516136d68161379a565b60008154613e7181613b16565b60018281168015613e895760018114613e9e57613ecd565b60ff1984168752821515830287019450613ecd565b8560005260208060002060005b85811015613ec45781548a820152908401908201613eab565b50505082870194505b5050505092915050565b6000613ee38286613e64565b8451613ef38183602089016136dd565b6135fa81830186613e64565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600082613f5b57613f5b613c87565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613fe590830184613701565b9695505050505050565b60006020828403121561400157600080fd5b81516136d6816136a3565b634e487b7160e01b600052603160045260246000fd5b600082516140348184602087016136dd565b919091019291505056fea26469706673582212207a22010f2816782453f5aea0c3b94f19819d5ec8bdcd016a9c7d8a1563beacd864736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002a7334c0361b33526f2793e808a4b79d0b87af200000000000000000000000000000000000000000000000000000000000000016496e66696e69476f64733a20456c64657220476f6473000000000000000000000000000000000000000000000000000000000000000000000000000000000004474f445300000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): InfiniGods: Elder Gods
Arg [1] : symbol_ (string): GODS
Arg [2] : _ig (address): 0x2A7334c0361B33526f2793e808A4b79D0B87AF20

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000002a7334c0361b33526f2793e808a4b79d0b87af20
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [4] : 496e66696e69476f64733a20456c64657220476f647300000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 474f445300000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

58357:12404:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70625:35;;-1:-1:-1;;;70625:35:0;;216:2:1;70625:35:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:55;339:18;;70625:35:0;;;;;;;;58357:12404;70715:35;;-1:-1:-1;;;70715:35:0;;216:2:1;70715:35:0;;;198:21:1;255:2;235:18;;;228:30;-1:-1:-1;;;274:18:1;;;267:55;339:18;;70715:35:0;14:349:1;69086:242:0;;;;;;;;;;-1:-1:-1;69086:242:0;;;;;:::i;:::-;;:::i;:::-;;;919:14:1;;912:22;894:41;;882:2;867:18;69086:242:0;;;;;;;;22311:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23823:171::-;;;;;;;;;;-1:-1:-1;23823:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2051:32:1;;;2033:51;;2021:2;2006:18;23823:171:0;1887:203:1;69576:174:0;;;;;;;;;;-1:-1:-1;69576:174:0;;;;;:::i;:::-;;:::i;:::-;;67979:317;;;;;;;;;;-1:-1:-1;67979:317:0;;;;;:::i;:::-;;:::i;36653:113::-;;;;;;;;;;-1:-1:-1;36741:10:0;:17;36653:113;;;3575:25:1;;;3563:2;3548:18;36653:113:0;3429:177:1;61148:45:0;;;;;;;;;;-1:-1:-1;61148:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61148:45:0;;;;;;;;-1:-1:-1;;;61148:45:0;;-1:-1:-1;;;;;61148:45:0;;;;;;;3896:25:1;;;3952:2;3937:18;;3930:34;;;;-1:-1:-1;;;;;4038:15:1;;;4018:18;;;4011:43;;;;4085:2;4070:18;;4063:34;;;;4134:15;4128:3;4113:19;;4106:44;-1:-1:-1;;;;;4187:31:1;3991:3;4166:19;;4159:60;3883:3;3868:19;61148:45:0;3611:614:1;62933:802:0;;;;;;;;;;-1:-1:-1;62933:802:0;;;;;:::i;:::-;;:::i;69758:180::-;;;;;;;;;;-1:-1:-1;69758:180:0;;;;;:::i;:::-;;:::i;68906:172::-;;;;;;;;;;;;;:::i;66870:1070::-;;;;;;;;;;-1:-1:-1;66870:1070:0;;;;;:::i;:::-;;:::i;36321:256::-;;;;;;;;;;-1:-1:-1;36321:256:0;;;;;:::i;:::-;;:::i;55969:134::-;;;;;;;;;;-1:-1:-1;55969:134:0;;;;-1:-1:-1;;;;;55969:134:0;;;69946:188;;;;;;;;;;-1:-1:-1;69946:188:0;;;;;:::i;:::-;;:::i;63743:260::-;;;;;;;;;;-1:-1:-1;63743:260:0;;;;;:::i;:::-;;:::i;61402:55::-;;;;;;;;;;-1:-1:-1;61402:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61402:55:0;;;;-1:-1:-1;;;;;;;;61402:55:0;;;;;;;;;;;;;;;;;;;;;5896:25:1;;;-1:-1:-1;;;;;5995:15:1;;;5990:2;5975:18;;5968:43;-1:-1:-1;;;;;6084:15:1;;;6064:18;;;6057:43;6136:15;;6131:2;6116:18;;6109:43;6189:15;6183:3;6168:19;;6161:44;5883:3;5868:19;61402:55:0;5641:570:1;68426:158:0;;;;;;;;;;-1:-1:-1;68426:158:0;;;;;:::i;:::-;;:::i;36843:233::-;;;;;;;;;;-1:-1:-1;36843:233:0;;;;;:::i;:::-;;:::i;68690:95::-;;;;;;;;;;-1:-1:-1;68690:95:0;;;;;:::i;:::-;;:::i;65813:758::-;;;;;;;;;;-1:-1:-1;65813:758:0;;;;;:::i;:::-;;:::i;70395:184::-;;;;;;;;;;-1:-1:-1;70395:184:0;;;;;:::i;:::-;;:::i;22022:222::-;;;;;;;;;;-1:-1:-1;22022:222:0;;;;;:::i;:::-;;:::i;21753:207::-;;;;;;;;;;-1:-1:-1;21753:207:0;;;;;:::i;:::-;;:::i;13033:103::-;;;;;;;;;;;;;:::i;60678:19::-;;;;;;;;;;-1:-1:-1;60678:19:0;;;;;;;;60919:37;;;;;;;;;;-1:-1:-1;60919:37:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;60919:37:0;;;-1:-1:-1;;;60919:37:0;;-1:-1:-1;;;;;60919:37:0;;;;;;;-1:-1:-1;;;;;7883:32:1;;;7865:51;;-1:-1:-1;;;;;7952:31:1;;;7947:2;7932:18;;7925:59;7838:18;60919:37:0;7693:297:1;66579:283:0;;;;;;;;;;-1:-1:-1;66579:283:0;;;;;:::i;:::-;;:::i;12385:87::-;;;;;;;;;;-1:-1:-1;12458:6:0;;-1:-1:-1;;;;;12458:6:0;12385:87;;62729:196;;;;;;;;;;-1:-1:-1;62729:196:0;;;;;:::i;:::-;;:::i;59920:395::-;;;;;;;;;;-1:-1:-1;59920:395:0;;;;;:::i;:::-;;:::i;22480:104::-;;;;;;;;;;;;;:::i;59201:572::-;;;;;;;;;;-1:-1:-1;59201:572:0;;;;;:::i;:::-;;:::i;69375:193::-;;;;;;;;;;-1:-1:-1;69375:193:0;;;;;:::i;:::-;;:::i;68304:114::-;;;;;;;;;;-1:-1:-1;68304:114:0;;;;;:::i;:::-;;:::i;68592:90::-;;;;;;;;;;-1:-1:-1;68592:90:0;;;;;:::i;:::-;;:::i;60706:73::-;;;;;;;;;;;;60737:42;60706:73;;70142:245;;;;;;;;;;-1:-1:-1;70142:245:0;;;;;:::i;:::-;;:::i;62523:198::-;;;;;;;;;;-1:-1:-1;62523:198:0;;;;;:::i;:::-;;:::i;60323:244::-;;;;;;;;;;-1:-1:-1;60323:244:0;;;;;:::i;:::-;;:::i;58571:41::-;;;;;;;;;;-1:-1:-1;58571:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;68793:105;;;;;;;;;;-1:-1:-1;68793:105:0;;;;;:::i;:::-;;:::i;61900:214::-;;;;;;;;;;-1:-1:-1;61900:214:0;;;;;:::i;:::-;;:::i;64011:1794::-;;;;;;:::i;:::-;;:::i;60788:46::-;;;;;;;;;;-1:-1:-1;60788:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;61200:30;;;;;;;;;;;;;;;;60599:22;;;;;;;;;;;;;;;;24292:164;;;;;;;;;;-1:-1:-1;24292:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;24413:25:0;;;24389:4;24413:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24292:164;59781:131;;;;;;;;;;;;;:::i;13291:201::-;;;;;;;;;;-1:-1:-1;13291:201:0;;;;;:::i;:::-;;:::i;58673:38::-;;;;;;;;;;;;;;;69086:242;69189:4;-1:-1:-1;;;;;;69226:41:0;;-1:-1:-1;;;69226:41:0;;:94;;;69284:36;69308:11;69284:23;:36::i;:::-;69206:114;69086:242;-1:-1:-1;;69086:242:0:o;22311:100::-;22365:13;22398:5;22391:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22311:100;:::o;23823:171::-;23899:7;23919:23;23934:7;23919:14;:23::i;:::-;-1:-1:-1;23962:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23962:24:0;;23823:171::o;69576:174::-;69689:8;57481:30;57502:8;57481:20;:30::i;:::-;69710:32:::1;69724:8;69734:7;69710:13;:32::i;:::-;69576:174:::0;;;:::o;67979:317::-;12271:13;:11;:13::i;:::-;68085:9:::1;68080:163;68096:20:::0;;::::1;68080:163;;;68164:5;68134:13;:27;68148:9;;68158:1;68148:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;68134:27:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;68134:27:0;:35;;-1:-1:-1;;68134:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;68213:3:0::1;68080:163;;;-1:-1:-1::0;60737:42:0::1;68260:19;::::0;:13:::1;:19;::::0;;;::::1;;:27;;:19:::0;:27:::1;68253:35;;;;:::i;62933:802::-:0;61828:7;;;;61820:52;;;;-1:-1:-1;;;61820:52:0;;;;;;;:::i;:::-;63069:24:::1;63084:8;63069:14;:24::i;:::-;-1:-1:-1::0;;;;;63112:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;63104:58;;;::::0;-1:-1:-1;;;63104:58:0;;11425:2:1;63104:58:0::1;::::0;::::1;11407:21:1::0;11464:2;11444:18;;;11437:30;-1:-1:-1;;;11483:18:1;;;11476:54;11547:18;;63104:58:0::1;11223:348:1::0;63104:58:0::1;63197:17;63205:8;63197:7;:17::i;:::-;-1:-1:-1::0;;;;;63181:33:0::1;9376:10:::0;-1:-1:-1;;;;;63181:33:0::1;;63173:66;;;::::0;-1:-1:-1;;;63173:66:0;;11778:2:1;63173:66:0::1;::::0;::::1;11760:21:1::0;11817:2;11797:18;;;11790:30;-1:-1:-1;;;11836:18:1;;;11829:50;11896:18;;63173:66:0::1;11576:344:1::0;63173:66:0::1;60667:4;63258:6;:21;;63250:55;;;::::0;-1:-1:-1;;;63250:55:0;;12127:2:1;63250:55:0::1;::::0;::::1;12109:21:1::0;12166:2;12146:18;;;12139:30;-1:-1:-1;;;12185:18:1;;;12178:51;12246:18;;63250:55:0::1;11925:345:1::0;63250:55:0::1;63355:1;63324:14:::0;;;:4:::1;:14;::::0;;;;:19;-1:-1:-1;;;;;63324:19:0::1;:33:::0;;:77:::1;;-1:-1:-1::0;63361:14:0::1;::::0;;;:4:::1;:14;::::0;;;;:22;63386:15:::1;-1:-1:-1::0;;;63361:22:0;;::::1;-1:-1:-1::0;;;;;63361:22:0::1;:40;63324:77;63316:112;;;;-1:-1:-1::0;;;63316:112:0::1;;;;;;;:::i;:::-;63465:184;;;;;;;;63501:6;63465:184;;;;63530:12;9376:10:::0;;9296:98;63530:12:::1;-1:-1:-1::0;;;;;63465:184:0;;::::1;::::0;;-1:-1:-1;;;;;63465:184:0;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;63439:23:0;;;:13:::1;:23:::0;;;;;:210;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;;63439:210:0;;;;-1:-1:-1;;;63439:210:0;;::::1;::::0;::::1;;::::0;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;63665:62;::::1;::::0;::::1;::::0;63439:23;;63465:184;;;;63712:6;;63465:184;;63665:62:::1;:::i;:::-;;;;;;;;62933:802:::0;;;;;:::o;69758:180::-;69876:4;-1:-1:-1;;;;;57301:18:0;;57309:10;57301:18;57297:83;;57336:32;57357:10;57336:20;:32::i;:::-;69893:37:::1;69912:4;69918:2;69922:7;69893:18;:37::i;:::-;69758:180:::0;;;;:::o;68906:172::-;12271:13;:11;:13::i;:::-;68962:9:::1;68976:7;12458:6:::0;;-1:-1:-1;;;;;12458:6:0;;12385:87;68976:7:::1;-1:-1:-1::0;;;;;68976:12:0::1;68996:21;68976:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68961:61;;;69041:4;69033:37;;;;-1:-1:-1::0;;;69033:37:0::1;;;;;;;:::i;:::-;68950:128;68906:172::o:0;66870:1070::-;61828:7;;;;61820:52;;;;-1:-1:-1;;;61820:52:0;;;;;;;:::i;:::-;51734:21:::1;:19;:21::i;:::-;66949:19:::2;66971:15:::0;;;:8:::2;:15;::::0;;;;;;;;66949:37;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;-1:-1:-1;;;;;66949:37:0;;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;;::::0;;;::::2;::::0;;;;-1:-1:-1;;;66949:37:0;;::::2;-1:-1:-1::0;;;;;66949:37:0::2;::::0;;;;9376:10;-1:-1:-1;;;;;67005:36:0::2;:20;67013:3;:11;;;67005:7;:20::i;:::-;-1:-1:-1::0;;;;;67005:36:0::2;;66997:78;;;::::0;-1:-1:-1;;;66997:78:0;;13932:2:1;66997:78:0::2;::::0;::::2;13914:21:1::0;13971:2;13951:18;;;13944:30;14010:31;13990:18;;;13983:59;14059:18;;66997:78:0::2;13730:353:1::0;66997:78:0::2;67099:11:::0;;67128:1:::2;67094:17:::0;;;:4:::2;:17;::::0;;;;:22;-1:-1:-1;;;;;67094:22:0::2;:36:::0;;:83:::2;;-1:-1:-1::0;67139:11:0;;67134:17:::2;::::0;;;:4:::2;:17;::::0;;;;:25;67162:15:::2;-1:-1:-1::0;;;67134:25:0;;::::2;-1:-1:-1::0;;;;;67134:25:0::2;:43;67094:83;67086:118;;;;-1:-1:-1::0;;;67086:118:0::2;;;;;;;:::i;:::-;67237:15;67223:3;:10;;;:29;;67215:59;;;::::0;-1:-1:-1;;;67215:59:0;;14290:2:1;67215:59:0::2;::::0;::::2;14272:21:1::0;14329:2;14309:18;;;14302:30;-1:-1:-1;;;14348:18:1;;;14341:47;14405:18;;67215:59:0::2;14088:341:1::0;67215:59:0::2;67310:1;67285:15:::0;;;:8:::2;:15;::::0;;;;;;:22:::2;;:26:::0;;;;67337:9;::::2;::::0;67361:7:::2;::::0;:11;67357:495:::2;;67389:15;60667:4;67429:7;;60667:4;67415:21;;;;:::i;:::-;67407:30;::::0;:4;:30:::2;:::i;:::-;:44;;;;:::i;:::-;67389:62:::0;-1:-1:-1;67466:18:0::2;67487:14;67389:62:::0;67487:4;:14:::2;:::i;:::-;67466:35;;67516:78;67554:3;:8;;;67564:20;67572:3;:11;;;67564:7;:20::i;:::-;67523:12;::::0;::::2;::::0;-1:-1:-1;;;;;67516:37:0::2;::::0;:78;67586:7;67516:37:::2;:78::i;:::-;67613:14:::0;;67609:124:::2;;67686:8;::::0;::::2;::::0;67696::::2;::::0;67655:12:::2;::::0;::::2;::::0;67648:69:::2;::::0;-1:-1:-1;;;;;67648:37:0;;::::2;::::0;67686:8;;67696::::2;67706:10:::0;67648:37:::2;:69::i;:::-;67374:370;;67357:495;;;67765:75;67803:3;:8;;;67813:20;67821:3;:11;;;67813:7;:20::i;:::-;67772:12;::::0;::::2;::::0;-1:-1:-1;;;;;67765:37:0::2;::::0;:75;67835:4;67765:37:::2;:75::i;:::-;67862:70;67870:3;:11;;;67883:3;:8;;;67919:3;:12;;;67900:15;67893:38;;;;:::i;67862:70::-;66938:1002;;51778:20:::1;51172:1:::0;52294:7;:22;52111:213;36321:256;36418:7;36454:23;36471:5;36454:16;:23::i;:::-;36446:5;:31;36438:87;;;;-1:-1:-1;;;36438:87:0;;15516:2:1;36438:87:0;;;15498:21:1;15555:2;15535:18;;;15528:30;15594:34;15574:18;;;15567:62;-1:-1:-1;;;15645:18:1;;;15638:41;15696:19;;36438:87:0;15314:407:1;36438:87:0;-1:-1:-1;;;;;;36543:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;36321:256::o;69946:188::-;70068:4;-1:-1:-1;;;;;57301:18:0;;57309:10;57301:18;57297:83;;57336:32;57357:10;57336:20;:32::i;:::-;70085:41:::1;70108:4;70114:2;70118:7;70085:22;:41::i;63743:260::-:0;63805:24;63820:8;63805:14;:24::i;:::-;63864:17;63872:8;63864:7;:17::i;:::-;-1:-1:-1;;;;;63848:33:0;9376:10;-1:-1:-1;;;;;63848:33:0;;63840:66;;;;-1:-1:-1;;;63840:66:0;;11778:2:1;63840:66:0;;;11760:21:1;11817:2;11797:18;;;11790:30;-1:-1:-1;;;11836:18:1;;;11829:50;11896:18;;63840:66:0;11576:344:1;63840:66:0;63950:1;63917:23;;;:13;:23;;;;;;;:30;;:34;;-1:-1:-1;;;;63917:34:0;;;63967:28;;;;;63931:8;3575:25:1;;3563:2;3548:18;;3429:177;63967:28:0;;;;;;;;63743:260;:::o;68426:158::-;12271:13;:11;:13::i;:::-;60667:4:::1;68504:7;:21;68496:52;;;::::0;-1:-1:-1;;;68496:52:0;;15928:2:1;68496:52:0::1;::::0;::::1;15910:21:1::0;15967:2;15947:18;;;15940:30;-1:-1:-1;;;15986:18:1;;;15979:48;16044:18;;68496:52:0::1;15726:342:1::0;68496:52:0::1;68559:7;:17:::0;68426:158::o;36843:233::-;36918:7;36954:30;36741:10;:17;;36653:113;36954:30;36946:5;:38;36938:95;;;;-1:-1:-1;;;36938:95:0;;16275:2:1;36938:95:0;;;16257:21:1;16314:2;16294:18;;;16287:30;16353:34;16333:18;;;16326:62;-1:-1:-1;;;16404:18:1;;;16397:42;16456:19;;36938:95:0;16073:408:1;36938:95:0;37051:10;37062:5;37051:17;;;;;;;;:::i;:::-;;;;;;;;;37044:24;;36843:233;;;:::o;68690:95::-;12271:13;:11;:13::i;:::-;68761:8:::1;:16;68772:5:::0;68761:8;:16:::1;:::i;:::-;;68690:95:::0;:::o;65813:758::-;61828:7;;;;61820:52;;;;-1:-1:-1;;;61820:52:0;;;;;;;:::i;:::-;65947:24:::1;65962:8;65947:14;:24::i;:::-;-1:-1:-1::0;;;;;65990:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;:45:::0;::::1;;;-1:-1:-1::0;;;;;;66015:20:0;::::1;::::0;::::1;65990:45;65982:82;;;::::0;-1:-1:-1;;;65982:82:0;;11425:2:1;65982:82:0::1;::::0;::::1;11407:21:1::0;11464:2;11444:18;;;11437:30;-1:-1:-1;;;11483:18:1;;;11476:54;11547:18;;65982:82:0::1;11223:348:1::0;65982:82:0::1;66094:15;66083:7;-1:-1:-1::0;;;;;66083:26:0::1;;;66075:59;;;::::0;-1:-1:-1;;;66075:59:0;;18892:2:1;66075:59:0::1;::::0;::::1;18874:21:1::0;18931:2;18911:18;;;18904:30;-1:-1:-1;;;18950:18:1;;;18943:50;19010:18;;66075:59:0::1;18690:344:1::0;66075:59:0::1;60667:4;66153:6;:21;;66145:53;;;::::0;-1:-1:-1;;;66145:53:0;;19241:2:1;66145:53:0::1;::::0;::::1;19223:21:1::0;19280:2;19260:18;;;19253:30;-1:-1:-1;;;19299:18:1;;;19292:49;19358:18;;66145:53:0::1;19039:343:1::0;66145:53:0::1;66209:15;:18:::0;;;:15:::1;:18;::::0;::::1;:::i;:::-;;;;;;66266:209;;;;;;;;66299:8;66266:209;;;;66329:6;66266:209;;;;66356:12;9376:10:::0;;9296:98;66356:12:::1;-1:-1:-1::0;;;;;66266:209:0;;::::1;::::0;;-1:-1:-1;;;;;66266:209:0;;::::1;;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;::::1;::::0;;;;;66247:15:::1;::::0;;-1:-1:-1;66238:25:0;;;:8:::1;:25:::0;;;;;:237;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;66238:237:0::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;66238:237:0;;;;;;;-1:-1:-1;;;66238:237:0;;;::::1;;;::::0;;66501:15;66491:72;;::::1;::::0;::::1;::::0;66518:8;;66266:209;;;;66548:6;;66266:209;;66491:72:::1;:::i;:::-;;;;;;;;65813:758:::0;;;;;:::o;70395:184::-;12271:13;:11;:13::i;:::-;70491:41:::1;:80:::0;;-1:-1:-1;;;;;;70491:80:0::1;-1:-1:-1::0;;;;;70491:80:0;;;::::1;::::0;;;::::1;::::0;;70395:184::o;22022:222::-;22094:7;22130:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22130:16:0;;22157:56;;;;-1:-1:-1;;;22157:56:0;;19729:2:1;22157:56:0;;;19711:21:1;19768:2;19748:18;;;19741:30;-1:-1:-1;;;19787:18:1;;;19780:54;19851:18;;22157:56:0;19527:348:1;21753:207:0;21825:7;-1:-1:-1;;;;;21853:19:0;;21845:73;;;;-1:-1:-1;;;21845:73:0;;20082:2:1;21845:73:0;;;20064:21:1;20121:2;20101:18;;;20094:30;20160:34;20140:18;;;20133:62;-1:-1:-1;;;20211:18:1;;;20204:39;20260:19;;21845:73:0;19880:405:1;21845:73:0;-1:-1:-1;;;;;;21936:16:0;;;;;:9;:16;;;;;;;21753:207::o;13033:103::-;12271:13;:11;:13::i;:::-;13098:30:::1;13125:1;13098:18;:30::i;:::-;13033:103::o:0;66579:283::-;66657:15;;;;:8;:15;;;;;:20;;;-1:-1:-1;;;;;66657:20:0;9376:10;-1:-1:-1;;;;;66641:36:0;;66633:69;;;;-1:-1:-1;;;66633:69:0;;20492:2:1;66633:69:0;;;20474:21:1;20531:2;20511:18;;;20504:30;-1:-1:-1;;;20550:18:1;;;20543:50;20610:18;;66633:69:0;20290:344:1;66633:69:0;66740:15;;;;:8;:15;;;;;:22;;;66721:15;:41;;66713:71;;;;-1:-1:-1;;;66713:71:0;;14290:2:1;66713:71:0;;;14272:21:1;14329:2;14309:18;;;14302:30;-1:-1:-1;;;14348:18:1;;;14341:47;14405:18;;66713:71:0;14088:341:1;66713:71:0;66820:1;66795:15;;;:8;:15;;;;;;:22;;:26;;;;66837:17;;;;;66804:5;3575:25:1;;3563:2;3548:18;;3429:177;62729:196:0;62789:7;62809:23;62824:7;62809:14;:23::i;:::-;62850:13;;;;:4;:13;;;;;:21;62874:15;-1:-1:-1;;;62850:21:0;;;-1:-1:-1;;;;;62850:21:0;:39;:67;;62896:13;;;;:4;:13;;;;;:21;-1:-1:-1;;;62896:21:0;;-1:-1:-1;;;;;62896:21:0;62850:67;;;62892:1;62850:67;-1:-1:-1;;;;;62843:74:0;;62729:196;-1:-1:-1;;62729:196:0:o;59920:395::-;12271:13;:11;:13::i;:::-;51734:21:::1;:19;:21::i;:::-;60050:13:::2;-1:-1:-1::0;;;;;60032:44:0::2;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36741:10:::0;:17;60015:63:::2;;60007:100;;;::::0;-1:-1:-1;;;60007:100:0;;21030:2:1;60007:100:0::2;::::0;::::2;21012:21:1::0;21069:2;21049:18;;;21042:30;21108:26;21088:18;;;21081:54;21152:18;;60007:100:0::2;20828:348:1::0;60007:100:0::2;60126:8;::::0;-1:-1:-1;;;;;60126:8:0::2;60118:54;;;::::0;-1:-1:-1;;;60118:54:0;;21383:2:1;60118:54:0::2;::::0;::::2;21365:21:1::0;21422:2;21402:18;;;21395:30;-1:-1:-1;;;21441:18:1;;;21434:49;21500:18;;60118:54:0::2;21181:343:1::0;60118:54:0::2;58660:4;60190:13;36741:10:::0;:17;;36653:113;60190:13:::2;:27;;:51;;;;;60233:8;60221:9;:20;60190:51;60183:125;;;60268:8;::::0;60258:38:::2;::::0;-1:-1:-1;;;;;60268:8:0::2;60278:13;36741:10:::0;:17;;36653:113;60278:13:::2;:17;::::0;60294:1:::2;60278:17;:::i;:::-;60258:9;:38::i;:::-;60183:125;;;51778:20:::1;51172:1:::0;52294:7;:22;52111:213;22480:104;22536:13;22569:7;22562:14;;;;;:::i;59201:572::-;12271:13;:11;:13::i;:::-;51734:21:::1;:19;:21::i;:::-;59279:10:::2;59300:12:::0;59328:9:::2;59340:17;;59360:1;59340:21;;;;:::i;:::-;59328:33;;59323:408;59386:13;-1:-1:-1::0;;;;;59368:44:0::2;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59363:1;:51;;:75;;;;;59430:8;59418:9;:20;59363:75;59323:408;;;59461:33;::::0;-1:-1:-1;;;59461:33:0;;::::2;::::0;::::2;3575:25:1::0;;;59469:13:0::2;-1:-1:-1::0;;;;;59461:30:0::2;::::0;::::2;::::0;3548:18:1;;59461:33:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59513:36;::::0;-1:-1:-1;;;59513:36:0;;::::2;::::0;::::2;3575:25:1::0;;;59456:38:0;;-1:-1:-1;59524:13:0::2;-1:-1:-1::0;;;;;59513:33:0::2;::::0;::::2;::::0;3548:18:1;;59513:36:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59509:94;;;59570:10;::::0;;;:7:::2;:10;::::0;;;;:17;;-1:-1:-1;;59570:17:0::2;59583:4;59570:17;::::0;;59509:94:::2;59617:16;59627:2;59631:1;59617:9;:16::i;:::-;59655:1:::0;-1:-1:-1;59700:4:0::2;::::0;::::2;59323:408;;;-1:-1:-1::0;59741:17:0::2;:24:::0;-1:-1:-1;51778:20:0::1;51172:1:::0;52294:7;:22;52111:213;69375:193;69496:8;57481:30;57502:8;57481:20;:30::i;:::-;69517:43:::1;69541:8;69551;69517:23;:43::i;68304:114::-:0;12271:13;:11;:13::i;:::-;68387:8:::1;:23:::0;;-1:-1:-1;;;;;;68387:23:0::1;-1:-1:-1::0;;;;;68387:23:0;;;::::1;::::0;;;::::1;::::0;;68304:114::o;68592:90::-;12271:13;:11;:13::i;:::-;68658:7:::1;:16:::0;;-1:-1:-1;;68658:16:0::1;::::0;::::1;;::::0;;;::::1;::::0;;68592:90::o;70142:245::-;70310:4;-1:-1:-1;;;;;57301:18:0;;57309:10;57301:18;57297:83;;57336:32;57357:10;57336:20;:32::i;:::-;70332:47:::1;70355:4;70361:2;70365:7;70374:4;70332:22;:47::i;:::-;70142:245:::0;;;;;:::o;62523:198::-;62579:7;62599:23;62614:7;62599:14;:23::i;:::-;62640:13;;;;:4;:13;;;;;:21;62664:15;-1:-1:-1;;;62640:21:0;;;-1:-1:-1;;;;;62640:21:0;:39;:73;;62695:13;;;;:4;:13;;;;;:18;-1:-1:-1;;;;;62695:18:0;62640:73;;;62690:1;62633:80;62523:198;-1:-1:-1;;62523:198:0:o;60323:244::-;60388:13;60414:23;60429:7;60414:14;:23::i;:::-;60480:1;60461:8;60455:22;;;;;:::i;:::-;;;:26;:104;;;;;;;;;;;;;;;;;60508:8;60518:18;:7;:16;:18::i;:::-;60538:14;60491:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60448:111;60323:244;-1:-1:-1;;60323:244:0:o;68793:105::-;12271:13;:11;:13::i;:::-;68869:14:::1;:21;68886:4:::0;68869:14;:21:::1;:::i;61900:214::-:0;61828:7;;;;61820:52;;;;-1:-1:-1;;;61820:52:0;;;;;;;:::i;:::-;62027:16:::1;62035:7;62027;:16::i;:::-;-1:-1:-1::0;;;;;62011:32:0::1;9376:10:::0;-1:-1:-1;;;;;62011:32:0::1;;62003:60;;;::::0;-1:-1:-1;;;62003:60:0;;23568:2:1;62003:60:0::1;::::0;::::1;23550:21:1::0;23607:2;23587:18;;;23580:30;-1:-1:-1;;;23626:18:1;;;23619:45;23681:18;;62003:60:0::1;23366:339:1::0;62003:60:0::1;62074:32;62083:7;62092:4;62098:7;62074:8;:32::i;64011:1794::-:0;61828:7;;;;61820:52;;;;-1:-1:-1;;;61820:52:0;;;;;;;:::i;:::-;51734:21:::1;:19;:21::i;:::-;64102:24:::2;64117:8;64102:14;:24::i;:::-;64161:17;64169:8;64161:7;:17::i;:::-;-1:-1:-1::0;;;;;64145:33:0::2;9376:10:::0;64145:33;64137:73:::2;;;::::0;-1:-1:-1;;;64137:73:0;;23912:2:1;64137:73:0::2;::::0;::::2;23894:21:1::0;23951:2;23931:18;;;23924:30;23990:29;23970:18;;;23963:57;24037:18;;64137:73:0::2;23710:351:1::0;64137:73:0::2;64250:23;::::0;;;:13:::2;:23;::::0;;;;:30:::2;;::::0;-1:-1:-1;;;;;64250:30:0::2;64229:17;64264:8:::0;64229:7:::2;:17::i;:::-;-1:-1:-1::0;;;;;64229:51:0::2;;64221:88;;;::::0;-1:-1:-1;;;64221:88:0;;24268:2:1;64221:88:0::2;::::0;::::2;24250:21:1::0;24307:2;24287:18;;;24280:30;24346:26;24326:18;;;24319:54;24390:18;;64221:88:0::2;24066:348:1::0;64221:88:0::2;64328:23;::::0;;;:13:::2;:23;::::0;;;;:30:::2;;::::0;64362:15:::2;-1:-1:-1::0;;;64328:30:0;;::::2;-1:-1:-1::0;;;;;64328:30:0::2;:49;;64320:81;;;::::0;-1:-1:-1;;;64320:81:0;;24621:2:1;64320:81:0::2;::::0;::::2;24603:21:1::0;24660:2;24640:18;;;24633:30;-1:-1:-1;;;24679:18:1;;;24672:49;24738:18;;64320:81:0::2;24419:343:1::0;64320:81:0::2;64445:1;64412:23:::0;;;:13:::2;:23;::::0;;;;:30:::2;::::0;::::2;:34:::0;;-1:-1:-1;;;;64412:34:0::2;::::0;;64472:29;64516:7:::2;::::0;:11;64512:1183:::2;;64544:15;60667:4;64584:7;;60667:4;64570:21;;;;:::i;:::-;64562:30;::::0;:4;:30:::2;:::i;:::-;:44;;;;:::i;:::-;64544:62:::0;-1:-1:-1;64621:18:0::2;64642:14;64544:62:::0;64642:4;:14:::2;:::i;:::-;64719:1;64675:23:::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;64621:35;;-1:-1:-1;;;;;;64675:32:0::2;64671:630;;64763:23;::::0;;;:13:::2;:23;::::0;;;;:29;64750:9:::2;:42;64742:83;;;::::0;-1:-1:-1;;;64742:83:0;;24969:2:1;64742:83:0::2;::::0;::::2;24951:21:1::0;25008:2;24988:18;;;24981:30;25047;25027:18;;;25020:58;25095:18;;64742:83:0::2;24767:352:1::0;64742:83:0::2;64845:9;64859:17;64867:8;64859:7;:17::i;:::-;-1:-1:-1::0;;;;;64859:22:0::2;64889:21;64859:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64844:71;;;64942:4;64934:37;;;;-1:-1:-1::0;;;64934:37:0::2;;;;;;;:::i;:::-;64723:264;64671:630;;;65012:99;9376:10:::0;65084:17:::2;65092:8;65084:7;:17::i;:::-;65019:23;::::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;-1:-1:-1;;;;;65019:32:0::2;::::0;65012:99;65103:7;65012:57:::2;:99::i;:::-;65134:14:::0;;65130:156:::2;;65173:93;9376:10:::0;65245:8:::2;::::0;::::2;65180:23:::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;-1:-1:-1;;;;;65180:32:0;;::::2;::::0;65173:93;65245:8:::2;65255:10:::0;65173:57:::2;:93::i;:::-;64529:783;;64512:1183;;;65381:1;65337:23:::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;-1:-1:-1;;;;;65337:32:0::2;65333:351;;65405:9;65419:17;65427:8;65419:7;:17::i;:::-;-1:-1:-1::0;;;;;65419:22:0::2;65449:21;65419:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65404:71;;;65502:4;65494:37;;;;-1:-1:-1::0;;;65494:37:0::2;;;;;;;:::i;:::-;65385:162;65333:351;;;65572:96;9376:10:::0;65644:17:::2;65652:8;65644:7;:17::i;:::-;65579:23;::::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;-1:-1:-1;;;;;65579:32:0::2;::::0;65572:96;65663:4;65572:57:::2;:96::i;:::-;65705:92;65714:8:::0;9376:10;65763:23:::2;::::0;;;:13:::2;:23;::::0;;;;:32:::2;;::::0;65745:50:::2;::::0;-1:-1:-1;;;65763:32:0;::::2;-1:-1:-1::0;;;;;65763:32:0::2;65745:15;:50;:::i;:::-;65705:8;:92::i;:::-;64091:1714;51778:20:::1;51172:1:::0;52294:7;:22;52111:213;59781:131;59831:7;59876:13;-1:-1:-1;;;;;59858:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59851:53;;59781:131;:::o;13291:201::-;12271:13;:11;:13::i;:::-;-1:-1:-1;;;;;13380:22:0;::::1;13372:73;;;::::0;-1:-1:-1;;;13372:73:0;;25326:2:1;13372:73:0::1;::::0;::::1;25308:21:1::0;25365:2;25345:18;;;25338:30;25404:34;25384:18;;;25377:62;-1:-1:-1;;;25455:18:1;;;25448:36;25501:19;;13372:73:0::1;25124:402:1::0;13372:73:0::1;13456:28;13475:8;13456:18;:28::i;36013:224::-:0;36115:4;-1:-1:-1;;;;;;36139:50:0;;-1:-1:-1;;;36139:50:0;;:90;;;36193:36;36217:11;36193:23;:36::i;31910:135::-;27079:4;27103:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27103:16:0;31984:53;;;;-1:-1:-1;;;31984:53:0;;19729:2:1;31984:53:0;;;19711:21:1;19768:2;19748:18;;;19741:30;-1:-1:-1;;;19787:18:1;;;19780:54;19851:18;;31984:53:0;19527:348:1;57539:419:0;57738:24;;-1:-1:-1;;;;;57738:24:0;57730:45;:49;57726:225;;57801:24;;:67;;-1:-1:-1;;;57801:67:0;;57852:4;57801:67;;;25743:34:1;-1:-1:-1;;;;;25813:15:1;;;25793:18;;;25786:43;57801:24:0;;;;:42;;25678:18:1;;57801:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57796:144;;57896:28;;-1:-1:-1;;;57896:28:0;;-1:-1:-1;;;;;2051:32:1;;57896:28:0;;;2033:51:1;2006:18;;57896:28:0;1887:203:1;23341:416:0;23422:13;23438:23;23453:7;23438:14;:23::i;:::-;23422:39;;23486:5;-1:-1:-1;;;;;23480:11:0;:2;-1:-1:-1;;;;;23480:11:0;;23472:57;;;;-1:-1:-1;;;23472:57:0;;26042:2:1;23472:57:0;;;26024:21:1;26081:2;26061:18;;;26054:30;26120:34;26100:18;;;26093:62;-1:-1:-1;;;26171:18:1;;;26164:31;26212:19;;23472:57:0;25840:397:1;23472:57:0;9376:10;-1:-1:-1;;;;;23564:21:0;;;;:62;;-1:-1:-1;23589:37:0;23606:5;9376:10;24292:164;:::i;23589:37::-;23542:173;;;;-1:-1:-1;;;23542:173:0;;26444:2:1;23542:173:0;;;26426:21:1;26483:2;26463:18;;;26456:30;26522:34;26502:18;;;26495:62;26593:31;26573:18;;;26566:59;26642:19;;23542:173:0;26242:425:1;23542:173:0;23728:21;23737:2;23741:7;23728:8;:21::i;12550:132::-;12458:6;;-1:-1:-1;;;;;12458:6:0;9376:10;12614:23;12606:68;;;;-1:-1:-1;;;12606:68:0;;26874:2:1;12606:68:0;;;26856:21:1;;;26893:18;;;26886:30;26952:34;26932:18;;;26925:62;27004:18;;12606:68:0;26672:356:1;24523:335:0;24718:41;9376:10;24751:7;24718:18;:41::i;:::-;24710:99;;;;-1:-1:-1;;;24710:99:0;;;;;;;:::i;:::-;24822:28;24832:4;24838:2;24842:7;24822:9;:28::i;51814:289::-;51216:1;51944:7;;:19;51936:63;;;;-1:-1:-1;;;51936:63:0;;27649:2:1;51936:63:0;;;27631:21:1;27688:2;27668:18;;;27661:30;27727:33;27707:18;;;27700:61;27778:18;;51936:63:0;27447:355:1;51936:63:0;51216:1;52077:7;:18;51814:289::o;46761:248::-;46932:68;;;-1:-1:-1;;;;;28065:15:1;;;46932:68:0;;;28047:34:1;28117:15;;28097:18;;;28090:43;28149:18;;;;28142:34;;;46932:68:0;;;;;;;;;;27982:18:1;;;;46932:68:0;;;;;;;;-1:-1:-1;;;;;46932:68:0;-1:-1:-1;;;46932:68:0;;;46905:96;;46925:5;;46905:19;:96::i;24929:185::-;25067:39;25084:4;25090:2;25094:7;25067:39;;;;;;;;;;;;:16;:39::i;13652:191::-;13745:6;;;-1:-1:-1;;;;;13762:17:0;;;-1:-1:-1;;;;;;13762:17:0;;;;;;;13795:40;;13745:6;;;13762:17;13745:6;;13795:40;;13726:16;;13795:40;13715:128;13652:191;:::o;27914:110::-;27990:26;28000:2;28004:7;27990:26;;;;;;;;;;;;:9;:26::i;24066:155::-;24161:52;9376:10;24194:8;24204;24161:18;:52::i;25185:322::-;25359:41;9376:10;25392:7;25359:18;:41::i;:::-;25351:99;;;;-1:-1:-1;;;25351:99:0;;;;;;;:::i;:::-;25461:38;25475:4;25481:2;25485:7;25494:4;25461:13;:38::i;9748:723::-;9804:13;10025:5;10034:1;10025:10;10021:53;;-1:-1:-1;;10052:10:0;;;;;;;;;;;;-1:-1:-1;;;10052:10:0;;;;;9748:723::o;10021:53::-;10099:5;10084:12;10140:78;10147:9;;10140:78;;10173:8;;;;:::i;:::-;;-1:-1:-1;10196:10:0;;-1:-1:-1;10204:2:0;10196:10;;:::i;:::-;;;10140:78;;;10228:19;10260:6;-1:-1:-1;;;;;10250:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10250:17:0;;10228:39;;10278:154;10285:10;;10278:154;;10312:11;10322:1;10312:11;;:::i;:::-;;-1:-1:-1;10381:10:0;10389:2;10381:5;:10;:::i;:::-;10368:24;;:2;:24;:::i;:::-;10355:39;;10338:6;10345;10338:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;10338:56:0;;;;;;;;-1:-1:-1;10409:11:0;10418:2;10409:11;;:::i;:::-;;;10278:154;;;10456:6;9748:723;-1:-1:-1;;;;9748:723:0:o;62122:393::-;62209:23;62224:7;62209:14;:23::i;:::-;62281:1;62251:13;;;:4;:13;;;;;:18;-1:-1:-1;;;;;62251:18:0;:32;;:75;;-1:-1:-1;62287:13:0;;;;:4;:13;;;;;:21;62311:15;-1:-1:-1;;;62287:21:0;;;-1:-1:-1;;;;;62287:21:0;:39;62251:75;62243:110;;;;-1:-1:-1;;;62243:110:0;;;;;;;:::i;:::-;62380:75;;;;;;;;-1:-1:-1;;;;;62380:75:0;;;;;;-1:-1:-1;;;;;62380:75:0;;;;;;;;;;-1:-1:-1;62364:13:0;;;:4;:13;;;;;:91;;;;;;;;-1:-1:-1;;;;;;62364:91:0;;;;-1:-1:-1;;;62364:91:0;;;;;;;;;;;;;;;62471:36;;28448:50:1;;;62364:13:0;;62471:36;;28421:18:1;62471:36:0;;;;;;;;62122:393;;;:::o;21384:305::-;21486:4;-1:-1:-1;;;;;;21523:40:0;;-1:-1:-1;;;21523:40:0;;:105;;-1:-1:-1;;;;;;;21580:48:0;;-1:-1:-1;;;21580:48:0;21523:105;:158;;;-1:-1:-1;;;;;;;;;;14527:40:0;;;21645:36;14418:157;31189:174;31264:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31264:29:0;-1:-1:-1;;;;;31264:29:0;;;;;;;;:24;;31318:23;31264:24;31318:14;:23::i;:::-;-1:-1:-1;;;;;31309:46:0;;;;;;;;;;;31189:174;;:::o;27308:264::-;27401:4;27418:13;27434:23;27449:7;27434:14;:23::i;:::-;27418:39;;27487:5;-1:-1:-1;;;;;27476:16:0;:7;-1:-1:-1;;;;;27476:16:0;;:52;;;-1:-1:-1;;;;;;24413:25:0;;;24389:4;24413:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27496:32;27476:87;;;;27556:7;-1:-1:-1;;;;;27532:31:0;:20;27544:7;27532:11;:20::i;:::-;-1:-1:-1;;;;;27532:31:0;;27468:96;27308:264;-1:-1:-1;;;;27308:264:0:o;30443:627::-;30602:4;-1:-1:-1;;;;;30575:31:0;:23;30590:7;30575:14;:23::i;:::-;-1:-1:-1;;;;;30575:31:0;;30567:81;;;;-1:-1:-1;;;30567:81:0;;28711:2:1;30567:81:0;;;28693:21:1;28750:2;28730:18;;;28723:30;28789:34;28769:18;;;28762:62;-1:-1:-1;;;28840:18:1;;;28833:35;28885:19;;30567:81:0;28509:401:1;30567:81:0;-1:-1:-1;;;;;30667:16:0;;30659:65;;;;-1:-1:-1;;;30659:65:0;;29117:2:1;30659:65:0;;;29099:21:1;29156:2;29136:18;;;29129:30;29195:34;29175:18;;;29168:62;-1:-1:-1;;;29246:18:1;;;29239:34;29290:19;;30659:65:0;28915:400:1;30659:65:0;30737:39;30758:4;30764:2;30768:7;30737:20;:39::i;:::-;30848:24;;;;:15;:24;;;;;;;;30841:31;;-1:-1:-1;;;;;;30841:31:0;;;-1:-1:-1;;;;;30885:15:0;;;;:9;:15;;;;;:20;;30841:31;;30848:24;30885:20;;30841:31;;30885:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30916:13:0;;;;;;:9;:13;;;;;:18;;30933:1;;30916:13;:18;;30933:1;;30916:18;:::i;:::-;;;;-1:-1:-1;;30945:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30945:21:0;-1:-1:-1;;;;;30945:21:0;;;;;;;;;30984:27;;30945:16;;30984:27;;;;;;;69576:174;;;:::o;49609:716::-;50033:23;50059:69;50087:4;50059:69;;;;;;;;;;;;;;;;;50067:5;-1:-1:-1;;;;;50059:27:0;;;:69;;;;;:::i;:::-;50143:17;;50033:95;;-1:-1:-1;50143:21:0;50139:179;;50240:10;50229:30;;;;;;;;;;;;:::i;:::-;50221:85;;;;-1:-1:-1;;;50221:85:0;;29522:2:1;50221:85:0;;;29504:21:1;29561:2;29541:18;;;29534:30;29600:34;29580:18;;;29573:62;-1:-1:-1;;;29651:18:1;;;29644:40;29701:19;;50221:85:0;29320:406:1;28251:319:0;28380:18;28386:2;28390:7;28380:5;:18::i;:::-;28431:53;28462:1;28466:2;28470:7;28479:4;28431:22;:53::i;:::-;28409:153;;;;-1:-1:-1;;;28409:153:0;;;;;;;:::i;31506:315::-;31661:8;-1:-1:-1;;;;;31652:17:0;:5;-1:-1:-1;;;;;31652:17:0;;31644:55;;;;-1:-1:-1;;;31644:55:0;;30352:2:1;31644:55:0;;;30334:21:1;30391:2;30371:18;;;30364:30;30430:27;30410:18;;;30403:55;30475:18;;31644:55:0;30150:349:1;31644:55:0;-1:-1:-1;;;;;31710:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31710:46:0;;;;;;;;;;31772:41;;894::1;;;31772::0;;867:18:1;31772:41:0;754:187:1;26388:313:0;26544:28;26554:4;26560:2;26564:7;26544:9;:28::i;:::-;26591:47;26614:4;26620:2;26624:7;26633:4;26591:22;:47::i;:::-;26583:110;;;;-1:-1:-1;;;26583:110:0;;;;;;;:::i;37689:589::-;-1:-1:-1;;;;;37895:18:0;;37891:187;;37930:40;37962:7;39105:10;:17;;39078:24;;;;:15;:24;;;;;:44;;;39133:24;;;;;;;;;;;;39001:164;37930:40;37891:187;;;38000:2;-1:-1:-1;;;;;37992:10:0;:4;-1:-1:-1;;;;;37992:10:0;;37988:90;;38019:47;38052:4;38058:7;38019:32;:47::i;:::-;-1:-1:-1;;;;;38092:16:0;;38088:183;;38125:45;38162:7;38125:36;:45::i;38088:183::-;38198:4;-1:-1:-1;;;;;38192:10:0;:2;-1:-1:-1;;;;;38192:10:0;;38188:83;;38219:40;38247:2;38251:7;38219:27;:40::i;3825:229::-;3962:12;3994:52;4016:6;4024:4;4030:1;4033:12;3994:21;:52::i;28906:439::-;-1:-1:-1;;;;;28986:16:0;;28978:61;;;;-1:-1:-1;;;28978:61:0;;30706:2:1;28978:61:0;;;30688:21:1;;;30725:18;;;30718:30;30784:34;30764:18;;;30757:62;30836:18;;28978:61:0;30504:356:1;28978:61:0;27079:4;27103:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27103:16:0;:30;29050:58;;;;-1:-1:-1;;;29050:58:0;;31067:2:1;29050:58:0;;;31049:21:1;31106:2;31086:18;;;31079:30;31145;31125:18;;;31118:58;31193:18;;29050:58:0;30865:352:1;29050:58:0;29121:45;29150:1;29154:2;29158:7;29121:20;:45::i;:::-;-1:-1:-1;;;;;29179:13:0;;;;;;:9;:13;;;;;:18;;29196:1;;29179:13;:18;;29196:1;;29179:18;:::i;:::-;;;;-1:-1:-1;;29208:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29208:21:0;-1:-1:-1;;;;;29208:21:0;;;;;;;;29247:33;;29208:16;;;29247:33;;29208:16;;29247:33;68761:16:::1;68690:95:::0;:::o;32609:853::-;32763:4;-1:-1:-1;;;;;32784:13:0;;1363:19;:23;32780:675;;32820:71;;-1:-1:-1;;;32820:71:0;;-1:-1:-1;;;;;32820:36:0;;;;;:71;;9376:10;;32871:4;;32877:7;;32886:4;;32820:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32820:71:0;;;;;;;;-1:-1:-1;;32820:71:0;;;;;;;;;;;;:::i;:::-;;;32816:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33061:6;:13;33078:1;33061:18;33057:328;;33104:60;;-1:-1:-1;;;33104:60:0;;;;;;;:::i;33057:328::-;33335:6;33329:13;33320:6;33316:2;33312:15;33305:38;32816:584;-1:-1:-1;;;;;;32942:51:0;-1:-1:-1;;;32942:51:0;;-1:-1:-1;32935:58:0;;32780:675;-1:-1:-1;33439:4:0;32609:853;;;;;;:::o;39792:988::-;40058:22;40108:1;40083:22;40100:4;40083:16;:22::i;:::-;:26;;;;:::i;:::-;40120:18;40141:26;;;:17;:26;;;;;;40058:51;;-1:-1:-1;40274:28:0;;;40270:328;;-1:-1:-1;;;;;40341:18:0;;40319:19;40341:18;;;:12;:18;;;;;;;;:34;;;;;;;;;40392:30;;;;;;:44;;;40509:30;;:17;:30;;;;;:43;;;40270:328;-1:-1:-1;40694:26:0;;;;:17;:26;;;;;;;;40687:33;;;-1:-1:-1;;;;;40738:18:0;;;;;:12;:18;;;;;:34;;;;;;;40731:41;39792:988::o;41075:1079::-;41353:10;:17;41328:22;;41353:21;;41373:1;;41353:21;:::i;:::-;41385:18;41406:24;;;:15;:24;;;;;;41779:10;:26;;41328:46;;-1:-1:-1;41406:24:0;;41328:46;;41779:26;;;;;;:::i;:::-;;;;;;;;;41757:48;;41843:11;41818:10;41829;41818:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;41923:28;;;:15;:28;;;;;;;:41;;;42095:24;;;;;42088:31;42130:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41146:1008;;;41075:1079;:::o;38579:221::-;38664:14;38681:20;38698:2;38681:16;:20::i;:::-;-1:-1:-1;;;;;38712:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;38757:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;38579:221:0:o;4945:455::-;5115:12;5173:5;5148:21;:30;;5140:81;;;;-1:-1:-1;;;5140:81:0;;32304:2:1;5140:81:0;;;32286:21:1;32343:2;32323:18;;;32316:30;32382:34;32362:18;;;32355:62;-1:-1:-1;;;32433:18:1;;;32426:36;32479:19;;5140:81:0;32102:402:1;5140:81:0;5233:12;5247:23;5274:6;-1:-1:-1;;;;;5274:11:0;5293:5;5300:4;5274:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5232:73;;;;5323:69;5350:6;5358:7;5367:10;5379:12;5323:26;:69::i;:::-;5316:76;4945:455;-1:-1:-1;;;;;;;4945:455:0:o;7518:644::-;7703:12;7732:7;7728:427;;;7760:10;:17;7781:1;7760:22;7756:290;;-1:-1:-1;;;;;1363:19:0;;;7970:60;;;;-1:-1:-1;;;7970:60:0;;33003:2:1;7970:60:0;;;32985:21:1;33042:2;33022:18;;;33015:30;33081:31;33061:18;;;33054:59;33130:18;;7970:60:0;32801:353:1;7970:60:0;-1:-1:-1;8067:10:0;8060:17;;7728:427;8110:33;8118:10;8130:12;8865:17;;:21;8861:388;;9097:10;9091:17;9154:15;9141:10;9137:2;9133:19;9126:44;8861:388;9224:12;9217:20;;-1:-1:-1;;;9217:20:0;;;;;;;;:::i;368:131:1:-;-1:-1:-1;;;;;;442:32:1;;432:43;;422:71;;489:1;486;479:12;504:245;562:6;615:2;603:9;594:7;590:23;586:32;583:52;;;631:1;628;621:12;583:52;670:9;657:23;689:30;713:5;689:30;:::i;:::-;738:5;504:245;-1:-1:-1;;;504:245:1:o;946:250::-;1031:1;1041:113;1055:6;1052:1;1049:13;1041:113;;;1131:11;;;1125:18;1112:11;;;1105:39;1077:2;1070:10;1041:113;;;-1:-1:-1;;1188:1:1;1170:16;;1163:27;946:250::o;1201:271::-;1243:3;1281:5;1275:12;1308:6;1303:3;1296:19;1324:76;1393:6;1386:4;1381:3;1377:14;1370:4;1363:5;1359:16;1324:76;:::i;:::-;1454:2;1433:15;-1:-1:-1;;1429:29:1;1420:39;;;;1461:4;1416:50;;1201:271;-1:-1:-1;;1201:271:1:o;1477:220::-;1626:2;1615:9;1608:21;1589:4;1646:45;1687:2;1676:9;1672:18;1664:6;1646:45;:::i;1702:180::-;1761:6;1814:2;1802:9;1793:7;1789:23;1785:32;1782:52;;;1830:1;1827;1820:12;1782:52;-1:-1:-1;1853:23:1;;1702:180;-1:-1:-1;1702:180:1:o;2095:131::-;-1:-1:-1;;;;;2170:31:1;;2160:42;;2150:70;;2216:1;2213;2206:12;2231:315;2299:6;2307;2360:2;2348:9;2339:7;2335:23;2331:32;2328:52;;;2376:1;2373;2366:12;2328:52;2415:9;2402:23;2434:31;2459:5;2434:31;:::i;:::-;2484:5;2536:2;2521:18;;;;2508:32;;-1:-1:-1;;;2231:315:1:o;2551:118::-;2637:5;2630:13;2623:21;2616:5;2613:32;2603:60;;2659:1;2656;2649:12;2674:750;2766:6;2774;2782;2835:2;2823:9;2814:7;2810:23;2806:32;2803:52;;;2851:1;2848;2841:12;2803:52;2891:9;2878:23;-1:-1:-1;;;;;2961:2:1;2953:6;2950:14;2947:34;;;2977:1;2974;2967:12;2947:34;3015:6;3004:9;3000:22;2990:32;;3060:7;3053:4;3049:2;3045:13;3041:27;3031:55;;3082:1;3079;3072:12;3031:55;3122:2;3109:16;3148:2;3140:6;3137:14;3134:34;;;3164:1;3161;3154:12;3134:34;3219:7;3212:4;3202:6;3199:1;3195:14;3191:2;3187:23;3183:34;3180:47;3177:67;;;3240:1;3237;3230:12;3177:67;3271:4;3263:13;;;;-1:-1:-1;3295:6:1;-1:-1:-1;;3336:20:1;;3323:34;3366:28;3323:34;3366:28;:::i;:::-;3413:5;3403:15;;;2674:750;;;;;:::o;4230:171::-;4297:20;;-1:-1:-1;;;;;4346:30:1;;4336:41;;4326:69;;4391:1;4388;4381:12;4326:69;4230:171;;;:::o;4406:529::-;4499:6;4507;4515;4523;4531;4584:3;4572:9;4563:7;4559:23;4555:33;4552:53;;;4601:1;4598;4591:12;4552:53;4637:9;4624:23;4614:33;;4666:37;4699:2;4688:9;4684:18;4666:37;:::i;:::-;4656:47;;4722:37;4755:2;4744:9;4740:18;4722:37;:::i;:::-;4712:47;;4806:2;4795:9;4791:18;4778:32;4768:42;;4860:3;4849:9;4845:19;4832:33;4874:31;4899:5;4874:31;:::i;:::-;4924:5;4914:15;;;4406:529;;;;;;;;:::o;4940:456::-;5017:6;5025;5033;5086:2;5074:9;5065:7;5061:23;5057:32;5054:52;;;5102:1;5099;5092:12;5054:52;5141:9;5128:23;5160:31;5185:5;5160:31;:::i;:::-;5210:5;-1:-1:-1;5267:2:1;5252:18;;5239:32;5280:33;5239:32;5280:33;:::i;:::-;4940:456;;5332:7;;-1:-1:-1;;;5386:2:1;5371:18;;;;5358:32;;4940:456::o;6216:127::-;6277:10;6272:3;6268:20;6265:1;6258:31;6308:4;6305:1;6298:15;6332:4;6329:1;6322:15;6348:632;6413:5;-1:-1:-1;;;;;6484:2:1;6476:6;6473:14;6470:40;;;6490:18;;:::i;:::-;6565:2;6559:9;6533:2;6619:15;;-1:-1:-1;;6615:24:1;;;6641:2;6611:33;6607:42;6595:55;;;6665:18;;;6685:22;;;6662:46;6659:72;;;6711:18;;:::i;:::-;6751:10;6747:2;6740:22;6780:6;6771:15;;6810:6;6802;6795:22;6850:3;6841:6;6836:3;6832:16;6829:25;6826:45;;;6867:1;6864;6857:12;6826:45;6917:6;6912:3;6905:4;6897:6;6893:17;6880:44;6972:1;6965:4;6956:6;6948;6944:19;6940:30;6933:41;;;;6348:632;;;;;:::o;6985:451::-;7054:6;7107:2;7095:9;7086:7;7082:23;7078:32;7075:52;;;7123:1;7120;7113:12;7075:52;7163:9;7150:23;-1:-1:-1;;;;;7188:6:1;7185:30;7182:50;;;7228:1;7225;7218:12;7182:50;7251:22;;7304:4;7296:13;;7292:27;-1:-1:-1;7282:55:1;;7333:1;7330;7323:12;7282:55;7356:74;7422:7;7417:2;7404:16;7399:2;7395;7391:11;7356:74;:::i;7441:247::-;7500:6;7553:2;7541:9;7532:7;7528:23;7524:32;7521:52;;;7569:1;7566;7559:12;7521:52;7608:9;7595:23;7627:31;7652:5;7627:31;:::i;7995:382::-;8060:6;8068;8121:2;8109:9;8100:7;8096:23;8092:32;8089:52;;;8137:1;8134;8127:12;8089:52;8176:9;8163:23;8195:31;8220:5;8195:31;:::i;:::-;8245:5;-1:-1:-1;8302:2:1;8287:18;;8274:32;8315:30;8274:32;8315:30;:::i;:::-;8364:7;8354:17;;;7995:382;;;;;:::o;8382:241::-;8438:6;8491:2;8479:9;8470:7;8466:23;8462:32;8459:52;;;8507:1;8504;8497:12;8459:52;8546:9;8533:23;8565:28;8587:5;8565:28;:::i;8628:795::-;8723:6;8731;8739;8747;8800:3;8788:9;8779:7;8775:23;8771:33;8768:53;;;8817:1;8814;8807:12;8768:53;8856:9;8843:23;8875:31;8900:5;8875:31;:::i;:::-;8925:5;-1:-1:-1;8982:2:1;8967:18;;8954:32;8995:33;8954:32;8995:33;:::i;:::-;9047:7;-1:-1:-1;9101:2:1;9086:18;;9073:32;;-1:-1:-1;9156:2:1;9141:18;;9128:32;-1:-1:-1;;;;;9172:30:1;;9169:50;;;9215:1;9212;9205:12;9169:50;9238:22;;9291:4;9283:13;;9279:27;-1:-1:-1;9269:55:1;;9320:1;9317;9310:12;9269:55;9343:74;9409:7;9404:2;9391:16;9386:2;9382;9378:11;9343:74;:::i;:::-;9333:84;;;8628:795;;;;;;;:::o;9428:387::-;9504:6;9512;9520;9573:2;9561:9;9552:7;9548:23;9544:32;9541:52;;;9589:1;9586;9579:12;9541:52;9625:9;9612:23;9602:33;;9685:2;9674:9;9670:18;9657:32;9698:31;9723:5;9698:31;:::i;:::-;9748:5;-1:-1:-1;9772:37:1;9805:2;9790:18;;9772:37;:::i;:::-;9762:47;;9428:387;;;;;:::o;9820:388::-;9888:6;9896;9949:2;9937:9;9928:7;9924:23;9920:32;9917:52;;;9965:1;9962;9955:12;9917:52;10004:9;9991:23;10023:31;10048:5;10023:31;:::i;:::-;10073:5;-1:-1:-1;10130:2:1;10115:18;;10102:32;10143:33;10102:32;10143:33;:::i;10213:380::-;10292:1;10288:12;;;;10335;;;10356:61;;10410:4;10402:6;10398:17;10388:27;;10356:61;10463:2;10455:6;10452:14;10432:18;10429:38;10426:161;;10509:10;10504:3;10500:20;10497:1;10490:31;10544:4;10541:1;10534:15;10572:4;10569:1;10562:15;10426:161;;10213:380;;;:::o;10598:127::-;10659:10;10654:3;10650:20;10647:1;10640:31;10690:4;10687:1;10680:15;10714:4;10711:1;10704:15;10730:127;10791:10;10786:3;10782:20;10779:1;10772:31;10822:4;10819:1;10812:15;10846:4;10843:1;10836:15;10862:356;11064:2;11046:21;;;11083:18;;;11076:30;11142:34;11137:2;11122:18;;11115:62;11209:2;11194:18;;10862:356::o;12275:346::-;12477:2;12459:21;;;12516:2;12496:18;;;12489:30;-1:-1:-1;;;12550:2:1;12535:18;;12528:52;12612:2;12597:18;;12275:346::o;12626:540::-;12881:25;;;-1:-1:-1;;;;;12979:15:1;;;12974:2;12959:18;;12952:43;13031:15;;;;13026:2;13011:18;;13004:43;13078:2;13063:18;;13056:34;;;;-1:-1:-1;;;;;13127:32:1;13121:3;13106:19;;13099:61;12868:3;12853:19;;12626:540::o;13381:344::-;13583:2;13565:21;;;13622:2;13602:18;;;13595:30;-1:-1:-1;;;13656:2:1;13641:18;;13634:50;13716:2;13701:18;;13381:344::o;14434:127::-;14495:10;14490:3;14486:20;14483:1;14476:31;14526:4;14523:1;14516:15;14550:4;14547:1;14540:15;14566:128;14633:9;;;14654:11;;;14651:37;;;14668:18;;:::i;14699:168::-;14772:9;;;14803;;14820:15;;;14814:22;;14800:37;14790:71;;14841:18;;:::i;14872:127::-;14933:10;14928:3;14924:20;14921:1;14914:31;14964:4;14961:1;14954:15;14988:4;14985:1;14978:15;15004:120;15044:1;15070;15060:35;;15075:18;;:::i;:::-;-1:-1:-1;15109:9:1;;15004:120::o;15129:180::-;-1:-1:-1;;;;;15234:10:1;;;15246;;;15230:27;;15269:11;;;15266:37;;;15283:18;;:::i;:::-;15266:37;15129:180;;;;:::o;16612:545::-;16714:2;16709:3;16706:11;16703:448;;;16750:1;16775:5;16771:2;16764:17;16820:4;16816:2;16806:19;16890:2;16878:10;16874:19;16871:1;16867:27;16861:4;16857:38;16926:4;16914:10;16911:20;16908:47;;;-1:-1:-1;16949:4:1;16908:47;17004:2;16999:3;16995:12;16992:1;16988:20;16982:4;16978:31;16968:41;;17059:82;17077:2;17070:5;17067:13;17059:82;;;17122:17;;;17103:1;17092:13;17059:82;;;17063:3;;;16612:545;;;:::o;17333:1352::-;17459:3;17453:10;-1:-1:-1;;;;;17478:6:1;17475:30;17472:56;;;17508:18;;:::i;:::-;17537:97;17627:6;17587:38;17619:4;17613:11;17587:38;:::i;:::-;17581:4;17537:97;:::i;:::-;17689:4;;17753:2;17742:14;;17770:1;17765:663;;;;18472:1;18489:6;18486:89;;;-1:-1:-1;18541:19:1;;;18535:26;18486:89;-1:-1:-1;;17290:1:1;17286:11;;;17282:24;17278:29;17268:40;17314:1;17310:11;;;17265:57;18588:81;;17735:944;;17765:663;16559:1;16552:14;;;16596:4;16583:18;;-1:-1:-1;;17801:20:1;;;17919:236;17933:7;17930:1;17927:14;17919:236;;;18022:19;;;18016:26;18001:42;;18114:27;;;;18082:1;18070:14;;;;17949:19;;17919:236;;;17923:3;18183:6;18174:7;18171:19;18168:201;;;18244:19;;;18238:26;-1:-1:-1;;18327:1:1;18323:14;;;18339:3;18319:24;18315:37;18311:42;18296:58;18281:74;;18168:201;-1:-1:-1;;;;;18415:1:1;18399:14;;;18395:22;18382:36;;-1:-1:-1;17333:1352:1:o;19387:135::-;19426:3;19447:17;;;19444:43;;19467:18;;:::i;:::-;-1:-1:-1;19514:1:1;19503:13;;19387:135::o;20639:184::-;20709:6;20762:2;20750:9;20741:7;20737:23;20733:32;20730:52;;;20778:1;20775;20768:12;20730:52;-1:-1:-1;20801:16:1;;20639:184;-1:-1:-1;20639:184:1:o;21529:125::-;21594:9;;;21615:10;;;21612:36;;;21628:18;;:::i;21659:251::-;21729:6;21782:2;21770:9;21761:7;21757:23;21753:32;21750:52;;;21798:1;21795;21788:12;21750:52;21830:9;21824:16;21849:31;21874:5;21849:31;:::i;21915:245::-;21982:6;22035:2;22023:9;22014:7;22010:23;22006:32;22003:52;;;22051:1;22048;22041:12;22003:52;22083:9;22077:16;22102:28;22124:5;22102:28;:::i;22165:722::-;22215:3;22256:5;22250:12;22285:36;22311:9;22285:36;:::i;:::-;22340:1;22357:18;;;22384:133;;;;22531:1;22526:355;;;;22350:531;;22384:133;-1:-1:-1;;22417:24:1;;22405:37;;22490:14;;22483:22;22471:35;;22462:45;;;-1:-1:-1;22384:133:1;;22526:355;22557:5;22554:1;22547:16;22586:4;22631:2;22628:1;22618:16;22656:1;22670:165;22684:6;22681:1;22678:13;22670:165;;;22762:14;;22749:11;;;22742:35;22805:16;;;;22699:10;;22670:165;;;22674:3;;;22864:6;22859:3;22855:16;22848:23;;22350:531;;;;;22165:722;;;;:::o;22892:469::-;23113:3;23141:38;23175:3;23167:6;23141:38;:::i;:::-;23208:6;23202:13;23224:65;23282:6;23278:2;23271:4;23263:6;23259:17;23224:65;:::i;:::-;23305:50;23347:6;23343:2;23339:15;23331:6;23305:50;:::i;27033:409::-;27235:2;27217:21;;;27274:2;27254:18;;;27247:30;27313:34;27308:2;27293:18;;27286:62;-1:-1:-1;;;27379:2:1;27364:18;;27357:43;27432:3;27417:19;;27033:409::o;28187:112::-;28219:1;28245;28235:35;;28250:18;;:::i;:::-;-1:-1:-1;28284:9:1;;28187:112::o;29731:414::-;29933:2;29915:21;;;29972:2;29952:18;;;29945:30;30011:34;30006:2;29991:18;;29984:62;-1:-1:-1;;;30077:2:1;30062:18;;30055:48;30135:3;30120:19;;29731:414::o;31222:489::-;-1:-1:-1;;;;;31491:15:1;;;31473:34;;31543:15;;31538:2;31523:18;;31516:43;31590:2;31575:18;;31568:34;;;31638:3;31633:2;31618:18;;31611:31;;;31416:4;;31659:46;;31685:19;;31677:6;31659:46;:::i;:::-;31651:54;31222:489;-1:-1:-1;;;;;;31222:489:1:o;31716:249::-;31785:6;31838:2;31826:9;31817:7;31813:23;31809:32;31806:52;;;31854:1;31851;31844:12;31806:52;31886:9;31880:16;31905:30;31929:5;31905:30;:::i;31970:127::-;32031:10;32026:3;32022:20;32019:1;32012:31;32062:4;32059:1;32052:15;32086:4;32083:1;32076:15;32509:287;32638:3;32676:6;32670:13;32692:66;32751:6;32746:3;32739:4;32731:6;32727:17;32692:66;:::i;:::-;32774:16;;;;;32509:287;-1:-1:-1;;32509:287:1:o

Swarm Source

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