ETH Price: $3,671.31 (-1.61%)

Token

ERC-20: EyesofFashionNFT_AccessPass (EoF_AP)
 

Overview

Max Total Supply

657 EoF_AP

Holders

616

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
sroseee.eth
Balance
1 EoF_AP
0x9215df54fa4fa8402e95db95b10156488747a28a
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:
EyesofFashionNFT_AccessPass

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: EyesofFashionNFT_AccessPass_flat.sol
// SPDX-License-Identifier: MIT


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


// OpenZeppelin Contracts v4.4.1 (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/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (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/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (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/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: contracts/EyesofFashionNFT_AccessPass_Presale.sol



pragma solidity >=0.7.0 <0.9.0;






contract Whitelisted {
  using ECDSA for bytes32;
  using Address for address;

  address internal _signer;

  constructor(address signer) {
    _signer = signer;
  }

  // @dev Assumes the signed message was human-readable msg.sender address (lowercase, without the '0x')
  modifier isValidWhitelistSignature(bytes memory signature) {
    bytes32 messageHash = toEthSignedMessageHash(asciiSender());
    address signer = messageHash.recover(signature);

    require(signer == _signer, "Invalid whitelist signature");
    _;
  }

  function recoveredAddress(bytes memory signature) public view returns (bytes memory) {
    address recoveredSigner = recover(signature);
    return abi.encodePacked(recoveredSigner);
  }

  function recover(bytes memory signature) public view returns (address) {
    bytes32 messageHash = toEthSignedMessageHash(asciiSender());
    address recoveredSigner = messageHash.recover(signature);
    return recoveredSigner;
  }

  function generateSenderHash() public view returns (bytes32) {
    return toEthSignedMessageHash(asciiSender());
  }

  // @dev Because at time of writing, 5b28...3cc0 hasn't made it into OpenZeppelin ECDSA release yet.
  // @dev https://github.com/OpenZeppelin/openzeppelin-contracts/commit/5b28259dacf47fc208e03611eb3ba8eeaed63cc0#diff-ff09871806bcccfd38e43de481f3e7e2fb92134c58e1a1f97b054e2d0d727458R209
  function toEthSignedMessageHash(string memory s) public pure returns (bytes32) {
    bytes memory b = bytes(s);
    return keccak256(
      abi.encodePacked(
        "\x19Ethereum Signed Message:\n",
        Strings.toString(b.length),
        b
      )
    );
  }

  function asciiSender() public view returns (string memory) {
    return toAsciiString(msg.sender);
  }

  function toAsciiString(address x) internal pure returns (string memory) {
    bytes memory s = new bytes(40);

    for (uint256 i = 0; i < 20; i++) {
      bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2 ** (8 * (19 - i)))));
      bytes1 hi = bytes1(uint8(b) / 16);
      bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
      s[2 * i] = char(hi);
      s[2 * i + 1] = char(lo);
    }

    return string(s);
  }

  function char(bytes1 b) internal pure returns (bytes1 c) {
    return (uint8(b) < 10)
      ? bytes1(uint8(b) + 0x30)
      : bytes1(uint8(b) + 0x57);
  }
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Clear approvals
        _approve(address(0), tokenId);

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: contracts/EyesofFashionNFT_AccessPass.sol



pragma solidity >=0.7.0 <0.9.0;





contract EyesofFashionNFT_AccessPass is ERC721, Ownable, Whitelisted {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "";
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
  
  uint256 public cost = 0 ether;
  uint256 public maxSupply = 960;
  uint256 public maxMintAmountPerTx = 1;
  uint256 public nftPerAddressLimit = 1;

  bool public paused = false;
  bool public revealed = true;
  bool public onlyWhitelisted = true;

  mapping(address => uint256) public addressMintedBalance;

  constructor() ERC721("EyesofFashionNFT_AccessPass", "EoF_AP") Whitelisted(0xD17b6fF2496FC08D33FD34971d9253e1f3d74Fe3) {
    setHiddenMetadataUri("ipfs://QmaD2K8ZcBrtQCn1UfDmQ1rtWsc6gdfwBR95Mhz2dFV1z5/hidden.json");
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }


  function presaleMint(bytes memory signature, uint256 _mintAmount) 
  public 
  payable 
  mintCompliance(_mintAmount)
  isValidWhitelistSignature(signature)
  {
    require(!paused, "The contract is paused!");
    require(onlyWhitelisted, "Public mode is active");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");

    uint256 ownerMintedCount = addressMintedBalance[msg.sender];
    require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");

    _mintLoop(msg.sender, _mintAmount);
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(!onlyWhitelisted, "Presale mode is active");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    
    _mintLoop(msg.sender, _mintAmount);
  }

  function ownerMint(uint256 _mintAmount) public onlyOwner {
      _mintLoop(msg.sender, _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }


  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
      return hiddenMetadataUri;
    }

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

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }

  function withdraw() public onlyOwner {
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      addressMintedBalance[_receiver]++;
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
  }

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

