ETH Price: $3,390.58 (+6.22%)
Gas: 38 Gwei

Token

BLE$$ (BLE$$)
 

Overview

Max Total Supply

1,000,001,000 BLE$$

Holders

126

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
quezer.eth
Balance
2,885.658769230769230769 BLE$$

Value
$0.00
0xe0a15f73cf155384307d67b2f28719b1fc301519
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:
Bless

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-03
*/

// File: Desktop/prayerhands/bless.sol



// File: @openzeppelin/[email protected]/utils/math/SafeCast.sol


// OpenZeppelin Contracts v4.4.0 (utils/math/SafeCast.sol)

pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {
    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits");
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits");
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits");
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits");
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits");
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits");
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits");
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// OpenZeppelin Contracts v4.4.0 (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @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 / b + (a % b == 0 ? 0 : 1);
    }
}

// File: @openzeppelin/[email protected]/utils/Counters.sol


// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

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

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

// File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.0 (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/[email protected]/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.0 (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/[email protected]/utils/Strings.sol


// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

// File: @openzeppelin/[email protected]/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: @openzeppelin/[email protected]/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

// File: @openzeppelin/[email protected]/access/IAccessControl.sol


// OpenZeppelin Contracts v4.4.0 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/[email protected]/utils/Context.sol


// OpenZeppelin Contracts v4.4.0 (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/[email protected]/access/AccessControl.sol


// OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/[email protected]/security/Pausable.sol


// OpenZeppelin Contracts v4.4.0 (security/Pausable.sol)

pragma solidity ^0.8.0;


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

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

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

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

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/[email protected]/token/ERC20/ERC20.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

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

// File: @openzeppelin/[email protected]/token/ERC20/extensions/draft-ERC20Permit.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/draft-ERC20Permit.sol)

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: @openzeppelin/[email protected]/token/ERC20/extensions/ERC20Votes.sol


// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/ERC20Votes.sol)

pragma solidity ^0.8.0;





/**
 * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,
 * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.
 *
 * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.
 *
 * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either
 * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting
 * power can be queried through the public accessors {getVotes} and {getPastVotes}.
 *
 * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it
 * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.
 * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this
 * will significantly increase the base gas cost of transfers.
 *
 * _Available since v4.2._
 */
abstract contract ERC20Votes is ERC20Permit {
    struct Checkpoint {
        uint32 fromBlock;
        uint224 votes;
    }

    bytes32 private constant _DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    mapping(address => address) private _delegates;
    mapping(address => Checkpoint[]) private _checkpoints;
    Checkpoint[] private _totalSupplyCheckpoints;

    /**
     * @dev Emitted when an account changes their delegate.
     */
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /**
     * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.
     */
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

    /**
     * @dev Get the `pos`-th checkpoint for `account`.
     */
    function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {
        return _checkpoints[account][pos];
    }

    /**
     * @dev Get number of checkpoints for `account`.
     */
    function numCheckpoints(address account) public view virtual returns (uint32) {
        return SafeCast.toUint32(_checkpoints[account].length);
    }

    /**
     * @dev Get the address `account` is currently delegating to.
     */
    function delegates(address account) public view virtual returns (address) {
        return _delegates[account];
    }

    /**
     * @dev Gets the current votes balance for `account`
     */
    function getVotes(address account) public view returns (uint256) {
        uint256 pos = _checkpoints[account].length;
        return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;
    }

    /**
     * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_checkpoints[account], blockNumber);
    }

    /**
     * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.
     * It is but NOT the sum of all the delegated votes!
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);
    }

    /**
     * @dev Lookup a value in a list of (sorted) checkpoints.
     */
    function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {
        // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.
        //
        // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).
        // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.
        // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)
        // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)
        // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not
        // out of bounds (in which case we're looking too far in the past and the result is 0).
        // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is
        // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out
        // the same.
        uint256 high = ckpts.length;
        uint256 low = 0;
        while (low < high) {
            uint256 mid = Math.average(low, high);
            if (ckpts[mid].fromBlock > blockNumber) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        return high == 0 ? 0 : ckpts[high - 1].votes;
    }

    /**
     * @dev Delegate votes from the sender to `delegatee`.
     */
    function delegate(address delegatee) public virtual {
        _delegate(_msgSender(), delegatee);
    }

    /**
     * @dev Delegates votes from signer to `delegatee`
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(block.timestamp <= expiry, "ERC20Votes: signature expired");
        address signer = ECDSA.recover(
            _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),
            v,
            r,
            s
        );
        require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce");
        _delegate(signer, delegatee);
    }

    /**
     * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).
     */
    function _maxSupply() internal view virtual returns (uint224) {
        return type(uint224).max;
    }

    /**
     * @dev Snapshots the totalSupply after it has been increased.
     */
    function _mint(address account, uint256 amount) internal virtual override {
        super._mint(account, amount);
        require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes");

        _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);
    }

    /**
     * @dev Snapshots the totalSupply after it has been decreased.
     */
    function _burn(address account, uint256 amount) internal virtual override {
        super._burn(account, amount);

        _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);
    }

    /**
     * @dev Move voting power when tokens are transferred.
     *
     * Emits a {DelegateVotesChanged} event.
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._afterTokenTransfer(from, to, amount);

        _moveVotingPower(delegates(from), delegates(to), amount);
    }

    /**
     * @dev Change delegation for `delegator` to `delegatee`.
     *
     * Emits events {DelegateChanged} and {DelegateVotesChanged}.
     */
    function _delegate(address delegator, address delegatee) internal virtual {
        address currentDelegate = delegates(delegator);
        uint256 delegatorBalance = balanceOf(delegator);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveVotingPower(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveVotingPower(
        address src,
        address dst,
        uint256 amount
    ) private {
        if (src != dst && amount > 0) {
            if (src != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);
                emit DelegateVotesChanged(src, oldWeight, newWeight);
            }

            if (dst != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);
                emit DelegateVotesChanged(dst, oldWeight, newWeight);
            }
        }
    }

    function _writeCheckpoint(
        Checkpoint[] storage ckpts,
        function(uint256, uint256) view returns (uint256) op,
        uint256 delta
    ) private returns (uint256 oldWeight, uint256 newWeight) {
        uint256 pos = ckpts.length;
        oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;
        newWeight = op(oldWeight, delta);

        if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {
            ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);
        } else {
            ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));
        }
    }

    function _add(uint256 a, uint256 b) private pure returns (uint256) {
        return a + b;
    }

    function _subtract(uint256 a, uint256 b) private pure returns (uint256) {
        return a - b;
    }
}

// File: contract-d08729233d.sol


pragma solidity 0.8.7;


