ETH Price: $1,873.30 (-7.26%)
 

Overview

Max Total Supply

350 KONGU

Holders

116

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
202 KONGU
0x5d8e18a07166551d1c960d2cd486af2ab3fc8e41
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:
Kongu

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-18
*/

// Sources flattened with hardhat v2.12.4 https://hardhat.org

// File contracts/OperatorFilterer.sol


pragma solidity ^0.8.4;

/// @notice Optimized and flexible operator filterer to abide to OpenSea's
/// mandatory on-chain royalty enforcement in order for new collections to
/// receive royalties.
/// For more information, see:
/// See: https://github.com/ProjectOpenSea/operator-filter-registry
abstract contract OperatorFilterer {
    /// @dev The default OpenSea operator blocklist subscription.
    address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

    /// @dev The OpenSea operator filter registry.
    address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E;

    /// @dev Registers the current contract to OpenSea's operator filter,
    /// and subscribe to the default OpenSea operator blocklist.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering() internal virtual {
        _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true);
    }

    /// @dev Registers the current contract to OpenSea's operator filter.
    /// Note: Will not revert nor update existing settings for repeated registration.
    function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe)
        internal
        virtual
    {
        /// @solidity memory-safe-assembly
        assembly {
            let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`.

            // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty.
            subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy))

            for {} iszero(subscribe) {} {
                if iszero(subscriptionOrRegistrantToCopy) {
                    functionSelector := 0x4420e486 // `register(address)`.
                    break
                }
                functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`.
                break
            }
            // Store the function selector.
            mstore(0x00, shl(224, functionSelector))
            // Store the `address(this)`.
            mstore(0x04, address())
            // Store the `subscriptionOrRegistrantToCopy`.
            mstore(0x24, subscriptionOrRegistrantToCopy)
            // Register into the registry.
            if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) {
                // If the function selector has not been overwritten,
                // it is an out-of-gas error.
                if eq(shr(224, mload(0x00)), functionSelector) {
                    // To prevent gas under-estimation.
                    revert(0, 0)
                }
            }
            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, because of Solidity's memory size limits.
            mstore(0x24, 0)
        }
    }

    /// @dev Modifier to guard a function and revert if the caller is a blocked operator.
    modifier onlyAllowedOperator(address from) virtual {
        if (from != msg.sender) {
            if (!_isPriorityOperator(msg.sender)) {
                if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender);
            }
        }
        _;
    }

    /// @dev Modifier to guard a function from approving a blocked operator..
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        if (!_isPriorityOperator(operator)) {
            if (_operatorFilteringEnabled()) _revertIfBlocked(operator);
        }
        _;
    }

    /// @dev Helper function that reverts if the `operator` is blocked by the registry.
    function _revertIfBlocked(address operator) private view {
        /// @solidity memory-safe-assembly
        assembly {
            // Store the function selector of `isOperatorAllowed(address,address)`,
            // shifted left by 6 bytes, which is enough for 8tb of memory.
            // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL).
            mstore(0x00, 0xc6171134001122334455)
            // Store the `address(this)`.
            mstore(0x1a, address())
            // Store the `operator`.
            mstore(0x3a, operator)

            // `isOperatorAllowed` always returns true if it does not revert.
            if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) {
                // Bubble up the revert if the staticcall reverts.
                returndatacopy(0x00, 0x00, returndatasize())
                revert(0x00, returndatasize())
            }

            // We'll skip checking if `from` is inside the blacklist.
            // Even though that can block transferring out of wrapper contracts,
            // we don't want tokens to be stuck.

            // Restore the part of the free memory pointer that was overwritten,
            // which is guaranteed to be zero, if less than 8tb of memory is used.
            mstore(0x3a, 0)
        }
    }

    /// @dev For deriving contracts to override, so that operator filtering
    /// can be turned on / off.
    /// Returns true by default.
    function _operatorFilteringEnabled() internal view virtual returns (bool) {
        return true;
    }

    /// @dev For deriving contracts to override, so that preferred marketplaces can
    /// skip operator filtering, helping users save gas.
    /// Returns false for all inputs by default.
    function _isPriorityOperator(address) internal view virtual returns (bool) {
        return false;
    }
}


// File @openzeppelin/contracts/utils/[email protected]


// 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 @openzeppelin/contracts/access/[email protected]


// 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 @openzeppelin/contracts/utils/math/[email protected]


// 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 @openzeppelin/contracts/utils/[email protected]


// 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 @openzeppelin/contracts/utils/[email protected]


// 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 @openzeppelin/contracts/utils/introspection/[email protected]


// 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 @openzeppelin/contracts/utils/introspection/[email protected]


// 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 @openzeppelin/contracts/token/ERC721/[email protected]


// 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 @openzeppelin/contracts/token/ERC721/[email protected]


// 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 @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// 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 @openzeppelin/contracts/token/ERC721/[email protected]


// 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 @openzeppelin/contracts/utils/cryptography/[email protected]


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}


// File @openzeppelin/contracts/interfaces/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


// File @openzeppelin/contracts/token/common/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


// File contracts/kongu.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;






error InsufficientEth();
error MaxSupplyReached();
error WalletMintLimitReached();
error NotAuthorized();