File 2 of 2: EyesofFashionNFT_AccessPass_Presale_flat.sol
// SPDX-License-Identifier: MIT



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


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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts v4.4.1 (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: contracts/EyesofFashionNFT_AccessPass_Presale.sol



pragma solidity >=0.7.0 <0.9.0;






contract Whitelisted {
  using ECDSA for bytes32;
  using Address for address;

  address internal _signer;

  constructor(address signer) {
    _signer = signer;
  }

  // @dev Assumes the signed message was human-readable msg.sender address (lowercase, without the '0x')
  modifier isValidWhitelistSignature(bytes memory signature) {
    bytes32 messageHash = toEthSignedMessageHash(asciiSender());
    address signer = messageHash.recover(signature);

    require(signer == _signer, "Invalid whitelist signature");
    _;
  }

  function recoveredAddress(bytes memory signature) public view returns (bytes memory) {
    address recoveredSigner = recover(signature);
    return abi.encodePacked(recoveredSigner);
  }

  function recover(bytes memory signature) public view returns (address) {
    bytes32 messageHash = toEthSignedMessageHash(asciiSender());
    address recoveredSigner = messageHash.recover(signature);
    return recoveredSigner;
  }

  function generateSenderHash() public view returns (bytes32) {
    return toEthSignedMessageHash(asciiSender());
  }

  // @dev Because at time of writing, 5b28...3cc0 hasn't made it into OpenZeppelin ECDSA release yet.
  // @dev https://github.com/OpenZeppelin/openzeppelin-contracts/commit/5b28259dacf47fc208e03611eb3ba8eeaed63cc0#diff-ff09871806bcccfd38e43de481f3e7e2fb92134c58e1a1f97b054e2d0d727458R209
  function toEthSignedMessageHash(string memory s) public pure returns (bytes32) {
    bytes memory b = bytes(s);
    return keccak256(
      abi.encodePacked(
        "\x19Ethereum Signed Message:\n",
        Strings.toString(b.length),
        b
      )
    );
  }

  function asciiSender() public view returns (string memory) {
    return toAsciiString(msg.sender);
  }

  function toAsciiString(address x) internal pure returns (string memory) {
    bytes memory s = new bytes(40);

    for (uint256 i = 0; i < 20; i++) {
      bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2 ** (8 * (19 - i)))));
      bytes1 hi = bytes1(uint8(b) / 16);
      bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
      s[2 * i] = char(hi);
      s[2 * i + 1] = char(lo);
    }

    return string(s);
  }

  function char(bytes1 b) internal pure returns (bytes1 c) {
    return (uint8(b) < 10)
      ? bytes1(uint8(b) + 0x30)
      : bytes1(uint8(b) + 0x57);
  }
}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asciiSender","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generateSenderHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoveredAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"s","type":"string"}],"name":"toEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600990805190602001906200002b929190620003d8565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000079929190620003d8565b506000600c556103c0600d556001600e556001600f556000601060006101000a81548160ff0219169083151502179055506001601060016101000a81548160ff0219169083151502179055506001601060026101000a81548160ff021916908315150217905550348015620000ed57600080fd5b5073d17b6ff2496fc08d33fd34971d9253e1f3d74fe36040518060400160405280601b81526020017f457965736f6646617368696f6e4e46545f4163636573735061737300000000008152506040518060400160405280600681526020017f456f465f41500000000000000000000000000000000000000000000000000000815250816000908051906020019062000187929190620003d8565b508060019080519060200190620001a0929190620003d8565b505050620001c3620001b76200023560201b60201c565b6200023d60201b60201c565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200022f60405180608001604052806041815260200162005e1a604191396200030360201b60201c565b62000570565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620003136200023560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000339620003ae60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000392576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038990620004af565b60405180910390fd5b80600b9080519060200190620003aa929190620003d8565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003e690620004e2565b90600052602060002090601f0160209004810192826200040a576000855562000456565b82601f106200042557805160ff191683800117855562000456565b8280016001018555821562000456579182015b828111156200045557825182559160200191906001019062000438565b5b50905062000465919062000469565b5090565b5b80821115620004845760008160009055506001016200046a565b5090565b600062000497602083620004d1565b9150620004a48262000547565b602082019050919050565b60006020820190508181036000830152620004ca8162000488565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004fb57607f821691505b6020821081141562000512576200051162000518565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61589a80620005806000396000f3fe6080604052600436106102885760003560e01c80636352211e1161015a578063a4a1edb1116100c1578063d720f9da1161007a578063d720f9da146109b4578063e0a80853146109f1578063e985e9c514610a1a578063efbd73f414610a57578063f19e75d414610a80578063f2fde38b14610aa957610288565b8063a4a1edb114610892578063b071401b146108cf578063b88d4fde146108f8578063ba7d2c7614610921578063c87b56dd1461094c578063d5abeb011461098957610288565b806395d89b411161011357806395d89b411461078f5780639c6add8e146107ba5780639c70b512146107f7578063a0712d6814610822578063a22cb4651461083e578063a45ba8e71461086757610288565b80636352211e1461067f57806370a08231146106bc578063715018a6146106f95780637ec4a659146107105780638da5cb5b1461073957806394354fd01461076457610288565b80633c952764116101fe5780634e21dc40116101b75780634e21dc401461058e5780634fdd43cb146105aa57806351830227146105d35780635503a0e8146105fe5780635c975abb1461062957806362b99ad41461065457610288565b80633c952764146104945780633ccfd60b146104bd57806340838f74146104d457806342842e0e146104ff578063438b63001461052857806344a0d68a1461056557610288565b806316ba10e01161025057806316ba10e01461038657806316c38b3c146103af57806318160ddd146103d857806318cae2691461040357806323b872dd14610440578063346d14ae1461046957610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b31461033257806313faede61461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613c29565b610ad2565b6040516102c1919061454b565b60405180910390f35b3480156102d657600080fd5b506102df610bb4565b6040516102ec91906145e8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613d71565b610c46565b60405161032991906144c2565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613bbc565b610ccb565b005b34801561036757600080fd5b50610370610de3565b60405161037d919061498a565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613d28565b610de9565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190613bfc565b610e7f565b005b3480156103e457600080fd5b506103ed610f18565b6040516103fa919061498a565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613a39565b610f29565b604051610437919061498a565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613aa6565b610f41565b005b34801561047557600080fd5b5061047e610fa1565b60405161048b91906145e8565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613bfc565b610fb1565b005b3480156104c957600080fd5b506104d261104a565b005b3480156104e057600080fd5b506104e9611146565b6040516104f69190614566565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190613aa6565b61115d565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613a39565b61117d565b60405161055c9190614529565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190613d71565b611288565b005b6105a860048036038101906105a39190613ccc565b61130e565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613d28565b61160b565b005b3480156105df57600080fd5b506105e86116a1565b6040516105f5919061454b565b60405180910390f35b34801561060a57600080fd5b506106136116b4565b60405161062091906145e8565b60405180910390f35b34801561063557600080fd5b5061063e611742565b60405161064b919061454b565b60405180910390f35b34801561066057600080fd5b50610669611755565b60405161067691906145e8565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a19190613d71565b6117e3565b6040516106b391906144c2565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613a39565b611895565b6040516106f0919061498a565b60405180910390f35b34801561070557600080fd5b5061070e61194d565b005b34801561071c57600080fd5b5061073760048036038101906107329190613d28565b6119d5565b005b34801561074557600080fd5b5061074e611a6b565b60405161075b91906144c2565b60405180910390f35b34801561077057600080fd5b50610779611a95565b604051610786919061498a565b60405180910390f35b34801561079b57600080fd5b506107a4611a9b565b6040516107b191906145e8565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613c83565b611b2d565b6040516107ee91906145c6565b60405180910390f35b34801561080357600080fd5b5061080c611b64565b604051610819919061454b565b60405180910390f35b61083c60048036038101906108379190613d71565b611b77565b005b34801561084a57600080fd5b5061086560048036038101906108609190613b7c565b611d20565b005b34801561087357600080fd5b5061087c611d36565b60405161088991906145e8565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613c83565b611dc4565b6040516108c691906144c2565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190613d71565b611dfa565b005b34801561090457600080fd5b5061091f600480360381019061091a9190613af9565b611e80565b005b34801561092d57600080fd5b50610936611ee2565b604051610943919061498a565b60405180910390f35b34801561095857600080fd5b50610973600480360381019061096e9190613d71565b611ee8565b60405161098091906145e8565b60405180910390f35b34801561099557600080fd5b5061099e612041565b6040516109ab919061498a565b60405180910390f35b3480156109c057600080fd5b506109db60048036038101906109d69190613d28565b612047565b6040516109e89190614566565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a139190613bfc565b612087565b005b348015610a2657600080fd5b50610a416004803603810190610a3c9190613a66565b612120565b604051610a4e919061454b565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190613d9e565b6121b4565b005b348015610a8c57600080fd5b50610aa76004803603810190610aa29190613d71565b6122ea565b005b348015610ab557600080fd5b50610ad06004803603810190610acb9190613a39565b612373565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bad5750610bac8261246b565b5b9050919050565b606060008054610bc390614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054610bef90614ef2565b8015610c3c5780601f10610c1157610100808354040283529160200191610c3c565b820191906000526020600020905b815481529060010190602001808311610c1f57829003601f168201915b5050505050905090565b6000610c51826124d5565b610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c879061480a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cd6826117e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e906148ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d66612541565b73ffffffffffffffffffffffffffffffffffffffff161480610d955750610d9481610d8f612541565b612120565b5b610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb9061476a565b60405180910390fd5b610dde8383612549565b505050565b600c5481565b610df1612541565b73ffffffffffffffffffffffffffffffffffffffff16610e0f611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c9061482a565b60405180910390fd5b80600a9080519060200190610e7b92919061384d565b5050565b610e87612541565b73ffffffffffffffffffffffffffffffffffffffff16610ea5611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef29061482a565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000610f246008612602565b905090565b60116020528060005260406000206000915090505481565b610f52610f4c612541565b82612610565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061490a565b60405180910390fd5b610f9c8383836126ee565b505050565b6060610fac3361294a565b905090565b610fb9612541565b73ffffffffffffffffffffffffffffffffffffffff16610fd7611a6b565b73ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110249061482a565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b611052612541565b73ffffffffffffffffffffffffffffffffffffffff16611070611a6b565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd9061482a565b60405180910390fd5b60006110d0611a6b565b73ffffffffffffffffffffffffffffffffffffffff16476040516110f3906144ad565b60006040518083038185875af1925050503d8060008114611130576040519150601f19603f3d011682016040523d82523d6000602084013e611135565b606091505b505090508061114357600080fd5b50565b6000611158611153610fa1565b612047565b905090565b61117883838360405180602001604052806000815250611e80565b505050565b6060600061118a83611895565b905060008167ffffffffffffffff8111156111a8576111a76150de565b5b6040519080825280602002602001820160405280156111d65781602001602082028036833780820191505090505b50905060006001905060005b83811080156111f35750600d548211155b1561127c576000611203836117e3565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611268578284838151811061124d5761124c6150af565b5b602002602001018181525050818061126490614f55565b9250505b828061127390614f55565b935050506111e2565b82945050505050919050565b611290612541565b73ffffffffffffffffffffffffffffffffffffffff166112ae611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb9061482a565b60405180910390fd5b80600c8190555050565b806000811180156113215750600e548111155b611360576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611357906146aa565b60405180910390fd5b600d548161136e6008612602565b6113789190614ac8565b11156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906148ea565b60405180910390fd5b8260006113cc6113c7610fa1565b612047565b905060006113e38383612b0d90919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c9061494a565b60405180910390fd5b601060009054906101000a900460ff16156114c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bc9061484a565b60405180910390fd5b601060029054906101000a900460ff16611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b9061488a565b60405180910390fd5b84600c546115229190614d28565b341015611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b9061496a565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f5486826115b79190614ac8565b11156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef906146ca565b60405180910390fd5b6116023387612b34565b50505050505050565b611613612541565b73ffffffffffffffffffffffffffffffffffffffff16611631611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e9061482a565b60405180910390fd5b80600b908051906020019061169d92919061384d565b5050565b601060019054906101000a900460ff1681565b600a80546116c190614ef2565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed90614ef2565b801561173a5780601f1061170f5761010080835404028352916020019161173a565b820191906000526020600020905b81548152906001019060200180831161171d57829003601f168201915b505050505081565b601060009054906101000a900460ff1681565b6009805461176290614ef2565b80601f016020809104026020016040519081016040528092919081815260200182805461178e90614ef2565b80156117db5780601f106117b0576101008083540402835291602001916117db565b820191906000526020600020905b8154815290600101906020018083116117be57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561188c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611883906147aa565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd9061478a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611955612541565b73ffffffffffffffffffffffffffffffffffffffff16611973611a6b565b73ffffffffffffffffffffffffffffffffffffffff16146119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c09061482a565b60405180910390fd5b6119d36000612bc9565b565b6119dd612541565b73ffffffffffffffffffffffffffffffffffffffff166119fb611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a489061482a565b60405180910390fd5b8060099080519060200190611a6792919061384d565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b606060018054611aaa90614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad690614ef2565b8015611b235780601f10611af857610100808354040283529160200191611b23565b820191906000526020600020905b815481529060010190602001808311611b0657829003601f168201915b5050505050905090565b60606000611b3a83611dc4565b905080604051602001611b4d9190614432565b604051602081830303815290604052915050919050565b601060029054906101000a900460ff1681565b80600081118015611b8a5750600e548111155b611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc0906146aa565b60405180910390fd5b600d5481611bd76008612602565b611be19190614ac8565b1115611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c19906148ea565b60405180910390fd5b601060009054906101000a900460ff1615611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c699061484a565b60405180910390fd5b601060029054906101000a900460ff1615611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb99061492a565b60405180910390fd5b81600c54611cd09190614d28565b341015611d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d099061496a565b60405180910390fd5b611d1c3383612b34565b5050565b611d32611d2b612541565b8383612c8f565b5050565b600b8054611d4390614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6f90614ef2565b8015611dbc5780601f10611d9157610100808354040283529160200191611dbc565b820191906000526020600020905b815481529060010190602001808311611d9f57829003601f168201915b505050505081565b600080611dd7611dd2610fa1565b612047565b90506000611dee8483612b0d90919063ffffffff16565b90508092505050919050565b611e02612541565b73ffffffffffffffffffffffffffffffffffffffff16611e20611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d9061482a565b60405180910390fd5b80600e8190555050565b611e91611e8b612541565b83612610565b611ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec79061490a565b60405180910390fd5b611edc84848484612dfc565b50505050565b600f5481565b6060611ef3826124d5565b611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f29906148aa565b60405180910390fd5b60001515601060019054906101000a900460ff1615151415611fe057600b8054611f5b90614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8790614ef2565b8015611fd45780601f10611fa957610100808354040283529160200191611fd4565b820191906000526020600020905b815481529060010190602001808311611fb757829003601f168201915b5050505050905061203c565b6000611fea612e58565b9050600081511161200a5760405180602001604052806000815250612038565b8061201484612eea565b600a6040516020016120289392919061444d565b6040516020818303038152906040525b9150505b919050565b600d5481565b6000808290506120578151612eea565b8160405160200161206992919061447e565b60405160208183030381529060405280519060200120915050919050565b61208f612541565b73ffffffffffffffffffffffffffffffffffffffff166120ad611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa9061482a565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156121c75750600e548111155b612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd906146aa565b60405180910390fd5b600d54816122146008612602565b61221e9190614ac8565b111561225f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612256906148ea565b60405180910390fd5b612267612541565b73ffffffffffffffffffffffffffffffffffffffff16612285611a6b565b73ffffffffffffffffffffffffffffffffffffffff16146122db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d29061482a565b60405180910390fd5b6122e58284612b34565b505050565b6122f2612541565b73ffffffffffffffffffffffffffffffffffffffff16612310611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d9061482a565b60405180910390fd5b6123703382612b34565b50565b61237b612541565b73ffffffffffffffffffffffffffffffffffffffff16612399611a6b565b73ffffffffffffffffffffffffffffffffffffffff16146123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e69061482a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561245f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124569061466a565b60405180910390fd5b61246881612bc9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125bc836117e3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061261b826124d5565b61265a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126519061474a565b60405180910390fd5b6000612665836117e3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126d457508373ffffffffffffffffffffffffffffffffffffffff166126bc84610c46565b73ffffffffffffffffffffffffffffffffffffffff16145b806126e557506126e48185612120565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661270e826117e3565b73ffffffffffffffffffffffffffffffffffffffff1614612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b9061486a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cb906146ea565b60405180910390fd5b6127df83838361304b565b6127ea600082612549565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461283a9190614dbd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128919190614ac8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000602867ffffffffffffffff811115612969576129686150de565b5b6040519080825280601f01601f19166020018201604052801561299b5781602001600182028036833780820191505090505b50905060005b6014811015612b035760008160136129b99190614dbd565b60086129c59190614d28565b60026129d19190614c0a565b8573ffffffffffffffffffffffffffffffffffffffff166129f29190614b55565b60f81b9050600060108260f81c612a099190614b86565b60f81b905060008160f81c6010612a209190614d82565b8360f81c612a2e9190614df1565b60f81b9050612a3c82613050565b85856002612a4a9190614d28565b81518110612a5b57612a5a6150af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a9381613050565b856001866002612aa39190614d28565b612aad9190614ac8565b81518110612abe57612abd6150af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050508080612afb90614f55565b9150506129a1565b5080915050919050565b6000806000612b1c8585613093565b91509150612b2981613116565b819250505092915050565b60005b81811015612bc457601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612b8f90614f55565b9190505550612b9e60086132eb565b612bb183612bac6008612602565b613301565b8080612bbc90614f55565b915050612b37565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf59061470a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612def919061454b565b60405180910390a3505050565b612e078484846126ee565b612e138484848461331f565b612e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e499061464a565b60405180910390fd5b50505050565b606060098054612e6790614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9390614ef2565b8015612ee05780601f10612eb557610100808354040283529160200191612ee0565b820191906000526020600020905b815481529060010190602001808311612ec357829003601f168201915b5050505050905090565b60606000821415612f32576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613046565b600082905060005b60008214612f64578080612f4d90614f55565b915050600a82612f5d9190614b55565b9150612f3a565b60008167ffffffffffffffff811115612f8057612f7f6150de565b5b6040519080825280601f01601f191660200182016040528015612fb25781602001600182028036833780820191505090505b5090505b6000851461303f57600182612fcb9190614dbd565b9150600a85612fda9190614fc2565b6030612fe69190614ac8565b60f81b818381518110612ffc57612ffb6150af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130389190614b55565b9450612fb6565b8093505050505b919050565b505050565b6000600a8260f81c60ff16106130785760578260f81c6130709190614b1e565b60f81b61308c565b60308260f81c6130889190614b1e565b60f81b5b9050919050565b6000806041835114156130d55760008060006020860151925060408601519150606086015160001a90506130c9878285856134b6565b9450945050505061310f565b6040835114156131065760008060208501519150604085015190506130fb8683836135c3565b93509350505061310f565b60006002915091505b9250929050565b6000600481111561312a57613129615051565b5b81600481111561313d5761313c615051565b5b1415613148576132e8565b6001600481111561315c5761315b615051565b5b81600481111561316f5761316e615051565b5b14156131b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a79061460a565b60405180910390fd5b600260048111156131c4576131c3615051565b5b8160048111156131d7576131d6615051565b5b1415613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320f9061462a565b60405180910390fd5b6003600481111561322c5761322b615051565b5b81600481111561323f5761323e615051565b5b1415613280576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132779061472a565b60405180910390fd5b60048081111561329357613292615051565b5b8160048111156132a6576132a5615051565b5b14156132e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132de906147ca565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61331b828260405180602001604052806000815250613611565b5050565b60006133408473ffffffffffffffffffffffffffffffffffffffff1661366c565b156134a9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613369612541565b8786866040518563ffffffff1660e01b815260040161338b94939291906144dd565b602060405180830381600087803b1580156133a557600080fd5b505af19250505080156133d657506040513d601f19601f820116820180604052508101906133d39190613c56565b60015b613459573d8060008114613406576040519150601f19603f3d011682016040523d82523d6000602084013e61340b565b606091505b50600081511415613451576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134489061464a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134ae565b600190505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134f15760006003915091506135ba565b601b8560ff16141580156135095750601c8560ff1614155b1561351b5760006004915091506135ba565b6000600187878787604051600081526020016040526040516135409493929190614581565b6020604051602081039080840390855afa158015613562573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135b1576000600192509250506135ba565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613603878288856134b6565b935093505050935093915050565b61361b838361367f565b613628600084848461331f565b613667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365e9061464a565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e6906147ea565b60405180910390fd5b6136f8816124d5565b15613738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372f9061468a565b60405180910390fd5b6137446000838361304b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137949190614ac8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461385990614ef2565b90600052602060002090601f01602090048101928261387b57600085556138c2565b82601f1061389457805160ff19168380011785556138c2565b828001600101855582156138c2579182015b828111156138c15782518255916020019190600101906138a6565b5b5090506138cf91906138d3565b5090565b5b808211156138ec5760008160009055506001016138d4565b5090565b60006139036138fe846149ca565b6149a5565b90508281526020810184848401111561391f5761391e615112565b5b61392a848285614eb0565b509392505050565b6000613945613940846149fb565b6149a5565b90508281526020810184848401111561396157613960615112565b5b61396c848285614eb0565b509392505050565b60008135905061398381615808565b92915050565b6000813590506139988161581f565b92915050565b6000813590506139ad81615836565b92915050565b6000815190506139c281615836565b92915050565b600082601f8301126139dd576139dc61510d565b5b81356139ed8482602086016138f0565b91505092915050565b600082601f830112613a0b57613a0a61510d565b5b8135613a1b848260208601613932565b91505092915050565b600081359050613a338161584d565b92915050565b600060208284031215613a4f57613a4e61511c565b5b6000613a5d84828501613974565b91505092915050565b60008060408385031215613a7d57613a7c61511c565b5b6000613a8b85828601613974565b9250506020613a9c85828601613974565b9150509250929050565b600080600060608486031215613abf57613abe61511c565b5b6000613acd86828701613974565b9350506020613ade86828701613974565b9250506040613aef86828701613a24565b9150509250925092565b60008060008060808587031215613b1357613b1261511c565b5b6000613b2187828801613974565b9450506020613b3287828801613974565b9350506040613b4387828801613a24565b925050606085013567ffffffffffffffff811115613b6457613b63615117565b5b613b70878288016139c8565b91505092959194509250565b60008060408385031215613b9357613b9261511c565b5b6000613ba185828601613974565b9250506020613bb285828601613989565b9150509250929050565b60008060408385031215613bd357613bd261511c565b5b6000613be185828601613974565b9250506020613bf285828601613a24565b9150509250929050565b600060208284031215613c1257613c1161511c565b5b6000613c2084828501613989565b91505092915050565b600060208284031215613c3f57613c3e61511c565b5b6000613c4d8482850161399e565b91505092915050565b600060208284031215613c6c57613c6b61511c565b5b6000613c7a848285016139b3565b91505092915050565b600060208284031215613c9957613c9861511c565b5b600082013567ffffffffffffffff811115613cb757613cb6615117565b5b613cc3848285016139c8565b91505092915050565b60008060408385031215613ce357613ce261511c565b5b600083013567ffffffffffffffff811115613d0157613d00615117565b5b613d0d858286016139c8565b9250506020613d1e85828601613a24565b9150509250929050565b600060208284031215613d3e57613d3d61511c565b5b600082013567ffffffffffffffff811115613d5c57613d5b615117565b5b613d68848285016139f6565b91505092915050565b600060208284031215613d8757613d8661511c565b5b6000613d9584828501613a24565b91505092915050565b60008060408385031215613db557613db461511c565b5b6000613dc385828601613a24565b9250506020613dd485828601613974565b9150509250929050565b6000613dea8383614405565b60208301905092915050565b613dff81614e25565b82525050565b613e16613e1182614e25565b614f9e565b82525050565b6000613e2782614a51565b613e318185614a7f565b9350613e3c83614a2c565b8060005b83811015613e6d578151613e548882613dde565b9750613e5f83614a72565b925050600181019050613e40565b5085935050505092915050565b613e8381614e37565b82525050565b613e9281614e43565b82525050565b6000613ea382614a5c565b613ead8185614a90565b9350613ebd818560208601614ebf565b613ec681615121565b840191505092915050565b6000613edc82614a5c565b613ee68185614aa1565b9350613ef6818560208601614ebf565b80840191505092915050565b6000613f0d82614a67565b613f178185614aac565b9350613f27818560208601614ebf565b613f3081615121565b840191505092915050565b6000613f4682614a67565b613f508185614abd565b9350613f60818560208601614ebf565b80840191505092915050565b60008154613f7981614ef2565b613f838186614abd565b94506001821660008114613f9e5760018114613faf57613fe2565b60ff19831686528186019350613fe2565b613fb885614a3c565b60005b83811015613fda57815481890152600182019150602081019050613fbb565b838801955050505b50505092915050565b6000613ff8601883614aac565b91506140038261514c565b602082019050919050565b600061401b601f83614aac565b915061402682615175565b602082019050919050565b600061403e603283614aac565b91506140498261519e565b604082019050919050565b6000614061602683614aac565b915061406c826151ed565b604082019050919050565b6000614084601c83614aac565b915061408f8261523c565b602082019050919050565b60006140a7601483614aac565b91506140b282615265565b602082019050919050565b60006140ca601c83614aac565b91506140d58261528e565b602082019050919050565b60006140ed602483614aac565b91506140f8826152b7565b604082019050919050565b6000614110601983614aac565b915061411b82615306565b602082019050919050565b6000614133602283614aac565b915061413e8261532f565b604082019050919050565b6000614156602c83614aac565b91506141618261537e565b604082019050919050565b6000614179603883614aac565b9150614184826153cd565b604082019050919050565b600061419c602a83614aac565b91506141a78261541c565b604082019050919050565b60006141bf602983614aac565b91506141ca8261546b565b604082019050919050565b60006141e2602283614aac565b91506141ed826154ba565b604082019050919050565b6000614205602083614aac565b915061421082615509565b602082019050919050565b6000614228602c83614aac565b915061423382615532565b604082019050919050565b600061424b602083614aac565b915061425682615581565b602082019050919050565b600061426e601a83614abd565b9150614279826155aa565b601a82019050919050565b6000614291601783614aac565b915061429c826155d3565b602082019050919050565b60006142b4602983614aac565b91506142bf826155fc565b604082019050919050565b60006142d7601583614aac565b91506142e28261564b565b602082019050919050565b60006142fa602f83614aac565b915061430582615674565b604082019050919050565b600061431d602183614aac565b9150614328826156c3565b604082019050919050565b6000614340600083614aa1565b915061434b82615712565b600082019050919050565b6000614363601483614aac565b915061436e82615715565b602082019050919050565b6000614386603183614aac565b91506143918261573e565b604082019050919050565b60006143a9601683614aac565b91506143b48261578d565b602082019050919050565b60006143cc601b83614aac565b91506143d7826157b6565b602082019050919050565b60006143ef601383614aac565b91506143fa826157df565b602082019050919050565b61440e81614e99565b82525050565b61441d81614e99565b82525050565b61442c81614ea3565b82525050565b600061443e8284613e05565b60148201915081905092915050565b60006144598286613f3b565b91506144658285613f3b565b91506144718284613f6c565b9150819050949350505050565b600061448982614261565b91506144958285613f3b565b91506144a18284613ed1565b91508190509392505050565b60006144b882614333565b9150819050919050565b60006020820190506144d76000830184613df6565b92915050565b60006080820190506144f26000830187613df6565b6144ff6020830186613df6565b61450c6040830185614414565b818103606083015261451e8184613e98565b905095945050505050565b600060208201905081810360008301526145438184613e1c565b905092915050565b60006020820190506145606000830184613e7a565b92915050565b600060208201905061457b6000830184613e89565b92915050565b60006080820190506145966000830187613e89565b6145a36020830186614423565b6145b06040830185613e89565b6145bd6060830184613e89565b95945050505050565b600060208201905081810360008301526145e08184613e98565b905092915050565b600060208201905081810360008301526146028184613f02565b905092915050565b6000602082019050818103600083015261462381613feb565b9050919050565b600060208201905081810360008301526146438161400e565b9050919050565b6000602082019050818103600083015261466381614031565b9050919050565b6000602082019050818103600083015261468381614054565b9050919050565b600060208201905081810360008301526146a381614077565b9050919050565b600060208201905081810360008301526146c38161409a565b9050919050565b600060208201905081810360008301526146e3816140bd565b9050919050565b60006020820190508181036000830152614703816140e0565b9050919050565b6000602082019050818103600083015261472381614103565b9050919050565b6000602082019050818103600083015261474381614126565b9050919050565b6000602082019050818103600083015261476381614149565b9050919050565b600060208201905081810360008301526147838161416c565b9050919050565b600060208201905081810360008301526147a38161418f565b9050919050565b600060208201905081810360008301526147c3816141b2565b9050919050565b600060208201905081810360008301526147e3816141d5565b9050919050565b60006020820190508181036000830152614803816141f8565b9050919050565b600060208201905081810360008301526148238161421b565b9050919050565b600060208201905081810360008301526148438161423e565b9050919050565b6000602082019050818103600083015261486381614284565b9050919050565b60006020820190508181036000830152614883816142a7565b9050919050565b600060208201905081810360008301526148a3816142ca565b9050919050565b600060208201905081810360008301526148c3816142ed565b9050919050565b600060208201905081810360008301526148e381614310565b9050919050565b6000602082019050818103600083015261490381614356565b9050919050565b6000602082019050818103600083015261492381614379565b9050919050565b600060208201905081810360008301526149438161439c565b9050919050565b60006020820190508181036000830152614963816143bf565b9050919050565b60006020820190508181036000830152614983816143e2565b9050919050565b600060208201905061499f6000830184614414565b92915050565b60006149af6149c0565b90506149bb8282614f24565b919050565b6000604051905090565b600067ffffffffffffffff8211156149e5576149e46150de565b5b6149ee82615121565b9050602081019050919050565b600067ffffffffffffffff821115614a1657614a156150de565b5b614a1f82615121565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ad382614e99565b9150614ade83614e99565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1357614b12614ff3565b5b828201905092915050565b6000614b2982614ea3565b9150614b3483614ea3565b92508260ff03821115614b4a57614b49614ff3565b5b828201905092915050565b6000614b6082614e99565b9150614b6b83614e99565b925082614b7b57614b7a615022565b5b828204905092915050565b6000614b9182614ea3565b9150614b9c83614ea3565b925082614bac57614bab615022565b5b828204905092915050565b6000808291508390505b6001851115614c0157808604811115614bdd57614bdc614ff3565b5b6001851615614bec5780820291505b8081029050614bfa8561513f565b9450614bc1565b94509492505050565b6000614c1582614e99565b9150614c2083614e99565b9250614c4d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614c55565b905092915050565b600082614c655760019050614d21565b81614c735760009050614d21565b8160018114614c895760028114614c9357614cc2565b6001915050614d21565b60ff841115614ca557614ca4614ff3565b5b8360020a915084821115614cbc57614cbb614ff3565b5b50614d21565b5060208310610133831016604e8410600b8410161715614cf75782820a905083811115614cf257614cf1614ff3565b5b614d21565b614d048484846001614bb7565b92509050818404811115614d1b57614d1a614ff3565b5b81810290505b9392505050565b6000614d3382614e99565b9150614d3e83614e99565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d7757614d76614ff3565b5b828202905092915050565b6000614d8d82614ea3565b9150614d9883614ea3565b92508160ff0483118215151615614db257614db1614ff3565b5b828202905092915050565b6000614dc882614e99565b9150614dd383614e99565b925082821015614de657614de5614ff3565b5b828203905092915050565b6000614dfc82614ea3565b9150614e0783614ea3565b925082821015614e1a57614e19614ff3565b5b828203905092915050565b6000614e3082614e79565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614edd578082015181840152602081019050614ec2565b83811115614eec576000848401525b50505050565b60006002820490506001821680614f0a57607f821691505b60208210811415614f1e57614f1d615080565b5b50919050565b614f2d82615121565b810181811067ffffffffffffffff82111715614f4c57614f4b6150de565b5b80604052505050565b6000614f6082614e99565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f9357614f92614ff3565b5b600182019050919050565b6000614fa982614fb0565b9050919050565b6000614fbb82615132565b9050919050565b6000614fcd82614e99565b9150614fd883614e99565b925082614fe857614fe7615022565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160011c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206d6f6465206973206163746976650000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f50726573616c65206d6f64652069732061637469766500000000000000000000600082015250565b7f496e76616c69642077686974656c697374207369676e61747572650000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61581181614e25565b811461581c57600080fd5b50565b61582881614e37565b811461583357600080fd5b50565b61583f81614e4d565b811461584a57600080fd5b50565b61585681614e99565b811461586157600080fd5b5056fea264697066735822122016ec2aa0cf2da88ce4e3cd70deb507fee4604fcf41d71c0121c384a19de33bdd64736f6c63430008070033697066733a2f2f516d6144324b385a6342727451436e315566446d513172745773633667646677425239354d687a32644656317a352f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106102885760003560e01c80636352211e1161015a578063a4a1edb1116100c1578063d720f9da1161007a578063d720f9da146109b4578063e0a80853146109f1578063e985e9c514610a1a578063efbd73f414610a57578063f19e75d414610a80578063f2fde38b14610aa957610288565b8063a4a1edb114610892578063b071401b146108cf578063b88d4fde146108f8578063ba7d2c7614610921578063c87b56dd1461094c578063d5abeb011461098957610288565b806395d89b411161011357806395d89b411461078f5780639c6add8e146107ba5780639c70b512146107f7578063a0712d6814610822578063a22cb4651461083e578063a45ba8e71461086757610288565b80636352211e1461067f57806370a08231146106bc578063715018a6146106f95780637ec4a659146107105780638da5cb5b1461073957806394354fd01461076457610288565b80633c952764116101fe5780634e21dc40116101b75780634e21dc401461058e5780634fdd43cb146105aa57806351830227146105d35780635503a0e8146105fe5780635c975abb1461062957806362b99ad41461065457610288565b80633c952764146104945780633ccfd60b146104bd57806340838f74146104d457806342842e0e146104ff578063438b63001461052857806344a0d68a1461056557610288565b806316ba10e01161025057806316ba10e01461038657806316c38b3c146103af57806318160ddd146103d857806318cae2691461040357806323b872dd14610440578063346d14ae1461046957610288565b806301ffc9a71461028d57806306fdde03146102ca578063081812fc146102f5578063095ea7b31461033257806313faede61461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af9190613c29565b610ad2565b6040516102c1919061454b565b60405180910390f35b3480156102d657600080fd5b506102df610bb4565b6040516102ec91906145e8565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613d71565b610c46565b60405161032991906144c2565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190613bbc565b610ccb565b005b34801561036757600080fd5b50610370610de3565b60405161037d919061498a565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190613d28565b610de9565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190613bfc565b610e7f565b005b3480156103e457600080fd5b506103ed610f18565b6040516103fa919061498a565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613a39565b610f29565b604051610437919061498a565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613aa6565b610f41565b005b34801561047557600080fd5b5061047e610fa1565b60405161048b91906145e8565b60405180910390f35b3480156104a057600080fd5b506104bb60048036038101906104b69190613bfc565b610fb1565b005b3480156104c957600080fd5b506104d261104a565b005b3480156104e057600080fd5b506104e9611146565b6040516104f69190614566565b60405180910390f35b34801561050b57600080fd5b5061052660048036038101906105219190613aa6565b61115d565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613a39565b61117d565b60405161055c9190614529565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190613d71565b611288565b005b6105a860048036038101906105a39190613ccc565b61130e565b005b3480156105b657600080fd5b506105d160048036038101906105cc9190613d28565b61160b565b005b3480156105df57600080fd5b506105e86116a1565b6040516105f5919061454b565b60405180910390f35b34801561060a57600080fd5b506106136116b4565b60405161062091906145e8565b60405180910390f35b34801561063557600080fd5b5061063e611742565b60405161064b919061454b565b60405180910390f35b34801561066057600080fd5b50610669611755565b60405161067691906145e8565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a19190613d71565b6117e3565b6040516106b391906144c2565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613a39565b611895565b6040516106f0919061498a565b60405180910390f35b34801561070557600080fd5b5061070e61194d565b005b34801561071c57600080fd5b5061073760048036038101906107329190613d28565b6119d5565b005b34801561074557600080fd5b5061074e611a6b565b60405161075b91906144c2565b60405180910390f35b34801561077057600080fd5b50610779611a95565b604051610786919061498a565b60405180910390f35b34801561079b57600080fd5b506107a4611a9b565b6040516107b191906145e8565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc9190613c83565b611b2d565b6040516107ee91906145c6565b60405180910390f35b34801561080357600080fd5b5061080c611b64565b604051610819919061454b565b60405180910390f35b61083c60048036038101906108379190613d71565b611b77565b005b34801561084a57600080fd5b5061086560048036038101906108609190613b7c565b611d20565b005b34801561087357600080fd5b5061087c611d36565b60405161088991906145e8565b60405180910390f35b34801561089e57600080fd5b506108b960048036038101906108b49190613c83565b611dc4565b6040516108c691906144c2565b60405180910390f35b3480156108db57600080fd5b506108f660048036038101906108f19190613d71565b611dfa565b005b34801561090457600080fd5b5061091f600480360381019061091a9190613af9565b611e80565b005b34801561092d57600080fd5b50610936611ee2565b604051610943919061498a565b60405180910390f35b34801561095857600080fd5b50610973600480360381019061096e9190613d71565b611ee8565b60405161098091906145e8565b60405180910390f35b34801561099557600080fd5b5061099e612041565b6040516109ab919061498a565b60405180910390f35b3480156109c057600080fd5b506109db60048036038101906109d69190613d28565b612047565b6040516109e89190614566565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a139190613bfc565b612087565b005b348015610a2657600080fd5b50610a416004803603810190610a3c9190613a66565b612120565b604051610a4e919061454b565b60405180910390f35b348015610a6357600080fd5b50610a7e6004803603810190610a799190613d9e565b6121b4565b005b348015610a8c57600080fd5b50610aa76004803603810190610aa29190613d71565b6122ea565b005b348015610ab557600080fd5b50610ad06004803603810190610acb9190613a39565b612373565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610bad5750610bac8261246b565b5b9050919050565b606060008054610bc390614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054610bef90614ef2565b8015610c3c5780601f10610c1157610100808354040283529160200191610c3c565b820191906000526020600020905b815481529060010190602001808311610c1f57829003601f168201915b5050505050905090565b6000610c51826124d5565b610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c879061480a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cd6826117e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3e906148ca565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d66612541565b73ffffffffffffffffffffffffffffffffffffffff161480610d955750610d9481610d8f612541565b612120565b5b610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb9061476a565b60405180910390fd5b610dde8383612549565b505050565b600c5481565b610df1612541565b73ffffffffffffffffffffffffffffffffffffffff16610e0f611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c9061482a565b60405180910390fd5b80600a9080519060200190610e7b92919061384d565b5050565b610e87612541565b73ffffffffffffffffffffffffffffffffffffffff16610ea5611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614610efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef29061482a565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6000610f246008612602565b905090565b60116020528060005260406000206000915090505481565b610f52610f4c612541565b82612610565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061490a565b60405180910390fd5b610f9c8383836126ee565b505050565b6060610fac3361294a565b905090565b610fb9612541565b73ffffffffffffffffffffffffffffffffffffffff16610fd7611a6b565b73ffffffffffffffffffffffffffffffffffffffff161461102d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110249061482a565b60405180910390fd5b80601060026101000a81548160ff02191690831515021790555050565b611052612541565b73ffffffffffffffffffffffffffffffffffffffff16611070611a6b565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd9061482a565b60405180910390fd5b60006110d0611a6b565b73ffffffffffffffffffffffffffffffffffffffff16476040516110f3906144ad565b60006040518083038185875af1925050503d8060008114611130576040519150601f19603f3d011682016040523d82523d6000602084013e611135565b606091505b505090508061114357600080fd5b50565b6000611158611153610fa1565b612047565b905090565b61117883838360405180602001604052806000815250611e80565b505050565b6060600061118a83611895565b905060008167ffffffffffffffff8111156111a8576111a76150de565b5b6040519080825280602002602001820160405280156111d65781602001602082028036833780820191505090505b50905060006001905060005b83811080156111f35750600d548211155b1561127c576000611203836117e3565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611268578284838151811061124d5761124c6150af565b5b602002602001018181525050818061126490614f55565b9250505b828061127390614f55565b935050506111e2565b82945050505050919050565b611290612541565b73ffffffffffffffffffffffffffffffffffffffff166112ae611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614611304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fb9061482a565b60405180910390fd5b80600c8190555050565b806000811180156113215750600e548111155b611360576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611357906146aa565b60405180910390fd5b600d548161136e6008612602565b6113789190614ac8565b11156113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b0906148ea565b60405180910390fd5b8260006113cc6113c7610fa1565b612047565b905060006113e38383612b0d90919063ffffffff16565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c9061494a565b60405180910390fd5b601060009054906101000a900460ff16156114c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bc9061484a565b60405180910390fd5b601060029054906101000a900460ff16611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b9061488a565b60405180910390fd5b84600c546115229190614d28565b341015611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b9061496a565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f5486826115b79190614ac8565b11156115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef906146ca565b60405180910390fd5b6116023387612b34565b50505050505050565b611613612541565b73ffffffffffffffffffffffffffffffffffffffff16611631611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614611687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167e9061482a565b60405180910390fd5b80600b908051906020019061169d92919061384d565b5050565b601060019054906101000a900460ff1681565b600a80546116c190614ef2565b80601f01602080910402602001604051908101604052809291908181526020018280546116ed90614ef2565b801561173a5780601f1061170f5761010080835404028352916020019161173a565b820191906000526020600020905b81548152906001019060200180831161171d57829003601f168201915b505050505081565b601060009054906101000a900460ff1681565b6009805461176290614ef2565b80601f016020809104026020016040519081016040528092919081815260200182805461178e90614ef2565b80156117db5780601f106117b0576101008083540402835291602001916117db565b820191906000526020600020905b8154815290600101906020018083116117be57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561188c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611883906147aa565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611906576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fd9061478a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611955612541565b73ffffffffffffffffffffffffffffffffffffffff16611973611a6b565b73ffffffffffffffffffffffffffffffffffffffff16146119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c09061482a565b60405180910390fd5b6119d36000612bc9565b565b6119dd612541565b73ffffffffffffffffffffffffffffffffffffffff166119fb611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614611a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a489061482a565b60405180910390fd5b8060099080519060200190611a6792919061384d565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b606060018054611aaa90614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054611ad690614ef2565b8015611b235780601f10611af857610100808354040283529160200191611b23565b820191906000526020600020905b815481529060010190602001808311611b0657829003601f168201915b5050505050905090565b60606000611b3a83611dc4565b905080604051602001611b4d9190614432565b604051602081830303815290604052915050919050565b601060029054906101000a900460ff1681565b80600081118015611b8a5750600e548111155b611bc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc0906146aa565b60405180910390fd5b600d5481611bd76008612602565b611be19190614ac8565b1115611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c19906148ea565b60405180910390fd5b601060009054906101000a900460ff1615611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c699061484a565b60405180910390fd5b601060029054906101000a900460ff1615611cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb99061492a565b60405180910390fd5b81600c54611cd09190614d28565b341015611d12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d099061496a565b60405180910390fd5b611d1c3383612b34565b5050565b611d32611d2b612541565b8383612c8f565b5050565b600b8054611d4390614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054611d6f90614ef2565b8015611dbc5780601f10611d9157610100808354040283529160200191611dbc565b820191906000526020600020905b815481529060010190602001808311611d9f57829003601f168201915b505050505081565b600080611dd7611dd2610fa1565b612047565b90506000611dee8483612b0d90919063ffffffff16565b90508092505050919050565b611e02612541565b73ffffffffffffffffffffffffffffffffffffffff16611e20611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d9061482a565b60405180910390fd5b80600e8190555050565b611e91611e8b612541565b83612610565b611ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec79061490a565b60405180910390fd5b611edc84848484612dfc565b50505050565b600f5481565b6060611ef3826124d5565b611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f29906148aa565b60405180910390fd5b60001515601060019054906101000a900460ff1615151415611fe057600b8054611f5b90614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8790614ef2565b8015611fd45780601f10611fa957610100808354040283529160200191611fd4565b820191906000526020600020905b815481529060010190602001808311611fb757829003601f168201915b5050505050905061203c565b6000611fea612e58565b9050600081511161200a5760405180602001604052806000815250612038565b8061201484612eea565b600a6040516020016120289392919061444d565b6040516020818303038152906040525b9150505b919050565b600d5481565b6000808290506120578151612eea565b8160405160200161206992919061447e565b60405160208183030381529060405280519060200120915050919050565b61208f612541565b73ffffffffffffffffffffffffffffffffffffffff166120ad611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa9061482a565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156121c75750600e548111155b612206576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fd906146aa565b60405180910390fd5b600d54816122146008612602565b61221e9190614ac8565b111561225f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612256906148ea565b60405180910390fd5b612267612541565b73ffffffffffffffffffffffffffffffffffffffff16612285611a6b565b73ffffffffffffffffffffffffffffffffffffffff16146122db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d29061482a565b60405180910390fd5b6122e58284612b34565b505050565b6122f2612541565b73ffffffffffffffffffffffffffffffffffffffff16612310611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614612366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235d9061482a565b60405180910390fd5b6123703382612b34565b50565b61237b612541565b73ffffffffffffffffffffffffffffffffffffffff16612399611a6b565b73ffffffffffffffffffffffffffffffffffffffff16146123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e69061482a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561245f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124569061466a565b60405180910390fd5b61246881612bc9565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166125bc836117e3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061261b826124d5565b61265a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126519061474a565b60405180910390fd5b6000612665836117e3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806126d457508373ffffffffffffffffffffffffffffffffffffffff166126bc84610c46565b73ffffffffffffffffffffffffffffffffffffffff16145b806126e557506126e48185612120565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661270e826117e3565b73ffffffffffffffffffffffffffffffffffffffff1614612764576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275b9061486a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cb906146ea565b60405180910390fd5b6127df83838361304b565b6127ea600082612549565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461283a9190614dbd565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128919190614ac8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000602867ffffffffffffffff811115612969576129686150de565b5b6040519080825280601f01601f19166020018201604052801561299b5781602001600182028036833780820191505090505b50905060005b6014811015612b035760008160136129b99190614dbd565b60086129c59190614d28565b60026129d19190614c0a565b8573ffffffffffffffffffffffffffffffffffffffff166129f29190614b55565b60f81b9050600060108260f81c612a099190614b86565b60f81b905060008160f81c6010612a209190614d82565b8360f81c612a2e9190614df1565b60f81b9050612a3c82613050565b85856002612a4a9190614d28565b81518110612a5b57612a5a6150af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a9381613050565b856001866002612aa39190614d28565b612aad9190614ac8565b81518110612abe57612abd6150af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505050508080612afb90614f55565b9150506129a1565b5080915050919050565b6000806000612b1c8585613093565b91509150612b2981613116565b819250505092915050565b60005b81811015612bc457601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190612b8f90614f55565b9190505550612b9e60086132eb565b612bb183612bac6008612602565b613301565b8080612bbc90614f55565b915050612b37565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cf59061470a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612def919061454b565b60405180910390a3505050565b612e078484846126ee565b612e138484848461331f565b612e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e499061464a565b60405180910390fd5b50505050565b606060098054612e6790614ef2565b80601f0160208091040260200160405190810160405280929190818152602001828054612e9390614ef2565b8015612ee05780601f10612eb557610100808354040283529160200191612ee0565b820191906000526020600020905b815481529060010190602001808311612ec357829003601f168201915b5050505050905090565b60606000821415612f32576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613046565b600082905060005b60008214612f64578080612f4d90614f55565b915050600a82612f5d9190614b55565b9150612f3a565b60008167ffffffffffffffff811115612f8057612f7f6150de565b5b6040519080825280601f01601f191660200182016040528015612fb25781602001600182028036833780820191505090505b5090505b6000851461303f57600182612fcb9190614dbd565b9150600a85612fda9190614fc2565b6030612fe69190614ac8565b60f81b818381518110612ffc57612ffb6150af565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130389190614b55565b9450612fb6565b8093505050505b919050565b505050565b6000600a8260f81c60ff16106130785760578260f81c6130709190614b1e565b60f81b61308c565b60308260f81c6130889190614b1e565b60f81b5b9050919050565b6000806041835114156130d55760008060006020860151925060408601519150606086015160001a90506130c9878285856134b6565b9450945050505061310f565b6040835114156131065760008060208501519150604085015190506130fb8683836135c3565b93509350505061310f565b60006002915091505b9250929050565b6000600481111561312a57613129615051565b5b81600481111561313d5761313c615051565b5b1415613148576132e8565b6001600481111561315c5761315b615051565b5b81600481111561316f5761316e615051565b5b14156131b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a79061460a565b60405180910390fd5b600260048111156131c4576131c3615051565b5b8160048111156131d7576131d6615051565b5b1415613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320f9061462a565b60405180910390fd5b6003600481111561322c5761322b615051565b5b81600481111561323f5761323e615051565b5b1415613280576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132779061472a565b60405180910390fd5b60048081111561329357613292615051565b5b8160048111156132a6576132a5615051565b5b14156132e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132de906147ca565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b61331b828260405180602001604052806000815250613611565b5050565b60006133408473ffffffffffffffffffffffffffffffffffffffff1661366c565b156134a9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613369612541565b8786866040518563ffffffff1660e01b815260040161338b94939291906144dd565b602060405180830381600087803b1580156133a557600080fd5b505af19250505080156133d657506040513d601f19601f820116820180604052508101906133d39190613c56565b60015b613459573d8060008114613406576040519150601f19603f3d011682016040523d82523d6000602084013e61340b565b606091505b50600081511415613451576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134489061464a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134ae565b600190505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134f15760006003915091506135ba565b601b8560ff16141580156135095750601c8560ff1614155b1561351b5760006004915091506135ba565b6000600187878787604051600081526020016040526040516135409493929190614581565b6020604051602081039080840390855afa158015613562573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135b1576000600192509250506135ba565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c019050613603878288856134b6565b935093505050935093915050565b61361b838361367f565b613628600084848461331f565b613667576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365e9061464a565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e6906147ea565b60405180910390fd5b6136f8816124d5565b15613738576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372f9061468a565b60405180910390fd5b6137446000838361304b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137949190614ac8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461385990614ef2565b90600052602060002090601f01602090048101928261387b57600085556138c2565b82601f1061389457805160ff19168380011785556138c2565b828001600101855582156138c2579182015b828111156138c15782518255916020019190600101906138a6565b5b5090506138cf91906138d3565b5090565b5b808211156138ec5760008160009055506001016138d4565b5090565b60006139036138fe846149ca565b6149a5565b90508281526020810184848401111561391f5761391e615112565b5b61392a848285614eb0565b509392505050565b6000613945613940846149fb565b6149a5565b90508281526020810184848401111561396157613960615112565b5b61396c848285614eb0565b509392505050565b60008135905061398381615808565b92915050565b6000813590506139988161581f565b92915050565b6000813590506139ad81615836565b92915050565b6000815190506139c281615836565b92915050565b600082601f8301126139dd576139dc61510d565b5b81356139ed8482602086016138f0565b91505092915050565b600082601f830112613a0b57613a0a61510d565b5b8135613a1b848260208601613932565b91505092915050565b600081359050613a338161584d565b92915050565b600060208284031215613a4f57613a4e61511c565b5b6000613a5d84828501613974565b91505092915050565b60008060408385031215613a7d57613a7c61511c565b5b6000613a8b85828601613974565b9250506020613a9c85828601613974565b9150509250929050565b600080600060608486031215613abf57613abe61511c565b5b6000613acd86828701613974565b9350506020613ade86828701613974565b9250506040613aef86828701613a24565b9150509250925092565b60008060008060808587031215613b1357613b1261511c565b5b6000613b2187828801613974565b9450506020613b3287828801613974565b9350506040613b4387828801613a24565b925050606085013567ffffffffffffffff811115613b6457613b63615117565b5b613b70878288016139c8565b91505092959194509250565b60008060408385031215613b9357613b9261511c565b5b6000613ba185828601613974565b9250506020613bb285828601613989565b9150509250929050565b60008060408385031215613bd357613bd261511c565b5b6000613be185828601613974565b9250506020613bf285828601613a24565b9150509250929050565b600060208284031215613c1257613c1161511c565b5b6000613c2084828501613989565b91505092915050565b600060208284031215613c3f57613c3e61511c565b5b6000613c4d8482850161399e565b91505092915050565b600060208284031215613c6c57613c6b61511c565b5b6000613c7a848285016139b3565b91505092915050565b600060208284031215613c9957613c9861511c565b5b600082013567ffffffffffffffff811115613cb757613cb6615117565b5b613cc3848285016139c8565b91505092915050565b60008060408385031215613ce357613ce261511c565b5b600083013567ffffffffffffffff811115613d0157613d00615117565b5b613d0d858286016139c8565b9250506020613d1e85828601613a24565b9150509250929050565b600060208284031215613d3e57613d3d61511c565b5b600082013567ffffffffffffffff811115613d5c57613d5b615117565b5b613d68848285016139f6565b91505092915050565b600060208284031215613d8757613d8661511c565b5b6000613d9584828501613a24565b91505092915050565b60008060408385031215613db557613db461511c565b5b6000613dc385828601613a24565b9250506020613dd485828601613974565b9150509250929050565b6000613dea8383614405565b60208301905092915050565b613dff81614e25565b82525050565b613e16613e1182614e25565b614f9e565b82525050565b6000613e2782614a51565b613e318185614a7f565b9350613e3c83614a2c565b8060005b83811015613e6d578151613e548882613dde565b9750613e5f83614a72565b925050600181019050613e40565b5085935050505092915050565b613e8381614e37565b82525050565b613e9281614e43565b82525050565b6000613ea382614a5c565b613ead8185614a90565b9350613ebd818560208601614ebf565b613ec681615121565b840191505092915050565b6000613edc82614a5c565b613ee68185614aa1565b9350613ef6818560208601614ebf565b80840191505092915050565b6000613f0d82614a67565b613f178185614aac565b9350613f27818560208601614ebf565b613f3081615121565b840191505092915050565b6000613f4682614a67565b613f508185614abd565b9350613f60818560208601614ebf565b80840191505092915050565b60008154613f7981614ef2565b613f838186614abd565b94506001821660008114613f9e5760018114613faf57613fe2565b60ff19831686528186019350613fe2565b613fb885614a3c565b60005b83811015613fda57815481890152600182019150602081019050613fbb565b838801955050505b50505092915050565b6000613ff8601883614aac565b91506140038261514c565b602082019050919050565b600061401b601f83614aac565b915061402682615175565b602082019050919050565b600061403e603283614aac565b91506140498261519e565b604082019050919050565b6000614061602683614aac565b915061406c826151ed565b604082019050919050565b6000614084601c83614aac565b915061408f8261523c565b602082019050919050565b60006140a7601483614aac565b91506140b282615265565b602082019050919050565b60006140ca601c83614aac565b91506140d58261528e565b602082019050919050565b60006140ed602483614aac565b91506140f8826152b7565b604082019050919050565b6000614110601983614aac565b915061411b82615306565b602082019050919050565b6000614133602283614aac565b915061413e8261532f565b604082019050919050565b6000614156602c83614aac565b91506141618261537e565b604082019050919050565b6000614179603883614aac565b9150614184826153cd565b604082019050919050565b600061419c602a83614aac565b91506141a78261541c565b604082019050919050565b60006141bf602983614aac565b91506141ca8261546b565b604082019050919050565b60006141e2602283614aac565b91506141ed826154ba565b604082019050919050565b6000614205602083614aac565b915061421082615509565b602082019050919050565b6000614228602c83614aac565b915061423382615532565b604082019050919050565b600061424b602083614aac565b915061425682615581565b602082019050919050565b600061426e601a83614abd565b9150614279826155aa565b601a82019050919050565b6000614291601783614aac565b915061429c826155d3565b602082019050919050565b60006142b4602983614aac565b91506142bf826155fc565b604082019050919050565b60006142d7601583614aac565b91506142e28261564b565b602082019050919050565b60006142fa602f83614aac565b915061430582615674565b604082019050919050565b600061431d602183614aac565b9150614328826156c3565b604082019050919050565b6000614340600083614aa1565b915061434b82615712565b600082019050919050565b6000614363601483614aac565b915061436e82615715565b602082019050919050565b6000614386603183614aac565b91506143918261573e565b604082019050919050565b60006143a9601683614aac565b91506143b48261578d565b602082019050919050565b60006143cc601b83614aac565b91506143d7826157b6565b602082019050919050565b60006143ef601383614aac565b91506143fa826157df565b602082019050919050565b61440e81614e99565b82525050565b61441d81614e99565b82525050565b61442c81614ea3565b82525050565b600061443e8284613e05565b60148201915081905092915050565b60006144598286613f3b565b91506144658285613f3b565b91506144718284613f6c565b9150819050949350505050565b600061448982614261565b91506144958285613f3b565b91506144a18284613ed1565b91508190509392505050565b60006144b882614333565b9150819050919050565b60006020820190506144d76000830184613df6565b92915050565b60006080820190506144f26000830187613df6565b6144ff6020830186613df6565b61450c6040830185614414565b818103606083015261451e8184613e98565b905095945050505050565b600060208201905081810360008301526145438184613e1c565b905092915050565b60006020820190506145606000830184613e7a565b92915050565b600060208201905061457b6000830184613e89565b92915050565b60006080820190506145966000830187613e89565b6145a36020830186614423565b6145b06040830185613e89565b6145bd6060830184613e89565b95945050505050565b600060208201905081810360008301526145e08184613e98565b905092915050565b600060208201905081810360008301526146028184613f02565b905092915050565b6000602082019050818103600083015261462381613feb565b9050919050565b600060208201905081810360008301526146438161400e565b9050919050565b6000602082019050818103600083015261466381614031565b9050919050565b6000602082019050818103600083015261468381614054565b9050919050565b600060208201905081810360008301526146a381614077565b9050919050565b600060208201905081810360008301526146c38161409a565b9050919050565b600060208201905081810360008301526146e3816140bd565b9050919050565b60006020820190508181036000830152614703816140e0565b9050919050565b6000602082019050818103600083015261472381614103565b9050919050565b6000602082019050818103600083015261474381614126565b9050919050565b6000602082019050818103600083015261476381614149565b9050919050565b600060208201905081810360008301526147838161416c565b9050919050565b600060208201905081810360008301526147a38161418f565b9050919050565b600060208201905081810360008301526147c3816141b2565b9050919050565b600060208201905081810360008301526147e3816141d5565b9050919050565b60006020820190508181036000830152614803816141f8565b9050919050565b600060208201905081810360008301526148238161421b565b9050919050565b600060208201905081810360008301526148438161423e565b9050919050565b6000602082019050818103600083015261486381614284565b9050919050565b60006020820190508181036000830152614883816142a7565b9050919050565b600060208201905081810360008301526148a3816142ca565b9050919050565b600060208201905081810360008301526148c3816142ed565b9050919050565b600060208201905081810360008301526148e381614310565b9050919050565b6000602082019050818103600083015261490381614356565b9050919050565b6000602082019050818103600083015261492381614379565b9050919050565b600060208201905081810360008301526149438161439c565b9050919050565b60006020820190508181036000830152614963816143bf565b9050919050565b60006020820190508181036000830152614983816143e2565b9050919050565b600060208201905061499f6000830184614414565b92915050565b60006149af6149c0565b90506149bb8282614f24565b919050565b6000604051905090565b600067ffffffffffffffff8211156149e5576149e46150de565b5b6149ee82615121565b9050602081019050919050565b600067ffffffffffffffff821115614a1657614a156150de565b5b614a1f82615121565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614ad382614e99565b9150614ade83614e99565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b1357614b12614ff3565b5b828201905092915050565b6000614b2982614ea3565b9150614b3483614ea3565b92508260ff03821115614b4a57614b49614ff3565b5b828201905092915050565b6000614b6082614e99565b9150614b6b83614e99565b925082614b7b57614b7a615022565b5b828204905092915050565b6000614b9182614ea3565b9150614b9c83614ea3565b925082614bac57614bab615022565b5b828204905092915050565b6000808291508390505b6001851115614c0157808604811115614bdd57614bdc614ff3565b5b6001851615614bec5780820291505b8081029050614bfa8561513f565b9450614bc1565b94509492505050565b6000614c1582614e99565b9150614c2083614e99565b9250614c4d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614c55565b905092915050565b600082614c655760019050614d21565b81614c735760009050614d21565b8160018114614c895760028114614c9357614cc2565b6001915050614d21565b60ff841115614ca557614ca4614ff3565b5b8360020a915084821115614cbc57614cbb614ff3565b5b50614d21565b5060208310610133831016604e8410600b8410161715614cf75782820a905083811115614cf257614cf1614ff3565b5b614d21565b614d048484846001614bb7565b92509050818404811115614d1b57614d1a614ff3565b5b81810290505b9392505050565b6000614d3382614e99565b9150614d3e83614e99565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d7757614d76614ff3565b5b828202905092915050565b6000614d8d82614ea3565b9150614d9883614ea3565b92508160ff0483118215151615614db257614db1614ff3565b5b828202905092915050565b6000614dc882614e99565b9150614dd383614e99565b925082821015614de657614de5614ff3565b5b828203905092915050565b6000614dfc82614ea3565b9150614e0783614ea3565b925082821015614e1a57614e19614ff3565b5b828203905092915050565b6000614e3082614e79565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614edd578082015181840152602081019050614ec2565b83811115614eec576000848401525b50505050565b60006002820490506001821680614f0a57607f821691505b60208210811415614f1e57614f1d615080565b5b50919050565b614f2d82615121565b810181811067ffffffffffffffff82111715614f4c57614f4b6150de565b5b80604052505050565b6000614f6082614e99565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f9357614f92614ff3565b5b600182019050919050565b6000614fa982614fb0565b9050919050565b6000614fbb82615132565b9050919050565b6000614fcd82614e99565b9150614fd883614e99565b925082614fe857614fe7615022565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160011c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f6d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a000000000000600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206d6f6465206973206163746976650000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f50726573616c65206d6f64652069732061637469766500000000000000000000600082015250565b7f496e76616c69642077686974656c697374207369676e61747572650000000000600082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61581181614e25565b811461581c57600080fd5b50565b61582881614e37565b811461583357600080fd5b50565b61583f81614e4d565b811461584a57600080fd5b50565b61585681614e99565b811461586157600080fd5b5056fea264697066735822122016ec2aa0cf2da88ce4e3cd70deb507fee4604fcf41d71c0121c384a19de33bdd64736f6c63430008070033

