ETH Price: $3,416.94 (-0.64%)
Gas: 2 Gwei

Token

ChainRings (CRING)
 

Overview

Max Total Supply

1,024 CRING

Holders

489

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
momog.eth
Balance
3 CRING
0xba12fda058a14eb03c14613601c3a30d6f955196
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Generative NFT collection by Emir Sayıs with limited supply and the scripts stored on Ethereum Blockchain. Inspired by on-chain art platform "Art Blocks" and built with ChainPots structure.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ChainRings

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-07
*/

// ChainRings.com - Generative NFT Collection
// This contract is forked from https://github.com/canersevince/ChainPots repository.


// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/EnumerableMap.sol




pragma solidity ^0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

    /**
     * @dev Returns the key-value pair stored at position `index` in the map. O(1).
     *
     * Note that there are no guarantees on the ordering of entries inside the
     * array, and it may change when more entries are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

    /**
     * @dev Returns the element stored at position `index` in the set. O(1).
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/EnumerableSet.sol




pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/ERC165.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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol


pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(type(IERC165).interfaceId);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.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;
}


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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Enumerable.sol




pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/IERC165.sol



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/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 GSN 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol




pragma solidity ^0.8.0;











/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;


    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

    // 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;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(type(IERC721).interfaceId);
        _registerInterface(type(IERC721Metadata).interfaceId);
        _registerInterface(type(IERC721Enumerable).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 _holderTokens[owner].length();
    }






    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    /**
     * @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 _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @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 || ERC721.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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 _tokenOwners.contains(tokenId);
    }

    /**
     * @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 || ERC721.isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(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); // internal owner

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(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"); // internal owner
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);
        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

    /**
     * @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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * 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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/math/SafeMath.sol




pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
}

/**
 * @dev Returns the substraction of two unsigned integers, with an overflow flag.
 *
 * _Available since v3.4._
 */
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}

/**
 * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
 *
 * _Available since v3.4._
 */
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}

/**
 * @dev Returns the division of two unsigned integers, with a division by zero flag.
 *
 * _Available since v3.4._
 */
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}

/**
 * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
 *
 * _Available since v3.4._
 */
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}

/**
 * @dev Returns the addition of two unsigned integers, reverting on
 * overflow.
 *
 * Counterpart to Solidity's `+` operator.
 *
 * Requirements:
 *
 * - Addition cannot overflow.
 */
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}

/**
 * @dev Returns the subtraction of two unsigned integers, reverting on
 * overflow (when the result is negative).
 *
 * Counterpart to Solidity's `-` operator.
 *
 * Requirements:
 *
 * - Subtraction cannot overflow.
 */
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}

/**
 * @dev Returns the multiplication of two unsigned integers, reverting on
 * overflow.
 *
 * Counterpart to Solidity's `*` operator.
 *
 * Requirements:
 *
 * - Multiplication cannot overflow.
 */
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}

/**
 * @dev Returns the integer division of two unsigned integers, reverting on
 * division by zero. The result is rounded towards zero.
 *
 * Counterpart to Solidity's `/` operator.
 *
 * Requirements:
 *
 * - The divisor cannot be zero.
 */
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}

/**
 * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
 * reverting when dividing by zero.
 *
 * Counterpart to Solidity's `%` operator. This function uses a `revert`
 * opcode (which leaves remaining gas untouched) while Solidity uses an
 * invalid opcode to revert (consuming all remaining gas).
 *
 * Requirements:
 *
 * - The divisor cannot be zero.
 */
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}

/**
 * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
 * overflow (when the result is negative).
 *
 * CAUTION: This function is deprecated because it requires allocating memory for the error
 * message unnecessarily. For custom revert reasons use {trySub}.
 *
 * Counterpart to Solidity's `-` operator.
 *
 * Requirements:
 *
 * - Subtraction cannot overflow.
 */
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}

/**
 * @dev Returns the integer division of two unsigned integers, reverting with custom message on
 * division by zero. The result is rounded towards zero.
 *
 * Counterpart to Solidity's `%` operator. This function uses a `revert`
 * opcode (which leaves remaining gas untouched) while Solidity uses an
 * invalid opcode to revert (consuming all remaining gas).
 *
 * Counterpart to Solidity's `/` operator. Note: this function uses a
 * `revert` opcode (which leaves remaining gas untouched) while Solidity
 * uses an invalid opcode to revert (consuming all remaining gas).
 *
 * Requirements:
 *
 * - The divisor cannot be zero.
 */
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}

/**
 * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
 * reverting with custom message when dividing by zero.
 *
 * CAUTION: This function is deprecated because it requires allocating memory for the error
 * message unnecessarily. For custom revert reasons use {tryMod}.
 *
 * Counterpart to Solidity's `%` operator. This function uses a `revert`
 * opcode (which leaves remaining gas untouched) while Solidity uses an
 * invalid opcode to revert (consuming all remaining gas).
 *
 * Requirements:
 *
 * - The divisor cannot be zero.
 */
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}






pragma solidity ^0.8.0;


// SPDX-License-Identifier: UNLICENSED

contract ChainRings is ERC721, Ownable {
using SafeMath for uint256;
using Strings for uint256;
uint public constant MAX_RINGS = 1024;
bool public hasSaleStarted = false;
mapping (uint256 => uint256) public creationDates;
mapping (uint256 => address) public creators;

// these will be set in future
string public METADATA_PROVENANCE_HASH = "";
string public GENERATOR_ADDRESS = "https://chainrings.com/generator/";
string public IPFS_GENERATOR_ADDRESS = "";
string public SCRIPT = "";
// e.s added minter address to hash algorithm
constructor() ERC721("ChainRings","CRING")  {
setBaseURI("https://chainrings.art/api/token/");
_safeMint(msg.sender, 0);
creationDates[0] = block.number;
creators[0] = msg.sender;
SCRIPT = "class Random{constructor(e){this.seed=e}random_dec(){return this.seed^=this.seed<<13,this.seed^=this.seed>>17,this.seed^=this.seed<<5,(this.seed<0?1+~this.seed:this.seed)%1e3/1e3}random_between(e,a){return e+(a-e)*this.random_dec()}random_int(e,a){return Math.floor(this.random_between(e,a+1))}random_choice(e){return e[Math.floor(this.random_between(0,.99*e.length))]}}let s$,tokenData=window.tokenHash,seed=parseInt(tokenData.slice(0,16),16),rng=new Random(seed),palettes=['e54b4b-ffa987-f7ebe8-444140-1e1e24','a6ebc9-61ff7e-5eeb5b-62ab37-393424','95f9e3-69ebd0-49d49d-558564-564946','97f9f9-a4def9-c1e0f7-cfbae1-c59fc9','ddd1c7-c2cfb2-8db580-7e8987-4b4a67','250902-38040e-640d14-800e13-ad2831','333333-839788-eee0cb-baa898-bfd7ea','585123-eec170-f2a65a-f58549-772f1a','fbf5f3-e28413-000022-de3c4b-c42847','0fa3b1-d9e5d6-eddea4-f7a072-ff9b42','10002b-240046-5a189a-9d4edd-e0aaff','0466c8-023e7d-001845-33415c-7d8597','861657-a64253-d56aa0-bbdbb4-fcf0cc','493843-61988e-a0b2a6-cbbfbb-eabda8','031d44-04395e-70a288-dab785-d5896f','ff0a54-ff5c8a-ff85a1-fbb1bd-f7cad0','463f3a-8a817c-bcb8b1-f4f3ee-e0afa0','dd6e42-e8dab2-4f6d7a-c0d6df-eaeaea','ffd6ff-e7c6ff-c8b6ff-b8c0ff-bbd0ff','aa8f66-ed9b40-ffeedb-61c9a8-ba3b46','a57548-fcd7ad-f6c28b-5296a5-82ddf0','713e5a-63a375-edc79b-d57a66-ca6680','114b5f-456990-e4fde1-f45b69-6b2737','edf2fb-e2eafc-ccdbfd-c1d3fe-abc4ff','9cafb7-ead2ac-fe938c-e6b89c-4281a4','7bdff2-b2f7ef-eff7f6-f7d6e0-f2b5d4','ffcdb2-ffb4a2-e5989b-b5838d-6d6875','f2d7ee-d3bcc0-a5668b-69306d-0e103d','ffbe0b-fb5607-ff006e-8338ec-3a86ff','9b5de5-f15bb5-fee440-00bbf9-00f5d4','fee440-f15bb5-9b5de5-00bbf9-00f5d4','181a99-5d93cc-454593-e05328-e28976','F61067-5E239D-00F0B5-6DECAF-F4F4ED','f8f9fa-dee2e6-adb5bd-495057-212529','212529-000000-adb5bd-495057-f8f9fa'].map(e=>e.split('-').map(e=>'#'+e)),palette=rng.random_choice(palettes),viewport=Math.min(window.innerHeight,window.innerWidth),w=viewport,h=viewport,row=rng.random_int(5,30),rows=row,offset=w/row,cols=rng.random_int(row-row/3,30),radius=w/row,Rstroke=w/500,cellColors=[],cellShapes=[],total=rows*cols,maxHeight=radius*rows,t$=0,tempFrame=0,isThicc=!1,rotation$=rng.random_between(0,1);function stroke$(){return isThicc?++tempFrame>=1e3?(isThicc=!1,Math.max(Rstroke,tempFrame/10)):Math.max(Rstroke,tempFrame/10):(tempFrame=Math.abs(tempFrame-1),Math.max(Rstroke,tempFrame/10))}function setup(){s$=rng.random_between(.001,.004),frameRate(36),noiseSeed(seed),createCanvas(w,h);for(let e=0;e<row*cols;e++)cellColors[e]=rng.random_choice(palette.slice(0,palette.length-1)),cellShapes[e]=rng.random_between(0,1)}function draw(){rotation$<.4?translate(0,0-offset/2):rotation$<.6?(rotate(-PI/2),scale(-1),translate(0,-w-offset/2)):rotation$<.8?(rotate(-PI),translate(-w,-w-radius/2)):(rotate(-PI/2),translate(-w,-offset/2)),background(palette[palette.length-1]),noFill(),strokeWeight(stroke$());for(let e=0;e<cols;e++){const a=width/(cols-1)*e;let t=(t$+(cols-e)/(2*cols)+1)%1;t=Math.sin(map(cos(t*TWO_PI),-1,1,0,1)/1*(Math.PI/2));for(let f=0;f<rows;f++){const d=f/rows*t*maxHeight+offset;if(stroke(cellColors[f*e]),cellShapes[f*e]>.95)push(),fill(cellColors[f*e]),ellipse(a,d,radius),pop();else if(cellShapes[f*e]>.7){if(cellShapes[f*e]>.72){push();let e=color(rng.random_choice(palette)),a=color(rng.random_choice(palette));fill(lerpColor(e,a,Math.abs(100*sin(100*frameCount)))),noStroke(),pop()}rect(a-radius/2,d-radius/2,radius,radius,100*Math.abs(sin(frameCount/100)))}else ellipse(a,d,radius)}}(t$+=s$)>=1&&(t$=0)}function mouseClicked(){isThicc=!isThicc}";
}

function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
uint256 tokenCount = balanceOf(_owner);
if (tokenCount == 0) {
// Return an empty array
return new uint256[](0);
} else {
uint256[] memory result = new uint256[](tokenCount);
uint256 index;
for (index = 0; index < tokenCount; index++) {
result[index] = tokenOfOwnerByIndex(_owner, index);
}
return result;
}
}

function calculatePrice() public view returns (uint256) {
return 50000000000000000;
}

function mintRings(uint256 maxRINGS) public payable {
require(totalSupply() < MAX_RINGS, "Sale has already ended");
require(maxRINGS > 0 && maxRINGS <= 10, "You can claim minimum 1, maximum 10 rings");
require(totalSupply().add(maxRINGS) <= MAX_RINGS, "Exceeds MAX_RINGS");
require(msg.value >= calculatePrice().mul(maxRINGS), "Ether value sent is below the price");

for (uint i = 0; i < maxRINGS; i++) {
uint mintIndex = totalSupply();
_safeMint(msg.sender, mintIndex);
creationDates[mintIndex] = block.number;
creators[mintIndex] = msg.sender;
}
}

// ONLYOWNER FUNCTIONS

function setProvenanceHash(string memory _hash) public onlyOwner {
METADATA_PROVENANCE_HASH = _hash;
}

function setGeneratorIPFSHash(string memory _hash) public onlyOwner {
IPFS_GENERATOR_ADDRESS = _hash;
}

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

function startDrop() public onlyOwner {
hasSaleStarted = true;
}

function pauseDrop() public onlyOwner {
hasSaleStarted = false;
}

function withdrawAll() public payable onlyOwner {
require(payable(msg.sender).send(address(this).balance));
}

function tokenHash(uint256 tokenId) public view returns(bytes32){
require(_exists(tokenId), "DOES NOT EXIST");
return bytes32(keccak256(abi.encodePacked(address(this), creationDates[tokenId], creators[tokenId], tokenId)));
}

function generatorAddress(uint256 tokenId) public view returns (string memory) {
require(_exists(tokenId), "DOES NOT EXIST");
return string(abi.encodePacked(GENERATOR_ADDRESS, tokenId.toString()));
}

//e.s added this. could be useful