contract Kongu is ERC721,ERC2981, Ownable, OperatorFilterer {
    
    using Strings for uint256;

    enum Phase{
        NONE,
        WHITELIST,
        WAITLIST,
        PUBLIC
    }

    Phase public mintingPhase;

    string public baseURI;
    string public metadataExtension = ".json";

    uint256 public totalSupply;
    uint256 constant public maxSupply = 350;
    uint256 constant public price = 0.25 ether;

    bool public operatorFilteringEnabled;

    bytes32 public wlMerkle = 0xac9ea287e28a6b9a01e90b4b5002798329590ddedf39dafb45e1bdd0526b10f3;
    bytes32 public waitlistMerkle = 0xedbec8cf8100be3c76e6cb642a053df985ea0f5b9b164254886487e7afbbeddb;

    mapping(address => uint8) public minted;

    constructor(string memory _metadata) ERC721("Kongu", "KONGU") {
        setBaseURI(_metadata);
        _registerForOperatorFiltering();
        operatorFilteringEnabled = true;

        // Set royalty receiver to the contract creator,
        _setDefaultRoyalty(msg.sender, 750);
    }

    modifier onlySender() {
        require(msg.sender == tx.origin);
        _;
    }

    modifier WLPhaseOpen() {
        require(mintingPhase == Phase.WHITELIST);
        _;
    }

    modifier WaitListPhaseOpen() {
        require(mintingPhase == Phase.WAITLIST);
        _;
    }

    modifier PublicPhaseOpen() {
        require(mintingPhase == Phase.PUBLIC);
        _;
    }

    function whitelistMint(bytes32[] calldata _merkleProof) public payable onlySender WLPhaseOpen
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        if (!MerkleProof.verify(_merkleProof, wlMerkle, leaf)) revert NotAuthorized();
        if(msg.value < price) revert InsufficientEth();
        if(minted[msg.sender] & 1 != 0) revert WalletMintLimitReached();
        if(totalSupply + 1 > maxSupply) revert MaxSupplyReached();

        minted[msg.sender] = minted[msg.sender] | 1;
        totalSupply++;
        _mint(msg.sender, totalSupply);
    }

    function waitlistMint(bytes32[] calldata _merkleProof) public payable onlySender WaitListPhaseOpen
    {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        if (!MerkleProof.verify(_merkleProof, waitlistMerkle, leaf)) revert NotAuthorized();
        if(msg.value < price) revert InsufficientEth();
        if(minted[msg.sender] & 2 != 0) revert WalletMintLimitReached();
        if(totalSupply + 1 > maxSupply) revert MaxSupplyReached();

        minted[msg.sender] = minted[msg.sender] | 1;
        totalSupply++;
        _mint(msg.sender, totalSupply);
    }

    function publicMint() public payable onlySender PublicPhaseOpen
    {
        if(msg.value < price) revert InsufficientEth();
        if(minted[msg.sender] >= 2) revert WalletMintLimitReached();
        if(totalSupply + 1 > maxSupply) revert MaxSupplyReached();

        minted[msg.sender] = minted[msg.sender] | 2;
        totalSupply++;
        _mint(msg.sender, totalSupply);
    }

    function founderReserveMint(address vaultAddress) public onlySender onlyOwner
    {
        for(int256 i=0; i<5; ++i)
        {
            totalSupply++;
            _mint(vaultAddress, totalSupply);
        }
    }

    function endSale() external onlyOwner
    {
        mintingPhase = Phase.NONE;
    }
    function openWhiteList() external onlyOwner
    {
        mintingPhase = Phase.WHITELIST;
    }
    function openWaitList() external onlyOwner
    {
        mintingPhase = Phase.WAITLIST;
    }
    function openPublic() external onlyOwner
    {
        mintingPhase = Phase.PUBLIC;
    }

    function changeWLMerkle(bytes32 _wlMerkle) external onlyOwner
    {
        wlMerkle = _wlMerkle;
    }

    function changeWaitListMerkle(bytes32 _waitListMerkle) external onlyOwner
    {
        waitlistMerkle = _waitListMerkle;
    }
    
    function withdrawEther(address to) external onlyOwner {
        uint256 balance = address(this).balance;
        if (balance == 0) revert InsufficientEth();
        (bool callSuccess, ) = payable(to).call{value: balance}("");
        require(callSuccess, "Withdraw failed");
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked(currentBaseURI, tokenId.toString(), metadataExtension )): "";
    }

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

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

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

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

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

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override (ERC721, ERC2981)
        returns (bool)
    {
        // Supports the following `interfaceId`s:
        // - IERC165: 0x01ffc9a7
        // - IERC721: 0x80ac58cd
        // - IERC721Metadata: 0x5b5e139f
        // - IERC2981: 0x2a55205a
        return ERC721.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId);
    }

    function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    function setOperatorFilteringEnabled(bool value) public onlyOwner {
        operatorFilteringEnabled = value;
    }

    function _operatorFilteringEnabled() internal view override returns (bool) {
        return operatorFilteringEnabled;
    }

    function _isPriorityOperator(address operator) internal pure override returns (bool) {
        // OpenSea Seaport Conduit:
        return operator == address(0x1E0049783F008A0085193E00003D00cd54003c71);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_metadata","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientEth","type":"error"},{"inputs":[],"name":"MaxSupplyReached","type":"error"},{"inputs":[],"name":"NotAuthorized","type":"error"},{"inputs":[],"name":"WalletMintLimitReached","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_wlMerkle","type":"bytes32"}],"name":"changeWLMerkle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_waitListMerkle","type":"bytes32"}],"name":"changeWaitListMerkle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vaultAddress","type":"address"}],"name":"founderReserveMint","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":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPhase","outputs":[{"internalType":"enum Kongu.Phase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openWaitList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"waitlistMerkle","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"waitlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMerkle","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90816200004a91906200084d565b507fac9ea287e28a6b9a01e90b4b5002798329590ddedf39dafb45e1bdd0526b10f360001b600d557fedbec8cf8100be3c76e6cb642a053df985ea0f5b9b164254886487e7afbbeddb60001b600e55348015620000a657600080fd5b5060405162005b3e38038062005b3e8339818101604052810190620000cc919062000a98565b6040518060400160405280600581526020017f4b6f6e67750000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4b4f4e475500000000000000000000000000000000000000000000000000000081525081600090816200014991906200084d565b5080600190816200015b91906200084d565b5050506200017e62000172620001d560201b60201c565b620001dd60201b60201c565b6200018f81620002a360201b60201c565b6200019f620002c860201b60201c565b6001600c60006101000a81548160ff021916908315150217905550620001ce336102ee620002f160201b60201c565b5062000c76565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002b36200049460201b60201c565b8060099081620002c491906200084d565b5050565b620002ef733cc6cdda760b79bafa08df41ecfa224f810dceb660016200052560201b60201c565b565b620003016200059f60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000362576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003599062000b70565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620003d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cb9062000be2565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b620004a4620001d560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004ca620005a960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000523576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200051a9062000c54565b60405180910390fd5b565b637d3e3dbe8260601b60601c9250816200055457826200054c57634420e486905062000554565b63a0af290390505b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af162000595578060005160e01c036200059457600080fd5b5b6000602452505050565b6000612710905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065557607f821691505b6020821081036200066b576200066a6200060d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000696565b620006e1868362000696565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200072e620007286200072284620006f9565b62000703565b620006f9565b9050919050565b6000819050919050565b6200074a836200070d565b62000762620007598262000735565b848454620006a3565b825550505050565b600090565b620007796200076a565b620007868184846200073f565b505050565b5b81811015620007ae57620007a26000826200076f565b6001810190506200078c565b5050565b601f821115620007fd57620007c78162000671565b620007d28462000686565b81016020851015620007e2578190505b620007fa620007f18562000686565b8301826200078b565b50505b505050565b600082821c905092915050565b6000620008226000198460080262000802565b1980831691505092915050565b60006200083d83836200080f565b9150826002028217905092915050565b6200085882620005d3565b67ffffffffffffffff811115620008745762000873620005de565b5b6200088082546200063c565b6200088d828285620007b2565b600060209050601f831160018114620008c55760008415620008b0578287015190505b620008bc85826200082f565b8655506200092c565b601f198416620008d58662000671565b60005b82811015620008ff57848901518255600182019150602085019450602081019050620008d8565b868310156200091f57848901516200091b601f8916826200080f565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6200096e8262000952565b810181811067ffffffffffffffff8211171562000990576200098f620005de565b5b80604052505050565b6000620009a562000934565b9050620009b3828262000963565b919050565b600067ffffffffffffffff821115620009d657620009d5620005de565b5b620009e18262000952565b9050602081019050919050565b60005b8381101562000a0e578082015181840152602081019050620009f1565b60008484015250505050565b600062000a3162000a2b84620009b8565b62000999565b90508281526020810184848401111562000a505762000a4f6200094d565b5b62000a5d848285620009ee565b509392505050565b600082601f83011262000a7d5762000a7c62000948565b5b815162000a8f84826020860162000a1a565b91505092915050565b60006020828403121562000ab15762000ab06200093e565b5b600082015167ffffffffffffffff81111562000ad25762000ad162000943565b5b62000ae08482850162000a65565b91505092915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000b58602a8362000ae9565b915062000b658262000afa565b604082019050919050565b6000602082019050818103600083015262000b8b8162000b49565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000bca60198362000ae9565b915062000bd78262000b92565b602082019050919050565b6000602082019050818103600083015262000bfd8162000bbb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000c3c60208362000ae9565b915062000c498262000c04565b602082019050919050565b6000602082019050818103600083015262000c6f8162000c2d565b9050919050565b614eb88062000c866000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063b4cbf95b116100b6578063d4dfa97c1161007a578063d4dfa97c146107f0578063d5abeb011461081b578063e985e9c514610846578063ebf72a5f14610883578063f2fde38b146108ae578063fb796e6c146108d757610246565b8063b4cbf95b14610721578063b7c0b8e81461074a578063b88d4fde14610773578063c87b56dd1461079c578063cea1bb36146107d957610246565b806395d89b41116100fd57806395d89b411461065d5780639dfbfa1714610688578063a035b1fe146106a4578063a22cb465146106cf578063af933b57146106f857610246565b8063715018a6146105b0578063768640ec146105c75780637e5ac09a146105de5780638da5cb5b14610609578063921c714d1461063457610246565b80632a55205a116101c757806342842e0e1161018b57806342842e0e146104b957806355f804b3146104e25780636352211e1461050b5780636c0360eb1461054857806370a082311461057357610246565b80632a55205a14610408578063324a21b414610446578063372f657c1461046f578063380d831b1461048b5780633fc80006146104a257610246565b80630989e22c1161020e5780630989e22c1461034257806318160ddd1461036d5780631e7269c51461039857806323b872dd146103d557806326092b83146103fe57610246565b806301ffc9a71461024b57806304634d8d1461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613529565b610902565b60405161027f9190613571565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa919061362e565b610924565b005b3480156102bd57600080fd5b506102c661093a565b6040516102d391906136fe565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613756565b6109cc565b6040516103109190613792565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906137ad565b610a12565b005b34801561034e57600080fd5b50610357610a47565b6040516103649190613806565b60405180910390f35b34801561037957600080fd5b50610382610a4d565b60405161038f9190613830565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba919061384b565b610a53565b6040516103cc9190613894565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f791906138af565b610a73565b005b610406610ade565b005b34801561041457600080fd5b5061042f600480360381019061042a9190613902565b610d37565b60405161043d929190613942565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613997565b610f21565b005b61048960048036038101906104849190613a29565b610f33565b005b34801561049757600080fd5b506104a0611242565b005b3480156104ae57600080fd5b506104b7611277565b005b3480156104c557600080fd5b506104e060048036038101906104db91906138af565b6112ac565b005b3480156104ee57600080fd5b5061050960048036038101906105049190613ba6565b611317565b005b34801561051757600080fd5b50610532600480360381019061052d9190613756565b611332565b60405161053f9190613792565b60405180910390f35b34801561055457600080fd5b5061055d6113b8565b60405161056a91906136fe565b60405180910390f35b34801561057f57600080fd5b5061059a6004803603810190610595919061384b565b611446565b6040516105a79190613830565b60405180910390f35b3480156105bc57600080fd5b506105c56114fd565b005b3480156105d357600080fd5b506105dc611511565b005b3480156105ea57600080fd5b506105f3611546565b6040516106009190613c66565b60405180910390f35b34801561061557600080fd5b5061061e611559565b60405161062b9190613792565b60405180910390f35b34801561064057600080fd5b5061065b6004803603810190610656919061384b565b611583565b005b34801561066957600080fd5b50610672611608565b60405161067f91906136fe565b60405180910390f35b6106a2600480360381019061069d9190613a29565b61169a565b005b3480156106b057600080fd5b506106b96119a9565b6040516106c69190613830565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190613cad565b6119b5565b005b34801561070457600080fd5b5061071f600480360381019061071a919061384b565b6119ea565b005b34801561072d57600080fd5b5061074860048036038101906107439190613997565b611ae2565b005b34801561075657600080fd5b50610771600480360381019061076c9190613ced565b611af4565b005b34801561077f57600080fd5b5061079a60048036038101906107959190613dbb565b611b19565b005b3480156107a857600080fd5b506107c360048036038101906107be9190613756565b611b86565b6040516107d091906136fe565b60405180910390f35b3480156107e557600080fd5b506107ee611c30565b005b3480156107fc57600080fd5b50610805611c65565b6040516108129190613806565b60405180910390f35b34801561082757600080fd5b50610830611c6b565b60405161083d9190613830565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613e3e565b611c71565b60405161087a9190613571565b60405180910390f35b34801561088f57600080fd5b50610898611d05565b6040516108a591906136fe565b60405180910390f35b3480156108ba57600080fd5b506108d560048036038101906108d0919061384b565b611d93565b005b3480156108e357600080fd5b506108ec611e16565b6040516108f99190613571565b60405180910390f35b600061090d82611e29565b8061091d575061091c82611f0b565b5b9050919050565b61092c611f85565b6109368282612003565b5050565b60606000805461094990613ead565b80601f016020809104026020016040519081016040528092919081815260200182805461097590613ead565b80156109c25780601f10610997576101008083540402835291602001916109c2565b820191906000526020600020905b8154815290600101906020018083116109a557829003601f168201915b5050505050905090565b60006109d782612198565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a1c816121e3565b610a3857610a2861222f565b15610a3757610a3681612246565b5b5b610a42838361228a565b505050565b600e5481565b600b5481565b600f6020528060005260406000206000915054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610acd57610ab0336121e3565b610acc57610abc61222f565b15610acb57610aca33612246565b5b5b5b610ad88484846123a1565b50505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b1657600080fd5b600380811115610b2957610b28613bef565b5b600860149054906101000a900460ff166003811115610b4b57610b4a613bef565b5b14610b5557600080fd5b6703782dace9d90000341015610b97576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1610610c20576040517f268de8bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61015e6001600b54610c329190613f0d565b1115610c6a576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1617600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600b6000815480929190610d2490613f41565b9190505550610d3533600b54612401565b565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ecc5760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ed661261e565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f029190613f89565b610f0c9190613ffa565b90508160000151819350935050509250929050565b610f29611f85565b80600d8190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f6b57600080fd5b60016003811115610f7f57610f7e613bef565b5b600860149054906101000a900460ff166003811115610fa157610fa0613bef565b5b14610fab57600080fd5b600033604051602001610fbe9190614073565b604051602081830303815290604052805190602001209050611024838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483612628565b61105a576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6703782dace9d9000034101561109c576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161660ff1614611128576040517f268de8bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61015e6001600b5461113a9190613f0d565b1115611172576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1617600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600b600081548092919061122c90613f41565b919050555061123d33600b54612401565b505050565b61124a611f85565b6000600860146101000a81548160ff021916908360038111156112705761126f613bef565b5b0217905550565b61127f611f85565b6003600860146101000a81548160ff021916908360038111156112a5576112a4613bef565b5b0217905550565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611306576112e9336121e3565b611305576112f561222f565b156113045761130333612246565b5b5b5b61131184848461263f565b50505050565b61131f611f85565b806009908161132e919061423a565b5050565b60008061133e8361265f565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690614358565b60405180910390fd5b80915050919050565b600980546113c590613ead565b80601f01602080910402602001604051908101604052809291908181526020018280546113f190613ead565b801561143e5780601f106114135761010080835404028352916020019161143e565b820191906000526020600020905b81548152906001019060200180831161142157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ad906143ea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611505611f85565b61150f600061269c565b565b611519611f85565b6001600860146101000a81548160ff0219169083600381111561153f5761153e613bef565b5b0217905550565b600860149054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115bb57600080fd5b6115c3611f85565b60005b600581121561160457600b60008154809291906115e290613f41565b91905055506115f382600b54612401565b806115fd90614414565b90506115c6565b5050565b60606001805461161790613ead565b80601f016020809104026020016040519081016040528092919081815260200182805461164390613ead565b80156116905780601f1061166557610100808354040283529160200191611690565b820191906000526020600020905b81548152906001019060200180831161167357829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116d257600080fd5b600260038111156116e6576116e5613bef565b5b600860149054906101000a900460ff16600381111561170857611707613bef565b5b1461171257600080fd5b6000336040516020016117259190614073565b60405160208183030381529060405280519060200120905061178b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612628565b6117c1576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6703782dace9d90000341015611803576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161660ff161461188f576040517f268de8bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61015e6001600b546118a19190613f0d565b11156118d9576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1617600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600b600081548092919061199390613f41565b91905055506119a433600b54612401565b505050565b6703782dace9d9000081565b816119bf816121e3565b6119db576119cb61222f565b156119da576119d981612246565b5b5b6119e58383612762565b505050565b6119f2611f85565b600047905060008103611a31576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611a579061448d565b60006040518083038185875af1925050503d8060008114611a94576040519150601f19603f3d011682016040523d82523d6000602084013e611a99565b606091505b5050905080611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad4906144ee565b60405180910390fd5b505050565b611aea611f85565b80600e8190555050565b611afc611f85565b80600c60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b7357611b56336121e3565b611b7257611b6261222f565b15611b7157611b7033612246565b5b5b5b611b7f85858585612778565b5050505050565b6060611b91826127da565b611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790614580565b60405180910390fd5b6000611bda61281b565b90506000815111611bfa5760405180602001604052806000815250611c28565b80611c04846128ad565b600a604051602001611c189392919061465f565b6040516020818303038152906040525b915050919050565b611c38611f85565b6002600860146101000a81548160ff02191690836003811115611c5e57611c5d613bef565b5b0217905550565b600d5481565b61015e81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8054611d1290613ead565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3e90613ead565b8015611d8b5780601f10611d6057610100808354040283529160200191611d8b565b820191906000526020600020905b815481529060010190602001808311611d6e57829003601f168201915b505050505081565b611d9b611f85565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190614702565b60405180910390fd5b611e138161269c565b50565b600c60009054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ef457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f045750611f038261297b565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f7e5750611f7d82611e29565b5b9050919050565b611f8d6129e5565b73ffffffffffffffffffffffffffffffffffffffff16611fab611559565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff89061476e565b60405180910390fd5b565b61200b61261e565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206090614800565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf9061486c565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6121a1816127da565b6121e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d790614358565b60405180910390fd5b50565b6000731e0049783f008a0085193e00003d00cd54003c7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600c60009054906101000a900460ff16905090565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa612282573d6000803e3d6000fd5b6000603a5250565b600061229582611332565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc906148fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166123246129e5565b73ffffffffffffffffffffffffffffffffffffffff16148061235357506123528161234d6129e5565b611c71565b5b612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238990614990565b60405180910390fd5b61239c83836129ed565b505050565b6123b26123ac6129e5565b82612aa6565b6123f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e890614a22565b60405180910390fd5b6123fc838383612b3b565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246790614a8e565b60405180910390fd5b612479816127da565b156124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b090614afa565b60405180910390fd5b6124c7600083836001612e34565b6124d0816127da565b15612510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250790614afa565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261a600083836001612f5a565b5050565b6000612710905090565b6000826126358584612f60565b1490509392505050565b61265a83838360405180602001604052806000815250611b19565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61277461276d6129e5565b8383612fb6565b5050565b6127896127836129e5565b83612aa6565b6127c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bf90614a22565b60405180910390fd5b6127d484848484613122565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166127fc8361265f565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606009805461282a90613ead565b80601f016020809104026020016040519081016040528092919081815260200182805461285690613ead565b80156128a35780601f10612878576101008083540402835291602001916128a3565b820191906000526020600020905b81548152906001019060200180831161288657829003601f168201915b5050505050905090565b6060600060016128bc8461317e565b01905060008167ffffffffffffffff8111156128db576128da613a7b565b5b6040519080825280601f01601f19166020018201604052801561290d5781602001600182028036833780820191505090505b509050600082602001820190505b600115612970578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161296457612963613fcb565b5b0494506000850361291b575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a6083611332565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612ab283611332565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612af45750612af38185611c71565b5b80612b3257508373ffffffffffffffffffffffffffffffffffffffff16612b1a846109cc565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b5b82611332565b73ffffffffffffffffffffffffffffffffffffffff1614612bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba890614b8c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1790614c1e565b60405180910390fd5b612c2d8383836001612e34565b8273ffffffffffffffffffffffffffffffffffffffff16612c4d82611332565b73ffffffffffffffffffffffffffffffffffffffff1614612ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9a90614b8c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e2f8383836001612f5a565b505050565b6001811115612f5457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612ec85780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ec09190614c3e565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f535780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f4b9190613f0d565b925050819055505b5b50505050565b50505050565b60008082905060005b8451811015612fab57612f9682868381518110612f8957612f88614c72565b5b60200260200101516132d1565b91508080612fa390613f41565b915050612f69565b508091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301b90614ced565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516131159190613571565b60405180910390a3505050565b61312d848484612b3b565b613139848484846132fc565b613178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316f90614d7f565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106131dc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816131d2576131d1613fcb565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613219576d04ee2d6d415b85acef8100000000838161320f5761320e613fcb565b5b0492506020810190505b662386f26fc10000831061324857662386f26fc10000838161323e5761323d613fcb565b5b0492506010810190505b6305f5e1008310613271576305f5e100838161326757613266613fcb565b5b0492506008810190505b612710831061329657612710838161328c5761328b613fcb565b5b0492506004810190505b606483106132b957606483816132af576132ae613fcb565b5b0492506002810190505b600a83106132c8576001810190505b80915050919050565b60008183106132e9576132e48284613483565b6132f4565b6132f38383613483565b5b905092915050565b600061331d8473ffffffffffffffffffffffffffffffffffffffff1661349a565b15613476578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133466129e5565b8786866040518563ffffffff1660e01b81526004016133689493929190614df4565b6020604051808303816000875af19250505080156133a457506040513d601f19601f820116820180604052508101906133a19190614e55565b60015b613426573d80600081146133d4576040519150601f19603f3d011682016040523d82523d6000602084013e6133d9565b606091505b50600081510361341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341590614d7f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061347b565b600190505b949350505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613506816134d1565b811461351157600080fd5b50565b600081359050613523816134fd565b92915050565b60006020828403121561353f5761353e6134c7565b5b600061354d84828501613514565b91505092915050565b60008115159050919050565b61356b81613556565b82525050565b60006020820190506135866000830184613562565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135b78261358c565b9050919050565b6135c7816135ac565b81146135d257600080fd5b50565b6000813590506135e4816135be565b92915050565b60006bffffffffffffffffffffffff82169050919050565b61360b816135ea565b811461361657600080fd5b50565b60008135905061362881613602565b92915050565b60008060408385031215613645576136446134c7565b5b6000613653858286016135d5565b925050602061366485828601613619565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136a857808201518184015260208101905061368d565b60008484015250505050565b6000601f19601f8301169050919050565b60006136d08261366e565b6136da8185613679565b93506136ea81856020860161368a565b6136f3816136b4565b840191505092915050565b6000602082019050818103600083015261371881846136c5565b905092915050565b6000819050919050565b61373381613720565b811461373e57600080fd5b50565b6000813590506137508161372a565b92915050565b60006020828403121561376c5761376b6134c7565b5b600061377a84828501613741565b91505092915050565b61378c816135ac565b82525050565b60006020820190506137a76000830184613783565b92915050565b600080604083850312156137c4576137c36134c7565b5b60006137d2858286016135d5565b92505060206137e385828601613741565b9150509250929050565b6000819050919050565b613800816137ed565b82525050565b600060208201905061381b60008301846137f7565b92915050565b61382a81613720565b82525050565b60006020820190506138456000830184613821565b92915050565b600060208284031215613861576138606134c7565b5b600061386f848285016135d5565b91505092915050565b600060ff82169050919050565b61388e81613878565b82525050565b60006020820190506138a96000830184613885565b92915050565b6000806000606084860312156138c8576138c76134c7565b5b60006138d6868287016135d5565b93505060206138e7868287016135d5565b92505060406138f886828701613741565b9150509250925092565b60008060408385031215613919576139186134c7565b5b600061392785828601613741565b925050602061393885828601613741565b9150509250929050565b60006040820190506139576000830185613783565b6139646020830184613821565b9392505050565b613974816137ed565b811461397f57600080fd5b50565b6000813590506139918161396b565b92915050565b6000602082840312156139ad576139ac6134c7565b5b60006139bb84828501613982565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126139e9576139e86139c4565b5b8235905067ffffffffffffffff811115613a0657613a056139c9565b5b602083019150836020820283011115613a2257613a216139ce565b5b9250929050565b60008060208385031215613a4057613a3f6134c7565b5b600083013567ffffffffffffffff811115613a5e57613a5d6134cc565b5b613a6a858286016139d3565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ab3826136b4565b810181811067ffffffffffffffff82111715613ad257613ad1613a7b565b5b80604052505050565b6000613ae56134bd565b9050613af18282613aaa565b919050565b600067ffffffffffffffff821115613b1157613b10613a7b565b5b613b1a826136b4565b9050602081019050919050565b82818337600083830152505050565b6000613b49613b4484613af6565b613adb565b905082815260208101848484011115613b6557613b64613a76565b5b613b70848285613b27565b509392505050565b600082601f830112613b8d57613b8c6139c4565b5b8135613b9d848260208601613b36565b91505092915050565b600060208284031215613bbc57613bbb6134c7565b5b600082013567ffffffffffffffff811115613bda57613bd96134cc565b5b613be684828501613b78565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613c2f57613c2e613bef565b5b50565b6000819050613c4082613c1e565b919050565b6000613c5082613c32565b9050919050565b613c6081613c45565b82525050565b6000602082019050613c7b6000830184613c57565b92915050565b613c8a81613556565b8114613c9557600080fd5b50565b600081359050613ca781613c81565b92915050565b60008060408385031215613cc457613cc36134c7565b5b6000613cd2858286016135d5565b9250506020613ce385828601613c98565b9150509250929050565b600060208284031215613d0357613d026134c7565b5b6000613d1184828501613c98565b91505092915050565b600067ffffffffffffffff821115613d3557613d34613a7b565b5b613d3e826136b4565b9050602081019050919050565b6000613d5e613d5984613d1a565b613adb565b905082815260208101848484011115613d7a57613d79613a76565b5b613d85848285613b27565b509392505050565b600082601f830112613da257613da16139c4565b5b8135613db2848260208601613d4b565b91505092915050565b60008060008060808587031215613dd557613dd46134c7565b5b6000613de3878288016135d5565b9450506020613df4878288016135d5565b9350506040613e0587828801613741565b925050606085013567ffffffffffffffff811115613e2657613e256134cc565b5b613e3287828801613d8d565b91505092959194509250565b60008060408385031215613e5557613e546134c7565b5b6000613e63858286016135d5565b9250506020613e74858286016135d5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ec557607f821691505b602082108103613ed857613ed7613e7e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f1882613720565b9150613f2383613720565b9250828201905080821115613f3b57613f3a613ede565b5b92915050565b6000613f4c82613720565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f7e57613f7d613ede565b5b600182019050919050565b6000613f9482613720565b9150613f9f83613720565b9250828202613fad81613720565b91508282048414831517613fc457613fc3613ede565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061400582613720565b915061401083613720565b9250826140205761401f613fcb565b5b828204905092915050565b60008160601b9050919050565b60006140438261402b565b9050919050565b600061405582614038565b9050919050565b61406d614068826135ac565b61404a565b82525050565b600061407f828461405c565b60148201915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140f07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140b3565b6140fa86836140b3565b95508019841693508086168417925050509392505050565b6000819050919050565b600061413761413261412d84613720565b614112565b613720565b9050919050565b6000819050919050565b6141518361411c565b61416561415d8261413e565b8484546140c0565b825550505050565b600090565b61417a61416d565b614185818484614148565b505050565b5b818110156141a95761419e600082614172565b60018101905061418b565b5050565b601f8211156141ee576141bf8161408e565b6141c8846140a3565b810160208510156141d7578190505b6141eb6141e3856140a3565b83018261418a565b50505b505050565b600082821c905092915050565b6000614211600019846008026141f3565b1980831691505092915050565b600061422a8383614200565b9150826002028217905092915050565b6142438261366e565b67ffffffffffffffff81111561425c5761425b613a7b565b5b6142668254613ead565b6142718282856141ad565b600060209050601f8311600181146142a45760008415614292578287015190505b61429c858261421e565b865550614304565b601f1984166142b28661408e565b60005b828110156142da578489015182556001820191506020850194506020810190506142b5565b868310156142f757848901516142f3601f891682614200565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614342601883613679565b915061434d8261430c565b602082019050919050565b6000602082019050818103600083015261437181614335565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006143d4602983613679565b91506143df82614378565b604082019050919050565b60006020820190508181036000830152614403816143c7565b9050919050565b6000819050919050565b600061441f8261440a565b91507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361445157614450613ede565b5b600182019050919050565b600081905092915050565b50565b600061447760008361445c565b915061448282614467565b600082019050919050565b60006144988261446a565b9150819050919050565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b60006144d8600f83613679565b91506144e3826144a2565b602082019050919050565b60006020820190508181036000830152614507816144cb565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061456a602f83613679565b91506145758261450e565b604082019050919050565b600060208201905081810360008301526145998161455d565b9050919050565b600081905092915050565b60006145b68261366e565b6145c081856145a0565b93506145d081856020860161368a565b80840191505092915050565b600081546145e981613ead565b6145f381866145a0565b9450600182166000811461460e576001811461462357614656565b60ff1983168652811515820286019350614656565b61462c8561408e565b60005b8381101561464e5781548189015260018201915060208101905061462f565b838801955050505b50505092915050565b600061466b82866145ab565b915061467782856145ab565b915061468382846145dc565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146ec602683613679565b91506146f782614690565b604082019050919050565b6000602082019050818103600083015261471b816146df565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614758602083613679565b915061476382614722565b602082019050919050565b600060208201905081810360008301526147878161474b565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006147ea602a83613679565b91506147f58261478e565b604082019050919050565b60006020820190508181036000830152614819816147dd565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614856601983613679565b915061486182614820565b602082019050919050565b6000602082019050818103600083015261488581614849565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006148e8602183613679565b91506148f38261488c565b604082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061497a603d83613679565b91506149858261491e565b604082019050919050565b600060208201905081810360008301526149a98161496d565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614a0c602d83613679565b9150614a17826149b0565b604082019050919050565b60006020820190508181036000830152614a3b816149ff565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a78602083613679565b9150614a8382614a42565b602082019050919050565b60006020820190508181036000830152614aa781614a6b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614ae4601c83613679565b9150614aef82614aae565b602082019050919050565b60006020820190508181036000830152614b1381614ad7565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b76602583613679565b9150614b8182614b1a565b604082019050919050565b60006020820190508181036000830152614ba581614b69565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c08602483613679565b9150614c1382614bac565b604082019050919050565b60006020820190508181036000830152614c3781614bfb565b9050919050565b6000614c4982613720565b9150614c5483613720565b9250828203905081811115614c6c57614c6b613ede565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614cd7601983613679565b9150614ce282614ca1565b602082019050919050565b60006020820190508181036000830152614d0681614cca565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d69603283613679565b9150614d7482614d0d565b604082019050919050565b60006020820190508181036000830152614d9881614d5c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614dc682614d9f565b614dd08185614daa565b9350614de081856020860161368a565b614de9816136b4565b840191505092915050565b6000608082019050614e096000830187613783565b614e166020830186613783565b614e236040830185613821565b8181036060830152614e358184614dbb565b905095945050505050565b600081519050614e4f816134fd565b92915050565b600060208284031215614e6b57614e6a6134c7565b5b6000614e7984828501614e40565b9150509291505056fea2646970667358221220a72125ffe56db9b8149e3c79fb9496ac0d658b1a5bd689bd5977fe94c93744f964736f6c634300081100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f6b6f6e67752e6d7970696e6174612e636c6f75642f697066732f516d654855567534397a3471437868686132366474693759446f676575363536596b7534367351677150387776782f000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c8063715018a611610139578063b4cbf95b116100b6578063d4dfa97c1161007a578063d4dfa97c146107f0578063d5abeb011461081b578063e985e9c514610846578063ebf72a5f14610883578063f2fde38b146108ae578063fb796e6c146108d757610246565b8063b4cbf95b14610721578063b7c0b8e81461074a578063b88d4fde14610773578063c87b56dd1461079c578063cea1bb36146107d957610246565b806395d89b41116100fd57806395d89b411461065d5780639dfbfa1714610688578063a035b1fe146106a4578063a22cb465146106cf578063af933b57146106f857610246565b8063715018a6146105b0578063768640ec146105c75780637e5ac09a146105de5780638da5cb5b14610609578063921c714d1461063457610246565b80632a55205a116101c757806342842e0e1161018b57806342842e0e146104b957806355f804b3146104e25780636352211e1461050b5780636c0360eb1461054857806370a082311461057357610246565b80632a55205a14610408578063324a21b414610446578063372f657c1461046f578063380d831b1461048b5780633fc80006146104a257610246565b80630989e22c1161020e5780630989e22c1461034257806318160ddd1461036d5780631e7269c51461039857806323b872dd146103d557806326092b83146103fe57610246565b806301ffc9a71461024b57806304634d8d1461028857806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613529565b610902565b60405161027f9190613571565b60405180910390f35b34801561029457600080fd5b506102af60048036038101906102aa919061362e565b610924565b005b3480156102bd57600080fd5b506102c661093a565b6040516102d391906136fe565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613756565b6109cc565b6040516103109190613792565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906137ad565b610a12565b005b34801561034e57600080fd5b50610357610a47565b6040516103649190613806565b60405180910390f35b34801561037957600080fd5b50610382610a4d565b60405161038f9190613830565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba919061384b565b610a53565b6040516103cc9190613894565b60405180910390f35b3480156103e157600080fd5b506103fc60048036038101906103f791906138af565b610a73565b005b610406610ade565b005b34801561041457600080fd5b5061042f600480360381019061042a9190613902565b610d37565b60405161043d929190613942565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613997565b610f21565b005b61048960048036038101906104849190613a29565b610f33565b005b34801561049757600080fd5b506104a0611242565b005b3480156104ae57600080fd5b506104b7611277565b005b3480156104c557600080fd5b506104e060048036038101906104db91906138af565b6112ac565b005b3480156104ee57600080fd5b5061050960048036038101906105049190613ba6565b611317565b005b34801561051757600080fd5b50610532600480360381019061052d9190613756565b611332565b60405161053f9190613792565b60405180910390f35b34801561055457600080fd5b5061055d6113b8565b60405161056a91906136fe565b60405180910390f35b34801561057f57600080fd5b5061059a6004803603810190610595919061384b565b611446565b6040516105a79190613830565b60405180910390f35b3480156105bc57600080fd5b506105c56114fd565b005b3480156105d357600080fd5b506105dc611511565b005b3480156105ea57600080fd5b506105f3611546565b6040516106009190613c66565b60405180910390f35b34801561061557600080fd5b5061061e611559565b60405161062b9190613792565b60405180910390f35b34801561064057600080fd5b5061065b6004803603810190610656919061384b565b611583565b005b34801561066957600080fd5b50610672611608565b60405161067f91906136fe565b60405180910390f35b6106a2600480360381019061069d9190613a29565b61169a565b005b3480156106b057600080fd5b506106b96119a9565b6040516106c69190613830565b60405180910390f35b3480156106db57600080fd5b506106f660048036038101906106f19190613cad565b6119b5565b005b34801561070457600080fd5b5061071f600480360381019061071a919061384b565b6119ea565b005b34801561072d57600080fd5b5061074860048036038101906107439190613997565b611ae2565b005b34801561075657600080fd5b50610771600480360381019061076c9190613ced565b611af4565b005b34801561077f57600080fd5b5061079a60048036038101906107959190613dbb565b611b19565b005b3480156107a857600080fd5b506107c360048036038101906107be9190613756565b611b86565b6040516107d091906136fe565b60405180910390f35b3480156107e557600080fd5b506107ee611c30565b005b3480156107fc57600080fd5b50610805611c65565b6040516108129190613806565b60405180910390f35b34801561082757600080fd5b50610830611c6b565b60405161083d9190613830565b60405180910390f35b34801561085257600080fd5b5061086d60048036038101906108689190613e3e565b611c71565b60405161087a9190613571565b60405180910390f35b34801561088f57600080fd5b50610898611d05565b6040516108a591906136fe565b60405180910390f35b3480156108ba57600080fd5b506108d560048036038101906108d0919061384b565b611d93565b005b3480156108e357600080fd5b506108ec611e16565b6040516108f99190613571565b60405180910390f35b600061090d82611e29565b8061091d575061091c82611f0b565b5b9050919050565b61092c611f85565b6109368282612003565b5050565b60606000805461094990613ead565b80601f016020809104026020016040519081016040528092919081815260200182805461097590613ead565b80156109c25780601f10610997576101008083540402835291602001916109c2565b820191906000526020600020905b8154815290600101906020018083116109a557829003601f168201915b5050505050905090565b60006109d782612198565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a1c816121e3565b610a3857610a2861222f565b15610a3757610a3681612246565b5b5b610a42838361228a565b505050565b600e5481565b600b5481565b600f6020528060005260406000206000915054906101000a900460ff1681565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610acd57610ab0336121e3565b610acc57610abc61222f565b15610acb57610aca33612246565b5b5b5b610ad88484846123a1565b50505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b1657600080fd5b600380811115610b2957610b28613bef565b5b600860149054906101000a900460ff166003811115610b4b57610b4a613bef565b5b14610b5557600080fd5b6703782dace9d90000341015610b97576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1610610c20576040517f268de8bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61015e6001600b54610c329190613f0d565b1115610c6a576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1617600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600b6000815480929190610d2490613f41565b9190505550610d3533600b54612401565b565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ecc5760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610ed661261e565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610f029190613f89565b610f0c9190613ffa565b90508160000151819350935050509250929050565b610f29611f85565b80600d8190555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f6b57600080fd5b60016003811115610f7f57610f7e613bef565b5b600860149054906101000a900460ff166003811115610fa157610fa0613bef565b5b14610fab57600080fd5b600033604051602001610fbe9190614073565b604051602081830303815290604052805190602001209050611024838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d5483612628565b61105a576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6703782dace9d9000034101561109c576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161660ff1614611128576040517f268de8bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61015e6001600b5461113a9190613f0d565b1115611172576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1617600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600b600081548092919061122c90613f41565b919050555061123d33600b54612401565b505050565b61124a611f85565b6000600860146101000a81548160ff021916908360038111156112705761126f613bef565b5b0217905550565b61127f611f85565b6003600860146101000a81548160ff021916908360038111156112a5576112a4613bef565b5b0217905550565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611306576112e9336121e3565b611305576112f561222f565b156113045761130333612246565b5b5b5b61131184848461263f565b50505050565b61131f611f85565b806009908161132e919061423a565b5050565b60008061133e8361265f565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a690614358565b60405180910390fd5b80915050919050565b600980546113c590613ead565b80601f01602080910402602001604051908101604052809291908181526020018280546113f190613ead565b801561143e5780601f106114135761010080835404028352916020019161143e565b820191906000526020600020905b81548152906001019060200180831161142157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ad906143ea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611505611f85565b61150f600061269c565b565b611519611f85565b6001600860146101000a81548160ff0219169083600381111561153f5761153e613bef565b5b0217905550565b600860149054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115bb57600080fd5b6115c3611f85565b60005b600581121561160457600b60008154809291906115e290613f41565b91905055506115f382600b54612401565b806115fd90614414565b90506115c6565b5050565b60606001805461161790613ead565b80601f016020809104026020016040519081016040528092919081815260200182805461164390613ead565b80156116905780601f1061166557610100808354040283529160200191611690565b820191906000526020600020905b81548152906001019060200180831161167357829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116d257600080fd5b600260038111156116e6576116e5613bef565b5b600860149054906101000a900460ff16600381111561170857611707613bef565b5b1461171257600080fd5b6000336040516020016117259190614073565b60405160208183030381529060405280519060200120905061178b838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483612628565b6117c1576040517fea8e4eb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6703782dace9d90000341015611803576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161660ff161461188f576040517f268de8bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61015e6001600b546118a19190613f0d565b11156118d9576040517fd05cb60900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1617600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550600b600081548092919061199390613f41565b91905055506119a433600b54612401565b505050565b6703782dace9d9000081565b816119bf816121e3565b6119db576119cb61222f565b156119da576119d981612246565b5b5b6119e58383612762565b505050565b6119f2611f85565b600047905060008103611a31576040517fa01a9df600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611a579061448d565b60006040518083038185875af1925050503d8060008114611a94576040519150601f19603f3d011682016040523d82523d6000602084013e611a99565b606091505b5050905080611add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad4906144ee565b60405180910390fd5b505050565b611aea611f85565b80600e8190555050565b611afc611f85565b80600c60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b7357611b56336121e3565b611b7257611b6261222f565b15611b7157611b7033612246565b5b5b5b611b7f85858585612778565b5050505050565b6060611b91826127da565b611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc790614580565b60405180910390fd5b6000611bda61281b565b90506000815111611bfa5760405180602001604052806000815250611c28565b80611c04846128ad565b600a604051602001611c189392919061465f565b6040516020818303038152906040525b915050919050565b611c38611f85565b6002600860146101000a81548160ff02191690836003811115611c5e57611c5d613bef565b5b0217905550565b600d5481565b61015e81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a8054611d1290613ead565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3e90613ead565b8015611d8b5780601f10611d6057610100808354040283529160200191611d8b565b820191906000526020600020905b815481529060010190602001808311611d6e57829003601f168201915b505050505081565b611d9b611f85565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190614702565b60405180910390fd5b611e138161269c565b50565b600c60009054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ef457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f045750611f038261297b565b5b9050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f7e5750611f7d82611e29565b5b9050919050565b611f8d6129e5565b73ffffffffffffffffffffffffffffffffffffffff16611fab611559565b73ffffffffffffffffffffffffffffffffffffffff1614612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff89061476e565b60405180910390fd5b565b61200b61261e565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115612069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206090614800565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cf9061486c565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6121a1816127da565b6121e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d790614358565b60405180910390fd5b50565b6000731e0049783f008a0085193e00003d00cd54003c7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050919050565b6000600c60009054906101000a900460ff16905090565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa612282573d6000803e3d6000fd5b6000603a5250565b600061229582611332565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fc906148fe565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166123246129e5565b73ffffffffffffffffffffffffffffffffffffffff16148061235357506123528161234d6129e5565b611c71565b5b612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238990614990565b60405180910390fd5b61239c83836129ed565b505050565b6123b26123ac6129e5565b82612aa6565b6123f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e890614a22565b60405180910390fd5b6123fc838383612b3b565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246790614a8e565b60405180910390fd5b612479816127da565b156124b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b090614afa565b60405180910390fd5b6124c7600083836001612e34565b6124d0816127da565b15612510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250790614afa565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461261a600083836001612f5a565b5050565b6000612710905090565b6000826126358584612f60565b1490509392505050565b61265a83838360405180602001604052806000815250611b19565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61277461276d6129e5565b8383612fb6565b5050565b6127896127836129e5565b83612aa6565b6127c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bf90614a22565b60405180910390fd5b6127d484848484613122565b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166127fc8361265f565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606009805461282a90613ead565b80601f016020809104026020016040519081016040528092919081815260200182805461285690613ead565b80156128a35780601f10612878576101008083540402835291602001916128a3565b820191906000526020600020905b81548152906001019060200180831161288657829003601f168201915b5050505050905090565b6060600060016128bc8461317e565b01905060008167ffffffffffffffff8111156128db576128da613a7b565b5b6040519080825280601f01601f19166020018201604052801561290d5781602001600182028036833780820191505090505b509050600082602001820190505b600115612970578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161296457612963613fcb565b5b0494506000850361291b575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612a6083611332565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080612ab283611332565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612af45750612af38185611c71565b5b80612b3257508373ffffffffffffffffffffffffffffffffffffffff16612b1a846109cc565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612b5b82611332565b73ffffffffffffffffffffffffffffffffffffffff1614612bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba890614b8c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1790614c1e565b60405180910390fd5b612c2d8383836001612e34565b8273ffffffffffffffffffffffffffffffffffffffff16612c4d82611332565b73ffffffffffffffffffffffffffffffffffffffff1614612ca3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9a90614b8c565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e2f8383836001612f5a565b505050565b6001811115612f5457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612ec85780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ec09190614c3e565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f535780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f4b9190613f0d565b925050819055505b5b50505050565b50505050565b60008082905060005b8451811015612fab57612f9682868381518110612f8957612f88614c72565b5b60200260200101516132d1565b91508080612fa390613f41565b915050612f69565b508091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301b90614ced565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516131159190613571565b60405180910390a3505050565b61312d848484612b3b565b613139848484846132fc565b613178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316f90614d7f565b60405180910390fd5b50505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106131dc577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816131d2576131d1613fcb565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613219576d04ee2d6d415b85acef8100000000838161320f5761320e613fcb565b5b0492506020810190505b662386f26fc10000831061324857662386f26fc10000838161323e5761323d613fcb565b5b0492506010810190505b6305f5e1008310613271576305f5e100838161326757613266613fcb565b5b0492506008810190505b612710831061329657612710838161328c5761328b613fcb565b5b0492506004810190505b606483106132b957606483816132af576132ae613fcb565b5b0492506002810190505b600a83106132c8576001810190505b80915050919050565b60008183106132e9576132e48284613483565b6132f4565b6132f38383613483565b5b905092915050565b600061331d8473ffffffffffffffffffffffffffffffffffffffff1661349a565b15613476578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133466129e5565b8786866040518563ffffffff1660e01b81526004016133689493929190614df4565b6020604051808303816000875af19250505080156133a457506040513d601f19601f820116820180604052508101906133a19190614e55565b60015b613426573d80600081146133d4576040519150601f19603f3d011682016040523d82523d6000602084013e6133d9565b606091505b50600081510361341e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341590614d7f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061347b565b600190505b949350505050565b600082600052816020526040600020905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613506816134d1565b811461351157600080fd5b50565b600081359050613523816134fd565b92915050565b60006020828403121561353f5761353e6134c7565b5b600061354d84828501613514565b91505092915050565b60008115159050919050565b61356b81613556565b82525050565b60006020820190506135866000830184613562565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135b78261358c565b9050919050565b6135c7816135ac565b81146135d257600080fd5b50565b6000813590506135e4816135be565b92915050565b60006bffffffffffffffffffffffff82169050919050565b61360b816135ea565b811461361657600080fd5b50565b60008135905061362881613602565b92915050565b60008060408385031215613645576136446134c7565b5b6000613653858286016135d5565b925050602061366485828601613619565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136a857808201518184015260208101905061368d565b60008484015250505050565b6000601f19601f8301169050919050565b60006136d08261366e565b6136da8185613679565b93506136ea81856020860161368a565b6136f3816136b4565b840191505092915050565b6000602082019050818103600083015261371881846136c5565b905092915050565b6000819050919050565b61373381613720565b811461373e57600080fd5b50565b6000813590506137508161372a565b92915050565b60006020828403121561376c5761376b6134c7565b5b600061377a84828501613741565b91505092915050565b61378c816135ac565b82525050565b60006020820190506137a76000830184613783565b92915050565b600080604083850312156137c4576137c36134c7565b5b60006137d2858286016135d5565b92505060206137e385828601613741565b9150509250929050565b6000819050919050565b613800816137ed565b82525050565b600060208201905061381b60008301846137f7565b92915050565b61382a81613720565b82525050565b60006020820190506138456000830184613821565b92915050565b600060208284031215613861576138606134c7565b5b600061386f848285016135d5565b91505092915050565b600060ff82169050919050565b61388e81613878565b82525050565b60006020820190506138a96000830184613885565b92915050565b6000806000606084860312156138c8576138c76134c7565b5b60006138d6868287016135d5565b93505060206138e7868287016135d5565b92505060406138f886828701613741565b9150509250925092565b60008060408385031215613919576139186134c7565b5b600061392785828601613741565b925050602061393885828601613741565b9150509250929050565b60006040820190506139576000830185613783565b6139646020830184613821565b9392505050565b613974816137ed565b811461397f57600080fd5b50565b6000813590506139918161396b565b92915050565b6000602082840312156139ad576139ac6134c7565b5b60006139bb84828501613982565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126139e9576139e86139c4565b5b8235905067ffffffffffffffff811115613a0657613a056139c9565b5b602083019150836020820283011115613a2257613a216139ce565b5b9250929050565b60008060208385031215613a4057613a3f6134c7565b5b600083013567ffffffffffffffff811115613a5e57613a5d6134cc565b5b613a6a858286016139d3565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ab3826136b4565b810181811067ffffffffffffffff82111715613ad257613ad1613a7b565b5b80604052505050565b6000613ae56134bd565b9050613af18282613aaa565b919050565b600067ffffffffffffffff821115613b1157613b10613a7b565b5b613b1a826136b4565b9050602081019050919050565b82818337600083830152505050565b6000613b49613b4484613af6565b613adb565b905082815260208101848484011115613b6557613b64613a76565b5b613b70848285613b27565b509392505050565b600082601f830112613b8d57613b8c6139c4565b5b8135613b9d848260208601613b36565b91505092915050565b600060208284031215613bbc57613bbb6134c7565b5b600082013567ffffffffffffffff811115613bda57613bd96134cc565b5b613be684828501613b78565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613c2f57613c2e613bef565b5b50565b6000819050613c4082613c1e565b919050565b6000613c5082613c32565b9050919050565b613c6081613c45565b82525050565b6000602082019050613c7b6000830184613c57565b92915050565b613c8a81613556565b8114613c9557600080fd5b50565b600081359050613ca781613c81565b92915050565b60008060408385031215613cc457613cc36134c7565b5b6000613cd2858286016135d5565b9250506020613ce385828601613c98565b9150509250929050565b600060208284031215613d0357613d026134c7565b5b6000613d1184828501613c98565b91505092915050565b600067ffffffffffffffff821115613d3557613d34613a7b565b5b613d3e826136b4565b9050602081019050919050565b6000613d5e613d5984613d1a565b613adb565b905082815260208101848484011115613d7a57613d79613a76565b5b613d85848285613b27565b509392505050565b600082601f830112613da257613da16139c4565b5b8135613db2848260208601613d4b565b91505092915050565b60008060008060808587031215613dd557613dd46134c7565b5b6000613de3878288016135d5565b9450506020613df4878288016135d5565b9350506040613e0587828801613741565b925050606085013567ffffffffffffffff811115613e2657613e256134cc565b5b613e3287828801613d8d565b91505092959194509250565b60008060408385031215613e5557613e546134c7565b5b6000613e63858286016135d5565b9250506020613e74858286016135d5565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613ec557607f821691505b602082108103613ed857613ed7613e7e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f1882613720565b9150613f2383613720565b9250828201905080821115613f3b57613f3a613ede565b5b92915050565b6000613f4c82613720565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f7e57613f7d613ede565b5b600182019050919050565b6000613f9482613720565b9150613f9f83613720565b9250828202613fad81613720565b91508282048414831517613fc457613fc3613ede565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061400582613720565b915061401083613720565b9250826140205761401f613fcb565b5b828204905092915050565b60008160601b9050919050565b60006140438261402b565b9050919050565b600061405582614038565b9050919050565b61406d614068826135ac565b61404a565b82525050565b600061407f828461405c565b60148201915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140f07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826140b3565b6140fa86836140b3565b95508019841693508086168417925050509392505050565b6000819050919050565b600061413761413261412d84613720565b614112565b613720565b9050919050565b6000819050919050565b6141518361411c565b61416561415d8261413e565b8484546140c0565b825550505050565b600090565b61417a61416d565b614185818484614148565b505050565b5b818110156141a95761419e600082614172565b60018101905061418b565b5050565b601f8211156141ee576141bf8161408e565b6141c8846140a3565b810160208510156141d7578190505b6141eb6141e3856140a3565b83018261418a565b50505b505050565b600082821c905092915050565b6000614211600019846008026141f3565b1980831691505092915050565b600061422a8383614200565b9150826002028217905092915050565b6142438261366e565b67ffffffffffffffff81111561425c5761425b613a7b565b5b6142668254613ead565b6142718282856141ad565b600060209050601f8311600181146142a45760008415614292578287015190505b61429c858261421e565b865550614304565b601f1984166142b28661408e565b60005b828110156142da578489015182556001820191506020850194506020810190506142b5565b868310156142f757848901516142f3601f891682614200565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614342601883613679565b915061434d8261430c565b602082019050919050565b6000602082019050818103600083015261437181614335565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006143d4602983613679565b91506143df82614378565b604082019050919050565b60006020820190508181036000830152614403816143c7565b9050919050565b6000819050919050565b600061441f8261440a565b91507f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361445157614450613ede565b5b600182019050919050565b600081905092915050565b50565b600061447760008361445c565b915061448282614467565b600082019050919050565b60006144988261446a565b9150819050919050565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b60006144d8600f83613679565b91506144e3826144a2565b602082019050919050565b60006020820190508181036000830152614507816144cb565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061456a602f83613679565b91506145758261450e565b604082019050919050565b600060208201905081810360008301526145998161455d565b9050919050565b600081905092915050565b60006145b68261366e565b6145c081856145a0565b93506145d081856020860161368a565b80840191505092915050565b600081546145e981613ead565b6145f381866145a0565b9450600182166000811461460e576001811461462357614656565b60ff1983168652811515820286019350614656565b61462c8561408e565b60005b8381101561464e5781548189015260018201915060208101905061462f565b838801955050505b50505092915050565b600061466b82866145ab565b915061467782856145ab565b915061468382846145dc565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146ec602683613679565b91506146f782614690565b604082019050919050565b6000602082019050818103600083015261471b816146df565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614758602083613679565b915061476382614722565b602082019050919050565b600060208201905081810360008301526147878161474b565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006147ea602a83613679565b91506147f58261478e565b604082019050919050565b60006020820190508181036000830152614819816147dd565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000614856601983613679565b915061486182614820565b602082019050919050565b6000602082019050818103600083015261488581614849565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006148e8602183613679565b91506148f38261488c565b604082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b600061497a603d83613679565b91506149858261491e565b604082019050919050565b600060208201905081810360008301526149a98161496d565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000614a0c602d83613679565b9150614a17826149b0565b604082019050919050565b60006020820190508181036000830152614a3b816149ff565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614a78602083613679565b9150614a8382614a42565b602082019050919050565b60006020820190508181036000830152614aa781614a6b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614ae4601c83613679565b9150614aef82614aae565b602082019050919050565b60006020820190508181036000830152614b1381614ad7565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614b76602583613679565b9150614b8182614b1a565b604082019050919050565b60006020820190508181036000830152614ba581614b69565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614c08602483613679565b9150614c1382614bac565b604082019050919050565b60006020820190508181036000830152614c3781614bfb565b9050919050565b6000614c4982613720565b9150614c5483613720565b9250828203905081811115614c6c57614c6b613ede565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614cd7601983613679565b9150614ce282614ca1565b602082019050919050565b60006020820190508181036000830152614d0681614cca565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614d69603283613679565b9150614d7482614d0d565b604082019050919050565b60006020820190508181036000830152614d9881614d5c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614dc682614d9f565b614dd08185614daa565b9350614de081856020860161368a565b614de9816136b4565b840191505092915050565b6000608082019050614e096000830187613783565b614e166020830186613783565b614e236040830185613821565b8181036060830152614e358184614dbb565b905095945050505050565b600081519050614e4f816134fd565b92915050565b600060208284031215614e6b57614e6a6134c7565b5b6000614e7984828501614e40565b9150509291505056fea2646970667358221220a72125ffe56db9b8149e3c79fb9496ac0d658b1a5bd689bd5977fe94c93744f964736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f6b6f6e67752e6d7970696e6174612e636c6f75642f697066732f516d654855567534397a3471437868686132366474693759446f676575363536596b7534367351677150387776782f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _metadata (string): https://kongu.mypinata.cloud/ipfs/QmeHUVu49z4qCxhha26dti7YDogeu656Yku46sQgqP8wvx/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f6b6f6e67752e6d7970696e6174612e636c6f75642f697066
Arg [3] : 732f516d654855567534397a3471437868686132366474693759446f67657536
Arg [4] : 3536596b7534367351677150387776782f000000000000000000000000000000


Deployed Bytecode Sourcemap

75129:7035:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81072:460;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81540:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45370:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46882:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80225:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75718:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75444:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75825:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80422:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77769:393;;;:::i;:::-;;72417:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;78800:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76578:582;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78401:87;;;;;;;;;;;;;:::i;:::-;;78700:92;;;;;;;;;;;;;:::i;:::-;;80625:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79465:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45080:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75366:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44811:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8606:103;;;;;;;;;;;;;:::i;:::-;;78494:98;;;;;;;;;;;;;:::i;:::-;;75332:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7958:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78170:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45539:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77168:593;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75523:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80009:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79056:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78914:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81692:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;80836:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79577:424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78598:96;;;;;;;;;;;;;:::i;:::-;;75619:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75477:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47351:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75394:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8864:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75574:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81072:460;81220:4;81445:37;81470:11;81445:24;:37::i;:::-;:79;;;;81486:38;81512:11;81486:25;:38::i;:::-;81445:79;81438:86;;81072:460;;;:::o;81540:144::-;7844:13;:11;:13::i;:::-;81634:42:::1;81653:8;81663:12;81634:18;:42::i;:::-;81540:144:::0;;:::o;45370:100::-;45424:13;45457:5;45450:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45370:100;:::o;46882:171::-;46958:7;46978:23;46993:7;46978:14;:23::i;:::-;47021:15;:24;47037:7;47021:24;;;;;;;;;;;;;;;;;;;;;47014:31;;46882:171;;;:::o;80225:189::-;80348:8;3654:29;3674:8;3654:19;:29::i;:::-;3649:122;;3704:27;:25;:27::i;:::-;3700:59;;;3733:26;3750:8;3733:16;:26::i;:::-;3700:59;3649:122;80374:32:::1;80388:8;80398:7;80374:13;:32::i;:::-;80225:189:::0;;;:::o;75718:98::-;;;;:::o;75444:26::-;;;;:::o;75825:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;80422:195::-;80550:4;3297:10;3289:18;;:4;:18;;;3285:184;;3329:31;3349:10;3329:19;:31::i;:::-;3324:134;;3385:27;:25;:27::i;:::-;3381:61;;;3414:28;3431:10;3414:16;:28::i;:::-;3381:61;3324:134;3285:184;80572:37:::1;80591:4;80597:2;80601:7;80572:18;:37::i;:::-;80422:195:::0;;;;:::o;77769:393::-;76228:9;76214:23;;:10;:23;;;76206:32;;;;;;76537:12:::1;76521:28:::0;::::1;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;76513:37;;;::::0;::::1;;75555:10:::2;77852:9;:17;77849:46;;;77878:17;;;;;;;;;;;;;;77849:46;77931:1;77909:6;:18;77916:10;77909:18;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;77906:59;;77941:24;;;;;;;;;;;;;;77906:59;75513:3;77993:1;77979:11;;:15;;;;:::i;:::-;:27;77976:57;;;78015:18;;;;;;;;;;;;;;77976:57;78088:1;78067:6;:18;78074:10;78067:18;;;;;;;;;;;;;;;;;;;;;;;;;:22;78046:6;:18;78053:10;78046:18;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;78100:11;;:13;;;;;;;;;:::i;:::-;;;;;;78124:30;78130:10;78142:11;;78124:5;:30::i;:::-;77769:393::o:0;72417:442::-;72514:7;72523;72543:26;72572:17;:27;72590:8;72572:27;;;;;;;;;;;72543:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72644:1;72616:30;;:7;:16;;;:30;;;72612:92;;72673:19;72663:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72612:92;72716:21;72781:17;:15;:17::i;:::-;72740:58;;72754:7;:23;;;72741:36;;:10;:36;;;;:::i;:::-;72740:58;;;;:::i;:::-;72716:82;;72819:7;:16;;;72837:13;72811:40;;;;;;72417:442;;;;;:::o;78800:106::-;7844:13;:11;:13::i;:::-;78889:9:::1;78878:8;:20;;;;78800:106:::0;:::o;76578:582::-;76228:9;76214:23;;:10;:23;;;76206:32;;;;;;76324:15:::1;76308:31;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;76300:40;;;::::0;::::1;;76688:12:::2;76730:10;76713:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;76703:39;;;;;;76688:54;;76760:48;76779:12;;76760:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76793:8;;76803:4;76760:18;:48::i;:::-;76755:77;;76817:15;;;;;;;;;;;;;;76755:77;75555:10;76846:9;:17;76843:46;;;76872:17;;;;;;;;;;;;;;76843:46;76929:1;76924;76903:6;:18;76910:10;76903:18;;;;;;;;;;;;;;;;;;;;;;;;;:22;:27;;;76900:63;;76939:24;;;;;;;;;;;;;;76900:63;75513:3;76991:1;76977:11;;:15;;;;:::i;:::-;:27;76974:57;;;77013:18;;;;;;;;;;;;;;76974:57;77086:1;77065:6;:18;77072:10;77065:18;;;;;;;;;;;;;;;;;;;;;;;;;:22;77044:6;:18;77051:10;77044:18;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;77098:11;;:13;;;;;;;;;:::i;:::-;;;;;;77122:30;77128:10;77140:11;;77122:5;:30::i;:::-;76677:483;76578:582:::0;;:::o;78401:87::-;7844:13;:11;:13::i;:::-;78470:10:::1;78455:12;;:25;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;78401:87::o:0;78700:92::-;7844:13;:11;:13::i;:::-;78772:12:::1;78757;;:27;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;78700:92::o:0;80625:203::-;80757:4;3297:10;3289:18;;:4;:18;;;3285:184;;3329:31;3349:10;3329:19;:31::i;:::-;3324:134;;3385:27;:25;:27::i;:::-;3381:61;;;3414:28;3431:10;3414:16;:28::i;:::-;3381:61;3324:134;3285:184;80779:41:::1;80802:4;80808:2;80812:7;80779:22;:41::i;:::-;80625:203:::0;;;;:::o;79465:104::-;7844:13;:11;:13::i;:::-;79550:11:::1;79540:7;:21;;;;;;:::i;:::-;;79465:104:::0;:::o;45080:223::-;45152:7;45172:13;45188:17;45197:7;45188:8;:17::i;:::-;45172:33;;45241:1;45224:19;;:5;:19;;;45216:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;45290:5;45283:12;;;45080:223;;;:::o;75366:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44811:207::-;44883:7;44928:1;44911:19;;:5;:19;;;44903:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44994:9;:16;45004:5;44994:16;;;;;;;;;;;;;;;;44987:23;;44811:207;;;:::o;8606:103::-;7844:13;:11;:13::i;:::-;8671:30:::1;8698:1;8671:18;:30::i;:::-;8606:103::o:0;78494:98::-;7844:13;:11;:13::i;:::-;78569:15:::1;78554:12;;:30;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;78494:98::o:0;75332:25::-;;;;;;;;;;;;;:::o;7958:87::-;8004:7;8031:6;;;;;;;;;;;8024:13;;7958:87;:::o;78170:223::-;76228:9;76214:23;;:10;:23;;;76206:32;;;;;;7844:13:::1;:11;:13::i;:::-;78268:8:::2;78264:122;78282:1;78280;:3;78264:122;;;78314:11;;:13;;;;;;;;;:::i;:::-;;;;;;78342:32;78348:12;78362:11;;78342:5;:32::i;:::-;78285:3;;;;:::i;:::-;;;78264:122;;;;78170:223:::0;:::o;45539:104::-;45595:13;45628:7;45621:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45539:104;:::o;77168:593::-;76228:9;76214:23;;:10;:23;;;76206:32;;;;;;76432:14:::1;76416:30;;;;;;;;:::i;:::-;;:12;;;;;;;;;;;:30;;;;;;;;:::i;:::-;;;76408:39;;;::::0;::::1;;77283:12:::2;77325:10;77308:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;77298:39;;;;;;77283:54;;77355;77374:12;;77355:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77388:14;;77404:4;77355:18;:54::i;:::-;77350:83;;77418:15;;;;;;;;;;;;;;77350:83;75555:10;77447:9;:17;77444:46;;;77473:17;;;;;;;;;;;;;;77444:46;77530:1;77525;77504:6;:18;77511:10;77504:18;;;;;;;;;;;;;;;;;;;;;;;;;:22;:27;;;77501:63;;77540:24;;;;;;;;;;;;;;77501:63;75513:3;77592:1;77578:11;;:15;;;;:::i;:::-;:27;77575:57;;;77614:18;;;;;;;;;;;;;;77575:57;77687:1;77666:6;:18;77673:10;77666:18;;;;;;;;;;;;;;;;;;;;;;;;;:22;77645:6;:18;77652:10;77645:18;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;77699:11;;:13;;;;;;;;;:::i;:::-;;;;;;77723:30;77729:10;77741:11;;77723:5;:30::i;:::-;77272:489;77168:593:::0;;:::o;75523:42::-;75555:10;75523:42;:::o;80009:208::-;80140:8;3654:29;3674:8;3654:19;:29::i;:::-;3649:122;;3704:27;:25;:27::i;:::-;3700:59;;;3733:26;3750:8;3733:16;:26::i;:::-;3700:59;3649:122;80166:43:::1;80190:8;80200;80166:23;:43::i;:::-;80009:208:::0;;;:::o;79056:285::-;7844:13;:11;:13::i;:::-;79121:15:::1;79139:21;79121:39;;79186:1;79175:7;:12:::0;79171:42:::1;;79196:17;;;;;;;;;;;;;;79171:42;79225:16;79255:2;79247:16;;79271:7;79247:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79224:59;;;79302:11;79294:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;79110:231;;79056:285:::0;:::o;78914:130::-;7844:13;:11;:13::i;:::-;79021:15:::1;79004:14;:32;;;;78914:130:::0;:::o;81692:117::-;7844:13;:11;:13::i;:::-;81796:5:::1;81769:24;;:32;;;;;;;;;;;;;;;;;;81692:117:::0;:::o;80836:228::-;80987:4;3297:10;3289:18;;:4;:18;;;3285:184;;3329:31;3349:10;3329:19;:31::i;:::-;3324:134;;3385:27;:25;:27::i;:::-;3381:61;;;3414:28;3431:10;3414:16;:28::i;:::-;3381:61;3324:134;3285:184;81009:47:::1;81032:4;81038:2;81042:7;81051:4;81009:22;:47::i;:::-;80836:228:::0;;;;;:::o;79577:424::-;79695:13;79735:16;79743:7;79735;:16::i;:::-;79726:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;79814:28;79845:10;:8;:10::i;:::-;79814:41;;79904:1;79879:14;79873:28;:32;:120;;;;;;;;;;;;;;;;;79933:14;79949:18;:7;:16;:18::i;:::-;79969:17;79916:72;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79873:120;79866:127;;;79577:424;;;:::o;78598:96::-;7844:13;:11;:13::i;:::-;78672:14:::1;78657:12;;:29;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;78598:96::o:0;75619:92::-;;;;:::o;75477:39::-;75513:3;75477:39;:::o;47351:164::-;47448:4;47472:18;:25;47491:5;47472:25;;;;;;;;;;;;;;;:35;47498:8;47472:35;;;;;;;;;;;;;;;;;;;;;;;;;47465:42;;47351:164;;;;:::o;75394:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;8864:201::-;7844:13;:11;:13::i;:::-;8973:1:::1;8953:22;;:8;:22;;::::0;8945:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;9029:28;9048:8;9029:18;:28::i;:::-;8864:201:::0;:::o;75574:36::-;;;;;;;;;;;;;:::o;44442:305::-;44544:4;44596:25;44581:40;;;:11;:40;;;;:105;;;;44653:33;44638:48;;;:11;:48;;;;44581:105;:158;;;;44703:36;44727:11;44703:23;:36::i;:::-;44581:158;44561:178;;44442:305;;;:::o;72147:215::-;72249:4;72288:26;72273:41;;;:11;:41;;;;:81;;;;72318:36;72342:11;72318:23;:36::i;:::-;72273:81;72266:88;;72147:215;;;:::o;8123:132::-;8198:12;:10;:12::i;:::-;8187:23;;:7;:5;:7::i;:::-;:23;;;8179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8123:132::o;73509:332::-;73628:17;:15;:17::i;:::-;73612:33;;:12;:33;;;;73604:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;73731:1;73711:22;;:8;:22;;;73703:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;73798:35;;;;;;;;73810:8;73798:35;;;;;;73820:12;73798:35;;;;;73776:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73509:332;;:::o;56701:135::-;56783:16;56791:7;56783;:16::i;:::-;56775:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;56701:135;:::o;81950:211::-;82029:4;82110:42;82090:63;;:8;:63;;;82083:70;;81950:211;;;:::o;81817:125::-;81886:4;81910:24;;;;;;;;;;;81903:31;;81817:125;:::o;3887:1359::-;4280:22;4274:4;4267:36;4373:9;4367:4;4360:23;4448:8;4442:4;4435:22;4625:4;4619;4613;4607;4580:25;4573:5;4562:68;4552:274;;4746:16;4740:4;4734;4719:44;4794:16;4788:4;4781:30;4552:274;5226:1;5220:4;5213:15;3887:1359;:::o;46400:416::-;46481:13;46497:23;46512:7;46497:14;:23::i;:::-;46481:39;;46545:5;46539:11;;:2;:11;;;46531:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46639:5;46623:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;46648:37;46665:5;46672:12;:10;:12::i;:::-;46648:16;:37::i;:::-;46623:62;46601:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;46787:21;46796:2;46800:7;46787:8;:21::i;:::-;46470:346;46400:416;;:::o;47582:335::-;47777:41;47796:12;:10;:12::i;:::-;47810:7;47777:18;:41::i;:::-;47769:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;47881:28;47891:4;47897:2;47901:7;47881:9;:28::i;:::-;47582:335;;;:::o;52197:942::-;52291:1;52277:16;;:2;:16;;;52269:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52350:16;52358:7;52350;:16::i;:::-;52349:17;52341:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52412:48;52441:1;52445:2;52449:7;52458:1;52412:20;:48::i;:::-;52559:16;52567:7;52559;:16::i;:::-;52558:17;52550:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52974:1;52957:9;:13;52967:2;52957:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;53018:2;52999:7;:16;53007:7;52999:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;53063:7;53059:2;53038:33;;53055:1;53038:33;;;;;;;;;;;;53084:47;53112:1;53116:2;53120:7;53129:1;53084:19;:47::i;:::-;52197:942;;:::o;73141:97::-;73199:6;73225:5;73218:12;;73141:97;:::o;61512:190::-;61637:4;61690;61661:25;61674:5;61681:4;61661:12;:25::i;:::-;:33;61654:40;;61512:190;;;;;:::o;47988:185::-;48126:39;48143:4;48149:2;48153:7;48126:39;;;;;;;;;;;;:16;:39::i;:::-;47988:185;;;:::o;49874:117::-;49940:7;49967;:16;49975:7;49967:16;;;;;;;;;;;;;;;;;;;;;49960:23;;49874:117;;;:::o;9225:191::-;9299:16;9318:6;;;;;;;;;;;9299:25;;9344:8;9335:6;;:17;;;;;;;;;;;;;;;;;;9399:8;9368:40;;9389:8;9368:40;;;;;;;;;;;;9288:128;9225:191;:::o;47125:155::-;47220:52;47239:12;:10;:12::i;:::-;47253:8;47263;47220:18;:52::i;:::-;47125:155;;:::o;48244:322::-;48418:41;48437:12;:10;:12::i;:::-;48451:7;48418:18;:41::i;:::-;48410:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;48520:38;48534:4;48540:2;48544:7;48553:4;48520:13;:38::i;:::-;48244:322;;;;:::o;50304:128::-;50369:4;50422:1;50393:31;;:17;50402:7;50393:8;:17::i;:::-;:31;;;;50386:38;;50304:128;;;:::o;79349:108::-;79409:13;79442:7;79435:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79349:108;:::o;22748:716::-;22804:13;22855:14;22892:1;22872:17;22883:5;22872:10;:17::i;:::-;:21;22855:38;;22908:20;22942:6;22931:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22908:41;;22964:11;23093:6;23089:2;23085:15;23077:6;23073:28;23066:35;;23130:288;23137:4;23130:288;;;23162:5;;;;;;;;23304:8;23299:2;23292:5;23288:14;23283:30;23278:3;23270:44;23360:2;23351:11;;;;;;:::i;:::-;;;;;23394:1;23385:5;:10;23130:288;23381:21;23130:288;23439:6;23432:13;;;;;22748:716;;;:::o;35874:157::-;35959:4;35998:25;35983:40;;;:11;:40;;;;35976:47;;35874:157;;;:::o;6503:98::-;6556:7;6583:10;6576:17;;6503:98;:::o;55980:174::-;56082:2;56055:15;:24;56071:7;56055:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56138:7;56134:2;56100:46;;56109:23;56124:7;56109:14;:23::i;:::-;56100:46;;;;;;;;;;;;55980:174;;:::o;50599:264::-;50692:4;50709:13;50725:23;50740:7;50725:14;:23::i;:::-;50709:39;;50778:5;50767:16;;:7;:16;;;:52;;;;50787:32;50804:5;50811:7;50787:16;:32::i;:::-;50767:52;:87;;;;50847:7;50823:31;;:20;50835:7;50823:11;:20::i;:::-;:31;;;50767:87;50759:96;;;50599:264;;;;:::o;54598:1263::-;54757:4;54730:31;;:23;54745:7;54730:14;:23::i;:::-;:31;;;54722:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;54836:1;54822:16;;:2;:16;;;54814:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54892:42;54913:4;54919:2;54923:7;54932:1;54892:20;:42::i;:::-;55064:4;55037:31;;:23;55052:7;55037:14;:23::i;:::-;:31;;;55029:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55182:15;:24;55198:7;55182:24;;;;;;;;;;;;55175:31;;;;;;;;;;;55677:1;55658:9;:15;55668:4;55658:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;55710:1;55693:9;:13;55703:2;55693:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;55752:2;55733:7;:16;55741:7;55733:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;55791:7;55787:2;55772:27;;55781:4;55772:27;;;;;;;;;;;;55812:41;55832:4;55838:2;55842:7;55851:1;55812:19;:41::i;:::-;54598:1263;;;:::o;58985:410::-;59175:1;59163:9;:13;59159:229;;;59213:1;59197:18;;:4;:18;;;59193:87;;59255:9;59236;:15;59246:4;59236:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;59193:87;59312:1;59298:16;;:2;:16;;;59294:83;;59352:9;59335;:13;59345:2;59335:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;59294:83;59159:229;58985:410;;;;:::o;60117:158::-;;;;;:::o;62379:296::-;62462:7;62482:20;62505:4;62482:27;;62525:9;62520:118;62544:5;:12;62540:1;:16;62520:118;;;62593:33;62603:12;62617:5;62623:1;62617:8;;;;;;;;:::i;:::-;;;;;;;;62593:9;:33::i;:::-;62578:48;;62558:3;;;;;:::i;:::-;;;;62520:118;;;;62655:12;62648:19;;;62379:296;;;;:::o;56297:315::-;56452:8;56443:17;;:5;:17;;;56435:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56539:8;56501:18;:25;56520:5;56501:25;;;;;;;;;;;;;;;:35;56527:8;56501:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;56585:8;56563:41;;56578:5;56563:41;;;56595:8;56563:41;;;;;;:::i;:::-;;;;;;;;56297:315;;;:::o;49447:313::-;49603:28;49613:4;49619:2;49623:7;49603:9;:28::i;:::-;49650:47;49673:4;49679:2;49683:7;49692:4;49650:22;:47::i;:::-;49642:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;49447:313;;;;:::o;19608:922::-;19661:7;19681:14;19698:1;19681:18;;19748:6;19739:5;:15;19735:102;;19784:6;19775:15;;;;;;:::i;:::-;;;;;19819:2;19809:12;;;;19735:102;19864:6;19855:5;:15;19851:102;;19900:6;19891:15;;;;;;:::i;:::-;;;;;19935:2;19925:12;;;;19851:102;19980:6;19971:5;:15;19967:102;;20016:6;20007:15;;;;;;:::i;:::-;;;;;20051:2;20041:12;;;;19967:102;20096:5;20087;:14;20083:99;;20131:5;20122:14;;;;;;:::i;:::-;;;;;20165:1;20155:11;;;;20083:99;20209:5;20200;:14;20196:99;;20244:5;20235:14;;;;;;:::i;:::-;;;;;20278:1;20268:11;;;;20196:99;20322:5;20313;:14;20309:99;;20357:5;20348:14;;;;;;:::i;:::-;;;;;20391:1;20381:11;;;;20309:99;20435:5;20426;:14;20422:66;;20471:1;20461:11;;;;20422:66;20516:6;20509:13;;;19608:922;;;:::o;69419:149::-;69482:7;69513:1;69509;:5;:51;;69540:20;69555:1;69558;69540:14;:20::i;:::-;69509:51;;;69517:20;69532:1;69535;69517:14;:20::i;:::-;69509:51;69502:58;;69419:149;;;;:::o;57400:853::-;57554:4;57575:15;:2;:13;;;:15::i;:::-;57571:675;;;57627:2;57611:36;;;57648:12;:10;:12::i;:::-;57662:4;57668:7;57677:4;57611:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57607:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57869:1;57852:6;:13;:18;57848:328;;57895:60;;;;;;;;;;:::i;:::-;;;;;;;;57848:328;58126:6;58120:13;58111:6;58107:2;58103:15;58096:38;57607:584;57743:41;;;57733:51;;;:6;:51;;;;57726:58;;;;;57571:675;58230:4;58223:11;;57400:853;;;;;;;:::o;69576:268::-;69644:13;69751:1;69745:4;69738:15;69780:1;69774:4;69767:15;69821:4;69815;69805:21;69796:30;;69576:268;;;;:::o;25883:326::-;25943:4;26200:1;26178:7;:19;;;:23;26171:30;;25883:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:109::-;2061:7;2101:26;2094:5;2090:38;2079:49;;2025:109;;;:::o;2140:120::-;2212:23;2229:5;2212:23;:::i;:::-;2205:5;2202:34;2192:62;;2250:1;2247;2240:12;2192:62;2140:120;:::o;2266:137::-;2311:5;2349:6;2336:20;2327:29;;2365:32;2391:5;2365:32;:::i;:::-;2266:137;;;;:::o;2409:472::-;2476:6;2484;2533:2;2521:9;2512:7;2508:23;2504:32;2501:119;;;2539:79;;:::i;:::-;2501:119;2659:1;2684:53;2729:7;2720:6;2709:9;2705:22;2684:53;:::i;:::-;2674:63;;2630:117;2786:2;2812:52;2856:7;2847:6;2836:9;2832:22;2812:52;:::i;:::-;2802:62;;2757:117;2409:472;;;;;:::o;2887:99::-;2939:6;2973:5;2967:12;2957:22;;2887:99;;;:::o;2992:169::-;3076:11;3110:6;3105:3;3098:19;3150:4;3145:3;3141:14;3126:29;;2992:169;;;;:::o;3167:246::-;3248:1;3258:113;3272:6;3269:1;3266:13;3258:113;;;3357:1;3352:3;3348:11;3342:18;3338:1;3333:3;3329:11;3322:39;3294:2;3291:1;3287:10;3282:15;;3258:113;;;3405:1;3396:6;3391:3;3387:16;3380:27;3229:184;3167:246;;;:::o;3419:102::-;3460:6;3511:2;3507:7;3502:2;3495:5;3491:14;3487:28;3477:38;;3419:102;;;:::o;3527:377::-;3615:3;3643:39;3676:5;3643:39;:::i;:::-;3698:71;3762:6;3757:3;3698:71;:::i;:::-;3691:78;;3778:65;3836:6;3831:3;3824:4;3817:5;3813:16;3778:65;:::i;:::-;3868:29;3890:6;3868:29;:::i;:::-;3863:3;3859:39;3852:46;;3619:285;3527:377;;;;:::o;3910:313::-;4023:4;4061:2;4050:9;4046:18;4038:26;;4110:9;4104:4;4100:20;4096:1;4085:9;4081:17;4074:47;4138:78;4211:4;4202:6;4138:78;:::i;:::-;4130:86;;3910:313;;;;:::o;4229:77::-;4266:7;4295:5;4284:16;;4229:77;;;:::o;4312:122::-;4385:24;4403:5;4385:24;:::i;:::-;4378:5;4375:35;4365:63;;4424:1;4421;4414:12;4365:63;4312:122;:::o;4440:139::-;4486:5;4524:6;4511:20;4502:29;;4540:33;4567:5;4540:33;:::i;:::-;4440:139;;;;:::o;4585:329::-;4644:6;4693:2;4681:9;4672:7;4668:23;4664:32;4661:119;;;4699:79;;:::i;:::-;4661:119;4819:1;4844:53;4889:7;4880:6;4869:9;4865:22;4844:53;:::i;:::-;4834:63;;4790:117;4585:329;;;;:::o;4920:118::-;5007:24;5025:5;5007:24;:::i;:::-;5002:3;4995:37;4920:118;;:::o;5044:222::-;5137:4;5175:2;5164:9;5160:18;5152:26;;5188:71;5256:1;5245:9;5241:17;5232:6;5188:71;:::i;:::-;5044:222;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:77::-;5789:7;5818:5;5807:16;;5752:77;;;:::o;5835:118::-;5922:24;5940:5;5922:24;:::i;:::-;5917:3;5910:37;5835:118;;:::o;5959:222::-;6052:4;6090:2;6079:9;6075:18;6067:26;;6103:71;6171:1;6160:9;6156:17;6147:6;6103:71;:::i;:::-;5959:222;;;;:::o;6187:118::-;6274:24;6292:5;6274:24;:::i;:::-;6269:3;6262:37;6187:118;;:::o;6311:222::-;6404:4;6442:2;6431:9;6427:18;6419:26;;6455:71;6523:1;6512:9;6508:17;6499:6;6455:71;:::i;:::-;6311:222;;;;:::o;6539:329::-;6598:6;6647:2;6635:9;6626:7;6622:23;6618:32;6615:119;;;6653:79;;:::i;:::-;6615:119;6773:1;6798:53;6843:7;6834:6;6823:9;6819:22;6798:53;:::i;:::-;6788:63;;6744:117;6539:329;;;;:::o;6874:86::-;6909:7;6949:4;6942:5;6938:16;6927:27;;6874:86;;;:::o;6966:112::-;7049:22;7065:5;7049:22;:::i;:::-;7044:3;7037:35;6966:112;;:::o;7084:214::-;7173:4;7211:2;7200:9;7196:18;7188:26;;7224:67;7288:1;7277:9;7273:17;7264:6;7224:67;:::i;:::-;7084:214;;;;:::o;7304:619::-;7381:6;7389;7397;7446:2;7434:9;7425:7;7421:23;7417:32;7414:119;;;7452:79;;:::i;:::-;7414:119;7572:1;7597:53;7642:7;7633:6;7622:9;7618:22;7597:53;:::i;:::-;7587:63;;7543:117;7699:2;7725:53;7770:7;7761:6;7750:9;7746:22;7725:53;:::i;:::-;7715:63;;7670:118;7827:2;7853:53;7898:7;7889:6;7878:9;7874:22;7853:53;:::i;:::-;7843:63;;7798:118;7304:619;;;;;:::o;7929:474::-;7997:6;8005;8054:2;8042:9;8033:7;8029:23;8025:32;8022:119;;;8060:79;;:::i;:::-;8022:119;8180:1;8205:53;8250:7;8241:6;8230:9;8226:22;8205:53;:::i;:::-;8195:63;;8151:117;8307:2;8333:53;8378:7;8369:6;8358:9;8354:22;8333:53;:::i;:::-;8323:63;;8278:118;7929:474;;;;;:::o;8409:332::-;8530:4;8568:2;8557:9;8553:18;8545:26;;8581:71;8649:1;8638:9;8634:17;8625:6;8581:71;:::i;:::-;8662:72;8730:2;8719:9;8715:18;8706:6;8662:72;:::i;:::-;8409:332;;;;;:::o;8747:122::-;8820:24;8838:5;8820:24;:::i;:::-;8813:5;8810:35;8800:63;;8859:1;8856;8849:12;8800:63;8747:122;:::o;8875:139::-;8921:5;8959:6;8946:20;8937:29;;8975:33;9002:5;8975:33;:::i;:::-;8875:139;;;;:::o;9020:329::-;9079:6;9128:2;9116:9;9107:7;9103:23;9099:32;9096:119;;;9134:79;;:::i;:::-;9096:119;9254:1;9279:53;9324:7;9315:6;9304:9;9300:22;9279:53;:::i;:::-;9269:63;;9225:117;9020:329;;;;:::o;9355:117::-;9464:1;9461;9454:12;9478:117;9587:1;9584;9577:12;9601:117;9710:1;9707;9700:12;9741:568;9814:8;9824:6;9874:3;9867:4;9859:6;9855:17;9851:27;9841:122;;9882:79;;:::i;:::-;9841:122;9995:6;9982:20;9972:30;;10025:18;10017:6;10014:30;10011:117;;;10047:79;;:::i;:::-;10011:117;10161:4;10153:6;10149:17;10137:29;;10215:3;10207:4;10199:6;10195:17;10185:8;10181:32;10178:41;10175:128;;;10222:79;;:::i;:::-;10175:128;9741:568;;;;;:::o;10315:559::-;10401:6;10409;10458:2;10446:9;10437:7;10433:23;10429:32;10426:119;;;10464:79;;:::i;:::-;10426:119;10612:1;10601:9;10597:17;10584:31;10642:18;10634:6;10631:30;10628:117;;;10664:79;;:::i;:::-;10628:117;10777:80;10849:7;10840:6;10829:9;10825:22;10777:80;:::i;:::-;10759:98;;;;10555:312;10315:559;;;;;:::o;10880:117::-;10989:1;10986;10979:12;11003:180;11051:77;11048:1;11041:88;11148:4;11145:1;11138:15;11172:4;11169:1;11162:15;11189:281;11272:27;11294:4;11272:27;:::i;:::-;11264:6;11260:40;11402:6;11390:10;11387:22;11366:18;11354:10;11351:34;11348:62;11345:88;;;11413:18;;:::i;:::-;11345:88;11453:10;11449:2;11442:22;11232:238;11189:281;;:::o;11476:129::-;11510:6;11537:20;;:::i;:::-;11527:30;;11566:33;11594:4;11586:6;11566:33;:::i;:::-;11476:129;;;:::o;11611:308::-;11673:4;11763:18;11755:6;11752:30;11749:56;;;11785:18;;:::i;:::-;11749:56;11823:29;11845:6;11823:29;:::i;:::-;11815:37;;11907:4;11901;11897:15;11889:23;;11611:308;;;:::o;11925:146::-;12022:6;12017:3;12012;11999:30;12063:1;12054:6;12049:3;12045:16;12038:27;11925:146;;;:::o;12077:425::-;12155:5;12180:66;12196:49;12238:6;12196:49;:::i;:::-;12180:66;:::i;:::-;12171:75;;12269:6;12262:5;12255:21;12307:4;12300:5;12296:16;12345:3;12336:6;12331:3;12327:16;12324:25;12321:112;;;12352:79;;:::i;:::-;12321:112;12442:54;12489:6;12484:3;12479;12442:54;:::i;:::-;12161:341;12077:425;;;;;:::o;12522:340::-;12578:5;12627:3;12620:4;12612:6;12608:17;12604:27;12594:122;;12635:79;;:::i;:::-;12594:122;12752:6;12739:20;12777:79;12852:3;12844:6;12837:4;12829:6;12825:17;12777:79;:::i;:::-;12768:88;;12584:278;12522:340;;;;:::o;12868:509::-;12937:6;12986:2;12974:9;12965:7;12961:23;12957:32;12954:119;;;12992:79;;:::i;:::-;12954:119;13140:1;13129:9;13125:17;13112:31;13170:18;13162:6;13159:30;13156:117;;;13192:79;;:::i;:::-;13156:117;13297:63;13352:7;13343:6;13332:9;13328:22;13297:63;:::i;:::-;13287:73;;13083:287;12868:509;;;;:::o;13383:180::-;13431:77;13428:1;13421:88;13528:4;13525:1;13518:15;13552:4;13549:1;13542:15;13569:115;13652:1;13645:5;13642:12;13632:46;;13658:18;;:::i;:::-;13632:46;13569:115;:::o;13690:131::-;13737:7;13766:5;13755:16;;13772:43;13809:5;13772:43;:::i;:::-;13690:131;;;:::o;13827:::-;13885:9;13918:34;13946:5;13918:34;:::i;:::-;13905:47;;13827:131;;;:::o;13964:147::-;14059:45;14098:5;14059:45;:::i;:::-;14054:3;14047:58;13964:147;;:::o;14117:238::-;14218:4;14256:2;14245:9;14241:18;14233:26;;14269:79;14345:1;14334:9;14330:17;14321:6;14269:79;:::i;:::-;14117:238;;;;:::o;14361:116::-;14431:21;14446:5;14431:21;:::i;:::-;14424:5;14421:32;14411:60;;14467:1;14464;14457:12;14411:60;14361:116;:::o;14483:133::-;14526:5;14564:6;14551:20;14542:29;;14580:30;14604:5;14580:30;:::i;:::-;14483:133;;;;:::o;14622:468::-;14687:6;14695;14744:2;14732:9;14723:7;14719:23;14715:32;14712:119;;;14750:79;;:::i;:::-;14712:119;14870:1;14895:53;14940:7;14931:6;14920:9;14916:22;14895:53;:::i;:::-;14885:63;;14841:117;14997:2;15023:50;15065:7;15056:6;15045:9;15041:22;15023:50;:::i;:::-;15013:60;;14968:115;14622:468;;;;;:::o;15096:323::-;15152:6;15201:2;15189:9;15180:7;15176:23;15172:32;15169:119;;;15207:79;;:::i;:::-;15169:119;15327:1;15352:50;15394:7;15385:6;15374:9;15370:22;15352:50;:::i;:::-;15342:60;;15298:114;15096:323;;;;:::o;15425:307::-;15486:4;15576:18;15568:6;15565:30;15562:56;;;15598:18;;:::i;:::-;15562:56;15636:29;15658:6;15636:29;:::i;:::-;15628:37;;15720:4;15714;15710:15;15702:23;;15425:307;;;:::o;15738:423::-;15815:5;15840:65;15856:48;15897:6;15856:48;:::i;:::-;15840:65;:::i;:::-;15831:74;;15928:6;15921:5;15914:21;15966:4;15959:5;15955:16;16004:3;15995:6;15990:3;15986:16;15983:25;15980:112;;;16011:79;;:::i;:::-;15980:112;16101:54;16148:6;16143:3;16138;16101:54;:::i;:::-;15821:340;15738:423;;;;;:::o;16180:338::-;16235:5;16284:3;16277:4;16269:6;16265:17;16261:27;16251:122;;16292:79;;:::i;:::-;16251:122;16409:6;16396:20;16434:78;16508:3;16500:6;16493:4;16485:6;16481:17;16434:78;:::i;:::-;16425:87;;16241:277;16180:338;;;;:::o;16524:943::-;16619:6;16627;16635;16643;16692:3;16680:9;16671:7;16667:23;16663:33;16660:120;;;16699:79;;:::i;:::-;16660:120;16819:1;16844:53;16889:7;16880:6;16869:9;16865:22;16844:53;:::i;:::-;16834:63;;16790:117;16946:2;16972:53;17017:7;17008:6;16997:9;16993:22;16972:53;:::i;:::-;16962:63;;16917:118;17074:2;17100:53;17145:7;17136:6;17125:9;17121:22;17100:53;:::i;:::-;17090:63;;17045:118;17230:2;17219:9;17215:18;17202:32;17261:18;17253:6;17250:30;17247:117;;;17283:79;;:::i;:::-;17247:117;17388:62;17442:7;17433:6;17422:9;17418:22;17388:62;:::i;:::-;17378:72;;17173:287;16524:943;;;;;;;:::o;17473:474::-;17541:6;17549;17598:2;17586:9;17577:7;17573:23;17569:32;17566:119;;;17604:79;;:::i;:::-;17566:119;17724:1;17749:53;17794:7;17785:6;17774:9;17770:22;17749:53;:::i;:::-;17739:63;;17695:117;17851:2;17877:53;17922:7;17913:6;17902:9;17898:22;17877:53;:::i;:::-;17867:63;;17822:118;17473:474;;;;;:::o;17953:180::-;18001:77;17998:1;17991:88;18098:4;18095:1;18088:15;18122:4;18119:1;18112:15;18139:320;18183:6;18220:1;18214:4;18210:12;18200:22;;18267:1;18261:4;18257:12;18288:18;18278:81;;18344:4;18336:6;18332:17;18322:27;;18278:81;18406:2;18398:6;18395:14;18375:18;18372:38;18369:84;;18425:18;;:::i;:::-;18369:84;18190:269;18139:320;;;:::o;18465:180::-;18513:77;18510:1;18503:88;18610:4;18607:1;18600:15;18634:4;18631:1;18624:15;18651:191;18691:3;18710:20;18728:1;18710:20;:::i;:::-;18705:25;;18744:20;18762:1;18744:20;:::i;:::-;18739:25;;18787:1;18784;18780:9;18773:16;;18808:3;18805:1;18802:10;18799:36;;;18815:18;;:::i;:::-;18799:36;18651:191;;;;:::o;18848:233::-;18887:3;18910:24;18928:5;18910:24;:::i;:::-;18901:33;;18956:66;18949:5;18946:77;18943:103;;19026:18;;:::i;:::-;18943:103;19073:1;19066:5;19062:13;19055:20;;18848:233;;;:::o;19087:410::-;19127:7;19150:20;19168:1;19150:20;:::i;:::-;19145:25;;19184:20;19202:1;19184:20;:::i;:::-;19179:25;;19239:1;19236;19232:9;19261:30;19279:11;19261:30;:::i;:::-;19250:41;;19440:1;19431:7;19427:15;19424:1;19421:22;19401:1;19394:9;19374:83;19351:139;;19470:18;;:::i;:::-;19351:139;19135:362;19087:410;;;;:::o;19503:180::-;19551:77;19548:1;19541:88;19648:4;19645:1;19638:15;19672:4;19669:1;19662:15;19689:185;19729:1;19746:20;19764:1;19746:20;:::i;:::-;19741:25;;19780:20;19798:1;19780:20;:::i;:::-;19775:25;;19819:1;19809:35;;19824:18;;:::i;:::-;19809:35;19866:1;19863;19859:9;19854:14;;19689:185;;;;:::o;19880:94::-;19913:8;19961:5;19957:2;19953:14;19932:35;;19880:94;;;:::o;19980:::-;20019:7;20048:20;20062:5;20048:20;:::i;:::-;20037:31;;19980:94;;;:::o;20080:100::-;20119:7;20148:26;20168:5;20148:26;:::i;:::-;20137:37;;20080:100;;;:::o;20186:157::-;20291:45;20311:24;20329:5;20311:24;:::i;:::-;20291:45;:::i;:::-;20286:3;20279:58;20186:157;;:::o;20349:256::-;20461:3;20476:75;20547:3;20538:6;20476:75;:::i;:::-;20576:2;20571:3;20567:12;20560:19;;20596:3;20589:10;;20349:256;;;;:::o;20611:141::-;20660:4;20683:3;20675:11;;20706:3;20703:1;20696:14;20740:4;20737:1;20727:18;20719:26;;20611:141;;;:::o;20758:93::-;20795:6;20842:2;20837;20830:5;20826:14;20822:23;20812:33;;20758:93;;;:::o;20857:107::-;20901:8;20951:5;20945:4;20941:16;20920:37;;20857:107;;;;:::o;20970:393::-;21039:6;21089:1;21077:10;21073:18;21112:97;21142:66;21131:9;21112:97;:::i;:::-;21230:39;21260:8;21249:9;21230:39;:::i;:::-;21218:51;;21302:4;21298:9;21291:5;21287:21;21278:30;;21351:4;21341:8;21337:19;21330:5;21327:30;21317:40;;21046:317;;20970:393;;;;;:::o;21369:60::-;21397:3;21418:5;21411:12;;21369:60;;;:::o;21435:142::-;21485:9;21518:53;21536:34;21545:24;21563:5;21545:24;:::i;:::-;21536:34;:::i;:::-;21518:53;:::i;:::-;21505:66;;21435:142;;;:::o;21583:75::-;21626:3;21647:5;21640:12;;21583:75;;;:::o;21664:269::-;21774:39;21805:7;21774:39;:::i;:::-;21835:91;21884:41;21908:16;21884:41;:::i;:::-;21876:6;21869:4;21863:11;21835:91;:::i;:::-;21829:4;21822:105;21740:193;21664:269;;;:::o;21939:73::-;21984:3;21939:73;:::o;22018:189::-;22095:32;;:::i;:::-;22136:65;22194:6;22186;22180:4;22136:65;:::i;:::-;22071:136;22018:189;;:::o;22213:186::-;22273:120;22290:3;22283:5;22280:14;22273:120;;;22344:39;22381:1;22374:5;22344:39;:::i;:::-;22317:1;22310:5;22306:13;22297:22;;22273:120;;;22213:186;;:::o;22405:543::-;22506:2;22501:3;22498:11;22495:446;;;22540:38;22572:5;22540:38;:::i;:::-;22624:29;22642:10;22624:29;:::i;:::-;22614:8;22610:44;22807:2;22795:10;22792:18;22789:49;;;22828:8;22813:23;;22789:49;22851:80;22907:22;22925:3;22907:22;:::i;:::-;22897:8;22893:37;22880:11;22851:80;:::i;:::-;22510:431;;22495:446;22405:543;;;:::o;22954:117::-;23008:8;23058:5;23052:4;23048:16;23027:37;;22954:117;;;;:::o;23077:169::-;23121:6;23154:51;23202:1;23198:6;23190:5;23187:1;23183:13;23154:51;:::i;:::-;23150:56;23235:4;23229;23225:15;23215:25;;23128:118;23077:169;;;;:::o;23251:295::-;23327:4;23473:29;23498:3;23492:4;23473:29;:::i;:::-;23465:37;;23535:3;23532:1;23528:11;23522:4;23519:21;23511:29;;23251:295;;;;:::o;23551:1395::-;23668:37;23701:3;23668:37;:::i;:::-;23770:18;23762:6;23759:30;23756:56;;;23792:18;;:::i;:::-;23756:56;23836:38;23868:4;23862:11;23836:38;:::i;:::-;23921:67;23981:6;23973;23967:4;23921:67;:::i;:::-;24015:1;24039:4;24026:17;;24071:2;24063:6;24060:14;24088:1;24083:618;;;;24745:1;24762:6;24759:77;;;24811:9;24806:3;24802:19;24796:26;24787:35;;24759:77;24862:67;24922:6;24915:5;24862:67;:::i;:::-;24856:4;24849:81;24718:222;24053:887;;24083:618;24135:4;24131:9;24123:6;24119:22;24169:37;24201:4;24169:37;:::i;:::-;24228:1;24242:208;24256:7;24253:1;24250:14;24242:208;;;24335:9;24330:3;24326:19;24320:26;24312:6;24305:42;24386:1;24378:6;24374:14;24364:24;;24433:2;24422:9;24418:18;24405:31;;24279:4;24276:1;24272:12;24267:17;;24242:208;;;24478:6;24469:7;24466:19;24463:179;;;24536:9;24531:3;24527:19;24521:26;24579:48;24621:4;24613:6;24609:17;24598:9;24579:48;:::i;:::-;24571:6;24564:64;24486:156;24463:179;24688:1;24684;24676:6;24672:14;24668:22;24662:4;24655:36;24090:611;;;24053:887;;23643:1303;;;23551:1395;;:::o;24952:174::-;25092:26;25088:1;25080:6;25076:14;25069:50;24952:174;:::o;25132:366::-;25274:3;25295:67;25359:2;25354:3;25295:67;:::i;:::-;25288:74;;25371:93;25460:3;25371:93;:::i;:::-;25489:2;25484:3;25480:12;25473:19;;25132:366;;;:::o;25504:419::-;25670:4;25708:2;25697:9;25693:18;25685:26;;25757:9;25751:4;25747:20;25743:1;25732:9;25728:17;25721:47;25785:131;25911:4;25785:131;:::i;:::-;25777:139;;25504:419;;;:::o;25929:228::-;26069:34;26065:1;26057:6;26053:14;26046:58;26138:11;26133:2;26125:6;26121:15;26114:36;25929:228;:::o;26163:366::-;26305:3;26326:67;26390:2;26385:3;26326:67;:::i;:::-;26319:74;;26402:93;26491:3;26402:93;:::i;:::-;26520:2;26515:3;26511:12;26504:19;;26163:366;;;:::o;26535:419::-;26701:4;26739:2;26728:9;26724:18;26716:26;;26788:9;26782:4;26778:20;26774:1;26763:9;26759:17;26752:47;26816:131;26942:4;26816:131;:::i;:::-;26808:139;;26535:419;;;:::o;26960:76::-;26996:7;27025:5;27014:16;;26960:76;;;:::o;27042:231::-;27080:3;27103:23;27120:5;27103:23;:::i;:::-;27094:32;;27148:66;27141:5;27138:77;27135:103;;27218:18;;:::i;:::-;27135:103;27265:1;27258:5;27254:13;27247:20;;27042:231;;;:::o;27279:147::-;27380:11;27417:3;27402:18;;27279:147;;;;:::o;27432:114::-;;:::o;27552:398::-;27711:3;27732:83;27813:1;27808:3;27732:83;:::i;:::-;27725:90;;27824:93;27913:3;27824:93;:::i;:::-;27942:1;27937:3;27933:11;27926:18;;27552:398;;;:::o;27956:379::-;28140:3;28162:147;28305:3;28162:147;:::i;:::-;28155:154;;28326:3;28319:10;;27956:379;;;:::o;28341:165::-;28481:17;28477:1;28469:6;28465:14;28458:41;28341:165;:::o;28512:366::-;28654:3;28675:67;28739:2;28734:3;28675:67;:::i;:::-;28668:74;;28751:93;28840:3;28751:93;:::i;:::-;28869:2;28864:3;28860:12;28853:19;;28512:366;;;:::o;28884:419::-;29050:4;29088:2;29077:9;29073:18;29065:26;;29137:9;29131:4;29127:20;29123:1;29112:9;29108:17;29101:47;29165:131;29291:4;29165:131;:::i;:::-;29157:139;;28884:419;;;:::o;29309:234::-;29449:34;29445:1;29437:6;29433:14;29426:58;29518:17;29513:2;29505:6;29501:15;29494:42;29309:234;:::o;29549:366::-;29691:3;29712:67;29776:2;29771:3;29712:67;:::i;:::-;29705:74;;29788:93;29877:3;29788:93;:::i;:::-;29906:2;29901:3;29897:12;29890:19;;29549:366;;;:::o;29921:419::-;30087:4;30125:2;30114:9;30110:18;30102:26;;30174:9;30168:4;30164:20;30160:1;30149:9;30145:17;30138:47;30202:131;30328:4;30202:131;:::i;:::-;30194:139;;29921:419;;;:::o;30346:148::-;30448:11;30485:3;30470:18;;30346:148;;;;:::o;30500:390::-;30606:3;30634:39;30667:5;30634:39;:::i;:::-;30689:89;30771:6;30766:3;30689:89;:::i;:::-;30682:96;;30787:65;30845:6;30840:3;30833:4;30826:5;30822:16;30787:65;:::i;:::-;30877:6;30872:3;30868:16;30861:23;;30610:280;30500:390;;;;:::o;30920:874::-;31023:3;31060:5;31054:12;31089:36;31115:9;31089:36;:::i;:::-;31141:89;31223:6;31218:3;31141:89;:::i;:::-;31134:96;;31261:1;31250:9;31246:17;31277:1;31272:166;;;;31452:1;31447:341;;;;31239:549;;31272:166;31356:4;31352:9;31341;31337:25;31332:3;31325:38;31418:6;31411:14;31404:22;31396:6;31392:35;31387:3;31383:45;31376:52;;31272:166;;31447:341;31514:38;31546:5;31514:38;:::i;:::-;31574:1;31588:154;31602:6;31599:1;31596:13;31588:154;;;31676:7;31670:14;31666:1;31661:3;31657:11;31650:35;31726:1;31717:7;31713:15;31702:26;;31624:4;31621:1;31617:12;31612:17;;31588:154;;;31771:6;31766:3;31762:16;31755:23;;31454:334;;31239:549;;31027:767;;30920:874;;;;:::o;31800:589::-;32025:3;32047:95;32138:3;32129:6;32047:95;:::i;:::-;32040:102;;32159:95;32250:3;32241:6;32159:95;:::i;:::-;32152:102;;32271:92;32359:3;32350:6;32271:92;:::i;:::-;32264:99;;32380:3;32373:10;;31800:589;;;;;;:::o;32395:225::-;32535:34;32531:1;32523:6;32519:14;32512:58;32604:8;32599:2;32591:6;32587:15;32580:33;32395:225;:::o;32626:366::-;32768:3;32789:67;32853:2;32848:3;32789:67;:::i;:::-;32782:74;;32865:93;32954:3;32865:93;:::i;:::-;32983:2;32978:3;32974:12;32967:19;;32626:366;;;:::o;32998:419::-;33164:4;33202:2;33191:9;33187:18;33179:26;;33251:9;33245:4;33241:20;33237:1;33226:9;33222:17;33215:47;33279:131;33405:4;33279:131;:::i;:::-;33271:139;;32998:419;;;:::o;33423:182::-;33563:34;33559:1;33551:6;33547:14;33540:58;33423:182;:::o;33611:366::-;33753:3;33774:67;33838:2;33833:3;33774:67;:::i;:::-;33767:74;;33850:93;33939:3;33850:93;:::i;:::-;33968:2;33963:3;33959:12;33952:19;;33611:366;;;:::o;33983:419::-;34149:4;34187:2;34176:9;34172:18;34164:26;;34236:9;34230:4;34226:20;34222:1;34211:9;34207:17;34200:47;34264:131;34390:4;34264:131;:::i;:::-;34256:139;;33983:419;;;:::o;34408:229::-;34548:34;34544:1;34536:6;34532:14;34525:58;34617:12;34612:2;34604:6;34600:15;34593:37;34408:229;:::o;34643:366::-;34785:3;34806:67;34870:2;34865:3;34806:67;:::i;:::-;34799:74;;34882:93;34971:3;34882:93;:::i;:::-;35000:2;34995:3;34991:12;34984:19;;34643:366;;;:::o;35015:419::-;35181:4;35219:2;35208:9;35204:18;35196:26;;35268:9;35262:4;35258:20;35254:1;35243:9;35239:17;35232:47;35296:131;35422:4;35296:131;:::i;:::-;35288:139;;35015:419;;;:::o;35440:175::-;35580:27;35576:1;35568:6;35564:14;35557:51;35440:175;:::o;35621:366::-;35763:3;35784:67;35848:2;35843:3;35784:67;:::i;:::-;35777:74;;35860:93;35949:3;35860:93;:::i;:::-;35978:2;35973:3;35969:12;35962:19;;35621:366;;;:::o;35993:419::-;36159:4;36197:2;36186:9;36182:18;36174:26;;36246:9;36240:4;36236:20;36232:1;36221:9;36217:17;36210:47;36274:131;36400:4;36274:131;:::i;:::-;36266:139;;35993:419;;;:::o;36418:220::-;36558:34;36554:1;36546:6;36542:14;36535:58;36627:3;36622:2;36614:6;36610:15;36603:28;36418:220;:::o;36644:366::-;36786:3;36807:67;36871:2;36866:3;36807:67;:::i;:::-;36800:74;;36883:93;36972:3;36883:93;:::i;:::-;37001:2;36996:3;36992:12;36985:19;;36644:366;;;:::o;37016:419::-;37182:4;37220:2;37209:9;37205:18;37197:26;;37269:9;37263:4;37259:20;37255:1;37244:9;37240:17;37233:47;37297:131;37423:4;37297:131;:::i;:::-;37289:139;;37016:419;;;:::o;37441:248::-;37581:34;37577:1;37569:6;37565:14;37558:58;37650:31;37645:2;37637:6;37633:15;37626:56;37441:248;:::o;37695:366::-;37837:3;37858:67;37922:2;37917:3;37858:67;:::i;:::-;37851:74;;37934:93;38023:3;37934:93;:::i;:::-;38052:2;38047:3;38043:12;38036:19;;37695:366;;;:::o;38067:419::-;38233:4;38271:2;38260:9;38256:18;38248:26;;38320:9;38314:4;38310:20;38306:1;38295:9;38291:17;38284:47;38348:131;38474:4;38348:131;:::i;:::-;38340:139;;38067:419;;;:::o;38492:232::-;38632:34;38628:1;38620:6;38616:14;38609:58;38701:15;38696:2;38688:6;38684:15;38677:40;38492:232;:::o;38730:366::-;38872:3;38893:67;38957:2;38952:3;38893:67;:::i;:::-;38886:74;;38969:93;39058:3;38969:93;:::i;:::-;39087:2;39082:3;39078:12;39071:19;;38730:366;;;:::o;39102:419::-;39268:4;39306:2;39295:9;39291:18;39283:26;;39355:9;39349:4;39345:20;39341:1;39330:9;39326:17;39319:47;39383:131;39509:4;39383:131;:::i;:::-;39375:139;;39102:419;;;:::o;39527:182::-;39667:34;39663:1;39655:6;39651:14;39644:58;39527:182;:::o;39715:366::-;39857:3;39878:67;39942:2;39937:3;39878:67;:::i;:::-;39871:74;;39954:93;40043:3;39954:93;:::i;:::-;40072:2;40067:3;40063:12;40056:19;;39715:366;;;:::o;40087:419::-;40253:4;40291:2;40280:9;40276:18;40268:26;;40340:9;40334:4;40330:20;40326:1;40315:9;40311:17;40304:47;40368:131;40494:4;40368:131;:::i;:::-;40360:139;;40087:419;;;:::o;40512:178::-;40652:30;40648:1;40640:6;40636:14;40629:54;40512:178;:::o;40696:366::-;40838:3;40859:67;40923:2;40918:3;40859:67;:::i;:::-;40852:74;;40935:93;41024:3;40935:93;:::i;:::-;41053:2;41048:3;41044:12;41037:19;;40696:366;;;:::o;41068:419::-;41234:4;41272:2;41261:9;41257:18;41249:26;;41321:9;41315:4;41311:20;41307:1;41296:9;41292:17;41285:47;41349:131;41475:4;41349:131;:::i;:::-;41341:139;;41068:419;;;:::o;41493:224::-;41633:34;41629:1;41621:6;41617:14;41610:58;41702:7;41697:2;41689:6;41685:15;41678:32;41493:224;:::o;41723:366::-;41865:3;41886:67;41950:2;41945:3;41886:67;:::i;:::-;41879:74;;41962:93;42051:3;41962:93;:::i;:::-;42080:2;42075:3;42071:12;42064:19;;41723:366;;;:::o;42095:419::-;42261:4;42299:2;42288:9;42284:18;42276:26;;42348:9;42342:4;42338:20;42334:1;42323:9;42319:17;42312:47;42376:131;42502:4;42376:131;:::i;:::-;42368:139;;42095:419;;;:::o;42520:223::-;42660:34;42656:1;42648:6;42644:14;42637:58;42729:6;42724:2;42716:6;42712:15;42705:31;42520:223;:::o;42749:366::-;42891:3;42912:67;42976:2;42971:3;42912:67;:::i;:::-;42905:74;;42988:93;43077:3;42988:93;:::i;:::-;43106:2;43101:3;43097:12;43090:19;;42749:366;;;:::o;43121:419::-;43287:4;43325:2;43314:9;43310:18;43302:26;;43374:9;43368:4;43364:20;43360:1;43349:9;43345:17;43338:47;43402:131;43528:4;43402:131;:::i;:::-;43394:139;;43121:419;;;:::o;43546:194::-;43586:4;43606:20;43624:1;43606:20;:::i;:::-;43601:25;;43640:20;43658:1;43640:20;:::i;:::-;43635:25;;43684:1;43681;43677:9;43669:17;;43708:1;43702:4;43699:11;43696:37;;;43713:18;;:::i;:::-;43696:37;43546:194;;;;:::o;43746:180::-;43794:77;43791:1;43784:88;43891:4;43888:1;43881:15;43915:4;43912:1;43905:15;43932:175;44072:27;44068:1;44060:6;44056:14;44049:51;43932:175;:::o;44113:366::-;44255:3;44276:67;44340:2;44335:3;44276:67;:::i;:::-;44269:74;;44352:93;44441:3;44352:93;:::i;:::-;44470:2;44465:3;44461:12;44454:19;;44113:366;;;:::o;44485:419::-;44651:4;44689:2;44678:9;44674:18;44666:26;;44738:9;44732:4;44728:20;44724:1;44713:9;44709:17;44702:47;44766:131;44892:4;44766:131;:::i;:::-;44758:139;;44485:419;;;:::o;44910:237::-;45050:34;45046:1;45038:6;45034:14;45027:58;45119:20;45114:2;45106:6;45102:15;45095:45;44910:237;:::o;45153:366::-;45295:3;45316:67;45380:2;45375:3;45316:67;:::i;:::-;45309:74;;45392:93;45481:3;45392:93;:::i;:::-;45510:2;45505:3;45501:12;45494:19;;45153:366;;;:::o;45525:419::-;45691:4;45729:2;45718:9;45714:18;45706:26;;45778:9;45772:4;45768:20;45764:1;45753:9;45749:17;45742:47;45806:131;45932:4;45806:131;:::i;:::-;45798:139;;45525:419;;;:::o;45950:98::-;46001:6;46035:5;46029:12;46019:22;;45950:98;;;:::o;46054:168::-;46137:11;46171:6;46166:3;46159:19;46211:4;46206:3;46202:14;46187:29;;46054:168;;;;:::o;46228:373::-;46314:3;46342:38;46374:5;46342:38;:::i;:::-;46396:70;46459:6;46454:3;46396:70;:::i;:::-;46389:77;;46475:65;46533:6;46528:3;46521:4;46514:5;46510:16;46475:65;:::i;:::-;46565:29;46587:6;46565:29;:::i;:::-;46560:3;46556:39;46549:46;;46318:283;46228:373;;;;:::o;46607:640::-;46802:4;46840:3;46829:9;46825:19;46817:27;;46854:71;46922:1;46911:9;46907:17;46898:6;46854:71;:::i;:::-;46935:72;47003:2;46992:9;46988:18;46979:6;46935:72;:::i;:::-;47017;47085:2;47074:9;47070:18;47061:6;47017:72;:::i;:::-;47136:9;47130:4;47126:20;47121:2;47110:9;47106:18;47099:48;47164:76;47235:4;47226:6;47164:76;:::i;:::-;47156:84;;46607:640;;;;;;;:::o;47253:141::-;47309:5;47340:6;47334:13;47325:22;;47356:32;47382:5;47356:32;:::i;:::-;47253:141;;;;:::o;47400:349::-;47469:6;47518:2;47506:9;47497:7;47493:23;47489:32;47486:119;;;47524:79;;:::i;:::-;47486:119;47644:1;47669:63;47724:7;47715:6;47704:9;47700:22;47669:63;:::i;:::-;47659:73;;47615:127;47400:349;;;;:::o

Swarm Source

ipfs://a72125ffe56db9b8149e3c79fb9496ac0d658b1a5bd689bd5977fe94c93744f9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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