ETH Price: $3,451.61 (-1.85%)
Gas: 3 Gwei

EximiO NFT (EximiO)
 

Overview

TokenID

8

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
EximioRentalNFT

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-04-25
*/

// File: Git/eximio-solidity/contracts/IEximioGateway.sol

/**
 * Interface: IEximioGateway
 * Author   : FRENCH-ICO.com ®
 * Website  : www.eximio.io
 * Version  : 2.4
 * SPDX-License-Identifier: UNLICENSED
 */

pragma solidity ^0.8.15;

struct EximioGatewayParams {
    bool[] tBool;
    uint[] tUint;
    string[] tString;
    address[] tAddress;
}

interface IEximioGateway {
    
    function doAction(
        uint tokenId, // Token ID
        address payable sender, // Sender
        uint8 action, // Action to do
        EximioGatewayParams calldata params // Parameters
    ) external payable returns(bool);

}

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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);
}

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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 = _ownerOf(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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

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

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

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

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @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. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256, /* firstTokenId */
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}
}

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

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

// File: Git/eximio-solidity/node_modules/@openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

// File: Git/eximio-solidity/contracts/EximioNFT.sol

/**
 * Contract: EximioNFT (ERC721)
 * Author  : FRENCH-ICO.com ®
 * Website : www.eximio.io
 * Version : 2.4
 */

pragma solidity ^0.8.15;




contract EximioNFT is Ownable, ERC721Enumerable {

    string public baseURI;                              // Base URI
    uint public lastTokenId;                            // ID of the last token
    mapping(string => uint) public tokenIdFromDNA;      // Array to be able to find a tokenId from a DNA
    mapping(address => bool) public isGatewayAllowed;   // Array of all the gateways allowed to interact with this contract

    /**
     * Parameters that the owner or the creator of the NFT will be able to update
     */
    struct UserParameters {
        bool[] tBool;
        uint[] tUint;
        string[] tString;
        address[] tAddress;
    }

    /**
     * Informations about the certificate
     */
    struct Certificate {
        uint creatorFees;                   // Fees that the creator will receive for each sell
        uint lastPrice;                     // Last price of the token in decimals
        uint creationDate;                  // Creation date
        uint8 decimalsOfLastCurrencyUsed;   // Number of decimals of the last currency used for selling
        address lastCurrencyUsed;           // Last currency used for selling
        address creator;                    // Creator of the certificate
        string DNA;                         // DNA of the document you want to timestamp (sha256)
        UserParameters creatorData;        // Creator's data
        UserParameters ownerData;          // Oowner's data
    }
    mapping(uint => Certificate) public certificates;

    /**
     * Only the token's creator is able to execute
     *
     * @param _tokenId Token ID
     */
    modifier onlyTokenCreator(uint _tokenId) {
        require(msg.sender == certificates[_tokenId].creator, "only the token creator is allowed");
        _;
    }

    /**
     * Only the token's owner is able to execute
     *
     * @param _tokenId Token ID
     */
    modifier onlyTokenOwner(uint _tokenId) {
        require(msg.sender == ownerOf(_tokenId), "only the token owner is allowed");
        _;
    }

    /*
     * Events
     */

    event NewCertificate(address _creator, address _to, uint _tokenId, string _DNA, uint creatorFees);
    event LastPriceChanged(uint _tokenId, uint _newPrice);
    event NewCreatorData(address _creator, UserParameters _creatorData);
    event NewOwnerData(address _owner, UserParameters _ownerData);

    /**
     * Constructor
     *
     * @param _name is the name's ERC721
     * @param _symbol is the name's ERC721
     */
    constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {
    }

    /**
     * Allow a gateway to create a certificate
     *
     * @param _gatewayAddress is the gateway address
     */
    function allowGateway(address _gatewayAddress) public onlyOwner {
        isGatewayAllowed[_gatewayAddress] = true;
    }

    /**
     * Disallow a gateway to create a certificate
     *
     * @param _gatewayAddress is the gateway address
     */
    function disallowGateway(address _gatewayAddress) public onlyOwner {
        isGatewayAllowed[_gatewayAddress] = false;
    }

    /**
     * Get the creator fees
     *
     * @param _tokenId is the token Id
     * @return Fees
     */
    function getCreatorFees(uint _tokenId) external view returns(uint) {
        return certificates[_tokenId].creatorFees;
    }

    /**
     * Get the creator of the token
     *
     * @param _tokenId is the token Id
     * @return Creator address
     */
    function getCreator(uint _tokenId) external view returns(address) {
        return certificates[_tokenId].creator;
    }

    /**
     * Get the last price
     *
     * @param _tokenId is the token Id
     * @return Last price
     */
    function getLastPrice(uint _tokenId) external view returns(uint) {
        return certificates[_tokenId].lastPrice;
    }

    /**
     * Get the last currency used
     *
     * @param _tokenId is the token Id
     * @return Last currency used
     */
    function getLastCurrencyUsed(uint _tokenId) external view returns(address) {
        return certificates[_tokenId].lastCurrencyUsed;
    }

    /**
     * Get the number of decimals of the last currency used
     *
     * @param _tokenId is the token Id
     * @return Number of decimals
     */
    function getDecimalsOfLastCurrencyUsed(uint _tokenId) external view returns(uint8) {
        return certificates[_tokenId].decimalsOfLastCurrencyUsed;
    }

    /**
     * Get the DNA of the token
     *
     * @param _tokenId is the token Id
     * @return DNA
     */
    function getDna(uint _tokenId) external view returns(string memory) {
        return certificates[_tokenId].DNA;
    }

    /**
     * Get the creator data of the token
     *
     * @param _tokenId Token Id
     * @return Creator data
     */
    function getCreatorData(uint _tokenId) external view returns(UserParameters memory) {
        return certificates[_tokenId].creatorData;
    }

    /**
     * Set the Creator Data
     *
     * @param _tokenId Token ID
     * @param _creatorData Creator data
     */
    function setCreatorData(uint _tokenId, UserParameters memory _creatorData) public onlyTokenCreator(_tokenId) {
        certificates[_tokenId].creatorData = _creatorData;
        emit NewCreatorData(msg.sender, _creatorData);
    }

    /**
     * Get the owner data of the token
     *
     * @param _tokenId Token ID
     * @return Owner data
     */
    function getOwnerData(uint _tokenId) external view returns(UserParameters memory) {
        return certificates[_tokenId].ownerData;
    }

    /**
     * Set the Owner Data
     *
     * @param _tokenId Token ID
     * @param _ownerData Owner data
     */
    function setOwnerData(uint _tokenId, UserParameters memory _ownerData) public onlyTokenOwner(_tokenId) {
        certificates[_tokenId].ownerData = _ownerData;
        emit NewOwnerData(msg.sender, _ownerData);
    }

    /**
     * Get the last tokenId
     *
     * @return lastTokenId
     */
    function getLastTokenId() external view returns(uint) {
        return lastTokenId;
    }

    /**
     * Get the baseURI
     *
     * @return Base URI
     */
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    /**
     * Set the baseURI
     *
     * @param baseURI_ Base URI
     */
    function setBaseURI(string memory baseURI_) public onlyOwner {
        baseURI = baseURI_;
    }

    /**
     * Create a new certificate
     *
     * @param _creator address of the creator
     * @param _to address to send the Certificate after mintage
     * @param _DNA DNA of the document to record
     * @param _creatorFees fees requested by the creator for each sell
     * @return True if the new certificate has been emitted
     */
    function newCertificate(address _creator, address _to, string memory _DNA, uint _creatorFees) external returns(bool) {
        require (msg.sender == owner() || isGatewayAllowed[msg.sender], "sender not allowed to create a certificate");
        require (tokenIdFromDNA[_DNA] == 0, "this DNA is already recorded");

        uint tokenId = ++lastTokenId;

        _safeMint(_to, tokenId); // Mint the token and give it to the creator

        certificates[tokenId].creator = _creator;
        certificates[tokenId].lastPrice = 0;
        certificates[tokenId].DNA = _DNA;
        certificates[tokenId].creatorFees = _creatorFees;
        certificates[tokenId].creationDate = block.timestamp;

        tokenIdFromDNA[_DNA] = tokenId;

        emit NewCertificate(_creator, _to, tokenId, _DNA, _creatorFees);
        return true;
    }

    /**
     * Delegate an action to the gateway (example : create an auction)
     *
     * @param _tokenId Token ID
     * @param _gatewayAddress Gateway address
     * @param _action Action to do
     * @param _params Parameters
     */
    function sendToGateway(
        uint _tokenId,
        address _gatewayAddress,
        uint8 _action,
        EximioGatewayParams calldata _params
    )
        payable
        external
    {
        require (isGatewayAllowed[_gatewayAddress], "gateway not allowed");
        approve(_gatewayAddress, _tokenId); // Delegate token sale to the gateway by an approval
        require(IEximioGateway(_gatewayAddress).doAction{value:msg.value} (_tokenId, payable(msg.sender), _action, _params), "callback from gateway failed");
    }

    /**
     * Update the last price
     * Only the gateway can change it
     *
     * @param _tokenId Token ID
     * @param _price New price
     * @param _decimals Number of decimals of the currency used for the last sell
     * @param _currencyUsed Address of the currency used for the last sell
     * @return Is the update successful?
     */
    function updateLastPrice(uint _tokenId, uint _price, uint8 _decimals, address _currencyUsed) external returns(bool) {
        require (isGatewayAllowed[msg.sender], "sender not allowed to update the last price");

        certificates[_tokenId].lastPrice = _price;
        certificates[_tokenId].lastCurrencyUsed = _currencyUsed;
        certificates[_tokenId].decimalsOfLastCurrencyUsed = _decimals;

        emit LastPriceChanged(_tokenId, _price);
        return true; // for callback used by the gateway
    }

    /**
     * Burn a token
     *
     * @param _tokenId Token ID
     */
    function burn(uint256 _tokenId) public onlyTokenCreator(_tokenId) onlyTokenOwner(_tokenId) {
        _burn(_tokenId);

        string memory DNA = certificates[_tokenId].DNA;
        delete tokenIdFromDNA[DNA];
        delete certificates[_tokenId];
    }

}

// File: Git/eximio-solidity/contracts/IERC4907.sol

/** 
 * Doc : https://eips.ethereum.org/EIPS/eip-4907 
 */

pragma solidity ^0.8.15;

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

// File: Git/eximio-solidity/contracts/EximioRentalNFT.sol

/**
 * Contract: EximioRentalNFT (ERC4907)
 * Author  : FRENCH-ICO.com ®
 * Website : www.eximio.io
 * Version : 2.4
 * Doc : https://eips.ethereum.org/EIPS/eip-4907 
 */
 
pragma solidity ^0.8.15;