function IPFSgeneratorAddress(uint256 tokenId) public view returns (string memory) {
require(_exists(tokenId), "DOES NOT EXIST");
return string(abi.encodePacked(IPFS_GENERATOR_ADDRESS, tokenId.toString()));
}
}

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":[],"name":"GENERATOR_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IPFS_GENERATOR_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IPFSgeneratorAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RINGS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCRIPT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculatePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creationDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"generatorAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxRINGS","type":"uint256"}],"name":"mintRings","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setGeneratorIPFSHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60146101000a81548160ff02191690831515021790555060405180602001604052806000815250600d90805190602001906200004692919062000c2b565b5060405180606001604052806021815260200162005d3c60219139600e90805190602001906200007892919062000c2b565b5060405180602001604052806000815250600f9080519060200190620000a092919062000c2b565b506040518060200160405280600081525060109080519060200190620000c892919062000c2b565b50348015620000d657600080fd5b506040518060400160405280600a81526020017f436861696e52696e6773000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4352494e47000000000000000000000000000000000000000000000000000000815250620001747f01ffc9a700000000000000000000000000000000000000000000000000000000620003ce60201b60201c565b81600690805190602001906200018c92919062000c2b565b508060079080519060200190620001a592919062000c2b565b50620001d77f80ac58cd00000000000000000000000000000000000000000000000000000000620003ce60201b60201c565b620002087f5b5e139f00000000000000000000000000000000000000000000000000000000620003ce60201b60201c565b620002397f780e9d6300000000000000000000000000000000000000000000000000000000620003ce60201b60201c565b505060006200024d620004a660201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200031660405180606001604052806021815260200162005d1b60219139620004ae60201b60201c565b620003293360006200055160201b60201c565b43600b60008081526020019081526020016000208190555033600c600080815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405180610e000160405280610dc4815260200162005d5d610dc4913960109080519060200190620003c792919062000c2b565b50620011fc565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200043a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004319062000eba565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b620004be620004a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004e46200057760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200053d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005349062000f20565b60405180910390fd5b6200054e81620005a160201b60201c565b50565b62000573828260405180602001604052806000815250620005bd60201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060099080519060200190620005b992919062000c2b565b5050565b620005cf83836200062b60201b60201c565b620005e46000848484620007dd60201b60201c565b62000626576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200061d9062000e98565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200069e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006959062000efe565b60405180910390fd5b620006af816200099760201b60201c565b15620006f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006e99062000edc565b60405180910390fd5b6200070660008383620009bb60201b60201c565b6200075e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620009c060201b620021af1790919060201c565b506200077c81836002620009e260201b620021c9179092919060201c565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200080b8473ffffffffffffffffffffffffffffffffffffffff1662000a1f60201b620021fe1760201c565b156200098a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200083d620004a660201b60201c565b8786866040518563ffffffff1660e01b815260040162000861949392919062000e44565b602060405180830381600087803b1580156200087c57600080fd5b505af1925050508015620008b057506040513d601f19601f82011682018060405250810190620008ad919062000cf2565b60015b62000939573d8060008114620008e3576040519150601f19603f3d011682016040523d82523d6000602084013e620008e8565b606091505b5060008151141562000931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009289062000e98565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200098f565b600190505b949350505050565b6000620009b482600262000a3260201b620022111790919060201c565b9050919050565b505050565b6000620009da836000018360001b62000a5460201b60201c565b905092915050565b600062000a16846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b62000ace60201b60201c565b90509392505050565b600080823b905060008111915050919050565b600062000a4c836000018360001b62000be560201b60201c565b905092915050565b600062000a68838362000c0860201b60201c565b62000ac357826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000ac8565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141562000b775784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505062000bde565b828560000160018362000b8b919062000f6f565b8154811062000bc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805462000c39906200104a565b90600052602060002090601f01602090048101928262000c5d576000855562000ca9565b82601f1062000c7857805160ff191683800117855562000ca9565b8280016001018555821562000ca9579182015b8281111562000ca857825182559160200191906001019062000c8b565b5b50905062000cb8919062000cbc565b5090565b5b8082111562000cd757600081600090555060010162000cbd565b5090565b60008151905062000cec81620011e2565b92915050565b60006020828403121562000d0557600080fd5b600062000d158482850162000cdb565b91505092915050565b62000d298162000faa565b82525050565b600062000d3c8262000f42565b62000d48818562000f4d565b935062000d5a81856020860162001014565b62000d6581620010de565b840191505092915050565b600062000d7f60328362000f5e565b915062000d8c82620010ef565b604082019050919050565b600062000da6601c8362000f5e565b915062000db3826200113e565b602082019050919050565b600062000dcd601c8362000f5e565b915062000dda8262001167565b602082019050919050565b600062000df460208362000f5e565b915062000e018262001190565b602082019050919050565b600062000e1b60208362000f5e565b915062000e2882620011b9565b602082019050919050565b62000e3e816200100a565b82525050565b600060808201905062000e5b600083018762000d1e565b62000e6a602083018662000d1e565b62000e79604083018562000e33565b818103606083015262000e8d818462000d2f565b905095945050505050565b6000602082019050818103600083015262000eb38162000d70565b9050919050565b6000602082019050818103600083015262000ed58162000d97565b9050919050565b6000602082019050818103600083015262000ef78162000dbe565b9050919050565b6000602082019050818103600083015262000f198162000de5565b9050919050565b6000602082019050818103600083015262000f3b8162000e0c565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000f7c826200100a565b915062000f89836200100a565b92508282101562000f9f5762000f9e62001080565b5b828203905092915050565b600062000fb78262000fea565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200103457808201518184015260208101905062001017565b8381111562001044576000848401525b50505050565b600060028204905060018216806200106357607f821691505b602082108114156200107a5762001079620010af565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620011ed8162000fbe565b8114620011f957600080fd5b50565b614b0f806200120c6000396000f3fe60806040526004361061023b5760003560e01c8063715018a61161012e578063a3864397116100ab578063d348b4091161006f578063d348b4091461088f578063de69fe88146108ba578063e985e9c5146108e5578063f0c9dc6014610922578063f2fde38b1461094d5761023b565b8063a386439714610772578063b88d4fde146107af578063c87b56dd146107d8578063c8a0122614610815578063cd53d08e146108525761023b565b8063891cc177116100f2578063891cc1771461068d5780638da5cb5b146106b657806395d89b41146106e15780639758e9041461070c578063a22cb465146107495761023b565b8063715018a6146105d9578063753853c1146105f0578063834906661461061b5780638462151c14610646578063853828b6146106835761023b565b80632f745c59116101bc5780636352211e116101805780636352211e146104db57806363d96941146105185780636c0360eb146105555780636e9ced3f1461058057806370a082311461059c5761023b565b80632f745c59146103f857806334d84c7b1461043557806342842e0e1461044c5780634f6ccce71461047557806355f804b3146104b25761023b565b806318160ddd1161020357806318160ddd146103375780631c8b232d1461036257806323b872dd1461038d5780632808c92c146103b65780632ee2ac36146103cd5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063109695231461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135a1565b610976565b6040516102749190613c8f565b60405180910390f35b34801561028957600080fd5b506102926109dd565b60405161029f9190613cc5565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613634565b610a6f565b6040516102dc9190613c06565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613565565b610af4565b005b34801561031a57600080fd5b50610335600480360381019061033091906135f3565b610c0c565b005b34801561034357600080fd5b5061034c610ca2565b6040516103599190613fa7565b60405180910390f35b34801561036e57600080fd5b50610377610cb3565b6040516103849190613c8f565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af919061345f565b610cc6565b005b3480156103c257600080fd5b506103cb610d26565b005b3480156103d957600080fd5b506103e2610dbf565b6040516103ef9190613cc5565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613565565b610e4d565b60405161042c9190613fa7565b60405180910390f35b34801561044157600080fd5b5061044a610ea8565b005b34801561045857600080fd5b50610473600480360381019061046e919061345f565b610f41565b005b34801561048157600080fd5b5061049c60048036038101906104979190613634565b610f61565b6040516104a99190613fa7565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d491906135f3565b610f84565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190613634565b61100c565b60405161050f9190613c06565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613634565b611043565b60405161054c9190613cc5565b60405180910390f35b34801561056157600080fd5b5061056a6110bf565b6040516105779190613cc5565b60405180910390f35b61059a60048036038101906105959190613634565b611151565b005b3480156105a857600080fd5b506105c360048036038101906105be91906133fa565b611349565b6040516105d09190613fa7565b60405180910390f35b3480156105e557600080fd5b506105ee611408565b005b3480156105fc57600080fd5b50610605611545565b6040516106129190613cc5565b60405180910390f35b34801561062757600080fd5b506106306115d3565b60405161063d9190613fa7565b60405180910390f35b34801561065257600080fd5b5061066d600480360381019061066891906133fa565b6115d9565b60405161067a9190613c6d565b60405180910390f35b61068b611755565b005b34801561069957600080fd5b506106b460048036038101906106af91906135f3565b611811565b005b3480156106c257600080fd5b506106cb6118a7565b6040516106d89190613c06565b60405180910390f35b3480156106ed57600080fd5b506106f66118d1565b6040516107039190613cc5565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190613634565b611963565b6040516107409190613cc5565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b9190613529565b6119df565b005b34801561077e57600080fd5b5061079960048036038101906107949190613634565b611b60565b6040516107a69190613caa565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d191906134ae565b611c24565b005b3480156107e457600080fd5b506107ff60048036038101906107fa9190613634565b611c86565b60405161080c9190613cc5565b60405180910390f35b34801561082157600080fd5b5061083c60048036038101906108379190613634565b611df9565b6040516108499190613fa7565b60405180910390f35b34801561085e57600080fd5b5061087960048036038101906108749190613634565b611e11565b6040516108869190613c06565b60405180910390f35b34801561089b57600080fd5b506108a4611e44565b6040516108b19190613fa7565b60405180910390f35b3480156108c657600080fd5b506108cf611e53565b6040516108dc9190613cc5565b60405180910390f35b3480156108f157600080fd5b5061090c60048036038101906109079190613423565b611ee1565b6040516109199190613c8f565b60405180910390f35b34801561092e57600080fd5b50610937611f75565b6040516109449190613cc5565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f91906133fa565b612003565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600680546109ec906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054610a18906142af565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050905090565b6000610a7a8261222b565b610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090613e87565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aff8261100c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790613f07565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8f612248565b73ffffffffffffffffffffffffffffffffffffffff161480610bbe5750610bbd81610bb8612248565b611ee1565b5b610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490613de7565b60405180910390fd5b610c078383612250565b505050565b610c14612248565b73ffffffffffffffffffffffffffffffffffffffff16610c326118a7565b73ffffffffffffffffffffffffffffffffffffffff1614610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613ea7565b60405180910390fd5b80600d9080519060200190610c9e92919061321e565b5050565b6000610cae6002612309565b905090565b600a60149054906101000a900460ff1681565b610cd7610cd1612248565b8261231e565b610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613f67565b60405180910390fd5b610d218383836123fc565b505050565b610d2e612248565b73ffffffffffffffffffffffffffffffffffffffff16610d4c6118a7565b73ffffffffffffffffffffffffffffffffffffffff1614610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990613ea7565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b600e8054610dcc906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054610df8906142af565b8015610e455780601f10610e1a57610100808354040283529160200191610e45565b820191906000526020600020905b815481529060010190602001808311610e2857829003601f168201915b505050505081565b6000610ea082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061261390919063ffffffff16565b905092915050565b610eb0612248565b73ffffffffffffffffffffffffffffffffffffffff16610ece6118a7565b73ffffffffffffffffffffffffffffffffffffffff1614610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90613ea7565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610f5c83838360405180602001604052806000815250611c24565b505050565b600080610f7883600261262d90919063ffffffff16565b50905080915050919050565b610f8c612248565b73ffffffffffffffffffffffffffffffffffffffff16610faa6118a7565b73ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790613ea7565b60405180910390fd5b61100981612659565b50565b600061103c82604051806060016040528060298152602001614ab16029913960026126739092919063ffffffff16565b9050919050565b606061104e8261222b565b61108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490613f87565b60405180910390fd5b600e61109883612692565b6040516020016110a9929190613be2565b6040516020818303038152906040529050919050565b6060600980546110ce906142af565b80601f01602080910402602001604051908101604052809291908181526020018280546110fa906142af565b80156111475780601f1061111c57610100808354040283529160200191611147565b820191906000526020600020905b81548152906001019060200180831161112a57829003601f168201915b5050505050905090565b61040061115c610ca2565b1061119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390613f27565b60405180910390fd5b6000811180156111ad5750600a8111155b6111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e390613f47565b60405180910390fd5b610400611209826111fb610ca2565b61283f90919063ffffffff16565b111561124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190613da7565b60405180910390fd5b61126481611256611e44565b61285590919063ffffffff16565b3410156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613e27565b60405180910390fd5b60005b818110156113455760006112bb610ca2565b90506112c7338261286b565b43600b60008381526020019081526020016000208190555033600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050808061133d90614312565b9150506112a9565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b190613e07565b60405180910390fd5b611401600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612889565b9050919050565b611410612248565b73ffffffffffffffffffffffffffffffffffffffff1661142e6118a7565b73ffffffffffffffffffffffffffffffffffffffff1614611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600f8054611552906142af565b80601f016020809104026020016040519081016040528092919081815260200182805461157e906142af565b80156115cb5780601f106115a0576101008083540402835291602001916115cb565b820191906000526020600020905b8154815290600101906020018083116115ae57829003601f168201915b505050505081565b61040081565b606060006115e683611349565b9050600081141561166957600067ffffffffffffffff811115611632577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116605781602001602082028036833780820191505090505b50915050611750565b60008167ffffffffffffffff8111156116ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116d95781602001602082028036833780820191505090505b50905060005b82811015611749576116f18582610e4d565b82828151811061172a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061174190614312565b9150506116df565b8193505050505b919050565b61175d612248565b73ffffffffffffffffffffffffffffffffffffffff1661177b6118a7565b73ffffffffffffffffffffffffffffffffffffffff16146117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613ea7565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061180f57600080fd5b565b611819612248565b73ffffffffffffffffffffffffffffffffffffffff166118376118a7565b73ffffffffffffffffffffffffffffffffffffffff161461188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490613ea7565b60405180910390fd5b80600f90805190602001906118a392919061321e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546118e0906142af565b80601f016020809104026020016040519081016040528092919081815260200182805461190c906142af565b80156119595780601f1061192e57610100808354040283529160200191611959565b820191906000526020600020905b81548152906001019060200180831161193c57829003601f168201915b5050505050905090565b606061196e8261222b565b6119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a490613f87565b60405180910390fd5b600f6119b883612692565b6040516020016119c9929190613be2565b6040516020818303038152906040529050919050565b6119e7612248565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90613d87565b60405180910390fd5b8060056000611a62612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b0f612248565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b549190613c8f565b60405180910390a35050565b6000611b6b8261222b565b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613f87565b60405180910390fd5b30600b600084815260200190815260200160002054600c600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051602001611c079493929190613b70565b604051602081830303815290604052805190602001209050919050565b611c35611c2f612248565b8361231e565b611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90613f67565b60405180910390fd5b611c808484848461289e565b50505050565b6060611c918261222b565b611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613ee7565b60405180910390fd5b6000600860008481526020019081526020016000208054611cf0906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1c906142af565b8015611d695780601f10611d3e57610100808354040283529160200191611d69565b820191906000526020600020905b815481529060010190602001808311611d4c57829003601f168201915b505050505090506000611d7a6110bf565b9050600081511415611d90578192505050611df4565b600082511115611dc5578082604051602001611dad929190613bbe565b60405160208183030381529060405292505050611df4565b80611dcf85612692565b604051602001611de0929190613bbe565b604051602081830303815290604052925050505b919050565b600b6020528060005260406000206000915090505481565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600066b1a2bc2ec50000905090565b60108054611e60906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8c906142af565b8015611ed95780601f10611eae57610100808354040283529160200191611ed9565b820191906000526020600020905b815481529060010190602001808311611ebc57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d8054611f82906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611fae906142af565b8015611ffb5780601f10611fd057610100808354040283529160200191611ffb565b820191906000526020600020905b815481529060010190602001808311611fde57829003601f168201915b505050505081565b61200b612248565b73ffffffffffffffffffffffffffffffffffffffff166120296118a7565b73ffffffffffffffffffffffffffffffffffffffff161461207f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207690613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690613d27565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006121c1836000018360001b6128fa565b905092915050565b60006121f5846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61296a565b90509392505050565b600080823b905060008111915050919050565b6000612223836000018360001b612a7c565b905092915050565b600061224182600261221190919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c38361100c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061231782600001612a9f565b9050919050565b60006123298261222b565b612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613dc7565b60405180910390fd5b60006123738361100c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123e257508373ffffffffffffffffffffffffffffffffffffffff166123ca84610a6f565b73ffffffffffffffffffffffffffffffffffffffff16145b806123f357506123f28185611ee1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661241c8261100c565b73ffffffffffffffffffffffffffffffffffffffff1614612472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246990613ec7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990613d67565b60405180910390fd5b6124ed838383612ab0565b6124f8600082612250565b61254981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ab590919063ffffffff16565b5061259b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121af90919063ffffffff16565b506125b2818360026121c99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006126228360000183612acf565b60001c905092915050565b6000806000806126408660000186612b69565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061266f92919061321e565b5050565b6000612686846000018460001b84612c19565b60001c90509392505050565b606060008214156126da576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061283a565b600082905060005b6000821461270c5780806126f590614312565b915050600a826127059190614130565b91506126e2565b60008167ffffffffffffffff81111561274e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127805781602001600182028036833780820191505090505b5090505b600085146128335760018261279991906141bb565b9150600a856127a89190614389565b60306127b491906140da565b60f81b8183815181106127f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561282c9190614130565b9450612784565b8093505050505b919050565b6000818361284d91906140da565b905092915050565b600081836128639190614161565b905092915050565b612885828260405180602001604052806000815250612ce0565b5050565b600061289782600001612d3b565b9050919050565b6128a98484846123fc565b6128b584848484612d4c565b6128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128eb90613d07565b60405180910390fd5b50505050565b60006129068383612ee3565b61295f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612964565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612a1157846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612a75565b8285600001600183612a2391906141bb565b81548110612a5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b6000612ac7836000018360001b612f06565b905092915050565b600081836000018054905011612b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1190613ce7565b60405180910390fd5b826000018281548110612b56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac90613e47565b60405180910390fd5b6000846000018481548110612bf3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c729190613cc5565b60405180910390fd5b5084600001600182612c8d91906141bb565b81548110612cc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b612cea8383613090565b612cf76000848484612d4c565b612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d90613d07565b60405180910390fd5b505050565b600081600001805490509050919050565b6000612d6d8473ffffffffffffffffffffffffffffffffffffffff166121fe565b15612ed6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d96612248565b8786866040518563ffffffff1660e01b8152600401612db89493929190613c21565b602060405180830381600087803b158015612dd257600080fd5b505af1925050508015612e0357506040513d601f19601f82011682018060405250810190612e0091906135ca565b60015b612e86573d8060008114612e33576040519150601f19603f3d011682016040523d82523d6000602084013e612e38565b606091505b50600081511415612e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7590613d07565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612edb565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114613084576000600182612f3891906141bb565b9050600060018660000180549050612f5091906141bb565b90506000866000018281548110612f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612fda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183612ff591906140da565b8760010160008381526020019081526020016000208190555086600001805480613048577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061308a565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f790613e67565b60405180910390fd5b6131098161222b565b15613149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314090613d47565b60405180910390fd5b61315560008383612ab0565b6131a681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121af90919063ffffffff16565b506131bd818360026121c99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461322a906142af565b90600052602060002090601f01602090048101928261324c5760008555613293565b82601f1061326557805160ff1916838001178555613293565b82800160010185558215613293579182015b82811115613292578251825591602001919060010190613277565b5b5090506132a091906132a4565b5090565b5b808211156132bd5760008160009055506001016132a5565b5090565b60006132d46132cf84613fe7565b613fc2565b9050828152602081018484840111156132ec57600080fd5b6132f784828561426d565b509392505050565b600061331261330d84614018565b613fc2565b90508281526020810184848401111561332a57600080fd5b61333584828561426d565b509392505050565b60008135905061334c81614a54565b92915050565b60008135905061336181614a6b565b92915050565b60008135905061337681614a82565b92915050565b60008151905061338b81614a82565b92915050565b600082601f8301126133a257600080fd5b81356133b28482602086016132c1565b91505092915050565b600082601f8301126133cc57600080fd5b81356133dc8482602086016132ff565b91505092915050565b6000813590506133f481614a99565b92915050565b60006020828403121561340c57600080fd5b600061341a8482850161333d565b91505092915050565b6000806040838503121561343657600080fd5b60006134448582860161333d565b92505060206134558582860161333d565b9150509250929050565b60008060006060848603121561347457600080fd5b60006134828682870161333d565b93505060206134938682870161333d565b92505060406134a4868287016133e5565b9150509250925092565b600080600080608085870312156134c457600080fd5b60006134d28782880161333d565b94505060206134e38782880161333d565b93505060406134f4878288016133e5565b925050606085013567ffffffffffffffff81111561351157600080fd5b61351d87828801613391565b91505092959194509250565b6000806040838503121561353c57600080fd5b600061354a8582860161333d565b925050602061355b85828601613352565b9150509250929050565b6000806040838503121561357857600080fd5b60006135868582860161333d565b9250506020613597858286016133e5565b9150509250929050565b6000602082840312156135b357600080fd5b60006135c184828501613367565b91505092915050565b6000602082840312156135dc57600080fd5b60006135ea8482850161337c565b91505092915050565b60006020828403121561360557600080fd5b600082013567ffffffffffffffff81111561361f57600080fd5b61362b848285016133bb565b91505092915050565b60006020828403121561364657600080fd5b6000613654848285016133e5565b91505092915050565b60006136698383613b3b565b60208301905092915050565b61367e816141ef565b82525050565b613695613690826141ef565b61435b565b82525050565b60006136a68261406e565b6136b0818561409c565b93506136bb83614049565b8060005b838110156136ec5781516136d3888261365d565b97506136de8361408f565b9250506001810190506136bf565b5085935050505092915050565b61370281614201565b82525050565b6137118161420d565b82525050565b600061372282614079565b61372c81856140ad565b935061373c81856020860161427c565b61374581614476565b840191505092915050565b600061375b82614084565b61376581856140be565b935061377581856020860161427c565b61377e81614476565b840191505092915050565b600061379482614084565b61379e81856140cf565b93506137ae81856020860161427c565b80840191505092915050565b600081546137c7816142af565b6137d181866140cf565b945060018216600081146137ec57600181146137fd57613830565b60ff19831686528186019350613830565b61380685614059565b60005b8381101561382857815481890152600182019150602081019050613809565b838801955050505b50505092915050565b60006138466022836140be565b915061385182614494565b604082019050919050565b60006138696032836140be565b9150613874826144e3565b604082019050919050565b600061388c6026836140be565b915061389782614532565b604082019050919050565b60006138af601c836140be565b91506138ba82614581565b602082019050919050565b60006138d26024836140be565b91506138dd826145aa565b604082019050919050565b60006138f56019836140be565b9150613900826145f9565b602082019050919050565b60006139186011836140be565b915061392382614622565b602082019050919050565b600061393b602c836140be565b91506139468261464b565b604082019050919050565b600061395e6038836140be565b91506139698261469a565b604082019050919050565b6000613981602a836140be565b915061398c826146e9565b604082019050919050565b60006139a46023836140be565b91506139af82614738565b604082019050919050565b60006139c76022836140be565b91506139d282614787565b604082019050919050565b60006139ea6020836140be565b91506139f5826147d6565b602082019050919050565b6000613a0d602c836140be565b9150613a18826147ff565b604082019050919050565b6000613a306020836140be565b9150613a3b8261484e565b602082019050919050565b6000613a536029836140be565b9150613a5e82614877565b604082019050919050565b6000613a76602f836140be565b9150613a81826148c6565b604082019050919050565b6000613a996021836140be565b9150613aa482614915565b604082019050919050565b6000613abc6016836140be565b9150613ac782614964565b602082019050919050565b6000613adf6029836140be565b9150613aea8261498d565b604082019050919050565b6000613b026031836140be565b9150613b0d826149dc565b604082019050919050565b6000613b25600e836140be565b9150613b3082614a2b565b602082019050919050565b613b4481614263565b82525050565b613b5381614263565b82525050565b613b6a613b6582614263565b61437f565b82525050565b6000613b7c8287613684565b601482019150613b8c8286613b59565b602082019150613b9c8285613684565b601482019150613bac8284613b59565b60208201915081905095945050505050565b6000613bca8285613789565b9150613bd68284613789565b91508190509392505050565b6000613bee82856137ba565b9150613bfa8284613789565b91508190509392505050565b6000602082019050613c1b6000830184613675565b92915050565b6000608082019050613c366000830187613675565b613c436020830186613675565b613c506040830185613b4a565b8181036060830152613c628184613717565b905095945050505050565b60006020820190508181036000830152613c87818461369b565b905092915050565b6000602082019050613ca460008301846136f9565b92915050565b6000602082019050613cbf6000830184613708565b92915050565b60006020820190508181036000830152613cdf8184613750565b905092915050565b60006020820190508181036000830152613d0081613839565b9050919050565b60006020820190508181036000830152613d208161385c565b9050919050565b60006020820190508181036000830152613d408161387f565b9050919050565b60006020820190508181036000830152613d60816138a2565b9050919050565b60006020820190508181036000830152613d80816138c5565b9050919050565b60006020820190508181036000830152613da0816138e8565b9050919050565b60006020820190508181036000830152613dc08161390b565b9050919050565b60006020820190508181036000830152613de08161392e565b9050919050565b60006020820190508181036000830152613e0081613951565b9050919050565b60006020820190508181036000830152613e2081613974565b9050919050565b60006020820190508181036000830152613e4081613997565b9050919050565b60006020820190508181036000830152613e60816139ba565b9050919050565b60006020820190508181036000830152613e80816139dd565b9050919050565b60006020820190508181036000830152613ea081613a00565b9050919050565b60006020820190508181036000830152613ec081613a23565b9050919050565b60006020820190508181036000830152613ee081613a46565b9050919050565b60006020820190508181036000830152613f0081613a69565b9050919050565b60006020820190508181036000830152613f2081613a8c565b9050919050565b60006020820190508181036000830152613f4081613aaf565b9050919050565b60006020820190508181036000830152613f6081613ad2565b9050919050565b60006020820190508181036000830152613f8081613af5565b9050919050565b60006020820190508181036000830152613fa081613b18565b9050919050565b6000602082019050613fbc6000830184613b4a565b92915050565b6000613fcc613fdd565b9050613fd882826142e1565b919050565b6000604051905090565b600067ffffffffffffffff82111561400257614001614447565b5b61400b82614476565b9050602081019050919050565b600067ffffffffffffffff82111561403357614032614447565b5b61403c82614476565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140e582614263565b91506140f083614263565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614125576141246143ba565b5b828201905092915050565b600061413b82614263565b915061414683614263565b925082614156576141556143e9565b5b828204905092915050565b600061416c82614263565b915061417783614263565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141b0576141af6143ba565b5b828202905092915050565b60006141c682614263565b91506141d183614263565b9250828210156141e4576141e36143ba565b5b828203905092915050565b60006141fa82614243565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561429a57808201518184015260208101905061427f565b838111156142a9576000848401525b50505050565b600060028204905060018216806142c757607f821691505b602082108114156142db576142da614418565b5b50919050565b6142ea82614476565b810181811067ffffffffffffffff8211171561430957614308614447565b5b80604052505050565b600061431d82614263565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143505761434f6143ba565b5b600182019050919050565b60006143668261436d565b9050919050565b600061437882614487565b9050919050565b6000819050919050565b600061439482614263565b915061439f83614263565b9250826143af576143ae6143e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45786365656473204d41585f52494e4753000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f596f752063616e20636c61696d206d696e696d756d20312c206d6178696d756d60008201527f2031302072696e67730000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b614a5d816141ef565b8114614a6857600080fd5b50565b614a7481614201565b8114614a7f57600080fd5b50565b614a8b81614217565b8114614a9657600080fd5b50565b614aa281614263565b8114614aad57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220605f1a437aa057c7a572cbb264cdfec003a4e4ff4fdd86ee981ae7a3a2b147ca64736f6c6343000804003368747470733a2f2f636861696e72696e67732e6172742f6170692f746f6b656e2f68747470733a2f2f636861696e72696e67732e636f6d2f67656e657261746f722f636c6173732052616e646f6d7b636f6e7374727563746f722865297b746869732e736565643d657d72616e646f6d5f64656328297b72657475726e20746869732e736565645e3d746869732e736565643c3c31332c746869732e736565645e3d746869732e736565643e3e31372c746869732e736565645e3d746869732e736565643c3c352c28746869732e736565643c303f312b7e746869732e736565643a746869732e7365656429253165332f3165337d72616e646f6d5f6265747765656e28652c61297b72657475726e20652b28612d65292a746869732e72616e646f6d5f64656328297d72616e646f6d5f696e7428652c61297b72657475726e204d6174682e666c6f6f7228746869732e72616e646f6d5f6265747765656e28652c612b3129297d72616e646f6d5f63686f6963652865297b72657475726e20655b4d6174682e666c6f6f7228746869732e72616e646f6d5f6265747765656e28302c2e39392a652e6c656e67746829295d7d7d6c65742073242c746f6b656e446174613d77696e646f772e746f6b656e486173682c736565643d7061727365496e7428746f6b656e446174612e736c69636528302c3136292c3136292c726e673d6e65772052616e646f6d2873656564292c70616c65747465733d5b276535346234622d6666613938372d6637656265382d3434343134302d316531653234272c276136656263392d3631666637652d3565656235622d3632616233372d333933343234272c273935663965332d3639656264302d3439643439642d3535383536342d353634393436272c273937663966392d6134646566392d6331653066372d6366626165312d633539666339272c276464643163372d6332636662322d3864623538302d3765383938372d346234613637272c273235303930322d3338303430652d3634306431342d3830306531332d616432383331272c273333333333332d3833393738382d6565653063622d6261613839382d626664376561272c273538353132332d6565633137302d6632613635612d6635383534392d373732663161272c276662663566332d6532383431332d3030303032322d6465336334622d633432383437272c273066613362312d6439653564362d6564646561342d6637613037322d666639623432272c273130303032622d3234303034362d3561313839612d3964346564642d653061616666272c273034363663382d3032336537642d3030313834352d3333343135632d376438353937272c273836313635372d6136343235332d6435366161302d6262646262342d666366306363272c273439333834332d3631393838652d6130623261362d6362626662622d656162646138272c273033316434342d3034333935652d3730613238382d6461623738352d643538393666272c276666306135342d6666356338612d6666383561312d6662623162642d663763616430272c273436336633612d3861383137632d6263623862312d6634663365652d653061666130272c276464366534322d6538646162322d3466366437612d6330643664662d656165616561272c276666643666662d6537633666662d6338623666662d6238633066662d626264306666272c276161386636362d6564396234302d6666656564622d3631633961382d626133623436272c276135373534382d6663643761642d6636633238622d3532393661352d383264646630272c273731336535612d3633613337352d6564633739622d6435376136362d636136363830272c273131346235662d3435363939302d6534666465312d6634356236392d366232373337272c276564663266622d6532656166632d6363646266642d6331643366652d616263346666272c273963616662372d6561643261632d6665393338632d6536623839632d343238316134272c273762646666322d6232663765662d6566663766362d6637643665302d663262356434272c276666636462322d6666623461322d6535393839622d6235383338642d366436383735272c276632643765652d6433626363302d6135363638622d3639333036642d306531303364272c276666626530622d6662353630372d6666303036652d3833333865632d336138366666272c273962356465352d6631356262352d6665653434302d3030626266392d303066356434272c276665653434302d6631356262352d3962356465352d3030626266392d303066356434272c273138316139392d3564393363632d3435343539332d6530353332382d653238393736272c274636313036372d3545323339442d3030463042352d3644454341462d463446344544272c276638663966612d6465653265362d6164623562642d3439353035372d323132353239272c273231323532392d3030303030302d6164623562642d3439353035372d663866396661275d2e6d617028653d3e652e73706c697428272d27292e6d617028653d3e2723272b6529292c70616c657474653d726e672e72616e646f6d5f63686f6963652870616c6574746573292c76696577706f72743d4d6174682e6d696e2877696e646f772e696e6e65724865696768742c77696e646f772e696e6e65725769647468292c773d76696577706f72742c683d76696577706f72742c726f773d726e672e72616e646f6d5f696e7428352c3330292c726f77733d726f772c6f66667365743d772f726f772c636f6c733d726e672e72616e646f6d5f696e7428726f772d726f772f332c3330292c7261646975733d772f726f772c527374726f6b653d772f3530302c63656c6c436f6c6f72733d5b5d2c63656c6c5368617065733d5b5d2c746f74616c3d726f77732a636f6c732c6d61784865696768743d7261646975732a726f77732c74243d302c74656d704672616d653d302c697354686963633d21312c726f746174696f6e243d726e672e72616e646f6d5f6265747765656e28302c31293b66756e6374696f6e207374726f6b652428297b72657475726e20697354686963633f2b2b74656d704672616d653e3d3165333f28697354686963633d21312c4d6174682e6d617828527374726f6b652c74656d704672616d652f313029293a4d6174682e6d617828527374726f6b652c74656d704672616d652f3130293a2874656d704672616d653d4d6174682e6162732874656d704672616d652d31292c4d6174682e6d617828527374726f6b652c74656d704672616d652f313029297d66756e6374696f6e20736574757028297b73243d726e672e72616e646f6d5f6265747765656e282e3030312c2e303034292c6672616d6552617465283336292c6e6f697365536565642873656564292c63726561746543616e76617328772c68293b666f72286c657420653d303b653c726f772a636f6c733b652b2b2963656c6c436f6c6f72735b655d3d726e672e72616e646f6d5f63686f6963652870616c657474652e736c69636528302c70616c657474652e6c656e6774682d3129292c63656c6c5368617065735b655d3d726e672e72616e646f6d5f6265747765656e28302c31297d66756e6374696f6e206472617728297b726f746174696f6e243c2e343f7472616e736c61746528302c302d6f66667365742f32293a726f746174696f6e243c2e363f28726f74617465282d50492f32292c7363616c65282d31292c7472616e736c61746528302c2d772d6f66667365742f3229293a726f746174696f6e243c2e383f28726f74617465282d5049292c7472616e736c617465282d772c2d772d7261646975732f3229293a28726f74617465282d50492f32292c7472616e736c617465282d772c2d6f66667365742f3229292c6261636b67726f756e642870616c657474655b70616c657474652e6c656e6774682d315d292c6e6f46696c6c28292c7374726f6b65576569676874287374726f6b65242829293b666f72286c657420653d303b653c636f6c733b652b2b297b636f6e737420613d77696474682f28636f6c732d31292a653b6c657420743d2874242b28636f6c732d65292f28322a636f6c73292b312925313b743d4d6174682e73696e286d617028636f7328742a54574f5f5049292c2d312c312c302c31292f312a284d6174682e50492f3229293b666f72286c657420663d303b663c726f77733b662b2b297b636f6e737420643d662f726f77732a742a6d61784865696768742b6f66667365743b6966287374726f6b652863656c6c436f6c6f72735b662a655d292c63656c6c5368617065735b662a655d3e2e3935297075736828292c66696c6c2863656c6c436f6c6f72735b662a655d292c656c6c6970736528612c642c726164697573292c706f7028293b656c73652069662863656c6c5368617065735b662a655d3e2e37297b69662863656c6c5368617065735b662a655d3e2e3732297b7075736828293b6c657420653d636f6c6f7228726e672e72616e646f6d5f63686f6963652870616c6574746529292c613d636f6c6f7228726e672e72616e646f6d5f63686f6963652870616c6574746529293b66696c6c286c657270436f6c6f7228652c612c4d6174682e616273283130302a73696e283130302a6672616d65436f756e74292929292c6e6f5374726f6b6528292c706f7028297d7265637428612d7261646975732f322c642d7261646975732f322c7261646975732c7261646975732c3130302a4d6174682e6162732873696e286672616d65436f756e742f3130302929297d656c736520656c6c6970736528612c642c726164697573297d7d2874242b3d7324293e3d3126262874243d30297d66756e6374696f6e206d6f757365436c69636b656428297b697354686963633d21697354686963637d

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063715018a61161012e578063a3864397116100ab578063d348b4091161006f578063d348b4091461088f578063de69fe88146108ba578063e985e9c5146108e5578063f0c9dc6014610922578063f2fde38b1461094d5761023b565b8063a386439714610772578063b88d4fde146107af578063c87b56dd146107d8578063c8a0122614610815578063cd53d08e146108525761023b565b8063891cc177116100f2578063891cc1771461068d5780638da5cb5b146106b657806395d89b41146106e15780639758e9041461070c578063a22cb465146107495761023b565b8063715018a6146105d9578063753853c1146105f0578063834906661461061b5780638462151c14610646578063853828b6146106835761023b565b80632f745c59116101bc5780636352211e116101805780636352211e146104db57806363d96941146105185780636c0360eb146105555780636e9ced3f1461058057806370a082311461059c5761023b565b80632f745c59146103f857806334d84c7b1461043557806342842e0e1461044c5780634f6ccce71461047557806355f804b3146104b25761023b565b806318160ddd1161020357806318160ddd146103375780631c8b232d1461036257806323b872dd1461038d5780632808c92c146103b65780632ee2ac36146103cd5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063109695231461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135a1565b610976565b6040516102749190613c8f565b60405180910390f35b34801561028957600080fd5b506102926109dd565b60405161029f9190613cc5565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613634565b610a6f565b6040516102dc9190613c06565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613565565b610af4565b005b34801561031a57600080fd5b50610335600480360381019061033091906135f3565b610c0c565b005b34801561034357600080fd5b5061034c610ca2565b6040516103599190613fa7565b60405180910390f35b34801561036e57600080fd5b50610377610cb3565b6040516103849190613c8f565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af919061345f565b610cc6565b005b3480156103c257600080fd5b506103cb610d26565b005b3480156103d957600080fd5b506103e2610dbf565b6040516103ef9190613cc5565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613565565b610e4d565b60405161042c9190613fa7565b60405180910390f35b34801561044157600080fd5b5061044a610ea8565b005b34801561045857600080fd5b50610473600480360381019061046e919061345f565b610f41565b005b34801561048157600080fd5b5061049c60048036038101906104979190613634565b610f61565b6040516104a99190613fa7565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d491906135f3565b610f84565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190613634565b61100c565b60405161050f9190613c06565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613634565b611043565b60405161054c9190613cc5565b60405180910390f35b34801561056157600080fd5b5061056a6110bf565b6040516105779190613cc5565b60405180910390f35b61059a60048036038101906105959190613634565b611151565b005b3480156105a857600080fd5b506105c360048036038101906105be91906133fa565b611349565b6040516105d09190613fa7565b60405180910390f35b3480156105e557600080fd5b506105ee611408565b005b3480156105fc57600080fd5b50610605611545565b6040516106129190613cc5565b60405180910390f35b34801561062757600080fd5b506106306115d3565b60405161063d9190613fa7565b60405180910390f35b34801561065257600080fd5b5061066d600480360381019061066891906133fa565b6115d9565b60405161067a9190613c6d565b60405180910390f35b61068b611755565b005b34801561069957600080fd5b506106b460048036038101906106af91906135f3565b611811565b005b3480156106c257600080fd5b506106cb6118a7565b6040516106d89190613c06565b60405180910390f35b3480156106ed57600080fd5b506106f66118d1565b6040516107039190613cc5565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190613634565b611963565b6040516107409190613cc5565b60405180910390f35b34801561075557600080fd5b50610770600480360381019061076b9190613529565b6119df565b005b34801561077e57600080fd5b5061079960048036038101906107949190613634565b611b60565b6040516107a69190613caa565b60405180910390f35b3480156107bb57600080fd5b506107d660048036038101906107d191906134ae565b611c24565b005b3480156107e457600080fd5b506107ff60048036038101906107fa9190613634565b611c86565b60405161080c9190613cc5565b60405180910390f35b34801561082157600080fd5b5061083c60048036038101906108379190613634565b611df9565b6040516108499190613fa7565b60405180910390f35b34801561085e57600080fd5b5061087960048036038101906108749190613634565b611e11565b6040516108869190613c06565b60405180910390f35b34801561089b57600080fd5b506108a4611e44565b6040516108b19190613fa7565b60405180910390f35b3480156108c657600080fd5b506108cf611e53565b6040516108dc9190613cc5565b60405180910390f35b3480156108f157600080fd5b5061090c60048036038101906109079190613423565b611ee1565b6040516109199190613c8f565b60405180910390f35b34801561092e57600080fd5b50610937611f75565b6040516109449190613cc5565b60405180910390f35b34801561095957600080fd5b50610974600480360381019061096f91906133fa565b612003565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600680546109ec906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054610a18906142af565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050905090565b6000610a7a8261222b565b610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090613e87565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aff8261100c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790613f07565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8f612248565b73ffffffffffffffffffffffffffffffffffffffff161480610bbe5750610bbd81610bb8612248565b611ee1565b5b610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490613de7565b60405180910390fd5b610c078383612250565b505050565b610c14612248565b73ffffffffffffffffffffffffffffffffffffffff16610c326118a7565b73ffffffffffffffffffffffffffffffffffffffff1614610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613ea7565b60405180910390fd5b80600d9080519060200190610c9e92919061321e565b5050565b6000610cae6002612309565b905090565b600a60149054906101000a900460ff1681565b610cd7610cd1612248565b8261231e565b610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613f67565b60405180910390fd5b610d218383836123fc565b505050565b610d2e612248565b73ffffffffffffffffffffffffffffffffffffffff16610d4c6118a7565b73ffffffffffffffffffffffffffffffffffffffff1614610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990613ea7565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b600e8054610dcc906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054610df8906142af565b8015610e455780601f10610e1a57610100808354040283529160200191610e45565b820191906000526020600020905b815481529060010190602001808311610e2857829003601f168201915b505050505081565b6000610ea082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061261390919063ffffffff16565b905092915050565b610eb0612248565b73ffffffffffffffffffffffffffffffffffffffff16610ece6118a7565b73ffffffffffffffffffffffffffffffffffffffff1614610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90613ea7565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610f5c83838360405180602001604052806000815250611c24565b505050565b600080610f7883600261262d90919063ffffffff16565b50905080915050919050565b610f8c612248565b73ffffffffffffffffffffffffffffffffffffffff16610faa6118a7565b73ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790613ea7565b60405180910390fd5b61100981612659565b50565b600061103c82604051806060016040528060298152602001614ab16029913960026126739092919063ffffffff16565b9050919050565b606061104e8261222b565b61108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490613f87565b60405180910390fd5b600e61109883612692565b6040516020016110a9929190613be2565b6040516020818303038152906040529050919050565b6060600980546110ce906142af565b80601f01602080910402602001604051908101604052809291908181526020018280546110fa906142af565b80156111475780601f1061111c57610100808354040283529160200191611147565b820191906000526020600020905b81548152906001019060200180831161112a57829003601f168201915b5050505050905090565b61040061115c610ca2565b1061119c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119390613f27565b60405180910390fd5b6000811180156111ad5750600a8111155b6111ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e390613f47565b60405180910390fd5b610400611209826111fb610ca2565b61283f90919063ffffffff16565b111561124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190613da7565b60405180910390fd5b61126481611256611e44565b61285590919063ffffffff16565b3410156112a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129d90613e27565b60405180910390fd5b60005b818110156113455760006112bb610ca2565b90506112c7338261286b565b43600b60008381526020019081526020016000208190555033600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050808061133d90614312565b9150506112a9565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b190613e07565b60405180910390fd5b611401600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612889565b9050919050565b611410612248565b73ffffffffffffffffffffffffffffffffffffffff1661142e6118a7565b73ffffffffffffffffffffffffffffffffffffffff1614611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600f8054611552906142af565b80601f016020809104026020016040519081016040528092919081815260200182805461157e906142af565b80156115cb5780601f106115a0576101008083540402835291602001916115cb565b820191906000526020600020905b8154815290600101906020018083116115ae57829003601f168201915b505050505081565b61040081565b606060006115e683611349565b9050600081141561166957600067ffffffffffffffff811115611632577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116605781602001602082028036833780820191505090505b50915050611750565b60008167ffffffffffffffff8111156116ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116d95781602001602082028036833780820191505090505b50905060005b82811015611749576116f18582610e4d565b82828151811061172a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061174190614312565b9150506116df565b8193505050505b919050565b61175d612248565b73ffffffffffffffffffffffffffffffffffffffff1661177b6118a7565b73ffffffffffffffffffffffffffffffffffffffff16146117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890613ea7565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061180f57600080fd5b565b611819612248565b73ffffffffffffffffffffffffffffffffffffffff166118376118a7565b73ffffffffffffffffffffffffffffffffffffffff161461188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490613ea7565b60405180910390fd5b80600f90805190602001906118a392919061321e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546118e0906142af565b80601f016020809104026020016040519081016040528092919081815260200182805461190c906142af565b80156119595780601f1061192e57610100808354040283529160200191611959565b820191906000526020600020905b81548152906001019060200180831161193c57829003601f168201915b5050505050905090565b606061196e8261222b565b6119ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a490613f87565b60405180910390fd5b600f6119b883612692565b6040516020016119c9929190613be2565b6040516020818303038152906040529050919050565b6119e7612248565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90613d87565b60405180910390fd5b8060056000611a62612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b0f612248565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b549190613c8f565b60405180910390a35050565b6000611b6b8261222b565b611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613f87565b60405180910390fd5b30600b600084815260200190815260200160002054600c600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051602001611c079493929190613b70565b604051602081830303815290604052805190602001209050919050565b611c35611c2f612248565b8361231e565b611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90613f67565b60405180910390fd5b611c808484848461289e565b50505050565b6060611c918261222b565b611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790613ee7565b60405180910390fd5b6000600860008481526020019081526020016000208054611cf0906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1c906142af565b8015611d695780601f10611d3e57610100808354040283529160200191611d69565b820191906000526020600020905b815481529060010190602001808311611d4c57829003601f168201915b505050505090506000611d7a6110bf565b9050600081511415611d90578192505050611df4565b600082511115611dc5578082604051602001611dad929190613bbe565b60405160208183030381529060405292505050611df4565b80611dcf85612692565b604051602001611de0929190613bbe565b604051602081830303815290604052925050505b919050565b600b6020528060005260406000206000915090505481565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600066b1a2bc2ec50000905090565b60108054611e60906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8c906142af565b8015611ed95780601f10611eae57610100808354040283529160200191611ed9565b820191906000526020600020905b815481529060010190602001808311611ebc57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d8054611f82906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611fae906142af565b8015611ffb5780601f10611fd057610100808354040283529160200191611ffb565b820191906000526020600020905b815481529060010190602001808311611fde57829003601f168201915b505050505081565b61200b612248565b73ffffffffffffffffffffffffffffffffffffffff166120296118a7565b73ffffffffffffffffffffffffffffffffffffffff161461207f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207690613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690613d27565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006121c1836000018360001b6128fa565b905092915050565b60006121f5846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61296a565b90509392505050565b600080823b905060008111915050919050565b6000612223836000018360001b612a7c565b905092915050565b600061224182600261221190919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c38361100c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061231782600001612a9f565b9050919050565b60006123298261222b565b612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613dc7565b60405180910390fd5b60006123738361100c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123e257508373ffffffffffffffffffffffffffffffffffffffff166123ca84610a6f565b73ffffffffffffffffffffffffffffffffffffffff16145b806123f357506123f28185611ee1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661241c8261100c565b73ffffffffffffffffffffffffffffffffffffffff1614612472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246990613ec7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990613d67565b60405180910390fd5b6124ed838383612ab0565b6124f8600082612250565b61254981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ab590919063ffffffff16565b5061259b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121af90919063ffffffff16565b506125b2818360026121c99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006126228360000183612acf565b60001c905092915050565b6000806000806126408660000186612b69565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061266f92919061321e565b5050565b6000612686846000018460001b84612c19565b60001c90509392505050565b606060008214156126da576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061283a565b600082905060005b6000821461270c5780806126f590614312565b915050600a826127059190614130565b91506126e2565b60008167ffffffffffffffff81111561274e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127805781602001600182028036833780820191505090505b5090505b600085146128335760018261279991906141bb565b9150600a856127a89190614389565b60306127b491906140da565b60f81b8183815181106127f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561282c9190614130565b9450612784565b8093505050505b919050565b6000818361284d91906140da565b905092915050565b600081836128639190614161565b905092915050565b612885828260405180602001604052806000815250612ce0565b5050565b600061289782600001612d3b565b9050919050565b6128a98484846123fc565b6128b584848484612d4c565b6128f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128eb90613d07565b60405180910390fd5b50505050565b60006129068383612ee3565b61295f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612964565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612a1157846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612a75565b8285600001600183612a2391906141bb565b81548110612a5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b6000612ac7836000018360001b612f06565b905092915050565b600081836000018054905011612b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1190613ce7565b60405180910390fd5b826000018281548110612b56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac90613e47565b60405180910390fd5b6000846000018481548110612bf3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c729190613cc5565b60405180910390fd5b5084600001600182612c8d91906141bb565b81548110612cc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b612cea8383613090565b612cf76000848484612d4c565b612d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2d90613d07565b60405180910390fd5b505050565b600081600001805490509050919050565b6000612d6d8473ffffffffffffffffffffffffffffffffffffffff166121fe565b15612ed6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d96612248565b8786866040518563ffffffff1660e01b8152600401612db89493929190613c21565b602060405180830381600087803b158015612dd257600080fd5b505af1925050508015612e0357506040513d601f19601f82011682018060405250810190612e0091906135ca565b60015b612e86573d8060008114612e33576040519150601f19603f3d011682016040523d82523d6000602084013e612e38565b606091505b50600081511415612e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7590613d07565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612edb565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114613084576000600182612f3891906141bb565b9050600060018660000180549050612f5091906141bb565b90506000866000018281548110612f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612fda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183612ff591906140da565b8760010160008381526020019081526020016000208190555086600001805480613048577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061308a565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f790613e67565b60405180910390fd5b6131098161222b565b15613149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314090613d47565b60405180910390fd5b61315560008383612ab0565b6131a681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121af90919063ffffffff16565b506131bd818360026121c99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461322a906142af565b90600052602060002090601f01602090048101928261324c5760008555613293565b82601f1061326557805160ff1916838001178555613293565b82800160010185558215613293579182015b82811115613292578251825591602001919060010190613277565b5b5090506132a091906132a4565b5090565b5b808211156132bd5760008160009055506001016132a5565b5090565b60006132d46132cf84613fe7565b613fc2565b9050828152602081018484840111156132ec57600080fd5b6132f784828561426d565b509392505050565b600061331261330d84614018565b613fc2565b90508281526020810184848401111561332a57600080fd5b61333584828561426d565b509392505050565b60008135905061334c81614a54565b92915050565b60008135905061336181614a6b565b92915050565b60008135905061337681614a82565b92915050565b60008151905061338b81614a82565b92915050565b600082601f8301126133a257600080fd5b81356133b28482602086016132c1565b91505092915050565b600082601f8301126133cc57600080fd5b81356133dc8482602086016132ff565b91505092915050565b6000813590506133f481614a99565b92915050565b60006020828403121561340c57600080fd5b600061341a8482850161333d565b91505092915050565b6000806040838503121561343657600080fd5b60006134448582860161333d565b92505060206134558582860161333d565b9150509250929050565b60008060006060848603121561347457600080fd5b60006134828682870161333d565b93505060206134938682870161333d565b92505060406134a4868287016133e5565b9150509250925092565b600080600080608085870312156134c457600080fd5b60006134d28782880161333d565b94505060206134e38782880161333d565b93505060406134f4878288016133e5565b925050606085013567ffffffffffffffff81111561351157600080fd5b61351d87828801613391565b91505092959194509250565b6000806040838503121561353c57600080fd5b600061354a8582860161333d565b925050602061355b85828601613352565b9150509250929050565b6000806040838503121561357857600080fd5b60006135868582860161333d565b9250506020613597858286016133e5565b9150509250929050565b6000602082840312156135b357600080fd5b60006135c184828501613367565b91505092915050565b6000602082840312156135dc57600080fd5b60006135ea8482850161337c565b91505092915050565b60006020828403121561360557600080fd5b600082013567ffffffffffffffff81111561361f57600080fd5b61362b848285016133bb565b91505092915050565b60006020828403121561364657600080fd5b6000613654848285016133e5565b91505092915050565b60006136698383613b3b565b60208301905092915050565b61367e816141ef565b82525050565b613695613690826141ef565b61435b565b82525050565b60006136a68261406e565b6136b0818561409c565b93506136bb83614049565b8060005b838110156136ec5781516136d3888261365d565b97506136de8361408f565b9250506001810190506136bf565b5085935050505092915050565b61370281614201565b82525050565b6137118161420d565b82525050565b600061372282614079565b61372c81856140ad565b935061373c81856020860161427c565b61374581614476565b840191505092915050565b600061375b82614084565b61376581856140be565b935061377581856020860161427c565b61377e81614476565b840191505092915050565b600061379482614084565b61379e81856140cf565b93506137ae81856020860161427c565b80840191505092915050565b600081546137c7816142af565b6137d181866140cf565b945060018216600081146137ec57600181146137fd57613830565b60ff19831686528186019350613830565b61380685614059565b60005b8381101561382857815481890152600182019150602081019050613809565b838801955050505b50505092915050565b60006138466022836140be565b915061385182614494565b604082019050919050565b60006138696032836140be565b9150613874826144e3565b604082019050919050565b600061388c6026836140be565b915061389782614532565b604082019050919050565b60006138af601c836140be565b91506138ba82614581565b602082019050919050565b60006138d26024836140be565b91506138dd826145aa565b604082019050919050565b60006138f56019836140be565b9150613900826145f9565b602082019050919050565b60006139186011836140be565b915061392382614622565b602082019050919050565b600061393b602c836140be565b91506139468261464b565b604082019050919050565b600061395e6038836140be565b91506139698261469a565b604082019050919050565b6000613981602a836140be565b915061398c826146e9565b604082019050919050565b60006139a46023836140be565b91506139af82614738565b604082019050919050565b60006139c76022836140be565b91506139d282614787565b604082019050919050565b60006139ea6020836140be565b91506139f5826147d6565b602082019050919050565b6000613a0d602c836140be565b9150613a18826147ff565b604082019050919050565b6000613a306020836140be565b9150613a3b8261484e565b602082019050919050565b6000613a536029836140be565b9150613a5e82614877565b604082019050919050565b6000613a76602f836140be565b9150613a81826148c6565b604082019050919050565b6000613a996021836140be565b9150613aa482614915565b604082019050919050565b6000613abc6016836140be565b9150613ac782614964565b602082019050919050565b6000613adf6029836140be565b9150613aea8261498d565b604082019050919050565b6000613b026031836140be565b9150613b0d826149dc565b604082019050919050565b6000613b25600e836140be565b9150613b3082614a2b565b602082019050919050565b613b4481614263565b82525050565b613b5381614263565b82525050565b613b6a613b6582614263565b61437f565b82525050565b6000613b7c8287613684565b601482019150613b8c8286613b59565b602082019150613b9c8285613684565b601482019150613bac8284613b59565b60208201915081905095945050505050565b6000613bca8285613789565b9150613bd68284613789565b91508190509392505050565b6000613bee82856137ba565b9150613bfa8284613789565b91508190509392505050565b6000602082019050613c1b6000830184613675565b92915050565b6000608082019050613c366000830187613675565b613c436020830186613675565b613c506040830185613b4a565b8181036060830152613c628184613717565b905095945050505050565b60006020820190508181036000830152613c87818461369b565b905092915050565b6000602082019050613ca460008301846136f9565b92915050565b6000602082019050613cbf6000830184613708565b92915050565b60006020820190508181036000830152613cdf8184613750565b905092915050565b60006020820190508181036000830152613d0081613839565b9050919050565b60006020820190508181036000830152613d208161385c565b9050919050565b60006020820190508181036000830152613d408161387f565b9050919050565b60006020820190508181036000830152613d60816138a2565b9050919050565b60006020820190508181036000830152613d80816138c5565b9050919050565b60006020820190508181036000830152613da0816138e8565b9050919050565b60006020820190508181036000830152613dc08161390b565b9050919050565b60006020820190508181036000830152613de08161392e565b9050919050565b60006020820190508181036000830152613e0081613951565b9050919050565b60006020820190508181036000830152613e2081613974565b9050919050565b60006020820190508181036000830152613e4081613997565b9050919050565b60006020820190508181036000830152613e60816139ba565b9050919050565b60006020820190508181036000830152613e80816139dd565b9050919050565b60006020820190508181036000830152613ea081613a00565b9050919050565b60006020820190508181036000830152613ec081613a23565b9050919050565b60006020820190508181036000830152613ee081613a46565b9050919050565b60006020820190508181036000830152613f0081613a69565b9050919050565b60006020820190508181036000830152613f2081613a8c565b9050919050565b60006020820190508181036000830152613f4081613aaf565b9050919050565b60006020820190508181036000830152613f6081613ad2565b9050919050565b60006020820190508181036000830152613f8081613af5565b9050919050565b60006020820190508181036000830152613fa081613b18565b9050919050565b6000602082019050613fbc6000830184613b4a565b92915050565b6000613fcc613fdd565b9050613fd882826142e1565b919050565b6000604051905090565b600067ffffffffffffffff82111561400257614001614447565b5b61400b82614476565b9050602081019050919050565b600067ffffffffffffffff82111561403357614032614447565b5b61403c82614476565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140e582614263565b91506140f083614263565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614125576141246143ba565b5b828201905092915050565b600061413b82614263565b915061414683614263565b925082614156576141556143e9565b5b828204905092915050565b600061416c82614263565b915061417783614263565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141b0576141af6143ba565b5b828202905092915050565b60006141c682614263565b91506141d183614263565b9250828210156141e4576141e36143ba565b5b828203905092915050565b60006141fa82614243565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561429a57808201518184015260208101905061427f565b838111156142a9576000848401525b50505050565b600060028204905060018216806142c757607f821691505b602082108114156142db576142da614418565b5b50919050565b6142ea82614476565b810181811067ffffffffffffffff8211171561430957614308614447565b5b80604052505050565b600061431d82614263565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143505761434f6143ba565b5b600182019050919050565b60006143668261436d565b9050919050565b600061437882614487565b9050919050565b6000819050919050565b600061439482614263565b915061439f83614263565b9250826143af576143ae6143e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45786365656473204d41585f52494e4753000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f596f752063616e20636c61696d206d696e696d756d20312c206d6178696d756d60008201527f2031302072696e67730000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b614a5d816141ef565b8114614a6857600080fd5b50565b614a7481614201565b8114614a7f57600080fd5b50565b614a8b81614217565b8114614a9657600080fd5b50565b614aa281614263565b8114614aad57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220605f1a437aa057c7a572cbb264cdfec003a4e4ff4fdd86ee981ae7a3a2b147ca64736f6c63430008040033