contract Bless is ERC20, Pausable, AccessControl, ERC20Permit, ERC20Votes {
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant WITHDRAW_ROLE = keccak256("WITHDRAW_ROLE");

    constructor() ERC20("BLE$$", "BLE$$") ERC20Permit("BLE$$") {
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(PAUSER_ROLE, msg.sender);
        _mint(msg.sender, 1000 * 10 ** decimals());
        _grantRole(MINTER_ROLE, msg.sender);
        _grantRole(WITHDRAW_ROLE, msg.sender);
    }

    function pause() public onlyRole(PAUSER_ROLE) {
        _pause();
    }

    function unpause() public onlyRole(PAUSER_ROLE) {
        _unpause();
    }

    function withdraw(uint256 amount) public onlyRole(WITHDRAW_ROLE) {
        require(amount <= address(this).balance);
        payable(msg.sender).transfer(amount);
    }

    function mint(uint256 amount) public onlyRole(DEFAULT_ADMIN_ROLE) {

        _mint(msg.sender, amount);
    }

    function burn(uint256 amount) public onlyRole(DEFAULT_ADMIN_ROLE) {

        _burn(msg.sender, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // The following functions are overrides required by Solidity.

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20Votes.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140908152503480156200003a57600080fd5b506040518060400160405280600581526020017f424c452424000000000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f424c4524240000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f424c45242400000000000000000000000000000000000000000000000000000081525081600390805190602001906200012c92919062000e61565b5080600490805190602001906200014592919062000e61565b5050506000600560006101000a81548160ff02191690831515021790555060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001cc8184846200030860201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508061012081815250505050505050506200022e6000801b336200034460201b60201c565b620002607f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a336200034460201b60201c565b6200029e33620002756200043660201b60201c565b600a62000283919062001221565b6103e86200029291906200135e565b6200043f60201b60201c565b620002d07f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200034460201b60201c565b620003027f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec336200034460201b60201c565b6200165e565b600083838346306040516020016200032595949392919062001007565b6040516020818303038152906040528051906020012090509392505050565b6200035682826200045a60201b60201c565b620004325760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003d7620004c560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006012905090565b620004568282620004cd60201b620016a31760201c565b5050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b620004e482826200058b60201b620017301760201c565b620004f46200070460201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620005226200072860201b60201c565b111562000566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200055d9062001086565b60405180910390fd5b62000585600a6200073260201b6200189017836200074a60201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005f590620010ec565b60405180910390fd5b6200061260008383620009fb60201b60201c565b806002600082825462000626919062001169565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200067d919062001169565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620006e491906200110e565b60405180910390a3620007006000838362000a6b60201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b6000818362000742919062001169565b905092915050565b60008060008580549050905060008114620007bf57856001826200076f9190620013bf565b81548110620007835762000782620014e3565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620007c2565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250620007ee83858760201c565b915060008111801562000847575043866001836200080d9190620013bf565b81548110620008215762000820620014e3565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620008e857620008638262000a8860201b620018a61760201c565b86600183620008739190620013bf565b81548110620008875762000886620014e3565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620009f2565b8560405180604001604052806200090a4362000af660201b620019111760201c565b63ffffffff1681526020016200092b8562000a8860201b620018a61760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b62000a0b62000b4c60201b60201c565b1562000a4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a459062001064565b60405180910390fd5b62000a6683838362000b6360201b620019641760201c565b505050565b62000a8383838362000b6860201b620019691760201c565b505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ae590620010a8565b60405180910390fd5b819050919050565b600063ffffffff801682111562000b44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b3b90620010ca565b60405180910390fd5b819050919050565b6000600560009054906101000a900460ff16905090565b505050565b62000b8083838362000bb860201b620019941760201c565b62000bb362000b958462000bbd60201b60201c565b62000ba68462000bbd60201b60201c565b8362000c2660201b60201c565b505050565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000c635750600081115b1562000e4457600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000d565760008062000cfd600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000e4960201b6200199917856200074a60201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000d4b9291906200112b565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000e435760008062000dea600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200073260201b6200189017856200074a60201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000e389291906200112b565b60405180910390a250505b5b505050565b6000818362000e599190620013bf565b905092915050565b82805462000e6f906200144f565b90600052602060002090601f01602090048101928262000e93576000855562000edf565b82601f1062000eae57805160ff191683800117855562000edf565b8280016001018555821562000edf579182015b8281111562000ede57825182559160200191906001019062000ec1565b5b50905062000eee919062000ef2565b5090565b5b8082111562000f0d57600081600090555060010162000ef3565b5090565b62000f1c81620013fa565b82525050565b62000f2d816200140e565b82525050565b600062000f4260108362001158565b915062000f4f826200151f565b602082019050919050565b600062000f6960308362001158565b915062000f768262001548565b604082019050919050565b600062000f9060278362001158565b915062000f9d8262001597565b604082019050919050565b600062000fb760268362001158565b915062000fc482620015e6565b604082019050919050565b600062000fde601f8362001158565b915062000feb8262001635565b602082019050919050565b620010018162001438565b82525050565b600060a0820190506200101e600083018862000f22565b6200102d602083018762000f22565b6200103c604083018662000f22565b6200104b606083018562000ff6565b6200105a608083018462000f11565b9695505050505050565b600060208201905081810360008301526200107f8162000f33565b9050919050565b60006020820190508181036000830152620010a18162000f5a565b9050919050565b60006020820190508181036000830152620010c38162000f81565b9050919050565b60006020820190508181036000830152620010e58162000fa8565b9050919050565b60006020820190508181036000830152620011078162000fcf565b9050919050565b600060208201905062001125600083018462000ff6565b92915050565b600060408201905062001142600083018562000ff6565b62001151602083018462000ff6565b9392505050565b600082825260208201905092915050565b6000620011768262001438565b9150620011838362001438565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620011bb57620011ba62001485565b5b828201905092915050565b6000808291508390505b60018511156200121857808604811115620011f057620011ef62001485565b5b6001851615620012005780820291505b8081029050620012108562001512565b9450620011d0565b94509492505050565b60006200122e8262001438565b91506200123b8362001442565b92506200126a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001272565b905092915050565b60008262001284576001905062001357565b8162001294576000905062001357565b8160018114620012ad5760028114620012b857620012ee565b600191505062001357565b60ff841115620012cd57620012cc62001485565b5b8360020a915084821115620012e757620012e662001485565b5b5062001357565b5060208310610133831016604e8410600b8410161715620013285782820a90508381111562001322576200132162001485565b5b62001357565b620013378484846001620011c6565b9250905081840481111562001351576200135062001485565b5b81810290505b9392505050565b60006200136b8262001438565b9150620013788362001438565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620013b457620013b362001485565b5b828202905092915050565b6000620013cc8262001438565b9150620013d98362001438565b925082821015620013ef57620013ee62001485565b5b828203905092915050565b6000620014078262001418565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200146857607f821691505b602082108114156200147f576200147e620014b4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160011c9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60805160a05160c05160601c60e051610100516101205161014051614d47620016bc600039600061137c01526000612099015260006120db015260006120ba01526000611fef015260006120450152600061206e0152614d476000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c806370a0823111610130578063a457c2d7116100b8578063d547741f1161007c578063d547741f146106eb578063dd62ed3e14610707578063e02023a114610737578063e63ab1e914610755578063f1127ed81461077357610232565b8063a457c2d714610635578063a9059cbb14610665578063c3cda52014610695578063d505accf146106b1578063d5391393146106cd57610232565b806391d14854116100ff57806391d148541461057d57806395d89b41146105ad5780639ab24eb0146105cb578063a0712d68146105fb578063a217fddf1461061757610232565b806370a08231146104e35780637ecebe00146105135780638456cb59146105435780638e539e8c1461054d57610232565b80633644e515116101be57806342966c681161018257806342966c681461042d578063587cde1e146104495780635c19a95c146104795780635c975abb146104955780636fcfff45146104b357610232565b80633644e5151461038957806336568abe146103a757806339509351146103c35780633a46b1a8146103f35780633f4ba83a1461042357610232565b806323b872dd1161020557806323b872dd146102d3578063248a9ca3146103035780632e1a7d4d146103335780632f2ff15d1461034f578063313ce5671461036b57610232565b806301ffc9a71461023757806306fdde0314610267578063095ea7b31461028557806318160ddd146102b5575b600080fd5b610251600480360381019061024c9190613670565b6107a3565b60405161025e9190613c75565b60405180910390f35b61026f61081d565b60405161027c9190613de9565b60405180910390f35b61029f600480360381019061029a91906134f6565b6108af565b6040516102ac9190613c75565b60405180910390f35b6102bd6108cd565b6040516102ca9190614166565b60405180910390f35b6102ed60048036038101906102e89190613401565b6108d7565b6040516102fa9190613c75565b60405180910390f35b61031d60048036038101906103189190613603565b6109cf565b60405161032a9190613c90565b60405180910390f35b61034d6004803603810190610348919061369d565b6109ef565b005b61036960048036038101906103649190613630565b610a79565b005b610373610aa2565b60405161038091906141c5565b60405180910390f35b610391610aab565b60405161039e9190613c90565b60405180910390f35b6103c160048036038101906103bc9190613630565b610aba565b005b6103dd60048036038101906103d891906134f6565b610b3d565b6040516103ea9190613c75565b60405180910390f35b61040d600480360381019061040891906134f6565b610be9565b60405161041a9190614166565b60405180910390f35b61042b610c7d565b005b6104476004803603810190610442919061369d565b610cba565b005b610463600480360381019061045e9190613394565b610cdd565b6040516104709190613c5a565b60405180910390f35b610493600480360381019061048e9190613394565b610d46565b005b61049d610d5a565b6040516104aa9190613c75565b60405180910390f35b6104cd60048036038101906104c89190613394565b610d71565b6040516104da91906141aa565b60405180910390f35b6104fd60048036038101906104f89190613394565b610dc5565b60405161050a9190614166565b60405180910390f35b61052d60048036038101906105289190613394565b610e0d565b60405161053a9190614166565b60405180910390f35b61054b610e5d565b005b6105676004803603810190610562919061369d565b610e9a565b6040516105749190614166565b60405180910390f35b61059760048036038101906105929190613630565b610ef0565b6040516105a49190613c75565b60405180910390f35b6105b5610f5b565b6040516105c29190613de9565b60405180910390f35b6105e560048036038101906105e09190613394565b610fed565b6040516105f29190614166565b60405180910390f35b6106156004803603810190610610919061369d565b6110fe565b005b61061f611121565b60405161062c9190613c90565b60405180910390f35b61064f600480360381019061064a91906134f6565b611128565b60405161065c9190613c75565b60405180910390f35b61067f600480360381019061067a91906134f6565b611213565b60405161068c9190613c75565b60405180910390f35b6106af60048036038101906106aa9190613536565b611231565b005b6106cb60048036038101906106c69190613454565b611335565b005b6106d5611477565b6040516106e29190613c90565b60405180910390f35b61070560048036038101906107009190613630565b61149b565b005b610721600480360381019061071c91906133c1565b6114c4565b60405161072e9190614166565b60405180910390f35b61073f61154b565b60405161074c9190613c90565b60405180910390f35b61075d61156f565b60405161076a9190613c90565b60405180910390f35b61078d600480360381019061078891906135c3565b611593565b60405161079a919061414b565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108165750610815826119af565b5b9050919050565b60606003805461082c9061443c565b80601f01602080910402602001604051908101604052809291908181526020018280546108589061443c565b80156108a55780601f1061087a576101008083540402835291602001916108a5565b820191906000526020600020905b81548152906001019060200180831161088857829003601f168201915b5050505050905090565b60006108c36108bc611a19565b8484611a21565b6001905092915050565b6000600254905090565b60006108e4848484611bec565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061092f611a19565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a69061400b565b60405180910390fd5b6109c3856109bb611a19565b858403611a21565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec610a2181610a1c611a19565b611e6d565b47821115610a2e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610a74573d6000803e3d6000fd5b505050565b610a82826109cf565b610a9381610a8e611a19565b611e6d565b610a9d8383611f0a565b505050565b60006012905090565b6000610ab5611feb565b905090565b610ac2611a19565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b269061410b565b60405180910390fd5b610b398282612105565b5050565b6000610bdf610b4a611a19565b848460016000610b58611a19565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bda9190614207565b611a21565b6001905092915050565b6000438210610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490613e6b565b60405180910390fd5b610c75600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836121e7565b905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610caf81610caa611a19565b611e6d565b610cb76122f3565b50565b6000801b610ccf81610cca611a19565b611e6d565b610cd93383612395565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610d57610d51611a19565b826123a3565b50565b6000600560009054906101000a900460ff16905090565b6000610dbe600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611911565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610e56600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124bd565b9050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e8f81610e8a611a19565b611e6d565b610e976124cb565b50565b6000438210610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590613e6b565b60405180910390fd5b610ee9600a836121e7565b9050919050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610f6a9061443c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f969061443c565b8015610fe35780601f10610fb857610100808354040283529160200191610fe3565b820191906000526020600020905b815481529060010190602001808311610fc657829003601f168201915b5050505050905090565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600081146110d557600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060018261108991906142e8565b8154811061109a57611099614534565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110d8565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6000801b6111138161110e611a19565b611e6d565b61111d338361256e565b5050565b6000801b81565b60008060016000611137611a19565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb906140eb565b60405180910390fd5b6112086111ff611a19565b85858403611a21565b600191505092915050565b6000611227611220611a19565b8484611bec565b6001905092915050565b83421115611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b90613eab565b60405180910390fd5b60006112d66112ce7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8989896040516020016112b39493929190613d0c565b6040516020818303038152906040528051906020012061257c565b858585612596565b90506112e1816125c1565b8614611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990613f0b565b60405180910390fd5b61132c81886123a3565b50505050505050565b83421115611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f90613f4b565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008888886113a78c6125c1565b896040516020016113bd96959493929190613cab565b60405160208183030381529060405280519060200120905060006113e08261257c565b905060006113f082878787612596565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790613feb565b60405180910390fd5b61146b8a8a8a611a21565b50505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6114a4826109cf565b6114b5816114b0611a19565b611e6d565b6114bf8383612105565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61159b6132d8565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff16815481106115f2576115f1614534565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b6116ad8282611730565b6116b561261f565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116db6108cd565b111561171c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117139061402b565b60405180910390fd5b61172a600a61189083612643565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117979061412b565b60405180910390fd5b6117ac600083836128bb565b80600260008282546117be9190614207565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118139190614207565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118789190614166565b60405180910390a361188c60008383612913565b5050565b6000818361189e9190614207565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119009061404b565b60405180910390fd5b819050919050565b600063ffffffff801682111561195c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611953906140ab565b60405180910390fd5b819050919050565b505050565b611974838383611994565b61198f61198084610cdd565b61198984610cdd565b83612923565b505050565b505050565b600081836119a791906142e8565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a88906140cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af890613f2b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611bdf9190614166565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c539061408b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc390613e4b565b60405180910390fd5b611cd78383836128bb565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5490613f6b565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611df09190614207565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e549190614166565b60405180910390a3611e67848484612913565b50505050565b611e778282610ef0565b611f0657611e9c8173ffffffffffffffffffffffffffffffffffffffff166014612b1c565b611eaa8360001c6020612b1c565b604051602001611ebb929190613c20565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd9190613de9565b60405180910390fd5b5050565b611f148282610ef0565b611fe75760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f8c611a19565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561206757507f000000000000000000000000000000000000000000000000000000000000000046145b15612094577f00000000000000000000000000000000000000000000000000000000000000009050612102565b6120ff7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d58565b90505b90565b61210f8282610ef0565b156121e35760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612188611a19565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808380549050905060005b818110156122665760006122088284612d92565b90508486828154811061221e5761221d614534565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561225057809250612260565b60018161225d9190614207565b91505b506121f4565b600082146122c8578460018361227c91906142e8565b8154811061228d5761228c614534565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166122cb565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6122fb610d5a565b61233a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233190613e8b565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61237e611a19565b60405161238b9190613c5a565b60405180910390a1565b61239f8282612db8565b5050565b60006123ae83610cdd565b905060006123bb84610dc5565b905082600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46124b7828483612923565b50505050565b600081600001549050919050565b6124d3610d5a565b15612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a90613fab565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612557611a19565b6040516125649190613c5a565b60405180910390a1565b61257882826116a3565b5050565b600061258f612589611feb565b83612dd6565b9050919050565b60008060006125a787878787612e09565b915091506125b481612f16565b8192505050949350505050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061260e816124bd565b9150612619816130eb565b50919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b600080600085805490509050600081146126b1578560018261266591906142e8565b8154811061267657612675614534565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166126b4565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506126e283858763ffffffff16565b9150600081118015612735575043866001836126fe91906142e8565b8154811061270f5761270e614534565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156127c257612743826118a6565b8660018361275191906142e8565b8154811061276257612761614534565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506128b2565b8560405180604001604052806127d743611911565b63ffffffff1681526020016127eb856118a6565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b6128c3610d5a565b15612903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fa90613fab565b60405180910390fd5b61290e838383611964565b505050565b61291e838383611969565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561295f5750600081115b15612b1757600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a3d576000806129e6600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061199985612643565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612a32929190614181565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b1657600080612abf600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061189085612643565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612b0b929190614181565b60405180910390a250505b5b505050565b606060006002836002612b2f919061428e565b612b399190614207565b67ffffffffffffffff811115612b5257612b51614563565b5b6040519080825280601f01601f191660200182016040528015612b845781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612bbc57612bbb614534565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612c2057612c1f614534565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612c60919061428e565b612c6a9190614207565b90505b6001811115612d0a577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612cac57612cab614534565b5b1a60f81b828281518110612cc357612cc2614534565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612d0390614412565b9050612c6d565b5060008414612d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4590613e2b565b60405180910390fd5b8091505092915050565b60008383834630604051602001612d73959493929190613d51565b6040516020818303038152906040528051906020012090509392505050565b60006002828418612da3919061425d565b828416612db09190614207565b905092915050565b612dc28282613101565b612dd0600a61199983612643565b50505050565b60008282604051602001612deb929190613be9565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612e44576000600391509150612f0d565b601b8560ff1614158015612e5c5750601c8560ff1614155b15612e6e576000600491509150612f0d565b600060018787878760405160008152602001604052604051612e939493929190613da4565b6020604051602081039080840390855afa158015612eb5573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f0457600060019250925050612f0d565b80600092509250505b94509492505050565b60006004811115612f2a57612f296144d6565b5b816004811115612f3d57612f3c6144d6565b5b1415612f48576130e8565b60016004811115612f5c57612f5b6144d6565b5b816004811115612f6f57612f6e6144d6565b5b1415612fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa790613e0b565b60405180910390fd5b60026004811115612fc457612fc36144d6565b5b816004811115612fd757612fd66144d6565b5b1415613018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300f90613eeb565b60405180910390fd5b6003600481111561302c5761302b6144d6565b5b81600481111561303f5761303e6144d6565b5b1415613080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307790613f8b565b60405180910390fd5b600480811115613093576130926144d6565b5b8160048111156130a6576130a56144d6565b5b14156130e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130de90613fcb565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613171576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131689061406b565b60405180910390fd5b61317d826000836128bb565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fa90613ecb565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461325a91906142e8565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516132bf9190614166565b60405180910390a36132d383600084612913565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b60008135905061332581614c87565b92915050565b60008135905061333a81614c9e565b92915050565b60008135905061334f81614cb5565b92915050565b60008135905061336481614ccc565b92915050565b60008135905061337981614ce3565b92915050565b60008135905061338e81614cfa565b92915050565b6000602082840312156133aa576133a9614592565b5b60006133b884828501613316565b91505092915050565b600080604083850312156133d8576133d7614592565b5b60006133e685828601613316565b92505060206133f785828601613316565b9150509250929050565b60008060006060848603121561341a57613419614592565b5b600061342886828701613316565b935050602061343986828701613316565b925050604061344a86828701613355565b9150509250925092565b600080600080600080600060e0888a03121561347357613472614592565b5b60006134818a828b01613316565b97505060206134928a828b01613316565b96505060406134a38a828b01613355565b95505060606134b48a828b01613355565b94505060806134c58a828b0161337f565b93505060a06134d68a828b0161332b565b92505060c06134e78a828b0161332b565b91505092959891949750929550565b6000806040838503121561350d5761350c614592565b5b600061351b85828601613316565b925050602061352c85828601613355565b9150509250929050565b60008060008060008060c0878903121561355357613552614592565b5b600061356189828a01613316565b965050602061357289828a01613355565b955050604061358389828a01613355565b945050606061359489828a0161337f565b93505060806135a589828a0161332b565b92505060a06135b689828a0161332b565b9150509295509295509295565b600080604083850312156135da576135d9614592565b5b60006135e885828601613316565b92505060206135f98582860161336a565b9150509250929050565b60006020828403121561361957613618614592565b5b60006136278482850161332b565b91505092915050565b6000806040838503121561364757613646614592565b5b60006136558582860161332b565b925050602061366685828601613316565b9150509250929050565b60006020828403121561368657613685614592565b5b600061369484828501613340565b91505092915050565b6000602082840312156136b3576136b2614592565b5b60006136c184828501613355565b91505092915050565b6136d38161431c565b82525050565b6136e28161432e565b82525050565b6136f18161433a565b82525050565b6137086137038261433a565b61446e565b82525050565b6000613719826141e0565b61372381856141eb565b93506137338185602086016143df565b61373c81614597565b840191505092915050565b6000613752826141e0565b61375c81856141fc565b935061376c8185602086016143df565b80840191505092915050565b60006137856018836141eb565b9150613790826145a8565b602082019050919050565b60006137a86020836141eb565b91506137b3826145d1565b602082019050919050565b60006137cb6023836141eb565b91506137d6826145fa565b604082019050919050565b60006137ee601f836141eb565b91506137f982614649565b602082019050919050565b60006138116014836141eb565b915061381c82614672565b602082019050919050565b6000613834601d836141eb565b915061383f8261469b565b602082019050919050565b60006138576022836141eb565b9150613862826146c4565b604082019050919050565b600061387a601f836141eb565b915061388582614713565b602082019050919050565b600061389d6019836141eb565b91506138a88261473c565b602082019050919050565b60006138c06022836141eb565b91506138cb82614765565b604082019050919050565b60006138e36002836141fc565b91506138ee826147b4565b600282019050919050565b6000613906601d836141eb565b9150613911826147dd565b602082019050919050565b60006139296026836141eb565b915061393482614806565b604082019050919050565b600061394c6022836141eb565b915061395782614855565b604082019050919050565b600061396f6010836141eb565b915061397a826148a4565b602082019050919050565b60006139926022836141eb565b915061399d826148cd565b604082019050919050565b60006139b5601e836141eb565b91506139c08261491c565b602082019050919050565b60006139d86028836141eb565b91506139e382614945565b604082019050919050565b60006139fb6030836141eb565b9150613a0682614994565b604082019050919050565b6000613a1e6027836141eb565b9150613a29826149e3565b604082019050919050565b6000613a416021836141eb565b9150613a4c82614a32565b604082019050919050565b6000613a646025836141eb565b9150613a6f82614a81565b604082019050919050565b6000613a876026836141eb565b9150613a9282614ad0565b604082019050919050565b6000613aaa6024836141eb565b9150613ab582614b1f565b604082019050919050565b6000613acd6017836141fc565b9150613ad882614b6e565b601782019050919050565b6000613af06025836141eb565b9150613afb82614b97565b604082019050919050565b6000613b136011836141fc565b9150613b1e82614be6565b601182019050919050565b6000613b36602f836141eb565b9150613b4182614c0f565b604082019050919050565b6000613b59601f836141eb565b9150613b6482614c5e565b602082019050919050565b604082016000820151613b856000850182613bbc565b506020820151613b986020850182613b9e565b50505050565b613ba781614390565b82525050565b613bb6816143b8565b82525050565b613bc5816143c2565b82525050565b613bd4816143c2565b82525050565b613be3816143d2565b82525050565b6000613bf4826138d6565b9150613c0082856136f7565b602082019150613c1082846136f7565b6020820191508190509392505050565b6000613c2b82613ac0565b9150613c378285613747565b9150613c4282613b06565b9150613c4e8284613747565b91508190509392505050565b6000602082019050613c6f60008301846136ca565b92915050565b6000602082019050613c8a60008301846136d9565b92915050565b6000602082019050613ca560008301846136e8565b92915050565b600060c082019050613cc060008301896136e8565b613ccd60208301886136ca565b613cda60408301876136ca565b613ce76060830186613bad565b613cf46080830185613bad565b613d0160a0830184613bad565b979650505050505050565b6000608082019050613d2160008301876136e8565b613d2e60208301866136ca565b613d3b6040830185613bad565b613d486060830184613bad565b95945050505050565b600060a082019050613d6660008301886136e8565b613d7360208301876136e8565b613d8060408301866136e8565b613d8d6060830185613bad565b613d9a60808301846136ca565b9695505050505050565b6000608082019050613db960008301876136e8565b613dc66020830186613bda565b613dd360408301856136e8565b613de060608301846136e8565b95945050505050565b60006020820190508181036000830152613e03818461370e565b905092915050565b60006020820190508181036000830152613e2481613778565b9050919050565b60006020820190508181036000830152613e448161379b565b9050919050565b60006020820190508181036000830152613e64816137be565b9050919050565b60006020820190508181036000830152613e84816137e1565b9050919050565b60006020820190508181036000830152613ea481613804565b9050919050565b60006020820190508181036000830152613ec481613827565b9050919050565b60006020820190508181036000830152613ee48161384a565b9050919050565b60006020820190508181036000830152613f048161386d565b9050919050565b60006020820190508181036000830152613f2481613890565b9050919050565b60006020820190508181036000830152613f44816138b3565b9050919050565b60006020820190508181036000830152613f64816138f9565b9050919050565b60006020820190508181036000830152613f848161391c565b9050919050565b60006020820190508181036000830152613fa48161393f565b9050919050565b60006020820190508181036000830152613fc481613962565b9050919050565b60006020820190508181036000830152613fe481613985565b9050919050565b60006020820190508181036000830152614004816139a8565b9050919050565b60006020820190508181036000830152614024816139cb565b9050919050565b60006020820190508181036000830152614044816139ee565b9050919050565b6000602082019050818103600083015261406481613a11565b9050919050565b6000602082019050818103600083015261408481613a34565b9050919050565b600060208201905081810360008301526140a481613a57565b9050919050565b600060208201905081810360008301526140c481613a7a565b9050919050565b600060208201905081810360008301526140e481613a9d565b9050919050565b6000602082019050818103600083015261410481613ae3565b9050919050565b6000602082019050818103600083015261412481613b29565b9050919050565b6000602082019050818103600083015261414481613b4c565b9050919050565b60006040820190506141606000830184613b6f565b92915050565b600060208201905061417b6000830184613bad565b92915050565b60006040820190506141966000830185613bad565b6141a36020830184613bad565b9392505050565b60006020820190506141bf6000830184613bcb565b92915050565b60006020820190506141da6000830184613bda565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000614212826143b8565b915061421d836143b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561425257614251614478565b5b828201905092915050565b6000614268826143b8565b9150614273836143b8565b925082614283576142826144a7565b5b828204905092915050565b6000614299826143b8565b91506142a4836143b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142dd576142dc614478565b5b828202905092915050565b60006142f3826143b8565b91506142fe836143b8565b92508282101561431157614310614478565b5b828203905092915050565b600061432782614370565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b838110156143fd5780820151818401526020810190506143e2565b8381111561440c576000848401525b50505050565b600061441d826143b8565b9150600082141561443157614430614478565b5b600182039050919050565b6000600282049050600182168061445457607f821691505b6020821081141561446857614467614505565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b614c908161431c565b8114614c9b57600080fd5b50565b614ca78161433a565b8114614cb257600080fd5b50565b614cbe81614344565b8114614cc957600080fd5b50565b614cd5816143b8565b8114614ce057600080fd5b50565b614cec816143c2565b8114614cf757600080fd5b50565b614d03816143d2565b8114614d0e57600080fd5b5056fea2646970667358221220265a3e0aa075f707e47061addbb5159a5462e9ce0ca6c86ea59118aca611683864736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c806370a0823111610130578063a457c2d7116100b8578063d547741f1161007c578063d547741f146106eb578063dd62ed3e14610707578063e02023a114610737578063e63ab1e914610755578063f1127ed81461077357610232565b8063a457c2d714610635578063a9059cbb14610665578063c3cda52014610695578063d505accf146106b1578063d5391393146106cd57610232565b806391d14854116100ff57806391d148541461057d57806395d89b41146105ad5780639ab24eb0146105cb578063a0712d68146105fb578063a217fddf1461061757610232565b806370a08231146104e35780637ecebe00146105135780638456cb59146105435780638e539e8c1461054d57610232565b80633644e515116101be57806342966c681161018257806342966c681461042d578063587cde1e146104495780635c19a95c146104795780635c975abb146104955780636fcfff45146104b357610232565b80633644e5151461038957806336568abe146103a757806339509351146103c35780633a46b1a8146103f35780633f4ba83a1461042357610232565b806323b872dd1161020557806323b872dd146102d3578063248a9ca3146103035780632e1a7d4d146103335780632f2ff15d1461034f578063313ce5671461036b57610232565b806301ffc9a71461023757806306fdde0314610267578063095ea7b31461028557806318160ddd146102b5575b600080fd5b610251600480360381019061024c9190613670565b6107a3565b60405161025e9190613c75565b60405180910390f35b61026f61081d565b60405161027c9190613de9565b60405180910390f35b61029f600480360381019061029a91906134f6565b6108af565b6040516102ac9190613c75565b60405180910390f35b6102bd6108cd565b6040516102ca9190614166565b60405180910390f35b6102ed60048036038101906102e89190613401565b6108d7565b6040516102fa9190613c75565b60405180910390f35b61031d60048036038101906103189190613603565b6109cf565b60405161032a9190613c90565b60405180910390f35b61034d6004803603810190610348919061369d565b6109ef565b005b61036960048036038101906103649190613630565b610a79565b005b610373610aa2565b60405161038091906141c5565b60405180910390f35b610391610aab565b60405161039e9190613c90565b60405180910390f35b6103c160048036038101906103bc9190613630565b610aba565b005b6103dd60048036038101906103d891906134f6565b610b3d565b6040516103ea9190613c75565b60405180910390f35b61040d600480360381019061040891906134f6565b610be9565b60405161041a9190614166565b60405180910390f35b61042b610c7d565b005b6104476004803603810190610442919061369d565b610cba565b005b610463600480360381019061045e9190613394565b610cdd565b6040516104709190613c5a565b60405180910390f35b610493600480360381019061048e9190613394565b610d46565b005b61049d610d5a565b6040516104aa9190613c75565b60405180910390f35b6104cd60048036038101906104c89190613394565b610d71565b6040516104da91906141aa565b60405180910390f35b6104fd60048036038101906104f89190613394565b610dc5565b60405161050a9190614166565b60405180910390f35b61052d60048036038101906105289190613394565b610e0d565b60405161053a9190614166565b60405180910390f35b61054b610e5d565b005b6105676004803603810190610562919061369d565b610e9a565b6040516105749190614166565b60405180910390f35b61059760048036038101906105929190613630565b610ef0565b6040516105a49190613c75565b60405180910390f35b6105b5610f5b565b6040516105c29190613de9565b60405180910390f35b6105e560048036038101906105e09190613394565b610fed565b6040516105f29190614166565b60405180910390f35b6106156004803603810190610610919061369d565b6110fe565b005b61061f611121565b60405161062c9190613c90565b60405180910390f35b61064f600480360381019061064a91906134f6565b611128565b60405161065c9190613c75565b60405180910390f35b61067f600480360381019061067a91906134f6565b611213565b60405161068c9190613c75565b60405180910390f35b6106af60048036038101906106aa9190613536565b611231565b005b6106cb60048036038101906106c69190613454565b611335565b005b6106d5611477565b6040516106e29190613c90565b60405180910390f35b61070560048036038101906107009190613630565b61149b565b005b610721600480360381019061071c91906133c1565b6114c4565b60405161072e9190614166565b60405180910390f35b61073f61154b565b60405161074c9190613c90565b60405180910390f35b61075d61156f565b60405161076a9190613c90565b60405180910390f35b61078d600480360381019061078891906135c3565b611593565b60405161079a919061414b565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108165750610815826119af565b5b9050919050565b60606003805461082c9061443c565b80601f01602080910402602001604051908101604052809291908181526020018280546108589061443c565b80156108a55780601f1061087a576101008083540402835291602001916108a5565b820191906000526020600020905b81548152906001019060200180831161088857829003601f168201915b5050505050905090565b60006108c36108bc611a19565b8484611a21565b6001905092915050565b6000600254905090565b60006108e4848484611bec565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061092f611a19565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a69061400b565b60405180910390fd5b6109c3856109bb611a19565b858403611a21565b60019150509392505050565b600060066000838152602001908152602001600020600101549050919050565b7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec610a2181610a1c611a19565b611e6d565b47821115610a2e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015610a74573d6000803e3d6000fd5b505050565b610a82826109cf565b610a9381610a8e611a19565b611e6d565b610a9d8383611f0a565b505050565b60006012905090565b6000610ab5611feb565b905090565b610ac2611a19565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b269061410b565b60405180910390fd5b610b398282612105565b5050565b6000610bdf610b4a611a19565b848460016000610b58611a19565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bda9190614207565b611a21565b6001905092915050565b6000438210610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490613e6b565b60405180910390fd5b610c75600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020836121e7565b905092915050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610caf81610caa611a19565b611e6d565b610cb76122f3565b50565b6000801b610ccf81610cca611a19565b611e6d565b610cd93383612395565b5050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610d57610d51611a19565b826123a3565b50565b6000600560009054906101000a900460ff16905090565b6000610dbe600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611911565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610e56600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206124bd565b9050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e8f81610e8a611a19565b611e6d565b610e976124cb565b50565b6000438210610ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed590613e6b565b60405180910390fd5b610ee9600a836121e7565b9050919050565b60006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060048054610f6a9061443c565b80601f0160208091040260200160405190810160405280929190818152602001828054610f969061443c565b8015610fe35780601f10610fb857610100808354040283529160200191610fe3565b820191906000526020600020905b815481529060010190602001808311610fc657829003601f168201915b5050505050905090565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050600081146110d557600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060018261108991906142e8565b8154811061109a57611099614534565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166110d8565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b6000801b6111138161110e611a19565b611e6d565b61111d338361256e565b5050565b6000801b81565b60008060016000611137611a19565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb906140eb565b60405180910390fd5b6112086111ff611a19565b85858403611a21565b600191505092915050565b6000611227611220611a19565b8484611bec565b6001905092915050565b83421115611274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126b90613eab565b60405180910390fd5b60006112d66112ce7fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf8989896040516020016112b39493929190613d0c565b6040516020818303038152906040528051906020012061257c565b858585612596565b90506112e1816125c1565b8614611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990613f0b565b60405180910390fd5b61132c81886123a3565b50505050505050565b83421115611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f90613f4b565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886113a78c6125c1565b896040516020016113bd96959493929190613cab565b60405160208183030381529060405280519060200120905060006113e08261257c565b905060006113f082878787612596565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790613feb565b60405180910390fd5b61146b8a8a8a611a21565b50505050505050505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6114a4826109cf565b6114b5816114b0611a19565b611e6d565b6114bf8383612105565b505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b7f5d8e12c39142ff96d79d04d15d1ba1269e4fe57bb9d26f43523628b34ba108ec81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b61159b6132d8565b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff16815481106115f2576115f1614534565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b6116ad8282611730565b6116b561261f565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166116db6108cd565b111561171c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117139061402b565b60405180910390fd5b61172a600a61189083612643565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117979061412b565b60405180910390fd5b6117ac600083836128bb565b80600260008282546117be9190614207565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118139190614207565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516118789190614166565b60405180910390a361188c60008383612913565b5050565b6000818361189e9190614207565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611909576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119009061404b565b60405180910390fd5b819050919050565b600063ffffffff801682111561195c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611953906140ab565b60405180910390fd5b819050919050565b505050565b611974838383611994565b61198f61198084610cdd565b61198984610cdd565b83612923565b505050565b505050565b600081836119a791906142e8565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a88906140cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af890613f2b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611bdf9190614166565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c539061408b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc390613e4b565b60405180910390fd5b611cd78383836128bb565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5490613f6b565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611df09190614207565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611e549190614166565b60405180910390a3611e67848484612913565b50505050565b611e778282610ef0565b611f0657611e9c8173ffffffffffffffffffffffffffffffffffffffff166014612b1c565b611eaa8360001c6020612b1c565b604051602001611ebb929190613c20565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd9190613de9565b60405180910390fd5b5050565b611f148282610ef0565b611fe75760016006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f8c611a19565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60007f0000000000000000000000009edcb9f72fa1ec6fb444314d573a45b56987c5df73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561206757507f000000000000000000000000000000000000000000000000000000000000000146145b15612094577f1cb5e49a1062b729172e62f334f668e422aef094d89d510544a642bb27b605de9050612102565b6120ff7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fefd5679d25994c0cb58a9223d6df8d8cb4307359b629e10d79eef37c6e36cf577fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6612d58565b90505b90565b61210f8282610ef0565b156121e35760006006600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612188611a19565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808380549050905060005b818110156122665760006122088284612d92565b90508486828154811061221e5761221d614534565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561225057809250612260565b60018161225d9190614207565b91505b506121f4565b600082146122c8578460018361227c91906142e8565b8154811061228d5761228c614534565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166122cb565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b6122fb610d5a565b61233a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233190613e8b565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61237e611a19565b60405161238b9190613c5a565b60405180910390a1565b61239f8282612db8565b5050565b60006123ae83610cdd565b905060006123bb84610dc5565b905082600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a46124b7828483612923565b50505050565b600081600001549050919050565b6124d3610d5a565b15612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a90613fab565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612557611a19565b6040516125649190613c5a565b60405180910390a1565b61257882826116a3565b5050565b600061258f612589611feb565b83612dd6565b9050919050565b60008060006125a787878787612e09565b915091506125b481612f16565b8192505050949350505050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061260e816124bd565b9150612619816130eb565b50919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b600080600085805490509050600081146126b1578560018261266591906142e8565b8154811061267657612675614534565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166126b4565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1692506126e283858763ffffffff16565b9150600081118015612735575043866001836126fe91906142e8565b8154811061270f5761270e614534565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b156127c257612743826118a6565b8660018361275191906142e8565b8154811061276257612761614534565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1602179055506128b2565b8560405180604001604052806127d743611911565b63ffffffff1681526020016127eb856118a6565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b6128c3610d5a565b15612903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128fa90613fab565b60405180910390fd5b61290e838383611964565b505050565b61291e838383611969565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561295f5750600081115b15612b1757600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a3d576000806129e6600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061199985612643565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612a32929190614181565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b1657600080612abf600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061189085612643565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612b0b929190614181565b60405180910390a250505b5b505050565b606060006002836002612b2f919061428e565b612b399190614207565b67ffffffffffffffff811115612b5257612b51614563565b5b6040519080825280601f01601f191660200182016040528015612b845781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612bbc57612bbb614534565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612c2057612c1f614534565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612c60919061428e565b612c6a9190614207565b90505b6001811115612d0a577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612cac57612cab614534565b5b1a60f81b828281518110612cc357612cc2614534565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612d0390614412565b9050612c6d565b5060008414612d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4590613e2b565b60405180910390fd5b8091505092915050565b60008383834630604051602001612d73959493929190613d51565b6040516020818303038152906040528051906020012090509392505050565b60006002828418612da3919061425d565b828416612db09190614207565b905092915050565b612dc28282613101565b612dd0600a61199983612643565b50505050565b60008282604051602001612deb929190613be9565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612e44576000600391509150612f0d565b601b8560ff1614158015612e5c5750601c8560ff1614155b15612e6e576000600491509150612f0d565b600060018787878760405160008152602001604052604051612e939493929190613da4565b6020604051602081039080840390855afa158015612eb5573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612f0457600060019250925050612f0d565b80600092509250505b94509492505050565b60006004811115612f2a57612f296144d6565b5b816004811115612f3d57612f3c6144d6565b5b1415612f48576130e8565b60016004811115612f5c57612f5b6144d6565b5b816004811115612f6f57612f6e6144d6565b5b1415612fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa790613e0b565b60405180910390fd5b60026004811115612fc457612fc36144d6565b5b816004811115612fd757612fd66144d6565b5b1415613018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300f90613eeb565b60405180910390fd5b6003600481111561302c5761302b6144d6565b5b81600481111561303f5761303e6144d6565b5b1415613080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307790613f8b565b60405180910390fd5b600480811115613093576130926144d6565b5b8160048111156130a6576130a56144d6565b5b14156130e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130de90613fcb565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613171576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131689061406b565b60405180910390fd5b61317d826000836128bb565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131fa90613ecb565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461325a91906142e8565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516132bf9190614166565b60405180910390a36132d383600084612913565b505050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b60008135905061332581614c87565b92915050565b60008135905061333a81614c9e565b92915050565b60008135905061334f81614cb5565b92915050565b60008135905061336481614ccc565b92915050565b60008135905061337981614ce3565b92915050565b60008135905061338e81614cfa565b92915050565b6000602082840312156133aa576133a9614592565b5b60006133b884828501613316565b91505092915050565b600080604083850312156133d8576133d7614592565b5b60006133e685828601613316565b92505060206133f785828601613316565b9150509250929050565b60008060006060848603121561341a57613419614592565b5b600061342886828701613316565b935050602061343986828701613316565b925050604061344a86828701613355565b9150509250925092565b600080600080600080600060e0888a03121561347357613472614592565b5b60006134818a828b01613316565b97505060206134928a828b01613316565b96505060406134a38a828b01613355565b95505060606134b48a828b01613355565b94505060806134c58a828b0161337f565b93505060a06134d68a828b0161332b565b92505060c06134e78a828b0161332b565b91505092959891949750929550565b6000806040838503121561350d5761350c614592565b5b600061351b85828601613316565b925050602061352c85828601613355565b9150509250929050565b60008060008060008060c0878903121561355357613552614592565b5b600061356189828a01613316565b965050602061357289828a01613355565b955050604061358389828a01613355565b945050606061359489828a0161337f565b93505060806135a589828a0161332b565b92505060a06135b689828a0161332b565b9150509295509295509295565b600080604083850312156135da576135d9614592565b5b60006135e885828601613316565b92505060206135f98582860161336a565b9150509250929050565b60006020828403121561361957613618614592565b5b60006136278482850161332b565b91505092915050565b6000806040838503121561364757613646614592565b5b60006136558582860161332b565b925050602061366685828601613316565b9150509250929050565b60006020828403121561368657613685614592565b5b600061369484828501613340565b91505092915050565b6000602082840312156136b3576136b2614592565b5b60006136c184828501613355565b91505092915050565b6136d38161431c565b82525050565b6136e28161432e565b82525050565b6136f18161433a565b82525050565b6137086137038261433a565b61446e565b82525050565b6000613719826141e0565b61372381856141eb565b93506137338185602086016143df565b61373c81614597565b840191505092915050565b6000613752826141e0565b61375c81856141fc565b935061376c8185602086016143df565b80840191505092915050565b60006137856018836141eb565b9150613790826145a8565b602082019050919050565b60006137a86020836141eb565b91506137b3826145d1565b602082019050919050565b60006137cb6023836141eb565b91506137d6826145fa565b604082019050919050565b60006137ee601f836141eb565b91506137f982614649565b602082019050919050565b60006138116014836141eb565b915061381c82614672565b602082019050919050565b6000613834601d836141eb565b915061383f8261469b565b602082019050919050565b60006138576022836141eb565b9150613862826146c4565b604082019050919050565b600061387a601f836141eb565b915061388582614713565b602082019050919050565b600061389d6019836141eb565b91506138a88261473c565b602082019050919050565b60006138c06022836141eb565b91506138cb82614765565b604082019050919050565b60006138e36002836141fc565b91506138ee826147b4565b600282019050919050565b6000613906601d836141eb565b9150613911826147dd565b602082019050919050565b60006139296026836141eb565b915061393482614806565b604082019050919050565b600061394c6022836141eb565b915061395782614855565b604082019050919050565b600061396f6010836141eb565b915061397a826148a4565b602082019050919050565b60006139926022836141eb565b915061399d826148cd565b604082019050919050565b60006139b5601e836141eb565b91506139c08261491c565b602082019050919050565b60006139d86028836141eb565b91506139e382614945565b604082019050919050565b60006139fb6030836141eb565b9150613a0682614994565b604082019050919050565b6000613a1e6027836141eb565b9150613a29826149e3565b604082019050919050565b6000613a416021836141eb565b9150613a4c82614a32565b604082019050919050565b6000613a646025836141eb565b9150613a6f82614a81565b604082019050919050565b6000613a876026836141eb565b9150613a9282614ad0565b604082019050919050565b6000613aaa6024836141eb565b9150613ab582614b1f565b604082019050919050565b6000613acd6017836141fc565b9150613ad882614b6e565b601782019050919050565b6000613af06025836141eb565b9150613afb82614b97565b604082019050919050565b6000613b136011836141fc565b9150613b1e82614be6565b601182019050919050565b6000613b36602f836141eb565b9150613b4182614c0f565b604082019050919050565b6000613b59601f836141eb565b9150613b6482614c5e565b602082019050919050565b604082016000820151613b856000850182613bbc565b506020820151613b986020850182613b9e565b50505050565b613ba781614390565b82525050565b613bb6816143b8565b82525050565b613bc5816143c2565b82525050565b613bd4816143c2565b82525050565b613be3816143d2565b82525050565b6000613bf4826138d6565b9150613c0082856136f7565b602082019150613c1082846136f7565b6020820191508190509392505050565b6000613c2b82613ac0565b9150613c378285613747565b9150613c4282613b06565b9150613c4e8284613747565b91508190509392505050565b6000602082019050613c6f60008301846136ca565b92915050565b6000602082019050613c8a60008301846136d9565b92915050565b6000602082019050613ca560008301846136e8565b92915050565b600060c082019050613cc060008301896136e8565b613ccd60208301886136ca565b613cda60408301876136ca565b613ce76060830186613bad565b613cf46080830185613bad565b613d0160a0830184613bad565b979650505050505050565b6000608082019050613d2160008301876136e8565b613d2e60208301866136ca565b613d3b6040830185613bad565b613d486060830184613bad565b95945050505050565b600060a082019050613d6660008301886136e8565b613d7360208301876136e8565b613d8060408301866136e8565b613d8d6060830185613bad565b613d9a60808301846136ca565b9695505050505050565b6000608082019050613db960008301876136e8565b613dc66020830186613bda565b613dd360408301856136e8565b613de060608301846136e8565b95945050505050565b60006020820190508181036000830152613e03818461370e565b905092915050565b60006020820190508181036000830152613e2481613778565b9050919050565b60006020820190508181036000830152613e448161379b565b9050919050565b60006020820190508181036000830152613e64816137be565b9050919050565b60006020820190508181036000830152613e84816137e1565b9050919050565b60006020820190508181036000830152613ea481613804565b9050919050565b60006020820190508181036000830152613ec481613827565b9050919050565b60006020820190508181036000830152613ee48161384a565b9050919050565b60006020820190508181036000830152613f048161386d565b9050919050565b60006020820190508181036000830152613f2481613890565b9050919050565b60006020820190508181036000830152613f44816138b3565b9050919050565b60006020820190508181036000830152613f64816138f9565b9050919050565b60006020820190508181036000830152613f848161391c565b9050919050565b60006020820190508181036000830152613fa48161393f565b9050919050565b60006020820190508181036000830152613fc481613962565b9050919050565b60006020820190508181036000830152613fe481613985565b9050919050565b60006020820190508181036000830152614004816139a8565b9050919050565b60006020820190508181036000830152614024816139cb565b9050919050565b60006020820190508181036000830152614044816139ee565b9050919050565b6000602082019050818103600083015261406481613a11565b9050919050565b6000602082019050818103600083015261408481613a34565b9050919050565b600060208201905081810360008301526140a481613a57565b9050919050565b600060208201905081810360008301526140c481613a7a565b9050919050565b600060208201905081810360008301526140e481613a9d565b9050919050565b6000602082019050818103600083015261410481613ae3565b9050919050565b6000602082019050818103600083015261412481613b29565b9050919050565b6000602082019050818103600083015261414481613b4c565b9050919050565b60006040820190506141606000830184613b6f565b92915050565b600060208201905061417b6000830184613bad565b92915050565b60006040820190506141966000830185613bad565b6141a36020830184613bad565b9392505050565b60006020820190506141bf6000830184613bcb565b92915050565b60006020820190506141da6000830184613bda565b92915050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b6000614212826143b8565b915061421d836143b8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561425257614251614478565b5b828201905092915050565b6000614268826143b8565b9150614273836143b8565b925082614283576142826144a7565b5b828204905092915050565b6000614299826143b8565b91506142a4836143b8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142dd576142dc614478565b5b828202905092915050565b60006142f3826143b8565b91506142fe836143b8565b92508282101561431157614310614478565b5b828203905092915050565b600061432782614370565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b60005b838110156143fd5780820151818401526020810190506143e2565b8381111561440c576000848401525b50505050565b600061441d826143b8565b9150600082141561443157614430614478565b5b600182039050919050565b6000600282049050600182168061445457607f821691505b6020821081141561446857614467614505565b5b50919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b614c908161431c565b8114614c9b57600080fd5b50565b614ca78161433a565b8114614cb257600080fd5b50565b614cbe81614344565b8114614cc957600080fd5b50565b614cd5816143b8565b8114614ce057600080fd5b50565b614cec816143c2565b8114614cf757600080fd5b50565b614d03816143d2565b8114614d0e57600080fd5b5056fea2646970667358221220265a3e0aa075f707e47061addbb5159a5462e9ce0ca6c86ea59118aca611683864736f6c63430008070033

Deployed Bytecode Sourcemap

73970:1989:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38097:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51162:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53329:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52282:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53980:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39508:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74751:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39893:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52124:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63561:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40941:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54881:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67330:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74666:77;;;:::i;:::-;;75050:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66730:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69769:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44196:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66486:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52453:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63303:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74585:73;;;:::i;:::-;;67870:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38393:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51381:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66933:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74930:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37484:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55599:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52793:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69956:582;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62592:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74120:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40285:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53031:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74189:66;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74051:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66256:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38097:204;38182:4;38221:32;38206:47;;;:11;:47;;;;:87;;;;38257:36;38281:11;38257:23;:36::i;:::-;38206:87;38199:94;;38097:204;;;:::o;51162:100::-;51216:13;51249:5;51242:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51162:100;:::o;53329:169::-;53412:4;53429:39;53438:12;:10;:12::i;:::-;53452:7;53461:6;53429:8;:39::i;:::-;53486:4;53479:11;;53329:169;;;;:::o;52282:108::-;52343:7;52370:12;;52363:19;;52282:108;:::o;53980:492::-;54120:4;54137:36;54147:6;54155:9;54166:6;54137:9;:36::i;:::-;54186:24;54213:11;:19;54225:6;54213:19;;;;;;;;;;;;;;;:33;54233:12;:10;:12::i;:::-;54213:33;;;;;;;;;;;;;;;;54186:60;;54285:6;54265:16;:26;;54257:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;54372:57;54381:6;54389:12;:10;:12::i;:::-;54422:6;54403:16;:25;54372:8;:57::i;:::-;54460:4;54453:11;;;53980:492;;;;;:::o;39508:123::-;39574:7;39601:6;:12;39608:4;39601:12;;;;;;;;;;;:22;;;39594:29;;39508:123;;;:::o;74751:171::-;74229:26;37975:30;37986:4;37992:12;:10;:12::i;:::-;37975:10;:30::i;:::-;74845:21:::1;74835:6;:31;;74827:40;;;::::0;::::1;;74886:10;74878:28;;:36;74907:6;74878:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;74751:171:::0;;:::o;39893:147::-;39976:18;39989:4;39976:12;:18::i;:::-;37975:30;37986:4;37992:12;:10;:12::i;:::-;37975:10;:30::i;:::-;40007:25:::1;40018:4;40024:7;40007:10;:25::i;:::-;39893:147:::0;;;:::o;52124:93::-;52182:5;52207:2;52200:9;;52124:93;:::o;63561:115::-;63621:7;63648:20;:18;:20::i;:::-;63641:27;;63561:115;:::o;40941:218::-;41048:12;:10;:12::i;:::-;41037:23;;:7;:23;;;41029:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;41125:26;41137:4;41143:7;41125:11;:26::i;:::-;40941:218;;:::o;54881:215::-;54969:4;54986:80;54995:12;:10;:12::i;:::-;55009:7;55055:10;55018:11;:25;55030:12;:10;:12::i;:::-;55018:25;;;;;;;;;;;;;;;:34;55044:7;55018:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;54986:8;:80::i;:::-;55084:4;55077:11;;54881:215;;;;:::o;67330:251::-;67411:7;67453:12;67439:11;:26;67431:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;67519:54;67538:12;:21;67551:7;67538:21;;;;;;;;;;;;;;;67561:11;67519:18;:54::i;:::-;67512:61;;67330:251;;;;:::o;74666:77::-;74089:24;37975:30;37986:4;37992:12;:10;:12::i;:::-;37975:10;:30::i;:::-;74725:10:::1;:8;:10::i;:::-;74666:77:::0;:::o;75050:112::-;37529:4;75096:18;;37975:30;37986:4;37992:12;:10;:12::i;:::-;37975:10;:30::i;:::-;75129:25:::1;75135:10;75147:6;75129:5;:25::i;:::-;75050:112:::0;;:::o;66730:119::-;66795:7;66822:10;:19;66833:7;66822:19;;;;;;;;;;;;;;;;;;;;;;;;;66815:26;;66730:119;;;:::o;69769:105::-;69832:34;69842:12;:10;:12::i;:::-;69856:9;69832;:34::i;:::-;69769:105;:::o;44196:86::-;44243:4;44267:7;;;;;;;;;;;44260:14;;44196:86;:::o;66486:151::-;66556:6;66582:47;66600:12;:21;66613:7;66600:21;;;;;;;;;;;;;;;:28;;;;66582:17;:47::i;:::-;66575:54;;66486:151;;;:::o;52453:127::-;52527:7;52554:9;:18;52564:7;52554:18;;;;;;;;;;;;;;;;52547:25;;52453:127;;;:::o;63303:128::-;63372:7;63399:24;:7;:14;63407:5;63399:14;;;;;;;;;;;;;;;:22;:24::i;:::-;63392:31;;63303:128;;;:::o;74585:73::-;74089:24;37975:30;37986:4;37992:12;:10;:12::i;:::-;37975:10;:30::i;:::-;74642:8:::1;:6;:8::i;:::-;74585:73:::0;:::o;67870:242::-;67940:7;67982:12;67968:11;:26;67960:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;68048:56;68067:23;68092:11;68048:18;:56::i;:::-;68041:63;;67870:242;;;:::o;38393:139::-;38471:4;38495:6;:12;38502:4;38495:12;;;;;;;;;;;:20;;:29;38516:7;38495:29;;;;;;;;;;;;;;;;;;;;;;;;;38488:36;;38393:139;;;;:::o;51381:104::-;51437:13;51470:7;51463:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51381:104;:::o;66933:195::-;66989:7;67009:11;67023:12;:21;67036:7;67023:21;;;;;;;;;;;;;;;:28;;;;67009:42;;67076:1;67069:3;:8;:51;;67084:12;:21;67097:7;67084:21;;;;;;;;;;;;;;;67112:1;67106:3;:7;;;;:::i;:::-;67084:30;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;;;;;;;;;67069:51;;;67080:1;67069:51;67062:58;;;;;66933:195;;;:::o;74930:112::-;37529:4;74976:18;;37975:30;37986:4;37992:12;:10;:12::i;:::-;37975:10;:30::i;:::-;75009:25:::1;75015:10;75027:6;75009:5;:25::i;:::-;74930:112:::0;;:::o;37484:49::-;37529:4;37484:49;;;:::o;55599:413::-;55692:4;55709:24;55736:11;:25;55748:12;:10;:12::i;:::-;55736:25;;;;;;;;;;;;;;;:34;55762:7;55736:34;;;;;;;;;;;;;;;;55709:61;;55809:15;55789:16;:35;;55781:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;55902:67;55911:12;:10;:12::i;:::-;55925:7;55953:15;55934:16;:34;55902:8;:67::i;:::-;56000:4;55993:11;;;55599:413;;;;:::o;52793:175::-;52879:4;52896:42;52906:12;:10;:12::i;:::-;52920:9;52931:6;52896:9;:42::i;:::-;52956:4;52949:11;;52793:175;;;;:::o;69956:582::-;70174:6;70155:15;:25;;70147:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;70225:14;70242:174;70270:87;65507:71;70330:9;70341:5;70348:6;70297:58;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70287:69;;;;;;70270:16;:87::i;:::-;70372:1;70388;70404;70242:13;:174::i;:::-;70225:191;;70444:17;70454:6;70444:9;:17::i;:::-;70435:5;:26;70427:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;70502:28;70512:6;70520:9;70502;:28::i;:::-;70136:402;69956:582;;;;;;:::o;62592:645::-;62836:8;62817:15;:27;;62809:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;62891:18;62933:16;62951:5;62958:7;62967:5;62974:16;62984:5;62974:9;:16::i;:::-;62992:8;62922:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62912:90;;;;;;62891:111;;63015:12;63030:28;63047:10;63030:16;:28::i;:::-;63015:43;;63071:14;63088:28;63102:4;63108:1;63111;63114;63088:13;:28::i;:::-;63071:45;;63145:5;63135:15;;:6;:15;;;63127:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63198:31;63207:5;63214:7;63223:5;63198:8;:31::i;:::-;62798:439;;;62592:645;;;;;;;:::o;74120:62::-;74158:24;74120:62;:::o;40285:149::-;40369:18;40382:4;40369:12;:18::i;:::-;37975:30;37986:4;37992:12;:10;:12::i;:::-;37975:10;:30::i;:::-;40400:26:::1;40412:4;40418:7;40400:11;:26::i;:::-;40285:149:::0;;;:::o;53031:151::-;53120:7;53147:11;:18;53159:5;53147:18;;;;;;;;;;;;;;;:27;53166:7;53147:27;;;;;;;;;;;;;;;;53140:34;;53031:151;;;;:::o;74189:66::-;74229:26;74189:66;:::o;74051:62::-;74089:24;74051:62;:::o;66256:150::-;66335:17;;:::i;:::-;66372:12;:21;66385:7;66372:21;;;;;;;;;;;;;;;66394:3;66372:26;;;;;;;;;;:::i;:::-;;;;;;;;;66365:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66256:150;;;;:::o;70844:290::-;70929:28;70941:7;70950:6;70929:11;:28::i;:::-;70993:12;:10;:12::i;:::-;70976:29;;:13;:11;:13::i;:::-;:29;;70968:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;71071:55;71088:23;71113:4;71119:6;71071:16;:55::i;:::-;;;70844:290;;:::o;57522:399::-;57625:1;57606:21;;:7;:21;;;;57598:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57676:49;57705:1;57709:7;57718:6;57676:20;:49::i;:::-;57754:6;57738:12;;:22;;;;;;;:::i;:::-;;;;;;;;57793:6;57771:9;:18;57781:7;57771:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;57836:7;57815:37;;57832:1;57815:37;;;57845:6;57815:37;;;;;;:::i;:::-;;;;;;;;57865:48;57893:1;57897:7;57906:6;57865:19;:48::i;:::-;57522:399;;:::o;73688:98::-;73746:7;73777:1;73773;:5;;;;:::i;:::-;73766:12;;73688:98;;;;:::o;1247:195::-;1304:7;1341:17;1332:26;;:5;:26;;1324:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1428:5;1413:21;;1247:195;;;:::o;3217:190::-;3273:6;3309:16;3300:25;;:5;:25;;3292:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3393:5;3379:20;;3217:190;;;:::o;60263:125::-;;;;:::o;71562:262::-;71704:43;71730:4;71736:2;71740:6;71704:25;:43::i;:::-;71760:56;71777:15;71787:4;71777:9;:15::i;:::-;71794:13;71804:2;71794:9;:13::i;:::-;71809:6;71760:16;:56::i;:::-;71562:262;;;:::o;60992:124::-;;;;:::o;73794:103::-;73857:7;73888:1;73884;:5;;;;:::i;:::-;73877:12;;73794:103;;;;:::o;15066:157::-;15151:4;15190:25;15175:40;;;:11;:40;;;;15168:47;;15066:157;;;:::o;35301:98::-;35354:7;35381:10;35374:17;;35301:98;:::o;59283:380::-;59436:1;59419:19;;:5;:19;;;;59411:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59517:1;59498:21;;:7;:21;;;;59490:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59601:6;59571:11;:18;59583:5;59571:18;;;;;;;;;;;;;;;:27;59590:7;59571:27;;;;;;;;;;;;;;;:36;;;;59639:7;59623:32;;59632:5;59623:32;;;59648:6;59623:32;;;;;;:::i;:::-;;;;;;;;59283:380;;;:::o;56502:733::-;56660:1;56642:20;;:6;:20;;;;56634:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;56744:1;56723:23;;:9;:23;;;;56715:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56799:47;56820:6;56828:9;56839:6;56799:20;:47::i;:::-;56859:21;56883:9;:17;56893:6;56883:17;;;;;;;;;;;;;;;;56859:41;;56936:6;56919:13;:23;;56911:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;57057:6;57041:13;:22;57021:9;:17;57031:6;57021:17;;;;;;;;;;;;;;;:42;;;;57109:6;57085:9;:20;57095:9;57085:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;57150:9;57133:35;;57142:6;57133:35;;;57161:6;57133:35;;;;;;:::i;:::-;;;;;;;;57181:46;57201:6;57209:9;57220:6;57181:19;:46::i;:::-;56623:612;56502:733;;;:::o;38822:497::-;38903:22;38911:4;38917:7;38903;:22::i;:::-;38898:414;;39091:41;39119:7;39091:41;;39129:2;39091:19;:41::i;:::-;39205:38;39233:4;39225:13;;39240:2;39205:19;:38::i;:::-;38996:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38942:358;;;;;;;;;;;:::i;:::-;;;;;;;;38898:414;38822:497;;:::o;42442:238::-;42526:22;42534:4;42540:7;42526;:22::i;:::-;42521:152;;42597:4;42565:6;:12;42572:4;42565:12;;;;;;;;;;;:20;;:29;42586:7;42565:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;42648:12;:10;:12::i;:::-;42621:40;;42639:7;42621:40;;42633:4;42621:40;;;;;;;;;;42521:152;42442:238;;:::o;30168:314::-;30221:7;30262:12;30245:29;;30253:4;30245:29;;;:66;;;;;30295:16;30278:13;:33;30245:66;30241:234;;;30335:24;30328:31;;;;30241:234;30399:64;30421:10;30433:12;30447:15;30399:21;:64::i;:::-;30392:71;;30168:314;;:::o;42812:239::-;42896:22;42904:4;42910:7;42896;:22::i;:::-;42892:152;;;42967:5;42935:6;:12;42942:4;42935:12;;;;;;;;;;;:20;;:29;42956:7;42935:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43019:12;:10;:12::i;:::-;42992:40;;43010:7;42992:40;;43004:4;42992:40;;;;;;;;;;42892:152;42812:239;;:::o;68201:1482::-;68300:7;69319:12;69334:5;:12;;;;69319:27;;69357:11;69383:236;69396:4;69390:3;:10;69383:236;;;69417:11;69431:23;69444:3;69449:4;69431:12;:23::i;:::-;69417:37;;69496:11;69473:5;69479:3;69473:10;;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;;;;;;;;:34;;;69469:139;;;69535:3;69528:10;;69469:139;;;69591:1;69585:3;:7;;;;:::i;:::-;69579:13;;69469:139;69402:217;69383:236;;;69646:1;69638:4;:9;:37;;69654:5;69667:1;69660:4;:8;;;;:::i;:::-;69654:15;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;;;;;;;;69638:37;;;69650:1;69638:37;69631:44;;;;;;68201:1482;;;;:::o;45255:120::-;44799:8;:6;:8::i;:::-;44791:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;45324:5:::1;45314:7;;:15;;;;;;;;;;;;;;;;;;45345:22;45354:12;:10;:12::i;:::-;45345:22;;;;;;:::i;:::-;;;;;;;;45255:120::o:0;75801:155::-;75920:28;75932:7;75941:6;75920:11;:28::i;:::-;75801:155;;:::o;71988:388::-;72073:23;72099:20;72109:9;72099;:20::i;:::-;72073:46;;72130:24;72157:20;72167:9;72157;:20::i;:::-;72130:47;;72212:9;72188:10;:21;72199:9;72188:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;72283:9;72239:54;;72266:15;72239:54;;72255:9;72239:54;;;;;;;;;;;;72306:62;72323:15;72340:9;72351:16;72306;:62::i;:::-;72062:314;;71988:388;;:::o;10308:114::-;10373:7;10400;:14;;;10393:21;;10308:114;;;:::o;44996:118::-;44522:8;:6;:8::i;:::-;44521:9;44513:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;45066:4:::1;45056:7;;:14;;;;;;;;;;;;;;;;;;45086:20;45093:12;:10;:12::i;:::-;45086:20;;;;;;:::i;:::-;;;;;;;;44996:118::o:0;75648:145::-;75762:23;75774:2;75778:6;75762:11;:23::i;:::-;75648:145;;:::o;31395:167::-;31472:7;31499:55;31521:20;:18;:20::i;:::-;31543:10;31499:21;:55::i;:::-;31492:62;;31395:167;;;:::o;25038:279::-;25166:7;25187:17;25206:18;25228:25;25239:4;25245:1;25248;25251;25228:10;:25::i;:::-;25186:67;;;;25264:18;25276:5;25264:11;:18::i;:::-;25300:9;25293:16;;;;25038:279;;;;;;:::o;63814:207::-;63874:15;63902:30;63935:7;:14;63943:5;63935:14;;;;;;;;;;;;;;;63902:47;;63970:15;:5;:13;:15::i;:::-;63960:25;;63996:17;:5;:15;:17::i;:::-;63891:130;63814:207;;;:::o;70645:105::-;70698:7;70725:17;70718:24;;70645:105;:::o;73035:645::-;73209:17;73228;73258:11;73272:5;:12;;;;73258:26;;73314:1;73307:3;:8;:35;;73322:5;73334:1;73328:3;:7;;;;:::i;:::-;73322:14;;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;;;;;;;;73307:35;;;73318:1;73307:35;73295:47;;;;73365:20;73368:9;73379:5;73365:2;:20;;:::i;:::-;73353:32;;73408:1;73402:3;:7;:51;;;;;73441:12;73413:5;73425:1;73419:3;:7;;;;:::i;:::-;73413:14;;;;;;;;:::i;:::-;;;;;;;;;:24;;;;;;;;;;;;:40;;;73402:51;73398:275;;;73493:29;73512:9;73493:18;:29::i;:::-;73470:5;73482:1;73476:3;:7;;;;:::i;:::-;73470:14;;;;;;;;:::i;:::-;;;;;;;;;:20;;;:52;;;;;;;;;;;;;;;;;;73398:275;;;73555:5;73566:94;;;;;;;;73589:31;73607:12;73589:17;:31::i;:::-;73566:94;;;;;;73629:29;73648:9;73629:18;:29::i;:::-;73566:94;;;;;73555:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73398:275;73247:433;73035:645;;;;;;:::o;75170:199::-;44522:8;:6;:8::i;:::-;44521:9;44513:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;75317:44:::1;75344:4;75350:2;75354:6;75317:26;:44::i;:::-;75170:199:::0;;;:::o;75447:193::-;75589:43;75615:4;75621:2;75625:6;75589:25;:43::i;:::-;75447:193;;;:::o;72384:643::-;72516:3;72509:10;;:3;:10;;;;:24;;;;;72532:1;72523:6;:10;72509:24;72505:515;;;72569:1;72554:17;;:3;:17;;;72550:224;;72593:17;72612;72633:54;72650:12;:17;72663:3;72650:17;;;;;;;;;;;;;;;72669:9;72680:6;72633:16;:54::i;:::-;72592:95;;;;72732:3;72711:47;;;72737:9;72748;72711:47;;;;;;;:::i;:::-;;;;;;;;72573:201;;72550:224;72809:1;72794:17;;:3;:17;;;72790:219;;72833:17;72852;72873:49;72890:12;:17;72903:3;72890:17;;;;;;;;;;;;;;;72909:4;72915:6;72873:16;:49::i;:::-;72832:90;;;;72967:3;72946:47;;;72972:9;72983;72946:47;;;;;;;:::i;:::-;;;;;;;;72813:196;;72790:219;72505:515;72384:643;;;:::o;16902:451::-;16977:13;17003:19;17048:1;17039:6;17035:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17025:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17003:47;;17061:15;:6;17068:1;17061:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17087;:6;17094:1;17087:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;17118:9;17143:1;17134:6;17130:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17118:26;;17113:135;17150:1;17146;:5;17113:135;;;17185:12;17206:3;17198:5;:11;17185:25;;;;;;;:::i;:::-;;;;;17173:6;17180:1;17173:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;17235:1;17225:11;;;;;17153:3;;;;:::i;:::-;;;17113:135;;;;17275:1;17266:5;:10;17258:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17338:6;17324:21;;;16902:451;;;;:::o;30490:263::-;30634:7;30682:8;30692;30702:11;30715:13;30738:4;30671:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30661:84;;;;;;30654:91;;30490:263;;;;;:::o;8863:156::-;8925:7;9010:1;9005;9001;:5;9000:11;;;;:::i;:::-;8995:1;8991;:5;8990:21;;;;:::i;:::-;8983:28;;8863:156;;;;:::o;71228:194::-;71313:28;71325:7;71334:6;71313:11;:28::i;:::-;71354:60;71371:23;71396:9;71407:6;71354:16;:60::i;:::-;;;71228:194;;:::o;26729:196::-;26822:7;26888:15;26905:10;26859:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26849:68;;;;;;26842:75;;26729:196;;;;:::o;23267:1632::-;23398:7;23407:12;24332:66;24327:1;24319:10;;:79;24315:163;;;24431:1;24435:30;24415:51;;;;;;24315:163;24497:2;24492:1;:7;;;;:18;;;;;24508:2;24503:1;:7;;;;24492:18;24488:102;;;24543:1;24547:30;24527:51;;;;;;24488:102;24687:14;24704:24;24714:4;24720:1;24723;24726;24704:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24687:41;;24761:1;24743:20;;:6;:20;;;24739:103;;;24796:1;24800:29;24780:50;;;;;;;24739:103;24862:6;24870:20;24854:37;;;;;23267:1632;;;;;;;;:::o;17929:643::-;18007:20;17998:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;17994:571;;;18044:7;;17994:571;18105:29;18096:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;18092:473;;;18151:34;;;;;;;;;;:::i;:::-;;;;;;;;18092:473;18216:35;18207:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;18203:362;;;18268:41;;;;;;;;;;:::i;:::-;;;;;;;;18203:362;18340:30;18331:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;18327:238;;;18387:44;;;;;;;;;;:::i;:::-;;;;;;;;18327:238;18462:30;18453:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;18449:116;;;18509:44;;;;;;;;;;:::i;:::-;;;;;;;;18449:116;17929:643;;:::o;10430:127::-;10537:1;10519:7;:14;;;:19;;;;;;;;;;;10430:127;:::o;58254:591::-;58357:1;58338:21;;:7;:21;;;;58330:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;58410:49;58431:7;58448:1;58452:6;58410:20;:49::i;:::-;58472:22;58497:9;:18;58507:7;58497:18;;;;;;;;;;;;;;;;58472:43;;58552:6;58534:14;:24;;58526:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;58671:6;58654:14;:23;58633:9;:18;58643:7;58633:18;;;;;;;;;;;;;;;:44;;;;58715:6;58699:12;;:22;;;;;;;:::i;:::-;;;;;;;;58765:1;58739:37;;58748:7;58739:37;;;58769:6;58739:37;;;;;;:::i;:::-;;;;;;;;58789:48;58809:7;58826:1;58830:6;58789:19;:48::i;:::-;58319:526;58254:591;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;152:139;;;;:::o;297:137::-;342:5;380:6;367:20;358:29;;396:32;422:5;396:32;:::i;:::-;297:137;;;;:::o;440:139::-;486:5;524:6;511:20;502:29;;540:33;567:5;540:33;:::i;:::-;440:139;;;;:::o;585:137::-;630:5;668:6;655:20;646:29;;684:32;710:5;684:32;:::i;:::-;585:137;;;;:::o;728:135::-;772:5;810:6;797:20;788:29;;826:31;851:5;826:31;:::i;:::-;728:135;;;;:::o;869:329::-;928:6;977:2;965:9;956:7;952:23;948:32;945:119;;;983:79;;:::i;:::-;945:119;1103:1;1128:53;1173:7;1164:6;1153:9;1149:22;1128:53;:::i;:::-;1118:63;;1074:117;869:329;;;;:::o;1204:474::-;1272:6;1280;1329:2;1317:9;1308:7;1304:23;1300:32;1297:119;;;1335:79;;:::i;:::-;1297:119;1455:1;1480:53;1525:7;1516:6;1505:9;1501:22;1480:53;:::i;:::-;1470:63;;1426:117;1582:2;1608:53;1653:7;1644:6;1633:9;1629:22;1608:53;:::i;:::-;1598:63;;1553:118;1204:474;;;;;:::o;1684:619::-;1761:6;1769;1777;1826:2;1814:9;1805:7;1801:23;1797:32;1794:119;;;1832:79;;:::i;:::-;1794:119;1952:1;1977:53;2022:7;2013:6;2002:9;1998:22;1977:53;:::i;:::-;1967:63;;1923:117;2079:2;2105:53;2150:7;2141:6;2130:9;2126:22;2105:53;:::i;:::-;2095:63;;2050:118;2207:2;2233:53;2278:7;2269:6;2258:9;2254:22;2233:53;:::i;:::-;2223:63;;2178:118;1684:619;;;;;:::o;2309:1199::-;2420:6;2428;2436;2444;2452;2460;2468;2517:3;2505:9;2496:7;2492:23;2488:33;2485:120;;;2524:79;;:::i;:::-;2485:120;2644:1;2669:53;2714:7;2705:6;2694:9;2690:22;2669:53;:::i;:::-;2659:63;;2615:117;2771:2;2797:53;2842:7;2833:6;2822:9;2818:22;2797:53;:::i;:::-;2787:63;;2742:118;2899:2;2925:53;2970:7;2961:6;2950:9;2946:22;2925:53;:::i;:::-;2915:63;;2870:118;3027:2;3053:53;3098:7;3089:6;3078:9;3074:22;3053:53;:::i;:::-;3043:63;;2998:118;3155:3;3182:51;3225:7;3216:6;3205:9;3201:22;3182:51;:::i;:::-;3172:61;;3126:117;3282:3;3309:53;3354:7;3345:6;3334:9;3330:22;3309:53;:::i;:::-;3299:63;;3253:119;3411:3;3438:53;3483:7;3474:6;3463:9;3459:22;3438:53;:::i;:::-;3428:63;;3382:119;2309:1199;;;;;;;;;;:::o;3514:474::-;3582:6;3590;3639:2;3627:9;3618:7;3614:23;3610:32;3607:119;;;3645:79;;:::i;:::-;3607:119;3765:1;3790:53;3835:7;3826:6;3815:9;3811:22;3790:53;:::i;:::-;3780:63;;3736:117;3892:2;3918:53;3963:7;3954:6;3943:9;3939:22;3918:53;:::i;:::-;3908:63;;3863:118;3514:474;;;;;:::o;3994:1053::-;4096:6;4104;4112;4120;4128;4136;4185:3;4173:9;4164:7;4160:23;4156:33;4153:120;;;4192:79;;:::i;:::-;4153:120;4312:1;4337:53;4382:7;4373:6;4362:9;4358:22;4337:53;:::i;:::-;4327:63;;4283:117;4439:2;4465:53;4510:7;4501:6;4490:9;4486:22;4465:53;:::i;:::-;4455:63;;4410:118;4567:2;4593:53;4638:7;4629:6;4618:9;4614:22;4593:53;:::i;:::-;4583:63;;4538:118;4695:2;4721:51;4764:7;4755:6;4744:9;4740:22;4721:51;:::i;:::-;4711:61;;4666:116;4821:3;4848:53;4893:7;4884:6;4873:9;4869:22;4848:53;:::i;:::-;4838:63;;4792:119;4950:3;4977:53;5022:7;5013:6;5002:9;4998:22;4977:53;:::i;:::-;4967:63;;4921:119;3994:1053;;;;;;;;:::o;5053:472::-;5120:6;5128;5177:2;5165:9;5156:7;5152:23;5148:32;5145:119;;;5183:79;;:::i;:::-;5145:119;5303:1;5328:53;5373:7;5364:6;5353:9;5349:22;5328:53;:::i;:::-;5318:63;;5274:117;5430:2;5456:52;5500:7;5491:6;5480:9;5476:22;5456:52;:::i;:::-;5446:62;;5401:117;5053:472;;;;;:::o;5531:329::-;5590:6;5639:2;5627:9;5618:7;5614:23;5610:32;5607:119;;;5645:79;;:::i;:::-;5607:119;5765:1;5790:53;5835:7;5826:6;5815:9;5811:22;5790:53;:::i;:::-;5780:63;;5736:117;5531:329;;;;:::o;5866:474::-;5934:6;5942;5991:2;5979:9;5970:7;5966:23;5962:32;5959:119;;;5997:79;;:::i;:::-;5959:119;6117:1;6142:53;6187:7;6178:6;6167:9;6163:22;6142:53;:::i;:::-;6132:63;;6088:117;6244:2;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6215:118;5866:474;;;;;:::o;6346:327::-;6404:6;6453:2;6441:9;6432:7;6428:23;6424:32;6421:119;;;6459:79;;:::i;:::-;6421:119;6579:1;6604:52;6648:7;6639:6;6628:9;6624:22;6604:52;:::i;:::-;6594:62;;6550:116;6346:327;;;;:::o;6679:329::-;6738:6;6787:2;6775:9;6766:7;6762:23;6758:32;6755:119;;;6793:79;;:::i;:::-;6755:119;6913:1;6938:53;6983:7;6974:6;6963:9;6959:22;6938:53;:::i;:::-;6928:63;;6884:117;6679:329;;;;:::o;7014:118::-;7101:24;7119:5;7101:24;:::i;:::-;7096:3;7089:37;7014:118;;:::o;7138:109::-;7219:21;7234:5;7219:21;:::i;:::-;7214:3;7207:34;7138:109;;:::o;7253:118::-;7340:24;7358:5;7340:24;:::i;:::-;7335:3;7328:37;7253:118;;:::o;7377:157::-;7482:45;7502:24;7520:5;7502:24;:::i;:::-;7482:45;:::i;:::-;7477:3;7470:58;7377:157;;:::o;7540:364::-;7628:3;7656:39;7689:5;7656:39;:::i;:::-;7711:71;7775:6;7770:3;7711:71;:::i;:::-;7704:78;;7791:52;7836:6;7831:3;7824:4;7817:5;7813:16;7791:52;:::i;:::-;7868:29;7890:6;7868:29;:::i;:::-;7863:3;7859:39;7852:46;;7632:272;7540:364;;;;:::o;7910:377::-;8016:3;8044:39;8077:5;8044:39;:::i;:::-;8099:89;8181:6;8176:3;8099:89;:::i;:::-;8092:96;;8197:52;8242:6;8237:3;8230:4;8223:5;8219:16;8197:52;:::i;:::-;8274:6;8269:3;8265:16;8258:23;;8020:267;7910:377;;;;:::o;8293:366::-;8435:3;8456:67;8520:2;8515:3;8456:67;:::i;:::-;8449:74;;8532:93;8621:3;8532:93;:::i;:::-;8650:2;8645:3;8641:12;8634:19;;8293:366;;;:::o;8665:::-;8807:3;8828:67;8892:2;8887:3;8828:67;:::i;:::-;8821:74;;8904:93;8993:3;8904:93;:::i;:::-;9022:2;9017:3;9013:12;9006:19;;8665:366;;;:::o;9037:::-;9179:3;9200:67;9264:2;9259:3;9200:67;:::i;:::-;9193:74;;9276:93;9365:3;9276:93;:::i;:::-;9394:2;9389:3;9385:12;9378:19;;9037:366;;;:::o;9409:::-;9551:3;9572:67;9636:2;9631:3;9572:67;:::i;:::-;9565:74;;9648:93;9737:3;9648:93;:::i;:::-;9766:2;9761:3;9757:12;9750:19;;9409:366;;;:::o;9781:::-;9923:3;9944:67;10008:2;10003:3;9944:67;:::i;:::-;9937:74;;10020:93;10109:3;10020:93;:::i;:::-;10138:2;10133:3;10129:12;10122:19;;9781:366;;;:::o;10153:::-;10295:3;10316:67;10380:2;10375:3;10316:67;:::i;:::-;10309:74;;10392:93;10481:3;10392:93;:::i;:::-;10510:2;10505:3;10501:12;10494:19;;10153:366;;;:::o;10525:::-;10667:3;10688:67;10752:2;10747:3;10688:67;:::i;:::-;10681:74;;10764:93;10853:3;10764:93;:::i;:::-;10882:2;10877:3;10873:12;10866:19;;10525:366;;;:::o;10897:::-;11039:3;11060:67;11124:2;11119:3;11060:67;:::i;:::-;11053:74;;11136:93;11225:3;11136:93;:::i;:::-;11254:2;11249:3;11245:12;11238:19;;10897:366;;;:::o;11269:::-;11411:3;11432:67;11496:2;11491:3;11432:67;:::i;:::-;11425:74;;11508:93;11597:3;11508:93;:::i;:::-;11626:2;11621:3;11617:12;11610:19;;11269:366;;;:::o;11641:::-;11783:3;11804:67;11868:2;11863:3;11804:67;:::i;:::-;11797:74;;11880:93;11969:3;11880:93;:::i;:::-;11998:2;11993:3;11989:12;11982:19;;11641:366;;;:::o;12013:400::-;12173:3;12194:84;12276:1;12271:3;12194:84;:::i;:::-;12187:91;;12287:93;12376:3;12287:93;:::i;:::-;12405:1;12400:3;12396:11;12389:18;;12013:400;;;:::o;12419:366::-;12561:3;12582:67;12646:2;12641:3;12582:67;:::i;:::-;12575:74;;12658:93;12747:3;12658:93;:::i;:::-;12776:2;12771:3;12767:12;12760:19;;12419:366;;;:::o;12791:::-;12933:3;12954:67;13018:2;13013:3;12954:67;:::i;:::-;12947:74;;13030:93;13119:3;13030:93;:::i;:::-;13148:2;13143:3;13139:12;13132:19;;12791:366;;;:::o;13163:::-;13305:3;13326:67;13390:2;13385:3;13326:67;:::i;:::-;13319:74;;13402:93;13491:3;13402:93;:::i;:::-;13520:2;13515:3;13511:12;13504:19;;13163:366;;;:::o;13535:::-;13677:3;13698:67;13762:2;13757:3;13698:67;:::i;:::-;13691:74;;13774:93;13863:3;13774:93;:::i;:::-;13892:2;13887:3;13883:12;13876:19;;13535:366;;;:::o;13907:::-;14049:3;14070:67;14134:2;14129:3;14070:67;:::i;:::-;14063:74;;14146:93;14235:3;14146:93;:::i;:::-;14264:2;14259:3;14255:12;14248:19;;13907:366;;;:::o;14279:::-;14421:3;14442:67;14506:2;14501:3;14442:67;:::i;:::-;14435:74;;14518:93;14607:3;14518:93;:::i;:::-;14636:2;14631:3;14627:12;14620:19;;14279:366;;;:::o;14651:::-;14793:3;14814:67;14878:2;14873:3;14814:67;:::i;:::-;14807:74;;14890:93;14979:3;14890:93;:::i;:::-;15008:2;15003:3;14999:12;14992:19;;14651:366;;;:::o;15023:::-;15165:3;15186:67;15250:2;15245:3;15186:67;:::i;:::-;15179:74;;15262:93;15351:3;15262:93;:::i;:::-;15380:2;15375:3;15371:12;15364:19;;15023:366;;;:::o;15395:::-;15537:3;15558:67;15622:2;15617:3;15558:67;:::i;:::-;15551:74;;15634:93;15723:3;15634:93;:::i;:::-;15752:2;15747:3;15743:12;15736:19;;15395:366;;;:::o;15767:::-;15909:3;15930:67;15994:2;15989:3;15930:67;:::i;:::-;15923:74;;16006:93;16095:3;16006:93;:::i;:::-;16124:2;16119:3;16115:12;16108:19;;15767:366;;;:::o;16139:::-;16281:3;16302:67;16366:2;16361:3;16302:67;:::i;:::-;16295:74;;16378:93;16467:3;16378:93;:::i;:::-;16496:2;16491:3;16487:12;16480:19;;16139:366;;;:::o;16511:::-;16653:3;16674:67;16738:2;16733:3;16674:67;:::i;:::-;16667:74;;16750:93;16839:3;16750:93;:::i;:::-;16868:2;16863:3;16859:12;16852:19;;16511:366;;;:::o;16883:::-;17025:3;17046:67;17110:2;17105:3;17046:67;:::i;:::-;17039:74;;17122:93;17211:3;17122:93;:::i;:::-;17240:2;17235:3;17231:12;17224:19;;16883:366;;;:::o;17255:402::-;17415:3;17436:85;17518:2;17513:3;17436:85;:::i;:::-;17429:92;;17530:93;17619:3;17530:93;:::i;:::-;17648:2;17643:3;17639:12;17632:19;;17255:402;;;:::o;17663:366::-;17805:3;17826:67;17890:2;17885:3;17826:67;:::i;:::-;17819:74;;17902:93;17991:3;17902:93;:::i;:::-;18020:2;18015:3;18011:12;18004:19;;17663:366;;;:::o;18035:402::-;18195:3;18216:85;18298:2;18293:3;18216:85;:::i;:::-;18209:92;;18310:93;18399:3;18310:93;:::i;:::-;18428:2;18423:3;18419:12;18412:19;;18035:402;;;:::o;18443:366::-;18585:3;18606:67;18670:2;18665:3;18606:67;:::i;:::-;18599:74;;18682:93;18771:3;18682:93;:::i;:::-;18800:2;18795:3;18791:12;18784:19;;18443:366;;;:::o;18815:::-;18957:3;18978:67;19042:2;19037:3;18978:67;:::i;:::-;18971:74;;19054:93;19143:3;19054:93;:::i;:::-;19172:2;19167:3;19163:12;19156:19;;18815:366;;;:::o;19255:517::-;19408:4;19403:3;19399:14;19500:4;19493:5;19489:16;19483:23;19519:61;19574:4;19569:3;19565:14;19551:12;19519:61;:::i;:::-;19423:167;19673:4;19666:5;19662:16;19656:23;19692:63;19749:4;19744:3;19740:14;19726:12;19692:63;:::i;:::-;19600:165;19377:395;19255:517;;:::o;19778:108::-;19855:24;19873:5;19855:24;:::i;:::-;19850:3;19843:37;19778:108;;:::o;19892:118::-;19979:24;19997:5;19979:24;:::i;:::-;19974:3;19967:37;19892:118;;:::o;20016:105::-;20091:23;20108:5;20091:23;:::i;:::-;20086:3;20079:36;20016:105;;:::o;20127:115::-;20212:23;20229:5;20212:23;:::i;:::-;20207:3;20200:36;20127:115;;:::o;20248:112::-;20331:22;20347:5;20331:22;:::i;:::-;20326:3;20319:35;20248:112;;:::o;20366:663::-;20607:3;20629:148;20773:3;20629:148;:::i;:::-;20622:155;;20787:75;20858:3;20849:6;20787:75;:::i;:::-;20887:2;20882:3;20878:12;20871:19;;20900:75;20971:3;20962:6;20900:75;:::i;:::-;21000:2;20995:3;20991:12;20984:19;;21020:3;21013:10;;20366:663;;;;;:::o;21035:967::-;21417:3;21439:148;21583:3;21439:148;:::i;:::-;21432:155;;21604:95;21695:3;21686:6;21604:95;:::i;:::-;21597:102;;21716:148;21860:3;21716:148;:::i;:::-;21709:155;;21881:95;21972:3;21963:6;21881:95;:::i;:::-;21874:102;;21993:3;21986:10;;21035:967;;;;;:::o;22008:222::-;22101:4;22139:2;22128:9;22124:18;22116:26;;22152:71;22220:1;22209:9;22205:17;22196:6;22152:71;:::i;:::-;22008:222;;;;:::o;22236:210::-;22323:4;22361:2;22350:9;22346:18;22338:26;;22374:65;22436:1;22425:9;22421:17;22412:6;22374:65;:::i;:::-;22236:210;;;;:::o;22452:222::-;22545:4;22583:2;22572:9;22568:18;22560:26;;22596:71;22664:1;22653:9;22649:17;22640:6;22596:71;:::i;:::-;22452:222;;;;:::o;22680:775::-;22913:4;22951:3;22940:9;22936:19;22928:27;;22965:71;23033:1;23022:9;23018:17;23009:6;22965:71;:::i;:::-;23046:72;23114:2;23103:9;23099:18;23090:6;23046:72;:::i;:::-;23128;23196:2;23185:9;23181:18;23172:6;23128:72;:::i;:::-;23210;23278:2;23267:9;23263:18;23254:6;23210:72;:::i;:::-;23292:73;23360:3;23349:9;23345:19;23336:6;23292:73;:::i;:::-;23375;23443:3;23432:9;23428:19;23419:6;23375:73;:::i;:::-;22680:775;;;;;;;;;:::o;23461:553::-;23638:4;23676:3;23665:9;23661:19;23653:27;;23690:71;23758:1;23747:9;23743:17;23734:6;23690:71;:::i;:::-;23771:72;23839:2;23828:9;23824:18;23815:6;23771:72;:::i;:::-;23853;23921:2;23910:9;23906:18;23897:6;23853:72;:::i;:::-;23935;24003:2;23992:9;23988:18;23979:6;23935:72;:::i;:::-;23461:553;;;;;;;:::o;24020:664::-;24225:4;24263:3;24252:9;24248:19;24240:27;;24277:71;24345:1;24334:9;24330:17;24321:6;24277:71;:::i;:::-;24358:72;24426:2;24415:9;24411:18;24402:6;24358:72;:::i;:::-;24440;24508:2;24497:9;24493:18;24484:6;24440:72;:::i;:::-;24522;24590:2;24579:9;24575:18;24566:6;24522:72;:::i;:::-;24604:73;24672:3;24661:9;24657:19;24648:6;24604:73;:::i;:::-;24020:664;;;;;;;;:::o;24690:545::-;24863:4;24901:3;24890:9;24886:19;24878:27;;24915:71;24983:1;24972:9;24968:17;24959:6;24915:71;:::i;:::-;24996:68;25060:2;25049:9;25045:18;25036:6;24996:68;:::i;:::-;25074:72;25142:2;25131:9;25127:18;25118:6;25074:72;:::i;:::-;25156;25224:2;25213:9;25209:18;25200:6;25156:72;:::i;:::-;24690:545;;;;;;;:::o;25241:313::-;25354:4;25392:2;25381:9;25377:18;25369:26;;25441:9;25435:4;25431:20;25427:1;25416:9;25412:17;25405:47;25469:78;25542:4;25533:6;25469:78;:::i;:::-;25461:86;;25241:313;;;;:::o;25560:419::-;25726:4;25764:2;25753:9;25749:18;25741:26;;25813:9;25807:4;25803:20;25799:1;25788:9;25784:17;25777:47;25841:131;25967:4;25841:131;:::i;:::-;25833:139;;25560:419;;;:::o;25985:::-;26151:4;26189:2;26178:9;26174:18;26166:26;;26238:9;26232:4;26228:20;26224:1;26213:9;26209:17;26202:47;26266:131;26392:4;26266:131;:::i;:::-;26258:139;;25985:419;;;:::o;26410:::-;26576:4;26614:2;26603:9;26599:18;26591:26;;26663:9;26657:4;26653:20;26649:1;26638:9;26634:17;26627:47;26691:131;26817:4;26691:131;:::i;:::-;26683:139;;26410:419;;;:::o;26835:::-;27001:4;27039:2;27028:9;27024:18;27016:26;;27088:9;27082:4;27078:20;27074:1;27063:9;27059:17;27052:47;27116:131;27242:4;27116:131;:::i;:::-;27108:139;;26835:419;;;:::o;27260:::-;27426:4;27464:2;27453:9;27449:18;27441:26;;27513:9;27507:4;27503:20;27499:1;27488:9;27484:17;27477:47;27541:131;27667:4;27541:131;:::i;:::-;27533:139;;27260:419;;;:::o;27685:::-;27851:4;27889:2;27878:9;27874:18;27866:26;;27938:9;27932:4;27928:20;27924:1;27913:9;27909:17;27902:47;27966:131;28092:4;27966:131;:::i;:::-;27958:139;;27685:419;;;:::o;28110:::-;28276:4;28314:2;28303:9;28299:18;28291:26;;28363:9;28357:4;28353:20;28349:1;28338:9;28334:17;28327:47;28391:131;28517:4;28391:131;:::i;:::-;28383:139;;28110:419;;;:::o;28535:::-;28701:4;28739:2;28728:9;28724:18;28716:26;;28788:9;28782:4;28778:20;28774:1;28763:9;28759:17;28752:47;28816:131;28942:4;28816:131;:::i;:::-;28808:139;;28535:419;;;:::o;28960:::-;29126:4;29164:2;29153:9;29149:18;29141:26;;29213:9;29207:4;29203:20;29199:1;29188:9;29184:17;29177:47;29241:131;29367:4;29241:131;:::i;:::-;29233:139;;28960:419;;;:::o;29385:::-;29551:4;29589:2;29578:9;29574:18;29566:26;;29638:9;29632:4;29628:20;29624:1;29613:9;29609:17;29602:47;29666:131;29792:4;29666:131;:::i;:::-;29658:139;;29385:419;;;:::o;29810:::-;29976:4;30014:2;30003:9;29999:18;29991:26;;30063:9;30057:4;30053:20;30049:1;30038:9;30034:17;30027:47;30091:131;30217:4;30091:131;:::i;:::-;30083:139;;29810:419;;;:::o;30235:::-;30401:4;30439:2;30428:9;30424:18;30416:26;;30488:9;30482:4;30478:20;30474:1;30463:9;30459:17;30452:47;30516:131;30642:4;30516:131;:::i;:::-;30508:139;;30235:419;;;:::o;30660:::-;30826:4;30864:2;30853:9;30849:18;30841:26;;30913:9;30907:4;30903:20;30899:1;30888:9;30884:17;30877:47;30941:131;31067:4;30941:131;:::i;:::-;30933:139;;30660:419;;;:::o;31085:::-;31251:4;31289:2;31278:9;31274:18;31266:26;;31338:9;31332:4;31328:20;31324:1;31313:9;31309:17;31302:47;31366:131;31492:4;31366:131;:::i;:::-;31358:139;;31085:419;;;:::o;31510:::-;31676:4;31714:2;31703:9;31699:18;31691:26;;31763:9;31757:4;31753:20;31749:1;31738:9;31734:17;31727:47;31791:131;31917:4;31791:131;:::i;:::-;31783:139;;31510:419;;;:::o;31935:::-;32101:4;32139:2;32128:9;32124:18;32116:26;;32188:9;32182:4;32178:20;32174:1;32163:9;32159:17;32152:47;32216:131;32342:4;32216:131;:::i;:::-;32208:139;;31935:419;;;:::o;32360:::-;32526:4;32564:2;32553:9;32549:18;32541:26;;32613:9;32607:4;32603:20;32599:1;32588:9;32584:17;32577:47;32641:131;32767:4;32641:131;:::i;:::-;32633:139;;32360:419;;;:::o;32785:::-;32951:4;32989:2;32978:9;32974:18;32966:26;;33038:9;33032:4;33028:20;33024:1;33013:9;33009:17;33002:47;33066:131;33192:4;33066:131;:::i;:::-;33058:139;;32785:419;;;:::o;33210:::-;33376:4;33414:2;33403:9;33399:18;33391:26;;33463:9;33457:4;33453:20;33449:1;33438:9;33434:17;33427:47;33491:131;33617:4;33491:131;:::i;:::-;33483:139;;33210:419;;;:::o;33635:::-;33801:4;33839:2;33828:9;33824:18;33816:26;;33888:9;33882:4;33878:20;33874:1;33863:9;33859:17;33852:47;33916:131;34042:4;33916:131;:::i;:::-;33908:139;;33635:419;;;:::o;34060:::-;34226:4;34264:2;34253:9;34249:18;34241:26;;34313:9;34307:4;34303:20;34299:1;34288:9;34284:17;34277:47;34341:131;34467:4;34341:131;:::i;:::-;34333:139;;34060:419;;;:::o;34485:::-;34651:4;34689:2;34678:9;34674:18;34666:26;;34738:9;34732:4;34728:20;34724:1;34713:9;34709:17;34702:47;34766:131;34892:4;34766:131;:::i;:::-;34758:139;;34485:419;;;:::o;34910:::-;35076:4;35114:2;35103:9;35099:18;35091:26;;35163:9;35157:4;35153:20;35149:1;35138:9;35134:17;35127:47;35191:131;35317:4;35191:131;:::i;:::-;35183:139;;34910:419;;;:::o;35335:::-;35501:4;35539:2;35528:9;35524:18;35516:26;;35588:9;35582:4;35578:20;35574:1;35563:9;35559:17;35552:47;35616:131;35742:4;35616:131;:::i;:::-;35608:139;;35335:419;;;:::o;35760:::-;35926:4;35964:2;35953:9;35949:18;35941:26;;36013:9;36007:4;36003:20;35999:1;35988:9;35984:17;35977:47;36041:131;36167:4;36041:131;:::i;:::-;36033:139;;35760:419;;;:::o;36185:::-;36351:4;36389:2;36378:9;36374:18;36366:26;;36438:9;36432:4;36428:20;36424:1;36413:9;36409:17;36402:47;36466:131;36592:4;36466:131;:::i;:::-;36458:139;;36185:419;;;:::o;36610:334::-;36759:4;36797:2;36786:9;36782:18;36774:26;;36810:127;36934:1;36923:9;36919:17;36910:6;36810:127;:::i;:::-;36610:334;;;;:::o;36950:222::-;37043:4;37081:2;37070:9;37066:18;37058:26;;37094:71;37162:1;37151:9;37147:17;37138:6;37094:71;:::i;:::-;36950:222;;;;:::o;37178:332::-;37299:4;37337:2;37326:9;37322:18;37314:26;;37350:71;37418:1;37407:9;37403:17;37394:6;37350:71;:::i;:::-;37431:72;37499:2;37488:9;37484:18;37475:6;37431:72;:::i;:::-;37178:332;;;;;:::o;37516:218::-;37607:4;37645:2;37634:9;37630:18;37622:26;;37658:69;37724:1;37713:9;37709:17;37700:6;37658:69;:::i;:::-;37516:218;;;;:::o;37740:214::-;37829:4;37867:2;37856:9;37852:18;37844:26;;37880:67;37944:1;37933:9;37929:17;37920:6;37880:67;:::i;:::-;37740:214;;;;:::o;38041:99::-;38093:6;38127:5;38121:12;38111:22;;38041:99;;;:::o;38146:169::-;38230:11;38264:6;38259:3;38252:19;38304:4;38299:3;38295:14;38280:29;;38146:169;;;;:::o;38321:148::-;38423:11;38460:3;38445:18;;38321:148;;;;:::o;38475:305::-;38515:3;38534:20;38552:1;38534:20;:::i;:::-;38529:25;;38568:20;38586:1;38568:20;:::i;:::-;38563:25;;38722:1;38654:66;38650:74;38647:1;38644:81;38641:107;;;38728:18;;:::i;:::-;38641:107;38772:1;38769;38765:9;38758:16;;38475:305;;;;:::o;38786:185::-;38826:1;38843:20;38861:1;38843:20;:::i;:::-;38838:25;;38877:20;38895:1;38877:20;:::i;:::-;38872:25;;38916:1;38906:35;;38921:18;;:::i;:::-;38906:35;38963:1;38960;38956:9;38951:14;;38786:185;;;;:::o;38977:348::-;39017:7;39040:20;39058:1;39040:20;:::i;:::-;39035:25;;39074:20;39092:1;39074:20;:::i;:::-;39069:25;;39262:1;39194:66;39190:74;39187:1;39184:81;39179:1;39172:9;39165:17;39161:105;39158:131;;;39269:18;;:::i;:::-;39158:131;39317:1;39314;39310:9;39299:20;;38977:348;;;;:::o;39331:191::-;39371:4;39391:20;39409:1;39391:20;:::i;:::-;39386:25;;39425:20;39443:1;39425:20;:::i;:::-;39420:25;;39464:1;39461;39458:8;39455:34;;;39469:18;;:::i;:::-;39455:34;39514:1;39511;39507:9;39499:17;;39331:191;;;;:::o;39528:96::-;39565:7;39594:24;39612:5;39594:24;:::i;:::-;39583:35;;39528:96;;;:::o;39630:90::-;39664:7;39707:5;39700:13;39693:21;39682:32;;39630:90;;;:::o;39726:77::-;39763:7;39792:5;39781:16;;39726:77;;;:::o;39809:149::-;39845:7;39885:66;39878:5;39874:78;39863:89;;39809:149;;;:::o;39964:126::-;40001:7;40041:42;40034:5;40030:54;40019:65;;39964:126;;;:::o;40096:142::-;40133:7;40173:58;40166:5;40162:70;40151:81;;40096:142;;;:::o;40244:77::-;40281:7;40310:5;40299:16;;40244:77;;;:::o;40327:93::-;40363:7;40403:10;40396:5;40392:22;40381:33;;40327:93;;;:::o;40426:86::-;40461:7;40501:4;40494:5;40490:16;40479:27;;40426:86;;;:::o;40518:307::-;40586:1;40596:113;40610:6;40607:1;40604:13;40596:113;;;40695:1;40690:3;40686:11;40680:18;40676:1;40671:3;40667:11;40660:39;40632:2;40629:1;40625:10;40620:15;;40596:113;;;40727:6;40724:1;40721:13;40718:101;;;40807:1;40798:6;40793:3;40789:16;40782:27;40718:101;40567:258;40518:307;;;:::o;40831:171::-;40870:3;40893:24;40911:5;40893:24;:::i;:::-;40884:33;;40939:4;40932:5;40929:15;40926:41;;;40947:18;;:::i;:::-;40926:41;40994:1;40987:5;40983:13;40976:20;;40831:171;;;:::o;41008:320::-;41052:6;41089:1;41083:4;41079:12;41069:22;;41136:1;41130:4;41126:12;41157:18;41147:81;;41213:4;41205:6;41201:17;41191:27;;41147:81;41275:2;41267:6;41264:14;41244:18;41241:38;41238:84;;;41294:18;;:::i;:::-;41238:84;41059:269;41008:320;;;:::o;41334:79::-;41373:7;41402:5;41391:16;;41334:79;;;:::o;41419:180::-;41467:77;41464:1;41457:88;41564:4;41561:1;41554:15;41588:4;41585:1;41578:15;41605:180;41653:77;41650:1;41643:88;41750:4;41747:1;41740:15;41774:4;41771:1;41764:15;41791:180;41839:77;41836:1;41829:88;41936:4;41933:1;41926:15;41960:4;41957:1;41950:15;41977:180;42025:77;42022:1;42015:88;42122:4;42119:1;42112:15;42146:4;42143:1;42136:15;42163:180;42211:77;42208:1;42201:88;42308:4;42305:1;42298:15;42332:4;42329:1;42322:15;42349:180;42397:77;42394:1;42387:88;42494:4;42491:1;42484:15;42518:4;42515:1;42508:15;42658:117;42767:1;42764;42757:12;42781:102;42822:6;42873:2;42869:7;42864:2;42857:5;42853:14;42849:28;42839:38;;42781:102;;;:::o;42889:174::-;43029:26;43025:1;43017:6;43013:14;43006:50;42889:174;:::o;43069:182::-;43209:34;43205:1;43197:6;43193:14;43186:58;43069:182;:::o;43257:222::-;43397:34;43393:1;43385:6;43381:14;43374:58;43466:5;43461:2;43453:6;43449:15;43442:30;43257:222;:::o;43485:181::-;43625:33;43621:1;43613:6;43609:14;43602:57;43485:181;:::o;43672:170::-;43812:22;43808:1;43800:6;43796:14;43789:46;43672:170;:::o;43848:179::-;43988:31;43984:1;43976:6;43972:14;43965:55;43848:179;:::o;44033:221::-;44173:34;44169:1;44161:6;44157:14;44150:58;44242:4;44237:2;44229:6;44225:15;44218:29;44033:221;:::o;44260:181::-;44400:33;44396:1;44388:6;44384:14;44377:57;44260:181;:::o;44447:175::-;44587:27;44583:1;44575:6;44571:14;44564:51;44447:175;:::o;44628:221::-;44768:34;44764:1;44756:6;44752:14;44745:58;44837:4;44832:2;44824:6;44820:15;44813:29;44628:221;:::o;44855:214::-;44995:66;44991:1;44983:6;44979:14;44972:90;44855:214;:::o;45075:179::-;45215:31;45211:1;45203:6;45199:14;45192:55;45075:179;:::o;45260:225::-;45400:34;45396:1;45388:6;45384:14;45377:58;45469:8;45464:2;45456:6;45452:15;45445:33;45260:225;:::o;45491:221::-;45631:34;45627:1;45619:6;45615:14;45608:58;45700:4;45695:2;45687:6;45683:15;45676:29;45491:221;:::o;45718:166::-;45858:18;45854:1;45846:6;45842:14;45835:42;45718:166;:::o;45890:221::-;46030:34;46026:1;46018:6;46014:14;46007:58;46099:4;46094:2;46086:6;46082:15;46075:29;45890:221;:::o;46117:180::-;46257:32;46253:1;46245:6;46241:14;46234:56;46117:180;:::o;46303:227::-;46443:34;46439:1;46431:6;46427:14;46420:58;46512:10;46507:2;46499:6;46495:15;46488:35;46303:227;:::o;46536:235::-;46676:34;46672:1;46664:6;46660:14;46653:58;46745:18;46740:2;46732:6;46728:15;46721:43;46536:235;:::o;46777:226::-;46917:34;46913:1;46905:6;46901:14;46894:58;46986:9;46981:2;46973:6;46969:15;46962:34;46777:226;:::o;47009:220::-;47149:34;47145:1;47137:6;47133:14;47126:58;47218:3;47213:2;47205:6;47201:15;47194:28;47009:220;:::o;47235:224::-;47375:34;47371:1;47363:6;47359:14;47352:58;47444:7;47439:2;47431:6;47427:15;47420:32;47235:224;:::o;47465:225::-;47605:34;47601:1;47593:6;47589:14;47582:58;47674:8;47669:2;47661:6;47657:15;47650:33;47465:225;:::o;47696:223::-;47836:34;47832:1;47824:6;47820:14;47813:58;47905:6;47900:2;47892:6;47888:15;47881:31;47696:223;:::o;47925:173::-;48065:25;48061:1;48053:6;48049:14;48042:49;47925:173;:::o;48104:224::-;48244:34;48240:1;48232:6;48228:14;48221:58;48313:7;48308:2;48300:6;48296:15;48289:32;48104:224;:::o;48334:167::-;48474:19;48470:1;48462:6;48458:14;48451:43;48334:167;:::o;48507:234::-;48647:34;48643:1;48635:6;48631:14;48624:58;48716:17;48711:2;48703:6;48699:15;48692:42;48507:234;:::o;48747:181::-;48887:33;48883:1;48875:6;48871:14;48864:57;48747:181;:::o;48934:122::-;49007:24;49025:5;49007:24;:::i;:::-;49000:5;48997:35;48987:63;;49046:1;49043;49036:12;48987:63;48934:122;:::o;49062:::-;49135:24;49153:5;49135:24;:::i;:::-;49128:5;49125:35;49115:63;;49174:1;49171;49164:12;49115:63;49062:122;:::o;49190:120::-;49262:23;49279:5;49262:23;:::i;:::-;49255:5;49252:34;49242:62;;49300:1;49297;49290:12;49242:62;49190:120;:::o;49316:122::-;49389:24;49407:5;49389:24;:::i;:::-;49382:5;49379:35;49369:63;;49428:1;49425;49418:12;49369:63;49316:122;:::o;49444:120::-;49516:23;49533:5;49516:23;:::i;:::-;49509:5;49506:34;49496:62;;49554:1;49551;49544:12;49496:62;49444:120;:::o;49570:118::-;49641:22;49657:5;49641:22;:::i;:::-;49634:5;49631:33;49621:61;;49678:1;49675;49668:12;49621:61;49570:118;:::o

Swarm Source

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