contract EximioRentalNFT is EximioNFT, IERC4907 {
    struct UserInfo {
        address user;   // address of user role
        uint64 expires; // unix timestamp, user expires
    }

    mapping (uint256  => UserInfo) internal _users;

    constructor(string memory name_, string memory symbol_) EximioNFT(name_, symbol_) {
    }

    /**
     * @notice set the user and expires of a 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) public virtual {
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");
        UserInfo storage info = _users[tokenId];
        info.user = user;
        info.expires = expires;
        emit UpdateUser(tokenId, user, expires);
    }

    /**
     * @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) public view virtual returns(address) {
        if (uint256(_users[tokenId].expires) >= block.timestamp) {
            return _users[tokenId].user;
        } else {
            return address(0);
        }
    }

    /**
     * @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) public view virtual returns(uint256) {
        return _users[tokenId].expires;
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId, batchSize);

        if (from != to && _users[tokenId].user != address(0)) {
            delete _users[tokenId];
            emit UpdateUser(tokenId, address(0), 0);
        }
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"LastPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_creator","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_DNA","type":"string"},{"indexed":false,"internalType":"uint256","name":"creatorFees","type":"uint256"}],"name":"NewCertificate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_creator","type":"address"},{"components":[{"internalType":"bool[]","name":"tBool","type":"bool[]"},{"internalType":"uint256[]","name":"tUint","type":"uint256[]"},{"internalType":"string[]","name":"tString","type":"string[]"},{"internalType":"address[]","name":"tAddress","type":"address[]"}],"indexed":false,"internalType":"struct EximioNFT.UserParameters","name":"_creatorData","type":"tuple"}],"name":"NewCreatorData","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"components":[{"internalType":"bool[]","name":"tBool","type":"bool[]"},{"internalType":"uint256[]","name":"tUint","type":"uint256[]"},{"internalType":"string[]","name":"tString","type":"string[]"},{"internalType":"address[]","name":"tAddress","type":"address[]"}],"indexed":false,"internalType":"struct EximioNFT.UserParameters","name":"_ownerData","type":"tuple"}],"name":"NewOwnerData","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"},{"inputs":[{"internalType":"address","name":"_gatewayAddress","type":"address"}],"name":"allowGateway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"certificates","outputs":[{"internalType":"uint256","name":"creatorFees","type":"uint256"},{"internalType":"uint256","name":"lastPrice","type":"uint256"},{"internalType":"uint256","name":"creationDate","type":"uint256"},{"internalType":"uint8","name":"decimalsOfLastCurrencyUsed","type":"uint8"},{"internalType":"address","name":"lastCurrencyUsed","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"string","name":"DNA","type":"string"},{"components":[{"internalType":"bool[]","name":"tBool","type":"bool[]"},{"internalType":"uint256[]","name":"tUint","type":"uint256[]"},{"internalType":"string[]","name":"tString","type":"string[]"},{"internalType":"address[]","name":"tAddress","type":"address[]"}],"internalType":"struct EximioNFT.UserParameters","name":"creatorData","type":"tuple"},{"components":[{"internalType":"bool[]","name":"tBool","type":"bool[]"},{"internalType":"uint256[]","name":"tUint","type":"uint256[]"},{"internalType":"string[]","name":"tString","type":"string[]"},{"internalType":"address[]","name":"tAddress","type":"address[]"}],"internalType":"struct EximioNFT.UserParameters","name":"ownerData","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gatewayAddress","type":"address"}],"name":"disallowGateway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCreator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCreatorData","outputs":[{"components":[{"internalType":"bool[]","name":"tBool","type":"bool[]"},{"internalType":"uint256[]","name":"tUint","type":"uint256[]"},{"internalType":"string[]","name":"tString","type":"string[]"},{"internalType":"address[]","name":"tAddress","type":"address[]"}],"internalType":"struct EximioNFT.UserParameters","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCreatorFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getDecimalsOfLastCurrencyUsed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getDna","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getLastCurrencyUsed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getLastPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getOwnerData","outputs":[{"components":[{"internalType":"bool[]","name":"tBool","type":"bool[]"},{"internalType":"uint256[]","name":"tUint","type":"uint256[]"},{"internalType":"string[]","name":"tString","type":"string[]"},{"internalType":"address[]","name":"tAddress","type":"address[]"}],"internalType":"struct EximioNFT.UserParameters","name":"","type":"tuple"}],"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":"address","name":"","type":"address"}],"name":"isGatewayAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_DNA","type":"string"},{"internalType":"uint256","name":"_creatorFees","type":"uint256"}],"name":"newCertificate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_gatewayAddress","type":"address"},{"internalType":"uint8","name":"_action","type":"uint8"},{"components":[{"internalType":"bool[]","name":"tBool","type":"bool[]"},{"internalType":"uint256[]","name":"tUint","type":"uint256[]"},{"internalType":"string[]","name":"tString","type":"string[]"},{"internalType":"address[]","name":"tAddress","type":"address[]"}],"internalType":"struct EximioGatewayParams","name":"_params","type":"tuple"}],"name":"sendToGateway","outputs":[],"stateMutability":"payable","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"bool[]","name":"tBool","type":"bool[]"},{"internalType":"uint256[]","name":"tUint","type":"uint256[]"},{"internalType":"string[]","name":"tString","type":"string[]"},{"internalType":"address[]","name":"tAddress","type":"address[]"}],"internalType":"struct EximioNFT.UserParameters","name":"_creatorData","type":"tuple"}],"name":"setCreatorData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"components":[{"internalType":"bool[]","name":"tBool","type":"bool[]"},{"internalType":"uint256[]","name":"tUint","type":"uint256[]"},{"internalType":"string[]","name":"tString","type":"string[]"},{"internalType":"address[]","name":"tAddress","type":"address[]"}],"internalType":"struct EximioNFT.UserParameters","name":"_ownerData","type":"tuple"}],"name":"setOwnerData","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":"string","name":"","type":"string"}],"name":"tokenIdFromDNA","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"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"_currencyUsed","type":"address"}],"name":"updateLastPrice","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}]

60806040523480156200001157600080fd5b50604051620046bc380380620046bc833981016040819052620000349162000182565b8181818162000043336200006d565b60016200005183826200027b565b5060026200006082826200027b565b5050505050505062000347565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000e557600080fd5b81516001600160401b0380821115620001025762000102620000bd565b604051601f8301601f19908116603f011681019082821181831017156200012d576200012d620000bd565b816040528381526020925086838588010111156200014a57600080fd5b600091505b838210156200016e57858201830151818301840152908201906200014f565b600093810190920192909252949350505050565b600080604083850312156200019657600080fd5b82516001600160401b0380821115620001ae57600080fd5b620001bc86838701620000d3565b93506020850151915080821115620001d357600080fd5b50620001e285828601620000d3565b9150509250929050565b600181811c908216806200020157607f821691505b6020821081036200022257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200027657600081815260208120601f850160051c81016020861015620002515750805b601f850160051c820191505b8181101562000272578281556001016200025d565b5050505b505050565b81516001600160401b03811115620002975762000297620000bd565b620002af81620002a88454620001ec565b8462000228565b602080601f831160018114620002e75760008415620002ce5750858301515b600019600386901b1c1916600185901b17855562000272565b600085815260208120601f198616915b828110156200031857888601518255948401946001909101908401620002f7565b5085821015620003375787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61436580620003576000396000f3fe6080604052600436106102725760003560e01c806375cc4f0f1161014f578063c2f1f14a116100c1578063e030565e1161007a578063e030565e1461081c578063e6259b111461083c578063e985e9c51461085c578063ebb6d458146108a5578063f2fde38b146108d5578063f84ddf0b146108f557600080fd5b8063c2f1f14a14610750578063c4a6ce7a14610770578063c87b56dd14610790578063ce63771e146107b0578063d48e638a146107c3578063dd5a3d08146107fc57600080fd5b806395c671d81161011357806395c671d81461066957806395d89b4114610696578063a22cb465146106ab578063a3f29b14146106cb578063b88d4fde14610710578063be15e30b1461073057600080fd5b806375cc4f0f146105b957806383c4c00d146105d95780638a60c46e146105ee5780638da5cb5b1461060e5780638fc88c481461062c57600080fd5b8063422627c3116101e85780636352211e116101ac5780636352211e146104ea57806365fa2f7f1461050a578063663b3e221461053a5780636c0360eb1461056f57806370a0823114610584578063715018a6146105a457600080fd5b8063422627c31461044a57806342842e0e1461046a57806342966c681461048a5780634f6ccce7146104aa57806355f804b3146104ca57600080fd5b806318160ddd1161023a57806318160ddd1461034857806321ecb49814610367578063233be7a3146103a557806323b872dd146103dd57806325ee6ee9146103fd5780632f745c591461042a57600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b314610306578063117dc55814610328575b600080fd5b34801561028357600080fd5b5061029761029236600461335a565b61090b565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c1610936565b6040516102a391906133c7565b3480156102da57600080fd5b506102ee6102e93660046133da565b6109c8565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b5061032661032136600461340a565b6109ef565b005b34801561033457600080fd5b50610297610343366004613519565b610b09565b34801561035457600080fd5b506009545b6040519081526020016102a3565b34801561037357600080fd5b506102ee6103823660046133da565b6000908152600f602052604090206003015461010090046001600160a01b031690565b3480156103b157600080fd5b506103596103c036600461357e565b8051602081830181018051600d8252928201919093012091525481565b3480156103e957600080fd5b506103266103f83660046135b2565b610cec565b34801561040957600080fd5b506103596104183660046133da565b6000908152600f602052604090205490565b34801561043657600080fd5b5061035961044536600461340a565b610d1d565b34801561045657600080fd5b506102c16104653660046133da565b610db3565b34801561047657600080fd5b506103266104853660046135b2565b610e58565b34801561049657600080fd5b506103266104a53660046133da565b610e73565b3480156104b657600080fd5b506103596104c53660046133da565b6110b1565b3480156104d657600080fd5b506103266104e536600461357e565b611144565b3480156104f657600080fd5b506102ee6105053660046133da565b61115c565b34801561051657600080fd5b506103596105253660046133da565b6000908152600f602052604090206001015490565b34801561054657600080fd5b5061055a6105553660046133da565b6111bc565b6040516102a39998979695949392919061374c565b34801561057b57600080fd5b506102c16116cb565b34801561059057600080fd5b5061035961059f3660046137cf565b611759565b3480156105b057600080fd5b506103266117df565b3480156105c557600080fd5b506103266105d43660046139cb565b6117f3565b3480156105e557600080fd5b50600c54610359565b3480156105fa57600080fd5b506103266106093660046137cf565b61191b565b34801561061a57600080fd5b506000546001600160a01b03166102ee565b34801561063857600080fd5b506103596106473660046133da565b600090815260106020526040902054600160a01b90046001600160401b031690565b34801561067557600080fd5b506106896106843660046133da565b611944565b6040516102a39190613aaf565b3480156106a257600080fd5b506102c1611b98565b3480156106b757600080fd5b506103266106c6366004613ac2565b611ba7565b3480156106d757600080fd5b506106fe6106e63660046133da565b6000908152600f602052604090206003015460ff1690565b60405160ff90911681526020016102a3565b34801561071c57600080fd5b5061032661072b366004613af9565b611bb2565b34801561073c57600080fd5b5061032661074b3660046139cb565b611bea565b34801561075c57600080fd5b506102ee61076b3660046133da565b611cd6565b34801561077c57600080fd5b5061032661078b3660046137cf565b611d25565b34801561079c57600080fd5b506102c16107ab3660046133da565b611d51565b6103266107be366004613b85565b611db8565b3480156107cf57600080fd5b506102ee6107de3660046133da565b6000908152600f60205260409020600401546001600160a01b031690565b34801561080857600080fd5b506106896108173660046133da565b611ee3565b34801561082857600080fd5b50610326610837366004613bf1565b6120c6565b34801561084857600080fd5b50610297610857366004613c3d565b6121b7565b34801561086857600080fd5b50610297610877366004613c83565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156108b157600080fd5b506102976108c03660046137cf565b600e6020526000908152604090205460ff1681565b3480156108e157600080fd5b506103266108f03660046137cf565b6122ad565b34801561090157600080fd5b50610359600c5481565b60006001600160e01b03198216632b424ad760e21b1480610930575061093082612326565b92915050565b60606001805461094590613cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461097190613cb6565b80156109be5780601f10610993576101008083540402835291602001916109be565b820191906000526020600020905b8154815290600101906020018083116109a157829003601f168201915b5050505050905090565b60006109d38261234b565b506000908152600560205260409020546001600160a01b031690565b60006109fa8261115c565b9050806001600160a01b0316836001600160a01b031603610a6c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a885750610a888133610877565b610afa5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a63565b610b0483836123aa565b505050565b600080546001600160a01b0316331480610b325750336000908152600e602052604090205460ff165b610b915760405162461bcd60e51b815260206004820152602a60248201527f73656e646572206e6f7420616c6c6f77656420746f20637265617465206120636044820152696572746966696361746560b01b6064820152608401610a63565b600d83604051610ba19190613cf0565b908152602001604051809103902054600014610bff5760405162461bcd60e51b815260206004820152601c60248201527f7468697320444e4120697320616c7265616479207265636f72646564000000006044820152606401610a63565b6000600c60008154610c1090613d22565b91829055509050610c218582612418565b6000818152600f602052604081206004810180546001600160a01b0319166001600160a01b038a161790556001810191909155600501610c618582613d89565b506000818152600f60205260409081902084815542600290910155518190600d90610c8d908790613cf0565b9081526020016040518091039020819055507fa8b12eceb9bd52bd679e37228be1415cdbc2c74e2e70137e0eb18e58110a74698686838787604051610cd6959493929190613e48565b60405180910390a160019150505b949350505050565b610cf63382612432565b610d125760405162461bcd60e51b8152600401610a6390613e8d565b610b048383836124b0565b6000610d2883611759565b8210610d8a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a63565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000818152600f60205260409020600501805460609190610dd390613cb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610dff90613cb6565b8015610e4c5780601f10610e2157610100808354040283529160200191610e4c565b820191906000526020600020905b815481529060010190602001808311610e2f57829003601f168201915b50505050509050919050565b610b0483838360405180602001604052806000815250611bb2565b6000818152600f602052604090206004015481906001600160a01b03163314610eae5760405162461bcd60e51b8152600401610a6390613eda565b81610eb88161115c565b6001600160a01b0316336001600160a01b031614610f185760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c792074686520746f6b656e206f776e657220697320616c6c6f776564006044820152606401610a63565b610f2183612621565b6000838152600f602052604081206005018054610f3d90613cb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6990613cb6565b8015610fb65780601f10610f8b57610100808354040283529160200191610fb6565b820191906000526020600020905b815481529060010190602001808311610f9957829003601f168201915b50505050509050600d81604051610fcd9190613cf0565b9081526040805160209281900383019020600090819055868152600f909252812081815560018101829055600281018290556003810180546001600160a81b03191690556004810180546001600160a01b03191690559061103160058301826130f0565b600682016000611041828261312a565b61104f60018301600061314f565b61105d60028301600061316d565b61106b60038301600061314f565b5050600a8201600061107d828261312a565b61108b60018301600061314f565b61109960028301600061316d565b6110a760038301600061314f565b5050505050505050565b60006110bc60095490565b821061111f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a63565b6009828154811061113257611132613f1b565b90600052602060002001549050919050565b61114c6126c4565b600b6111588282613d89565b5050565b6000818152600360205260408120546001600160a01b0316806109305760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a63565b600f6020526000908152604090208054600182015460028301546003840154600485015460058601805495969495939460ff8416946101009094046001600160a01b039081169493169290919061121290613cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461123e90613cb6565b801561128b5780601f106112605761010080835404028352916020019161128b565b820191906000526020600020905b81548152906001019060200180831161126e57829003601f168201915b505050505090806006016040518060800160405290816000820180548060200260200160405190810160405280929190818152602001828054801561130f57602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116112de5790505b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561136757602002820191906000526020600020905b815481526020019060010190808311611353575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156114415783829060005260206000200180546113b490613cb6565b80601f01602080910402602001604051908101604052809291908181526020018280546113e090613cb6565b801561142d5780601f106114025761010080835404028352916020019161142d565b820191906000526020600020905b81548152906001019060200180831161141057829003601f168201915b505050505081526020019060010190611395565b505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156114a257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611484575b5050505050815250509080600a016040518060800160405290816000820180548060200260200160405190810160405280929190818152602001828054801561152a57602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116114f95790505b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561158257602002820191906000526020600020905b81548152602001906001019080831161156e575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561165c5783829060005260206000200180546115cf90613cb6565b80601f01602080910402602001604051908101604052809291908181526020018280546115fb90613cb6565b80156116485780601f1061161d57610100808354040283529160200191611648565b820191906000526020600020905b81548152906001019060200180831161162b57829003601f168201915b5050505050815260200190600101906115b0565b505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161169f575b505050505081525050905089565b600b80546116d890613cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461170490613cb6565b80156117515780601f1061172657610100808354040283529160200191611751565b820191906000526020600020905b81548152906001019060200180831161173457829003601f168201915b505050505081565b60006001600160a01b0382166117c35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a63565b506001600160a01b031660009081526004602052604090205490565b6117e76126c4565b6117f1600061271e565b565b816117fd8161115c565b6001600160a01b0316336001600160a01b03161461185d5760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c792074686520746f6b656e206f776e657220697320616c6c6f776564006044820152606401610a63565b6000838152600f60209081526040909120835180518593600a9093019261188892849291019061318b565b5060208281015180516118a19260018501920190613230565b50604082015180516118bd91600284019160209091019061326b565b50606082015180516118d99160038401916020909101906132bd565b509050507f8acd9143a14c20fe583d51a81e31e54417373e6fe652318d24330264daf71764338360405161190e929190613f31565b60405180910390a1505050565b6119236126c4565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b61196f6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600f60209081526040918290208251600a909101805460a093810283018401909452608082018481529193909284929184918401828280156119f557602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116119c45790505b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611a4d57602002820191906000526020600020905b815481526020019060010190808311611a39575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015611b27578382906000526020600020018054611a9a90613cb6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac690613cb6565b8015611b135780601f10611ae857610100808354040283529160200191611b13565b820191906000526020600020905b815481529060010190602001808311611af657829003601f168201915b505050505081526020019060010190611a7b565b50505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611b8857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b6a575b5050505050815250509050919050565b60606002805461094590613cb6565b61115833838361276e565b611bbc3383612432565b611bd85760405162461bcd60e51b8152600401610a6390613e8d565b611be48484848461283c565b50505050565b6000828152600f602052604090206004015482906001600160a01b03163314611c255760405162461bcd60e51b8152600401610a6390613eda565b6000838152600f60209081526040909120835180518593600690930192611c5092849291019061318b565b506020828101518051611c699260018501920190613230565b5060408201518051611c8591600284019160209091019061326b565b5060608201518051611ca19160038401916020909101906132bd565b509050507f505334578f41db6819f0c15f598c4926aca99c9ef61d449344eb582f7f229e65338360405161190e929190613f31565b60008181526010602052604081205442600160a01b9091046001600160401b031610611d1857506000908152601060205260409020546001600160a01b031690565b506000919050565b919050565b611d2d6126c4565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b6060611d5c8261234b565b6000611d6661286f565b90506000815111611d865760405180602001604052806000815250611db1565b80611d908461287e565b604051602001611da1929190613f55565b6040516020818303038152906040525b9392505050565b6001600160a01b0383166000908152600e602052604090205460ff16611e165760405162461bcd60e51b815260206004820152601360248201527219d85d195dd85e481b9bdd08185b1b1bddd959606a1b6044820152606401610a63565b611e2083856109ef565b604051631552578d60e21b81526001600160a01b038416906355495e34903490611e549088903390889088906004016140ee565b60206040518083038185885af1158015611e72573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e9791906141e5565b611be45760405162461bcd60e51b815260206004820152601c60248201527f63616c6c6261636b2066726f6d2067617465776179206661696c6564000000006044820152606401610a63565b611f0e6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600f602090815260409182902082516006909101805460a09381028301840190945260808201848152919390928492918491840182828015611f9457602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611f635790505b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fec57602002820191906000526020600020905b815481526020019060010190808311611fd8575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015611b2757838290600052602060002001805461203990613cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461206590613cb6565b80156120b25780601f10612087576101008083540402835291602001916120b2565b820191906000526020600020905b81548152906001019060200180831161209557829003601f168201915b50505050508152602001906001019061201a565b6120d03384612432565b6121365760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610a63565b60008381526010602090815260409182902080546001600160a01b0386166001600160e01b03199091168117600160a01b6001600160401b03871690810291909117835593519384529092909186917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe91015b60405180910390a350505050565b336000908152600e602052604081205460ff1661222a5760405162461bcd60e51b815260206004820152602b60248201527f73656e646572206e6f7420616c6c6f77656420746f207570646174652074686560448201526a206c61737420707269636560a81b6064820152608401610a63565b6000858152600f60209081526040918290206001810187905560030180546001600160a81b0319166101006001600160a01b0387160260ff19161760ff871617905581518781529081018690527f8052678572202a9bcc1a92cd2be1553f82b1957961c619b073dcaa6312aeef7c910160405180910390a1506001949350505050565b6122b56126c4565b6001600160a01b03811661231a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a63565b6123238161271e565b50565b60006001600160e01b0319821663780e9d6360e01b1480610930575061093082612910565b6000818152600360205260409020546001600160a01b03166123235760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a63565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123df8261115c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611158828260405180602001604052806000815250612960565b60008061243e8361115c565b9050806001600160a01b0316846001600160a01b0316148061248557506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610ce45750836001600160a01b031661249e846109c8565b6001600160a01b031614949350505050565b826001600160a01b03166124c38261115c565b6001600160a01b0316146124e95760405162461bcd60e51b8152600401610a6390614202565b6001600160a01b03821661254b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a63565b6125588383836001612993565b826001600160a01b031661256b8261115c565b6001600160a01b0316146125915760405162461bcd60e51b8152600401610a6390614202565b600081815260056020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260048552838620805460001901905590871680865283862080546001019055868652600390945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061262c8261115c565b905061263c816000846001612993565b6126458261115c565b600083815260056020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526004845282852080546000190190558785526003909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000546001600160a01b031633146117f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a63565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b0316036127cf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a63565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6128478484846124b0565b61285384848484612a29565b611be45760405162461bcd60e51b8152600401610a6390614247565b6060600b805461094590613cb6565b6060600061288b83612b27565b60010190506000816001600160401b038111156128aa576128aa613434565b6040519080825280601f01601f1916602001820160405280156128d4576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846128de57509392505050565b60006001600160e01b031982166380ac58cd60e01b148061294157506001600160e01b03198216635b5e139f60e01b145b8061093057506301ffc9a760e01b6001600160e01b0319831614610930565b61296a8383612bff565b6129776000848484612a29565b610b045760405162461bcd60e51b8152600401610a6390614247565b61299f84848484612d98565b826001600160a01b0316846001600160a01b0316141580156129d757506000828152601060205260409020546001600160a01b031615155b15611be457600082815260106020908152604080832080546001600160e01b03191690555182815284917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe91016121a9565b60006001600160a01b0384163b15612b1f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a6d903390899088908890600401614299565b6020604051808303816000875af1925050508015612aa8575060408051601f3d908101601f19168201909252612aa5918101906142d6565b60015b612b05573d808015612ad6576040519150601f19603f3d011682016040523d82523d6000602084013e612adb565b606091505b508051600003612afd5760405162461bcd60e51b8152600401610a6390614247565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610ce4565b506001610ce4565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612b665772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612b92576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612bb057662386f26fc10000830492506010015b6305f5e1008310612bc8576305f5e100830492506008015b6127108310612bdc57612710830492506004015b60648310612bee576064830492506002015b600a83106109305760010192915050565b6001600160a01b038216612c555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a63565b6000818152600360205260409020546001600160a01b031615612cba5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a63565b612cc8600083836001612993565b6000818152600360205260409020546001600160a01b031615612d2d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a63565b6001600160a01b038216600081815260046020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612da484848484612ed8565b6001811115612e135760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610a63565b816001600160a01b038516612e6f57612e6a81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612e92565b836001600160a01b0316856001600160a01b031614612e9257612e928582612f60565b6001600160a01b038416612eae57612ea981612ffd565b612ed1565b846001600160a01b0316846001600160a01b031614612ed157612ed184826130ac565b5050505050565b6001811115611be4576001600160a01b03841615612f1e576001600160a01b03841660009081526004602052604081208054839290612f189084906142f3565b90915550505b6001600160a01b03831615611be4576001600160a01b03831660009081526004602052604081208054839290612f55908490614306565b909155505050505050565b60006001612f6d84611759565b612f7791906142f3565b600083815260086020526040902054909150808214612fca576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061300f906001906142f3565b6000838152600a60205260408120546009805493945090928490811061303757613037613f1b565b90600052602060002001549050806009838154811061305857613058613f1b565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061309057613090614319565b6001900381819060005260206000200160009055905550505050565b60006130b783611759565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b5080546130fc90613cb6565b6000825580601f1061310c575050565b601f0160209004906000526020600020908101906123239190613312565b50805460008255601f0160209004906000526020600020908101906123239190613312565b50805460008255906000526020600020908101906123239190613312565b50805460008255906000526020600020908101906123239190613327565b82805482825590600052602060002090601f016020900481019282156132205791602002820160005b838211156131f157835183826101000a81548160ff02191690831515021790555092602001926001016020816000010492830192600103026131b4565b801561321e5782816101000a81549060ff02191690556001016020816000010492830192600103026131f1565b505b5061322c929150613312565b5090565b828054828255906000526020600020908101928215613220579160200282015b82811115613220578251825591602001919060010190613250565b8280548282559060005260206000209081019282156132b1579160200282015b828111156132b157825182906132a19082613d89565b509160200191906001019061328b565b5061322c929150613327565b828054828255906000526020600020908101928215613220579160200282015b8281111561322057825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906132dd565b5b8082111561322c5760008155600101613313565b8082111561322c57600061333b82826130f0565b50600101613327565b6001600160e01b03198116811461232357600080fd5b60006020828403121561336c57600080fd5b8135611db181613344565b60005b8381101561339257818101518382015260200161337a565b50506000910152565b600081518084526133b3816020860160208601613377565b601f01601f19169290920160200192915050565b602081526000611db1602083018461339b565b6000602082840312156133ec57600080fd5b5035919050565b80356001600160a01b0381168114611d2057600080fd5b6000806040838503121561341d57600080fd5b613426836133f3565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171561346c5761346c613434565b60405290565b604051601f8201601f191681016001600160401b038111828210171561349a5761349a613434565b604052919050565b60006001600160401b038311156134bb576134bb613434565b6134ce601f8401601f1916602001613472565b90508281528383830111156134e257600080fd5b828260208301376000602084830101529392505050565b600082601f83011261350a57600080fd5b611db1838335602085016134a2565b6000806000806080858703121561352f57600080fd5b613538856133f3565b9350613546602086016133f3565b925060408501356001600160401b0381111561356157600080fd5b61356d878288016134f9565b949793965093946060013593505050565b60006020828403121561359057600080fd5b81356001600160401b038111156135a657600080fd5b610ce4848285016134f9565b6000806000606084860312156135c757600080fd5b6135d0846133f3565b92506135de602085016133f3565b9150604084013590509250925092565b600081518084526020808501945080840160005b8381101561361e57815187529582019590820190600101613602565b509495945050505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561367157828403895261365f84835161339b565b98850198935090840190600101613647565b5091979650505050505050565b600081518084526020808501945080840160005b8381101561361e5781516001600160a01b031687529582019590820190600101613692565b8051608080845281519084018190526000916020919082019060a0860190845b818110156136f55783511515835292840192918401916001016136d7565b50508285015191508581038387015261370e81836135ee565b92505050604083015184820360408601526137298282613629565b91505060608301518482036060860152613743828261367e565b95945050505050565b898152602081018990526040810188905260ff871660608201526001600160a01b038681166080830152851660a082015261012060c082018190526000906137968382018761339b565b905082810360e08401526137aa81866136b7565b90508281036101008401526137bf81856136b7565b9c9b505050505050505050505050565b6000602082840312156137e157600080fd5b611db1826133f3565b60006001600160401b0382111561380357613803613434565b5060051b60200190565b801515811461232357600080fd5b600082601f83011261382c57600080fd5b8135602061384161383c836137ea565b613472565b82815260059290921b8401810191818101908684111561386057600080fd5b8286015b848110156138845780356138778161380d565b8352918301918301613864565b509695505050505050565b600082601f8301126138a057600080fd5b813560206138b061383c836137ea565b82815260059290921b840181019181810190868411156138cf57600080fd5b8286015b8481101561388457803583529183019183016138d3565b600082601f8301126138fb57600080fd5b8135602061390b61383c836137ea565b82815260059290921b8401810191818101908684111561392a57600080fd5b8286015b848110156138845780356001600160401b0381111561394d5760008081fd5b61395b8986838b01016134f9565b84525091830191830161392e565b600082601f83011261397a57600080fd5b8135602061398a61383c836137ea565b82815260059290921b840181019181810190868411156139a957600080fd5b8286015b84811015613884576139be816133f3565b83529183019183016139ad565b600080604083850312156139de57600080fd5b8235915060208301356001600160401b03808211156139fc57600080fd5b9084019060808287031215613a1057600080fd5b613a1861344a565b823582811115613a2757600080fd5b613a338882860161381b565b825250602083013582811115613a4857600080fd5b613a548882860161388f565b602083015250604083013582811115613a6c57600080fd5b613a78888286016138ea565b604083015250606083013582811115613a9057600080fd5b613a9c88828601613969565b6060830152508093505050509250929050565b602081526000611db160208301846136b7565b60008060408385031215613ad557600080fd5b613ade836133f3565b91506020830135613aee8161380d565b809150509250929050565b60008060008060808587031215613b0f57600080fd5b613b18856133f3565b9350613b26602086016133f3565b92506040850135915060608501356001600160401b03811115613b4857600080fd5b8501601f81018713613b5957600080fd5b613b68878235602084016134a2565b91505092959194509250565b803560ff81168114611d2057600080fd5b60008060008060808587031215613b9b57600080fd5b84359350613bab602086016133f3565b9250613bb960408601613b74565b915060608501356001600160401b03811115613bd457600080fd5b850160808188031215613be657600080fd5b939692955090935050565b600080600060608486031215613c0657600080fd5b83359250613c16602085016133f3565b915060408401356001600160401b0381168114613c3257600080fd5b809150509250925092565b60008060008060808587031215613c5357600080fd5b8435935060208501359250613c6a60408601613b74565b9150613c78606086016133f3565b905092959194509250565b60008060408385031215613c9657600080fd5b613c9f836133f3565b9150613cad602084016133f3565b90509250929050565b600181811c90821680613cca57607f821691505b602082108103613cea57634e487b7160e01b600052602260045260246000fd5b50919050565b60008251613d02818460208701613377565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600060018201613d3457613d34613d0c565b5060010190565b601f821115610b0457600081815260208120601f850160051c81016020861015613d625750805b601f850160051c820191505b81811015613d8157828155600101613d6e565b505050505050565b81516001600160401b03811115613da257613da2613434565b613db681613db08454613cb6565b84613d3b565b602080601f831160018114613deb5760008415613dd35750858301515b600019600386901b1c1916600185901b178555613d81565b600085815260208120601f198616915b82811015613e1a57888601518255948401946001909101908401613dfb565b5085821015613e385787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090613e7b9083018561339b565b90508260808301529695505050505050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526021908201527f6f6e6c792074686520746f6b656e2063726561746f7220697320616c6c6f77656040820152601960fa1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0383168152604060208201819052600090610ce4908301846136b7565b60008351613f67818460208801613377565b835190830190613f7b818360208801613377565b01949350505050565b6000808335601e19843603018112613f9b57600080fd5b83016020810192503590506001600160401b03811115613fba57600080fd5b8060051b3603821315613fcc57600080fd5b9250929050565b81835260006001600160fb1b03831115613fec57600080fd5b8260051b80836020870137939093016020019392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b878110156136715782840389528135601e1988360301811261406957600080fd5b870185810190356001600160401b0381111561408457600080fd5b80360382131561409357600080fd5b61409e868284614005565b9a87019a9550505090840190600101614048565b8183526000602080850194508260005b8581101561361e576001600160a01b036140db836133f3565b16875295820195908201906001016140c2565b8481526000602060018060a01b0386168184015260ff851660408401526080606084015261010083016141218586613f84565b608086810152918290529060009061012086015b8183101561415e5783356141488161380d565b1515815292840192600192909201918401614135565b61416a85890189613f84565b95509350607f199250828782030160a0880152614188818686613fd3565b945050506141996040870187613f84565b9250818685030160c08701526141b084848361402e565b9350506141c06060870187613f84565b9250818685030160e08701526141d78484836140b2565b9a9950505050505050505050565b6000602082840312156141f757600080fd5b8151611db18161380d565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906142cc9083018461339b565b9695505050505050565b6000602082840312156142e857600080fd5b8151611db181613344565b8181038181111561093057610930613d0c565b8082018082111561093057610930613d0c565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205c2a3bef5a6586e6ae818ff43765023c2fe1b52ff724f4306a89275c47f21e3a64736f6c6343000812003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4578696d694f204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064578696d694f0000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102725760003560e01c806375cc4f0f1161014f578063c2f1f14a116100c1578063e030565e1161007a578063e030565e1461081c578063e6259b111461083c578063e985e9c51461085c578063ebb6d458146108a5578063f2fde38b146108d5578063f84ddf0b146108f557600080fd5b8063c2f1f14a14610750578063c4a6ce7a14610770578063c87b56dd14610790578063ce63771e146107b0578063d48e638a146107c3578063dd5a3d08146107fc57600080fd5b806395c671d81161011357806395c671d81461066957806395d89b4114610696578063a22cb465146106ab578063a3f29b14146106cb578063b88d4fde14610710578063be15e30b1461073057600080fd5b806375cc4f0f146105b957806383c4c00d146105d95780638a60c46e146105ee5780638da5cb5b1461060e5780638fc88c481461062c57600080fd5b8063422627c3116101e85780636352211e116101ac5780636352211e146104ea57806365fa2f7f1461050a578063663b3e221461053a5780636c0360eb1461056f57806370a0823114610584578063715018a6146105a457600080fd5b8063422627c31461044a57806342842e0e1461046a57806342966c681461048a5780634f6ccce7146104aa57806355f804b3146104ca57600080fd5b806318160ddd1161023a57806318160ddd1461034857806321ecb49814610367578063233be7a3146103a557806323b872dd146103dd57806325ee6ee9146103fd5780632f745c591461042a57600080fd5b806301ffc9a71461027757806306fdde03146102ac578063081812fc146102ce578063095ea7b314610306578063117dc55814610328575b600080fd5b34801561028357600080fd5b5061029761029236600461335a565b61090b565b60405190151581526020015b60405180910390f35b3480156102b857600080fd5b506102c1610936565b6040516102a391906133c7565b3480156102da57600080fd5b506102ee6102e93660046133da565b6109c8565b6040516001600160a01b0390911681526020016102a3565b34801561031257600080fd5b5061032661032136600461340a565b6109ef565b005b34801561033457600080fd5b50610297610343366004613519565b610b09565b34801561035457600080fd5b506009545b6040519081526020016102a3565b34801561037357600080fd5b506102ee6103823660046133da565b6000908152600f602052604090206003015461010090046001600160a01b031690565b3480156103b157600080fd5b506103596103c036600461357e565b8051602081830181018051600d8252928201919093012091525481565b3480156103e957600080fd5b506103266103f83660046135b2565b610cec565b34801561040957600080fd5b506103596104183660046133da565b6000908152600f602052604090205490565b34801561043657600080fd5b5061035961044536600461340a565b610d1d565b34801561045657600080fd5b506102c16104653660046133da565b610db3565b34801561047657600080fd5b506103266104853660046135b2565b610e58565b34801561049657600080fd5b506103266104a53660046133da565b610e73565b3480156104b657600080fd5b506103596104c53660046133da565b6110b1565b3480156104d657600080fd5b506103266104e536600461357e565b611144565b3480156104f657600080fd5b506102ee6105053660046133da565b61115c565b34801561051657600080fd5b506103596105253660046133da565b6000908152600f602052604090206001015490565b34801561054657600080fd5b5061055a6105553660046133da565b6111bc565b6040516102a39998979695949392919061374c565b34801561057b57600080fd5b506102c16116cb565b34801561059057600080fd5b5061035961059f3660046137cf565b611759565b3480156105b057600080fd5b506103266117df565b3480156105c557600080fd5b506103266105d43660046139cb565b6117f3565b3480156105e557600080fd5b50600c54610359565b3480156105fa57600080fd5b506103266106093660046137cf565b61191b565b34801561061a57600080fd5b506000546001600160a01b03166102ee565b34801561063857600080fd5b506103596106473660046133da565b600090815260106020526040902054600160a01b90046001600160401b031690565b34801561067557600080fd5b506106896106843660046133da565b611944565b6040516102a39190613aaf565b3480156106a257600080fd5b506102c1611b98565b3480156106b757600080fd5b506103266106c6366004613ac2565b611ba7565b3480156106d757600080fd5b506106fe6106e63660046133da565b6000908152600f602052604090206003015460ff1690565b60405160ff90911681526020016102a3565b34801561071c57600080fd5b5061032661072b366004613af9565b611bb2565b34801561073c57600080fd5b5061032661074b3660046139cb565b611bea565b34801561075c57600080fd5b506102ee61076b3660046133da565b611cd6565b34801561077c57600080fd5b5061032661078b3660046137cf565b611d25565b34801561079c57600080fd5b506102c16107ab3660046133da565b611d51565b6103266107be366004613b85565b611db8565b3480156107cf57600080fd5b506102ee6107de3660046133da565b6000908152600f60205260409020600401546001600160a01b031690565b34801561080857600080fd5b506106896108173660046133da565b611ee3565b34801561082857600080fd5b50610326610837366004613bf1565b6120c6565b34801561084857600080fd5b50610297610857366004613c3d565b6121b7565b34801561086857600080fd5b50610297610877366004613c83565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b3480156108b157600080fd5b506102976108c03660046137cf565b600e6020526000908152604090205460ff1681565b3480156108e157600080fd5b506103266108f03660046137cf565b6122ad565b34801561090157600080fd5b50610359600c5481565b60006001600160e01b03198216632b424ad760e21b1480610930575061093082612326565b92915050565b60606001805461094590613cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461097190613cb6565b80156109be5780601f10610993576101008083540402835291602001916109be565b820191906000526020600020905b8154815290600101906020018083116109a157829003601f168201915b5050505050905090565b60006109d38261234b565b506000908152600560205260409020546001600160a01b031690565b60006109fa8261115c565b9050806001600160a01b0316836001600160a01b031603610a6c5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610a885750610a888133610877565b610afa5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a63565b610b0483836123aa565b505050565b600080546001600160a01b0316331480610b325750336000908152600e602052604090205460ff165b610b915760405162461bcd60e51b815260206004820152602a60248201527f73656e646572206e6f7420616c6c6f77656420746f20637265617465206120636044820152696572746966696361746560b01b6064820152608401610a63565b600d83604051610ba19190613cf0565b908152602001604051809103902054600014610bff5760405162461bcd60e51b815260206004820152601c60248201527f7468697320444e4120697320616c7265616479207265636f72646564000000006044820152606401610a63565b6000600c60008154610c1090613d22565b91829055509050610c218582612418565b6000818152600f602052604081206004810180546001600160a01b0319166001600160a01b038a161790556001810191909155600501610c618582613d89565b506000818152600f60205260409081902084815542600290910155518190600d90610c8d908790613cf0565b9081526020016040518091039020819055507fa8b12eceb9bd52bd679e37228be1415cdbc2c74e2e70137e0eb18e58110a74698686838787604051610cd6959493929190613e48565b60405180910390a160019150505b949350505050565b610cf63382612432565b610d125760405162461bcd60e51b8152600401610a6390613e8d565b610b048383836124b0565b6000610d2883611759565b8210610d8a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a63565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b6000818152600f60205260409020600501805460609190610dd390613cb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610dff90613cb6565b8015610e4c5780601f10610e2157610100808354040283529160200191610e4c565b820191906000526020600020905b815481529060010190602001808311610e2f57829003601f168201915b50505050509050919050565b610b0483838360405180602001604052806000815250611bb2565b6000818152600f602052604090206004015481906001600160a01b03163314610eae5760405162461bcd60e51b8152600401610a6390613eda565b81610eb88161115c565b6001600160a01b0316336001600160a01b031614610f185760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c792074686520746f6b656e206f776e657220697320616c6c6f776564006044820152606401610a63565b610f2183612621565b6000838152600f602052604081206005018054610f3d90613cb6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6990613cb6565b8015610fb65780601f10610f8b57610100808354040283529160200191610fb6565b820191906000526020600020905b815481529060010190602001808311610f9957829003601f168201915b50505050509050600d81604051610fcd9190613cf0565b9081526040805160209281900383019020600090819055868152600f909252812081815560018101829055600281018290556003810180546001600160a81b03191690556004810180546001600160a01b03191690559061103160058301826130f0565b600682016000611041828261312a565b61104f60018301600061314f565b61105d60028301600061316d565b61106b60038301600061314f565b5050600a8201600061107d828261312a565b61108b60018301600061314f565b61109960028301600061316d565b6110a760038301600061314f565b5050505050505050565b60006110bc60095490565b821061111f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a63565b6009828154811061113257611132613f1b565b90600052602060002001549050919050565b61114c6126c4565b600b6111588282613d89565b5050565b6000818152600360205260408120546001600160a01b0316806109305760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a63565b600f6020526000908152604090208054600182015460028301546003840154600485015460058601805495969495939460ff8416946101009094046001600160a01b039081169493169290919061121290613cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461123e90613cb6565b801561128b5780601f106112605761010080835404028352916020019161128b565b820191906000526020600020905b81548152906001019060200180831161126e57829003601f168201915b505050505090806006016040518060800160405290816000820180548060200260200160405190810160405280929190818152602001828054801561130f57602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116112de5790505b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561136757602002820191906000526020600020905b815481526020019060010190808311611353575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156114415783829060005260206000200180546113b490613cb6565b80601f01602080910402602001604051908101604052809291908181526020018280546113e090613cb6565b801561142d5780601f106114025761010080835404028352916020019161142d565b820191906000526020600020905b81548152906001019060200180831161141057829003601f168201915b505050505081526020019060010190611395565b505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156114a257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611484575b5050505050815250509080600a016040518060800160405290816000820180548060200260200160405190810160405280929190818152602001828054801561152a57602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116114f95790505b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561158257602002820191906000526020600020905b81548152602001906001019080831161156e575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561165c5783829060005260206000200180546115cf90613cb6565b80601f01602080910402602001604051908101604052809291908181526020018280546115fb90613cb6565b80156116485780601f1061161d57610100808354040283529160200191611648565b820191906000526020600020905b81548152906001019060200180831161162b57829003601f168201915b5050505050815260200190600101906115b0565b505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116bd57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161169f575b505050505081525050905089565b600b80546116d890613cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461170490613cb6565b80156117515780601f1061172657610100808354040283529160200191611751565b820191906000526020600020905b81548152906001019060200180831161173457829003601f168201915b505050505081565b60006001600160a01b0382166117c35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a63565b506001600160a01b031660009081526004602052604090205490565b6117e76126c4565b6117f1600061271e565b565b816117fd8161115c565b6001600160a01b0316336001600160a01b03161461185d5760405162461bcd60e51b815260206004820152601f60248201527f6f6e6c792074686520746f6b656e206f776e657220697320616c6c6f776564006044820152606401610a63565b6000838152600f60209081526040909120835180518593600a9093019261188892849291019061318b565b5060208281015180516118a19260018501920190613230565b50604082015180516118bd91600284019160209091019061326b565b50606082015180516118d99160038401916020909101906132bd565b509050507f8acd9143a14c20fe583d51a81e31e54417373e6fe652318d24330264daf71764338360405161190e929190613f31565b60405180910390a1505050565b6119236126c4565b6001600160a01b03166000908152600e60205260409020805460ff19169055565b61196f6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600f60209081526040918290208251600a909101805460a093810283018401909452608082018481529193909284929184918401828280156119f557602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116119c45790505b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611a4d57602002820191906000526020600020905b815481526020019060010190808311611a39575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015611b27578382906000526020600020018054611a9a90613cb6565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac690613cb6565b8015611b135780601f10611ae857610100808354040283529160200191611b13565b820191906000526020600020905b815481529060010190602001808311611af657829003601f168201915b505050505081526020019060010190611a7b565b50505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015611b8857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b6a575b5050505050815250509050919050565b60606002805461094590613cb6565b61115833838361276e565b611bbc3383612432565b611bd85760405162461bcd60e51b8152600401610a6390613e8d565b611be48484848461283c565b50505050565b6000828152600f602052604090206004015482906001600160a01b03163314611c255760405162461bcd60e51b8152600401610a6390613eda565b6000838152600f60209081526040909120835180518593600690930192611c5092849291019061318b565b506020828101518051611c699260018501920190613230565b5060408201518051611c8591600284019160209091019061326b565b5060608201518051611ca19160038401916020909101906132bd565b509050507f505334578f41db6819f0c15f598c4926aca99c9ef61d449344eb582f7f229e65338360405161190e929190613f31565b60008181526010602052604081205442600160a01b9091046001600160401b031610611d1857506000908152601060205260409020546001600160a01b031690565b506000919050565b919050565b611d2d6126c4565b6001600160a01b03166000908152600e60205260409020805460ff19166001179055565b6060611d5c8261234b565b6000611d6661286f565b90506000815111611d865760405180602001604052806000815250611db1565b80611d908461287e565b604051602001611da1929190613f55565b6040516020818303038152906040525b9392505050565b6001600160a01b0383166000908152600e602052604090205460ff16611e165760405162461bcd60e51b815260206004820152601360248201527219d85d195dd85e481b9bdd08185b1b1bddd959606a1b6044820152606401610a63565b611e2083856109ef565b604051631552578d60e21b81526001600160a01b038416906355495e34903490611e549088903390889088906004016140ee565b60206040518083038185885af1158015611e72573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611e9791906141e5565b611be45760405162461bcd60e51b815260206004820152601c60248201527f63616c6c6261636b2066726f6d2067617465776179206661696c6564000000006044820152606401610a63565b611f0e6040518060800160405280606081526020016060815260200160608152602001606081525090565b6000828152600f602090815260409182902082516006909101805460a09381028301840190945260808201848152919390928492918491840182828015611f9457602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611f635790505b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015611fec57602002820191906000526020600020905b815481526020019060010190808311611fd8575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015611b2757838290600052602060002001805461203990613cb6565b80601f016020809104026020016040519081016040528092919081815260200182805461206590613cb6565b80156120b25780601f10612087576101008083540402835291602001916120b2565b820191906000526020600020905b81548152906001019060200180831161209557829003601f168201915b50505050508152602001906001019061201a565b6120d03384612432565b6121365760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610a63565b60008381526010602090815260409182902080546001600160a01b0386166001600160e01b03199091168117600160a01b6001600160401b03871690810291909117835593519384529092909186917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe91015b60405180910390a350505050565b336000908152600e602052604081205460ff1661222a5760405162461bcd60e51b815260206004820152602b60248201527f73656e646572206e6f7420616c6c6f77656420746f207570646174652074686560448201526a206c61737420707269636560a81b6064820152608401610a63565b6000858152600f60209081526040918290206001810187905560030180546001600160a81b0319166101006001600160a01b0387160260ff19161760ff871617905581518781529081018690527f8052678572202a9bcc1a92cd2be1553f82b1957961c619b073dcaa6312aeef7c910160405180910390a1506001949350505050565b6122b56126c4565b6001600160a01b03811661231a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a63565b6123238161271e565b50565b60006001600160e01b0319821663780e9d6360e01b1480610930575061093082612910565b6000818152600360205260409020546001600160a01b03166123235760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a63565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906123df8261115c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611158828260405180602001604052806000815250612960565b60008061243e8361115c565b9050806001600160a01b0316846001600160a01b0316148061248557506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b80610ce45750836001600160a01b031661249e846109c8565b6001600160a01b031614949350505050565b826001600160a01b03166124c38261115c565b6001600160a01b0316146124e95760405162461bcd60e51b8152600401610a6390614202565b6001600160a01b03821661254b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a63565b6125588383836001612993565b826001600160a01b031661256b8261115c565b6001600160a01b0316146125915760405162461bcd60e51b8152600401610a6390614202565b600081815260056020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260048552838620805460001901905590871680865283862080546001019055868652600390945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061262c8261115c565b905061263c816000846001612993565b6126458261115c565b600083815260056020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526004845282852080546000190190558785526003909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000546001600160a01b031633146117f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a63565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b0316036127cf5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a63565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6128478484846124b0565b61285384848484612a29565b611be45760405162461bcd60e51b8152600401610a6390614247565b6060600b805461094590613cb6565b6060600061288b83612b27565b60010190506000816001600160401b038111156128aa576128aa613434565b6040519080825280601f01601f1916602001820160405280156128d4576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846128de57509392505050565b60006001600160e01b031982166380ac58cd60e01b148061294157506001600160e01b03198216635b5e139f60e01b145b8061093057506301ffc9a760e01b6001600160e01b0319831614610930565b61296a8383612bff565b6129776000848484612a29565b610b045760405162461bcd60e51b8152600401610a6390614247565b61299f84848484612d98565b826001600160a01b0316846001600160a01b0316141580156129d757506000828152601060205260409020546001600160a01b031615155b15611be457600082815260106020908152604080832080546001600160e01b03191690555182815284917f4e06b4e7000e659094299b3533b47b6aa8ad048e95e872d23d1f4ee55af89cfe91016121a9565b60006001600160a01b0384163b15612b1f57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a6d903390899088908890600401614299565b6020604051808303816000875af1925050508015612aa8575060408051601f3d908101601f19168201909252612aa5918101906142d6565b60015b612b05573d808015612ad6576040519150601f19603f3d011682016040523d82523d6000602084013e612adb565b606091505b508051600003612afd5760405162461bcd60e51b8152600401610a6390614247565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610ce4565b506001610ce4565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310612b665772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612b92576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310612bb057662386f26fc10000830492506010015b6305f5e1008310612bc8576305f5e100830492506008015b6127108310612bdc57612710830492506004015b60648310612bee576064830492506002015b600a83106109305760010192915050565b6001600160a01b038216612c555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a63565b6000818152600360205260409020546001600160a01b031615612cba5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a63565b612cc8600083836001612993565b6000818152600360205260409020546001600160a01b031615612d2d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a63565b6001600160a01b038216600081815260046020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612da484848484612ed8565b6001811115612e135760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610a63565b816001600160a01b038516612e6f57612e6a81600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b612e92565b836001600160a01b0316856001600160a01b031614612e9257612e928582612f60565b6001600160a01b038416612eae57612ea981612ffd565b612ed1565b846001600160a01b0316846001600160a01b031614612ed157612ed184826130ac565b5050505050565b6001811115611be4576001600160a01b03841615612f1e576001600160a01b03841660009081526004602052604081208054839290612f189084906142f3565b90915550505b6001600160a01b03831615611be4576001600160a01b03831660009081526004602052604081208054839290612f55908490614306565b909155505050505050565b60006001612f6d84611759565b612f7791906142f3565b600083815260086020526040902054909150808214612fca576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061300f906001906142f3565b6000838152600a60205260408120546009805493945090928490811061303757613037613f1b565b90600052602060002001549050806009838154811061305857613058613f1b565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600980548061309057613090614319565b6001900381819060005260206000200160009055905550505050565b60006130b783611759565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b5080546130fc90613cb6565b6000825580601f1061310c575050565b601f0160209004906000526020600020908101906123239190613312565b50805460008255601f0160209004906000526020600020908101906123239190613312565b50805460008255906000526020600020908101906123239190613312565b50805460008255906000526020600020908101906123239190613327565b82805482825590600052602060002090601f016020900481019282156132205791602002820160005b838211156131f157835183826101000a81548160ff02191690831515021790555092602001926001016020816000010492830192600103026131b4565b801561321e5782816101000a81549060ff02191690556001016020816000010492830192600103026131f1565b505b5061322c929150613312565b5090565b828054828255906000526020600020908101928215613220579160200282015b82811115613220578251825591602001919060010190613250565b8280548282559060005260206000209081019282156132b1579160200282015b828111156132b157825182906132a19082613d89565b509160200191906001019061328b565b5061322c929150613327565b828054828255906000526020600020908101928215613220579160200282015b8281111561322057825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906132dd565b5b8082111561322c5760008155600101613313565b8082111561322c57600061333b82826130f0565b50600101613327565b6001600160e01b03198116811461232357600080fd5b60006020828403121561336c57600080fd5b8135611db181613344565b60005b8381101561339257818101518382015260200161337a565b50506000910152565b600081518084526133b3816020860160208601613377565b601f01601f19169290920160200192915050565b602081526000611db1602083018461339b565b6000602082840312156133ec57600080fd5b5035919050565b80356001600160a01b0381168114611d2057600080fd5b6000806040838503121561341d57600080fd5b613426836133f3565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171561346c5761346c613434565b60405290565b604051601f8201601f191681016001600160401b038111828210171561349a5761349a613434565b604052919050565b60006001600160401b038311156134bb576134bb613434565b6134ce601f8401601f1916602001613472565b90508281528383830111156134e257600080fd5b828260208301376000602084830101529392505050565b600082601f83011261350a57600080fd5b611db1838335602085016134a2565b6000806000806080858703121561352f57600080fd5b613538856133f3565b9350613546602086016133f3565b925060408501356001600160401b0381111561356157600080fd5b61356d878288016134f9565b949793965093946060013593505050565b60006020828403121561359057600080fd5b81356001600160401b038111156135a657600080fd5b610ce4848285016134f9565b6000806000606084860312156135c757600080fd5b6135d0846133f3565b92506135de602085016133f3565b9150604084013590509250925092565b600081518084526020808501945080840160005b8381101561361e57815187529582019590820190600101613602565b509495945050505050565b600081518084526020808501808196508360051b8101915082860160005b8581101561367157828403895261365f84835161339b565b98850198935090840190600101613647565b5091979650505050505050565b600081518084526020808501945080840160005b8381101561361e5781516001600160a01b031687529582019590820190600101613692565b8051608080845281519084018190526000916020919082019060a0860190845b818110156136f55783511515835292840192918401916001016136d7565b50508285015191508581038387015261370e81836135ee565b92505050604083015184820360408601526137298282613629565b91505060608301518482036060860152613743828261367e565b95945050505050565b898152602081018990526040810188905260ff871660608201526001600160a01b038681166080830152851660a082015261012060c082018190526000906137968382018761339b565b905082810360e08401526137aa81866136b7565b90508281036101008401526137bf81856136b7565b9c9b505050505050505050505050565b6000602082840312156137e157600080fd5b611db1826133f3565b60006001600160401b0382111561380357613803613434565b5060051b60200190565b801515811461232357600080fd5b600082601f83011261382c57600080fd5b8135602061384161383c836137ea565b613472565b82815260059290921b8401810191818101908684111561386057600080fd5b8286015b848110156138845780356138778161380d565b8352918301918301613864565b509695505050505050565b600082601f8301126138a057600080fd5b813560206138b061383c836137ea565b82815260059290921b840181019181810190868411156138cf57600080fd5b8286015b8481101561388457803583529183019183016138d3565b600082601f8301126138fb57600080fd5b8135602061390b61383c836137ea565b82815260059290921b8401810191818101908684111561392a57600080fd5b8286015b848110156138845780356001600160401b0381111561394d5760008081fd5b61395b8986838b01016134f9565b84525091830191830161392e565b600082601f83011261397a57600080fd5b8135602061398a61383c836137ea565b82815260059290921b840181019181810190868411156139a957600080fd5b8286015b84811015613884576139be816133f3565b83529183019183016139ad565b600080604083850312156139de57600080fd5b8235915060208301356001600160401b03808211156139fc57600080fd5b9084019060808287031215613a1057600080fd5b613a1861344a565b823582811115613a2757600080fd5b613a338882860161381b565b825250602083013582811115613a4857600080fd5b613a548882860161388f565b602083015250604083013582811115613a6c57600080fd5b613a78888286016138ea565b604083015250606083013582811115613a9057600080fd5b613a9c88828601613969565b6060830152508093505050509250929050565b602081526000611db160208301846136b7565b60008060408385031215613ad557600080fd5b613ade836133f3565b91506020830135613aee8161380d565b809150509250929050565b60008060008060808587031215613b0f57600080fd5b613b18856133f3565b9350613b26602086016133f3565b92506040850135915060608501356001600160401b03811115613b4857600080fd5b8501601f81018713613b5957600080fd5b613b68878235602084016134a2565b91505092959194509250565b803560ff81168114611d2057600080fd5b60008060008060808587031215613b9b57600080fd5b84359350613bab602086016133f3565b9250613bb960408601613b74565b915060608501356001600160401b03811115613bd457600080fd5b850160808188031215613be657600080fd5b939692955090935050565b600080600060608486031215613c0657600080fd5b83359250613c16602085016133f3565b915060408401356001600160401b0381168114613c3257600080fd5b809150509250925092565b60008060008060808587031215613c5357600080fd5b8435935060208501359250613c6a60408601613b74565b9150613c78606086016133f3565b905092959194509250565b60008060408385031215613c9657600080fd5b613c9f836133f3565b9150613cad602084016133f3565b90509250929050565b600181811c90821680613cca57607f821691505b602082108103613cea57634e487b7160e01b600052602260045260246000fd5b50919050565b60008251613d02818460208701613377565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600060018201613d3457613d34613d0c565b5060010190565b601f821115610b0457600081815260208120601f850160051c81016020861015613d625750805b601f850160051c820191505b81811015613d8157828155600101613d6e565b505050505050565b81516001600160401b03811115613da257613da2613434565b613db681613db08454613cb6565b84613d3b565b602080601f831160018114613deb5760008415613dd35750858301515b600019600386901b1c1916600185901b178555613d81565b600085815260208120601f198616915b82811015613e1a57888601518255948401946001909101908401613dfb565b5085821015613e385787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038681168252851660208201526040810184905260a060608201819052600090613e7b9083018561339b565b90508260808301529695505050505050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526021908201527f6f6e6c792074686520746f6b656e2063726561746f7220697320616c6c6f77656040820152601960fa1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0383168152604060208201819052600090610ce4908301846136b7565b60008351613f67818460208801613377565b835190830190613f7b818360208801613377565b01949350505050565b6000808335601e19843603018112613f9b57600080fd5b83016020810192503590506001600160401b03811115613fba57600080fd5b8060051b3603821315613fcc57600080fd5b9250929050565b81835260006001600160fb1b03831115613fec57600080fd5b8260051b80836020870137939093016020019392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b878110156136715782840389528135601e1988360301811261406957600080fd5b870185810190356001600160401b0381111561408457600080fd5b80360382131561409357600080fd5b61409e868284614005565b9a87019a9550505090840190600101614048565b8183526000602080850194508260005b8581101561361e576001600160a01b036140db836133f3565b16875295820195908201906001016140c2565b8481526000602060018060a01b0386168184015260ff851660408401526080606084015261010083016141218586613f84565b608086810152918290529060009061012086015b8183101561415e5783356141488161380d565b1515815292840192600192909201918401614135565b61416a85890189613f84565b95509350607f199250828782030160a0880152614188818686613fd3565b945050506141996040870187613f84565b9250818685030160c08701526141b084848361402e565b9350506141c06060870187613f84565b9250818685030160e08701526141d78484836140b2565b9a9950505050505050505050565b6000602082840312156141f757600080fd5b8151611db18161380d565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906142cc9083018461339b565b9695505050505050565b6000602082840312156142e857600080fd5b8151611db181613344565b8181038181111561093057610930613d0c565b8082018082111561093057610930613d0c565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205c2a3bef5a6586e6ae818ff43765023c2fe1b52ff724f4306a89275c47f21e3a64736f6c63430008120033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a4578696d694f204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064578696d694f0000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): EximiO NFT
Arg [1] : symbol_ (string): EximiO

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 4578696d694f204e465400000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4578696d694f0000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

75429:2693:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77381:198;;;;;;;;;;-1:-1:-1;77381:198:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;77381:198:0;;;;;;;;38868:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40380:171::-;;;;;;;;;;-1:-1:-1;40380:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;40380:171:0;1533:203:1;39898:416:0;;;;;;;;;;-1:-1:-1;39898:416:0;;;;;:::i;:::-;;:::i;:::-;;70723:850;;;;;;;;;;-1:-1:-1;70723:850:0;;;;;:::i;:::-;;:::i;55479:113::-;;;;;;;;;;-1:-1:-1;55567:10:0;:17;55479:113;;;4177:25:1;;;4165:2;4150:18;55479:113:0;4031:177:1;67816:140:0;;;;;;;;;;-1:-1:-1;67816:140:0;;;;;:::i;:::-;67882:7;67909:22;;;:12;:22;;;;;:39;;;;;;-1:-1:-1;;;;;67909:39:0;;67816:140;63927:45;;;;;;;;;;-1:-1:-1;63927:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;41080:335;;;;;;;;;;-1:-1:-1;41080:335:0;;;;;:::i;:::-;;:::i;67029:127::-;;;;;;;;;;-1:-1:-1;67029:127:0;;;;;:::i;:::-;67090:4;67114:22;;;:12;:22;;;;;:34;;67029:127;55147:256;;;;;;;;;;-1:-1:-1;55147:256:0;;;;;:::i;:::-;;:::i;68411:120::-;;;;;;;;;;-1:-1:-1;68411:120:0;;;;;:::i;:::-;;:::i;41486:185::-;;;;;;;;;;-1:-1:-1;41486:185:0;;;;;:::i;:::-;;:::i;73349:261::-;;;;;;;;;;-1:-1:-1;73349:261:0;;;;;:::i;:::-;;:::i;55669:233::-;;;;;;;;;;-1:-1:-1;55669:233:0;;;;;:::i;:::-;;:::i;70263:98::-;;;;;;;;;;-1:-1:-1;70263:98:0;;;;;:::i;:::-;;:::i;38578:223::-;;;;;;;;;;-1:-1:-1;38578:223:0;;;;;:::i;:::-;;:::i;67549:123::-;;;;;;;;;;-1:-1:-1;67549:123:0;;;;;:::i;:::-;67608:4;67632:22;;;:12;:22;;;;;:32;;;;67549:123;65219:48;;;;;;;;;;-1:-1:-1;65219:48:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;63777:21::-;;;;;;;;;;;;;:::i;38309:207::-;;;;;;;;;;-1:-1:-1;38309:207:0;;;;;:::i;:::-;;:::i;62690:103::-;;;;;;;;;;;;;:::i;69588:219::-;;;;;;;;;;-1:-1:-1;69588:219:0;;;;;:::i;:::-;;:::i;69898:91::-;;;;;;;;;;-1:-1:-1;69970:11:0;;69898:91;;66778:127;;;;;;;;;;-1:-1:-1;66778:127:0;;;;;:::i;:::-;;:::i;62042:87::-;;;;;;;;;;-1:-1:-1;62088:7:0;62115:6;-1:-1:-1;;;;;62115:6:0;62042:87;;77185:124;;;;;;;;;;-1:-1:-1;77185:124:0;;;;;:::i;:::-;77251:7;77278:15;;;:6;:15;;;;;:23;-1:-1:-1;;;77278:23:0;;-1:-1:-1;;;;;77278:23:0;;77185:124;69317:140;;;;;;;;;;-1:-1:-1;69317:140:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39037:104::-;;;;;;;;;;;;;:::i;40623:155::-;;;;;;;;;;-1:-1:-1;40623:155:0;;;;;:::i;:::-;;:::i;68126:158::-;;;;;;;;;;-1:-1:-1;68126:158:0;;;;;:::i;:::-;68202:5;68227:22;;;:12;:22;;;;;:49;;;;;;68126:158;;;;14178:4:1;14166:17;;;14148:36;;14136:2;14121:18;68126:158:0;14006:184:1;41742:322:0;;;;;;;;;;-1:-1:-1;41742:322:0;;;;;:::i;:::-;;:::i;68950:233::-;;;;;;;;;;-1:-1:-1;68950:233:0;;;;;:::i;:::-;;:::i;76698:249::-;;;;;;;;;;-1:-1:-1;76698:249:0;;;;;:::i;:::-;;:::i;66516:123::-;;;;;;;;;;-1:-1:-1;66516:123:0;;;;;:::i;:::-;;:::i;39212:281::-;;;;;;;;;;-1:-1:-1;39212:281:0;;;;;:::i;:::-;;:::i;71829:541::-;;;;;;:::i;:::-;;:::i;67299:122::-;;;;;;;;;;-1:-1:-1;67299:122:0;;;;;:::i;:::-;67356:7;67383:22;;;:12;:22;;;;;:30;;;-1:-1:-1;;;;;67383:30:0;;67299:122;68669:144;;;;;;;;;;-1:-1:-1;68669:144:0;;;;;:::i;:::-;;:::i;76076:359::-;;;;;;;;;;-1:-1:-1;76076:359:0;;;;;:::i;:::-;;:::i;72739:522::-;;;;;;;;;;-1:-1:-1;72739:522:0;;;;;:::i;:::-;;:::i;40849:164::-;;;;;;;;;;-1:-1:-1;40849:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;40970:25:0;;;40946:4;40970:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40849:164;64033:48;;;;;;;;;;-1:-1:-1;64033:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;62948:201;;;;;;;;;;-1:-1:-1;62948:201:0;;;;;:::i;:::-;;:::i;63846:23::-;;;;;;;;;;;;;;;;77381:198;77466:4;-1:-1:-1;;;;;;77490:41:0;;-1:-1:-1;;;77490:41:0;;:81;;;77535:36;77559:11;77535:23;:36::i;:::-;77483:88;77381:198;-1:-1:-1;;77381:198:0:o;38868:100::-;38922:13;38955:5;38948:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38868:100;:::o;40380:171::-;40456:7;40476:23;40491:7;40476:14;:23::i;:::-;-1:-1:-1;40519:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40519:24:0;;40380:171::o;39898:416::-;39979:13;39995:23;40010:7;39995:14;:23::i;:::-;39979:39;;40043:5;-1:-1:-1;;;;;40037:11:0;:2;-1:-1:-1;;;;;40037:11:0;;40029:57;;;;-1:-1:-1;;;40029:57:0;;17324:2:1;40029:57:0;;;17306:21:1;17363:2;17343:18;;;17336:30;17402:34;17382:18;;;17375:62;-1:-1:-1;;;17453:18:1;;;17446:31;17494:19;;40029:57:0;;;;;;;;;36366:10;-1:-1:-1;;;;;40121:21:0;;;;:62;;-1:-1:-1;40146:37:0;40163:5;36366:10;40849:164;:::i;40146:37::-;40099:173;;;;-1:-1:-1;;;40099:173:0;;17726:2:1;40099:173:0;;;17708:21:1;17765:2;17745:18;;;17738:30;17804:34;17784:18;;;17777:62;17875:31;17855:18;;;17848:59;17924:19;;40099:173:0;17524:425:1;40099:173:0;40285:21;40294:2;40298:7;40285:8;:21::i;:::-;39968:346;39898:416;;:::o;70723:850::-;70834:4;62115:6;;-1:-1:-1;;;;;62115:6:0;70860:10;:21;;:53;;-1:-1:-1;70902:10:0;70885:28;;;;:16;:28;;;;;;;;70860:53;70851:109;;;;-1:-1:-1;;;70851:109:0;;18156:2:1;70851:109:0;;;18138:21:1;18195:2;18175:18;;;18168:30;18234:34;18214:18;;;18207:62;-1:-1:-1;;;18285:18:1;;;18278:40;18335:19;;70851:109:0;17954:406:1;70851:109:0;70980:14;70995:4;70980:20;;;;;;:::i;:::-;;;;;;;;;;;;;;71004:1;70980:25;70971:67;;;;-1:-1:-1;;;70971:67:0;;18861:2:1;70971:67:0;;;18843:21:1;18900:2;18880:18;;;18873:30;18939;18919:18;;;18912:58;18987:18;;70971:67:0;18659:352:1;70971:67:0;71051:12;71068:11;;71066:13;;;;;:::i;:::-;;;;;-1:-1:-1;71066:13:0;-1:-1:-1;71092:23:0;71102:3;71066:13;71092:9;:23::i;:::-;71173:21;;;;:12;:21;;;;;:29;;;:40;;-1:-1:-1;;;;;;71173:40:0;-1:-1:-1;;;;;71173:40:0;;;;;-1:-1:-1;71224:31:0;;:35;;;;71270:25;;:32;71298:4;71270:25;:32;:::i;:::-;-1:-1:-1;71313:21:0;;;;:12;:21;;;;;;;:48;;;71409:15;71372:34;;;;:52;71437:20;71326:7;;71437:14;;:20;;71452:4;;71437:20;:::i;:::-;;;;;;;;;;;;;:30;;;;71485:58;71500:8;71510:3;71515:7;71524:4;71530:12;71485:58;;;;;;;;;;:::i;:::-;;;;;;;;71561:4;71554:11;;;70723:850;;;;;;;:::o;41080:335::-;41275:41;36366:10;41308:7;41275:18;:41::i;:::-;41267:99;;;;-1:-1:-1;;;41267:99:0;;;;;;;:::i;:::-;41379:28;41389:4;41395:2;41399:7;41379:9;:28::i;55147:256::-;55244:7;55280:23;55297:5;55280:16;:23::i;:::-;55272:5;:31;55264:87;;;;-1:-1:-1;;;55264:87:0;;22676:2:1;55264:87:0;;;22658:21:1;22715:2;22695:18;;;22688:30;22754:34;22734:18;;;22727:62;-1:-1:-1;;;22805:18:1;;;22798:41;22856:19;;55264:87:0;22474:407:1;55264:87:0;-1:-1:-1;;;;;;55369:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;55147:256::o;68411:120::-;68497:22;;;;:12;:22;;;;;:26;;68490:33;;68464:13;;68497:26;68490:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68411:120;;;:::o;41486:185::-;41624:39;41641:4;41647:2;41651:7;41624:39;;;;;;;;;;;;:16;:39::i;73349:261::-;65461:22;;;;:12;:22;;;;;:30;;;:22;;-1:-1:-1;;;;;65461:30:0;65447:10;:44;65439:90;;;;-1:-1:-1;;;65439:90:0;;;;;;;:::i;:::-;73430:8:::1;65738:17;65746:8;65738:7;:17::i;:::-;-1:-1:-1::0;;;;;65724:31:0::1;:10;-1:-1:-1::0;;;;;65724:31:0::1;;65716:75;;;::::0;-1:-1:-1;;;65716:75:0;;23490:2:1;65716:75:0::1;::::0;::::1;23472:21:1::0;23529:2;23509:18;;;23502:30;23568:33;23548:18;;;23541:61;23619:18;;65716:75:0::1;23288:355:1::0;65716:75:0::1;73451:15:::2;73457:8;73451:5;:15::i;:::-;73479:17;73499:22:::0;;;:12:::2;:22;::::0;;;;:26:::2;;73479:46:::0;;::::2;::::0;::::2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73543:14;73558:3;73543:19;;;;;;:::i;:::-;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;;73536:26:::2;::::0;;;;73580:22;;;:12:::2;:22:::0;;;;;73573:29;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;;73573:29:0;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;;73573:29:0::2;::::0;;73580:22;73573:29:::2;;::::0;::::2;73536:26:::0;73573:29:::2;:::i;:::-;;::::0;::::2;;;::::0;;::::2;:::i;:::-;;;::::0;::::2;;;:::i;:::-;;;::::0;::::2;;;:::i;:::-;;;::::0;::::2;;;:::i;:::-;-1:-1:-1::0;;73573:29:0::2;::::0;::::2;;;::::0;;::::2;:::i;:::-;;;::::0;::::2;;;:::i;:::-;;;::::0;::::2;;;:::i;:::-;;;::::0;::::2;;;:::i;:::-;;;;;73440:170;65540:1:::1;73349:261:::0;;:::o;55669:233::-;55744:7;55780:30;55567:10;:17;;55479:113;55780:30;55772:5;:38;55764:95;;;;-1:-1:-1;;;55764:95:0;;23850:2:1;55764:95:0;;;23832:21:1;23889:2;23869:18;;;23862:30;23928:34;23908:18;;;23901:62;-1:-1:-1;;;23979:18:1;;;23972:42;24031:19;;55764:95:0;23648:408:1;55764:95:0;55877:10;55888:5;55877:17;;;;;;;;:::i;:::-;;;;;;;;;55870:24;;55669:233;;;:::o;70263:98::-;61928:13;:11;:13::i;:::-;70335:7:::1;:18;70345:8:::0;70335:7;:18:::1;:::i;:::-;;70263:98:::0;:::o;38578:223::-;38650:7;43465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43465:16:0;;38714:56;;;;-1:-1:-1;;;38714:56:0;;24395:2:1;38714:56:0;;;24377:21:1;24434:2;24414:18;;;24407:30;-1:-1:-1;;;24453:18:1;;;24446:54;24517:18;;38714:56:0;24193:348:1;65219:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65219:48:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65219:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65219:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63777:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38309:207::-;38381:7;-1:-1:-1;;;;;38409:19:0;;38401:73;;;;-1:-1:-1;;;38401:73:0;;24748:2:1;38401:73:0;;;24730:21:1;24787:2;24767:18;;;24760:30;24826:34;24806:18;;;24799:62;-1:-1:-1;;;24877:18:1;;;24870:39;24926:19;;38401:73:0;24546:405:1;38401:73:0;-1:-1:-1;;;;;;38492:16:0;;;;;:9;:16;;;;;;;38309:207::o;62690:103::-;61928:13;:11;:13::i;:::-;62755:30:::1;62782:1;62755:18;:30::i;:::-;62690:103::o:0;69588:219::-;69681:8;65738:17;65746:8;65738:7;:17::i;:::-;-1:-1:-1;;;;;65724:31:0;:10;-1:-1:-1;;;;;65724:31:0;;65716:75;;;;-1:-1:-1;;;65716:75:0;;23490:2:1;65716:75:0;;;23472:21:1;23529:2;23509:18;;;23502:30;23568:33;23548:18;;;23541:61;23619:18;;65716:75:0;23288:355:1;65716:75:0;69702:22:::1;::::0;;;:12:::1;:22;::::0;;;;;;;:45;;;;69737:10;;69702:32:::1;::::0;;::::1;::::0;:45:::1;::::0;:32;;:45;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;69702:45:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;69702:45:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;69702:45:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;69763:36;69776:10;69788;69763:36;;;;;;;:::i;:::-;;;;;;;;69588:219:::0;;;:::o;66778:127::-;61928:13;:11;:13::i;:::-;-1:-1:-1;;;;;66856:33:0::1;66892:5;66856:33:::0;;;:16:::1;:33;::::0;;;;:41;;-1:-1:-1;;66856:41:0::1;::::0;;66778:127::o;69317:140::-;69376:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69376:21:0;69417:22;;;;:12;:22;;;;;;;;;69410:39;;69417:32;;;;69410:39;;;;;;;;;;;;;;;;;;;;;69417:32;;69410:39;;;69417:32;;69410:39;;69417:32;69410:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;69410:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;69317:140;;;:::o;39037:104::-;39093:13;39126:7;39119:14;;;;;:::i;40623:155::-;40718:52;36366:10;40751:8;40761;40718:18;:52::i;41742:322::-;41916:41;36366:10;41949:7;41916:18;:41::i;:::-;41908:99;;;;-1:-1:-1;;;41908:99:0;;;;;;;:::i;:::-;42018:38;42032:4;42038:2;42042:7;42051:4;42018:13;:38::i;:::-;41742:322;;;;:::o;68950:233::-;65461:22;;;;:12;:22;;;;;:30;;;:22;;-1:-1:-1;;;;;65461:30:0;65447:10;:44;65439:90;;;;-1:-1:-1;;;65439:90:0;;;;;;;:::i;:::-;69070:22:::1;::::0;;;:12:::1;:22;::::0;;;;;;;:49;;;;69107:12;;69070:34:::1;::::0;;::::1;::::0;:49:::1;::::0;:34;;:49;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;69070:49:0::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;69070:49:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;69070:49:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;;;69135:40;69150:10;69162:12;69135:40;;;;;;;:::i;76698:249::-:0;76759:7;76791:15;;;:6;:15;;;;;:23;76819:15;-1:-1:-1;;;76791:23:0;;;-1:-1:-1;;;;;76791:23:0;76783:51;76779:161;;-1:-1:-1;76858:15:0;;;;:6;:15;;;;;:20;-1:-1:-1;;;;;76858:20:0;;76698:249::o;76779:161::-;-1:-1:-1;76926:1:0;;76698:249;-1:-1:-1;76698:249:0:o;76779:161::-;76698:249;;;:::o;66516:123::-;61928:13;:11;:13::i;:::-;-1:-1:-1;;;;;66591:33:0::1;;::::0;;;:16:::1;:33;::::0;;;;:40;;-1:-1:-1;;66591:40:0::1;66627:4;66591:40;::::0;;66516:123::o;39212:281::-;39285:13;39311:23;39326:7;39311:14;:23::i;:::-;39347:21;39371:10;:8;:10::i;:::-;39347:34;;39423:1;39405:7;39399:21;:25;:86;;;;;;;;;;;;;;;;;39451:7;39460:18;:7;:16;:18::i;:::-;39434:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39399:86;39392:93;39212:281;-1:-1:-1;;;39212:281:0:o;71829:541::-;-1:-1:-1;;;;;72048:33:0;;;;;;:16;:33;;;;;;;;72039:66;;;;-1:-1:-1;;;72039:66:0;;26040:2:1;72039:66:0;;;26022:21:1;26079:2;26059:18;;;26052:30;-1:-1:-1;;;26098:18:1;;;26091:49;26157:18;;72039:66:0;25838:343:1;72039:66:0;72116:34;72124:15;72141:8;72116:7;:34::i;:::-;72222:107;;-1:-1:-1;;;72222:107:0;;-1:-1:-1;;;;;72222:40:0;;;;;72269:9;;72222:107;;72281:8;;72299:10;;72312:7;;72321;;72222:107;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72214:148;;;;-1:-1:-1;;;72214:148:0;;31248:2:1;72214:148:0;;;31230:21:1;31287:2;31267:18;;;31260:30;31326;31306:18;;;31299:58;31374:18;;72214:148:0;31046:352:1;68669:144:0;68730:21;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68730:21:0;68771:22;;;;:12;:22;;;;;;;;;68764:41;;68771:34;;;;68764:41;;;;;;;;;;;;;;;;;;;;;68771:34;;68764:41;;;68771:34;;68764:41;;68771:34;68764:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76076:359;76174:39;76193:10;76205:7;76174:18;:39::i;:::-;76166:101;;;;-1:-1:-1;;;76166:101:0;;31605:2:1;76166:101:0;;;31587:21:1;31644:2;31624:18;;;31617:30;31683:34;31663:18;;;31656:62;-1:-1:-1;;;31734:18:1;;;31727:47;31791:19;;76166:101:0;31403:413:1;76166:101:0;76278:21;76302:15;;;:6;:15;;;;;;;;;76328:16;;-1:-1:-1;;;;;76328:16:0;;-1:-1:-1;;;;;;76355:22:0;;;;;-1:-1:-1;;;;;;;;76355:22:0;;;;;;;;;;;76393:34;;31965:50:1;;;76302:15:0;;76328:16;;76302:15;;76393:34;;31938:18:1;76393:34:0;;;;;;;;76155:280;76076:359;;;:::o;72739:522::-;72892:10;72849:4;72875:28;;;:16;:28;;;;;;;;72866:85;;;;-1:-1:-1;;;72866:85:0;;32228:2:1;72866:85:0;;;32210:21:1;32267:2;32247:18;;;32240:30;32306:34;32286:18;;;32279:62;-1:-1:-1;;;32357:18:1;;;32350:41;32408:19;;72866:85:0;32026:407:1;72866:85:0;72964:22;;;;:12;:22;;;;;;;;;:32;;;:41;;;73016:39;;:55;;-1:-1:-1;;;;;;73082:61:0;73016:55;-1:-1:-1;;;;;73016:55:0;;;-1:-1:-1;;73082:61:0;;;;;;;;73161:34;;32612:25:1;;;32653:18;;;32646:34;;;73161::0;;32585:18:1;73161:34:0;;;;;;;-1:-1:-1;73213:4:0;72739:522;;;;;;:::o;62948:201::-;61928:13;:11;:13::i;:::-;-1:-1:-1;;;;;63037:22:0;::::1;63029:73;;;::::0;-1:-1:-1;;;63029:73:0;;32893:2:1;63029:73:0::1;::::0;::::1;32875:21:1::0;32932:2;32912:18;;;32905:30;32971:34;32951:18;;;32944:62;-1:-1:-1;;;33022:18:1;;;33015:36;33068:19;;63029:73:0::1;32691:402:1::0;63029:73:0::1;63113:28;63132:8;63113:18;:28::i;:::-;62948:201:::0;:::o;54839:224::-;54941:4;-1:-1:-1;;;;;;54965:50:0;;-1:-1:-1;;;54965:50:0;;:90;;;55019:36;55043:11;55019:23;:36::i;50199:135::-;43867:4;43465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43465:16:0;50273:53;;;;-1:-1:-1;;;50273:53:0;;24395:2:1;50273:53:0;;;24377:21:1;24434:2;24414:18;;;24407:30;-1:-1:-1;;;24453:18:1;;;24446:54;24517:18;;50273:53:0;24193:348:1;49478:174:0;49553:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;49553:29:0;-1:-1:-1;;;;;49553:29:0;;;;;;;;:24;;49607:23;49553:24;49607:14;:23::i;:::-;-1:-1:-1;;;;;49598:46:0;;;;;;;;;;;49478:174;;:::o;44703:110::-;44779:26;44789:2;44793:7;44779:26;;;;;;;;;;;;:9;:26::i;44097:264::-;44190:4;44207:13;44223:23;44238:7;44223:14;:23::i;:::-;44207:39;;44276:5;-1:-1:-1;;;;;44265:16:0;:7;-1:-1:-1;;;;;44265:16:0;;:52;;;-1:-1:-1;;;;;;40970:25:0;;;40946:4;40970:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;44285:32;44265:87;;;;44345:7;-1:-1:-1;;;;;44321:31:0;:20;44333:7;44321:11;:20::i;:::-;-1:-1:-1;;;;;44321:31:0;;44257:96;44097:264;-1:-1:-1;;;;44097:264:0:o;48096:1263::-;48255:4;-1:-1:-1;;;;;48228:31:0;:23;48243:7;48228:14;:23::i;:::-;-1:-1:-1;;;;;48228:31:0;;48220:81;;;;-1:-1:-1;;;48220:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48320:16:0;;48312:65;;;;-1:-1:-1;;;48312:65:0;;33706:2:1;48312:65:0;;;33688:21:1;33745:2;33725:18;;;33718:30;33784:34;33764:18;;;33757:62;-1:-1:-1;;;33835:18:1;;;33828:34;33879:19;;48312:65:0;33504:400:1;48312:65:0;48390:42;48411:4;48417:2;48421:7;48430:1;48390:20;:42::i;:::-;48562:4;-1:-1:-1;;;;;48535:31:0;:23;48550:7;48535:14;:23::i;:::-;-1:-1:-1;;;;;48535:31:0;;48527:81;;;;-1:-1:-1;;;48527:81:0;;;;;;;:::i;:::-;48680:24;;;;:15;:24;;;;;;;;48673:31;;-1:-1:-1;;;;;;48673:31:0;;;;;;-1:-1:-1;;;;;49156:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;49156:20:0;;;49191:13;;;;;;;;;:18;;48673:31;49191:18;;;49231:16;;;:7;:16;;;;;;:21;;;;;;;;;;49270:27;;48696:7;;49270:27;;;39968:346;39898:416;;:::o;46976:783::-;47036:13;47052:23;47067:7;47052:14;:23::i;:::-;47036:39;;47088:51;47109:5;47124:1;47128:7;47137:1;47088:20;:51::i;:::-;47252:23;47267:7;47252:14;:23::i;:::-;47323:24;;;;:15;:24;;;;;;;;47316:31;;-1:-1:-1;;;;;;47316:31:0;;;;;;-1:-1:-1;;;;;47568:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;47568:21:0;;;47618:16;;;:7;:16;;;;;;47611:23;;;;;;;47652:36;47244:31;;-1:-1:-1;47339:7:0;;47652:36;;47323:24;;47652:36;70335:18:::1;70263:98:::0;:::o;62207:132::-;62088:7;62115:6;-1:-1:-1;;;;;62115:6:0;36366:10;62271:23;62263:68;;;;-1:-1:-1;;;62263:68:0;;34111:2:1;62263:68:0;;;34093:21:1;;;34130:18;;;34123:30;34189:34;34169:18;;;34162:62;34241:18;;62263:68:0;33909:356:1;63309:191:0;63383:16;63402:6;;-1:-1:-1;;;;;63419:17:0;;;-1:-1:-1;;;;;;63419:17:0;;;;;;63452:40;;63402:6;;;;;;;63452:40;;63383:16;63452:40;63372:128;63309:191;:::o;49795:315::-;49950:8;-1:-1:-1;;;;;49941:17:0;:5;-1:-1:-1;;;;;49941:17:0;;49933:55;;;;-1:-1:-1;;;49933:55:0;;34472:2:1;49933:55:0;;;34454:21:1;34511:2;34491:18;;;34484:30;34550:27;34530:18;;;34523:55;34595:18;;49933:55:0;34270:349:1;49933:55:0;-1:-1:-1;;;;;49999:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;49999:46:0;;;;;;;;;;50061:41;;540::1;;;50061::0;;513:18:1;50061:41:0;;;;;;;49795:315;;;:::o;42945:313::-;43101:28;43111:4;43117:2;43121:7;43101:9;:28::i;:::-;43148:47;43171:4;43177:2;43181:7;43190:4;43148:22;:47::i;:::-;43140:110;;;;-1:-1:-1;;;43140:110:0;;;;;;;:::i;70072:100::-;70124:13;70157:7;70150:14;;;;;:::i;14024:716::-;14080:13;14131:14;14148:17;14159:5;14148:10;:17::i;:::-;14168:1;14148:21;14131:38;;14184:20;14218:6;-1:-1:-1;;;;;14207:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14207:18:0;-1:-1:-1;14184:41:0;-1:-1:-1;14349:28:0;;;14365:2;14349:28;14406:288;-1:-1:-1;;14438:5:0;-1:-1:-1;;;14575:2:0;14564:14;;14559:30;14438:5;14546:44;14636:2;14627:11;;;-1:-1:-1;14657:21:0;14406:288;14657:21;-1:-1:-1;14715:6:0;14024:716;-1:-1:-1;;;14024:716:0:o;37940:305::-;38042:4;-1:-1:-1;;;;;;38079:40:0;;-1:-1:-1;;;38079:40:0;;:105;;-1:-1:-1;;;;;;;38136:48:0;;-1:-1:-1;;;38136:48:0;38079:105;:158;;;-1:-1:-1;;;;;;;;;;28423:40:0;;;38201:36;28314:157;45040:319;45169:18;45175:2;45179:7;45169:5;:18::i;:::-;45220:53;45251:1;45255:2;45259:7;45268:4;45220:22;:53::i;:::-;45198:153;;;;-1:-1:-1;;;45198:153:0;;;;;;;:::i;77708:405::-;77880:56;77907:4;77913:2;77917:7;77926:9;77880:26;:56::i;:::-;77961:2;-1:-1:-1;;;;;77953:10:0;:4;-1:-1:-1;;;;;77953:10:0;;;:48;;;;-1:-1:-1;77999:1:0;77967:15;;;:6;:15;;;;;:20;-1:-1:-1;;;;;77967:20:0;:34;;77953:48;77949:157;;;78025:15;;;;:6;:15;;;;;;;;78018:22;;-1:-1:-1;;;;;;78018:22:0;;;78060:34;31965:50:1;;;78025:15:0;;78060:34;;31938:18:1;78060:34:0;31821:200:1;50898:853:0;51052:4;-1:-1:-1;;;;;51073:13:0;;17479:19;:23;51069:675;;51109:71;;-1:-1:-1;;;51109:71:0;;-1:-1:-1;;;;;51109:36:0;;;;;:71;;36366:10;;51160:4;;51166:7;;51175:4;;51109:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51109:71:0;;;;;;;;-1:-1:-1;;51109:71:0;;;;;;;;;;;;:::i;:::-;;;51105:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51350:6;:13;51367:1;51350:18;51346:328;;51393:60;;-1:-1:-1;;;51393:60:0;;;;;;;:::i;51346:328::-;51624:6;51618:13;51609:6;51605:2;51601:15;51594:38;51105:584;-1:-1:-1;;;;;;51231:51:0;-1:-1:-1;;;51231:51:0;;-1:-1:-1;51224:58:0;;51069:675;-1:-1:-1;51728:4:0;51721:11;;10857:922;10910:7;;-1:-1:-1;;;10988:15:0;;10984:102;;-1:-1:-1;;;11024:15:0;;;-1:-1:-1;11068:2:0;11058:12;10984:102;11113:6;11104:5;:15;11100:102;;11149:6;11140:15;;;-1:-1:-1;11184:2:0;11174:12;11100:102;11229:6;11220:5;:15;11216:102;;11265:6;11256:15;;;-1:-1:-1;11300:2:0;11290:12;11216:102;11345:5;11336;:14;11332:99;;11380:5;11371:14;;;-1:-1:-1;11414:1:0;11404:11;11332:99;11458:5;11449;:14;11445:99;;11493:5;11484:14;;;-1:-1:-1;11527:1:0;11517:11;11445:99;11571:5;11562;:14;11558:99;;11606:5;11597:14;;;-1:-1:-1;11640:1:0;11630:11;11558:99;11684:5;11675;:14;11671:66;;11720:1;11710:11;11765:6;10857:922;-1:-1:-1;;10857:922:0:o;45695:942::-;-1:-1:-1;;;;;45775:16:0;;45767:61;;;;-1:-1:-1;;;45767:61:0;;36339:2:1;45767:61:0;;;36321:21:1;;;36358:18;;;36351:30;36417:34;36397:18;;;36390:62;36469:18;;45767:61:0;36137:356:1;45767:61:0;43867:4;43465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43465:16:0;43891:31;45839:58;;;;-1:-1:-1;;;45839:58:0;;36700:2:1;45839:58:0;;;36682:21:1;36739:2;36719:18;;;36712:30;36778;36758:18;;;36751:58;36826:18;;45839:58:0;36498:352:1;45839:58:0;45910:48;45939:1;45943:2;45947:7;45956:1;45910:20;:48::i;:::-;43867:4;43465:16;;;:7;:16;;;;;;-1:-1:-1;;;;;43465:16:0;43891:31;46048:58;;;;-1:-1:-1;;;46048:58:0;;36700:2:1;46048:58:0;;;36682:21:1;36739:2;36719:18;;;36712:30;36778;36758:18;;;36751:58;36826:18;;46048:58:0;36498:352:1;46048:58:0;-1:-1:-1;;;;;46455:13:0;;;;;;:9;:13;;;;;;;;:18;;46472:1;46455:18;;;46497:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;46497:21:0;;;;;46536:33;46505:7;;46455:13;;46536:33;;46455:13;;46536:33;70335:18:::1;70263:98:::0;:::o;55976:915::-;56153:61;56180:4;56186:2;56190:12;56204:9;56153:26;:61::i;:::-;56243:1;56231:9;:13;56227:222;;;56374:63;;-1:-1:-1;;;56374:63:0;;37057:2:1;56374:63:0;;;37039:21:1;37096:2;37076:18;;;37069:30;37135:34;37115:18;;;37108:62;-1:-1:-1;;;37186:18:1;;;37179:51;37247:19;;56374:63:0;36855:417:1;56227:222:0;56479:12;-1:-1:-1;;;;;56508:18:0;;56504:187;;56543:40;56575:7;57718:10;:17;;57691:24;;;;:15;:24;;;;;:44;;;57746:24;;;;;;;;;;;;57614:164;56543:40;56504:187;;;56613:2;-1:-1:-1;;;;;56605:10:0;:4;-1:-1:-1;;;;;56605:10:0;;56601:90;;56632:47;56665:4;56671:7;56632:32;:47::i;:::-;-1:-1:-1;;;;;56705:16:0;;56701:183;;56738:45;56775:7;56738:36;:45::i;:::-;56701:183;;;56811:4;-1:-1:-1;;;;;56805:10:0;:2;-1:-1:-1;;;;;56805:10:0;;56801:83;;56832:40;56860:2;56864:7;56832:27;:40::i;:::-;56142:749;55976:915;;;;:::o;52483:410::-;52673:1;52661:9;:13;52657:229;;;-1:-1:-1;;;;;52695:18:0;;;52691:87;;-1:-1:-1;;;;;52734:15:0;;;;;;:9;:15;;;;;:28;;52753:9;;52734:15;:28;;52753:9;;52734:28;:::i;:::-;;;;-1:-1:-1;;52691:87:0;-1:-1:-1;;;;;52796:16:0;;;52792:83;;-1:-1:-1;;;;;52833:13:0;;;;;;:9;:13;;;;;:26;;52850:9;;52833:13;:26;;52850:9;;52833:26;:::i;:::-;;;;-1:-1:-1;;52483:410:0;;;;:::o;58405:988::-;58671:22;58721:1;58696:22;58713:4;58696:16;:22::i;:::-;:26;;;;:::i;:::-;58733:18;58754:26;;;:17;:26;;;;;;58671:51;;-1:-1:-1;58887:28:0;;;58883:328;;-1:-1:-1;;;;;58954:18:0;;58932:19;58954:18;;;:12;:18;;;;;;;;:34;;;;;;;;;59005:30;;;;;;:44;;;59122:30;;:17;:30;;;;;:43;;;58883:328;-1:-1:-1;59307:26:0;;;;:17;:26;;;;;;;;59300:33;;;-1:-1:-1;;;;;59351:18:0;;;;;:12;:18;;;;;:34;;;;;;;59344:41;58405:988::o;59688:1079::-;59966:10;:17;59941:22;;59966:21;;59986:1;;59966:21;:::i;:::-;59998:18;60019:24;;;:15;:24;;;;;;60392:10;:26;;59941:46;;-1:-1:-1;60019:24:0;;59941:46;;60392:26;;;;;;:::i;:::-;;;;;;;;;60370:48;;60456:11;60431:10;60442;60431:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;60536:28;;;:15;:28;;;;;;;:41;;;60708:24;;;;;60701:31;60743:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;59759:1008;;;59688:1079;:::o;57192:221::-;57277:14;57294:20;57311:2;57294:16;:20::i;:::-;-1:-1:-1;;;;;57325:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;57370:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;57192:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1919:254;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:127::-;2239:10;2234:3;2230:20;2227:1;2220:31;2270:4;2267:1;2260:15;2294:4;2291:1;2284:15;2310:253;2382:2;2376:9;2424:4;2412:17;;-1:-1:-1;;;;;2444:34:1;;2480:22;;;2441:62;2438:88;;;2506:18;;:::i;:::-;2542:2;2535:22;2310:253;:::o;2568:275::-;2639:2;2633:9;2704:2;2685:13;;-1:-1:-1;;2681:27:1;2669:40;;-1:-1:-1;;;;;2724:34:1;;2760:22;;;2721:62;2718:88;;;2786:18;;:::i;:::-;2822:2;2815:22;2568:275;;-1:-1:-1;2568:275:1:o;2848:407::-;2913:5;-1:-1:-1;;;;;2939:6:1;2936:30;2933:56;;;2969:18;;:::i;:::-;3007:57;3052:2;3031:15;;-1:-1:-1;;3027:29:1;3058:4;3023:40;3007:57;:::i;:::-;2998:66;;3087:6;3080:5;3073:21;3127:3;3118:6;3113:3;3109:16;3106:25;3103:45;;;3144:1;3141;3134:12;3103:45;3193:6;3188:3;3181:4;3174:5;3170:16;3157:43;3247:1;3240:4;3231:6;3224:5;3220:18;3216:29;3209:40;2848:407;;;;;:::o;3260:222::-;3303:5;3356:3;3349:4;3341:6;3337:17;3333:27;3323:55;;3374:1;3371;3364:12;3323:55;3396:80;3472:3;3463:6;3450:20;3443:4;3435:6;3431:17;3396:80;:::i;3487:539::-;3583:6;3591;3599;3607;3660:3;3648:9;3639:7;3635:23;3631:33;3628:53;;;3677:1;3674;3667:12;3628:53;3700:29;3719:9;3700:29;:::i;:::-;3690:39;;3748:38;3782:2;3771:9;3767:18;3748:38;:::i;:::-;3738:48;;3837:2;3826:9;3822:18;3809:32;-1:-1:-1;;;;;3856:6:1;3853:30;3850:50;;;3896:1;3893;3886:12;3850:50;3919;3961:7;3952:6;3941:9;3937:22;3919:50;:::i;:::-;3487:539;;;;-1:-1:-1;3909:60:1;;4016:2;4001:18;3988:32;;-1:-1:-1;;;3487:539:1:o;4213:322::-;4282:6;4335:2;4323:9;4314:7;4310:23;4306:32;4303:52;;;4351:1;4348;4341:12;4303:52;4391:9;4378:23;-1:-1:-1;;;;;4416:6:1;4413:30;4410:50;;;4456:1;4453;4446:12;4410:50;4479;4521:7;4512:6;4501:9;4497:22;4479:50;:::i;4540:328::-;4617:6;4625;4633;4686:2;4674:9;4665:7;4661:23;4657:32;4654:52;;;4702:1;4699;4692:12;4654:52;4725:29;4744:9;4725:29;:::i;:::-;4715:39;;4773:38;4807:2;4796:9;4792:18;4773:38;:::i;:::-;4763:48;;4858:2;4847:9;4843:18;4830:32;4820:42;;4540:328;;;;;:::o;4873:435::-;4926:3;4964:5;4958:12;4991:6;4986:3;4979:19;5017:4;5046:2;5041:3;5037:12;5030:19;;5083:2;5076:5;5072:14;5104:1;5114:169;5128:6;5125:1;5122:13;5114:169;;;5189:13;;5177:26;;5223:12;;;;5258:15;;;;5150:1;5143:9;5114:169;;;-1:-1:-1;5299:3:1;;4873:435;-1:-1:-1;;;;;4873:435:1:o;5313:616::-;5365:3;5403:5;5397:12;5430:6;5425:3;5418:19;5456:4;5497:2;5492:3;5488:12;5522:11;5549;5542:18;;5599:6;5596:1;5592:14;5585:5;5581:26;5569:38;;5641:2;5634:5;5630:14;5662:1;5672:231;5686:6;5683:1;5680:13;5672:231;;;5757:5;5751:4;5747:16;5742:3;5735:29;5785:38;5818:4;5809:6;5803:13;5785:38;:::i;:::-;5881:12;;;;5777:46;-1:-1:-1;5846:15:1;;;;5708:1;5701:9;5672:231;;;-1:-1:-1;5919:4:1;;5313:616;-1:-1:-1;;;;;;;5313:616:1:o;5934:461::-;5987:3;6025:5;6019:12;6052:6;6047:3;6040:19;6078:4;6107:2;6102:3;6098:12;6091:19;;6144:2;6137:5;6133:14;6165:1;6175:195;6189:6;6186:1;6183:13;6175:195;;;6254:13;;-1:-1:-1;;;;;6250:39:1;6238:52;;6310:12;;;;6345:15;;;;6286:1;6204:9;6175:195;;6400:1108;6530:12;;6496:4;6551:17;;;6617:19;;6487:14;;;6645:20;;;6457:3;;6715:4;;6742:21;;;;6692:3;6683:13;;;6457:3;6791:191;6805:6;6802:1;6799:13;6791:191;;;6882:13;;6875:21;6868:29;6854:44;;6957:15;;;;6920:14;;;;6827:1;6820:9;6791:191;;;6795:3;;7030:2;7023:5;7019:14;7013:21;6991:43;;7075:3;7068:5;7064:15;7059:2;7054:3;7050:12;7043:37;7103:51;7148:5;7132:14;7103:51;:::i;:::-;7089:65;;;;7202:4;7195:5;7191:16;7185:23;7252:3;7244:6;7240:16;7233:4;7228:3;7224:14;7217:40;7280:51;7324:6;7308:14;7280:51;:::i;:::-;7266:65;;;7379:4;7372:5;7368:16;7362:23;7429:3;7421:6;7417:16;7410:4;7405:3;7401:14;7394:40;7450:52;7495:6;7479:14;7450:52;:::i;:::-;7443:59;6400:1108;-1:-1:-1;;;;;6400:1108:1:o;7513:1180::-;8014:25;;;8070:2;8055:18;;8048:34;;;8113:2;8098:18;;8091:34;;;8173:4;8161:17;;8156:2;8141:18;;8134:45;-1:-1:-1;;;;;8254:15:1;;;8248:3;8233:19;;8226:44;8307:15;;8206:3;8286:19;;8279:44;8002:3;8354;8339:19;;8332:31;;;7973:4;;8386:45;8412:18;;;8404:6;8386:45;:::i;:::-;8372:59;;8480:9;8472:6;8468:22;8462:3;8451:9;8447:19;8440:51;8514:48;8555:6;8547;8514:48;:::i;:::-;8500:62;;8611:9;8603:6;8599:22;8593:3;8582:9;8578:19;8571:51;8639:48;8680:6;8672;8639:48;:::i;:::-;8631:56;7513:1180;-1:-1:-1;;;;;;;;;;;;7513:1180:1:o;8698:186::-;8757:6;8810:2;8798:9;8789:7;8785:23;8781:32;8778:52;;;8826:1;8823;8816:12;8778:52;8849:29;8868:9;8849:29;:::i;8889:180::-;8946:4;-1:-1:-1;;;;;8971:6:1;8968:30;8965:56;;;9001:18;;:::i;:::-;-1:-1:-1;9046:1:1;9042:14;9058:4;9038:25;;8889:180::o;9074:118::-;9160:5;9153:13;9146:21;9139:5;9136:32;9126:60;;9182:1;9179;9172:12;9197:728;9248:5;9301:3;9294:4;9286:6;9282:17;9278:27;9268:55;;9319:1;9316;9309:12;9268:55;9355:6;9342:20;9381:4;9405:57;9421:40;9458:2;9421:40;:::i;:::-;9405:57;:::i;:::-;9496:15;;;9582:1;9578:10;;;;9566:23;;9562:32;;;9527:12;;;;9606:15;;;9603:35;;;9634:1;9631;9624:12;9603:35;9670:2;9662:6;9658:15;9682:214;9698:6;9693:3;9690:15;9682:214;;;9778:3;9765:17;9795:28;9817:5;9795:28;:::i;:::-;9836:18;;9874:12;;;;9715;;9682:214;;;-1:-1:-1;9914:5:1;9197:728;-1:-1:-1;;;;;;9197:728:1:o;9930:659::-;9984:5;10037:3;10030:4;10022:6;10018:17;10014:27;10004:55;;10055:1;10052;10045:12;10004:55;10091:6;10078:20;10117:4;10141:57;10157:40;10194:2;10157:40;:::i;10141:57::-;10232:15;;;10318:1;10314:10;;;;10302:23;;10298:32;;;10263:12;;;;10342:15;;;10339:35;;;10370:1;10367;10360:12;10339:35;10406:2;10398:6;10394:15;10418:142;10434:6;10429:3;10426:15;10418:142;;;10500:17;;10488:30;;10538:12;;;;10451;;10418:142;;10594:885;10647:5;10700:3;10693:4;10685:6;10681:17;10677:27;10667:55;;10718:1;10715;10708:12;10667:55;10754:6;10741:20;10780:4;10804:57;10820:40;10857:2;10820:40;:::i;10804:57::-;10895:15;;;10981:1;10977:10;;;;10965:23;;10961:32;;;10926:12;;;;11005:15;;;11002:35;;;11033:1;11030;11023:12;11002:35;11069:2;11061:6;11057:15;11081:369;11097:6;11092:3;11089:15;11081:369;;;11183:3;11170:17;-1:-1:-1;;;;;11206:11:1;11203:35;11200:125;;;11279:1;11308:2;11304;11297:14;11200:125;11350:57;11403:3;11398:2;11384:11;11376:6;11372:24;11368:33;11350:57;:::i;:::-;11338:70;;-1:-1:-1;11428:12:1;;;;11114;;11081:369;;11484:665;11538:5;11591:3;11584:4;11576:6;11572:17;11568:27;11558:55;;11609:1;11606;11599:12;11558:55;11645:6;11632:20;11671:4;11695:57;11711:40;11748:2;11711:40;:::i;11695:57::-;11786:15;;;11872:1;11868:10;;;;11856:23;;11852:32;;;11817:12;;;;11896:15;;;11893:35;;;11924:1;11921;11914:12;11893:35;11960:2;11952:6;11948:15;11972:148;11988:6;11983:3;11980:15;11972:148;;;12054:23;12073:3;12054:23;:::i;:::-;12042:36;;12098:12;;;;12005;;11972:148;;12154:1243;12254:6;12262;12315:2;12303:9;12294:7;12290:23;12286:32;12283:52;;;12331:1;12328;12321:12;12283:52;12367:9;12354:23;12344:33;;12428:2;12417:9;12413:18;12400:32;-1:-1:-1;;;;;12492:2:1;12484:6;12481:14;12478:34;;;12508:1;12505;12498:12;12478:34;12531:22;;;;12587:4;12569:16;;;12565:27;12562:47;;;12605:1;12602;12595:12;12562:47;12631:22;;:::i;:::-;12691:2;12678:16;12719:2;12709:8;12706:16;12703:36;;;12735:1;12732;12725:12;12703:36;12762:53;12807:7;12796:8;12792:2;12788:17;12762:53;:::i;:::-;12755:5;12748:68;;12862:2;12858;12854:11;12841:25;12891:2;12881:8;12878:16;12875:36;;;12907:1;12904;12897:12;12875:36;12943:56;12991:7;12980:8;12976:2;12972:17;12943:56;:::i;:::-;12938:2;12931:5;12927:14;12920:80;;13046:2;13042;13038:11;13025:25;13075:2;13065:8;13062:16;13059:36;;;13091:1;13088;13081:12;13059:36;13127:55;13174:7;13163:8;13159:2;13155:17;13127:55;:::i;:::-;13122:2;13115:5;13111:14;13104:79;;13229:2;13225;13221:11;13208:25;13258:2;13248:8;13245:16;13242:36;;;13274:1;13271;13264:12;13242:36;13310:56;13358:7;13347:8;13343:2;13339:17;13310:56;:::i;:::-;13305:2;13298:5;13294:14;13287:80;;13386:5;13376:15;;;;;12154:1243;;;;;:::o;13402:279::-;13595:2;13584:9;13577:21;13558:4;13615:60;13671:2;13660:9;13656:18;13648:6;13615:60;:::i;13686:315::-;13751:6;13759;13812:2;13800:9;13791:7;13787:23;13783:32;13780:52;;;13828:1;13825;13818:12;13780:52;13851:29;13870:9;13851:29;:::i;:::-;13841:39;;13930:2;13919:9;13915:18;13902:32;13943:28;13965:5;13943:28;:::i;:::-;13990:5;13980:15;;;13686:315;;;;;:::o;14195:667::-;14290:6;14298;14306;14314;14367:3;14355:9;14346:7;14342:23;14338:33;14335:53;;;14384:1;14381;14374:12;14335:53;14407:29;14426:9;14407:29;:::i;:::-;14397:39;;14455:38;14489:2;14478:9;14474:18;14455:38;:::i;:::-;14445:48;;14540:2;14529:9;14525:18;14512:32;14502:42;;14595:2;14584:9;14580:18;14567:32;-1:-1:-1;;;;;14614:6:1;14611:30;14608:50;;;14654:1;14651;14644:12;14608:50;14677:22;;14730:4;14722:13;;14718:27;-1:-1:-1;14708:55:1;;14759:1;14756;14749:12;14708:55;14782:74;14848:7;14843:2;14830:16;14825:2;14821;14817:11;14782:74;:::i;:::-;14772:84;;;14195:667;;;;;;;:::o;14867:156::-;14933:20;;14993:4;14982:16;;14972:27;;14962:55;;15013:1;15010;15003:12;15028:610;15149:6;15157;15165;15173;15226:3;15214:9;15205:7;15201:23;15197:33;15194:53;;;15243:1;15240;15233:12;15194:53;15279:9;15266:23;15256:33;;15308:38;15342:2;15331:9;15327:18;15308:38;:::i;:::-;15298:48;;15365:36;15397:2;15386:9;15382:18;15365:36;:::i;:::-;15355:46;;15452:2;15441:9;15437:18;15424:32;-1:-1:-1;;;;;15471:6:1;15468:30;15465:50;;;15511:1;15508;15501:12;15465:50;15534:22;;15590:3;15572:16;;;15568:26;15565:46;;;15607:1;15604;15597:12;15565:46;15028:610;;;;-1:-1:-1;15028:610:1;;-1:-1:-1;;15028:610:1:o;15643:426::-;15719:6;15727;15735;15788:2;15776:9;15767:7;15763:23;15759:32;15756:52;;;15804:1;15801;15794:12;15756:52;15840:9;15827:23;15817:33;;15869:38;15903:2;15892:9;15888:18;15869:38;:::i;:::-;15859:48;;15957:2;15946:9;15942:18;15929:32;-1:-1:-1;;;;;15994:5:1;15990:30;15983:5;15980:41;15970:69;;16035:1;16032;16025:12;15970:69;16058:5;16048:15;;;15643:426;;;;;:::o;16074:393::-;16158:6;16166;16174;16182;16235:3;16223:9;16214:7;16210:23;16206:33;16203:53;;;16252:1;16249;16242:12;16203:53;16288:9;16275:23;16265:33;;16345:2;16334:9;16330:18;16317:32;16307:42;;16368:36;16400:2;16389:9;16385:18;16368:36;:::i;:::-;16358:46;;16423:38;16457:2;16446:9;16442:18;16423:38;:::i;:::-;16413:48;;16074:393;;;;;;;:::o;16472:260::-;16540:6;16548;16601:2;16589:9;16580:7;16576:23;16572:32;16569:52;;;16617:1;16614;16607:12;16569:52;16640:29;16659:9;16640:29;:::i;:::-;16630:39;;16688:38;16722:2;16711:9;16707:18;16688:38;:::i;:::-;16678:48;;16472:260;;;;;:::o;16737:380::-;16816:1;16812:12;;;;16859;;;16880:61;;16934:4;16926:6;16922:17;16912:27;;16880:61;16987:2;16979:6;16976:14;16956:18;16953:38;16950:161;;17033:10;17028:3;17024:20;17021:1;17014:31;17068:4;17065:1;17058:15;17096:4;17093:1;17086:15;16950:161;;16737:380;;;:::o;18365:289::-;18496:3;18534:6;18528:13;18550:66;18609:6;18604:3;18597:4;18589:6;18585:17;18550:66;:::i;:::-;18632:16;;;;;18365:289;-1:-1:-1;;18365:289:1:o;19016:127::-;19077:10;19072:3;19068:20;19065:1;19058:31;19108:4;19105:1;19098:15;19132:4;19129:1;19122:15;19148:135;19187:3;19208:17;;;19205:43;;19228:18;;:::i;:::-;-1:-1:-1;19275:1:1;19264:13;;19148:135::o;19414:545::-;19516:2;19511:3;19508:11;19505:448;;;19552:1;19577:5;19573:2;19566:17;19622:4;19618:2;19608:19;19692:2;19680:10;19676:19;19673:1;19669:27;19663:4;19659:38;19728:4;19716:10;19713:20;19710:47;;;-1:-1:-1;19751:4:1;19710:47;19806:2;19801:3;19797:12;19794:1;19790:20;19784:4;19780:31;19770:41;;19861:82;19879:2;19872:5;19869:13;19861:82;;;19924:17;;;19905:1;19894:13;19861:82;;;19865:3;;;19414:545;;;:::o;20135:1352::-;20261:3;20255:10;-1:-1:-1;;;;;20280:6:1;20277:30;20274:56;;;20310:18;;:::i;:::-;20339:97;20429:6;20389:38;20421:4;20415:11;20389:38;:::i;:::-;20383:4;20339:97;:::i;:::-;20491:4;;20555:2;20544:14;;20572:1;20567:663;;;;21274:1;21291:6;21288:89;;;-1:-1:-1;21343:19:1;;;21337:26;21288:89;-1:-1:-1;;20092:1:1;20088:11;;;20084:24;20080:29;20070:40;20116:1;20112:11;;;20067:57;21390:81;;20537:944;;20567:663;19361:1;19354:14;;;19398:4;19385:18;;-1:-1:-1;;20603:20:1;;;20721:236;20735:7;20732:1;20729:14;20721:236;;;20824:19;;;20818:26;20803:42;;20916:27;;;;20884:1;20872:14;;;;20751:19;;20721:236;;;20725:3;20985:6;20976:7;20973:19;20970:201;;;21046:19;;;21040:26;-1:-1:-1;;21129:1:1;21125:14;;;21141:3;21121:24;21117:37;21113:42;21098:58;21083:74;;20970:201;-1:-1:-1;;;;;21217:1:1;21201:14;;;21197:22;21184:36;;-1:-1:-1;20135:1352:1:o;21492:563::-;-1:-1:-1;;;;;21791:15:1;;;21773:34;;21843:15;;21838:2;21823:18;;21816:43;21890:2;21875:18;;21868:34;;;21753:3;21933:2;21918:18;;21911:31;;;21716:4;;21959:46;;21985:19;;21977:6;21959:46;:::i;:::-;21951:54;;22042:6;22036:3;22025:9;22021:19;22014:35;21492:563;;;;;;;;:::o;22060:409::-;22262:2;22244:21;;;22301:2;22281:18;;;22274:30;22340:34;22335:2;22320:18;;22313:62;-1:-1:-1;;;22406:2:1;22391:18;;22384:43;22459:3;22444:19;;22060:409::o;22886:397::-;23088:2;23070:21;;;23127:2;23107:18;;;23100:30;23166:34;23161:2;23146:18;;23139:62;-1:-1:-1;;;23232:2:1;23217:18;;23210:31;23273:3;23258:19;;22886:397::o;24061:127::-;24122:10;24117:3;24113:20;24110:1;24103:31;24153:4;24150:1;24143:15;24177:4;24174:1;24167:15;24956:376;-1:-1:-1;;;;;25177:32:1;;25159:51;;25246:2;25241;25226:18;;25219:30;;;-1:-1:-1;;25266:60:1;;25307:18;;25299:6;25266:60;:::i;25337:496::-;25516:3;25554:6;25548:13;25570:66;25629:6;25624:3;25617:4;25609:6;25605:17;25570:66;:::i;:::-;25699:13;;25658:16;;;;25721:70;25699:13;25658:16;25768:4;25756:17;;25721:70;:::i;:::-;25807:20;;25337:496;-1:-1:-1;;;;25337:496:1:o;26186:517::-;26253:5;26260:6;26320:3;26307:17;26406:2;26402:7;26391:8;26375:14;26371:29;26367:43;26347:18;26343:68;26333:96;;26425:1;26422;26415:12;26333:96;26453:33;;26557:4;26544:18;;;-1:-1:-1;26505:21:1;;-1:-1:-1;;;;;;26574:30:1;;26571:50;;;26617:1;26614;26607:12;26571:50;26671:6;26668:1;26664:14;26648;26644:35;26637:5;26633:47;26630:67;;;26693:1;26690;26683:12;26630:67;26186:517;;;;;:::o;26708:311::-;26796:19;;;26778:3;-1:-1:-1;;;;;26827:31:1;;26824:51;;;26871:1;26868;26861:12;26824:51;26907:6;26904:1;26900:14;26959:8;26952:5;26945:4;26940:3;26936:14;26923:45;26988:18;;;;27008:4;26984:29;;26708:311;-1:-1:-1;;;26708:311:1:o;27024:267::-;27113:6;27108:3;27101:19;27165:6;27158:5;27151:4;27146:3;27142:14;27129:43;-1:-1:-1;27217:1:1;27192:16;;;27210:4;27188:27;;;27181:38;;;;27273:2;27252:15;;;-1:-1:-1;;27248:29:1;27239:39;;;27235:50;;27024:267::o;27296:1069::-;27404:6;27399:3;27392:19;27374:3;27430:4;27471:2;27466:3;27462:12;27496:11;27523;27516:18;;27573:6;27570:1;27566:14;27559:5;27555:26;27543:38;;27604:5;27627:1;27637:702;27651:6;27648:1;27645:13;27637:702;;;27722:5;27716:4;27712:16;27707:3;27700:29;27781:6;27768:20;27871:2;27867:7;27859:5;27843:14;27839:26;27835:40;27815:18;27811:65;27801:93;;27890:1;27887;27880:12;27801:93;27922:30;;28030:16;;;;27981:21;-1:-1:-1;;;;;28062:32:1;;28059:52;;;28107:1;28104;28097:12;28059:52;28160:8;28144:14;28140:29;28131:7;28127:43;28124:63;;;28183:1;28180;28173:12;28124:63;28208:51;28254:4;28244:8;28235:7;28208:51;:::i;:::-;28317:12;;;;28200:59;-1:-1:-1;;;28282:15:1;;;;27673:1;27666:9;27637:702;;28370:447;28470:6;28465:3;28458:19;28440:3;28496:4;28525:2;28520:3;28516:12;28509:19;;28551:5;28574:1;28584:208;28598:6;28595:1;28592:13;28584:208;;;-1:-1:-1;;;;;28663:26:1;28682:6;28663:26;:::i;:::-;28659:52;28647:65;;28732:12;;;;28767:15;;;;28620:1;28613:9;28584:208;;28822:1969;29119:6;29108:9;29101:25;29082:4;29145:2;29212:1;29208;29203:3;29199:11;29195:19;29187:6;29183:32;29178:2;29167:9;29163:18;29156:60;29264:4;29256:6;29252:17;29247:2;29236:9;29232:18;29225:45;29306:3;29301:2;29290:9;29286:18;29279:31;29348:3;29337:9;29333:19;29395:55;29443:6;29435;29395:55;:::i;:::-;29487:3;29466:19;;;29459:32;29526:28;;;;29612:12;29642:1;;29585:3;29570:19;;29652:270;29666:12;29663:1;29660:19;29652:270;;;29747:6;29734:20;29767:28;29789:5;29767:28;:::i;:::-;29827:13;29820:21;29808:34;;29897:15;;;;29694:1;29687:9;;;;;29862:12;;29652:270;;;29969:64;30029:2;30021:6;30017:15;30009:6;29969:64;:::i;:::-;29931:102;;;;30056:3;30052:8;30042:18;;30122:2;30110:9;30105:3;30101:19;30097:28;30091:3;30080:9;30076:19;30069:57;30149:74;30219:3;30203:14;30187;30149:74;:::i;:::-;30135:88;;;;30270:64;30330:2;30322:6;30318:15;30310:6;30270:64;:::i;:::-;30232:102;;30399:2;30387:9;30379:6;30375:22;30371:31;30365:3;30354:9;30350:19;30343:60;30426:85;30504:6;30488:14;30472;30426:85;:::i;:::-;30412:99;;;30558:64;30618:2;30610:6;30606:15;30598:6;30558:64;:::i;:::-;30520:102;;30687:2;30675:9;30667:6;30663:22;30659:31;30653:3;30642:9;30638:19;30631:60;30708:77;30778:6;30762:14;30746;30708:77;:::i;:::-;30700:85;28822:1969;-1:-1:-1;;;;;;;;;;28822:1969:1:o;30796:245::-;30863:6;30916:2;30904:9;30895:7;30891:23;30887:32;30884:52;;;30932:1;30929;30922:12;30884:52;30964:9;30958:16;30983:28;31005:5;30983:28;:::i;33098:401::-;33300:2;33282:21;;;33339:2;33319:18;;;33312:30;33378:34;33373:2;33358:18;;33351:62;-1:-1:-1;;;33444:2:1;33429:18;;33422:35;33489:3;33474:19;;33098:401::o;34624:414::-;34826:2;34808:21;;;34865:2;34845:18;;;34838:30;34904:34;34899:2;34884:18;;34877:62;-1:-1:-1;;;34970:2:1;34955:18;;34948:48;35028:3;35013:19;;34624:414::o;35389:489::-;-1:-1:-1;;;;;35658:15:1;;;35640:34;;35710:15;;35705:2;35690:18;;35683:43;35757:2;35742:18;;35735:34;;;35805:3;35800:2;35785:18;;35778:31;;;35583:4;;35826:46;;35852:19;;35844:6;35826:46;:::i;:::-;35818:54;35389:489;-1:-1:-1;;;;;;35389:489:1:o;35883:249::-;35952:6;36005:2;35993:9;35984:7;35980:23;35976:32;35973:52;;;36021:1;36018;36011:12;35973:52;36053:9;36047:16;36072:30;36096:5;36072:30;:::i;37277:128::-;37344:9;;;37365:11;;;37362:37;;;37379:18;;:::i;37410:125::-;37475:9;;;37496:10;;;37493:36;;;37509:18;;:::i;37540:127::-;37601:10;37596:3;37592:20;37589:1;37582:31;37632:4;37629:1;37622:15;37656:4;37653:1;37646:15

Swarm Source

ipfs://5c2a3bef5a6586e6ae818ff43765023c2fe1b52ff724f4306a89275c47f21e3a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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