ETH Price: $2,288.84 (-3.54%)

Token

[REDACTED] 2411 (2411)
 

Overview

Max Total Supply

35 2411

Holders

11

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
dankdirectory.eth
Balance
1 2411
0xbea35F8930c2048bB07fE7F8bD5F2af1A3b0fFB6
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:
NFT

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/math/Math.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

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

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

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

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

        uint256 tokenId = firstTokenId;

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: github/2411/redacted.sol




pragma solidity >=0.7.0 <0.9.0;



contract NFT is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public cost = 0.00 ether;
  uint256 public maxSupply = 1000;
  uint256 public maxMintAmount = 1;
  uint256 public nftPerAddressLimit = 3;
  bool public paused = false;
  bool public revealed = true;
  bool public onlyWhitelisted = false;
  address[] public whitelistedAddresses;
  mapping(address => uint256) public addressMintedBalance;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

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

  // public
  function mint(uint256 _mintAmount) public payable {
    require(!paused, "the contract is paused");
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 2411");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= maxSupply, "max 2411 limit exceeded");

    if (msg.sender != owner()) {
        if(onlyWhitelisted == true) {
            require(isWhitelisted(msg.sender), "user is not whitelisted");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max 2411 per address exceeded");
        }
        require(msg.value >= cost * _mintAmount, "insufficient funds");
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      addressMintedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }
  }
  
  function isWhitelisted(address _user) public view returns (bool) {
    for (uint i = 0; i < whitelistedAddresses.length; i++) {
      if (whitelistedAddresses[i] == _user) {
          return true;
      }
    }
    return false;
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

  //only owner
  function reveal() public onlyOwner {
      revealed = true;
  }
  
  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }
  
  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

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

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }
  
  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
  
  function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }
  
  function whitelistUsers(address[] calldata _users) public onlyOwner {
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }
 
  function withdraw() public payable onlyOwner {
    
    
    // This will payout the owner 95% of the contract balance.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90816200004a9190620005a5565b506000600e556103e8600f55600160105560036011556000601260006101000a81548160ff0219169083151502179055506001601260016101000a81548160ff0219169083151502179055506000601260026101000a81548160ff021916908315150217905550348015620000be57600080fd5b5060405162005791380380620057918339818101604052810190620000e49190620007f0565b83838160009081620000f79190620005a5565b508060019081620001099190620005a5565b5050506200012c620001206200015860201b60201c565b6200016060201b60201c565b6200013d826200022660201b60201c565b6200014e816200024b60201b60201c565b5050505062000961565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002366200027060201b60201c565b80600b9081620002479190620005a5565b5050565b6200025b6200027060201b60201c565b80600d90816200026c9190620005a5565b5050565b620002806200015860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002a66200030160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f6906200093f565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003ad57607f821691505b602082108103620003c357620003c262000365565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200042d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003ee565b620004398683620003ee565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000486620004806200047a8462000451565b6200045b565b62000451565b9050919050565b6000819050919050565b620004a28362000465565b620004ba620004b1826200048d565b848454620003fb565b825550505050565b600090565b620004d1620004c2565b620004de81848462000497565b505050565b5b818110156200050657620004fa600082620004c7565b600181019050620004e4565b5050565b601f82111562000555576200051f81620003c9565b6200052a84620003de565b810160208510156200053a578190505b620005526200054985620003de565b830182620004e3565b50505b505050565b600082821c905092915050565b60006200057a600019846008026200055a565b1980831691505092915050565b600062000595838362000567565b9150826002028217905092915050565b620005b0826200032b565b67ffffffffffffffff811115620005cc57620005cb62000336565b5b620005d8825462000394565b620005e58282856200050a565b600060209050601f8311600181146200061d576000841562000608578287015190505b62000614858262000587565b86555062000684565b601f1984166200062d86620003c9565b60005b82811015620006575784890151825560018201915060208501945060208101905062000630565b8683101562000677578489015162000673601f89168262000567565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620006c682620006aa565b810181811067ffffffffffffffff82111715620006e857620006e762000336565b5b80604052505050565b6000620006fd6200068c565b90506200070b8282620006bb565b919050565b600067ffffffffffffffff8211156200072e576200072d62000336565b5b6200073982620006aa565b9050602081019050919050565b60005b838110156200076657808201518184015260208101905062000749565b60008484015250505050565b600062000789620007838462000710565b620006f1565b905082815260208101848484011115620007a857620007a7620006a5565b5b620007b584828562000746565b509392505050565b600082601f830112620007d557620007d4620006a0565b5b8151620007e784826020860162000772565b91505092915050565b600080600080608085870312156200080d576200080c62000696565b5b600085015167ffffffffffffffff8111156200082e576200082d6200069b565b5b6200083c87828801620007bd565b945050602085015167ffffffffffffffff81111562000860576200085f6200069b565b5b6200086e87828801620007bd565b935050604085015167ffffffffffffffff8111156200089257620008916200069b565b5b620008a087828801620007bd565b925050606085015167ffffffffffffffff811115620008c457620008c36200069b565b5b620008d287828801620007bd565b91505092959194509250565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000927602083620008de565b91506200093482620008ef565b602082019050919050565b600060208201905081810360008301526200095a8162000918565b9050919050565b614e2080620009716000396000f3fe6080604052600436106102725760003560e01c80636352211e1161014f578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb011461095c578063da3ef23f14610987578063e985e9c5146109b0578063edec5f27146109ed578063f2c4ce1e14610a16578063f2fde38b14610a3f57610272565b8063b88d4fde1461083a578063ba4e5c4914610863578063ba7d2c76146108a0578063c6682862146108cb578063c87b56dd146108f6578063d0eb26b01461093357610272565b80638da5cb5b116101135780638da5cb5b1461075d57806395d89b41146107885780639c70b512146107b3578063a0712d68146107de578063a22cb465146107fa578063a475b5dd1461082357610272565b80636352211e146106785780636c0360eb146106b557806370a08231146106e0578063715018a61461071d5780637f00c7a61461073457610272565b80632f745c59116101e8578063438b6300116101ac578063438b63001461055657806344a0d68a146105935780634f6ccce7146105bc57806351830227146105f957806355f804b3146106245780635c975abb1461064d57610272565b80632f745c59146104805780633af32abf146104bd5780633c952764146104fa5780633ccfd60b1461052357806342842e0e1461052d57610272565b8063095ea7b31161023a578063095ea7b31461037057806313faede61461039957806318160ddd146103c457806318cae269146103ef578063239c70ae1461042c57806323b872dd1461045757610272565b806301ffc9a71461027757806302329a29146102b457806306fdde03146102dd578063081812fc14610308578063081c8c4414610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613345565b610a68565b6040516102ab919061338d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906133d4565b610ae2565b005b3480156102e957600080fd5b506102f2610b07565b6040516102ff9190613491565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906134e9565b610b99565b60405161033c9190613557565b60405180910390f35b34801561035157600080fd5b5061035a610bdf565b6040516103679190613491565b60405180910390f35b34801561037c57600080fd5b506103976004803603810190610392919061359e565b610c6d565b005b3480156103a557600080fd5b506103ae610d84565b6040516103bb91906135ed565b60405180910390f35b3480156103d057600080fd5b506103d9610d8a565b6040516103e691906135ed565b60405180910390f35b3480156103fb57600080fd5b5061041660048036038101906104119190613608565b610d97565b60405161042391906135ed565b60405180910390f35b34801561043857600080fd5b50610441610daf565b60405161044e91906135ed565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613635565b610db5565b005b34801561048c57600080fd5b506104a760048036038101906104a2919061359e565b610e15565b6040516104b491906135ed565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190613608565b610eba565b6040516104f1919061338d565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c91906133d4565b610f68565b005b61052b610f8d565b005b34801561053957600080fd5b50610554600480360381019061054f9190613635565b611015565b005b34801561056257600080fd5b5061057d60048036038101906105789190613608565b611035565b60405161058a9190613746565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906134e9565b6110e3565b005b3480156105c857600080fd5b506105e360048036038101906105de91906134e9565b6110f5565b6040516105f091906135ed565b60405180910390f35b34801561060557600080fd5b5061060e611166565b60405161061b919061338d565b60405180910390f35b34801561063057600080fd5b5061064b6004803603810190610646919061389d565b611179565b005b34801561065957600080fd5b50610662611194565b60405161066f919061338d565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906134e9565b6111a7565b6040516106ac9190613557565b60405180910390f35b3480156106c157600080fd5b506106ca61122d565b6040516106d79190613491565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190613608565b6112bb565b60405161071491906135ed565b60405180910390f35b34801561072957600080fd5b50610732611372565b005b34801561074057600080fd5b5061075b600480360381019061075691906134e9565b611386565b005b34801561076957600080fd5b50610772611398565b60405161077f9190613557565b60405180910390f35b34801561079457600080fd5b5061079d6113c2565b6040516107aa9190613491565b60405180910390f35b3480156107bf57600080fd5b506107c8611454565b6040516107d5919061338d565b60405180910390f35b6107f860048036038101906107f391906134e9565b611467565b005b34801561080657600080fd5b50610821600480360381019061081c91906138e6565b6117af565b005b34801561082f57600080fd5b506108386117c5565b005b34801561084657600080fd5b50610861600480360381019061085c91906139c7565b6117ea565b005b34801561086f57600080fd5b5061088a600480360381019061088591906134e9565b61184c565b6040516108979190613557565b60405180910390f35b3480156108ac57600080fd5b506108b561188b565b6040516108c291906135ed565b60405180910390f35b3480156108d757600080fd5b506108e0611891565b6040516108ed9190613491565b60405180910390f35b34801561090257600080fd5b5061091d600480360381019061091891906134e9565b61191f565b60405161092a9190613491565b60405180910390f35b34801561093f57600080fd5b5061095a600480360381019061095591906134e9565b611a77565b005b34801561096857600080fd5b50610971611a89565b60405161097e91906135ed565b60405180910390f35b34801561099357600080fd5b506109ae60048036038101906109a9919061389d565b611a8f565b005b3480156109bc57600080fd5b506109d760048036038101906109d29190613a4a565b611aaa565b6040516109e4919061338d565b60405180910390f35b3480156109f957600080fd5b50610a146004803603810190610a0f9190613aea565b611b3e565b005b348015610a2257600080fd5b50610a3d6004803603810190610a38919061389d565b611b6a565b005b348015610a4b57600080fd5b50610a666004803603810190610a619190613608565b611b85565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610adb5750610ada82611c08565b5b9050919050565b610aea611cea565b80601260006101000a81548160ff02191690831515021790555050565b606060008054610b1690613b66565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4290613b66565b8015610b8f5780601f10610b6457610100808354040283529160200191610b8f565b820191906000526020600020905b815481529060010190602001808311610b7257829003601f168201915b5050505050905090565b6000610ba482611d68565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610bec90613b66565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1890613b66565b8015610c655780601f10610c3a57610100808354040283529160200191610c65565b820191906000526020600020905b815481529060010190602001808311610c4857829003601f168201915b505050505081565b6000610c78826111a7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf90613c09565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d07611db3565b73ffffffffffffffffffffffffffffffffffffffff161480610d365750610d3581610d30611db3565b611aaa565b5b610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c90613c9b565b60405180910390fd5b610d7f8383611dbb565b505050565b600e5481565b6000600880549050905090565b60146020528060005260406000206000915090505481565b60105481565b610dc6610dc0611db3565b82611e74565b610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90613d2d565b60405180910390fd5b610e10838383611f09565b505050565b6000610e20836112bb565b8210610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613dbf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600090505b601380549050811015610f5d578273ffffffffffffffffffffffffffffffffffffffff1660138281548110610efa57610ef9613ddf565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f4a576001915050610f63565b8080610f5590613e3d565b915050610ec2565b50600090505b919050565b610f70611cea565b80601260026101000a81548160ff02191690831515021790555050565b610f95611cea565b6000610f9f611398565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fc290613eb6565b60006040518083038185875af1925050503d8060008114610fff576040519150601f19603f3d011682016040523d82523d6000602084013e611004565b606091505b505090508061101257600080fd5b50565b611030838383604051806020016040528060008152506117ea565b505050565b60606000611042836112bb565b905060008167ffffffffffffffff8111156110605761105f613772565b5b60405190808252806020026020018201604052801561108e5781602001602082028036833780820191505090505b50905060005b828110156110d8576110a68582610e15565b8282815181106110b9576110b8613ddf565b5b60200260200101818152505080806110d090613e3d565b915050611094565b508092505050919050565b6110eb611cea565b80600e8190555050565b60006110ff610d8a565b8210611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790613f3d565b60405180910390fd5b6008828154811061115457611153613ddf565b5b90600052602060002001549050919050565b601260019054906101000a900460ff1681565b611181611cea565b80600b90816111909190614109565b5050565b601260009054906101000a900460ff1681565b6000806111b383612202565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b90614227565b60405180910390fd5b80915050919050565b600b805461123a90613b66565b80601f016020809104026020016040519081016040528092919081815260200182805461126690613b66565b80156112b35780601f10611288576101008083540402835291602001916112b3565b820191906000526020600020905b81548152906001019060200180831161129657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361132b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611322906142b9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61137a611cea565b611384600061223f565b565b61138e611cea565b8060108190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113d190613b66565b80601f01602080910402602001604051908101604052809291908181526020018280546113fd90613b66565b801561144a5780601f1061141f5761010080835404028352916020019161144a565b820191906000526020600020905b81548152906001019060200180831161142d57829003601f168201915b5050505050905090565b601260029054906101000a900460ff1681565b601260009054906101000a900460ff16156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614325565b60405180910390fd5b60006114c1610d8a565b905060008211611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90614391565b60405180910390fd5b60105482111561154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290614423565b60405180910390fd5b600f54828261155a9190614443565b111561159b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611592906144c3565b60405180910390fd5b6115a3611398565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461171f5760011515601260029054906101000a900460ff161515036116ce576115f933610eba565b611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f9061452f565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601154838261168b9190614443565b11156116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c39061459b565b60405180910390fd5b505b81600e546116dc91906145bb565b34101561171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614649565b60405180910390fd5b5b6000600190505b8281116117aa57601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061177d90613e3d565b91905055506117973382846117929190614443565b612305565b80806117a290613e3d565b915050611726565b505050565b6117c16117ba611db3565b8383612323565b5050565b6117cd611cea565b6001601260016101000a81548160ff021916908315150217905550565b6117fb6117f5611db3565b83611e74565b61183a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183190613d2d565b60405180910390fd5b6118468484848461248f565b50505050565b6013818154811061185c57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b600c805461189e90613b66565b80601f01602080910402602001604051908101604052809291908181526020018280546118ca90613b66565b80156119175780601f106118ec57610100808354040283529160200191611917565b820191906000526020600020905b8154815290600101906020018083116118fa57829003601f168201915b505050505081565b606061192a826124eb565b611969576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611960906146db565b60405180910390fd5b60001515601260019054906101000a900460ff16151503611a1657600d805461199190613b66565b80601f01602080910402602001604051908101604052809291908181526020018280546119bd90613b66565b8015611a0a5780601f106119df57610100808354040283529160200191611a0a565b820191906000526020600020905b8154815290600101906020018083116119ed57829003601f168201915b50505050509050611a72565b6000611a2061252c565b90506000815111611a405760405180602001604052806000815250611a6e565b80611a4a846125be565b600c604051602001611a5e939291906147ba565b6040516020818303038152906040525b9150505b919050565b611a7f611cea565b8060118190555050565b600f5481565b611a97611cea565b80600c9081611aa69190614109565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b46611cea565b60136000611b5491906131fb565b818160139190611b6592919061321c565b505050565b611b72611cea565b80600d9081611b819190614109565b5050565b611b8d611cea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf39061485d565b60405180910390fd5b611c058161223f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cd357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ce35750611ce28261268c565b5b9050919050565b611cf2611db3565b73ffffffffffffffffffffffffffffffffffffffff16611d10611398565b73ffffffffffffffffffffffffffffffffffffffff1614611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d906148c9565b60405180910390fd5b565b611d71816124eb565b611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da790614227565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e2e836111a7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e80836111a7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ec25750611ec18185611aaa565b5b80611f0057508373ffffffffffffffffffffffffffffffffffffffff16611ee884610b99565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f29826111a7565b73ffffffffffffffffffffffffffffffffffffffff1614611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f769061495b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906149ed565b60405180910390fd5b611ffb83838360016126f6565b8273ffffffffffffffffffffffffffffffffffffffff1661201b826111a7565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120689061495b565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121fd8383836001612854565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61231f82826040518060200160405280600081525061285a565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238890614a59565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612482919061338d565b60405180910390a3505050565b61249a848484611f09565b6124a6848484846128b5565b6124e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dc90614aeb565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661250d83612202565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b805461253b90613b66565b80601f016020809104026020016040519081016040528092919081815260200182805461256790613b66565b80156125b45780601f10612589576101008083540402835291602001916125b4565b820191906000526020600020905b81548152906001019060200180831161259757829003601f168201915b5050505050905090565b6060600060016125cd84612a3c565b01905060008167ffffffffffffffff8111156125ec576125eb613772565b5b6040519080825280601f01601f19166020018201604052801561261e5781602001600182028036833780820191505090505b509050600082602001820190505b600115612681578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161267557612674614b0b565b5b0494506000850361262c575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61270284848484612b8f565b6001811115612746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273d90614bac565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361278d5761278881612cb5565b6127cc565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146127cb576127ca8582612cfe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361280e5761280981612e6b565b61284d565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461284c5761284b8482612f3c565b5b5b5050505050565b50505050565b6128648383612fbb565b61287160008484846128b5565b6128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a790614aeb565b60405180910390fd5b505050565b60006128d68473ffffffffffffffffffffffffffffffffffffffff166131d8565b15612a2f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128ff611db3565b8786866040518563ffffffff1660e01b81526004016129219493929190614c21565b6020604051808303816000875af192505050801561295d57506040513d601f19601f8201168201806040525081019061295a9190614c82565b60015b6129df573d806000811461298d576040519150601f19603f3d011682016040523d82523d6000602084013e612992565b606091505b5060008151036129d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ce90614aeb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a34565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612a9a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612a9057612a8f614b0b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ad7576d04ee2d6d415b85acef81000000008381612acd57612acc614b0b565b5b0492506020810190505b662386f26fc100008310612b0657662386f26fc100008381612afc57612afb614b0b565b5b0492506010810190505b6305f5e1008310612b2f576305f5e1008381612b2557612b24614b0b565b5b0492506008810190505b6127108310612b54576127108381612b4a57612b49614b0b565b5b0492506004810190505b60648310612b775760648381612b6d57612b6c614b0b565b5b0492506002810190505b600a8310612b86576001810190505b80915050919050565b6001811115612caf57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612c235780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c1b9190614caf565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612cae5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca69190614443565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d0b846112bb565b612d159190614caf565b9050600060076000848152602001908152602001600020549050818114612dfa576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e7f9190614caf565b9050600060096000848152602001908152602001600020549050600060088381548110612eaf57612eae613ddf565b5b906000526020600020015490508060088381548110612ed157612ed0613ddf565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f2057612f1f614ce3565b5b6001900381819060005260206000200160009055905550505050565b6000612f47836112bb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361302a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302190614d5e565b60405180910390fd5b613033816124eb565b15613073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306a90614dca565b60405180910390fd5b6130816000838360016126f6565b61308a816124eb565b156130ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c190614dca565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131d4600083836001612854565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b508054600082559060005260206000209081019061321991906132bc565b50565b8280548282559060005260206000209081019282156132ab579160200282015b828111156132aa57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061323c565b5b5090506132b891906132bc565b5090565b5b808211156132d55760008160009055506001016132bd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613322816132ed565b811461332d57600080fd5b50565b60008135905061333f81613319565b92915050565b60006020828403121561335b5761335a6132e3565b5b600061336984828501613330565b91505092915050565b60008115159050919050565b61338781613372565b82525050565b60006020820190506133a2600083018461337e565b92915050565b6133b181613372565b81146133bc57600080fd5b50565b6000813590506133ce816133a8565b92915050565b6000602082840312156133ea576133e96132e3565b5b60006133f8848285016133bf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561343b578082015181840152602081019050613420565b60008484015250505050565b6000601f19601f8301169050919050565b600061346382613401565b61346d818561340c565b935061347d81856020860161341d565b61348681613447565b840191505092915050565b600060208201905081810360008301526134ab8184613458565b905092915050565b6000819050919050565b6134c6816134b3565b81146134d157600080fd5b50565b6000813590506134e3816134bd565b92915050565b6000602082840312156134ff576134fe6132e3565b5b600061350d848285016134d4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061354182613516565b9050919050565b61355181613536565b82525050565b600060208201905061356c6000830184613548565b92915050565b61357b81613536565b811461358657600080fd5b50565b60008135905061359881613572565b92915050565b600080604083850312156135b5576135b46132e3565b5b60006135c385828601613589565b92505060206135d4858286016134d4565b9150509250929050565b6135e7816134b3565b82525050565b600060208201905061360260008301846135de565b92915050565b60006020828403121561361e5761361d6132e3565b5b600061362c84828501613589565b91505092915050565b60008060006060848603121561364e5761364d6132e3565b5b600061365c86828701613589565b935050602061366d86828701613589565b925050604061367e868287016134d4565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136bd816134b3565b82525050565b60006136cf83836136b4565b60208301905092915050565b6000602082019050919050565b60006136f382613688565b6136fd8185613693565b9350613708836136a4565b8060005b8381101561373957815161372088826136c3565b975061372b836136db565b92505060018101905061370c565b5085935050505092915050565b6000602082019050818103600083015261376081846136e8565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137aa82613447565b810181811067ffffffffffffffff821117156137c9576137c8613772565b5b80604052505050565b60006137dc6132d9565b90506137e882826137a1565b919050565b600067ffffffffffffffff82111561380857613807613772565b5b61381182613447565b9050602081019050919050565b82818337600083830152505050565b600061384061383b846137ed565b6137d2565b90508281526020810184848401111561385c5761385b61376d565b5b61386784828561381e565b509392505050565b600082601f83011261388457613883613768565b5b813561389484826020860161382d565b91505092915050565b6000602082840312156138b3576138b26132e3565b5b600082013567ffffffffffffffff8111156138d1576138d06132e8565b5b6138dd8482850161386f565b91505092915050565b600080604083850312156138fd576138fc6132e3565b5b600061390b85828601613589565b925050602061391c858286016133bf565b9150509250929050565b600067ffffffffffffffff82111561394157613940613772565b5b61394a82613447565b9050602081019050919050565b600061396a61396584613926565b6137d2565b9050828152602081018484840111156139865761398561376d565b5b61399184828561381e565b509392505050565b600082601f8301126139ae576139ad613768565b5b81356139be848260208601613957565b91505092915050565b600080600080608085870312156139e1576139e06132e3565b5b60006139ef87828801613589565b9450506020613a0087828801613589565b9350506040613a11878288016134d4565b925050606085013567ffffffffffffffff811115613a3257613a316132e8565b5b613a3e87828801613999565b91505092959194509250565b60008060408385031215613a6157613a606132e3565b5b6000613a6f85828601613589565b9250506020613a8085828601613589565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613aaa57613aa9613768565b5b8235905067ffffffffffffffff811115613ac757613ac6613a8a565b5b602083019150836020820283011115613ae357613ae2613a8f565b5b9250929050565b60008060208385031215613b0157613b006132e3565b5b600083013567ffffffffffffffff811115613b1f57613b1e6132e8565b5b613b2b85828601613a94565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b7e57607f821691505b602082108103613b9157613b90613b37565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bf360218361340c565b9150613bfe82613b97565b604082019050919050565b60006020820190508181036000830152613c2281613be6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613c85603d8361340c565b9150613c9082613c29565b604082019050919050565b60006020820190508181036000830152613cb481613c78565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613d17602d8361340c565b9150613d2282613cbb565b604082019050919050565b60006020820190508181036000830152613d4681613d0a565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613da9602b8361340c565b9150613db482613d4d565b604082019050919050565b60006020820190508181036000830152613dd881613d9c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e48826134b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7a57613e79613e0e565b5b600182019050919050565b600081905092915050565b50565b6000613ea0600083613e85565b9150613eab82613e90565b600082019050919050565b6000613ec182613e93565b9150819050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f27602c8361340c565b9150613f3282613ecb565b604082019050919050565b60006020820190508181036000830152613f5681613f1a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613fbf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f82565b613fc98683613f82565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614006614001613ffc846134b3565b613fe1565b6134b3565b9050919050565b6000819050919050565b61402083613feb565b61403461402c8261400d565b848454613f8f565b825550505050565b600090565b61404961403c565b614054818484614017565b505050565b5b818110156140785761406d600082614041565b60018101905061405a565b5050565b601f8211156140bd5761408e81613f5d565b61409784613f72565b810160208510156140a6578190505b6140ba6140b285613f72565b830182614059565b50505b505050565b600082821c905092915050565b60006140e0600019846008026140c2565b1980831691505092915050565b60006140f983836140cf565b9150826002028217905092915050565b61411282613401565b67ffffffffffffffff81111561412b5761412a613772565b5b6141358254613b66565b61414082828561407c565b600060209050601f8311600181146141735760008415614161578287015190505b61416b85826140ed565b8655506141d3565b601f19841661418186613f5d565b60005b828110156141a957848901518255600182019150602085019450602081019050614184565b868310156141c657848901516141c2601f8916826140cf565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061421160188361340c565b915061421c826141db565b602082019050919050565b6000602082019050818103600083015261424081614204565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006142a360298361340c565b91506142ae82614247565b604082019050919050565b600060208201905081810360008301526142d281614296565b9050919050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b600061430f60168361340c565b915061431a826142d9565b602082019050919050565b6000602082019050818103600083015261433e81614302565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031203234313100000000600082015250565b600061437b601c8361340c565b915061438682614345565b602082019050919050565b600060208201905081810360008301526143aa8161436e565b9050919050565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b600061440d60248361340c565b9150614418826143b1565b604082019050919050565b6000602082019050818103600083015261443c81614400565b9050919050565b600061444e826134b3565b9150614459836134b3565b925082820190508082111561447157614470613e0e565b5b92915050565b7f6d61782032343131206c696d6974206578636565646564000000000000000000600082015250565b60006144ad60178361340c565b91506144b882614477565b602082019050919050565b600060208201905081810360008301526144dc816144a0565b9050919050565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b600061451960178361340c565b9150614524826144e3565b602082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b7f6d61782032343131207065722061646472657373206578636565646564000000600082015250565b6000614585601d8361340c565b91506145908261454f565b602082019050919050565b600060208201905081810360008301526145b481614578565b9050919050565b60006145c6826134b3565b91506145d1836134b3565b92508282026145df816134b3565b915082820484148315176145f6576145f5613e0e565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061463360128361340c565b915061463e826145fd565b602082019050919050565b6000602082019050818103600083015261466281614626565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146c5602f8361340c565b91506146d082614669565b604082019050919050565b600060208201905081810360008301526146f4816146b8565b9050919050565b600081905092915050565b600061471182613401565b61471b81856146fb565b935061472b81856020860161341d565b80840191505092915050565b6000815461474481613b66565b61474e81866146fb565b94506001821660008114614769576001811461477e576147b1565b60ff19831686528115158202860193506147b1565b61478785613f5d565b60005b838110156147a95781548189015260018201915060208101905061478a565b838801955050505b50505092915050565b60006147c68286614706565b91506147d28285614706565b91506147de8284614737565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061484760268361340c565b9150614852826147eb565b604082019050919050565b600060208201905081810360008301526148768161483a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148b360208361340c565b91506148be8261487d565b602082019050919050565b600060208201905081810360008301526148e2816148a6565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061494560258361340c565b9150614950826148e9565b604082019050919050565b6000602082019050818103600083015261497481614938565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006149d760248361340c565b91506149e28261497b565b604082019050919050565b60006020820190508181036000830152614a06816149ca565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614a4360198361340c565b9150614a4e82614a0d565b602082019050919050565b60006020820190508181036000830152614a7281614a36565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614ad560328361340c565b9150614ae082614a79565b604082019050919050565b60006020820190508181036000830152614b0481614ac8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614b9660358361340c565b9150614ba182614b3a565b604082019050919050565b60006020820190508181036000830152614bc581614b89565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bf382614bcc565b614bfd8185614bd7565b9350614c0d81856020860161341d565b614c1681613447565b840191505092915050565b6000608082019050614c366000830187613548565b614c436020830186613548565b614c5060408301856135de565b8181036060830152614c628184614be8565b905095945050505050565b600081519050614c7c81613319565b92915050565b600060208284031215614c9857614c976132e3565b5b6000614ca684828501614c6d565b91505092915050565b6000614cba826134b3565b9150614cc5836134b3565b9250828203905081811115614cdd57614cdc613e0e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d4860208361340c565b9150614d5382614d12565b602082019050919050565b60006020820190508181036000830152614d7781614d3b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614db4601c8361340c565b9150614dbf82614d7e565b602082019050919050565b60006020820190508181036000830152614de381614da7565b905091905056fea26469706673582212204100527d1f54549761f1e3a6f38b8a88cc1db94660cb8f90b86aeec660240a2264736f6c63430008110033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000f5b52454441435445445d20323431310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000432343131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696334747479647174617a3465333665657265786a616964347a356f67376764336664716e35336f7372626c36653636726a796e652f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102725760003560e01c80636352211e1161014f578063b88d4fde116100c1578063d5abeb011161007a578063d5abeb011461095c578063da3ef23f14610987578063e985e9c5146109b0578063edec5f27146109ed578063f2c4ce1e14610a16578063f2fde38b14610a3f57610272565b8063b88d4fde1461083a578063ba4e5c4914610863578063ba7d2c76146108a0578063c6682862146108cb578063c87b56dd146108f6578063d0eb26b01461093357610272565b80638da5cb5b116101135780638da5cb5b1461075d57806395d89b41146107885780639c70b512146107b3578063a0712d68146107de578063a22cb465146107fa578063a475b5dd1461082357610272565b80636352211e146106785780636c0360eb146106b557806370a08231146106e0578063715018a61461071d5780637f00c7a61461073457610272565b80632f745c59116101e8578063438b6300116101ac578063438b63001461055657806344a0d68a146105935780634f6ccce7146105bc57806351830227146105f957806355f804b3146106245780635c975abb1461064d57610272565b80632f745c59146104805780633af32abf146104bd5780633c952764146104fa5780633ccfd60b1461052357806342842e0e1461052d57610272565b8063095ea7b31161023a578063095ea7b31461037057806313faede61461039957806318160ddd146103c457806318cae269146103ef578063239c70ae1461042c57806323b872dd1461045757610272565b806301ffc9a71461027757806302329a29146102b457806306fdde03146102dd578063081812fc14610308578063081c8c4414610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613345565b610a68565b6040516102ab919061338d565b60405180910390f35b3480156102c057600080fd5b506102db60048036038101906102d691906133d4565b610ae2565b005b3480156102e957600080fd5b506102f2610b07565b6040516102ff9190613491565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906134e9565b610b99565b60405161033c9190613557565b60405180910390f35b34801561035157600080fd5b5061035a610bdf565b6040516103679190613491565b60405180910390f35b34801561037c57600080fd5b506103976004803603810190610392919061359e565b610c6d565b005b3480156103a557600080fd5b506103ae610d84565b6040516103bb91906135ed565b60405180910390f35b3480156103d057600080fd5b506103d9610d8a565b6040516103e691906135ed565b60405180910390f35b3480156103fb57600080fd5b5061041660048036038101906104119190613608565b610d97565b60405161042391906135ed565b60405180910390f35b34801561043857600080fd5b50610441610daf565b60405161044e91906135ed565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613635565b610db5565b005b34801561048c57600080fd5b506104a760048036038101906104a2919061359e565b610e15565b6040516104b491906135ed565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df9190613608565b610eba565b6040516104f1919061338d565b60405180910390f35b34801561050657600080fd5b50610521600480360381019061051c91906133d4565b610f68565b005b61052b610f8d565b005b34801561053957600080fd5b50610554600480360381019061054f9190613635565b611015565b005b34801561056257600080fd5b5061057d60048036038101906105789190613608565b611035565b60405161058a9190613746565b60405180910390f35b34801561059f57600080fd5b506105ba60048036038101906105b591906134e9565b6110e3565b005b3480156105c857600080fd5b506105e360048036038101906105de91906134e9565b6110f5565b6040516105f091906135ed565b60405180910390f35b34801561060557600080fd5b5061060e611166565b60405161061b919061338d565b60405180910390f35b34801561063057600080fd5b5061064b6004803603810190610646919061389d565b611179565b005b34801561065957600080fd5b50610662611194565b60405161066f919061338d565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906134e9565b6111a7565b6040516106ac9190613557565b60405180910390f35b3480156106c157600080fd5b506106ca61122d565b6040516106d79190613491565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190613608565b6112bb565b60405161071491906135ed565b60405180910390f35b34801561072957600080fd5b50610732611372565b005b34801561074057600080fd5b5061075b600480360381019061075691906134e9565b611386565b005b34801561076957600080fd5b50610772611398565b60405161077f9190613557565b60405180910390f35b34801561079457600080fd5b5061079d6113c2565b6040516107aa9190613491565b60405180910390f35b3480156107bf57600080fd5b506107c8611454565b6040516107d5919061338d565b60405180910390f35b6107f860048036038101906107f391906134e9565b611467565b005b34801561080657600080fd5b50610821600480360381019061081c91906138e6565b6117af565b005b34801561082f57600080fd5b506108386117c5565b005b34801561084657600080fd5b50610861600480360381019061085c91906139c7565b6117ea565b005b34801561086f57600080fd5b5061088a600480360381019061088591906134e9565b61184c565b6040516108979190613557565b60405180910390f35b3480156108ac57600080fd5b506108b561188b565b6040516108c291906135ed565b60405180910390f35b3480156108d757600080fd5b506108e0611891565b6040516108ed9190613491565b60405180910390f35b34801561090257600080fd5b5061091d600480360381019061091891906134e9565b61191f565b60405161092a9190613491565b60405180910390f35b34801561093f57600080fd5b5061095a600480360381019061095591906134e9565b611a77565b005b34801561096857600080fd5b50610971611a89565b60405161097e91906135ed565b60405180910390f35b34801561099357600080fd5b506109ae60048036038101906109a9919061389d565b611a8f565b005b3480156109bc57600080fd5b506109d760048036038101906109d29190613a4a565b611aaa565b6040516109e4919061338d565b60405180910390f35b3480156109f957600080fd5b50610a146004803603810190610a0f9190613aea565b611b3e565b005b348015610a2257600080fd5b50610a3d6004803603810190610a38919061389d565b611b6a565b005b348015610a4b57600080fd5b50610a666004803603810190610a619190613608565b611b85565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610adb5750610ada82611c08565b5b9050919050565b610aea611cea565b80601260006101000a81548160ff02191690831515021790555050565b606060008054610b1690613b66565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4290613b66565b8015610b8f5780601f10610b6457610100808354040283529160200191610b8f565b820191906000526020600020905b815481529060010190602001808311610b7257829003601f168201915b5050505050905090565b6000610ba482611d68565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610bec90613b66565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1890613b66565b8015610c655780601f10610c3a57610100808354040283529160200191610c65565b820191906000526020600020905b815481529060010190602001808311610c4857829003601f168201915b505050505081565b6000610c78826111a7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ce8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdf90613c09565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d07611db3565b73ffffffffffffffffffffffffffffffffffffffff161480610d365750610d3581610d30611db3565b611aaa565b5b610d75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6c90613c9b565b60405180910390fd5b610d7f8383611dbb565b505050565b600e5481565b6000600880549050905090565b60146020528060005260406000206000915090505481565b60105481565b610dc6610dc0611db3565b82611e74565b610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc90613d2d565b60405180910390fd5b610e10838383611f09565b505050565b6000610e20836112bb565b8210610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613dbf565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600080600090505b601380549050811015610f5d578273ffffffffffffffffffffffffffffffffffffffff1660138281548110610efa57610ef9613ddf565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f4a576001915050610f63565b8080610f5590613e3d565b915050610ec2565b50600090505b919050565b610f70611cea565b80601260026101000a81548160ff02191690831515021790555050565b610f95611cea565b6000610f9f611398565b73ffffffffffffffffffffffffffffffffffffffff1647604051610fc290613eb6565b60006040518083038185875af1925050503d8060008114610fff576040519150601f19603f3d011682016040523d82523d6000602084013e611004565b606091505b505090508061101257600080fd5b50565b611030838383604051806020016040528060008152506117ea565b505050565b60606000611042836112bb565b905060008167ffffffffffffffff8111156110605761105f613772565b5b60405190808252806020026020018201604052801561108e5781602001602082028036833780820191505090505b50905060005b828110156110d8576110a68582610e15565b8282815181106110b9576110b8613ddf565b5b60200260200101818152505080806110d090613e3d565b915050611094565b508092505050919050565b6110eb611cea565b80600e8190555050565b60006110ff610d8a565b8210611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790613f3d565b60405180910390fd5b6008828154811061115457611153613ddf565b5b90600052602060002001549050919050565b601260019054906101000a900460ff1681565b611181611cea565b80600b90816111909190614109565b5050565b601260009054906101000a900460ff1681565b6000806111b383612202565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121b90614227565b60405180910390fd5b80915050919050565b600b805461123a90613b66565b80601f016020809104026020016040519081016040528092919081815260200182805461126690613b66565b80156112b35780601f10611288576101008083540402835291602001916112b3565b820191906000526020600020905b81548152906001019060200180831161129657829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361132b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611322906142b9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61137a611cea565b611384600061223f565b565b61138e611cea565b8060108190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113d190613b66565b80601f01602080910402602001604051908101604052809291908181526020018280546113fd90613b66565b801561144a5780601f1061141f5761010080835404028352916020019161144a565b820191906000526020600020905b81548152906001019060200180831161142d57829003601f168201915b5050505050905090565b601260029054906101000a900460ff1681565b601260009054906101000a900460ff16156114b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ae90614325565b60405180910390fd5b60006114c1610d8a565b905060008211611506576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fd90614391565b60405180910390fd5b60105482111561154b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154290614423565b60405180910390fd5b600f54828261155a9190614443565b111561159b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611592906144c3565b60405180910390fd5b6115a3611398565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461171f5760011515601260029054906101000a900460ff161515036116ce576115f933610eba565b611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f9061452f565b60405180910390fd5b6000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050601154838261168b9190614443565b11156116cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c39061459b565b60405180910390fd5b505b81600e546116dc91906145bb565b34101561171e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171590614649565b60405180910390fd5b5b6000600190505b8281116117aa57601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061177d90613e3d565b91905055506117973382846117929190614443565b612305565b80806117a290613e3d565b915050611726565b505050565b6117c16117ba611db3565b8383612323565b5050565b6117cd611cea565b6001601260016101000a81548160ff021916908315150217905550565b6117fb6117f5611db3565b83611e74565b61183a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183190613d2d565b60405180910390fd5b6118468484848461248f565b50505050565b6013818154811061185c57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60115481565b600c805461189e90613b66565b80601f01602080910402602001604051908101604052809291908181526020018280546118ca90613b66565b80156119175780601f106118ec57610100808354040283529160200191611917565b820191906000526020600020905b8154815290600101906020018083116118fa57829003601f168201915b505050505081565b606061192a826124eb565b611969576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611960906146db565b60405180910390fd5b60001515601260019054906101000a900460ff16151503611a1657600d805461199190613b66565b80601f01602080910402602001604051908101604052809291908181526020018280546119bd90613b66565b8015611a0a5780601f106119df57610100808354040283529160200191611a0a565b820191906000526020600020905b8154815290600101906020018083116119ed57829003601f168201915b50505050509050611a72565b6000611a2061252c565b90506000815111611a405760405180602001604052806000815250611a6e565b80611a4a846125be565b600c604051602001611a5e939291906147ba565b6040516020818303038152906040525b9150505b919050565b611a7f611cea565b8060118190555050565b600f5481565b611a97611cea565b80600c9081611aa69190614109565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611b46611cea565b60136000611b5491906131fb565b818160139190611b6592919061321c565b505050565b611b72611cea565b80600d9081611b819190614109565b5050565b611b8d611cea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf39061485d565b60405180910390fd5b611c058161223f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cd357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ce35750611ce28261268c565b5b9050919050565b611cf2611db3565b73ffffffffffffffffffffffffffffffffffffffff16611d10611398565b73ffffffffffffffffffffffffffffffffffffffff1614611d66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5d906148c9565b60405180910390fd5b565b611d71816124eb565b611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da790614227565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e2e836111a7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e80836111a7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ec25750611ec18185611aaa565b5b80611f0057508373ffffffffffffffffffffffffffffffffffffffff16611ee884610b99565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f29826111a7565b73ffffffffffffffffffffffffffffffffffffffff1614611f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f769061495b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906149ed565b60405180910390fd5b611ffb83838360016126f6565b8273ffffffffffffffffffffffffffffffffffffffff1661201b826111a7565b73ffffffffffffffffffffffffffffffffffffffff1614612071576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120689061495b565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121fd8383836001612854565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61231f82826040518060200160405280600081525061285a565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238890614a59565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612482919061338d565b60405180910390a3505050565b61249a848484611f09565b6124a6848484846128b5565b6124e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124dc90614aeb565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661250d83612202565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b805461253b90613b66565b80601f016020809104026020016040519081016040528092919081815260200182805461256790613b66565b80156125b45780601f10612589576101008083540402835291602001916125b4565b820191906000526020600020905b81548152906001019060200180831161259757829003601f168201915b5050505050905090565b6060600060016125cd84612a3c565b01905060008167ffffffffffffffff8111156125ec576125eb613772565b5b6040519080825280601f01601f19166020018201604052801561261e5781602001600182028036833780820191505090505b509050600082602001820190505b600115612681578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161267557612674614b0b565b5b0494506000850361262c575b819350505050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61270284848484612b8f565b6001811115612746576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273d90614bac565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361278d5761278881612cb5565b6127cc565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146127cb576127ca8582612cfe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361280e5761280981612e6b565b61284d565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461284c5761284b8482612f3c565b5b5b5050505050565b50505050565b6128648383612fbb565b61287160008484846128b5565b6128b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a790614aeb565b60405180910390fd5b505050565b60006128d68473ffffffffffffffffffffffffffffffffffffffff166131d8565b15612a2f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128ff611db3565b8786866040518563ffffffff1660e01b81526004016129219493929190614c21565b6020604051808303816000875af192505050801561295d57506040513d601f19601f8201168201806040525081019061295a9190614c82565b60015b6129df573d806000811461298d576040519150601f19603f3d011682016040523d82523d6000602084013e612992565b606091505b5060008151036129d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ce90614aeb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a34565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612a9a577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612a9057612a8f614b0b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ad7576d04ee2d6d415b85acef81000000008381612acd57612acc614b0b565b5b0492506020810190505b662386f26fc100008310612b0657662386f26fc100008381612afc57612afb614b0b565b5b0492506010810190505b6305f5e1008310612b2f576305f5e1008381612b2557612b24614b0b565b5b0492506008810190505b6127108310612b54576127108381612b4a57612b49614b0b565b5b0492506004810190505b60648310612b775760648381612b6d57612b6c614b0b565b5b0492506002810190505b600a8310612b86576001810190505b80915050919050565b6001811115612caf57600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612c235780600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c1b9190614caf565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612cae5780600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ca69190614443565b925050819055505b5b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d0b846112bb565b612d159190614caf565b9050600060076000848152602001908152602001600020549050818114612dfa576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e7f9190614caf565b9050600060096000848152602001908152602001600020549050600060088381548110612eaf57612eae613ddf565b5b906000526020600020015490508060088381548110612ed157612ed0613ddf565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f2057612f1f614ce3565b5b6001900381819060005260206000200160009055905550505050565b6000612f47836112bb565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361302a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302190614d5e565b60405180910390fd5b613033816124eb565b15613073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306a90614dca565b60405180910390fd5b6130816000838360016126f6565b61308a816124eb565b156130ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130c190614dca565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131d4600083836001612854565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b508054600082559060005260206000209081019061321991906132bc565b50565b8280548282559060005260206000209081019282156132ab579160200282015b828111156132aa57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509160200191906001019061323c565b5b5090506132b891906132bc565b5090565b5b808211156132d55760008160009055506001016132bd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613322816132ed565b811461332d57600080fd5b50565b60008135905061333f81613319565b92915050565b60006020828403121561335b5761335a6132e3565b5b600061336984828501613330565b91505092915050565b60008115159050919050565b61338781613372565b82525050565b60006020820190506133a2600083018461337e565b92915050565b6133b181613372565b81146133bc57600080fd5b50565b6000813590506133ce816133a8565b92915050565b6000602082840312156133ea576133e96132e3565b5b60006133f8848285016133bf565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561343b578082015181840152602081019050613420565b60008484015250505050565b6000601f19601f8301169050919050565b600061346382613401565b61346d818561340c565b935061347d81856020860161341d565b61348681613447565b840191505092915050565b600060208201905081810360008301526134ab8184613458565b905092915050565b6000819050919050565b6134c6816134b3565b81146134d157600080fd5b50565b6000813590506134e3816134bd565b92915050565b6000602082840312156134ff576134fe6132e3565b5b600061350d848285016134d4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061354182613516565b9050919050565b61355181613536565b82525050565b600060208201905061356c6000830184613548565b92915050565b61357b81613536565b811461358657600080fd5b50565b60008135905061359881613572565b92915050565b600080604083850312156135b5576135b46132e3565b5b60006135c385828601613589565b92505060206135d4858286016134d4565b9150509250929050565b6135e7816134b3565b82525050565b600060208201905061360260008301846135de565b92915050565b60006020828403121561361e5761361d6132e3565b5b600061362c84828501613589565b91505092915050565b60008060006060848603121561364e5761364d6132e3565b5b600061365c86828701613589565b935050602061366d86828701613589565b925050604061367e868287016134d4565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136bd816134b3565b82525050565b60006136cf83836136b4565b60208301905092915050565b6000602082019050919050565b60006136f382613688565b6136fd8185613693565b9350613708836136a4565b8060005b8381101561373957815161372088826136c3565b975061372b836136db565b92505060018101905061370c565b5085935050505092915050565b6000602082019050818103600083015261376081846136e8565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137aa82613447565b810181811067ffffffffffffffff821117156137c9576137c8613772565b5b80604052505050565b60006137dc6132d9565b90506137e882826137a1565b919050565b600067ffffffffffffffff82111561380857613807613772565b5b61381182613447565b9050602081019050919050565b82818337600083830152505050565b600061384061383b846137ed565b6137d2565b90508281526020810184848401111561385c5761385b61376d565b5b61386784828561381e565b509392505050565b600082601f83011261388457613883613768565b5b813561389484826020860161382d565b91505092915050565b6000602082840312156138b3576138b26132e3565b5b600082013567ffffffffffffffff8111156138d1576138d06132e8565b5b6138dd8482850161386f565b91505092915050565b600080604083850312156138fd576138fc6132e3565b5b600061390b85828601613589565b925050602061391c858286016133bf565b9150509250929050565b600067ffffffffffffffff82111561394157613940613772565b5b61394a82613447565b9050602081019050919050565b600061396a61396584613926565b6137d2565b9050828152602081018484840111156139865761398561376d565b5b61399184828561381e565b509392505050565b600082601f8301126139ae576139ad613768565b5b81356139be848260208601613957565b91505092915050565b600080600080608085870312156139e1576139e06132e3565b5b60006139ef87828801613589565b9450506020613a0087828801613589565b9350506040613a11878288016134d4565b925050606085013567ffffffffffffffff811115613a3257613a316132e8565b5b613a3e87828801613999565b91505092959194509250565b60008060408385031215613a6157613a606132e3565b5b6000613a6f85828601613589565b9250506020613a8085828601613589565b9150509250929050565b600080fd5b600080fd5b60008083601f840112613aaa57613aa9613768565b5b8235905067ffffffffffffffff811115613ac757613ac6613a8a565b5b602083019150836020820283011115613ae357613ae2613a8f565b5b9250929050565b60008060208385031215613b0157613b006132e3565b5b600083013567ffffffffffffffff811115613b1f57613b1e6132e8565b5b613b2b85828601613a94565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b7e57607f821691505b602082108103613b9157613b90613b37565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bf360218361340c565b9150613bfe82613b97565b604082019050919050565b60006020820190508181036000830152613c2281613be6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613c85603d8361340c565b9150613c9082613c29565b604082019050919050565b60006020820190508181036000830152613cb481613c78565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613d17602d8361340c565b9150613d2282613cbb565b604082019050919050565b60006020820190508181036000830152613d4681613d0a565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613da9602b8361340c565b9150613db482613d4d565b604082019050919050565b60006020820190508181036000830152613dd881613d9c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e48826134b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e7a57613e79613e0e565b5b600182019050919050565b600081905092915050565b50565b6000613ea0600083613e85565b9150613eab82613e90565b600082019050919050565b6000613ec182613e93565b9150819050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613f27602c8361340c565b9150613f3282613ecb565b604082019050919050565b60006020820190508181036000830152613f5681613f1a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613fbf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613f82565b613fc98683613f82565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614006614001613ffc846134b3565b613fe1565b6134b3565b9050919050565b6000819050919050565b61402083613feb565b61403461402c8261400d565b848454613f8f565b825550505050565b600090565b61404961403c565b614054818484614017565b505050565b5b818110156140785761406d600082614041565b60018101905061405a565b5050565b601f8211156140bd5761408e81613f5d565b61409784613f72565b810160208510156140a6578190505b6140ba6140b285613f72565b830182614059565b50505b505050565b600082821c905092915050565b60006140e0600019846008026140c2565b1980831691505092915050565b60006140f983836140cf565b9150826002028217905092915050565b61411282613401565b67ffffffffffffffff81111561412b5761412a613772565b5b6141358254613b66565b61414082828561407c565b600060209050601f8311600181146141735760008415614161578287015190505b61416b85826140ed565b8655506141d3565b601f19841661418186613f5d565b60005b828110156141a957848901518255600182019150602085019450602081019050614184565b868310156141c657848901516141c2601f8916826140cf565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061421160188361340c565b915061421c826141db565b602082019050919050565b6000602082019050818103600083015261424081614204565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006142a360298361340c565b91506142ae82614247565b604082019050919050565b600060208201905081810360008301526142d281614296565b9050919050565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b600061430f60168361340c565b915061431a826142d9565b602082019050919050565b6000602082019050818103600083015261433e81614302565b9050919050565b7f6e65656420746f206d696e74206174206c656173742031203234313100000000600082015250565b600061437b601c8361340c565b915061438682614345565b602082019050919050565b600060208201905081810360008301526143aa8161436e565b9050919050565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b600061440d60248361340c565b9150614418826143b1565b604082019050919050565b6000602082019050818103600083015261443c81614400565b9050919050565b600061444e826134b3565b9150614459836134b3565b925082820190508082111561447157614470613e0e565b5b92915050565b7f6d61782032343131206c696d6974206578636565646564000000000000000000600082015250565b60006144ad60178361340c565b91506144b882614477565b602082019050919050565b600060208201905081810360008301526144dc816144a0565b9050919050565b7f75736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b600061451960178361340c565b9150614524826144e3565b602082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b7f6d61782032343131207065722061646472657373206578636565646564000000600082015250565b6000614585601d8361340c565b91506145908261454f565b602082019050919050565b600060208201905081810360008301526145b481614578565b9050919050565b60006145c6826134b3565b91506145d1836134b3565b92508282026145df816134b3565b915082820484148315176145f6576145f5613e0e565b5b5092915050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b600061463360128361340c565b915061463e826145fd565b602082019050919050565b6000602082019050818103600083015261466281614626565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006146c5602f8361340c565b91506146d082614669565b604082019050919050565b600060208201905081810360008301526146f4816146b8565b9050919050565b600081905092915050565b600061471182613401565b61471b81856146fb565b935061472b81856020860161341d565b80840191505092915050565b6000815461474481613b66565b61474e81866146fb565b94506001821660008114614769576001811461477e576147b1565b60ff19831686528115158202860193506147b1565b61478785613f5d565b60005b838110156147a95781548189015260018201915060208101905061478a565b838801955050505b50505092915050565b60006147c68286614706565b91506147d28285614706565b91506147de8284614737565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061484760268361340c565b9150614852826147eb565b604082019050919050565b600060208201905081810360008301526148768161483a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006148b360208361340c565b91506148be8261487d565b602082019050919050565b600060208201905081810360008301526148e2816148a6565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061494560258361340c565b9150614950826148e9565b604082019050919050565b6000602082019050818103600083015261497481614938565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006149d760248361340c565b91506149e28261497b565b604082019050919050565b60006020820190508181036000830152614a06816149ca565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614a4360198361340c565b9150614a4e82614a0d565b602082019050919050565b60006020820190508181036000830152614a7281614a36565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614ad560328361340c565b9150614ae082614a79565b604082019050919050565b60006020820190508181036000830152614b0481614ac8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614b9660358361340c565b9150614ba182614b3a565b604082019050919050565b60006020820190508181036000830152614bc581614b89565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bf382614bcc565b614bfd8185614bd7565b9350614c0d81856020860161341d565b614c1681613447565b840191505092915050565b6000608082019050614c366000830187613548565b614c436020830186613548565b614c5060408301856135de565b8181036060830152614c628184614be8565b905095945050505050565b600081519050614c7c81613319565b92915050565b600060208284031215614c9857614c976132e3565b5b6000614ca684828501614c6d565b91505092915050565b6000614cba826134b3565b9150614cc5836134b3565b9250828203905081811115614cdd57614cdc613e0e565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614d4860208361340c565b9150614d5382614d12565b602082019050919050565b60006020820190508181036000830152614d7781614d3b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614db4601c8361340c565b9150614dbf82614d7e565b602082019050919050565b60006020820190508181036000830152614de381614da7565b905091905056fea26469706673582212204100527d1f54549761f1e3a6f38b8a88cc1db94660cb8f90b86aeec660240a2264736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000f5b52454441435445445d20323431310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000432343131000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f626166796265696334747479647174617a3465333665657265786a616964347a356f67376764336664716e35336f7372626c36653636726a796e652f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): [REDACTED] 2411
Arg [1] : _symbol (string): 2411
Arg [2] : _initBaseURI (string): ipfs://bafybeic4ttydqtaz4e36eerexjaid4z5og7gd3fdqn53osrbl6e66rjyne/
Arg [3] : _initNotRevealedUri (string):

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [5] : 5b52454441435445445d20323431310000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 3234313100000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [9] : 697066733a2f2f626166796265696334747479647174617a3465333665657265
Arg [10] : 786a616964347a356f67376764336664716e35336f7372626c36653636726a79
Arg [11] : 6e652f0000000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62507:4555:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56490:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66250:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40552:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42064:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62654:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41582:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62687:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57130:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62984:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62760:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42764:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56798:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64379:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66331:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66585:474;;;:::i;:::-;;43170:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64624:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65682:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57320:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62870:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65890:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62839:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40262:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62586:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39993:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17975:103;;;;;;;;;;;;;:::i;:::-;;65768:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17327:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40721:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62902:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63437:934;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42307:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65497:65;;;;;;;;;;;;;:::i;:::-;;43426:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62942:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62797;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62612;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64978:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65570:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62724:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65994:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42533:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66434:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66124:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18233:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56490:224;56592:4;56631:35;56616:50;;;:11;:50;;;;:90;;;;56670:36;56694:11;56670:23;:36::i;:::-;56616:90;56609:97;;56490:224;;;:::o;66250:73::-;17213:13;:11;:13::i;:::-;66311:6:::1;66302;;:15;;;;;;;;;;;;;;;;;;66250:73:::0;:::o;40552:100::-;40606:13;40639:5;40632:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40552:100;:::o;42064:171::-;42140:7;42160:23;42175:7;42160:14;:23::i;:::-;42203:15;:24;42219:7;42203:24;;;;;;;;;;;;;;;;;;;;;42196:31;;42064:171;;;:::o;62654:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41582:416::-;41663:13;41679:23;41694:7;41679:14;:23::i;:::-;41663:39;;41727:5;41721:11;;:2;:11;;;41713:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;41821:5;41805:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;41830:37;41847:5;41854:12;:10;:12::i;:::-;41830:16;:37::i;:::-;41805:62;41783:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;41969:21;41978:2;41982:7;41969:8;:21::i;:::-;41652:346;41582:416;;:::o;62687:32::-;;;;:::o;57130:113::-;57191:7;57218:10;:17;;;;57211:24;;57130:113;:::o;62984:55::-;;;;;;;;;;;;;;;;;:::o;62760:32::-;;;;:::o;42764:335::-;42959:41;42978:12;:10;:12::i;:::-;42992:7;42959:18;:41::i;:::-;42951:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43063:28;43073:4;43079:2;43083:7;43063:9;:28::i;:::-;42764:335;;;:::o;56798:256::-;56895:7;56931:23;56948:5;56931:16;:23::i;:::-;56923:5;:31;56915:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;57020:12;:19;57033:5;57020:19;;;;;;;;;;;;;;;:26;57040:5;57020:26;;;;;;;;;;;;57013:33;;56798:256;;;;:::o;64379:239::-;64438:4;64456:6;64465:1;64456:10;;64451:143;64472:20;:27;;;;64468:1;:31;64451:143;;;64546:5;64519:32;;:20;64540:1;64519:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:32;;;64515:72;;64573:4;64566:11;;;;;64515:72;64501:3;;;;;:::i;:::-;;;;64451:143;;;;64607:5;64600:12;;64379:239;;;;:::o;66331:95::-;17213:13;:11;:13::i;:::-;66414:6:::1;66396:15;;:24;;;;;;;;;;;;;;;;;;66331:95:::0;:::o;66585:474::-;17213:13;:11;:13::i;:::-;66881:7:::1;66902;:5;:7::i;:::-;66894:21;;66923;66894:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66880:69;;;66964:2;66956:11;;;::::0;::::1;;66630:429;66585:474::o:0;43170:185::-;43308:39;43325:4;43331:2;43335:7;43308:39;;;;;;;;;;;;:16;:39::i;:::-;43170:185;;;:::o;64624:348::-;64699:16;64727:23;64753:17;64763:6;64753:9;:17::i;:::-;64727:43;;64777:25;64819:15;64805:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64777:58;;64847:9;64842:103;64862:15;64858:1;:19;64842:103;;;64907:30;64927:6;64935:1;64907:19;:30::i;:::-;64893:8;64902:1;64893:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;64879:3;;;;;:::i;:::-;;;;64842:103;;;;64958:8;64951:15;;;;64624:348;;;:::o;65682:80::-;17213:13;:11;:13::i;:::-;65748:8:::1;65741:4;:15;;;;65682:80:::0;:::o;57320:233::-;57395:7;57431:30;:28;:30::i;:::-;57423:5;:38;57415:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57528:10;57539:5;57528:17;;;;;;;;:::i;:::-;;;;;;;;;;57521:24;;57320:233;;;:::o;62870:27::-;;;;;;;;;;;;;:::o;65890:98::-;17213:13;:11;:13::i;:::-;65971:11:::1;65961:7;:21;;;;;;:::i;:::-;;65890:98:::0;:::o;62839:26::-;;;;;;;;;;;;;:::o;40262:223::-;40334:7;40354:13;40370:17;40379:7;40370:8;:17::i;:::-;40354:33;;40423:1;40406:19;;:5;:19;;;40398:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40472:5;40465:12;;;40262:223;;;:::o;62586:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39993:207::-;40065:7;40110:1;40093:19;;:5;:19;;;40085:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40176:9;:16;40186:5;40176:16;;;;;;;;;;;;;;;;40169:23;;39993:207;;;:::o;17975:103::-;17213:13;:11;:13::i;:::-;18040:30:::1;18067:1;18040:18;:30::i;:::-;17975:103::o:0;65768:116::-;17213:13;:11;:13::i;:::-;65861:17:::1;65845:13;:33;;;;65768:116:::0;:::o;17327:87::-;17373:7;17400:6;;;;;;;;;;;17393:13;;17327:87;:::o;40721:104::-;40777:13;40810:7;40803:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40721:104;:::o;62902:35::-;;;;;;;;;;;;;:::o;63437:934::-;63503:6;;;;;;;;;;;63502:7;63494:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63543:14;63560:13;:11;:13::i;:::-;63543:30;;63602:1;63588:11;:15;63580:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;63666:13;;63651:11;:28;;63643:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;63759:9;;63744:11;63735:6;:20;;;;:::i;:::-;:33;;63727:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;63823:7;:5;:7::i;:::-;63809:21;;:10;:21;;;63805:417;;63865:4;63846:23;;:15;;;;;;;;;;;:23;;;63843:299;;63894:25;63908:10;63894:13;:25::i;:::-;63886:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63962:24;63989:20;:32;64010:10;63989:32;;;;;;;;;;;;;;;;63962:59;;64078:18;;64063:11;64044:16;:30;;;;:::i;:::-;:52;;64036:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;63871:271;63843:299;64180:11;64173:4;;:18;;;;:::i;:::-;64160:9;:31;;64152:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;63805:417;64235:9;64247:1;64235:13;;64230:136;64255:11;64250:1;:16;64230:136;;64282:20;:32;64303:10;64282:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;64325:33;64335:10;64356:1;64347:6;:10;;;;:::i;:::-;64325:9;:33::i;:::-;64268:3;;;;;:::i;:::-;;;;64230:136;;;;63487:884;63437:934;:::o;42307:155::-;42402:52;42421:12;:10;:12::i;:::-;42435:8;42445;42402:18;:52::i;:::-;42307:155;;:::o;65497:65::-;17213:13;:11;:13::i;:::-;65552:4:::1;65541:8;;:15;;;;;;;;;;;;;;;;;;65497:65::o:0;43426:322::-;43600:41;43619:12;:10;:12::i;:::-;43633:7;43600:18;:41::i;:::-;43592:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;43702:38;43716:4;43722:2;43726:7;43735:4;43702:13;:38::i;:::-;43426:322;;;;:::o;62942:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62797:::-;;;;:::o;62612:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64978:497::-;65076:13;65117:16;65125:7;65117;:16::i;:::-;65101:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;65226:5;65214:17;;:8;;;;;;;;;;;:17;;;65211:62;;65251:14;65244:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65211:62;65281:28;65312:10;:8;:10::i;:::-;65281:41;;65367:1;65342:14;65336:28;:32;:133;;;;;;;;;;;;;;;;;65404:14;65420:18;:7;:16;:18::i;:::-;65440:13;65387:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65336:133;65329:140;;;64978:497;;;;:::o;65570:104::-;17213:13;:11;:13::i;:::-;65662:6:::1;65641:18;:27;;;;65570:104:::0;:::o;62724:31::-;;;;:::o;65994:122::-;17213:13;:11;:13::i;:::-;66093:17:::1;66077:13;:33;;;;;;:::i;:::-;;65994:122:::0;:::o;42533:164::-;42630:4;42654:18;:25;42673:5;42654:25;;;;;;;;;;;;;;;:35;42680:8;42654:35;;;;;;;;;;;;;;;;;;;;;;;;;42647:42;;42533:164;;;;:::o;66434:144::-;17213:13;:11;:13::i;:::-;66516:20:::1;;66509:27;;;;:::i;:::-;66566:6;;66543:20;:29;;;;;;;:::i;:::-;;66434:144:::0;;:::o;66124:120::-;17213:13;:11;:13::i;:::-;66223:15:::1;66206:14;:32;;;;;;:::i;:::-;;66124:120:::0;:::o;18233:201::-;17213:13;:11;:13::i;:::-;18342:1:::1;18322:22;;:8;:22;;::::0;18314:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18398:28;18417:8;18398:18;:28::i;:::-;18233:201:::0;:::o;39624:305::-;39726:4;39778:25;39763:40;;;:11;:40;;;;:105;;;;39835:33;39820:48;;;:11;:48;;;;39763:105;:158;;;;39885:36;39909:11;39885:23;:36::i;:::-;39763:158;39743:178;;39624:305;;;:::o;17492:132::-;17567:12;:10;:12::i;:::-;17556:23;;:7;:5;:7::i;:::-;:23;;;17548:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17492:132::o;51883:135::-;51965:16;51973:7;51965;:16::i;:::-;51957:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;51883:135;:::o;15878:98::-;15931:7;15958:10;15951:17;;15878:98;:::o;51162:174::-;51264:2;51237:15;:24;51253:7;51237:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51320:7;51316:2;51282:46;;51291:23;51306:7;51291:14;:23::i;:::-;51282:46;;;;;;;;;;;;51162:174;;:::o;45781:264::-;45874:4;45891:13;45907:23;45922:7;45907:14;:23::i;:::-;45891:39;;45960:5;45949:16;;:7;:16;;;:52;;;;45969:32;45986:5;45993:7;45969:16;:32::i;:::-;45949:52;:87;;;;46029:7;46005:31;;:20;46017:7;46005:11;:20::i;:::-;:31;;;45949:87;45941:96;;;45781:264;;;;:::o;49780:1263::-;49939:4;49912:31;;:23;49927:7;49912:14;:23::i;:::-;:31;;;49904:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50018:1;50004:16;;:2;:16;;;49996:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50074:42;50095:4;50101:2;50105:7;50114:1;50074:20;:42::i;:::-;50246:4;50219:31;;:23;50234:7;50219:14;:23::i;:::-;:31;;;50211:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50364:15;:24;50380:7;50364:24;;;;;;;;;;;;50357:31;;;;;;;;;;;50859:1;50840:9;:15;50850:4;50840:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;50892:1;50875:9;:13;50885:2;50875:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;50934:2;50915:7;:16;50923:7;50915:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50973:7;50969:2;50954:27;;50963:4;50954:27;;;;;;;;;;;;50994:41;51014:4;51020:2;51024:7;51033:1;50994:19;:41::i;:::-;49780:1263;;;:::o;45056:117::-;45122:7;45149;:16;45157:7;45149:16;;;;;;;;;;;;;;;;;;;;;45142:23;;45056:117;;;:::o;18594:191::-;18668:16;18687:6;;;;;;;;;;;18668:25;;18713:8;18704:6;;:17;;;;;;;;;;;;;;;;;;18768:8;18737:40;;18758:8;18737:40;;;;;;;;;;;;18657:128;18594:191;:::o;46387:110::-;46463:26;46473:2;46477:7;46463:26;;;;;;;;;;;;:9;:26::i;:::-;46387:110;;:::o;51479:315::-;51634:8;51625:17;;:5;:17;;;51617:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;51721:8;51683:18;:25;51702:5;51683:25;;;;;;;;;;;;;;;:35;51709:8;51683:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;51767:8;51745:41;;51760:5;51745:41;;;51777:8;51745:41;;;;;;:::i;:::-;;;;;;;;51479:315;;;:::o;44629:313::-;44785:28;44795:4;44801:2;44805:7;44785:9;:28::i;:::-;44832:47;44855:4;44861:2;44865:7;44874:4;44832:22;:47::i;:::-;44824:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;44629:313;;;;:::o;45486:128::-;45551:4;45604:1;45575:31;;:17;45584:7;45575:8;:17::i;:::-;:31;;;;45568:38;;45486:128;;;:::o;63316:102::-;63376:13;63405:7;63398:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63316:102;:::o;13305:716::-;13361:13;13412:14;13449:1;13429:17;13440:5;13429:10;:17::i;:::-;:21;13412:38;;13465:20;13499:6;13488:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13465:41;;13521:11;13650:6;13646:2;13642:15;13634:6;13630:28;13623:35;;13687:288;13694:4;13687:288;;;13719:5;;;;;;;;13861:8;13856:2;13849:5;13845:14;13840:30;13835:3;13827:44;13917:2;13908:11;;;;;;:::i;:::-;;;;;13951:1;13942:5;:10;13687:288;13938:21;13687:288;13996:6;13989:13;;;;;13305:716;;;:::o;31056:157::-;31141:4;31180:25;31165:40;;;:11;:40;;;;31158:47;;31056:157;;;:::o;57627:915::-;57804:61;57831:4;57837:2;57841:12;57855:9;57804:26;:61::i;:::-;57894:1;57882:9;:13;57878:222;;;58025:63;;;;;;;;;;:::i;:::-;;;;;;;;57878:222;58112:15;58130:12;58112:30;;58175:1;58159:18;;:4;:18;;;58155:187;;58194:40;58226:7;58194:31;:40::i;:::-;58155:187;;;58264:2;58256:10;;:4;:10;;;58252:90;;58283:47;58316:4;58322:7;58283:32;:47::i;:::-;58252:90;58155:187;58370:1;58356:16;;:2;:16;;;58352:183;;58389:45;58426:7;58389:36;:45::i;:::-;58352:183;;;58462:4;58456:10;;:2;:10;;;58452:83;;58483:40;58511:2;58515:7;58483:27;:40::i;:::-;58452:83;58352:183;57793:749;57627:915;;;;:::o;55299:158::-;;;;;:::o;46724:319::-;46853:18;46859:2;46863:7;46853:5;:18::i;:::-;46904:53;46935:1;46939:2;46943:7;46952:4;46904:22;:53::i;:::-;46882:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;46724:319;;;:::o;52582:853::-;52736:4;52757:15;:2;:13;;;:15::i;:::-;52753:675;;;52809:2;52793:36;;;52830:12;:10;:12::i;:::-;52844:4;52850:7;52859:4;52793:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52789:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53051:1;53034:6;:13;:18;53030:328;;53077:60;;;;;;;;;;:::i;:::-;;;;;;;;53030:328;53308:6;53302:13;53293:6;53289:2;53285:15;53278:38;52789:584;52925:41;;;52915:51;;;:6;:51;;;;52908:58;;;;;52753:675;53412:4;53405:11;;52582:853;;;;;;;:::o;10171:922::-;10224:7;10244:14;10261:1;10244:18;;10311:6;10302:5;:15;10298:102;;10347:6;10338:15;;;;;;:::i;:::-;;;;;10382:2;10372:12;;;;10298:102;10427:6;10418:5;:15;10414:102;;10463:6;10454:15;;;;;;:::i;:::-;;;;;10498:2;10488:12;;;;10414:102;10543:6;10534:5;:15;10530:102;;10579:6;10570:15;;;;;;:::i;:::-;;;;;10614:2;10604:12;;;;10530:102;10659:5;10650;:14;10646:99;;10694:5;10685:14;;;;;;:::i;:::-;;;;;10728:1;10718:11;;;;10646:99;10772:5;10763;:14;10759:99;;10807:5;10798:14;;;;;;:::i;:::-;;;;;10841:1;10831:11;;;;10759:99;10885:5;10876;:14;10872:99;;10920:5;10911:14;;;;;;:::i;:::-;;;;;10954:1;10944:11;;;;10872:99;10998:5;10989;:14;10985:66;;11034:1;11024:11;;;;10985:66;11079:6;11072:13;;;10171:922;;;:::o;54167:410::-;54357:1;54345:9;:13;54341:229;;;54395:1;54379:18;;:4;:18;;;54375:87;;54437:9;54418;:15;54428:4;54418:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;54375:87;54494:1;54480:16;;:2;:16;;;54476:83;;54534:9;54517;:13;54527:2;54517:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;54476:83;54341:229;54167:410;;;;:::o;59265:164::-;59369:10;:17;;;;59342:15;:24;59358:7;59342:24;;;;;;;;;;;:44;;;;59397:10;59413:7;59397:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59265:164;:::o;60056:988::-;60322:22;60372:1;60347:22;60364:4;60347:16;:22::i;:::-;:26;;;;:::i;:::-;60322:51;;60384:18;60405:17;:26;60423:7;60405:26;;;;;;;;;;;;60384:47;;60552:14;60538:10;:28;60534:328;;60583:19;60605:12;:18;60618:4;60605:18;;;;;;;;;;;;;;;:34;60624:14;60605:34;;;;;;;;;;;;60583:56;;60689:11;60656:12;:18;60669:4;60656:18;;;;;;;;;;;;;;;:30;60675:10;60656:30;;;;;;;;;;;:44;;;;60806:10;60773:17;:30;60791:11;60773:30;;;;;;;;;;;:43;;;;60568:294;60534:328;60958:17;:26;60976:7;60958:26;;;;;;;;;;;60951:33;;;61002:12;:18;61015:4;61002:18;;;;;;;;;;;;;;;:34;61021:14;61002:34;;;;;;;;;;;60995:41;;;60137:907;;60056:988;;:::o;61339:1079::-;61592:22;61637:1;61617:10;:17;;;;:21;;;;:::i;:::-;61592:46;;61649:18;61670:15;:24;61686:7;61670:24;;;;;;;;;;;;61649:45;;62021:19;62043:10;62054:14;62043:26;;;;;;;;:::i;:::-;;;;;;;;;;62021:48;;62107:11;62082:10;62093;62082:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;62218:10;62187:15;:28;62203:11;62187:28;;;;;;;;;;;:41;;;;62359:15;:24;62375:7;62359:24;;;;;;;;;;;62352:31;;;62394:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61410:1008;;;61339:1079;:::o;58843:221::-;58928:14;58945:20;58962:2;58945:16;:20::i;:::-;58928:37;;59003:7;58976:12;:16;58989:2;58976:16;;;;;;;;;;;;;;;:24;58993:6;58976:24;;;;;;;;;;;:34;;;;59050:6;59021:17;:26;59039:7;59021:26;;;;;;;;;;;:35;;;;58917:147;58843:221;;:::o;47379:942::-;47473:1;47459:16;;:2;:16;;;47451:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47532:16;47540:7;47532;:16::i;:::-;47531:17;47523:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;47594:48;47623:1;47627:2;47631:7;47640:1;47594:20;:48::i;:::-;47741:16;47749:7;47741;:16::i;:::-;47740:17;47732:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48156:1;48139:9;:13;48149:2;48139:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;48200:2;48181:7;:16;48189:7;48181:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;48245:7;48241:2;48220:33;;48237:1;48220:33;;;;;;;;;;;;48266:47;48294:1;48298:2;48302:7;48311:1;48266:19;:47::i;:::-;47379:942;;:::o;20025:326::-;20085:4;20342:1;20320:7;:19;;;:23;20313:30;;20025:326;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:246::-;2469:1;2479:113;2493:6;2490:1;2487:13;2479:113;;;2578:1;2573:3;2569:11;2563:18;2559:1;2554:3;2550:11;2543:39;2515:2;2512:1;2508:10;2503:15;;2479:113;;;2626:1;2617:6;2612:3;2608:16;2601:27;2450:184;2388:246;;;:::o;2640:102::-;2681:6;2732:2;2728:7;2723:2;2716:5;2712:14;2708:28;2698:38;;2640:102;;;:::o;2748:377::-;2836:3;2864:39;2897:5;2864:39;:::i;:::-;2919:71;2983:6;2978:3;2919:71;:::i;:::-;2912:78;;2999:65;3057:6;3052:3;3045:4;3038:5;3034:16;2999:65;:::i;:::-;3089:29;3111:6;3089:29;:::i;:::-;3084:3;3080:39;3073:46;;2840:285;2748:377;;;;:::o;3131:313::-;3244:4;3282:2;3271:9;3267:18;3259:26;;3331:9;3325:4;3321:20;3317:1;3306:9;3302:17;3295:47;3359:78;3432:4;3423:6;3359:78;:::i;:::-;3351:86;;3131:313;;;;:::o;3450:77::-;3487:7;3516:5;3505:16;;3450:77;;;:::o;3533:122::-;3606:24;3624:5;3606:24;:::i;:::-;3599:5;3596:35;3586:63;;3645:1;3642;3635:12;3586:63;3533:122;:::o;3661:139::-;3707:5;3745:6;3732:20;3723:29;;3761:33;3788:5;3761:33;:::i;:::-;3661:139;;;;:::o;3806:329::-;3865:6;3914:2;3902:9;3893:7;3889:23;3885:32;3882:119;;;3920:79;;:::i;:::-;3882:119;4040:1;4065:53;4110:7;4101:6;4090:9;4086:22;4065:53;:::i;:::-;4055:63;;4011:117;3806:329;;;;:::o;4141:126::-;4178:7;4218:42;4211:5;4207:54;4196:65;;4141:126;;;:::o;4273:96::-;4310:7;4339:24;4357:5;4339:24;:::i;:::-;4328:35;;4273:96;;;:::o;4375:118::-;4462:24;4480:5;4462:24;:::i;:::-;4457:3;4450:37;4375:118;;:::o;4499:222::-;4592:4;4630:2;4619:9;4615:18;4607:26;;4643:71;4711:1;4700:9;4696:17;4687:6;4643:71;:::i;:::-;4499:222;;;;:::o;4727:122::-;4800:24;4818:5;4800:24;:::i;:::-;4793:5;4790:35;4780:63;;4839:1;4836;4829:12;4780:63;4727:122;:::o;4855:139::-;4901:5;4939:6;4926:20;4917:29;;4955:33;4982:5;4955:33;:::i;:::-;4855:139;;;;:::o;5000:474::-;5068:6;5076;5125:2;5113:9;5104:7;5100:23;5096:32;5093:119;;;5131:79;;:::i;:::-;5093:119;5251:1;5276:53;5321:7;5312:6;5301:9;5297:22;5276:53;:::i;:::-;5266:63;;5222:117;5378:2;5404:53;5449:7;5440:6;5429:9;5425:22;5404:53;:::i;:::-;5394:63;;5349:118;5000:474;;;;;:::o;5480:118::-;5567:24;5585:5;5567:24;:::i;:::-;5562:3;5555:37;5480:118;;:::o;5604:222::-;5697:4;5735:2;5724:9;5720:18;5712:26;;5748:71;5816:1;5805:9;5801:17;5792:6;5748:71;:::i;:::-;5604:222;;;;:::o;5832:329::-;5891:6;5940:2;5928:9;5919:7;5915:23;5911:32;5908:119;;;5946:79;;:::i;:::-;5908:119;6066:1;6091:53;6136:7;6127:6;6116:9;6112:22;6091:53;:::i;:::-;6081:63;;6037:117;5832:329;;;;:::o;6167:619::-;6244:6;6252;6260;6309:2;6297:9;6288:7;6284:23;6280:32;6277:119;;;6315:79;;:::i;:::-;6277:119;6435:1;6460:53;6505:7;6496:6;6485:9;6481:22;6460:53;:::i;:::-;6450:63;;6406:117;6562:2;6588:53;6633:7;6624:6;6613:9;6609:22;6588:53;:::i;:::-;6578:63;;6533:118;6690:2;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6661:118;6167:619;;;;;:::o;6792:114::-;6859:6;6893:5;6887:12;6877:22;;6792:114;;;:::o;6912:184::-;7011:11;7045:6;7040:3;7033:19;7085:4;7080:3;7076:14;7061:29;;6912:184;;;;:::o;7102:132::-;7169:4;7192:3;7184:11;;7222:4;7217:3;7213:14;7205:22;;7102:132;;;:::o;7240:108::-;7317:24;7335:5;7317:24;:::i;:::-;7312:3;7305:37;7240:108;;:::o;7354:179::-;7423:10;7444:46;7486:3;7478:6;7444:46;:::i;:::-;7522:4;7517:3;7513:14;7499:28;;7354:179;;;;:::o;7539:113::-;7609:4;7641;7636:3;7632:14;7624:22;;7539:113;;;:::o;7688:732::-;7807:3;7836:54;7884:5;7836:54;:::i;:::-;7906:86;7985:6;7980:3;7906:86;:::i;:::-;7899:93;;8016:56;8066:5;8016:56;:::i;:::-;8095:7;8126:1;8111:284;8136:6;8133:1;8130:13;8111:284;;;8212:6;8206:13;8239:63;8298:3;8283:13;8239:63;:::i;:::-;8232:70;;8325:60;8378:6;8325:60;:::i;:::-;8315:70;;8171:224;8158:1;8155;8151:9;8146:14;;8111:284;;;8115:14;8411:3;8404:10;;7812:608;;;7688:732;;;;:::o;8426:373::-;8569:4;8607:2;8596:9;8592:18;8584:26;;8656:9;8650:4;8646:20;8642:1;8631:9;8627:17;8620:47;8684:108;8787:4;8778:6;8684:108;:::i;:::-;8676:116;;8426:373;;;;:::o;8805:117::-;8914:1;8911;8904:12;8928:117;9037:1;9034;9027:12;9051:180;9099:77;9096:1;9089:88;9196:4;9193:1;9186:15;9220:4;9217:1;9210:15;9237:281;9320:27;9342:4;9320:27;:::i;:::-;9312:6;9308:40;9450:6;9438:10;9435:22;9414:18;9402:10;9399:34;9396:62;9393:88;;;9461:18;;:::i;:::-;9393:88;9501:10;9497:2;9490:22;9280:238;9237:281;;:::o;9524:129::-;9558:6;9585:20;;:::i;:::-;9575:30;;9614:33;9642:4;9634:6;9614:33;:::i;:::-;9524:129;;;:::o;9659:308::-;9721:4;9811:18;9803:6;9800:30;9797:56;;;9833:18;;:::i;:::-;9797:56;9871:29;9893:6;9871:29;:::i;:::-;9863:37;;9955:4;9949;9945:15;9937:23;;9659:308;;;:::o;9973:146::-;10070:6;10065:3;10060;10047:30;10111:1;10102:6;10097:3;10093:16;10086:27;9973:146;;;:::o;10125:425::-;10203:5;10228:66;10244:49;10286:6;10244:49;:::i;:::-;10228:66;:::i;:::-;10219:75;;10317:6;10310:5;10303:21;10355:4;10348:5;10344:16;10393:3;10384:6;10379:3;10375:16;10372:25;10369:112;;;10400:79;;:::i;:::-;10369:112;10490:54;10537:6;10532:3;10527;10490:54;:::i;:::-;10209:341;10125:425;;;;;:::o;10570:340::-;10626:5;10675:3;10668:4;10660:6;10656:17;10652:27;10642:122;;10683:79;;:::i;:::-;10642:122;10800:6;10787:20;10825:79;10900:3;10892:6;10885:4;10877:6;10873:17;10825:79;:::i;:::-;10816:88;;10632:278;10570:340;;;;:::o;10916:509::-;10985:6;11034:2;11022:9;11013:7;11009:23;11005:32;11002:119;;;11040:79;;:::i;:::-;11002:119;11188:1;11177:9;11173:17;11160:31;11218:18;11210:6;11207:30;11204:117;;;11240:79;;:::i;:::-;11204:117;11345:63;11400:7;11391:6;11380:9;11376:22;11345:63;:::i;:::-;11335:73;;11131:287;10916:509;;;;:::o;11431:468::-;11496:6;11504;11553:2;11541:9;11532:7;11528:23;11524:32;11521:119;;;11559:79;;:::i;:::-;11521:119;11679:1;11704:53;11749:7;11740:6;11729:9;11725:22;11704:53;:::i;:::-;11694:63;;11650:117;11806:2;11832:50;11874:7;11865:6;11854:9;11850:22;11832:50;:::i;:::-;11822:60;;11777:115;11431:468;;;;;:::o;11905:307::-;11966:4;12056:18;12048:6;12045:30;12042:56;;;12078:18;;:::i;:::-;12042:56;12116:29;12138:6;12116:29;:::i;:::-;12108:37;;12200:4;12194;12190:15;12182:23;;11905:307;;;:::o;12218:423::-;12295:5;12320:65;12336:48;12377:6;12336:48;:::i;:::-;12320:65;:::i;:::-;12311:74;;12408:6;12401:5;12394:21;12446:4;12439:5;12435:16;12484:3;12475:6;12470:3;12466:16;12463:25;12460:112;;;12491:79;;:::i;:::-;12460:112;12581:54;12628:6;12623:3;12618;12581:54;:::i;:::-;12301:340;12218:423;;;;;:::o;12660:338::-;12715:5;12764:3;12757:4;12749:6;12745:17;12741:27;12731:122;;12772:79;;:::i;:::-;12731:122;12889:6;12876:20;12914:78;12988:3;12980:6;12973:4;12965:6;12961:17;12914:78;:::i;:::-;12905:87;;12721:277;12660:338;;;;:::o;13004:943::-;13099:6;13107;13115;13123;13172:3;13160:9;13151:7;13147:23;13143:33;13140:120;;;13179:79;;:::i;:::-;13140:120;13299:1;13324:53;13369:7;13360:6;13349:9;13345:22;13324:53;:::i;:::-;13314:63;;13270:117;13426:2;13452:53;13497:7;13488:6;13477:9;13473:22;13452:53;:::i;:::-;13442:63;;13397:118;13554:2;13580:53;13625:7;13616:6;13605:9;13601:22;13580:53;:::i;:::-;13570:63;;13525:118;13710:2;13699:9;13695:18;13682:32;13741:18;13733:6;13730:30;13727:117;;;13763:79;;:::i;:::-;13727:117;13868:62;13922:7;13913:6;13902:9;13898:22;13868:62;:::i;:::-;13858:72;;13653:287;13004:943;;;;;;;:::o;13953:474::-;14021:6;14029;14078:2;14066:9;14057:7;14053:23;14049:32;14046:119;;;14084:79;;:::i;:::-;14046:119;14204:1;14229:53;14274:7;14265:6;14254:9;14250:22;14229:53;:::i;:::-;14219:63;;14175:117;14331:2;14357:53;14402:7;14393:6;14382:9;14378:22;14357:53;:::i;:::-;14347:63;;14302:118;13953:474;;;;;:::o;14433:117::-;14542:1;14539;14532:12;14556:117;14665:1;14662;14655:12;14696:568;14769:8;14779:6;14829:3;14822:4;14814:6;14810:17;14806:27;14796:122;;14837:79;;:::i;:::-;14796:122;14950:6;14937:20;14927:30;;14980:18;14972:6;14969:30;14966:117;;;15002:79;;:::i;:::-;14966:117;15116:4;15108:6;15104:17;15092:29;;15170:3;15162:4;15154:6;15150:17;15140:8;15136:32;15133:41;15130:128;;;15177:79;;:::i;:::-;15130:128;14696:568;;;;;:::o;15270:559::-;15356:6;15364;15413:2;15401:9;15392:7;15388:23;15384:32;15381:119;;;15419:79;;:::i;:::-;15381:119;15567:1;15556:9;15552:17;15539:31;15597:18;15589:6;15586:30;15583:117;;;15619:79;;:::i;:::-;15583:117;15732:80;15804:7;15795:6;15784:9;15780:22;15732:80;:::i;:::-;15714:98;;;;15510:312;15270:559;;;;;:::o;15835:180::-;15883:77;15880:1;15873:88;15980:4;15977:1;15970:15;16004:4;16001:1;15994:15;16021:320;16065:6;16102:1;16096:4;16092:12;16082:22;;16149:1;16143:4;16139:12;16170:18;16160:81;;16226:4;16218:6;16214:17;16204:27;;16160:81;16288:2;16280:6;16277:14;16257:18;16254:38;16251:84;;16307:18;;:::i;:::-;16251:84;16072:269;16021:320;;;:::o;16347:220::-;16487:34;16483:1;16475:6;16471:14;16464:58;16556:3;16551:2;16543:6;16539:15;16532:28;16347:220;:::o;16573:366::-;16715:3;16736:67;16800:2;16795:3;16736:67;:::i;:::-;16729:74;;16812:93;16901:3;16812:93;:::i;:::-;16930:2;16925:3;16921:12;16914:19;;16573:366;;;:::o;16945:419::-;17111:4;17149:2;17138:9;17134:18;17126:26;;17198:9;17192:4;17188:20;17184:1;17173:9;17169:17;17162:47;17226:131;17352:4;17226:131;:::i;:::-;17218:139;;16945:419;;;:::o;17370:248::-;17510:34;17506:1;17498:6;17494:14;17487:58;17579:31;17574:2;17566:6;17562:15;17555:56;17370:248;:::o;17624:366::-;17766:3;17787:67;17851:2;17846:3;17787:67;:::i;:::-;17780:74;;17863:93;17952:3;17863:93;:::i;:::-;17981:2;17976:3;17972:12;17965:19;;17624:366;;;:::o;17996:419::-;18162:4;18200:2;18189:9;18185:18;18177:26;;18249:9;18243:4;18239:20;18235:1;18224:9;18220:17;18213:47;18277:131;18403:4;18277:131;:::i;:::-;18269:139;;17996:419;;;:::o;18421:232::-;18561:34;18557:1;18549:6;18545:14;18538:58;18630:15;18625:2;18617:6;18613:15;18606:40;18421:232;:::o;18659:366::-;18801:3;18822:67;18886:2;18881:3;18822:67;:::i;:::-;18815:74;;18898:93;18987:3;18898:93;:::i;:::-;19016:2;19011:3;19007:12;19000:19;;18659:366;;;:::o;19031:419::-;19197:4;19235:2;19224:9;19220:18;19212:26;;19284:9;19278:4;19274:20;19270:1;19259:9;19255:17;19248:47;19312:131;19438:4;19312:131;:::i;:::-;19304:139;;19031:419;;;:::o;19456:230::-;19596:34;19592:1;19584:6;19580:14;19573:58;19665:13;19660:2;19652:6;19648:15;19641:38;19456:230;:::o;19692:366::-;19834:3;19855:67;19919:2;19914:3;19855:67;:::i;:::-;19848:74;;19931:93;20020:3;19931:93;:::i;:::-;20049:2;20044:3;20040:12;20033:19;;19692:366;;;:::o;20064:419::-;20230:4;20268:2;20257:9;20253:18;20245:26;;20317:9;20311:4;20307:20;20303:1;20292:9;20288:17;20281:47;20345:131;20471:4;20345:131;:::i;:::-;20337:139;;20064:419;;;:::o;20489:180::-;20537:77;20534:1;20527:88;20634:4;20631:1;20624:15;20658:4;20655:1;20648:15;20675:180;20723:77;20720:1;20713:88;20820:4;20817:1;20810:15;20844:4;20841:1;20834:15;20861:233;20900:3;20923:24;20941:5;20923:24;:::i;:::-;20914:33;;20969:66;20962:5;20959:77;20956:103;;21039:18;;:::i;:::-;20956:103;21086:1;21079:5;21075:13;21068:20;;20861:233;;;:::o;21100:147::-;21201:11;21238:3;21223:18;;21100:147;;;;:::o;21253:114::-;;:::o;21373:398::-;21532:3;21553:83;21634:1;21629:3;21553:83;:::i;:::-;21546:90;;21645:93;21734:3;21645:93;:::i;:::-;21763:1;21758:3;21754:11;21747:18;;21373:398;;;:::o;21777:379::-;21961:3;21983:147;22126:3;21983:147;:::i;:::-;21976:154;;22147:3;22140:10;;21777:379;;;:::o;22162:231::-;22302:34;22298:1;22290:6;22286:14;22279:58;22371:14;22366:2;22358:6;22354:15;22347:39;22162:231;:::o;22399:366::-;22541:3;22562:67;22626:2;22621:3;22562:67;:::i;:::-;22555:74;;22638:93;22727:3;22638:93;:::i;:::-;22756:2;22751:3;22747:12;22740:19;;22399:366;;;:::o;22771:419::-;22937:4;22975:2;22964:9;22960:18;22952:26;;23024:9;23018:4;23014:20;23010:1;22999:9;22995:17;22988:47;23052:131;23178:4;23052:131;:::i;:::-;23044:139;;22771:419;;;:::o;23196:141::-;23245:4;23268:3;23260:11;;23291:3;23288:1;23281:14;23325:4;23322:1;23312:18;23304:26;;23196:141;;;:::o;23343:93::-;23380:6;23427:2;23422;23415:5;23411:14;23407:23;23397:33;;23343:93;;;:::o;23442:107::-;23486:8;23536:5;23530:4;23526:16;23505:37;;23442:107;;;;:::o;23555:393::-;23624:6;23674:1;23662:10;23658:18;23697:97;23727:66;23716:9;23697:97;:::i;:::-;23815:39;23845:8;23834:9;23815:39;:::i;:::-;23803:51;;23887:4;23883:9;23876:5;23872:21;23863:30;;23936:4;23926:8;23922:19;23915:5;23912:30;23902:40;;23631:317;;23555:393;;;;;:::o;23954:60::-;23982:3;24003:5;23996:12;;23954:60;;;:::o;24020:142::-;24070:9;24103:53;24121:34;24130:24;24148:5;24130:24;:::i;:::-;24121:34;:::i;:::-;24103:53;:::i;:::-;24090:66;;24020:142;;;:::o;24168:75::-;24211:3;24232:5;24225:12;;24168:75;;;:::o;24249:269::-;24359:39;24390:7;24359:39;:::i;:::-;24420:91;24469:41;24493:16;24469:41;:::i;:::-;24461:6;24454:4;24448:11;24420:91;:::i;:::-;24414:4;24407:105;24325:193;24249:269;;;:::o;24524:73::-;24569:3;24524:73;:::o;24603:189::-;24680:32;;:::i;:::-;24721:65;24779:6;24771;24765:4;24721:65;:::i;:::-;24656:136;24603:189;;:::o;24798:186::-;24858:120;24875:3;24868:5;24865:14;24858:120;;;24929:39;24966:1;24959:5;24929:39;:::i;:::-;24902:1;24895:5;24891:13;24882:22;;24858:120;;;24798:186;;:::o;24990:543::-;25091:2;25086:3;25083:11;25080:446;;;25125:38;25157:5;25125:38;:::i;:::-;25209:29;25227:10;25209:29;:::i;:::-;25199:8;25195:44;25392:2;25380:10;25377:18;25374:49;;;25413:8;25398:23;;25374:49;25436:80;25492:22;25510:3;25492:22;:::i;:::-;25482:8;25478:37;25465:11;25436:80;:::i;:::-;25095:431;;25080:446;24990:543;;;:::o;25539:117::-;25593:8;25643:5;25637:4;25633:16;25612:37;;25539:117;;;;:::o;25662:169::-;25706:6;25739:51;25787:1;25783:6;25775:5;25772:1;25768:13;25739:51;:::i;:::-;25735:56;25820:4;25814;25810:15;25800:25;;25713:118;25662:169;;;;:::o;25836:295::-;25912:4;26058:29;26083:3;26077:4;26058:29;:::i;:::-;26050:37;;26120:3;26117:1;26113:11;26107:4;26104:21;26096:29;;25836:295;;;;:::o;26136:1395::-;26253:37;26286:3;26253:37;:::i;:::-;26355:18;26347:6;26344:30;26341:56;;;26377:18;;:::i;:::-;26341:56;26421:38;26453:4;26447:11;26421:38;:::i;:::-;26506:67;26566:6;26558;26552:4;26506:67;:::i;:::-;26600:1;26624:4;26611:17;;26656:2;26648:6;26645:14;26673:1;26668:618;;;;27330:1;27347:6;27344:77;;;27396:9;27391:3;27387:19;27381:26;27372:35;;27344:77;27447:67;27507:6;27500:5;27447:67;:::i;:::-;27441:4;27434:81;27303:222;26638:887;;26668:618;26720:4;26716:9;26708:6;26704:22;26754:37;26786:4;26754:37;:::i;:::-;26813:1;26827:208;26841:7;26838:1;26835:14;26827:208;;;26920:9;26915:3;26911:19;26905:26;26897:6;26890:42;26971:1;26963:6;26959:14;26949:24;;27018:2;27007:9;27003:18;26990:31;;26864:4;26861:1;26857:12;26852:17;;26827:208;;;27063:6;27054:7;27051:19;27048:179;;;27121:9;27116:3;27112:19;27106:26;27164:48;27206:4;27198:6;27194:17;27183:9;27164:48;:::i;:::-;27156:6;27149:64;27071:156;27048:179;27273:1;27269;27261:6;27257:14;27253:22;27247:4;27240:36;26675:611;;;26638:887;;26228:1303;;;26136:1395;;:::o;27537:174::-;27677:26;27673:1;27665:6;27661:14;27654:50;27537:174;:::o;27717:366::-;27859:3;27880:67;27944:2;27939:3;27880:67;:::i;:::-;27873:74;;27956:93;28045:3;27956:93;:::i;:::-;28074:2;28069:3;28065:12;28058:19;;27717:366;;;:::o;28089:419::-;28255:4;28293:2;28282:9;28278:18;28270:26;;28342:9;28336:4;28332:20;28328:1;28317:9;28313:17;28306:47;28370:131;28496:4;28370:131;:::i;:::-;28362:139;;28089:419;;;:::o;28514:228::-;28654:34;28650:1;28642:6;28638:14;28631:58;28723:11;28718:2;28710:6;28706:15;28699:36;28514:228;:::o;28748:366::-;28890:3;28911:67;28975:2;28970:3;28911:67;:::i;:::-;28904:74;;28987:93;29076:3;28987:93;:::i;:::-;29105:2;29100:3;29096:12;29089:19;;28748:366;;;:::o;29120:419::-;29286:4;29324:2;29313:9;29309:18;29301:26;;29373:9;29367:4;29363:20;29359:1;29348:9;29344:17;29337:47;29401:131;29527:4;29401:131;:::i;:::-;29393:139;;29120:419;;;:::o;29545:172::-;29685:24;29681:1;29673:6;29669:14;29662:48;29545:172;:::o;29723:366::-;29865:3;29886:67;29950:2;29945:3;29886:67;:::i;:::-;29879:74;;29962:93;30051:3;29962:93;:::i;:::-;30080:2;30075:3;30071:12;30064:19;;29723:366;;;:::o;30095:419::-;30261:4;30299:2;30288:9;30284:18;30276:26;;30348:9;30342:4;30338:20;30334:1;30323:9;30319:17;30312:47;30376:131;30502:4;30376:131;:::i;:::-;30368:139;;30095:419;;;:::o;30520:178::-;30660:30;30656:1;30648:6;30644:14;30637:54;30520:178;:::o;30704:366::-;30846:3;30867:67;30931:2;30926:3;30867:67;:::i;:::-;30860:74;;30943:93;31032:3;30943:93;:::i;:::-;31061:2;31056:3;31052:12;31045:19;;30704:366;;;:::o;31076:419::-;31242:4;31280:2;31269:9;31265:18;31257:26;;31329:9;31323:4;31319:20;31315:1;31304:9;31300:17;31293:47;31357:131;31483:4;31357:131;:::i;:::-;31349:139;;31076:419;;;:::o;31501:223::-;31641:34;31637:1;31629:6;31625:14;31618:58;31710:6;31705:2;31697:6;31693:15;31686:31;31501:223;:::o;31730:366::-;31872:3;31893:67;31957:2;31952:3;31893:67;:::i;:::-;31886:74;;31969:93;32058:3;31969:93;:::i;:::-;32087:2;32082:3;32078:12;32071:19;;31730:366;;;:::o;32102:419::-;32268:4;32306:2;32295:9;32291:18;32283:26;;32355:9;32349:4;32345:20;32341:1;32330:9;32326:17;32319:47;32383:131;32509:4;32383:131;:::i;:::-;32375:139;;32102:419;;;:::o;32527:191::-;32567:3;32586:20;32604:1;32586:20;:::i;:::-;32581:25;;32620:20;32638:1;32620:20;:::i;:::-;32615:25;;32663:1;32660;32656:9;32649:16;;32684:3;32681:1;32678:10;32675:36;;;32691:18;;:::i;:::-;32675:36;32527:191;;;;:::o;32724:173::-;32864:25;32860:1;32852:6;32848:14;32841:49;32724:173;:::o;32903:366::-;33045:3;33066:67;33130:2;33125:3;33066:67;:::i;:::-;33059:74;;33142:93;33231:3;33142:93;:::i;:::-;33260:2;33255:3;33251:12;33244:19;;32903:366;;;:::o;33275:419::-;33441:4;33479:2;33468:9;33464:18;33456:26;;33528:9;33522:4;33518:20;33514:1;33503:9;33499:17;33492:47;33556:131;33682:4;33556:131;:::i;:::-;33548:139;;33275:419;;;:::o;33700:173::-;33840:25;33836:1;33828:6;33824:14;33817:49;33700:173;:::o;33879:366::-;34021:3;34042:67;34106:2;34101:3;34042:67;:::i;:::-;34035:74;;34118:93;34207:3;34118:93;:::i;:::-;34236:2;34231:3;34227:12;34220:19;;33879:366;;;:::o;34251:419::-;34417:4;34455:2;34444:9;34440:18;34432:26;;34504:9;34498:4;34494:20;34490:1;34479:9;34475:17;34468:47;34532:131;34658:4;34532:131;:::i;:::-;34524:139;;34251:419;;;:::o;34676:179::-;34816:31;34812:1;34804:6;34800:14;34793:55;34676:179;:::o;34861:366::-;35003:3;35024:67;35088:2;35083:3;35024:67;:::i;:::-;35017:74;;35100:93;35189:3;35100:93;:::i;:::-;35218:2;35213:3;35209:12;35202:19;;34861:366;;;:::o;35233:419::-;35399:4;35437:2;35426:9;35422:18;35414:26;;35486:9;35480:4;35476:20;35472:1;35461:9;35457:17;35450:47;35514:131;35640:4;35514:131;:::i;:::-;35506:139;;35233:419;;;:::o;35658:410::-;35698:7;35721:20;35739:1;35721:20;:::i;:::-;35716:25;;35755:20;35773:1;35755:20;:::i;:::-;35750:25;;35810:1;35807;35803:9;35832:30;35850:11;35832:30;:::i;:::-;35821:41;;36011:1;36002:7;35998:15;35995:1;35992:22;35972:1;35965:9;35945:83;35922:139;;36041:18;;:::i;:::-;35922:139;35706:362;35658:410;;;;:::o;36074:168::-;36214:20;36210:1;36202:6;36198:14;36191:44;36074:168;:::o;36248:366::-;36390:3;36411:67;36475:2;36470:3;36411:67;:::i;:::-;36404:74;;36487:93;36576:3;36487:93;:::i;:::-;36605:2;36600:3;36596:12;36589:19;;36248:366;;;:::o;36620:419::-;36786:4;36824:2;36813:9;36809:18;36801:26;;36873:9;36867:4;36863:20;36859:1;36848:9;36844:17;36837:47;36901:131;37027:4;36901:131;:::i;:::-;36893:139;;36620:419;;;:::o;37045:234::-;37185:34;37181:1;37173:6;37169:14;37162:58;37254:17;37249:2;37241:6;37237:15;37230:42;37045:234;:::o;37285:366::-;37427:3;37448:67;37512:2;37507:3;37448:67;:::i;:::-;37441:74;;37524:93;37613:3;37524:93;:::i;:::-;37642:2;37637:3;37633:12;37626:19;;37285:366;;;:::o;37657:419::-;37823:4;37861:2;37850:9;37846:18;37838:26;;37910:9;37904:4;37900:20;37896:1;37885:9;37881:17;37874:47;37938:131;38064:4;37938:131;:::i;:::-;37930:139;;37657:419;;;:::o;38082:148::-;38184:11;38221:3;38206:18;;38082:148;;;;:::o;38236:390::-;38342:3;38370:39;38403:5;38370:39;:::i;:::-;38425:89;38507:6;38502:3;38425:89;:::i;:::-;38418:96;;38523:65;38581:6;38576:3;38569:4;38562:5;38558:16;38523:65;:::i;:::-;38613:6;38608:3;38604:16;38597:23;;38346:280;38236:390;;;;:::o;38656:874::-;38759:3;38796:5;38790:12;38825:36;38851:9;38825:36;:::i;:::-;38877:89;38959:6;38954:3;38877:89;:::i;:::-;38870:96;;38997:1;38986:9;38982:17;39013:1;39008:166;;;;39188:1;39183:341;;;;38975:549;;39008:166;39092:4;39088:9;39077;39073:25;39068:3;39061:38;39154:6;39147:14;39140:22;39132:6;39128:35;39123:3;39119:45;39112:52;;39008:166;;39183:341;39250:38;39282:5;39250:38;:::i;:::-;39310:1;39324:154;39338:6;39335:1;39332:13;39324:154;;;39412:7;39406:14;39402:1;39397:3;39393:11;39386:35;39462:1;39453:7;39449:15;39438:26;;39360:4;39357:1;39353:12;39348:17;;39324:154;;;39507:6;39502:3;39498:16;39491:23;;39190:334;;38975:549;;38763:767;;38656:874;;;;:::o;39536:589::-;39761:3;39783:95;39874:3;39865:6;39783:95;:::i;:::-;39776:102;;39895:95;39986:3;39977:6;39895:95;:::i;:::-;39888:102;;40007:92;40095:3;40086:6;40007:92;:::i;:::-;40000:99;;40116:3;40109:10;;39536:589;;;;;;:::o;40131:225::-;40271:34;40267:1;40259:6;40255:14;40248:58;40340:8;40335:2;40327:6;40323:15;40316:33;40131:225;:::o;40362:366::-;40504:3;40525:67;40589:2;40584:3;40525:67;:::i;:::-;40518:74;;40601:93;40690:3;40601:93;:::i;:::-;40719:2;40714:3;40710:12;40703:19;;40362:366;;;:::o;40734:419::-;40900:4;40938:2;40927:9;40923:18;40915:26;;40987:9;40981:4;40977:20;40973:1;40962:9;40958:17;40951:47;41015:131;41141:4;41015:131;:::i;:::-;41007:139;;40734:419;;;:::o;41159:182::-;41299:34;41295:1;41287:6;41283:14;41276:58;41159:182;:::o;41347:366::-;41489:3;41510:67;41574:2;41569:3;41510:67;:::i;:::-;41503:74;;41586:93;41675:3;41586:93;:::i;:::-;41704:2;41699:3;41695:12;41688:19;;41347:366;;;:::o;41719:419::-;41885:4;41923:2;41912:9;41908:18;41900:26;;41972:9;41966:4;41962:20;41958:1;41947:9;41943:17;41936:47;42000:131;42126:4;42000:131;:::i;:::-;41992:139;;41719:419;;;:::o;42144:224::-;42284:34;42280:1;42272:6;42268:14;42261:58;42353:7;42348:2;42340:6;42336:15;42329:32;42144:224;:::o;42374:366::-;42516:3;42537:67;42601:2;42596:3;42537:67;:::i;:::-;42530:74;;42613:93;42702:3;42613:93;:::i;:::-;42731:2;42726:3;42722:12;42715:19;;42374:366;;;:::o;42746:419::-;42912:4;42950:2;42939:9;42935:18;42927:26;;42999:9;42993:4;42989:20;42985:1;42974:9;42970:17;42963:47;43027:131;43153:4;43027:131;:::i;:::-;43019:139;;42746:419;;;:::o;43171:223::-;43311:34;43307:1;43299:6;43295:14;43288:58;43380:6;43375:2;43367:6;43363:15;43356:31;43171:223;:::o;43400:366::-;43542:3;43563:67;43627:2;43622:3;43563:67;:::i;:::-;43556:74;;43639:93;43728:3;43639:93;:::i;:::-;43757:2;43752:3;43748:12;43741:19;;43400:366;;;:::o;43772:419::-;43938:4;43976:2;43965:9;43961:18;43953:26;;44025:9;44019:4;44015:20;44011:1;44000:9;43996:17;43989:47;44053:131;44179:4;44053:131;:::i;:::-;44045:139;;43772:419;;;:::o;44197:175::-;44337:27;44333:1;44325:6;44321:14;44314:51;44197:175;:::o;44378:366::-;44520:3;44541:67;44605:2;44600:3;44541:67;:::i;:::-;44534:74;;44617:93;44706:3;44617:93;:::i;:::-;44735:2;44730:3;44726:12;44719:19;;44378:366;;;:::o;44750:419::-;44916:4;44954:2;44943:9;44939:18;44931:26;;45003:9;44997:4;44993:20;44989:1;44978:9;44974:17;44967:47;45031:131;45157:4;45031:131;:::i;:::-;45023:139;;44750:419;;;:::o;45175:237::-;45315:34;45311:1;45303:6;45299:14;45292:58;45384:20;45379:2;45371:6;45367:15;45360:45;45175:237;:::o;45418:366::-;45560:3;45581:67;45645:2;45640:3;45581:67;:::i;:::-;45574:74;;45657:93;45746:3;45657:93;:::i;:::-;45775:2;45770:3;45766:12;45759:19;;45418:366;;;:::o;45790:419::-;45956:4;45994:2;45983:9;45979:18;45971:26;;46043:9;46037:4;46033:20;46029:1;46018:9;46014:17;46007:47;46071:131;46197:4;46071:131;:::i;:::-;46063:139;;45790:419;;;:::o;46215:180::-;46263:77;46260:1;46253:88;46360:4;46357:1;46350:15;46384:4;46381:1;46374:15;46401:240;46541:34;46537:1;46529:6;46525:14;46518:58;46610:23;46605:2;46597:6;46593:15;46586:48;46401:240;:::o;46647:366::-;46789:3;46810:67;46874:2;46869:3;46810:67;:::i;:::-;46803:74;;46886:93;46975:3;46886:93;:::i;:::-;47004:2;46999:3;46995:12;46988:19;;46647:366;;;:::o;47019:419::-;47185:4;47223:2;47212:9;47208:18;47200:26;;47272:9;47266:4;47262:20;47258:1;47247:9;47243:17;47236:47;47300:131;47426:4;47300:131;:::i;:::-;47292:139;;47019:419;;;:::o;47444:98::-;47495:6;47529:5;47523:12;47513:22;;47444:98;;;:::o;47548:168::-;47631:11;47665:6;47660:3;47653:19;47705:4;47700:3;47696:14;47681:29;;47548:168;;;;:::o;47722:373::-;47808:3;47836:38;47868:5;47836:38;:::i;:::-;47890:70;47953:6;47948:3;47890:70;:::i;:::-;47883:77;;47969:65;48027:6;48022:3;48015:4;48008:5;48004:16;47969:65;:::i;:::-;48059:29;48081:6;48059:29;:::i;:::-;48054:3;48050:39;48043:46;;47812:283;47722:373;;;;:::o;48101:640::-;48296:4;48334:3;48323:9;48319:19;48311:27;;48348:71;48416:1;48405:9;48401:17;48392:6;48348:71;:::i;:::-;48429:72;48497:2;48486:9;48482:18;48473:6;48429:72;:::i;:::-;48511;48579:2;48568:9;48564:18;48555:6;48511:72;:::i;:::-;48630:9;48624:4;48620:20;48615:2;48604:9;48600:18;48593:48;48658:76;48729:4;48720:6;48658:76;:::i;:::-;48650:84;;48101:640;;;;;;;:::o;48747:141::-;48803:5;48834:6;48828:13;48819:22;;48850:32;48876:5;48850:32;:::i;:::-;48747:141;;;;:::o;48894:349::-;48963:6;49012:2;49000:9;48991:7;48987:23;48983:32;48980:119;;;49018:79;;:::i;:::-;48980:119;49138:1;49163:63;49218:7;49209:6;49198:9;49194:22;49163:63;:::i;:::-;49153:73;;49109:127;48894:349;;;;:::o;49249:194::-;49289:4;49309:20;49327:1;49309:20;:::i;:::-;49304:25;;49343:20;49361:1;49343:20;:::i;:::-;49338:25;;49387:1;49384;49380:9;49372:17;;49411:1;49405:4;49402:11;49399:37;;;49416:18;;:::i;:::-;49399:37;49249:194;;;;:::o;49449:180::-;49497:77;49494:1;49487:88;49594:4;49591:1;49584:15;49618:4;49615:1;49608:15;49635:182;49775:34;49771:1;49763:6;49759:14;49752:58;49635:182;:::o;49823:366::-;49965:3;49986:67;50050:2;50045:3;49986:67;:::i;:::-;49979:74;;50062:93;50151:3;50062:93;:::i;:::-;50180:2;50175:3;50171:12;50164:19;;49823:366;;;:::o;50195:419::-;50361:4;50399:2;50388:9;50384:18;50376:26;;50448:9;50442:4;50438:20;50434:1;50423:9;50419:17;50412:47;50476:131;50602:4;50476:131;:::i;:::-;50468:139;;50195:419;;;:::o;50620:178::-;50760:30;50756:1;50748:6;50744:14;50737:54;50620:178;:::o;50804:366::-;50946:3;50967:67;51031:2;51026:3;50967:67;:::i;:::-;50960:74;;51043:93;51132:3;51043:93;:::i;:::-;51161:2;51156:3;51152:12;51145:19;;50804:366;;;:::o;51176:419::-;51342:4;51380:2;51369:9;51365:18;51357:26;;51429:9;51423:4;51419:20;51415:1;51404:9;51400:17;51393:47;51457:131;51583:4;51457:131;:::i;:::-;51449:139;;51176:419;;;:::o

Swarm Source

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