Deployed Bytecode Sourcemap

48384:4650:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36227:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37145:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38656:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38194:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48669:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52270:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52372:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49435:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48919:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39383:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25820:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52451:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52548:134;;;;;;;;;;;;;:::i;:::-;;25144:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39779:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50649:612;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51826:72;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49527:543;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52034:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48849:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48594:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48819:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48562:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36848:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36586:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15363:101;;;;;;;;;;;;;:::i;:::-;;52168:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14731:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48736:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37307:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24719:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48880:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50074:303;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38940:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48631:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24909:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51902:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40024:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48777:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51265:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48702:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25552:264;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51743:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39159:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50491:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50381:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15613:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36227:300;36329:4;36379:25;36364:40;;;:11;:40;;;;:104;;;;36435:33;36420:48;;;:11;:48;;;;36364:104;:156;;;;36484:36;36508:11;36484:23;:36::i;:::-;36364:156;36345:175;;36227:300;;;:::o;37145:98::-;37199:13;37231:5;37224:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37145:98;:::o;38656:217::-;38732:7;38759:16;38767:7;38759;:16::i;:::-;38751:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38842:15;:24;38858:7;38842:24;;;;;;;;;;;;;;;;;;;;;38835:31;;38656:217;;;:::o;38194:401::-;38274:13;38290:23;38305:7;38290:14;:23::i;:::-;38274:39;;38337:5;38331:11;;:2;:11;;;;38323:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38428:5;38412:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38437:37;38454:5;38461:12;:10;:12::i;:::-;38437:16;:37::i;:::-;38412:62;38391:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;38567:21;38576:2;38580:7;38567:8;:21::i;:::-;38264:331;38194:401;;:::o;48669:29::-;;;;:::o;52270:98::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52353:10:::1;52341:9;:22;;;;;;;;;;;;:::i;:::-;;52270:98:::0;:::o;52372:75::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52436:6:::1;52427;;:15;;;;;;;;;;;;;;;;;;52372:75:::0;:::o;49435:87::-;49479:7;49501:16;:6;:14;:16::i;:::-;49494:23;;49435:87;:::o;48919:55::-;;;;;;;;;;;;;;;;;:::o;39383:330::-;39572:41;39591:12;:10;:12::i;:::-;39605:7;39572:18;:41::i;:::-;39564:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39678:28;39688:4;39694:2;39698:7;39678:9;:28::i;:::-;39383:330;;;:::o;25820:102::-;25864:13;25892:25;25906:10;25892:13;:25::i;:::-;25885:32;;25820:102;:::o;52451:93::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52533:6:::1;52515:15;;:24;;;;;;;;;;;;;;;;;;52451:93:::0;:::o;52548:134::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52592:7:::1;52613;:5;:7::i;:::-;52605:21;;52634;52605:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52591:69;;;52674:2;52666:11;;;::::0;::::1;;52585:97;52548:134::o:0;25144:115::-;25195:7;25217:37;25240:13;:11;:13::i;:::-;25217:22;:37::i;:::-;25210:44;;25144:115;:::o;39779:179::-;39912:39;39929:4;39935:2;39939:7;39912:39;;;;;;;;;;;;:16;:39::i;:::-;39779:179;;;:::o;50649:612::-;50721:16;50747:23;50773:17;50783:6;50773:9;:17::i;:::-;50747:43;;50796:30;50843:15;50829:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50796:63;;50865:22;50890:1;50865:26;;50897:23;50931:299;50956:15;50938;:33;:64;;;;;50993:9;;50975:14;:27;;50938:64;50931:299;;;51012:25;51040:23;51048:14;51040:7;:23::i;:::-;51012:51;;51097:6;51076:27;;:17;:27;;;51072:127;;;51148:14;51115:13;51129:15;51115:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;51173:17;;;;;:::i;:::-;;;;51072:127;51207:16;;;;;:::i;:::-;;;;51004:226;50931:299;;;51243:13;51236:20;;;;;;50649:612;;;:::o;51826:72::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51888:5:::1;51881:4;:12;;;;51826:72:::0;:::o;49527:543::-;49632:11;49274:1;49260:11;:15;:52;;;;;49294:18;;49279:11;:33;;49260:52;49252:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49385:9;;49370:11;49351:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;49343:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;49673:9:::1;24527:19;24549:37;24572:13;:11;:13::i;:::-;24549:22;:37::i;:::-;24527:59;;24592:14;24609:30;24629:9;24609:11;:19;;:30;;;;:::i;:::-;24592:47;;24664:7;;;;;;;;;;;24654:17;;:6;:17;;;24646:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49701:6:::2;;;;;;;;;;;49700:7;49692:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49749:15;;;;;;;;;;;49741:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;49824:11;49817:4;;:18;;;;:::i;:::-;49804:9;:31;;49796:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49866:24;49893:20;:32;49914:10;49893:32;;;;;;;;;;;;;;;;49866:59;;49973:18;;49958:11;49939:16;:30;;;;:::i;:::-;:52;;49931:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;50031:34;50041:10;50053:11;50031:9;:34::i;:::-;49686:384;24521:194:::1;;49425:1;49527:543:::0;;;:::o;52034:130::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52141:18:::1;52121:17;:38;;;;;;;;;;;;:::i;:::-;;52034:130:::0;:::o;48849:27::-;;;;;;;;;;;;;:::o;48594:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48819:26::-;;;;;;;;;;;;;:::o;48562:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36848:235::-;36920:7;36939:13;36955:7;:16;36963:7;36955:16;;;;;;;;;;;;;;;;;;;;;36939:32;;37006:1;36989:19;;:5;:19;;;;36981:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37071:5;37064:12;;;36848:235;;;:::o;36586:205::-;36658:7;36702:1;36685:19;;:5;:19;;;;36677:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36768:9;:16;36778:5;36768:16;;;;;;;;;;;;;;;;36761:23;;36586:205;;;:::o;15363:101::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15427:30:::1;15454:1;15427:18;:30::i;:::-;15363:101::o:0;52168:98::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52251:10:::1;52239:9;:22;;;;;;;;;;;;:::i;:::-;;52168:98:::0;:::o;14731:85::-;14777:7;14803:6;;;;;;;;;;;14796:13;;14731:85;:::o;48736:37::-;;;;:::o;37307:102::-;37363:13;37395:7;37388:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37307:102;:::o;24719:186::-;24790:12;24810:23;24836:18;24844:9;24836:7;:18::i;:::-;24810:44;;24884:15;24867:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;24860:40;;;24719:186;;;:::o;48880:34::-;;;;;;;;;;;;;:::o;50074:303::-;50139:11;49274:1;49260:11;:15;:52;;;;;49294:18;;49279:11;:33;;49260:52;49252:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49385:9;;49370:11;49351:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;49343:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;50167:6:::1;;;;;;;;;;;50166:7;50158:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;50216:15;;;;;;;;;;;50215:16;50207:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50292:11;50285:4;;:18;;;;:::i;:::-;50272:9;:31;;50264:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;50338:34;50348:10;50360:11;50338:9;:34::i;:::-;50074:303:::0;;:::o;38940:153::-;39034:52;39053:12;:10;:12::i;:::-;39067:8;39077;39034:18;:52::i;:::-;38940:153;;:::o;48631:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24909:231::-;24971:7;24986:19;25008:37;25031:13;:11;:13::i;:::-;25008:22;:37::i;:::-;24986:59;;25051:23;25077:30;25097:9;25077:11;:19;;:30;;;;:::i;:::-;25051:56;;25120:15;25113:22;;;;24909:231;;;:::o;51902:128::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52006:19:::1;51985:18;:40;;;;51902:128:::0;:::o;40024:320::-;40193:41;40212:12;:10;:12::i;:::-;40226:7;40193:18;:41::i;:::-;40185:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40298:39;40312:4;40318:2;40322:7;40331:5;40298:13;:39::i;:::-;40024:320;;;;:::o;48777:37::-;;;;:::o;51265:474::-;51359:13;51397:17;51405:8;51397:7;:17::i;:::-;51382:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;51500:5;51488:17;;:8;;;;;;;;;;;:17;;;51484:62;;;51522:17;51515:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51484:62;51552:28;51583:10;:8;:10::i;:::-;51552:41;;51637:1;51612:14;51606:28;:32;:128;;;;;;;;;;;;;;;;;51673:14;51689:19;:8;:17;:19::i;:::-;51710:9;51656:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51606:128;51599:135;;;51265:474;;;;:::o;48702:30::-;;;;:::o;25552:264::-;25622:7;25637:14;25660:1;25637:25;;25760:26;25777:1;:8;25760:16;:26::i;:::-;25796:1;25692:113;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25675:136;;;;;;25668:143;;;25552:264;;;:::o;51743:79::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51811:6:::1;51800:8;;:17;;;;;;;;;;;;;;;;;;51743:79:::0;:::o;39159:162::-;39256:4;39279:18;:25;39298:5;39279:25;;;;;;;;;;;;;;;:35;39305:8;39279:35;;;;;;;;;;;;;;;;;;;;;;;;;39272:42;;39159:162;;;;:::o;50491:153::-;50577:11;49274:1;49260:11;:15;:52;;;;;49294:18;;49279:11;:33;;49260:52;49252:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;49385:9;;49370:11;49351:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;49343:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;14954:12:::1;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50606:33:::2;50616:9;50627:11;50606:9;:33::i;:::-;50491:153:::0;;;:::o;50381:104::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50446:34:::1;50456:10;50468:11;50446:9;:34::i;:::-;50381:104:::0;:::o;15613:198::-;14954:12;:10;:12::i;:::-;14943:23;;:7;:5;:7::i;:::-;:23;;;14935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15721:1:::1;15701:22;;:8;:22;;;;15693:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15776:28;15795:8;15776:18;:28::i;:::-;15613:198:::0;:::o;29227:155::-;29312:4;29350:25;29335:40;;;:11;:40;;;;29328:47;;29227:155;;;:::o;41816:125::-;41881:4;41932:1;41904:30;;:7;:16;41912:7;41904:16;;;;;;;;;;;;;;;;;;;;;:30;;;;41897:37;;41816:125;;;:::o;13499:96::-;13552:7;13578:10;13571:17;;13499:96;:::o;45667:171::-;45768:2;45741:15;:24;45757:7;45741:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45823:7;45819:2;45785:46;;45794:23;45809:7;45794:14;:23::i;:::-;45785:46;;;;;;;;;;;;45667:171;;:::o;884:112::-;949:7;975;:14;;;968:21;;884:112;;;:::o;42099:344::-;42192:4;42216:16;42224:7;42216;:16::i;:::-;42208:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42291:13;42307:23;42322:7;42307:14;:23::i;:::-;42291:39;;42359:5;42348:16;;:7;:16;;;:51;;;;42392:7;42368:31;;:20;42380:7;42368:11;:20::i;:::-;:31;;;42348:51;:87;;;;42403:32;42420:5;42427:7;42403:16;:32::i;:::-;42348:87;42340:96;;;42099:344;;;;:::o;44996:560::-;45150:4;45123:31;;:23;45138:7;45123:14;:23::i;:::-;:31;;;45115:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;45232:1;45218:16;;:2;:16;;;;45210:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45286:39;45307:4;45313:2;45317:7;45286:20;:39::i;:::-;45387:29;45404:1;45408:7;45387:8;:29::i;:::-;45446:1;45427:9;:15;45437:4;45427:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;45474:1;45457:9;:13;45467:2;45457:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45504:2;45485:7;:16;45493:7;45485:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45541:7;45537:2;45522:27;;45531:4;45522:27;;;;;;;;;;;;44996:560;;;:::o;25926:411::-;25983:13;26004:14;26031:2;26021:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26004:30;;26046:9;26041:269;26065:2;26061:1;:6;26041:269;;;26082:8;26145:1;26140:2;:6;;;;:::i;:::-;26135:1;:12;;;;:::i;:::-;26129:1;:19;;;;:::i;:::-;26122:1;26106:19;;:43;;;;:::i;:::-;26093:58;;26082:69;;26159:9;26189:2;26184:1;26178:8;;:13;;;;:::i;:::-;26171:21;;26159:33;;26200:9;26241:2;26235:9;;26230:2;:14;;;;:::i;:::-;26225:1;26219:8;;:25;;;;:::i;:::-;26212:33;;26200:45;;26264:8;26269:2;26264:4;:8::i;:::-;26253:1;26259;26255;:5;;;;:::i;:::-;26253:8;;;;;;;;:::i;:::-;;;;;:19;;;;;;;;;;;26295:8;26300:2;26295:4;:8::i;:::-;26280:1;26290;26286;26282;:5;;;;:::i;:::-;:9;;;;:::i;:::-;26280:12;;;;;;;;:::i;:::-;;;;;:23;;;;;;;;;;;26074:236;;;26069:3;;;;;:::i;:::-;;;;26041:269;;;;26330:1;26316:16;;;25926:411;;;:::o;7808:227::-;7886:7;7906:17;7925:18;7947:27;7958:4;7964:9;7947:10;:27::i;:::-;7905:69;;;;7984:18;7996:5;7984:11;:18::i;:::-;8019:9;8012:16;;;;7808:227;;;;:::o;52686:240::-;52765:9;52760:162;52784:11;52780:1;:15;52760:162;;;52810:20;:31;52831:9;52810:31;;;;;;;;;;;;;;;;:33;;;;;;;;;:::i;:::-;;;;;;52851:18;:6;:16;:18::i;:::-;52877:38;52887:9;52898:16;:6;:14;:16::i;:::-;52877:9;:38::i;:::-;52797:3;;;;;:::i;:::-;;;;52760:162;;;;52686:240;;:::o;15965:187::-;16038:16;16057:6;;;;;;;;;;;16038:25;;16082:8;16073:6;;:17;;;;;;;;;;;;;;;;;;16136:8;16105:40;;16126:8;16105:40;;;;;;;;;;;;16028:124;15965:187;:::o;45973:307::-;46123:8;46114:17;;:5;:17;;;;46106:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46209:8;46171:18;:25;46190:5;46171:25;;;;;;;;;;;;;;;:35;46197:8;46171:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;46254:8;46232:41;;46247:5;46232:41;;;46264:8;46232:41;;;;;;:::i;:::-;;;;;;;;45973:307;;;:::o;41206:::-;41357:28;41367:4;41373:2;41377:7;41357:9;:28::i;:::-;41403:48;41426:4;41432:2;41436:7;41445:5;41403:22;:48::i;:::-;41395:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41206:307;;;;:::o;52930:102::-;52990:13;53018:9;53011:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52930:102;:::o;1803:703::-;1859:13;2085:1;2076:5;:10;2072:51;;;2102:10;;;;;;;;;;;;;;;;;;;;;2072:51;2132:12;2147:5;2132:20;;2162:14;2186:75;2201:1;2193:4;:9;2186:75;;2218:8;;;;;:::i;:::-;;;;2248:2;2240:10;;;;;:::i;:::-;;;2186:75;;;2270:19;2302:6;2292:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2270:39;;2319:150;2335:1;2326:5;:10;2319:150;;2362:1;2352:11;;;;;:::i;:::-;;;2428:2;2420:5;:10;;;;:::i;:::-;2407:2;:24;;;;:::i;:::-;2394:39;;2377:6;2384;2377:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2456:2;2447:11;;;;;:::i;:::-;;;2319:150;;;2492:6;2478:21;;;;;1803:703;;;;:::o;48167:122::-;;;;:::o;26341:154::-;26388:8;26423:2;26418:1;26412:8;;:13;;;26411:79;;26485:4;26480:1;26474:8;;:15;;;;:::i;:::-;26467:23;;26411:79;;;26453:4;26448:1;26442:8;;:15;;;;:::i;:::-;26435:23;;26411:79;26404:86;;26341:154;;;:::o;5743:1279::-;5824:7;5833:12;6074:2;6054:9;:16;:22;6050:966;;;6092:9;6115;6138:7;6343:4;6332:9;6328:20;6322:27;6317:32;;6392:4;6381:9;6377:20;6371:27;6366:32;;6449:4;6438:9;6434:20;6428:27;6425:1;6420:36;6415:41;;6490:25;6501:4;6507:1;6510;6513;6490:10;:25::i;:::-;6483:32;;;;;;;;;6050:966;6556:2;6536:9;:16;:22;6532:484;;;6574:9;6597:10;6805:4;6794:9;6790:20;6784:27;6779:32;;6855:4;6844:9;6840:20;6834:27;6828:33;;6895:23;6906:4;6912:1;6915:2;6895:10;:23::i;:::-;6888:30;;;;;;;;6532:484;6965:1;6969:35;6949:56;;;;5743:1279;;;;;;:::o;4048:631::-;4125:20;4116:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;4112:561;;;4161:7;;4112:561;4221:29;4212:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;4208:465;;;4266:34;;;;;;;;;;:::i;:::-;;;;;;;;4208:465;4330:35;4321:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;4317:356;;;4381:41;;;;;;;;;;:::i;:::-;;;;;;;;4317:356;4452:30;4443:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;4439:234;;;4498:44;;;;;;;;;;:::i;:::-;;;;;;;;4439:234;4572:30;4563:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;4559:114;;;4618:44;;;;;;;;;;:::i;:::-;;;;;;;;4559:114;4048:631;;:::o;1002:123::-;1107:1;1089:7;:14;;;:19;;;;;;;;;;;1002:123;:::o;42773:108::-;42848:26;42858:2;42862:7;42848:26;;;;;;;;;;;;:9;:26::i;:::-;42773:108;;:::o;46833:778::-;46983:4;47003:15;:2;:13;;;:15::i;:::-;46999:606;;;47054:2;47038:36;;;47075:12;:10;:12::i;:::-;47089:4;47095:7;47104:5;47038:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47034:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47294:1;47277:6;:13;:18;47273:266;;;47319:60;;;;;;;;;;:::i;:::-;;;;;;;;47273:266;47491:6;47485:13;47476:6;47472:2;47468:15;47461:38;47034:519;47170:41;;;47160:51;;;:6;:51;;;;47153:58;;;;;46999:606;47590:4;47583:11;;46833:778;;;;;;;:::o;9259:1603::-;9385:7;9394:12;10309:66;10304:1;10296:10;;:79;10292:161;;;10407:1;10411:30;10391:51;;;;;;10292:161;10471:2;10466:1;:7;;;;:18;;;;;10482:2;10477:1;:7;;;;10466:18;10462:100;;;10516:1;10520:30;10500:51;;;;;;10462:100;10656:14;10673:24;10683:4;10689:1;10692;10695;10673:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10656:41;;10729:1;10711:20;;:6;:20;;;10707:101;;;10763:1;10767:29;10747:50;;;;;;;10707:101;10826:6;10834:20;10818:37;;;;;9259:1603;;;;;;;;:::o;8289:379::-;8399:7;8408:12;8432:9;8451:7;8504:66;8500:2;8496:75;8491:80;;8607:2;8602;8597:3;8593:12;8589:21;8584:26;;8636:25;8647:4;8653:1;8656;8659;8636:10;:25::i;:::-;8629:32;;;;;;8289:379;;;;;;:::o;43102:311::-;43227:18;43233:2;43237:7;43227:5;:18::i;:::-;43276:54;43307:1;43311:2;43315:7;43324:5;43276:22;:54::i;:::-;43255:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;43102:311;;;:::o;16948:377::-;17008:4;17211:12;17276:7;17264:20;17256:28;;17317:1;17310:4;:8;17303:15;;;16948:377;;;:::o;43735:372::-;43828:1;43814:16;;:2;:16;;;;43806:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43886:16;43894:7;43886;:16::i;:::-;43885:17;43877:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43946:45;43975:1;43979:2;43983:7;43946:20;:45::i;:::-;44019:1;44002:9;:13;44012:2;44002:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44049:2;44030:7;:16;44038:7;44030:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44092:7;44088:2;44067:33;;44084:1;44067:33;;;;;;;;;;;;43735:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:2:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:507::-;6705:6;6754:2;6742:9;6733:7;6729:23;6725:32;6722:119;;;6760:79;;:::i;:::-;6722:119;6908:1;6897:9;6893:17;6880:31;6938:18;6930:6;6927:30;6924:117;;;6960:79;;:::i;:::-;6924:117;7065:62;7119:7;7110:6;7099:9;7095:22;7065:62;:::i;:::-;7055:72;;6851:286;6637:507;;;;:::o;7150:652::-;7227:6;7235;7284:2;7272:9;7263:7;7259:23;7255:32;7252:119;;;7290:79;;:::i;:::-;7252:119;7438:1;7427:9;7423:17;7410:31;7468:18;7460:6;7457:30;7454:117;;;7490:79;;:::i;:::-;7454:117;7595:62;7649:7;7640:6;7629:9;7625:22;7595:62;:::i;:::-;7585:72;;7381:286;7706:2;7732:53;7777:7;7768:6;7757:9;7753:22;7732:53;:::i;:::-;7722:63;;7677:118;7150:652;;;;;:::o;7808:509::-;7877:6;7926:2;7914:9;7905:7;7901:23;7897:32;7894:119;;;7932:79;;:::i;:::-;7894:119;8080:1;8069:9;8065:17;8052:31;8110:18;8102:6;8099:30;8096:117;;;8132:79;;:::i;:::-;8096:117;8237:63;8292:7;8283:6;8272:9;8268:22;8237:63;:::i;:::-;8227:73;;8023:287;7808:509;;;;:::o;8323:329::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8557:1;8582:53;8627:7;8618:6;8607:9;8603:22;8582:53;:::i;:::-;8572:63;;8528:117;8323:329;;;;:::o;8658:474::-;8726:6;8734;8783:2;8771:9;8762:7;8758:23;8754:32;8751:119;;;8789:79;;:::i;:::-;8751:119;8909:1;8934:53;8979:7;8970:6;8959:9;8955:22;8934:53;:::i;:::-;8924:63;;8880:117;9036:2;9062:53;9107:7;9098:6;9087:9;9083:22;9062:53;:::i;:::-;9052:63;;9007:118;8658:474;;;;;:::o;9138:179::-;9207:10;9228:46;9270:3;9262:6;9228:46;:::i;:::-;9306:4;9301:3;9297:14;9283:28;;9138:179;;;;:::o;9323:118::-;9410:24;9428:5;9410:24;:::i;:::-;9405:3;9398:37;9323:118;;:::o;9447:157::-;9552:45;9572:24;9590:5;9572:24;:::i;:::-;9552:45;:::i;:::-;9547:3;9540:58;9447:157;;:::o;9640:732::-;9759:3;9788:54;9836:5;9788:54;:::i;:::-;9858:86;9937:6;9932:3;9858:86;:::i;:::-;9851:93;;9968:56;10018:5;9968:56;:::i;:::-;10047:7;10078:1;10063:284;10088:6;10085:1;10082:13;10063:284;;;10164:6;10158:13;10191:63;10250:3;10235:13;10191:63;:::i;:::-;10184:70;;10277:60;10330:6;10277:60;:::i;:::-;10267:70;;10123:224;10110:1;10107;10103:9;10098:14;;10063:284;;;10067:14;10363:3;10356:10;;9764:608;;;9640:732;;;;:::o;10378:109::-;10459:21;10474:5;10459:21;:::i;:::-;10454:3;10447:34;10378:109;;:::o;10493:118::-;10580:24;10598:5;10580:24;:::i;:::-;10575:3;10568:37;10493:118;;:::o;10617:360::-;10703:3;10731:38;10763:5;10731:38;:::i;:::-;10785:70;10848:6;10843:3;10785:70;:::i;:::-;10778:77;;10864:52;10909:6;10904:3;10897:4;10890:5;10886:16;10864:52;:::i;:::-;10941:29;10963:6;10941:29;:::i;:::-;10936:3;10932:39;10925:46;;10707:270;10617:360;;;;:::o;10983:373::-;11087:3;11115:38;11147:5;11115:38;:::i;:::-;11169:88;11250:6;11245:3;11169:88;:::i;:::-;11162:95;;11266:52;11311:6;11306:3;11299:4;11292:5;11288:16;11266:52;:::i;:::-;11343:6;11338:3;11334:16;11327:23;;11091:265;10983:373;;;;:::o;11362:364::-;11450:3;11478:39;11511:5;11478:39;:::i;:::-;11533:71;11597:6;11592:3;11533:71;:::i;:::-;11526:78;;11613:52;11658:6;11653:3;11646:4;11639:5;11635:16;11613:52;:::i;:::-;11690:29;11712:6;11690:29;:::i;:::-;11685:3;11681:39;11674:46;;11454:272;11362:364;;;;:::o;11732:377::-;11838:3;11866:39;11899:5;11866:39;:::i;:::-;11921:89;12003:6;11998:3;11921:89;:::i;:::-;11914:96;;12019:52;12064:6;12059:3;12052:4;12045:5;12041:16;12019:52;:::i;:::-;12096:6;12091:3;12087:16;12080:23;;11842:267;11732:377;;;;:::o;12139:845::-;12242:3;12279:5;12273:12;12308:36;12334:9;12308:36;:::i;:::-;12360:89;12442:6;12437:3;12360:89;:::i;:::-;12353:96;;12480:1;12469:9;12465:17;12496:1;12491:137;;;;12642:1;12637:341;;;;12458:520;;12491:137;12575:4;12571:9;12560;12556:25;12551:3;12544:38;12611:6;12606:3;12602:16;12595:23;;12491:137;;12637:341;12704:38;12736:5;12704:38;:::i;:::-;12764:1;12778:154;12792:6;12789:1;12786:13;12778:154;;;12866:7;12860:14;12856:1;12851:3;12847:11;12840:35;12916:1;12907:7;12903:15;12892:26;;12814:4;12811:1;12807:12;12802:17;;12778:154;;;12961:6;12956:3;12952:16;12945:23;;12644:334;;12458:520;;12246:738;;12139:845;;;;:::o;12990:366::-;13132:3;13153:67;13217:2;13212:3;13153:67;:::i;:::-;13146:74;;13229:93;13318:3;13229:93;:::i;:::-;13347:2;13342:3;13338:12;13331:19;;12990:366;;;:::o;13362:::-;13504:3;13525:67;13589:2;13584:3;13525:67;:::i;:::-;13518:74;;13601:93;13690:3;13601:93;:::i;:::-;13719:2;13714:3;13710:12;13703:19;;13362:366;;;:::o;13734:::-;13876:3;13897:67;13961:2;13956:3;13897:67;:::i;:::-;13890:74;;13973:93;14062:3;13973:93;:::i;:::-;14091:2;14086:3;14082:12;14075:19;;13734:366;;;:::o;14106:::-;14248:3;14269:67;14333:2;14328:3;14269:67;:::i;:::-;14262:74;;14345:93;14434:3;14345:93;:::i;:::-;14463:2;14458:3;14454:12;14447:19;;14106:366;;;:::o;14478:::-;14620:3;14641:67;14705:2;14700:3;14641:67;:::i;:::-;14634:74;;14717:93;14806:3;14717:93;:::i;:::-;14835:2;14830:3;14826:12;14819:19;;14478:366;;;:::o;14850:::-;14992:3;15013:67;15077:2;15072:3;15013:67;:::i;:::-;15006:74;;15089:93;15178:3;15089:93;:::i;:::-;15207:2;15202:3;15198:12;15191:19;;14850:366;;;:::o;15222:::-;15364:3;15385:67;15449:2;15444:3;15385:67;:::i;:::-;15378:74;;15461:93;15550:3;15461:93;:::i;:::-;15579:2;15574:3;15570:12;15563:19;;15222:366;;;:::o;15594:::-;15736:3;15757:67;15821:2;15816:3;15757:67;:::i;:::-;15750:74;;15833:93;15922:3;15833:93;:::i;:::-;15951:2;15946:3;15942:12;15935:19;;15594:366;;;:::o;15966:::-;16108:3;16129:67;16193:2;16188:3;16129:67;:::i;:::-;16122:74;;16205:93;16294:3;16205:93;:::i;:::-;16323:2;16318:3;16314:12;16307:19;;15966:366;;;:::o;16338:::-;16480:3;16501:67;16565:2;16560:3;16501:67;:::i;:::-;16494:74;;16577:93;16666:3;16577:93;:::i;:::-;16695:2;16690:3;16686:12;16679:19;;16338:366;;;:::o;16710:::-;16852:3;16873:67;16937:2;16932:3;16873:67;:::i;:::-;16866:74;;16949:93;17038:3;16949:93;:::i;:::-;17067:2;17062:3;17058:12;17051:19;;16710:366;;;:::o;17082:::-;17224:3;17245:67;17309:2;17304:3;17245:67;:::i;:::-;17238:74;;17321:93;17410:3;17321:93;:::i;:::-;17439:2;17434:3;17430:12;17423:19;;17082:366;;;:::o;17454:::-;17596:3;17617:67;17681:2;17676:3;17617:67;:::i;:::-;17610:74;;17693:93;17782:3;17693:93;:::i;:::-;17811:2;17806:3;17802:12;17795:19;;17454:366;;;:::o;17826:::-;17968:3;17989:67;18053:2;18048:3;17989:67;:::i;:::-;17982:74;;18065:93;18154:3;18065:93;:::i;:::-;18183:2;18178:3;18174:12;18167:19;;17826:366;;;:::o;18198:::-;18340:3;18361:67;18425:2;18420:3;18361:67;:::i;:::-;18354:74;;18437:93;18526:3;18437:93;:::i;:::-;18555:2;18550:3;18546:12;18539:19;;18198:366;;;:::o;18570:::-;18712:3;18733:67;18797:2;18792:3;18733:67;:::i;:::-;18726:74;;18809:93;18898:3;18809:93;:::i;:::-;18927:2;18922:3;18918:12;18911:19;;18570:366;;;:::o;18942:::-;19084:3;19105:67;19169:2;19164:3;19105:67;:::i;:::-;19098:74;;19181:93;19270:3;19181:93;:::i;:::-;19299:2;19294:3;19290:12;19283:19;;18942:366;;;:::o;19314:::-;19456:3;19477:67;19541:2;19536:3;19477:67;:::i;:::-;19470:74;;19553:93;19642:3;19553:93;:::i;:::-;19671:2;19666:3;19662:12;19655:19;;19314:366;;;:::o;19686:402::-;19846:3;19867:85;19949:2;19944:3;19867:85;:::i;:::-;19860:92;;19961:93;20050:3;19961:93;:::i;:::-;20079:2;20074:3;20070:12;20063:19;;19686:402;;;:::o;20094:366::-;20236:3;20257:67;20321:2;20316:3;20257:67;:::i;:::-;20250:74;;20333:93;20422:3;20333:93;:::i;:::-;20451:2;20446:3;20442:12;20435:19;;20094:366;;;:::o;20466:::-;20608:3;20629:67;20693:2;20688:3;20629:67;:::i;:::-;20622:74;;20705:93;20794:3;20705:93;:::i;:::-;20823:2;20818:3;20814:12;20807:19;;20466:366;;;:::o;20838:::-;20980:3;21001:67;21065:2;21060:3;21001:67;:::i;:::-;20994:74;;21077:93;21166:3;21077:93;:::i;:::-;21195:2;21190:3;21186:12;21179:19;;20838:366;;;:::o;21210:::-;21352:3;21373:67;21437:2;21432:3;21373:67;:::i;:::-;21366:74;;21449:93;21538:3;21449:93;:::i;:::-;21567:2;21562:3;21558:12;21551:19;;21210:366;;;:::o;21582:::-;21724:3;21745:67;21809:2;21804:3;21745:67;:::i;:::-;21738:74;;21821:93;21910:3;21821:93;:::i;:::-;21939:2;21934:3;21930:12;21923:19;;21582:366;;;:::o;21954:398::-;22113:3;22134:83;22215:1;22210:3;22134:83;:::i;:::-;22127:90;;22226:93;22315:3;22226:93;:::i;:::-;22344:1;22339:3;22335:11;22328:18;;21954:398;;;:::o;22358:366::-;22500:3;22521:67;22585:2;22580:3;22521:67;:::i;:::-;22514:74;;22597:93;22686:3;22597:93;:::i;:::-;22715:2;22710:3;22706:12;22699:19;;22358:366;;;:::o;22730:::-;22872:3;22893:67;22957:2;22952:3;22893:67;:::i;:::-;22886:74;;22969:93;23058:3;22969:93;:::i;:::-;23087:2;23082:3;23078:12;23071:19;;22730:366;;;:::o;23102:::-;23244:3;23265:67;23329:2;23324:3;23265:67;:::i;:::-;23258:74;;23341:93;23430:3;23341:93;:::i;:::-;23459:2;23454:3;23450:12;23443:19;;23102:366;;;:::o;23474:::-;23616:3;23637:67;23701:2;23696:3;23637:67;:::i;:::-;23630:74;;23713:93;23802:3;23713:93;:::i;:::-;23831:2;23826:3;23822:12;23815:19;;23474:366;;;:::o;23846:::-;23988:3;24009:67;24073:2;24068:3;24009:67;:::i;:::-;24002:74;;24085:93;24174:3;24085:93;:::i;:::-;24203:2;24198:3;24194:12;24187:19;;23846:366;;;:::o;24218:108::-;24295:24;24313:5;24295:24;:::i;:::-;24290:3;24283:37;24218:108;;:::o;24332:118::-;24419:24;24437:5;24419:24;:::i;:::-;24414:3;24407:37;24332:118;;:::o;24456:112::-;24539:22;24555:5;24539:22;:::i;:::-;24534:3;24527:35;24456:112;;:::o;24574:256::-;24686:3;24701:75;24772:3;24763:6;24701:75;:::i;:::-;24801:2;24796:3;24792:12;24785:19;;24821:3;24814:10;;24574:256;;;;:::o;24836:589::-;25061:3;25083:95;25174:3;25165:6;25083:95;:::i;:::-;25076:102;;25195:95;25286:3;25277:6;25195:95;:::i;:::-;25188:102;;25307:92;25395:3;25386:6;25307:92;:::i;:::-;25300:99;;25416:3;25409:10;;24836:589;;;;;;:::o;25431:697::-;25710:3;25732:148;25876:3;25732:148;:::i;:::-;25725:155;;25897:95;25988:3;25979:6;25897:95;:::i;:::-;25890:102;;26009:93;26098:3;26089:6;26009:93;:::i;:::-;26002:100;;26119:3;26112:10;;25431:697;;;;;:::o;26134:379::-;26318:3;26340:147;26483:3;26340:147;:::i;:::-;26333:154;;26504:3;26497:10;;26134:379;;;:::o;26519:222::-;26612:4;26650:2;26639:9;26635:18;26627:26;;26663:71;26731:1;26720:9;26716:17;26707:6;26663:71;:::i;:::-;26519:222;;;;:::o;26747:640::-;26942:4;26980:3;26969:9;26965:19;26957:27;;26994:71;27062:1;27051:9;27047:17;27038:6;26994:71;:::i;:::-;27075:72;27143:2;27132:9;27128:18;27119:6;27075:72;:::i;:::-;27157;27225:2;27214:9;27210:18;27201:6;27157:72;:::i;:::-;27276:9;27270:4;27266:20;27261:2;27250:9;27246:18;27239:48;27304:76;27375:4;27366:6;27304:76;:::i;:::-;27296:84;;26747:640;;;;;;;:::o;27393:373::-;27536:4;27574:2;27563:9;27559:18;27551:26;;27623:9;27617:4;27613:20;27609:1;27598:9;27594:17;27587:47;27651:108;27754:4;27745:6;27651:108;:::i;:::-;27643:116;;27393:373;;;;:::o;27772:210::-;27859:4;27897:2;27886:9;27882:18;27874:26;;27910:65;27972:1;27961:9;27957:17;27948:6;27910:65;:::i;:::-;27772:210;;;;:::o;27988:222::-;28081:4;28119:2;28108:9;28104:18;28096:26;;28132:71;28200:1;28189:9;28185:17;28176:6;28132:71;:::i;:::-;27988:222;;;;:::o;28216:545::-;28389:4;28427:3;28416:9;28412:19;28404:27;;28441:71;28509:1;28498:9;28494:17;28485:6;28441:71;:::i;:::-;28522:68;28586:2;28575:9;28571:18;28562:6;28522:68;:::i;:::-;28600:72;28668:2;28657:9;28653:18;28644:6;28600:72;:::i;:::-;28682;28750:2;28739:9;28735:18;28726:6;28682:72;:::i;:::-;28216:545;;;;;;;:::o;28767:309::-;28878:4;28916:2;28905:9;28901:18;28893:26;;28965:9;28959:4;28955:20;28951:1;28940:9;28936:17;28929:47;28993:76;29064:4;29055:6;28993:76;:::i;:::-;28985:84;;28767:309;;;;:::o;29082:313::-;29195:4;29233:2;29222:9;29218:18;29210:26;;29282:9;29276:4;29272:20;29268:1;29257:9;29253:17;29246:47;29310:78;29383:4;29374:6;29310:78;:::i;:::-;29302:86;;29082:313;;;;:::o;29401:419::-;29567:4;29605:2;29594:9;29590:18;29582:26;;29654:9;29648:4;29644:20;29640:1;29629:9;29625:17;29618:47;29682:131;29808:4;29682:131;:::i;:::-;29674:139;;29401:419;;;:::o;29826:::-;29992:4;30030:2;30019:9;30015:18;30007:26;;30079:9;30073:4;30069:20;30065:1;30054:9;30050:17;30043:47;30107:131;30233:4;30107:131;:::i;:::-;30099:139;;29826:419;;;:::o;30251:::-;30417:4;30455:2;30444:9;30440:18;30432:26;;30504:9;30498:4;30494:20;30490:1;30479:9;30475:17;30468:47;30532:131;30658:4;30532:131;:::i;:::-;30524:139;;30251:419;;;:::o;30676:::-;30842:4;30880:2;30869:9;30865:18;30857:26;;30929:9;30923:4;30919:20;30915:1;30904:9;30900:17;30893:47;30957:131;31083:4;30957:131;:::i;:::-;30949:139;;30676:419;;;:::o;31101:::-;31267:4;31305:2;31294:9;31290:18;31282:26;;31354:9;31348:4;31344:20;31340:1;31329:9;31325:17;31318:47;31382:131;31508:4;31382:131;:::i;:::-;31374:139;;31101:419;;;:::o;31526:::-;31692:4;31730:2;31719:9;31715:18;31707:26;;31779:9;31773:4;31769:20;31765:1;31754:9;31750:17;31743:47;31807:131;31933:4;31807:131;:::i;:::-;31799:139;;31526:419;;;:::o;31951:::-;32117:4;32155:2;32144:9;32140:18;32132:26;;32204:9;32198:4;32194:20;32190:1;32179:9;32175:17;32168:47;32232:131;32358:4;32232:131;:::i;:::-;32224:139;;31951:419;;;:::o;32376:::-;32542:4;32580:2;32569:9;32565:18;32557:26;;32629:9;32623:4;32619:20;32615:1;32604:9;32600:17;32593:47;32657:131;32783:4;32657:131;:::i;:::-;32649:139;;32376:419;;;:::o;32801:::-;32967:4;33005:2;32994:9;32990:18;32982:26;;33054:9;33048:4;33044:20;33040:1;33029:9;33025:17;33018:47;33082:131;33208:4;33082:131;:::i;:::-;33074:139;;32801:419;;;:::o;33226:::-;33392:4;33430:2;33419:9;33415:18;33407:26;;33479:9;33473:4;33469:20;33465:1;33454:9;33450:17;33443:47;33507:131;33633:4;33507:131;:::i;:::-;33499:139;;33226:419;;;:::o;33651:::-;33817:4;33855:2;33844:9;33840:18;33832:26;;33904:9;33898:4;33894:20;33890:1;33879:9;33875:17;33868:47;33932:131;34058:4;33932:131;:::i;:::-;33924:139;;33651:419;;;:::o;34076:::-;34242:4;34280:2;34269:9;34265:18;34257:26;;34329:9;34323:4;34319:20;34315:1;34304:9;34300:17;34293:47;34357:131;34483:4;34357:131;:::i;:::-;34349:139;;34076:419;;;:::o;34501:::-;34667:4;34705:2;34694:9;34690:18;34682:26;;34754:9;34748:4;34744:20;34740:1;34729:9;34725:17;34718:47;34782:131;34908:4;34782:131;:::i;:::-;34774:139;;34501:419;;;:::o;34926:::-;35092:4;35130:2;35119:9;35115:18;35107:26;;35179:9;35173:4;35169:20;35165:1;35154:9;35150:17;35143:47;35207:131;35333:4;35207:131;:::i;:::-;35199:139;;34926:419;;;:::o;35351:::-;35517:4;35555:2;35544:9;35540:18;35532:26;;35604:9;35598:4;35594:20;35590:1;35579:9;35575:17;35568:47;35632:131;35758:4;35632:131;:::i;:::-;35624:139;;35351:419;;;:::o;35776:::-;35942:4;35980:2;35969:9;35965:18;35957:26;;36029:9;36023:4;36019:20;36015:1;36004:9;36000:17;35993:47;36057:131;36183:4;36057:131;:::i;:::-;36049:139;;35776:419;;;:::o;36201:::-;36367:4;36405:2;36394:9;36390:18;36382:26;;36454:9;36448:4;36444:20;36440:1;36429:9;36425:17;36418:47;36482:131;36608:4;36482:131;:::i;:::-;36474:139;;36201:419;;;:::o;36626:::-;36792:4;36830:2;36819:9;36815:18;36807:26;;36879:9;36873:4;36869:20;36865:1;36854:9;36850:17;36843:47;36907:131;37033:4;36907:131;:::i;:::-;36899:139;;36626:419;;;:::o;37051:::-;37217:4;37255:2;37244:9;37240:18;37232:26;;37304:9;37298:4;37294:20;37290:1;37279:9;37275:17;37268:47;37332:131;37458:4;37332:131;:::i;:::-;37324:139;;37051:419;;;:::o;37476:::-;37642:4;37680:2;37669:9;37665:18;37657:26;;37729:9;37723:4;37719:20;37715:1;37704:9;37700:17;37693:47;37757:131;37883:4;37757:131;:::i;:::-;37749:139;;37476:419;;;:::o;37901:::-;38067:4;38105:2;38094:9;38090:18;38082:26;;38154:9;38148:4;38144:20;38140:1;38129:9;38125:17;38118:47;38182:131;38308:4;38182:131;:::i;:::-;38174:139;;37901:419;;;:::o;38326:::-;38492:4;38530:2;38519:9;38515:18;38507:26;;38579:9;38573:4;38569:20;38565:1;38554:9;38550:17;38543:47;38607:131;38733:4;38607:131;:::i;:::-;38599:139;;38326:419;;;:::o;38751:::-;38917:4;38955:2;38944:9;38940:18;38932:26;;39004:9;38998:4;38994:20;38990:1;38979:9;38975:17;38968:47;39032:131;39158:4;39032:131;:::i;:::-;39024:139;;38751:419;;;:::o;39176:::-;39342:4;39380:2;39369:9;39365:18;39357:26;;39429:9;39423:4;39419:20;39415:1;39404:9;39400:17;39393:47;39457:131;39583:4;39457:131;:::i;:::-;39449:139;;39176:419;;;:::o;39601:::-;39767:4;39805:2;39794:9;39790:18;39782:26;;39854:9;39848:4;39844:20;39840:1;39829:9;39825:17;39818:47;39882:131;40008:4;39882:131;:::i;:::-;39874:139;;39601:419;;;:::o;40026:::-;40192:4;40230:2;40219:9;40215:18;40207:26;;40279:9;40273:4;40269:20;40265:1;40254:9;40250:17;40243:47;40307:131;40433:4;40307:131;:::i;:::-;40299:139;;40026:419;;;:::o;40451:::-;40617:4;40655:2;40644:9;40640:18;40632:26;;40704:9;40698:4;40694:20;40690:1;40679:9;40675:17;40668:47;40732:131;40858:4;40732:131;:::i;:::-;40724:139;;40451:419;;;:::o;40876:::-;41042:4;41080:2;41069:9;41065:18;41057:26;;41129:9;41123:4;41119:20;41115:1;41104:9;41100:17;41093:47;41157:131;41283:4;41157:131;:::i;:::-;41149:139;;40876:419;;;:::o;41301:222::-;41394:4;41432:2;41421:9;41417:18;41409:26;;41445:71;41513:1;41502:9;41498:17;41489:6;41445:71;:::i;:::-;41301:222;;;;:::o;41529:129::-;41563:6;41590:20;;:::i;:::-;41580:30;;41619:33;41647:4;41639:6;41619:33;:::i;:::-;41529:129;;;:::o;41664:75::-;41697:6;41730:2;41724:9;41714:19;;41664:75;:::o;41745:307::-;41806:4;41896:18;41888:6;41885:30;41882:56;;;41918:18;;:::i;:::-;41882:56;41956:29;41978:6;41956:29;:::i;:::-;41948:37;;42040:4;42034;42030:15;42022:23;;41745:307;;;:::o;42058:308::-;42120:4;42210:18;42202:6;42199:30;42196:56;;;42232:18;;:::i;:::-;42196:56;42270:29;42292:6;42270:29;:::i;:::-;42262:37;;42354:4;42348;42344:15;42336:23;;42058:308;;;:::o;42372:132::-;42439:4;42462:3;42454:11;;42492:4;42487:3;42483:14;42475:22;;42372:132;;;:::o;42510:141::-;42559:4;42582:3;42574:11;;42605:3;42602:1;42595:14;42639:4;42636:1;42626:18;42618:26;;42510:141;;;:::o;42657:114::-;42724:6;42758:5;42752:12;42742:22;;42657:114;;;:::o;42777:98::-;42828:6;42862:5;42856:12;42846:22;;42777:98;;;:::o;42881:99::-;42933:6;42967:5;42961:12;42951:22;;42881:99;;;:::o;42986:113::-;43056:4;43088;43083:3;43079:14;43071:22;;42986:113;;;:::o;43105:184::-;43204:11;43238:6;43233:3;43226:19;43278:4;43273:3;43269:14;43254:29;;43105:184;;;;:::o;43295:168::-;43378:11;43412:6;43407:3;43400:19;43452:4;43447:3;43443:14;43428:29;;43295:168;;;;:::o;43469:147::-;43570:11;43607:3;43592:18;;43469:147;;;;:::o;43622:169::-;43706:11;43740:6;43735:3;43728:19;43780:4;43775:3;43771:14;43756:29;;43622:169;;;;:::o;43797:148::-;43899:11;43936:3;43921:18;;43797:148;;;;:::o;43951:305::-;43991:3;44010:20;44028:1;44010:20;:::i;:::-;44005:25;;44044:20;44062:1;44044:20;:::i;:::-;44039:25;;44198:1;44130:66;44126:74;44123:1;44120:81;44117:107;;;44204:18;;:::i;:::-;44117:107;44248:1;44245;44241:9;44234:16;;43951:305;;;;:::o;44262:237::-;44300:3;44319:18;44335:1;44319:18;:::i;:::-;44314:23;;44351:18;44367:1;44351:18;:::i;:::-;44346:23;;44441:1;44435:4;44431:12;44428:1;44425:19;44422:45;;;44447:18;;:::i;:::-;44422:45;44491:1;44488;44484:9;44477:16;;44262:237;;;;:::o;44505:185::-;44545:1;44562:20;44580:1;44562:20;:::i;:::-;44557:25;;44596:20;44614:1;44596:20;:::i;:::-;44591:25;;44635:1;44625:35;;44640:18;;:::i;:::-;44625:35;44682:1;44679;44675:9;44670:14;;44505:185;;;;:::o;44696:179::-;44734:1;44751:18;44767:1;44751:18;:::i;:::-;44746:23;;44783:18;44799:1;44783:18;:::i;:::-;44778:23;;44820:1;44810:35;;44825:18;;:::i;:::-;44810:35;44867:1;44864;44860:9;44855:14;;44696:179;;;;:::o;44881:848::-;44942:5;44949:4;44973:6;44964:15;;44997:5;44988:14;;45011:712;45032:1;45022:8;45019:15;45011:712;;;45127:4;45122:3;45118:14;45112:4;45109:24;45106:50;;;45136:18;;:::i;:::-;45106:50;45186:1;45176:8;45172:16;45169:451;;;45601:4;45594:5;45590:16;45581:25;;45169:451;45651:4;45645;45641:15;45633:23;;45681:32;45704:8;45681:32;:::i;:::-;45669:44;;45011:712;;;44881:848;;;;;;;:::o;45735:285::-;45795:5;45819:23;45837:4;45819:23;:::i;:::-;45811:31;;45863:27;45881:8;45863:27;:::i;:::-;45851:39;;45909:104;45946:66;45936:8;45930:4;45909:104;:::i;:::-;45900:113;;45735:285;;;;:::o;46026:1073::-;46080:5;46271:8;46261:40;;46292:1;46283:10;;46294:5;;46261:40;46320:4;46310:36;;46337:1;46328:10;;46339:5;;46310:36;46406:4;46454:1;46449:27;;;;46490:1;46485:191;;;;46399:277;;46449:27;46467:1;46458:10;;46469:5;;;46485:191;46530:3;46520:8;46517:17;46514:43;;;46537:18;;:::i;:::-;46514:43;46586:8;46583:1;46579:16;46570:25;;46621:3;46614:5;46611:14;46608:40;;;46628:18;;:::i;:::-;46608:40;46661:5;;;46399:277;;46785:2;46775:8;46772:16;46766:3;46760:4;46757:13;46753:36;46735:2;46725:8;46722:16;46717:2;46711:4;46708:12;46704:35;46688:111;46685:246;;;46841:8;46835:4;46831:19;46822:28;;46876:3;46869:5;46866:14;46863:40;;;46883:18;;:::i;:::-;46863:40;46916:5;;46685:246;46956:42;46994:3;46984:8;46978:4;46975:1;46956:42;:::i;:::-;46941:57;;;;47030:4;47025:3;47021:14;47014:5;47011:25;47008:51;;;47039:18;;:::i;:::-;47008:51;47088:4;47081:5;47077:16;47068:25;;46026:1073;;;;;;:::o;47105:348::-;47145:7;47168:20;47186:1;47168:20;:::i;:::-;47163:25;;47202:20;47220:1;47202:20;:::i;:::-;47197:25;;47390:1;47322:66;47318:74;47315:1;47312:81;47307:1;47300:9;47293:17;47289:105;47286:131;;;47397:18;;:::i;:::-;47286:131;47445:1;47442;47438:9;47427:20;;47105:348;;;;:::o;47459:280::-;47497:7;47520:18;47536:1;47520:18;:::i;:::-;47515:23;;47552:18;47568:1;47552:18;:::i;:::-;47547:23;;47676:1;47670:4;47666:12;47663:1;47660:19;47655:1;47648:9;47641:17;47637:43;47634:69;;;47683:18;;:::i;:::-;47634:69;47731:1;47728;47724:9;47713:20;;47459:280;;;;:::o;47745:191::-;47785:4;47805:20;47823:1;47805:20;:::i;:::-;47800:25;;47839:20;47857:1;47839:20;:::i;:::-;47834:25;;47878:1;47875;47872:8;47869:34;;;47883:18;;:::i;:::-;47869:34;47928:1;47925;47921:9;47913:17;;47745:191;;;;:::o;47942:185::-;47980:4;48000:18;48016:1;48000:18;:::i;:::-;47995:23;;48032:18;48048:1;48032:18;:::i;:::-;48027:23;;48069:1;48066;48063:8;48060:34;;;48074:18;;:::i;:::-;48060:34;48119:1;48116;48112:9;48104:17;;47942:185;;;;:::o;48133:96::-;48170:7;48199:24;48217:5;48199:24;:::i;:::-;48188:35;;48133:96;;;:::o;48235:90::-;48269:7;48312:5;48305:13;48298:21;48287:32;;48235:90;;;:::o;48331:77::-;48368:7;48397:5;48386:16;;48331:77;;;:::o;48414:149::-;48450:7;48490:66;48483:5;48479:78;48468:89;;48414:149;;;:::o;48569:126::-;48606:7;48646:42;48639:5;48635:54;48624:65;;48569:126;;;:::o;48701:77::-;48738:7;48767:5;48756:16;;48701:77;;;:::o;48784:86::-;48819:7;48859:4;48852:5;48848:16;48837:27;;48784:86;;;:::o;48876:154::-;48960:6;48955:3;48950;48937:30;49022:1;49013:6;49008:3;49004:16;48997:27;48876:154;;;:::o;49036:307::-;49104:1;49114:113;49128:6;49125:1;49122:13;49114:113;;;49213:1;49208:3;49204:11;49198:18;49194:1;49189:3;49185:11;49178:39;49150:2;49147:1;49143:10;49138:15;;49114:113;;;49245:6;49242:1;49239:13;49236:101;;;49325:1;49316:6;49311:3;49307:16;49300:27;49236:101;49085:258;49036:307;;;:::o;49349:320::-;49393:6;49430:1;49424:4;49420:12;49410:22;;49477:1;49471:4;49467:12;49498:18;49488:81;;49554:4;49546:6;49542:17;49532:27;;49488:81;49616:2;49608:6;49605:14;49585:18;49582:38;49579:84;;;49635:18;;:::i;:::-;49579:84;49400:269;49349:320;;;:::o;49675:281::-;49758:27;49780:4;49758:27;:::i;:::-;49750:6;49746:40;49888:6;49876:10;49873:22;49852:18;49840:10;49837:34;49834:62;49831:88;;;49899:18;;:::i;:::-;49831:88;49939:10;49935:2;49928:22;49718:238;49675:281;;:::o;49962:233::-;50001:3;50024:24;50042:5;50024:24;:::i;:::-;50015:33;;50070:66;50063:5;50060:77;50057:103;;;50140:18;;:::i;:::-;50057:103;50187:1;50180:5;50176:13;50169:20;;49962:233;;;:::o;50201:100::-;50240:7;50269:26;50289:5;50269:26;:::i;:::-;50258:37;;50201:100;;;:::o;50307:94::-;50346:7;50375:20;50389:5;50375:20;:::i;:::-;50364:31;;50307:94;;;:::o;50407:176::-;50439:1;50456:20;50474:1;50456:20;:::i;:::-;50451:25;;50490:20;50508:1;50490:20;:::i;:::-;50485:25;;50529:1;50519:35;;50534:18;;:::i;:::-;50519:35;50575:1;50572;50568:9;50563:14;;50407:176;;;;:::o;50589:180::-;50637:77;50634:1;50627:88;50734:4;50731:1;50724:15;50758:4;50755:1;50748:15;50775:180;50823:77;50820:1;50813:88;50920:4;50917:1;50910:15;50944:4;50941:1;50934:15;50961:180;51009:77;51006:1;50999:88;51106:4;51103:1;51096:15;51130:4;51127:1;51120:15;51147:180;51195:77;51192:1;51185:88;51292:4;51289:1;51282:15;51316:4;51313:1;51306:15;51333:180;51381:77;51378:1;51371:88;51478:4;51475:1;51468:15;51502:4;51499:1;51492:15;51519:180;51567:77;51564:1;51557:88;51664:4;51661:1;51654:15;51688:4;51685:1;51678:15;51705:117;51814:1;51811;51804:12;51828:117;51937:1;51934;51927:12;51951:117;52060:1;52057;52050:12;52074:117;52183:1;52180;52173:12;52197:102;52238:6;52289:2;52285:7;52280:2;52273:5;52269:14;52265:28;52255:38;;52197:102;;;:::o;52305:94::-;52338:8;52386:5;52382:2;52378:14;52357:35;;52305:94;;;:::o;52405:102::-;52447:8;52494:5;52491:1;52487:13;52466:34;;52405:102;;;:::o;52513:174::-;52653:26;52649:1;52641:6;52637:14;52630:50;52513:174;:::o;52693:181::-;52833:33;52829:1;52821:6;52817:14;52810:57;52693:181;:::o;52880:237::-;53020:34;53016:1;53008:6;53004:14;52997:58;53089:20;53084:2;53076:6;53072:15;53065:45;52880:237;:::o;53123:225::-;53263:34;53259:1;53251:6;53247:14;53240:58;53332:8;53327:2;53319:6;53315:15;53308:33;53123:225;:::o;53354:178::-;53494:30;53490:1;53482:6;53478:14;53471:54;53354:178;:::o;53538:170::-;53678:22;53674:1;53666:6;53662:14;53655:46;53538:170;:::o;53714:178::-;53854:30;53850:1;53842:6;53838:14;53831:54;53714:178;:::o;53898:223::-;54038:34;54034:1;54026:6;54022:14;54015:58;54107:6;54102:2;54094:6;54090:15;54083:31;53898:223;:::o;54127:175::-;54267:27;54263:1;54255:6;54251:14;54244:51;54127:175;:::o;54308:221::-;54448:34;54444:1;54436:6;54432:14;54425:58;54517:4;54512:2;54504:6;54500:15;54493:29;54308:221;:::o;54535:231::-;54675:34;54671:1;54663:6;54659:14;54652:58;54744:14;54739:2;54731:6;54727:15;54720:39;54535:231;:::o;54772:243::-;54912:34;54908:1;54900:6;54896:14;54889:58;54981:26;54976:2;54968:6;54964:15;54957:51;54772:243;:::o;55021:229::-;55161:34;55157:1;55149:6;55145:14;55138:58;55230:12;55225:2;55217:6;55213:15;55206:37;55021:229;:::o;55256:228::-;55396:34;55392:1;55384:6;55380:14;55373:58;55465:11;55460:2;55452:6;55448:15;55441:36;55256:228;:::o;55490:221::-;55630:34;55626:1;55618:6;55614:14;55607:58;55699:4;55694:2;55686:6;55682:15;55675:29;55490:221;:::o;55717:182::-;55857:34;55853:1;55845:6;55841:14;55834:58;55717:182;:::o;55905:231::-;56045:34;56041:1;56033:6;56029:14;56022:58;56114:14;56109:2;56101:6;56097:15;56090:39;55905:231;:::o;56142:182::-;56282:34;56278:1;56270:6;56266:14;56259:58;56142:182;:::o;56330:214::-;56470:66;56466:1;56458:6;56454:14;56447:90;56330:214;:::o;56550:173::-;56690:25;56686:1;56678:6;56674:14;56667:49;56550:173;:::o;56729:228::-;56869:34;56865:1;56857:6;56853:14;56846:58;56938:11;56933:2;56925:6;56921:15;56914:36;56729:228;:::o;56963:171::-;57103:23;57099:1;57091:6;57087:14;57080:47;56963:171;:::o;57140:234::-;57280:34;57276:1;57268:6;57264:14;57257:58;57349:17;57344:2;57336:6;57332:15;57325:42;57140:234;:::o;57380:220::-;57520:34;57516:1;57508:6;57504:14;57497:58;57589:3;57584:2;57576:6;57572:15;57565:28;57380:220;:::o;57606:114::-;;:::o;57726:170::-;57866:22;57862:1;57854:6;57850:14;57843:46;57726:170;:::o;57902:236::-;58042:34;58038:1;58030:6;58026:14;58019:58;58111:19;58106:2;58098:6;58094:15;58087:44;57902:236;:::o;58144:172::-;58284:24;58280:1;58272:6;58268:14;58261:48;58144:172;:::o;58322:177::-;58462:29;58458:1;58450:6;58446:14;58439:53;58322:177;:::o;58505:169::-;58645:21;58641:1;58633:6;58629:14;58622:45;58505:169;:::o;58680:122::-;58753:24;58771:5;58753:24;:::i;:::-;58746:5;58743:35;58733:63;;58792:1;58789;58782:12;58733:63;58680:122;:::o;58808:116::-;58878:21;58893:5;58878:21;:::i;:::-;58871:5;58868:32;58858:60;;58914:1;58911;58904:12;58858:60;58808:116;:::o;58930:120::-;59002:23;59019:5;59002:23;:::i;:::-;58995:5;58992:34;58982:62;;59040:1;59037;59030:12;58982:62;58930:120;:::o;59056:122::-;59129:24;59147:5;59129:24;:::i;:::-;59122:5;59119:35;59109:63;;59168:1;59165;59158:12;59109:63;59056:122;:::o

Swarm Source

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