Deployed Bytecode Sourcemap

65290:6617:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31945:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43633:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46419:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45949:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70655:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45427:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65429:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47309:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71033:67;;;;;;;;;;;;;:::i;:::-;;65645:69;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45189:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70963:66;;;;;;;;;;;;;:::i;:::-;;47685:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45715:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70872:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43389:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71450:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45008:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70063:562;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43096:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58490:148;;;;;;;;;;;;;:::i;:::-;;65717:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65389:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69564:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71104:111;;;:::i;:::-;;70763:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57839:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43802:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71693:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46712:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71219:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47907:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43977:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65466:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65518:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69972:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65761:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47078:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65599:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58793:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31945:150;32030:4;32054:20;:33;32075:11;32054:33;;;;;;;;;;;;;;;;;;;;;;;;;;;32047:40;;31945:150;;;:::o;43633:100::-;43687:13;43720:5;43713:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43633:100;:::o;46419:221::-;46495:7;46523:16;46531:7;46523;:16::i;:::-;46515:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46608:15;:24;46624:7;46608:24;;;;;;;;;;;;;;;;;;;;;46601:31;;46419:221;;;:::o;45949:404::-;46030:13;46046:23;46061:7;46046:14;:23::i;:::-;46030:39;;46094:5;46088:11;;:2;:11;;;;46080:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46174:5;46158:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;46183:44;46207:5;46214:12;:10;:12::i;:::-;46183:23;:44::i;:::-;46158:69;46150:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;46324:21;46333:2;46337:7;46324:8;:21::i;:::-;45949:404;;;:::o;70655:104::-;58070:12;:10;:12::i;:::-;58059:23;;:7;:5;:7::i;:::-;:23;;;58051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70750:5:::1;70723:24;:32;;;;;;;;;;;;:::i;:::-;;70655:104:::0;:::o;45427:211::-;45488:7;45609:21;:12;:19;:21::i;:::-;45602:28;;45427:211;:::o;65429:34::-;;;;;;;;;;;;;:::o;47309:305::-;47470:41;47489:12;:10;:12::i;:::-;47503:7;47470:18;:41::i;:::-;47462:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47578:28;47588:4;47594:2;47598:7;47578:9;:28::i;:::-;47309:305;;;:::o;71033:67::-;58070:12;:10;:12::i;:::-;58059:23;;:7;:5;:7::i;:::-;:23;;;58051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71091:5:::1;71074:14;;:22;;;;;;;;;;;;;;;;;;71033:67::o:0;65645:69::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45189:162::-;45286:7;45313:30;45337:5;45313:13;:20;45327:5;45313:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;45306:37;;45189:162;;;;:::o;70963:66::-;58070:12;:10;:12::i;:::-;58059:23;;:7;:5;:7::i;:::-;:23;;;58051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71021:4:::1;71004:14;;:21;;;;;;;;;;;;;;;;;;70963:66::o:0;47685:151::-;47789:39;47806:4;47812:2;47816:7;47789:39;;;;;;;;;;;;:16;:39::i;:::-;47685:151;;;:::o;45715:172::-;45790:7;45811:15;45832:22;45848:5;45832:12;:15;;:22;;;;:::i;:::-;45810:44;;;45872:7;45865:14;;;45715:172;;;:::o;70872:87::-;58070:12;:10;:12::i;:::-;58059:23;;:7;:5;:7::i;:::-;:23;;;58051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70935:20:::1;70947:7;70935:11;:20::i;:::-;70872:87:::0;:::o;43389:177::-;43461:7;43488:70;43505:7;43488:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;43481:77;;43389:177;;;:::o;71450:202::-;71514:13;71540:16;71548:7;71540;:16::i;:::-;71532:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;71609:17;71628:18;:7;:16;:18::i;:::-;71592:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71578:70;;71450:202;;;:::o;45008:97::-;45056:13;45089:8;45082:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45008:97;:::o;70063:562::-;65422:4;70126:13;:11;:13::i;:::-;:25;70118:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;70200:1;70189:8;:12;:30;;;;;70217:2;70205:8;:14;;70189:30;70181:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;65422:4;70276:27;70294:8;70276:13;:11;:13::i;:::-;:17;;:27;;;;:::i;:::-;:40;;70268:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;70362:30;70383:8;70362:16;:14;:16::i;:::-;:20;;:30;;;;:::i;:::-;70349:9;:43;;70341:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;70442:6;70437:185;70458:8;70454:1;:12;70437:185;;;70476:14;70493:13;:11;:13::i;:::-;70476:30;;70509:32;70519:10;70531:9;70509;:32::i;:::-;70571:12;70544:13;:24;70558:9;70544:24;;;;;;;;;;;:39;;;;70608:10;70586:8;:19;70595:9;70586:19;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;70437:185;70468:3;;;;;:::i;:::-;;;;70437:185;;;;70063:562;:::o;43096:221::-;43168:7;43213:1;43196:19;;:5;:19;;;;43188:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43280:29;:13;:20;43294:5;43280:20;;;;;;;;;;;;;;;:27;:29::i;:::-;43273:36;;43096:221;;;:::o;58490:148::-;58070:12;:10;:12::i;:::-;58059:23;;:7;:5;:7::i;:::-;:23;;;58051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58597:1:::1;58560:40;;58581:6;;;;;;;;;;;58560:40;;;;;;;;;;;;58628:1;58611:6;;:19;;;;;;;;;;;;;;;;;;58490:148::o:0;65717:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65389:37::-;65422:4;65389:37;:::o;69564:404::-;69625:16;69647:18;69668:17;69678:6;69668:9;:17::i;:::-;69647:38;;69706:1;69692:10;:15;69688:277;;;69759:1;69745:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69738:23;;;;;69688:277;69774:23;69814:10;69800:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69774:51;;69828:13;69844:102;69868:10;69860:5;:18;69844:102;;;69908:34;69928:6;69936:5;69908:19;:34::i;:::-;69892:6;69899:5;69892:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;69880:7;;;;;:::i;:::-;;;;69844:102;;;69955:6;69948:13;;;;;69564:404;;;;:::o;71104:111::-;58070:12;:10;:12::i;:::-;58059:23;;:7;:5;:7::i;:::-;:23;;;58051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71171:10:::1;71163:24;;:47;71188:21;71163:47;;;;;;;;;;;;;;;;;;;;;;;71155:56;;;::::0;::::1;;71104:111::o:0;70763:105::-;58070:12;:10;:12::i;:::-;58059:23;;:7;:5;:7::i;:::-;:23;;;58051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70859:5:::1;70834:22;:30;;;;;;;;;;;;:::i;:::-;;70763:105:::0;:::o;57839:87::-;57885:7;57912:6;;;;;;;;;;;57905:13;;57839:87;:::o;43802:104::-;43858:13;43891:7;43884:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43802:104;:::o;71693:211::-;71761:13;71787:16;71795:7;71787;:16::i;:::-;71779:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;71856:22;71880:18;:7;:16;:18::i;:::-;71839:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71825:75;;71693:211;;;:::o;46712:295::-;46827:12;:10;:12::i;:::-;46815:24;;:8;:24;;;;46807:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46927:8;46882:18;:32;46901:12;:10;:12::i;:::-;46882:32;;;;;;;;;;;;;;;:42;46915:8;46882:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46980:8;46951:48;;46966:12;:10;:12::i;:::-;46951:48;;;46990:8;46951:48;;;;;;:::i;:::-;;;;;;;;46712:295;;:::o;71219:227::-;71275:7;71294:16;71302:7;71294;:16::i;:::-;71286:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;71382:4;71389:13;:22;71403:7;71389:22;;;;;;;;;;;;71413:8;:17;71422:7;71413:17;;;;;;;;;;;;;;;;;;;;;71432:7;71357:83;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71347:94;;;;;;71332:110;;71219:227;;;:::o;47907:285::-;48039:41;48058:12;:10;:12::i;:::-;48072:7;48039:18;:41::i;:::-;48031:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;48145:39;48159:4;48165:2;48169:7;48178:5;48145:13;:39::i;:::-;47907:285;;;;:::o;43977:792::-;44050:13;44084:16;44092:7;44084;:16::i;:::-;44076:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44165:23;44191:10;:19;44202:7;44191:19;;;;;;;;;;;44165:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44221:18;44242:9;:7;:9::i;:::-;44221:30;;44349:1;44333:4;44327:18;:23;44323:72;;;44374:9;44367:16;;;;;;44323:72;44525:1;44505:9;44499:23;:27;44495:108;;;44574:4;44580:9;44557:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44543:48;;;;;;44495:108;44735:4;44741:18;:7;:16;:18::i;:::-;44718:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44704:57;;;;43977:792;;;;:::o;65466:49::-;;;;;;;;;;;;;;;;;:::o;65518:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;69972:87::-;70019:7;70038:17;70031:24;;69972:87;:::o;65761:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47078:164::-;47175:4;47199:18;:25;47218:5;47199:25;;;;;;;;;;;;;;;:35;47225:8;47199:35;;;;;;;;;;;;;;;;;;;;;;;;;47192:42;;47078:164;;;;:::o;65599:43::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58793:244::-;58070:12;:10;:12::i;:::-;58059:23;;:7;:5;:7::i;:::-;:23;;;58051:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58902:1:::1;58882:22;;:8;:22;;;;58874:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58992:8;58963:38;;58984:6;;;;;;;;;;;58963:38;;;;;;;;;;;;59021:8;59012:6;;:17;;;;;;;;;;;;;;;;;;58793:244:::0;:::o;20744:131::-;20811:4;20835:32;20840:3;:10;;20860:5;20852:14;;20835:4;:32::i;:::-;20828:39;;20744:131;;;;:::o;9535:185::-;9624:4;9648:64;9653:3;:10;;9673:3;9665:12;;9703:5;9687:23;;9679:32;;9648:4;:64::i;:::-;9641:71;;9535:185;;;;;:::o;22926:422::-;22986:4;23194:12;23305:7;23293:20;23285:28;;23339:1;23332:4;:8;23325:15;;;22926:422;;;:::o;10112:151::-;10196:4;10220:35;10230:3;:10;;10250:3;10242:12;;10220:9;:35::i;:::-;10213:42;;10112:151;;;;:::o;49659:127::-;49724:4;49748:30;49770:7;49748:12;:21;;:30;;;;:::i;:::-;49741:37;;49659:127;;;:::o;40876:98::-;40929:7;40956:10;40949:17;;40876:98;:::o;55799:183::-;55892:2;55865:15;:24;55881:7;55865:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55948:7;55944:2;55910:46;;55919:23;55934:7;55919:14;:23::i;:::-;55910:46;;;;;;;;;;;;55799:183;;:::o;10351:123::-;10420:7;10447:19;10455:3;:10;;10447:7;:19::i;:::-;10440:26;;10351:123;;;:::o;49953:355::-;50046:4;50071:16;50079:7;50071;:16::i;:::-;50063:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50147:13;50163:23;50178:7;50163:14;:23::i;:::-;50147:39;;50216:5;50205:16;;:7;:16;;;:51;;;;50249:7;50225:31;;:20;50237:7;50225:11;:20::i;:::-;:31;;;50205:51;:94;;;;50260:39;50284:5;50291:7;50260:23;:39::i;:::-;50205:94;50197:103;;;49953:355;;;;:::o;53089:597::-;53214:4;53187:31;;:23;53202:7;53187:14;:23::i;:::-;:31;;;53179:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;53315:1;53301:16;;:2;:16;;;;53293:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53371:39;53392:4;53398:2;53402:7;53371:20;:39::i;:::-;53475:29;53492:1;53496:7;53475:8;:29::i;:::-;53517:35;53544:7;53517:13;:19;53531:4;53517:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;53563:30;53585:7;53563:13;:17;53577:2;53563:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;53606:29;53623:7;53632:2;53606:12;:16;;:29;;;;;:::i;:::-;;53670:7;53666:2;53651:27;;53660:4;53651:27;;;;;;;;;;;;53089:597;;;:::o;21974:137::-;22045:7;22080:22;22084:3;:10;;22096:5;22080:3;:22::i;:::-;22072:31;;22065:38;;21974:137;;;;:::o;10822:236::-;10902:7;10911;10932:11;10945:13;10962:22;10966:3;:10;;10978:5;10962:3;:22::i;:::-;10931:53;;;;11011:3;11003:12;;11041:5;11033:14;;10995:55;;;;;;10822:236;;;;;:::o;54287:100::-;54371:8;54360;:19;;;;;;;;;;;;:::i;:::-;;54287:100;:::o;12108:213::-;12215:7;12266:44;12271:3;:10;;12291:3;12283:12;;12297;12266:4;:44::i;:::-;12258:53;;12235:78;;12108:213;;;;;:::o;485:723::-;541:13;771:1;762:5;:10;758:53;;;789:10;;;;;;;;;;;;;;;;;;;;;758:53;821:12;836:5;821:20;;852:14;877:78;892:1;884:4;:9;877:78;;910:8;;;;;:::i;:::-;;;;941:2;933:10;;;;;:::i;:::-;;;877:78;;;965:19;997:6;987:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;965:39;;1015:154;1031:1;1022:5;:10;1015:154;;1059:1;1049:11;;;;;:::i;:::-;;;1126:2;1118:5;:10;;;;:::i;:::-;1105:2;:24;;;;:::i;:::-;1092:39;;1075:6;1082;1075:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1155:2;1146:11;;;;;:::i;:::-;;;1015:154;;;1193:6;1179:21;;;;;485:723;;;;:::o;61483:86::-;61541:7;61564:1;61560;:5;;;;:::i;:::-;61553:12;;61483:86;;;;:::o;62109:::-;62167:7;62190:1;62186;:5;;;;:::i;:::-;62179:12;;62109:86;;;;:::o;50651:110::-;50727:26;50737:2;50741:7;50727:26;;;;;;;;;;;;:9;:26::i;:::-;50651:110;;:::o;21506:114::-;21566:7;21593:19;21601:3;:10;;21593:7;:19::i;:::-;21586:26;;21506:114;;;:::o;49074:272::-;49188:28;49198:4;49204:2;49208:7;49188:9;:28::i;:::-;49235:48;49258:4;49264:2;49268:7;49277:5;49235:22;:48::i;:::-;49227:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;49074:272;;;;:::o;14084:414::-;14147:4;14169:21;14179:3;14184:5;14169:9;:21::i;:::-;14164:327;;14207:3;:11;;14224:5;14207:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14390:3;:11;;:18;;;;14368:3;:12;;:19;14381:5;14368:19;;;;;;;;;;;:40;;;;14430:4;14423:11;;;;14164:327;14474:5;14467:12;;14084:414;;;;;:::o;4200:692::-;4276:4;4392:16;4411:3;:12;;:17;4424:3;4411:17;;;;;;;;;;;;4392:36;;4457:1;4445:8;:13;4441:444;;;4512:3;:12;;4530:38;;;;;;;;4547:3;4530:38;;;;4560:5;4530:38;;;4512:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4727:3;:12;;:19;;;;4707:3;:12;;:17;4720:3;4707:17;;;;;;;;;;;:39;;;;4768:4;4761:11;;;;;4441:444;4841:5;4805:3;:12;;4829:1;4818:8;:12;;;;:::i;:::-;4805:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:41;;;;4868:5;4861:12;;;4200:692;;;;;;:::o;6700:125::-;6771:4;6816:1;6795:3;:12;;:17;6808:3;6795:17;;;;;;;;;;;;:22;;6788:29;;6700:125;;;;:::o;6920:110::-;6976:7;7003:3;:12;;:19;;;;6996:26;;6920:110;;;:::o;56595:93::-;;;;:::o;21051:137::-;21121:4;21145:35;21153:3;:10;;21173:5;21165:14;;21145:7;:35::i;:::-;21138:42;;21051:137;;;;:::o;16982:204::-;17049:7;17098:5;17077:3;:11;;:18;;;;:26;17069:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17160:3;:11;;17172:5;17160:18;;;;;;;;;;;;;;;;;;;;;;;;17153:25;;16982:204;;;;:::o;7395:279::-;7462:7;7471;7521:5;7499:3;:12;;:19;;;;:27;7491:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7578:22;7603:3;:12;;7616:5;7603:19;;;;;;;;;;;;;;;;;;;;;;;;;;7578:44;;7641:5;:10;;;7653:5;:12;;;7633:33;;;;;7395:279;;;;;:::o;8892:319::-;8986:7;9006:16;9025:3;:12;;:17;9038:3;9025:17;;;;;;;;;;;;9006:36;;9073:1;9061:8;:13;;9076:12;9053:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;9143:3;:12;;9167:1;9156:8;:12;;;;:::i;:::-;9143:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;9136:40;;;8892:319;;;;;:::o;50988:250::-;51084:18;51090:2;51094:7;51084:5;:18::i;:::-;51121:54;51152:1;51156:2;51160:7;51169:5;51121:22;:54::i;:::-;51113:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;50988:250;;;:::o;16519:109::-;16575:7;16602:3;:11;;:18;;;;16595:25;;16519:109;;;:::o;54952:839::-;55069:4;55095:15;:2;:13;;;:15::i;:::-;55091:693;;;55147:2;55131:36;;;55168:12;:10;:12::i;:::-;55182:4;55188:7;55197:5;55131:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55127:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55394:1;55377:6;:13;:18;55373:341;;;55420:60;;;;;;;;;;:::i;:::-;;;;;;;;55373:341;55664:6;55658:13;55649:6;55645:2;55641:15;55634:38;55127:602;55264:45;;;55254:55;;;:6;:55;;;;55247:62;;;;;55091:693;55768:4;55761:11;;54952:839;;;;;;;:::o;16304:129::-;16377:4;16424:1;16401:3;:12;;:19;16414:5;16401:19;;;;;;;;;;;;:24;;16394:31;;16304:129;;;;:::o;14674:1544::-;14740:4;14858:18;14879:3;:12;;:19;14892:5;14879:19;;;;;;;;;;;;14858:40;;14929:1;14915:10;:15;14911:1300;;15277:21;15314:1;15301:10;:14;;;;:::i;:::-;15277:38;;15330:17;15371:1;15350:3;:11;;:18;;;;:22;;;;:::i;:::-;15330:42;;15617:17;15637:3;:11;;15649:9;15637:22;;;;;;;;;;;;;;;;;;;;;;;;15617:42;;15783:9;15754:3;:11;;15766:13;15754:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;15902:1;15886:13;:17;;;;:::i;:::-;15860:3;:12;;:23;15873:9;15860:23;;;;;;;;;;;:43;;;;16012:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16107:3;:12;;:19;16120:5;16107:19;;;;;;;;;;;16100:26;;;16150:4;16143:11;;;;;;;;14911:1300;16194:5;16187:12;;;14674:1544;;;;;:::o;51574:404::-;51668:1;51654:16;;:2;:16;;;;51646:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51727:16;51735:7;51727;:16::i;:::-;51726:17;51718:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51789:45;51818:1;51822:2;51826:7;51789:20;:45::i;:::-;51847:30;51869:7;51847:13;:17;51861:2;51847:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;51890:29;51907:7;51916:2;51890:12;:16;;:29;;;;;:::i;:::-;;51962:7;51958:2;51937:33;;51954:1;51937:33;;;;;;;;;;;;51574:404;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:179::-;6155:10;6176:46;6218:3;6210:6;6176:46;:::i;:::-;6254:4;6249:3;6245:14;6231:28;;6166:99;;;;:::o;6271:118::-;6358:24;6376:5;6358:24;:::i;:::-;6353:3;6346:37;6336:53;;:::o;6395:157::-;6500:45;6520:24;6538:5;6520:24;:::i;:::-;6500:45;:::i;:::-;6495:3;6488:58;6478:74;;:::o;6588:732::-;6707:3;6736:54;6784:5;6736:54;:::i;:::-;6806:86;6885:6;6880:3;6806:86;:::i;:::-;6799:93;;6916:56;6966:5;6916:56;:::i;:::-;6995:7;7026:1;7011:284;7036:6;7033:1;7030:13;7011:284;;;7112:6;7106:13;7139:63;7198:3;7183:13;7139:63;:::i;:::-;7132:70;;7225:60;7278:6;7225:60;:::i;:::-;7215:70;;7071:224;7058:1;7055;7051:9;7046:14;;7011:284;;;7015:14;7311:3;7304:10;;6712:608;;;;;;;:::o;7326:109::-;7407:21;7422:5;7407:21;:::i;:::-;7402:3;7395:34;7385:50;;:::o;7441:118::-;7528:24;7546:5;7528:24;:::i;:::-;7523:3;7516:37;7506:53;;:::o;7565:360::-;7651:3;7679:38;7711:5;7679:38;:::i;:::-;7733:70;7796:6;7791:3;7733:70;:::i;:::-;7726:77;;7812:52;7857:6;7852:3;7845:4;7838:5;7834:16;7812:52;:::i;:::-;7889:29;7911:6;7889:29;:::i;:::-;7884:3;7880:39;7873:46;;7655:270;;;;;:::o;7931:364::-;8019:3;8047:39;8080:5;8047:39;:::i;:::-;8102:71;8166:6;8161:3;8102:71;:::i;:::-;8095:78;;8182:52;8227:6;8222:3;8215:4;8208:5;8204:16;8182:52;:::i;:::-;8259:29;8281:6;8259:29;:::i;:::-;8254:3;8250:39;8243:46;;8023:272;;;;;:::o;8301:377::-;8407:3;8435:39;8468:5;8435:39;:::i;:::-;8490:89;8572:6;8567:3;8490:89;:::i;:::-;8483:96;;8588:52;8633:6;8628:3;8621:4;8614:5;8610:16;8588:52;:::i;:::-;8665:6;8660:3;8656:16;8649:23;;8411:267;;;;;:::o;8708:845::-;8811:3;8848:5;8842:12;8877:36;8903:9;8877:36;:::i;:::-;8929:89;9011:6;9006:3;8929:89;:::i;:::-;8922:96;;9049:1;9038:9;9034:17;9065:1;9060:137;;;;9211:1;9206:341;;;;9027:520;;9060:137;9144:4;9140:9;9129;9125:25;9120:3;9113:38;9180:6;9175:3;9171:16;9164:23;;9060:137;;9206:341;9273:38;9305:5;9273:38;:::i;:::-;9333:1;9347:154;9361:6;9358:1;9355:13;9347:154;;;9435:7;9429:14;9425:1;9420:3;9416:11;9409:35;9485:1;9476:7;9472:15;9461:26;;9383:4;9380:1;9376:12;9371:17;;9347:154;;;9530:6;9525:3;9521:16;9514:23;;9213:334;;9027:520;;8815:738;;;;;;:::o;9559:366::-;9701:3;9722:67;9786:2;9781:3;9722:67;:::i;:::-;9715:74;;9798:93;9887:3;9798:93;:::i;:::-;9916:2;9911:3;9907:12;9900:19;;9705:220;;;:::o;9931:366::-;10073:3;10094:67;10158:2;10153:3;10094:67;:::i;:::-;10087:74;;10170:93;10259:3;10170:93;:::i;:::-;10288:2;10283:3;10279:12;10272:19;;10077:220;;;:::o;10303:366::-;10445:3;10466:67;10530:2;10525:3;10466:67;:::i;:::-;10459:74;;10542:93;10631:3;10542:93;:::i;:::-;10660:2;10655:3;10651:12;10644:19;;10449:220;;;:::o;10675:366::-;10817:3;10838:67;10902:2;10897:3;10838:67;:::i;:::-;10831:74;;10914:93;11003:3;10914:93;:::i;:::-;11032:2;11027:3;11023:12;11016:19;;10821:220;;;:::o;11047:366::-;11189:3;11210:67;11274:2;11269:3;11210:67;:::i;:::-;11203:74;;11286:93;11375:3;11286:93;:::i;:::-;11404:2;11399:3;11395:12;11388:19;;11193:220;;;:::o;11419:366::-;11561:3;11582:67;11646:2;11641:3;11582:67;:::i;:::-;11575:74;;11658:93;11747:3;11658:93;:::i;:::-;11776:2;11771:3;11767:12;11760:19;;11565:220;;;:::o;11791:366::-;11933:3;11954:67;12018:2;12013:3;11954:67;:::i;:::-;11947:74;;12030:93;12119:3;12030:93;:::i;:::-;12148:2;12143:3;12139:12;12132:19;;11937:220;;;:::o;12163:366::-;12305:3;12326:67;12390:2;12385:3;12326:67;:::i;:::-;12319:74;;12402:93;12491:3;12402:93;:::i;:::-;12520:2;12515:3;12511:12;12504:19;;12309:220;;;:::o;12535:366::-;12677:3;12698:67;12762:2;12757:3;12698:67;:::i;:::-;12691:74;;12774:93;12863:3;12774:93;:::i;:::-;12892:2;12887:3;12883:12;12876:19;;12681:220;;;:::o;12907:366::-;13049:3;13070:67;13134:2;13129:3;13070:67;:::i;:::-;13063:74;;13146:93;13235:3;13146:93;:::i;:::-;13264:2;13259:3;13255:12;13248:19;;13053:220;;;:::o;13279:366::-;13421:3;13442:67;13506:2;13501:3;13442:67;:::i;:::-;13435:74;;13518:93;13607:3;13518:93;:::i;:::-;13636:2;13631:3;13627:12;13620:19;;13425:220;;;:::o;13651:366::-;13793:3;13814:67;13878:2;13873:3;13814:67;:::i;:::-;13807:74;;13890:93;13979:3;13890:93;:::i;:::-;14008:2;14003:3;13999:12;13992:19;;13797:220;;;:::o;14023:366::-;14165:3;14186:67;14250:2;14245:3;14186:67;:::i;:::-;14179:74;;14262:93;14351:3;14262:93;:::i;:::-;14380:2;14375:3;14371:12;14364:19;;14169:220;;;:::o;14395:366::-;14537:3;14558:67;14622:2;14617:3;14558:67;:::i;:::-;14551:74;;14634:93;14723:3;14634:93;:::i;:::-;14752:2;14747:3;14743:12;14736:19;;14541:220;;;:::o;14767:366::-;14909:3;14930:67;14994:2;14989:3;14930:67;:::i;:::-;14923:74;;15006:93;15095:3;15006:93;:::i;:::-;15124:2;15119:3;15115:12;15108:19;;14913:220;;;:::o;15139:366::-;15281:3;15302:67;15366:2;15361:3;15302:67;:::i;:::-;15295:74;;15378:93;15467:3;15378:93;:::i;:::-;15496:2;15491:3;15487:12;15480:19;;15285:220;;;:::o;15511:366::-;15653:3;15674:67;15738:2;15733:3;15674:67;:::i;:::-;15667:74;;15750:93;15839:3;15750:93;:::i;:::-;15868:2;15863:3;15859:12;15852:19;;15657:220;;;:::o;15883:366::-;16025:3;16046:67;16110:2;16105:3;16046:67;:::i;:::-;16039:74;;16122:93;16211:3;16122:93;:::i;:::-;16240:2;16235:3;16231:12;16224:19;;16029:220;;;:::o;16255:366::-;16397:3;16418:67;16482:2;16477:3;16418:67;:::i;:::-;16411:74;;16494:93;16583:3;16494:93;:::i;:::-;16612:2;16607:3;16603:12;16596:19;;16401:220;;;:::o;16627:366::-;16769:3;16790:67;16854:2;16849:3;16790:67;:::i;:::-;16783:74;;16866:93;16955:3;16866:93;:::i;:::-;16984:2;16979:3;16975:12;16968:19;;16773:220;;;:::o;16999:366::-;17141:3;17162:67;17226:2;17221:3;17162:67;:::i;:::-;17155:74;;17238:93;17327:3;17238:93;:::i;:::-;17356:2;17351:3;17347:12;17340:19;;17145:220;;;:::o;17371:366::-;17513:3;17534:67;17598:2;17593:3;17534:67;:::i;:::-;17527:74;;17610:93;17699:3;17610:93;:::i;:::-;17728:2;17723:3;17719:12;17712:19;;17517:220;;;:::o;17743:108::-;17820:24;17838:5;17820:24;:::i;:::-;17815:3;17808:37;17798:53;;:::o;17857:118::-;17944:24;17962:5;17944:24;:::i;:::-;17939:3;17932:37;17922:53;;:::o;17981:157::-;18086:45;18106:24;18124:5;18106:24;:::i;:::-;18086:45;:::i;:::-;18081:3;18074:58;18064:74;;:::o;18144:679::-;18340:3;18355:75;18426:3;18417:6;18355:75;:::i;:::-;18455:2;18450:3;18446:12;18439:19;;18468:75;18539:3;18530:6;18468:75;:::i;:::-;18568:2;18563:3;18559:12;18552:19;;18581:75;18652:3;18643:6;18581:75;:::i;:::-;18681:2;18676:3;18672:12;18665:19;;18694:75;18765:3;18756:6;18694:75;:::i;:::-;18794:2;18789:3;18785:12;18778:19;;18814:3;18807:10;;18344:479;;;;;;;:::o;18829:435::-;19009:3;19031:95;19122:3;19113:6;19031:95;:::i;:::-;19024:102;;19143:95;19234:3;19225:6;19143:95;:::i;:::-;19136:102;;19255:3;19248:10;;19013:251;;;;;:::o;19270:429::-;19447:3;19469:92;19557:3;19548:6;19469:92;:::i;:::-;19462:99;;19578:95;19669:3;19660:6;19578:95;:::i;:::-;19571:102;;19690:3;19683:10;;19451:248;;;;;:::o;19705:222::-;19798:4;19836:2;19825:9;19821:18;19813:26;;19849:71;19917:1;19906:9;19902:17;19893:6;19849:71;:::i;:::-;19803:124;;;;:::o;19933:640::-;20128:4;20166:3;20155:9;20151:19;20143:27;;20180:71;20248:1;20237:9;20233:17;20224:6;20180:71;:::i;:::-;20261:72;20329:2;20318:9;20314:18;20305:6;20261:72;:::i;:::-;20343;20411:2;20400:9;20396:18;20387:6;20343:72;:::i;:::-;20462:9;20456:4;20452:20;20447:2;20436:9;20432:18;20425:48;20490:76;20561:4;20552:6;20490:76;:::i;:::-;20482:84;;20133:440;;;;;;;:::o;20579:373::-;20722:4;20760:2;20749:9;20745:18;20737:26;;20809:9;20803:4;20799:20;20795:1;20784:9;20780:17;20773:47;20837:108;20940:4;20931:6;20837:108;:::i;:::-;20829:116;;20727:225;;;;:::o;20958:210::-;21045:4;21083:2;21072:9;21068:18;21060:26;;21096:65;21158:1;21147:9;21143:17;21134:6;21096:65;:::i;:::-;21050:118;;;;:::o;21174:222::-;21267:4;21305:2;21294:9;21290:18;21282:26;;21318:71;21386:1;21375:9;21371:17;21362:6;21318:71;:::i;:::-;21272:124;;;;:::o;21402:313::-;21515:4;21553:2;21542:9;21538:18;21530:26;;21602:9;21596:4;21592:20;21588:1;21577:9;21573:17;21566:47;21630:78;21703:4;21694:6;21630:78;:::i;:::-;21622:86;;21520:195;;;;:::o;21721:419::-;21887:4;21925:2;21914:9;21910:18;21902:26;;21974:9;21968:4;21964:20;21960:1;21949:9;21945:17;21938:47;22002:131;22128:4;22002:131;:::i;:::-;21994:139;;21892:248;;;:::o;22146:419::-;22312:4;22350:2;22339:9;22335:18;22327:26;;22399:9;22393:4;22389:20;22385:1;22374:9;22370:17;22363:47;22427:131;22553:4;22427:131;:::i;:::-;22419:139;;22317:248;;;:::o;22571:419::-;22737:4;22775:2;22764:9;22760:18;22752:26;;22824:9;22818:4;22814:20;22810:1;22799:9;22795:17;22788:47;22852:131;22978:4;22852:131;:::i;:::-;22844:139;;22742:248;;;:::o;22996:419::-;23162:4;23200:2;23189:9;23185:18;23177:26;;23249:9;23243:4;23239:20;23235:1;23224:9;23220:17;23213:47;23277:131;23403:4;23277:131;:::i;:::-;23269:139;;23167:248;;;:::o;23421:419::-;23587:4;23625:2;23614:9;23610:18;23602:26;;23674:9;23668:4;23664:20;23660:1;23649:9;23645:17;23638:47;23702:131;23828:4;23702:131;:::i;:::-;23694:139;;23592:248;;;:::o;23846:419::-;24012:4;24050:2;24039:9;24035:18;24027:26;;24099:9;24093:4;24089:20;24085:1;24074:9;24070:17;24063:47;24127:131;24253:4;24127:131;:::i;:::-;24119:139;;24017:248;;;:::o;24271:419::-;24437:4;24475:2;24464:9;24460:18;24452:26;;24524:9;24518:4;24514:20;24510:1;24499:9;24495:17;24488:47;24552:131;24678:4;24552:131;:::i;:::-;24544:139;;24442:248;;;:::o;24696:419::-;24862:4;24900:2;24889:9;24885:18;24877:26;;24949:9;24943:4;24939:20;24935:1;24924:9;24920:17;24913:47;24977:131;25103:4;24977:131;:::i;:::-;24969:139;;24867:248;;;:::o;25121:419::-;25287:4;25325:2;25314:9;25310:18;25302:26;;25374:9;25368:4;25364:20;25360:1;25349:9;25345:17;25338:47;25402:131;25528:4;25402:131;:::i;:::-;25394:139;;25292:248;;;:::o;25546:419::-;25712:4;25750:2;25739:9;25735:18;25727:26;;25799:9;25793:4;25789:20;25785:1;25774:9;25770:17;25763:47;25827:131;25953:4;25827:131;:::i;:::-;25819:139;;25717:248;;;:::o;25971:419::-;26137:4;26175:2;26164:9;26160:18;26152:26;;26224:9;26218:4;26214:20;26210:1;26199:9;26195:17;26188:47;26252:131;26378:4;26252:131;:::i;:::-;26244:139;;26142:248;;;:::o;26396:419::-;26562:4;26600:2;26589:9;26585:18;26577:26;;26649:9;26643:4;26639:20;26635:1;26624:9;26620:17;26613:47;26677:131;26803:4;26677:131;:::i;:::-;26669:139;;26567:248;;;:::o;26821:419::-;26987:4;27025:2;27014:9;27010:18;27002:26;;27074:9;27068:4;27064:20;27060:1;27049:9;27045:17;27038:47;27102:131;27228:4;27102:131;:::i;:::-;27094:139;;26992:248;;;:::o;27246:419::-;27412:4;27450:2;27439:9;27435:18;27427:26;;27499:9;27493:4;27489:20;27485:1;27474:9;27470:17;27463:47;27527:131;27653:4;27527:131;:::i;:::-;27519:139;;27417:248;;;:::o;27671:419::-;27837:4;27875:2;27864:9;27860:18;27852:26;;27924:9;27918:4;27914:20;27910:1;27899:9;27895:17;27888:47;27952:131;28078:4;27952:131;:::i;:::-;27944:139;;27842:248;;;:::o;28096:419::-;28262:4;28300:2;28289:9;28285:18;28277:26;;28349:9;28343:4;28339:20;28335:1;28324:9;28320:17;28313:47;28377:131;28503:4;28377:131;:::i;:::-;28369:139;;28267:248;;;:::o;28521:419::-;28687:4;28725:2;28714:9;28710:18;28702:26;;28774:9;28768:4;28764:20;28760:1;28749:9;28745:17;28738:47;28802:131;28928:4;28802:131;:::i;:::-;28794:139;;28692:248;;;:::o;28946:419::-;29112:4;29150:2;29139:9;29135:18;29127:26;;29199:9;29193:4;29189:20;29185:1;29174:9;29170:17;29163:47;29227:131;29353:4;29227:131;:::i;:::-;29219:139;;29117:248;;;:::o;29371:419::-;29537:4;29575:2;29564:9;29560:18;29552:26;;29624:9;29618:4;29614:20;29610:1;29599:9;29595:17;29588:47;29652:131;29778:4;29652:131;:::i;:::-;29644:139;;29542:248;;;:::o;29796:419::-;29962:4;30000:2;29989:9;29985:18;29977:26;;30049:9;30043:4;30039:20;30035:1;30024:9;30020:17;30013:47;30077:131;30203:4;30077:131;:::i;:::-;30069:139;;29967:248;;;:::o;30221:419::-;30387:4;30425:2;30414:9;30410:18;30402:26;;30474:9;30468:4;30464:20;30460:1;30449:9;30445:17;30438:47;30502:131;30628:4;30502:131;:::i;:::-;30494:139;;30392:248;;;:::o;30646:419::-;30812:4;30850:2;30839:9;30835:18;30827:26;;30899:9;30893:4;30889:20;30885:1;30874:9;30870:17;30863:47;30927:131;31053:4;30927:131;:::i;:::-;30919:139;;30817:248;;;:::o;31071:222::-;31164:4;31202:2;31191:9;31187:18;31179:26;;31215:71;31283:1;31272:9;31268:17;31259:6;31215:71;:::i;:::-;31169:124;;;;:::o;31299:129::-;31333:6;31360:20;;:::i;:::-;31350:30;;31389:33;31417:4;31409:6;31389:33;:::i;:::-;31340:88;;;:::o;31434:75::-;31467:6;31500:2;31494:9;31484:19;;31474:35;:::o;31515:307::-;31576:4;31666:18;31658:6;31655:30;31652:2;;;31688:18;;:::i;:::-;31652:2;31726:29;31748:6;31726:29;:::i;:::-;31718:37;;31810:4;31804;31800:15;31792:23;;31581:241;;;:::o;31828:308::-;31890:4;31980:18;31972:6;31969:30;31966:2;;;32002:18;;:::i;:::-;31966:2;32040:29;32062:6;32040:29;:::i;:::-;32032:37;;32124:4;32118;32114:15;32106:23;;31895:241;;;:::o;32142:132::-;32209:4;32232:3;32224:11;;32262:4;32257:3;32253:14;32245:22;;32214:60;;;:::o;32280:141::-;32329:4;32352:3;32344:11;;32375:3;32372:1;32365:14;32409:4;32406:1;32396:18;32388:26;;32334:87;;;:::o;32427:114::-;32494:6;32528:5;32522:12;32512:22;;32501:40;;;:::o;32547:98::-;32598:6;32632:5;32626:12;32616:22;;32605:40;;;:::o;32651:99::-;32703:6;32737:5;32731:12;32721:22;;32710:40;;;:::o;32756:113::-;32826:4;32858;32853:3;32849:14;32841:22;;32831:38;;;:::o;32875:184::-;32974:11;33008:6;33003:3;32996:19;33048:4;33043:3;33039:14;33024:29;;32986:73;;;;:::o;33065:168::-;33148:11;33182:6;33177:3;33170:19;33222:4;33217:3;33213:14;33198:29;;33160:73;;;;:::o;33239:169::-;33323:11;33357:6;33352:3;33345:19;33397:4;33392:3;33388:14;33373:29;;33335:73;;;;:::o;33414:148::-;33516:11;33553:3;33538:18;;33528:34;;;;:::o;33568:305::-;33608:3;33627:20;33645:1;33627:20;:::i;:::-;33622:25;;33661:20;33679:1;33661:20;:::i;:::-;33656:25;;33815:1;33747:66;33743:74;33740:1;33737:81;33734:2;;;33821:18;;:::i;:::-;33734:2;33865:1;33862;33858:9;33851:16;;33612:261;;;;:::o;33879:185::-;33919:1;33936:20;33954:1;33936:20;:::i;:::-;33931:25;;33970:20;33988:1;33970:20;:::i;:::-;33965:25;;34009:1;33999:2;;34014:18;;:::i;:::-;33999:2;34056:1;34053;34049:9;34044:14;;33921:143;;;;:::o;34070:348::-;34110:7;34133:20;34151:1;34133:20;:::i;:::-;34128:25;;34167:20;34185:1;34167:20;:::i;:::-;34162:25;;34355:1;34287:66;34283:74;34280:1;34277:81;34272:1;34265:9;34258:17;34254:105;34251:2;;;34362:18;;:::i;:::-;34251:2;34410:1;34407;34403:9;34392:20;;34118:300;;;;:::o;34424:191::-;34464:4;34484:20;34502:1;34484:20;:::i;:::-;34479:25;;34518:20;34536:1;34518:20;:::i;:::-;34513:25;;34557:1;34554;34551:8;34548:2;;;34562:18;;:::i;:::-;34548:2;34607:1;34604;34600:9;34592:17;;34469:146;;;;:::o;34621:96::-;34658:7;34687:24;34705:5;34687:24;:::i;:::-;34676:35;;34666:51;;;:::o;34723:90::-;34757:7;34800:5;34793:13;34786:21;34775:32;;34765:48;;;:::o;34819:77::-;34856:7;34885:5;34874:16;;34864:32;;;:::o;34902:149::-;34938:7;34978:66;34971:5;34967:78;34956:89;;34946:105;;;:::o;35057:126::-;35094:7;35134:42;35127:5;35123:54;35112:65;;35102:81;;;:::o;35189:77::-;35226:7;35255:5;35244:16;;35234:32;;;:::o;35272:154::-;35356:6;35351:3;35346;35333:30;35418:1;35409:6;35404:3;35400:16;35393:27;35323:103;;;:::o;35432:307::-;35500:1;35510:113;35524:6;35521:1;35518:13;35510:113;;;35609:1;35604:3;35600:11;35594:18;35590:1;35585:3;35581:11;35574:39;35546:2;35543:1;35539:10;35534:15;;35510:113;;;35641:6;35638:1;35635:13;35632:2;;;35721:1;35712:6;35707:3;35703:16;35696:27;35632:2;35481:258;;;;:::o;35745:320::-;35789:6;35826:1;35820:4;35816:12;35806:22;;35873:1;35867:4;35863:12;35894:18;35884:2;;35950:4;35942:6;35938:17;35928:27;;35884:2;36012;36004:6;36001:14;35981:18;35978:38;35975:2;;;36031:18;;:::i;:::-;35975:2;35796:269;;;;:::o;36071:281::-;36154:27;36176:4;36154:27;:::i;:::-;36146:6;36142:40;36284:6;36272:10;36269:22;36248:18;36236:10;36233:34;36230:62;36227:2;;;36295:18;;:::i;:::-;36227:2;36335:10;36331:2;36324:22;36114:238;;;:::o;36358:233::-;36397:3;36420:24;36438:5;36420:24;:::i;:::-;36411:33;;36466:66;36459:5;36456:77;36453:2;;;36536:18;;:::i;:::-;36453:2;36583:1;36576:5;36572:13;36565:20;;36401:190;;;:::o;36597:100::-;36636:7;36665:26;36685:5;36665:26;:::i;:::-;36654:37;;36644:53;;;:::o;36703:94::-;36742:7;36771:20;36785:5;36771:20;:::i;:::-;36760:31;;36750:47;;;:::o;36803:79::-;36842:7;36871:5;36860:16;;36850:32;;;:::o;36888:176::-;36920:1;36937:20;36955:1;36937:20;:::i;:::-;36932:25;;36971:20;36989:1;36971:20;:::i;:::-;36966:25;;37010:1;37000:2;;37015:18;;:::i;:::-;37000:2;37056:1;37053;37049:9;37044:14;;36922:142;;;;:::o;37070:180::-;37118:77;37115:1;37108:88;37215:4;37212:1;37205:15;37239:4;37236:1;37229:15;37256:180;37304:77;37301:1;37294:88;37401:4;37398:1;37391:15;37425:4;37422:1;37415:15;37442:180;37490:77;37487:1;37480:88;37587:4;37584:1;37577:15;37611:4;37608:1;37601:15;37628:180;37676:77;37673:1;37666:88;37773:4;37770:1;37763:15;37797:4;37794:1;37787:15;37814:102;37855:6;37906:2;37902:7;37897:2;37890:5;37886:14;37882:28;37872:38;;37862:54;;;:::o;37922:94::-;37955:8;38003:5;37999:2;37995:14;37974:35;;37964:52;;;:::o;38022:221::-;38162:34;38158:1;38150:6;38146:14;38139:58;38231:4;38226:2;38218:6;38214:15;38207:29;38128:115;:::o;38249:237::-;38389:34;38385:1;38377:6;38373:14;38366:58;38458:20;38453:2;38445:6;38441:15;38434:45;38355:131;:::o;38492:225::-;38632:34;38628:1;38620:6;38616:14;38609:58;38701:8;38696:2;38688:6;38684:15;38677:33;38598:119;:::o;38723:178::-;38863:30;38859:1;38851:6;38847:14;38840:54;38829:72;:::o;38907:223::-;39047:34;39043:1;39035:6;39031:14;39024:58;39116:6;39111:2;39103:6;39099:15;39092:31;39013:117;:::o;39136:175::-;39276:27;39272:1;39264:6;39260:14;39253:51;39242:69;:::o;39317:167::-;39457:19;39453:1;39445:6;39441:14;39434:43;39423:61;:::o;39490:231::-;39630:34;39626:1;39618:6;39614:14;39607:58;39699:14;39694:2;39686:6;39682:15;39675:39;39596:125;:::o;39727:243::-;39867:34;39863:1;39855:6;39851:14;39844:58;39936:26;39931:2;39923:6;39919:15;39912:51;39833:137;:::o;39976:229::-;40116:34;40112:1;40104:6;40100:14;40093:58;40185:12;40180:2;40172:6;40168:15;40161:37;40082:123;:::o;40211:222::-;40351:34;40347:1;40339:6;40335:14;40328:58;40420:5;40415:2;40407:6;40403:15;40396:30;40317:116;:::o;40439:221::-;40579:34;40575:1;40567:6;40563:14;40556:58;40648:4;40643:2;40635:6;40631:15;40624:29;40545:115;:::o;40666:182::-;40806:34;40802:1;40794:6;40790:14;40783:58;40772:76;:::o;40854:231::-;40994:34;40990:1;40982:6;40978:14;40971:58;41063:14;41058:2;41050:6;41046:15;41039:39;40960:125;:::o;41091:182::-;41231:34;41227:1;41219:6;41215:14;41208:58;41197:76;:::o;41279:228::-;41419:34;41415:1;41407:6;41403:14;41396:58;41488:11;41483:2;41475:6;41471:15;41464:36;41385:122;:::o;41513:234::-;41653:34;41649:1;41641:6;41637:14;41630:58;41722:17;41717:2;41709:6;41705:15;41698:42;41619:128;:::o;41753:220::-;41893:34;41889:1;41881:6;41877:14;41870:58;41962:3;41957:2;41949:6;41945:15;41938:28;41859:114;:::o;41979:172::-;42119:24;42115:1;42107:6;42103:14;42096:48;42085:66;:::o;42157:228::-;42297:34;42293:1;42285:6;42281:14;42274:58;42366:11;42361:2;42353:6;42349:15;42342:36;42263:122;:::o;42391:236::-;42531:34;42527:1;42519:6;42515:14;42508:58;42600:19;42595:2;42587:6;42583:15;42576:44;42497:130;:::o;42633:164::-;42773:16;42769:1;42761:6;42757:14;42750:40;42739:58;:::o;42803:122::-;42876:24;42894:5;42876:24;:::i;:::-;42869:5;42866:35;42856:2;;42915:1;42912;42905:12;42856:2;42846:79;:::o;42931:116::-;43001:21;43016:5;43001:21;:::i;:::-;42994:5;42991:32;42981:2;;43037:1;43034;43027:12;42981:2;42971:76;:::o;43053:120::-;43125:23;43142:5;43125:23;:::i;:::-;43118:5;43115:34;43105:2;;43163:1;43160;43153:12;43105:2;43095:78;:::o;43179:122::-;43252:24;43270:5;43252:24;:::i;:::-;43245:5;43242:35;43232:2;;43291:1;43288;43281:12;43232:2;43222:79;:::o

Swarm Source

ipfs://605f1a437aa057c7a572cbb264cdfec003a4e4ff4fdd86ee981ae7a3a2b147ca
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.