ETH Price: $2,861.36 (-10.01%)
Gas: 15 Gwei

Token

Redemption (RDP)
 

Overview

Max Total Supply

1,024 RDP

Holders

466

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
noahnleo.eth
Balance
1 RDP
0xcb5a84c0fbd65b8f00e5c9ccdfd0f14813b3e6c2
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Generative art with limited supply and the scripts stored on Ethereum Blockchain & IPFS.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Redemption

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-07-30
*/

// RedemptionNFT.art  created by memorycollect0r. generative art stored on Ethereum


// 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 Redemption is ERC721, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    uint public constant MAX_TOKENS = 1024;
    bool public hasSaleStarted = false;
    mapping (uint256 => uint256) public creationDates;
    mapping (uint256 => address) public creators;
    string public METADATA_PROVENANCE_HASH = "";
    string public GENERATOR_ADDRESS = "https://redemptionnft.art/generator/";
    string public IPFS_GENERATOR_ADDRESS = "";
    string public script = "";

    constructor() ERC721("Redemption","RDP")  {
        setBaseURI("https://redemptionnft.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,t){return e+(t-e)*this.random_dec()}random_int(e,t){return Math.floor(this.random_between(e,t+1))}random_choice(e){return e[Math.floor(this.random_between(0,.99*e.length))]}}let tiles,tileWidth,tileHeight,palette,tokenData=window.tokenHash,seed=parseInt(tokenData.slice(0,16),16),rng=new Random(seed),VP=Math.min(window.innerHeight,window.innerWidth),WIDTH=VP,HEIGHT=VP,randomness=[],palettes=['FDFDFD-EAEAEA-D8D8D8-C6C6C6-B4B4B4','d3d4d9-4b88a2-bb0a21-252627-fff9fb','c8ffbe-edffab-ba9593-89608e-623b5a','ff9f1c-ffbf69-ffffff-cbf3f0-2ec4b6','555358-5f6062-7b7263-c6ca53-c9dcb3','540d6e-ee4266-ffd23f-f3fcf0-1f271b','1e91d6-0072bb-8fc93a-e4cc37-e18335','ea7af4-b43e8f-6200b3-3b0086-290628','5b5b5b-7d7c7a-c9c19f-edf7d2-edf7b5','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)),tileColors=[],arc$=[],arc$2=[],isFlipping=[],isRounded=!1,radius=0,offs=[],cellColors=[],psuedoFrame=1;function setup(){noiseSeed(seed),randomSeed(seed),createCanvas(WIDTH,HEIGHT),frameRate(60),colorMode(RGB),palette=rng.random_choice(palettes),background(palette[0]),stroke(palette[0]),strokeWeight(0),tiles=rng.random_int(2,16),tileWidth=WIDTH/tiles,tileHeight=HEIGHT/tiles;for(let e=0;e<=tiles;e++){let e=new Array(tiles).fill(null),t=new Array(tiles).fill(null),i=new Array(tiles).fill(null);for(let d=0;d<tiles;d++)e[d]=rng.random_between(0,1),t[d]=palette[rng.random_int(1,4)],i[d]=rng.random_choice(palette);randomness.push(e),tileColors.push(t),cellColors.push(i),isFlipping.push(rng.random_choice([!0,!1])),offs.push(rng.random_between(0,1)),arc$.push(rng.random_choice([45,60])),arc$2.push(rng.random_choice([PI,PI+QUARTER_PI,2*PI]))}noStroke()}function draw(){background(palette[0]);for(let e=0;e<=tiles;e++){for(let t=0;t<tiles;t++){if(fill(cellColors[e][t]),isRounded&&radius>.03?radius-=.02:radius+=.02,push(),fill(tileColors[e][t]),randomness[e][t]>.9)isFlipping[e]?arc(e*tileWidth-tileWidth/2,t*tileHeight+tileWidth/2,.75*tileWidth,.75*tileHeight,.01*radius+offs[e]+mouseX/200,.01*-radius+offs[e]+mouseX/200):arc(e*tileWidth-tileWidth/2,t*tileHeight+tileWidth/2,.75*tileWidth,.75*tileHeight,arc$[e]+offs[e],arc$2[e]+offs[e]);else if(randomness[e][t]>.6)if(randomness[e][t]>.75)if(mouseIsPressed){push();let i=color(tileColors[e][t]);i.setAlpha(256-sin(psuedoFrame/20)*psuedoFrame*7),fill(i),ellipse(e*tileWidth-tileWidth/2,t*tileHeight+tileHeight/2,tileWidth),pop()}else ellipse(e*tileWidth-tileWidth/2,t*tileHeight+tileHeight/2,tileWidth);else randomness[e][t]>.68?arc(e*tileWidth-tileWidth/2,t*tileHeight+tileWidth/2,.75*tileWidth,.75*tileHeight,0,-PI,CHORD):arc(e*tileWidth-tileWidth/2,t*tileHeight+tileWidth/2,.75*tileWidth,.75*tileHeight,PI,TWO_PI,CHORD);else randomness[e][t]>.3?randomness[e][t]>.5?rect(e*tileWidth-tileWidth,t*tileHeight,tileWidth,tileHeight,radius):rect(e*tileWidth-tileWidth,t*tileHeight,tileWidth,tileHeight):randomness[e][t]>.2?triangle(e*tileWidth-tileWidth,t*tileHeight+tileHeight,e*tileWidth,t*tileHeight+tileHeight,e*tileWidth,t*tileHeight):triangle(e*tileWidth-tileWidth,t*tileHeight+tileHeight,e*tileWidth,t*tileHeight,e*tileWidth-tileWidth,t*tileHeight);pop()}radius<=.1?(isRounded=!1,radius=.1):radius>99&&(isRounded=!0,radius=99)}mouseIsPressed?(stroke(palette[0]),strokeWeight(WIDTH/500+40*sin(psuedoFrame/100)),psuedoFrame++):(noStroke(),strokeWeight(0),psuedoFrame=1)}";
    }
    
    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 35000000000000000;
    }
    
   function mintToken(uint256 maxTOKENS) public payable {
        require(totalSupply() < MAX_TOKENS, "Sale has already ended");
        require(maxTOKENS > 0 && maxTOKENS <= 10, "You can claim minimum 1, maximum 10 tokens");
        require(totalSupply().add(maxTOKENS) <= MAX_TOKENS, "Exceeds MAX_TOKENS");
        require(msg.value >= calculatePrice().mul(maxTOKENS), "Ether value sent is below the price");
        
        for (uint i = 0; i < maxTOKENS; 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()));
    }
    
    //a contributor added this. could be usefull.
    
    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_TOKENS","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":[{"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":"maxTOKENS","type":"uint256"}],"name":"mintToken","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":[],"name":"script","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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"}]

60806040526000600a60146101000a81548160ff02191690831515021790555060405180602001604052806000815250600d90805190602001906200004692919062000c2b565b5060405180606001604052806024815260200162005d1b60249139600e90805190602001906200007892919062000c2b565b5060405180602001604052806000815250600f9080519060200190620000a092919062000c2b565b506040518060200160405280600081525060109080519060200190620000c892919062000c2b565b50348015620000d657600080fd5b506040518060400160405280600a81526020017f526564656d7074696f6e000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f5244500000000000000000000000000000000000000000000000000000000000815250620001747f01ffc9a700000000000000000000000000000000000000000000000000000000620003ce60201b60201c565b81600690805190602001906200018c92919062000c2b565b508060079080519060200190620001a592919062000c2b565b50620001d77f80ac58cd00000000000000000000000000000000000000000000000000000000620003ce60201b60201c565b620002087f5b5e139f00000000000000000000000000000000000000000000000000000000620003ce60201b60201c565b620002397f780e9d6300000000000000000000000000000000000000000000000000000000620003ce60201b60201c565b505060006200024d620004a660201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200031660405180606001604052806024815260200162005d3f60249139620004ae60201b60201c565b620003293360006200055160201b60201c565b43600b60008081526020019081526020016000208190555033600c600080815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518061120001604052806111cc815260200162005d636111cc913960109080519060200190620003c792919062000c2b565b50620011fc565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200043a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004319062000eba565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b620004be620004a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004e46200057760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200053d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005349062000f20565b60405180910390fd5b6200054e81620005a160201b60201c565b50565b62000573828260405180602001604052806000815250620005bd60201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060099080519060200190620005b992919062000c2b565b5050565b620005cf83836200062b60201b60201c565b620005e46000848484620007dd60201b60201c565b62000626576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200061d9062000e98565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200069e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006959062000efe565b60405180910390fd5b620006af816200099760201b60201c565b15620006f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006e99062000edc565b60405180910390fd5b6200070660008383620009bb60201b60201c565b6200075e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620009c060201b620021af1790919060201c565b506200077c81836002620009e260201b620021c9179092919060201c565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200080b8473ffffffffffffffffffffffffffffffffffffffff1662000a1f60201b620021fe1760201c565b156200098a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200083d620004a660201b60201c565b8786866040518563ffffffff1660e01b815260040162000861949392919062000e44565b602060405180830381600087803b1580156200087c57600080fd5b505af1925050508015620008b057506040513d601f19601f82011682018060405250810190620008ad919062000cf2565b60015b62000939573d8060008114620008e3576040519150601f19603f3d011682016040523d82523d6000602084013e620008e8565b606091505b5060008151141562000931576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009289062000e98565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506200098f565b600190505b949350505050565b6000620009b482600262000a3260201b620022111790919060201c565b9050919050565b505050565b6000620009da836000018360001b62000a5460201b60201c565b905092915050565b600062000a16846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b62000ace60201b60201c565b90509392505050565b600080823b905060008111915050919050565b600062000a4c836000018360001b62000be560201b60201c565b905092915050565b600062000a68838362000c0860201b60201c565b62000ac357826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000ac8565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141562000b775784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505062000bde565b828560000160018362000b8b919062000f6f565b8154811062000bc3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805462000c39906200104a565b90600052602060002090601f01602090048101928262000c5d576000855562000ca9565b82601f1062000c7857805160ff191683800117855562000ca9565b8280016001018555821562000ca9579182015b8281111562000ca857825182559160200191906001019062000c8b565b5b50905062000cb8919062000cbc565b5090565b5b8082111562000cd757600081600090555060010162000cbd565b5090565b60008151905062000cec81620011e2565b92915050565b60006020828403121562000d0557600080fd5b600062000d158482850162000cdb565b91505092915050565b62000d298162000faa565b82525050565b600062000d3c8262000f42565b62000d48818562000f4d565b935062000d5a81856020860162001014565b62000d6581620010de565b840191505092915050565b600062000d7f60328362000f5e565b915062000d8c82620010ef565b604082019050919050565b600062000da6601c8362000f5e565b915062000db3826200113e565b602082019050919050565b600062000dcd601c8362000f5e565b915062000dda8262001167565b602082019050919050565b600062000df460208362000f5e565b915062000e018262001190565b602082019050919050565b600062000e1b60208362000f5e565b915062000e2882620011b9565b602082019050919050565b62000e3e816200100a565b82525050565b600060808201905062000e5b600083018762000d1e565b62000e6a602083018662000d1e565b62000e79604083018562000e33565b818103606083015262000e8d818462000d2f565b905095945050505050565b6000602082019050818103600083015262000eb38162000d70565b9050919050565b6000602082019050818103600083015262000ed58162000d97565b9050919050565b6000602082019050818103600083015262000ef78162000dbe565b9050919050565b6000602082019050818103600083015262000f198162000de5565b9050919050565b6000602082019050818103600083015262000f3b8162000e0c565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000f7c826200100a565b915062000f89836200100a565b92508282101562000f9f5762000f9e62001080565b5b828203905092915050565b600062000fb78262000fea565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200103457808201518184015260208101905062001017565b8381111562001044576000848401525b50505050565b600060028204905060018216806200106357607f821691505b602082108114156200107a5762001079620010af565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b620011ed8162000fbe565b8114620011f957600080fd5b50565b614b0f806200120c6000396000f3fe60806040526004361061023b5760003560e01c8063753853c11161012e578063c634d032116100ab578063e985e9c51161006f578063e985e9c51461088f578063ebe9eb9f146108cc578063f0c9dc60146108f7578063f2fde38b14610922578063f47c84c51461094b5761023b565b8063c634d03214610791578063c87b56dd146107ad578063c8a01226146107ea578063cd53d08e14610827578063d348b409146108645761023b565b806395d89b41116100f257806395d89b411461069a5780639758e904146106c5578063a22cb46514610702578063a38643971461072b578063b88d4fde146107685761023b565b8063753853c1146105d45780638462151c146105ff578063853828b61461063c578063891cc177146106465780638da5cb5b1461066f5761023b565b80632f745c59116101bc5780636352211e116101805780636352211e146104db57806363d96941146105185780636c0360eb1461055557806370a0823114610580578063715018a6146105bd5761023b565b80632f745c59146103f857806334d84c7b1461043557806342842e0e1461044c5780634f6ccce71461047557806355f804b3146104b25761023b565b806318160ddd1161020357806318160ddd146103375780631c8b232d1461036257806323b872dd1461038d5780632808c92c146103b65780632ee2ac36146103cd5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063109695231461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135a1565b610976565b6040516102749190613c8f565b60405180910390f35b34801561028957600080fd5b506102926109dd565b60405161029f9190613cc5565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613634565b610a6f565b6040516102dc9190613c06565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613565565b610af4565b005b34801561031a57600080fd5b50610335600480360381019061033091906135f3565b610c0c565b005b34801561034357600080fd5b5061034c610ca2565b6040516103599190613fa7565b60405180910390f35b34801561036e57600080fd5b50610377610cb3565b6040516103849190613c8f565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af919061345f565b610cc6565b005b3480156103c257600080fd5b506103cb610d26565b005b3480156103d957600080fd5b506103e2610dbf565b6040516103ef9190613cc5565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613565565b610e4d565b60405161042c9190613fa7565b60405180910390f35b34801561044157600080fd5b5061044a610ea8565b005b34801561045857600080fd5b50610473600480360381019061046e919061345f565b610f41565b005b34801561048157600080fd5b5061049c60048036038101906104979190613634565b610f61565b6040516104a99190613fa7565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d491906135f3565b610f84565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190613634565b61100c565b60405161050f9190613c06565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613634565b611043565b60405161054c9190613cc5565b60405180910390f35b34801561056157600080fd5b5061056a6110bf565b6040516105779190613cc5565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a291906133fa565b611151565b6040516105b49190613fa7565b60405180910390f35b3480156105c957600080fd5b506105d2611210565b005b3480156105e057600080fd5b506105e961134d565b6040516105f69190613cc5565b60405180910390f35b34801561060b57600080fd5b50610626600480360381019061062191906133fa565b6113db565b6040516106339190613c6d565b60405180910390f35b610644611557565b005b34801561065257600080fd5b5061066d600480360381019061066891906135f3565b611613565b005b34801561067b57600080fd5b506106846116a9565b6040516106919190613c06565b60405180910390f35b3480156106a657600080fd5b506106af6116d3565b6040516106bc9190613cc5565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190613634565b611765565b6040516106f99190613cc5565b60405180910390f35b34801561070e57600080fd5b5061072960048036038101906107249190613529565b6117e1565b005b34801561073757600080fd5b50610752600480360381019061074d9190613634565b611962565b60405161075f9190613caa565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a91906134ae565b611a26565b005b6107ab60048036038101906107a69190613634565b611a88565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613634565b611c80565b6040516107e19190613cc5565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190613634565b611df3565b60405161081e9190613fa7565b60405180910390f35b34801561083357600080fd5b5061084e60048036038101906108499190613634565b611e0b565b60405161085b9190613c06565b60405180910390f35b34801561087057600080fd5b50610879611e3e565b6040516108869190613fa7565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190613423565b611e4d565b6040516108c39190613c8f565b60405180910390f35b3480156108d857600080fd5b506108e1611ee1565b6040516108ee9190613cc5565b60405180910390f35b34801561090357600080fd5b5061090c611f6f565b6040516109199190613cc5565b60405180910390f35b34801561092e57600080fd5b50610949600480360381019061094491906133fa565b611ffd565b005b34801561095757600080fd5b506109606121a9565b60405161096d9190613fa7565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600680546109ec906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054610a18906142af565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050905090565b6000610a7a8261222b565b610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090613e67565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aff8261100c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790613ee7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8f612248565b73ffffffffffffffffffffffffffffffffffffffff161480610bbe5750610bbd81610bb8612248565b611e4d565b5b610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490613dc7565b60405180910390fd5b610c078383612250565b505050565b610c14612248565b73ffffffffffffffffffffffffffffffffffffffff16610c326116a9565b73ffffffffffffffffffffffffffffffffffffffff1614610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613e87565b60405180910390fd5b80600d9080519060200190610c9e92919061321e565b5050565b6000610cae6002612309565b905090565b600a60149054906101000a900460ff1681565b610cd7610cd1612248565b8261231e565b610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613f47565b60405180910390fd5b610d218383836123fc565b505050565b610d2e612248565b73ffffffffffffffffffffffffffffffffffffffff16610d4c6116a9565b73ffffffffffffffffffffffffffffffffffffffff1614610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990613e87565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b600e8054610dcc906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054610df8906142af565b8015610e455780601f10610e1a57610100808354040283529160200191610e45565b820191906000526020600020905b815481529060010190602001808311610e2857829003601f168201915b505050505081565b6000610ea082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061261390919063ffffffff16565b905092915050565b610eb0612248565b73ffffffffffffffffffffffffffffffffffffffff16610ece6116a9565b73ffffffffffffffffffffffffffffffffffffffff1614610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90613e87565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610f5c83838360405180602001604052806000815250611a26565b505050565b600080610f7883600261262d90919063ffffffff16565b50905080915050919050565b610f8c612248565b73ffffffffffffffffffffffffffffffffffffffff16610faa6116a9565b73ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790613e87565b60405180910390fd5b61100981612659565b50565b600061103c82604051806060016040528060298152602001614ab16029913960026126739092919063ffffffff16565b9050919050565b606061104e8261222b565b61108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490613f67565b60405180910390fd5b600e61109883612692565b6040516020016110a9929190613be2565b6040516020818303038152906040529050919050565b6060600980546110ce906142af565b80601f01602080910402602001604051908101604052809291908181526020018280546110fa906142af565b80156111475780601f1061111c57610100808354040283529160200191611147565b820191906000526020600020905b81548152906001019060200180831161112a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990613de7565b60405180910390fd5b611209600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061283f565b9050919050565b611218612248565b73ffffffffffffffffffffffffffffffffffffffff166112366116a9565b73ffffffffffffffffffffffffffffffffffffffff161461128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390613e87565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600f805461135a906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611386906142af565b80156113d35780601f106113a8576101008083540402835291602001916113d3565b820191906000526020600020905b8154815290600101906020018083116113b657829003601f168201915b505050505081565b606060006113e883611151565b9050600081141561146b57600067ffffffffffffffff811115611434577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156114625781602001602082028036833780820191505090505b50915050611552565b60008167ffffffffffffffff8111156114ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156114db5781602001602082028036833780820191505090505b50905060005b8281101561154b576114f38582610e4d565b82828151811061152c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061154390614312565b9150506114e1565b8193505050505b919050565b61155f612248565b73ffffffffffffffffffffffffffffffffffffffff1661157d6116a9565b73ffffffffffffffffffffffffffffffffffffffff16146115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90613e87565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061161157600080fd5b565b61161b612248565b73ffffffffffffffffffffffffffffffffffffffff166116396116a9565b73ffffffffffffffffffffffffffffffffffffffff161461168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690613e87565b60405180910390fd5b80600f90805190602001906116a592919061321e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546116e2906142af565b80601f016020809104026020016040519081016040528092919081815260200182805461170e906142af565b801561175b5780601f106117305761010080835404028352916020019161175b565b820191906000526020600020905b81548152906001019060200180831161173e57829003601f168201915b5050505050905090565b60606117708261222b565b6117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613f67565b60405180910390fd5b600f6117ba83612692565b6040516020016117cb929190613be2565b6040516020818303038152906040529050919050565b6117e9612248565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90613d87565b60405180910390fd5b8060056000611864612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611911612248565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119569190613c8f565b60405180910390a35050565b600061196d8261222b565b6119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390613f67565b60405180910390fd5b30600b600084815260200190815260200160002054600c600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051602001611a099493929190613b70565b604051602081830303815290604052805190602001209050919050565b611a37611a31612248565b8361231e565b611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d90613f47565b60405180910390fd5b611a8284848484612854565b50505050565b610400611a93610ca2565b10611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90613f07565b60405180910390fd5b600081118015611ae45750600a8111155b611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a90613f27565b60405180910390fd5b610400611b4082611b32610ca2565b6128b090919063ffffffff16565b1115611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890613f87565b60405180910390fd5b611b9b81611b8d611e3e565b6128c690919063ffffffff16565b341015611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490613e07565b60405180910390fd5b60005b81811015611c7c576000611bf2610ca2565b9050611bfe33826128dc565b43600b60008381526020019081526020016000208190555033600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080611c7490614312565b915050611be0565b5050565b6060611c8b8261222b565b611cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc190613ec7565b60405180910390fd5b6000600860008481526020019081526020016000208054611cea906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611d16906142af565b8015611d635780601f10611d3857610100808354040283529160200191611d63565b820191906000526020600020905b815481529060010190602001808311611d4657829003601f168201915b505050505090506000611d746110bf565b9050600081511415611d8a578192505050611dee565b600082511115611dbf578082604051602001611da7929190613bbe565b60405160208183030381529060405292505050611dee565b80611dc985612692565b604051602001611dda929190613bbe565b604051602081830303815290604052925050505b919050565b600b6020528060005260406000206000915090505481565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000667c585087238000905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60108054611eee906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1a906142af565b8015611f675780601f10611f3c57610100808354040283529160200191611f67565b820191906000526020600020905b815481529060010190602001808311611f4a57829003601f168201915b505050505081565b600d8054611f7c906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa8906142af565b8015611ff55780601f10611fca57610100808354040283529160200191611ff5565b820191906000526020600020905b815481529060010190602001808311611fd857829003601f168201915b505050505081565b612005612248565b73ffffffffffffffffffffffffffffffffffffffff166120236116a9565b73ffffffffffffffffffffffffffffffffffffffff1614612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207090613e87565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e090613d27565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b60006121c1836000018360001b6128fa565b905092915050565b60006121f5846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61296a565b90509392505050565b600080823b905060008111915050919050565b6000612223836000018360001b612a7c565b905092915050565b600061224182600261221190919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c38361100c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061231782600001612a9f565b9050919050565b60006123298261222b565b612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613da7565b60405180910390fd5b60006123738361100c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123e257508373ffffffffffffffffffffffffffffffffffffffff166123ca84610a6f565b73ffffffffffffffffffffffffffffffffffffffff16145b806123f357506123f28185611e4d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661241c8261100c565b73ffffffffffffffffffffffffffffffffffffffff1614612472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246990613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990613d67565b60405180910390fd5b6124ed838383612ab0565b6124f8600082612250565b61254981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ab590919063ffffffff16565b5061259b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121af90919063ffffffff16565b506125b2818360026121c99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006126228360000183612acf565b60001c905092915050565b6000806000806126408660000186612b69565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061266f92919061321e565b5050565b6000612686846000018460001b84612c19565b60001c90509392505050565b606060008214156126da576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061283a565b600082905060005b6000821461270c5780806126f590614312565b915050600a826127059190614130565b91506126e2565b60008167ffffffffffffffff81111561274e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127805781602001600182028036833780820191505090505b5090505b600085146128335760018261279991906141bb565b9150600a856127a89190614389565b60306127b491906140da565b60f81b8183815181106127f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561282c9190614130565b9450612784565b8093505050505b919050565b600061284d82600001612ce0565b9050919050565b61285f8484846123fc565b61286b84848484612cf1565b6128aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a190613d07565b60405180910390fd5b50505050565b600081836128be91906140da565b905092915050565b600081836128d49190614161565b905092915050565b6128f6828260405180602001604052806000815250612e88565b5050565b60006129068383612ee3565b61295f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612964565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612a1157846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612a75565b8285600001600183612a2391906141bb565b81548110612a5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b6000612ac7836000018360001b612f06565b905092915050565b600081836000018054905011612b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1190613ce7565b60405180910390fd5b826000018281548110612b56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac90613e27565b60405180910390fd5b6000846000018481548110612bf3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c729190613cc5565b60405180910390fd5b5084600001600182612c8d91906141bb565b81548110612cc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612d128473ffffffffffffffffffffffffffffffffffffffff166121fe565b15612e7b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d3b612248565b8786866040518563ffffffff1660e01b8152600401612d5d9493929190613c21565b602060405180830381600087803b158015612d7757600080fd5b505af1925050508015612da857506040513d601f19601f82011682018060405250810190612da591906135ca565b60015b612e2b573d8060008114612dd8576040519150601f19603f3d011682016040523d82523d6000602084013e612ddd565b606091505b50600081511415612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a90613d07565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e80565b600190505b949350505050565b612e928383613090565b612e9f6000848484612cf1565b612ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed590613d07565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114613084576000600182612f3891906141bb565b9050600060018660000180549050612f5091906141bb565b90506000866000018281548110612f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612fda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183612ff591906140da565b8760010160008381526020019081526020016000208190555086600001805480613048577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061308a565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f790613e47565b60405180910390fd5b6131098161222b565b15613149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314090613d47565b60405180910390fd5b61315560008383612ab0565b6131a681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121af90919063ffffffff16565b506131bd818360026121c99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461322a906142af565b90600052602060002090601f01602090048101928261324c5760008555613293565b82601f1061326557805160ff1916838001178555613293565b82800160010185558215613293579182015b82811115613292578251825591602001919060010190613277565b5b5090506132a091906132a4565b5090565b5b808211156132bd5760008160009055506001016132a5565b5090565b60006132d46132cf84613fe7565b613fc2565b9050828152602081018484840111156132ec57600080fd5b6132f784828561426d565b509392505050565b600061331261330d84614018565b613fc2565b90508281526020810184848401111561332a57600080fd5b61333584828561426d565b509392505050565b60008135905061334c81614a54565b92915050565b60008135905061336181614a6b565b92915050565b60008135905061337681614a82565b92915050565b60008151905061338b81614a82565b92915050565b600082601f8301126133a257600080fd5b81356133b28482602086016132c1565b91505092915050565b600082601f8301126133cc57600080fd5b81356133dc8482602086016132ff565b91505092915050565b6000813590506133f481614a99565b92915050565b60006020828403121561340c57600080fd5b600061341a8482850161333d565b91505092915050565b6000806040838503121561343657600080fd5b60006134448582860161333d565b92505060206134558582860161333d565b9150509250929050565b60008060006060848603121561347457600080fd5b60006134828682870161333d565b93505060206134938682870161333d565b92505060406134a4868287016133e5565b9150509250925092565b600080600080608085870312156134c457600080fd5b60006134d28782880161333d565b94505060206134e38782880161333d565b93505060406134f4878288016133e5565b925050606085013567ffffffffffffffff81111561351157600080fd5b61351d87828801613391565b91505092959194509250565b6000806040838503121561353c57600080fd5b600061354a8582860161333d565b925050602061355b85828601613352565b9150509250929050565b6000806040838503121561357857600080fd5b60006135868582860161333d565b9250506020613597858286016133e5565b9150509250929050565b6000602082840312156135b357600080fd5b60006135c184828501613367565b91505092915050565b6000602082840312156135dc57600080fd5b60006135ea8482850161337c565b91505092915050565b60006020828403121561360557600080fd5b600082013567ffffffffffffffff81111561361f57600080fd5b61362b848285016133bb565b91505092915050565b60006020828403121561364657600080fd5b6000613654848285016133e5565b91505092915050565b60006136698383613b3b565b60208301905092915050565b61367e816141ef565b82525050565b613695613690826141ef565b61435b565b82525050565b60006136a68261406e565b6136b0818561409c565b93506136bb83614049565b8060005b838110156136ec5781516136d3888261365d565b97506136de8361408f565b9250506001810190506136bf565b5085935050505092915050565b61370281614201565b82525050565b6137118161420d565b82525050565b600061372282614079565b61372c81856140ad565b935061373c81856020860161427c565b61374581614476565b840191505092915050565b600061375b82614084565b61376581856140be565b935061377581856020860161427c565b61377e81614476565b840191505092915050565b600061379482614084565b61379e81856140cf565b93506137ae81856020860161427c565b80840191505092915050565b600081546137c7816142af565b6137d181866140cf565b945060018216600081146137ec57600181146137fd57613830565b60ff19831686528186019350613830565b61380685614059565b60005b8381101561382857815481890152600182019150602081019050613809565b838801955050505b50505092915050565b60006138466022836140be565b915061385182614494565b604082019050919050565b60006138696032836140be565b9150613874826144e3565b604082019050919050565b600061388c6026836140be565b915061389782614532565b604082019050919050565b60006138af601c836140be565b91506138ba82614581565b602082019050919050565b60006138d26024836140be565b91506138dd826145aa565b604082019050919050565b60006138f56019836140be565b9150613900826145f9565b602082019050919050565b6000613918602c836140be565b915061392382614622565b604082019050919050565b600061393b6038836140be565b915061394682614671565b604082019050919050565b600061395e602a836140be565b9150613969826146c0565b604082019050919050565b60006139816023836140be565b915061398c8261470f565b604082019050919050565b60006139a46022836140be565b91506139af8261475e565b604082019050919050565b60006139c76020836140be565b91506139d2826147ad565b602082019050919050565b60006139ea602c836140be565b91506139f5826147d6565b604082019050919050565b6000613a0d6020836140be565b9150613a1882614825565b602082019050919050565b6000613a306029836140be565b9150613a3b8261484e565b604082019050919050565b6000613a53602f836140be565b9150613a5e8261489d565b604082019050919050565b6000613a766021836140be565b9150613a81826148ec565b604082019050919050565b6000613a996016836140be565b9150613aa48261493b565b602082019050919050565b6000613abc602a836140be565b9150613ac782614964565b604082019050919050565b6000613adf6031836140be565b9150613aea826149b3565b604082019050919050565b6000613b02600e836140be565b9150613b0d82614a02565b602082019050919050565b6000613b256012836140be565b9150613b3082614a2b565b602082019050919050565b613b4481614263565b82525050565b613b5381614263565b82525050565b613b6a613b6582614263565b61437f565b82525050565b6000613b7c8287613684565b601482019150613b8c8286613b59565b602082019150613b9c8285613684565b601482019150613bac8284613b59565b60208201915081905095945050505050565b6000613bca8285613789565b9150613bd68284613789565b91508190509392505050565b6000613bee82856137ba565b9150613bfa8284613789565b91508190509392505050565b6000602082019050613c1b6000830184613675565b92915050565b6000608082019050613c366000830187613675565b613c436020830186613675565b613c506040830185613b4a565b8181036060830152613c628184613717565b905095945050505050565b60006020820190508181036000830152613c87818461369b565b905092915050565b6000602082019050613ca460008301846136f9565b92915050565b6000602082019050613cbf6000830184613708565b92915050565b60006020820190508181036000830152613cdf8184613750565b905092915050565b60006020820190508181036000830152613d0081613839565b9050919050565b60006020820190508181036000830152613d208161385c565b9050919050565b60006020820190508181036000830152613d408161387f565b9050919050565b60006020820190508181036000830152613d60816138a2565b9050919050565b60006020820190508181036000830152613d80816138c5565b9050919050565b60006020820190508181036000830152613da0816138e8565b9050919050565b60006020820190508181036000830152613dc08161390b565b9050919050565b60006020820190508181036000830152613de08161392e565b9050919050565b60006020820190508181036000830152613e0081613951565b9050919050565b60006020820190508181036000830152613e2081613974565b9050919050565b60006020820190508181036000830152613e4081613997565b9050919050565b60006020820190508181036000830152613e60816139ba565b9050919050565b60006020820190508181036000830152613e80816139dd565b9050919050565b60006020820190508181036000830152613ea081613a00565b9050919050565b60006020820190508181036000830152613ec081613a23565b9050919050565b60006020820190508181036000830152613ee081613a46565b9050919050565b60006020820190508181036000830152613f0081613a69565b9050919050565b60006020820190508181036000830152613f2081613a8c565b9050919050565b60006020820190508181036000830152613f4081613aaf565b9050919050565b60006020820190508181036000830152613f6081613ad2565b9050919050565b60006020820190508181036000830152613f8081613af5565b9050919050565b60006020820190508181036000830152613fa081613b18565b9050919050565b6000602082019050613fbc6000830184613b4a565b92915050565b6000613fcc613fdd565b9050613fd882826142e1565b919050565b6000604051905090565b600067ffffffffffffffff82111561400257614001614447565b5b61400b82614476565b9050602081019050919050565b600067ffffffffffffffff82111561403357614032614447565b5b61403c82614476565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140e582614263565b91506140f083614263565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614125576141246143ba565b5b828201905092915050565b600061413b82614263565b915061414683614263565b925082614156576141556143e9565b5b828204905092915050565b600061416c82614263565b915061417783614263565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141b0576141af6143ba565b5b828202905092915050565b60006141c682614263565b91506141d183614263565b9250828210156141e4576141e36143ba565b5b828203905092915050565b60006141fa82614243565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561429a57808201518184015260208101905061427f565b838111156142a9576000848401525b50505050565b600060028204905060018216806142c757607f821691505b602082108114156142db576142da614418565b5b50919050565b6142ea82614476565b810181811067ffffffffffffffff8211171561430957614308614447565b5b80604052505050565b600061431d82614263565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143505761434f6143ba565b5b600182019050919050565b60006143668261436d565b9050919050565b600061437882614487565b9050919050565b6000819050919050565b600061439482614263565b915061439f83614263565b9250826143af576143ae6143e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f596f752063616e20636c61696d206d696e696d756d20312c206d6178696d756d60008201527f20313020746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b7f45786365656473204d41585f544f4b454e530000000000000000000000000000600082015250565b614a5d816141ef565b8114614a6857600080fd5b50565b614a7481614201565b8114614a7f57600080fd5b50565b614a8b81614217565b8114614a9657600080fd5b50565b614aa281614263565b8114614aad57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220575df3c2471571c8b92d192a0ddddd06549a627768dc33736a80641c90023f4f64736f6c6343000804003368747470733a2f2f726564656d7074696f6e6e66742e6172742f67656e657261746f722f68747470733a2f2f726564656d7074696f6e6e66742e6172742f6170692f746f6b656e2f636c6173732052616e646f6d7b636f6e7374727563746f722865297b746869732e736565643d657d72616e646f6d5f64656328297b72657475726e20746869732e736565645e3d746869732e736565643c3c31332c746869732e736565645e3d746869732e736565643e3e31372c746869732e736565645e3d746869732e736565643c3c352c28746869732e736565643c303f312b7e746869732e736565643a746869732e7365656429253165332f3165337d72616e646f6d5f6265747765656e28652c74297b72657475726e20652b28742d65292a746869732e72616e646f6d5f64656328297d72616e646f6d5f696e7428652c74297b72657475726e204d6174682e666c6f6f7228746869732e72616e646f6d5f6265747765656e28652c742b3129297d72616e646f6d5f63686f6963652865297b72657475726e20655b4d6174682e666c6f6f7228746869732e72616e646f6d5f6265747765656e28302c2e39392a652e6c656e67746829295d7d7d6c65742074696c65732c74696c6557696474682c74696c654865696768742c70616c657474652c746f6b656e446174613d77696e646f772e746f6b656e486173682c736565643d7061727365496e7428746f6b656e446174612e736c69636528302c3136292c3136292c726e673d6e65772052616e646f6d2873656564292c56503d4d6174682e6d696e2877696e646f772e696e6e65724865696768742c77696e646f772e696e6e65725769647468292c57494454483d56502c4845494748543d56502c72616e646f6d6e6573733d5b5d2c70616c65747465733d5b274644464446442d4541454145412d4438443844382d4336433643362d423442344234272c276433643464392d3462383861322d6262306132312d3235323632372d666666396662272c276338666662652d6564666661622d6261393539332d3839363038652d363233623561272c276666396631632d6666626636392d6666666666662d6362663366302d326563346236272c273535353335382d3566363036322d3762373236332d6336636135332d633964636233272c273534306436652d6565343236362d6666643233662d6633666366302d316632373162272c273165393164362d3030373262622d3866633933612d6534636333372d653138333335272c276561376166342d6234336538662d3632303062332d3362303038362d323930363238272c273562356235622d3764376337612d6339633139662d6564663764322d656466376235272c273333333333332d3833393738382d6565653063622d6261613839382d626664376561272c273538353132332d6565633137302d6632613635612d6635383534392d373732663161272c276662663566332d6532383431332d3030303032322d6465336334622d633432383437272c273066613362312d6439653564362d6564646561342d6637613037322d666639623432272c273130303032622d3234303034362d3561313839612d3964346564642d653061616666272c273034363663382d3032336537642d3030313834352d3333343135632d376438353937272c273836313635372d6136343235332d6435366161302d6262646262342d666366306363272c273439333834332d3631393838652d6130623261362d6362626662622d656162646138272c273033316434342d3034333935652d3730613238382d6461623738352d643538393666272c276666306135342d6666356338612d6666383561312d6662623162642d663763616430272c273436336633612d3861383137632d6263623862312d6634663365652d653061666130272c276464366534322d6538646162322d3466366437612d6330643664662d656165616561272c276666643666662d6537633666662d6338623666662d6238633066662d626264306666272c276161386636362d6564396234302d6666656564622d3631633961382d626133623436272c276135373534382d6663643761642d6636633238622d3532393661352d383264646630272c273731336535612d3633613337352d6564633739622d6435376136362d636136363830272c273131346235662d3435363939302d6534666465312d6634356236392d366232373337272c276564663266622d6532656166632d6363646266642d6331643366652d616263346666272c273963616662372d6561643261632d6665393338632d6536623839632d343238316134272c273762646666322d6232663765662d6566663766362d6637643665302d663262356434272c276666636462322d6666623461322d6535393839622d6235383338642d366436383735272c276632643765652d6433626363302d6135363638622d3639333036642d306531303364272c276666626530622d6662353630372d6666303036652d3833333865632d336138366666272c273962356465352d6631356262352d6665653434302d3030626266392d303066356434272c276665653434302d6631356262352d3962356465352d3030626266392d303066356434272c273138316139392d3564393363632d3435343539332d6530353332382d653238393736272c274636313036372d3545323339442d3030463042352d3644454341462d463446344544272c276638663966612d6465653265362d6164623562642d3439353035372d323132353239272c273231323532392d3030303030302d6164623562642d3439353035372d663866396661275d2e6d617028653d3e652e73706c697428272d27292e6d617028653d3e2723272b6529292c74696c65436f6c6f72733d5b5d2c617263243d5b5d2c61726324323d5b5d2c6973466c697070696e673d5b5d2c6973526f756e6465643d21312c7261646975733d302c6f6666733d5b5d2c63656c6c436f6c6f72733d5b5d2c70737565646f4672616d653d313b66756e6374696f6e20736574757028297b6e6f697365536565642873656564292c72616e646f6d536565642873656564292c63726561746543616e7661732857494454482c484549474854292c6672616d6552617465283630292c636f6c6f724d6f646528524742292c70616c657474653d726e672e72616e646f6d5f63686f6963652870616c6574746573292c6261636b67726f756e642870616c657474655b305d292c7374726f6b652870616c657474655b305d292c7374726f6b655765696768742830292c74696c65733d726e672e72616e646f6d5f696e7428322c3136292c74696c6557696474683d57494454482f74696c65732c74696c654865696768743d4845494748542f74696c65733b666f72286c657420653d303b653c3d74696c65733b652b2b297b6c657420653d6e65772041727261792874696c6573292e66696c6c286e756c6c292c743d6e65772041727261792874696c6573292e66696c6c286e756c6c292c693d6e65772041727261792874696c6573292e66696c6c286e756c6c293b666f72286c657420643d303b643c74696c65733b642b2b29655b645d3d726e672e72616e646f6d5f6265747765656e28302c31292c745b645d3d70616c657474655b726e672e72616e646f6d5f696e7428312c34295d2c695b645d3d726e672e72616e646f6d5f63686f6963652870616c65747465293b72616e646f6d6e6573732e707573682865292c74696c65436f6c6f72732e707573682874292c63656c6c436f6c6f72732e707573682869292c6973466c697070696e672e7075736828726e672e72616e646f6d5f63686f696365285b21302c21315d29292c6f6666732e7075736828726e672e72616e646f6d5f6265747765656e28302c3129292c617263242e7075736828726e672e72616e646f6d5f63686f696365285b34352c36305d29292c61726324322e7075736828726e672e72616e646f6d5f63686f696365285b50492c50492b515541525445525f50492c322a50495d29297d6e6f5374726f6b6528297d66756e6374696f6e206472617728297b6261636b67726f756e642870616c657474655b305d293b666f72286c657420653d303b653c3d74696c65733b652b2b297b666f72286c657420743d303b743c74696c65733b742b2b297b69662866696c6c2863656c6c436f6c6f72735b655d5b745d292c6973526f756e64656426267261646975733e2e30333f7261646975732d3d2e30323a7261646975732b3d2e30322c7075736828292c66696c6c2874696c65436f6c6f72735b655d5b745d292c72616e646f6d6e6573735b655d5b745d3e2e39296973466c697070696e675b655d3f61726328652a74696c6557696474682d74696c6557696474682f322c742a74696c654865696768742b74696c6557696474682f322c2e37352a74696c6557696474682c2e37352a74696c654865696768742c2e30312a7261646975732b6f6666735b655d2b6d6f757365582f3230302c2e30312a2d7261646975732b6f6666735b655d2b6d6f757365582f323030293a61726328652a74696c6557696474682d74696c6557696474682f322c742a74696c654865696768742b74696c6557696474682f322c2e37352a74696c6557696474682c2e37352a74696c654865696768742c617263245b655d2b6f6666735b655d2c61726324325b655d2b6f6666735b655d293b656c73652069662872616e646f6d6e6573735b655d5b745d3e2e362969662872616e646f6d6e6573735b655d5b745d3e2e3735296966286d6f757365497350726573736564297b7075736828293b6c657420693d636f6c6f722874696c65436f6c6f72735b655d5b745d293b692e736574416c706861283235362d73696e2870737565646f4672616d652f3230292a70737565646f4672616d652a37292c66696c6c2869292c656c6c6970736528652a74696c6557696474682d74696c6557696474682f322c742a74696c654865696768742b74696c654865696768742f322c74696c655769647468292c706f7028297d656c736520656c6c6970736528652a74696c6557696474682d74696c6557696474682f322c742a74696c654865696768742b74696c654865696768742f322c74696c655769647468293b656c73652072616e646f6d6e6573735b655d5b745d3e2e36383f61726328652a74696c6557696474682d74696c6557696474682f322c742a74696c654865696768742b74696c6557696474682f322c2e37352a74696c6557696474682c2e37352a74696c654865696768742c302c2d50492c43484f5244293a61726328652a74696c6557696474682d74696c6557696474682f322c742a74696c654865696768742b74696c6557696474682f322c2e37352a74696c6557696474682c2e37352a74696c654865696768742c50492c54574f5f50492c43484f5244293b656c73652072616e646f6d6e6573735b655d5b745d3e2e333f72616e646f6d6e6573735b655d5b745d3e2e353f7265637428652a74696c6557696474682d74696c6557696474682c742a74696c654865696768742c74696c6557696474682c74696c654865696768742c726164697573293a7265637428652a74696c6557696474682d74696c6557696474682c742a74696c654865696768742c74696c6557696474682c74696c65486569676874293a72616e646f6d6e6573735b655d5b745d3e2e323f747269616e676c6528652a74696c6557696474682d74696c6557696474682c742a74696c654865696768742b74696c654865696768742c652a74696c6557696474682c742a74696c654865696768742b74696c654865696768742c652a74696c6557696474682c742a74696c65486569676874293a747269616e676c6528652a74696c6557696474682d74696c6557696474682c742a74696c654865696768742b74696c654865696768742c652a74696c6557696474682c742a74696c654865696768742c652a74696c6557696474682d74696c6557696474682c742a74696c65486569676874293b706f7028297d7261646975733c3d2e313f286973526f756e6465643d21312c7261646975733d2e31293a7261646975733e39392626286973526f756e6465643d21302c7261646975733d3939297d6d6f7573654973507265737365643f287374726f6b652870616c657474655b305d292c7374726f6b655765696768742857494454482f3530302b34302a73696e2870737565646f4672616d652f31303029292c70737565646f4672616d652b2b293a286e6f5374726f6b6528292c7374726f6b655765696768742830292c70737565646f4672616d653d31297d

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063753853c11161012e578063c634d032116100ab578063e985e9c51161006f578063e985e9c51461088f578063ebe9eb9f146108cc578063f0c9dc60146108f7578063f2fde38b14610922578063f47c84c51461094b5761023b565b8063c634d03214610791578063c87b56dd146107ad578063c8a01226146107ea578063cd53d08e14610827578063d348b409146108645761023b565b806395d89b41116100f257806395d89b411461069a5780639758e904146106c5578063a22cb46514610702578063a38643971461072b578063b88d4fde146107685761023b565b8063753853c1146105d45780638462151c146105ff578063853828b61461063c578063891cc177146106465780638da5cb5b1461066f5761023b565b80632f745c59116101bc5780636352211e116101805780636352211e146104db57806363d96941146105185780636c0360eb1461055557806370a0823114610580578063715018a6146105bd5761023b565b80632f745c59146103f857806334d84c7b1461043557806342842e0e1461044c5780634f6ccce71461047557806355f804b3146104b25761023b565b806318160ddd1161020357806318160ddd146103375780631c8b232d1461036257806323b872dd1461038d5780632808c92c146103b65780632ee2ac36146103cd5761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e5578063109695231461030e575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906135a1565b610976565b6040516102749190613c8f565b60405180910390f35b34801561028957600080fd5b506102926109dd565b60405161029f9190613cc5565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613634565b610a6f565b6040516102dc9190613c06565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613565565b610af4565b005b34801561031a57600080fd5b50610335600480360381019061033091906135f3565b610c0c565b005b34801561034357600080fd5b5061034c610ca2565b6040516103599190613fa7565b60405180910390f35b34801561036e57600080fd5b50610377610cb3565b6040516103849190613c8f565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af919061345f565b610cc6565b005b3480156103c257600080fd5b506103cb610d26565b005b3480156103d957600080fd5b506103e2610dbf565b6040516103ef9190613cc5565b60405180910390f35b34801561040457600080fd5b5061041f600480360381019061041a9190613565565b610e4d565b60405161042c9190613fa7565b60405180910390f35b34801561044157600080fd5b5061044a610ea8565b005b34801561045857600080fd5b50610473600480360381019061046e919061345f565b610f41565b005b34801561048157600080fd5b5061049c60048036038101906104979190613634565b610f61565b6040516104a99190613fa7565b60405180910390f35b3480156104be57600080fd5b506104d960048036038101906104d491906135f3565b610f84565b005b3480156104e757600080fd5b5061050260048036038101906104fd9190613634565b61100c565b60405161050f9190613c06565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613634565b611043565b60405161054c9190613cc5565b60405180910390f35b34801561056157600080fd5b5061056a6110bf565b6040516105779190613cc5565b60405180910390f35b34801561058c57600080fd5b506105a760048036038101906105a291906133fa565b611151565b6040516105b49190613fa7565b60405180910390f35b3480156105c957600080fd5b506105d2611210565b005b3480156105e057600080fd5b506105e961134d565b6040516105f69190613cc5565b60405180910390f35b34801561060b57600080fd5b50610626600480360381019061062191906133fa565b6113db565b6040516106339190613c6d565b60405180910390f35b610644611557565b005b34801561065257600080fd5b5061066d600480360381019061066891906135f3565b611613565b005b34801561067b57600080fd5b506106846116a9565b6040516106919190613c06565b60405180910390f35b3480156106a657600080fd5b506106af6116d3565b6040516106bc9190613cc5565b60405180910390f35b3480156106d157600080fd5b506106ec60048036038101906106e79190613634565b611765565b6040516106f99190613cc5565b60405180910390f35b34801561070e57600080fd5b5061072960048036038101906107249190613529565b6117e1565b005b34801561073757600080fd5b50610752600480360381019061074d9190613634565b611962565b60405161075f9190613caa565b60405180910390f35b34801561077457600080fd5b5061078f600480360381019061078a91906134ae565b611a26565b005b6107ab60048036038101906107a69190613634565b611a88565b005b3480156107b957600080fd5b506107d460048036038101906107cf9190613634565b611c80565b6040516107e19190613cc5565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190613634565b611df3565b60405161081e9190613fa7565b60405180910390f35b34801561083357600080fd5b5061084e60048036038101906108499190613634565b611e0b565b60405161085b9190613c06565b60405180910390f35b34801561087057600080fd5b50610879611e3e565b6040516108869190613fa7565b60405180910390f35b34801561089b57600080fd5b506108b660048036038101906108b19190613423565b611e4d565b6040516108c39190613c8f565b60405180910390f35b3480156108d857600080fd5b506108e1611ee1565b6040516108ee9190613cc5565b60405180910390f35b34801561090357600080fd5b5061090c611f6f565b6040516109199190613cc5565b60405180910390f35b34801561092e57600080fd5b50610949600480360381019061094491906133fa565b611ffd565b005b34801561095757600080fd5b506109606121a9565b60405161096d9190613fa7565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600680546109ec906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054610a18906142af565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050905090565b6000610a7a8261222b565b610ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab090613e67565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610aff8261100c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6790613ee7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8f612248565b73ffffffffffffffffffffffffffffffffffffffff161480610bbe5750610bbd81610bb8612248565b611e4d565b5b610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf490613dc7565b60405180910390fd5b610c078383612250565b505050565b610c14612248565b73ffffffffffffffffffffffffffffffffffffffff16610c326116a9565b73ffffffffffffffffffffffffffffffffffffffff1614610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613e87565b60405180910390fd5b80600d9080519060200190610c9e92919061321e565b5050565b6000610cae6002612309565b905090565b600a60149054906101000a900460ff1681565b610cd7610cd1612248565b8261231e565b610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613f47565b60405180910390fd5b610d218383836123fc565b505050565b610d2e612248565b73ffffffffffffffffffffffffffffffffffffffff16610d4c6116a9565b73ffffffffffffffffffffffffffffffffffffffff1614610da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9990613e87565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b600e8054610dcc906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054610df8906142af565b8015610e455780601f10610e1a57610100808354040283529160200191610e45565b820191906000526020600020905b815481529060010190602001808311610e2857829003601f168201915b505050505081565b6000610ea082600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061261390919063ffffffff16565b905092915050565b610eb0612248565b73ffffffffffffffffffffffffffffffffffffffff16610ece6116a9565b73ffffffffffffffffffffffffffffffffffffffff1614610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90613e87565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610f5c83838360405180602001604052806000815250611a26565b505050565b600080610f7883600261262d90919063ffffffff16565b50905080915050919050565b610f8c612248565b73ffffffffffffffffffffffffffffffffffffffff16610faa6116a9565b73ffffffffffffffffffffffffffffffffffffffff1614611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790613e87565b60405180910390fd5b61100981612659565b50565b600061103c82604051806060016040528060298152602001614ab16029913960026126739092919063ffffffff16565b9050919050565b606061104e8261222b565b61108d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108490613f67565b60405180910390fd5b600e61109883612692565b6040516020016110a9929190613be2565b6040516020818303038152906040529050919050565b6060600980546110ce906142af565b80601f01602080910402602001604051908101604052809291908181526020018280546110fa906142af565b80156111475780601f1061111c57610100808354040283529160200191611147565b820191906000526020600020905b81548152906001019060200180831161112a57829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990613de7565b60405180910390fd5b611209600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061283f565b9050919050565b611218612248565b73ffffffffffffffffffffffffffffffffffffffff166112366116a9565b73ffffffffffffffffffffffffffffffffffffffff161461128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390613e87565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600f805461135a906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611386906142af565b80156113d35780601f106113a8576101008083540402835291602001916113d3565b820191906000526020600020905b8154815290600101906020018083116113b657829003601f168201915b505050505081565b606060006113e883611151565b9050600081141561146b57600067ffffffffffffffff811115611434577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156114625781602001602082028036833780820191505090505b50915050611552565b60008167ffffffffffffffff8111156114ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156114db5781602001602082028036833780820191505090505b50905060005b8281101561154b576114f38582610e4d565b82828151811061152c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061154390614312565b9150506114e1565b8193505050505b919050565b61155f612248565b73ffffffffffffffffffffffffffffffffffffffff1661157d6116a9565b73ffffffffffffffffffffffffffffffffffffffff16146115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ca90613e87565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061161157600080fd5b565b61161b612248565b73ffffffffffffffffffffffffffffffffffffffff166116396116a9565b73ffffffffffffffffffffffffffffffffffffffff161461168f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168690613e87565b60405180910390fd5b80600f90805190602001906116a592919061321e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546116e2906142af565b80601f016020809104026020016040519081016040528092919081815260200182805461170e906142af565b801561175b5780601f106117305761010080835404028352916020019161175b565b820191906000526020600020905b81548152906001019060200180831161173e57829003601f168201915b5050505050905090565b60606117708261222b565b6117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613f67565b60405180910390fd5b600f6117ba83612692565b6040516020016117cb929190613be2565b6040516020818303038152906040529050919050565b6117e9612248565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184e90613d87565b60405180910390fd5b8060056000611864612248565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611911612248565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119569190613c8f565b60405180910390a35050565b600061196d8261222b565b6119ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a390613f67565b60405180910390fd5b30600b600084815260200190815260200160002054600c600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684604051602001611a099493929190613b70565b604051602081830303815290604052805190602001209050919050565b611a37611a31612248565b8361231e565b611a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6d90613f47565b60405180910390fd5b611a8284848484612854565b50505050565b610400611a93610ca2565b10611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca90613f07565b60405180910390fd5b600081118015611ae45750600a8111155b611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a90613f27565b60405180910390fd5b610400611b4082611b32610ca2565b6128b090919063ffffffff16565b1115611b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7890613f87565b60405180910390fd5b611b9b81611b8d611e3e565b6128c690919063ffffffff16565b341015611bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd490613e07565b60405180910390fd5b60005b81811015611c7c576000611bf2610ca2565b9050611bfe33826128dc565b43600b60008381526020019081526020016000208190555033600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080611c7490614312565b915050611be0565b5050565b6060611c8b8261222b565b611cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc190613ec7565b60405180910390fd5b6000600860008481526020019081526020016000208054611cea906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611d16906142af565b8015611d635780601f10611d3857610100808354040283529160200191611d63565b820191906000526020600020905b815481529060010190602001808311611d4657829003601f168201915b505050505090506000611d746110bf565b9050600081511415611d8a578192505050611dee565b600082511115611dbf578082604051602001611da7929190613bbe565b60405160208183030381529060405292505050611dee565b80611dc985612692565b604051602001611dda929190613bbe565b604051602081830303815290604052925050505b919050565b600b6020528060005260406000206000915090505481565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000667c585087238000905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60108054611eee906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611f1a906142af565b8015611f675780601f10611f3c57610100808354040283529160200191611f67565b820191906000526020600020905b815481529060010190602001808311611f4a57829003601f168201915b505050505081565b600d8054611f7c906142af565b80601f0160208091040260200160405190810160405280929190818152602001828054611fa8906142af565b8015611ff55780601f10611fca57610100808354040283529160200191611ff5565b820191906000526020600020905b815481529060010190602001808311611fd857829003601f168201915b505050505081565b612005612248565b73ffffffffffffffffffffffffffffffffffffffff166120236116a9565b73ffffffffffffffffffffffffffffffffffffffff1614612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207090613e87565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e090613d27565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61040081565b60006121c1836000018360001b6128fa565b905092915050565b60006121f5846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61296a565b90509392505050565b600080823b905060008111915050919050565b6000612223836000018360001b612a7c565b905092915050565b600061224182600261221190919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122c38361100c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061231782600001612a9f565b9050919050565b60006123298261222b565b612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613da7565b60405180910390fd5b60006123738361100c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806123e257508373ffffffffffffffffffffffffffffffffffffffff166123ca84610a6f565b73ffffffffffffffffffffffffffffffffffffffff16145b806123f357506123f28185611e4d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661241c8261100c565b73ffffffffffffffffffffffffffffffffffffffff1614612472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246990613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d990613d67565b60405180910390fd5b6124ed838383612ab0565b6124f8600082612250565b61254981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612ab590919063ffffffff16565b5061259b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121af90919063ffffffff16565b506125b2818360026121c99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006126228360000183612acf565b60001c905092915050565b6000806000806126408660000186612b69565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061266f92919061321e565b5050565b6000612686846000018460001b84612c19565b60001c90509392505050565b606060008214156126da576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061283a565b600082905060005b6000821461270c5780806126f590614312565b915050600a826127059190614130565b91506126e2565b60008167ffffffffffffffff81111561274e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127805781602001600182028036833780820191505090505b5090505b600085146128335760018261279991906141bb565b9150600a856127a89190614389565b60306127b491906140da565b60f81b8183815181106127f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561282c9190614130565b9450612784565b8093505050505b919050565b600061284d82600001612ce0565b9050919050565b61285f8484846123fc565b61286b84848484612cf1565b6128aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a190613d07565b60405180910390fd5b50505050565b600081836128be91906140da565b905092915050565b600081836128d49190614161565b905092915050565b6128f6828260405180602001604052806000815250612e88565b5050565b60006129068383612ee3565b61295f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612964565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612a1157846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612a75565b8285600001600183612a2391906141bb565b81548110612a5a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b6000612ac7836000018360001b612f06565b905092915050565b600081836000018054905011612b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1190613ce7565b60405180910390fd5b826000018281548110612b56577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612bb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bac90613e27565b60405180910390fd5b6000846000018481548110612bf3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c729190613cc5565b60405180910390fd5b5084600001600182612c8d91906141bb565b81548110612cc4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612d128473ffffffffffffffffffffffffffffffffffffffff166121fe565b15612e7b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d3b612248565b8786866040518563ffffffff1660e01b8152600401612d5d9493929190613c21565b602060405180830381600087803b158015612d7757600080fd5b505af1925050508015612da857506040513d601f19601f82011682018060405250810190612da591906135ca565b60015b612e2b573d8060008114612dd8576040519150601f19603f3d011682016040523d82523d6000602084013e612ddd565b606091505b50600081511415612e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1a90613d07565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e80565b600190505b949350505050565b612e928383613090565b612e9f6000848484612cf1565b612ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed590613d07565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114613084576000600182612f3891906141bb565b9050600060018660000180549050612f5091906141bb565b90506000866000018281548110612f90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612fda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183612ff591906140da565b8760010160008381526020019081526020016000208190555086600001805480613048577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061308a565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f790613e47565b60405180910390fd5b6131098161222b565b15613149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314090613d47565b60405180910390fd5b61315560008383612ab0565b6131a681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206121af90919063ffffffff16565b506131bd818360026121c99092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461322a906142af565b90600052602060002090601f01602090048101928261324c5760008555613293565b82601f1061326557805160ff1916838001178555613293565b82800160010185558215613293579182015b82811115613292578251825591602001919060010190613277565b5b5090506132a091906132a4565b5090565b5b808211156132bd5760008160009055506001016132a5565b5090565b60006132d46132cf84613fe7565b613fc2565b9050828152602081018484840111156132ec57600080fd5b6132f784828561426d565b509392505050565b600061331261330d84614018565b613fc2565b90508281526020810184848401111561332a57600080fd5b61333584828561426d565b509392505050565b60008135905061334c81614a54565b92915050565b60008135905061336181614a6b565b92915050565b60008135905061337681614a82565b92915050565b60008151905061338b81614a82565b92915050565b600082601f8301126133a257600080fd5b81356133b28482602086016132c1565b91505092915050565b600082601f8301126133cc57600080fd5b81356133dc8482602086016132ff565b91505092915050565b6000813590506133f481614a99565b92915050565b60006020828403121561340c57600080fd5b600061341a8482850161333d565b91505092915050565b6000806040838503121561343657600080fd5b60006134448582860161333d565b92505060206134558582860161333d565b9150509250929050565b60008060006060848603121561347457600080fd5b60006134828682870161333d565b93505060206134938682870161333d565b92505060406134a4868287016133e5565b9150509250925092565b600080600080608085870312156134c457600080fd5b60006134d28782880161333d565b94505060206134e38782880161333d565b93505060406134f4878288016133e5565b925050606085013567ffffffffffffffff81111561351157600080fd5b61351d87828801613391565b91505092959194509250565b6000806040838503121561353c57600080fd5b600061354a8582860161333d565b925050602061355b85828601613352565b9150509250929050565b6000806040838503121561357857600080fd5b60006135868582860161333d565b9250506020613597858286016133e5565b9150509250929050565b6000602082840312156135b357600080fd5b60006135c184828501613367565b91505092915050565b6000602082840312156135dc57600080fd5b60006135ea8482850161337c565b91505092915050565b60006020828403121561360557600080fd5b600082013567ffffffffffffffff81111561361f57600080fd5b61362b848285016133bb565b91505092915050565b60006020828403121561364657600080fd5b6000613654848285016133e5565b91505092915050565b60006136698383613b3b565b60208301905092915050565b61367e816141ef565b82525050565b613695613690826141ef565b61435b565b82525050565b60006136a68261406e565b6136b0818561409c565b93506136bb83614049565b8060005b838110156136ec5781516136d3888261365d565b97506136de8361408f565b9250506001810190506136bf565b5085935050505092915050565b61370281614201565b82525050565b6137118161420d565b82525050565b600061372282614079565b61372c81856140ad565b935061373c81856020860161427c565b61374581614476565b840191505092915050565b600061375b82614084565b61376581856140be565b935061377581856020860161427c565b61377e81614476565b840191505092915050565b600061379482614084565b61379e81856140cf565b93506137ae81856020860161427c565b80840191505092915050565b600081546137c7816142af565b6137d181866140cf565b945060018216600081146137ec57600181146137fd57613830565b60ff19831686528186019350613830565b61380685614059565b60005b8381101561382857815481890152600182019150602081019050613809565b838801955050505b50505092915050565b60006138466022836140be565b915061385182614494565b604082019050919050565b60006138696032836140be565b9150613874826144e3565b604082019050919050565b600061388c6026836140be565b915061389782614532565b604082019050919050565b60006138af601c836140be565b91506138ba82614581565b602082019050919050565b60006138d26024836140be565b91506138dd826145aa565b604082019050919050565b60006138f56019836140be565b9150613900826145f9565b602082019050919050565b6000613918602c836140be565b915061392382614622565b604082019050919050565b600061393b6038836140be565b915061394682614671565b604082019050919050565b600061395e602a836140be565b9150613969826146c0565b604082019050919050565b60006139816023836140be565b915061398c8261470f565b604082019050919050565b60006139a46022836140be565b91506139af8261475e565b604082019050919050565b60006139c76020836140be565b91506139d2826147ad565b602082019050919050565b60006139ea602c836140be565b91506139f5826147d6565b604082019050919050565b6000613a0d6020836140be565b9150613a1882614825565b602082019050919050565b6000613a306029836140be565b9150613a3b8261484e565b604082019050919050565b6000613a53602f836140be565b9150613a5e8261489d565b604082019050919050565b6000613a766021836140be565b9150613a81826148ec565b604082019050919050565b6000613a996016836140be565b9150613aa48261493b565b602082019050919050565b6000613abc602a836140be565b9150613ac782614964565b604082019050919050565b6000613adf6031836140be565b9150613aea826149b3565b604082019050919050565b6000613b02600e836140be565b9150613b0d82614a02565b602082019050919050565b6000613b256012836140be565b9150613b3082614a2b565b602082019050919050565b613b4481614263565b82525050565b613b5381614263565b82525050565b613b6a613b6582614263565b61437f565b82525050565b6000613b7c8287613684565b601482019150613b8c8286613b59565b602082019150613b9c8285613684565b601482019150613bac8284613b59565b60208201915081905095945050505050565b6000613bca8285613789565b9150613bd68284613789565b91508190509392505050565b6000613bee82856137ba565b9150613bfa8284613789565b91508190509392505050565b6000602082019050613c1b6000830184613675565b92915050565b6000608082019050613c366000830187613675565b613c436020830186613675565b613c506040830185613b4a565b8181036060830152613c628184613717565b905095945050505050565b60006020820190508181036000830152613c87818461369b565b905092915050565b6000602082019050613ca460008301846136f9565b92915050565b6000602082019050613cbf6000830184613708565b92915050565b60006020820190508181036000830152613cdf8184613750565b905092915050565b60006020820190508181036000830152613d0081613839565b9050919050565b60006020820190508181036000830152613d208161385c565b9050919050565b60006020820190508181036000830152613d408161387f565b9050919050565b60006020820190508181036000830152613d60816138a2565b9050919050565b60006020820190508181036000830152613d80816138c5565b9050919050565b60006020820190508181036000830152613da0816138e8565b9050919050565b60006020820190508181036000830152613dc08161390b565b9050919050565b60006020820190508181036000830152613de08161392e565b9050919050565b60006020820190508181036000830152613e0081613951565b9050919050565b60006020820190508181036000830152613e2081613974565b9050919050565b60006020820190508181036000830152613e4081613997565b9050919050565b60006020820190508181036000830152613e60816139ba565b9050919050565b60006020820190508181036000830152613e80816139dd565b9050919050565b60006020820190508181036000830152613ea081613a00565b9050919050565b60006020820190508181036000830152613ec081613a23565b9050919050565b60006020820190508181036000830152613ee081613a46565b9050919050565b60006020820190508181036000830152613f0081613a69565b9050919050565b60006020820190508181036000830152613f2081613a8c565b9050919050565b60006020820190508181036000830152613f4081613aaf565b9050919050565b60006020820190508181036000830152613f6081613ad2565b9050919050565b60006020820190508181036000830152613f8081613af5565b9050919050565b60006020820190508181036000830152613fa081613b18565b9050919050565b6000602082019050613fbc6000830184613b4a565b92915050565b6000613fcc613fdd565b9050613fd882826142e1565b919050565b6000604051905090565b600067ffffffffffffffff82111561400257614001614447565b5b61400b82614476565b9050602081019050919050565b600067ffffffffffffffff82111561403357614032614447565b5b61403c82614476565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140e582614263565b91506140f083614263565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614125576141246143ba565b5b828201905092915050565b600061413b82614263565b915061414683614263565b925082614156576141556143e9565b5b828204905092915050565b600061416c82614263565b915061417783614263565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141b0576141af6143ba565b5b828202905092915050565b60006141c682614263565b91506141d183614263565b9250828210156141e4576141e36143ba565b5b828203905092915050565b60006141fa82614243565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561429a57808201518184015260208101905061427f565b838111156142a9576000848401525b50505050565b600060028204905060018216806142c757607f821691505b602082108114156142db576142da614418565b5b50919050565b6142ea82614476565b810181811067ffffffffffffffff8211171561430957614308614447565b5b80604052505050565b600061431d82614263565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143505761434f6143ba565b5b600182019050919050565b60006143668261436d565b9050919050565b600061437882614487565b9050919050565b6000819050919050565b600061439482614263565b915061439f83614263565b9250826143af576143ae6143e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f596f752063616e20636c61696d206d696e696d756d20312c206d6178696d756d60008201527f20313020746f6b656e7300000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b7f45786365656473204d41585f544f4b454e530000000000000000000000000000600082015250565b614a5d816141ef565b8114614a6857600080fd5b50565b614a7481614201565b8114614a7f57600080fd5b50565b614a8b81614217565b8114614a9657600080fd5b50565b614aa281614263565b8114614aad57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220575df3c2471571c8b92d192a0ddddd06549a627768dc33736a80641c90023f4f64736f6c63430008040033

Deployed Bytecode Sourcemap

66169:8184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31835:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43548:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46334:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45864:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72885:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45342:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66325:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47224:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73343:79;;;;;;;;;;;;;:::i;:::-;;66523:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45104:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73253:78;;;;;;;;;;;;;:::i;:::-;;47600:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45630:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73142:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43304:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73828:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44923:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42994:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58409:148;;;;;;;;;;;;;:::i;:::-;;66602:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71497:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73434:123;;;:::i;:::-;;73013:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57758:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43717:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74119:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46627:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73569:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47822:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72159:680;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43892:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66366:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66422:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72049:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46993:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66650:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66473:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58712:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66280:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31835:150;31920:4;31944:20;:33;31965:11;31944:33;;;;;;;;;;;;;;;;;;;;;;;;;;;31937:40;;31835:150;;;:::o;43548:100::-;43602:13;43635:5;43628:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43548:100;:::o;46334:221::-;46410:7;46438:16;46446:7;46438;:16::i;:::-;46430:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46523:15;:24;46539:7;46523:24;;;;;;;;;;;;;;;;;;;;;46516:31;;46334:221;;;:::o;45864:404::-;45945:13;45961:23;45976:7;45961:14;:23::i;:::-;45945:39;;46009:5;46003:11;;:2;:11;;;;45995:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46089:5;46073:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;46098:44;46122:5;46129:12;:10;:12::i;:::-;46098:23;:44::i;:::-;46073:69;46065:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;46239:21;46248:2;46252:7;46239:8;:21::i;:::-;45864:404;;;:::o;72885:116::-;57989:12;:10;:12::i;:::-;57978:23;;:7;:5;:7::i;:::-;:23;;;57970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72988:5:::1;72961:24;:32;;;;;;;;;;;;:::i;:::-;;72885:116:::0;:::o;45342:211::-;45403:7;45524:21;:12;:19;:21::i;:::-;45517:28;;45342:211;:::o;66325:34::-;;;;;;;;;;;;;:::o;47224:305::-;47385:41;47404:12;:10;:12::i;:::-;47418:7;47385:18;:41::i;:::-;47377:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47493:28;47503:4;47509:2;47513:7;47493:9;:28::i;:::-;47224:305;;;:::o;73343:79::-;57989:12;:10;:12::i;:::-;57978:23;;:7;:5;:7::i;:::-;:23;;;57970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73409:5:::1;73392:14;;:22;;;;;;;;;;;;;;;;;;73343:79::o:0;66523:72::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45104:162::-;45201:7;45228:30;45252:5;45228:13;:20;45242:5;45228:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;45221:37;;45104:162;;;;:::o;73253:78::-;57989:12;:10;:12::i;:::-;57978:23;;:7;:5;:7::i;:::-;:23;;;57970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73319:4:::1;73302:14;;:21;;;;;;;;;;;;;;;;;;73253:78::o:0;47600:151::-;47704:39;47721:4;47727:2;47731:7;47704:39;;;;;;;;;;;;:16;:39::i;:::-;47600:151;;;:::o;45630:172::-;45705:7;45726:15;45747:22;45763:5;45747:12;:15;;:22;;;;:::i;:::-;45725:44;;;45787:7;45780:14;;;45630:172;;;:::o;73142:99::-;57989:12;:10;:12::i;:::-;57978:23;;:7;:5;:7::i;:::-;:23;;;57970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73213:20:::1;73225:7;73213:11;:20::i;:::-;73142:99:::0;:::o;43304:177::-;43376:7;43403:70;43420:7;43403:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;43396:77;;43304:177;;;:::o;73828:222::-;73892:13;73926:16;73934:7;73926;:16::i;:::-;73918:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;74003:17;74022:18;:7;:16;:18::i;:::-;73986:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73972:70;;73828:222;;;:::o;44923:97::-;44971:13;45004:8;44997:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44923:97;:::o;42994:221::-;43066:7;43111:1;43094:19;;:5;:19;;;;43086:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43178:29;:13;:20;43192:5;43178:20;;;;;;;;;;;;;;;:27;:29::i;:::-;43171:36;;42994:221;;;:::o;58409:148::-;57989:12;:10;:12::i;:::-;57978:23;;:7;:5;:7::i;:::-;:23;;;57970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58516:1:::1;58479:40;;58500:6;;;;;;;;;;;58479:40;;;;;;;;;;;;58547:1;58530:6;;:19;;;;;;;;;;;;;;;;;;58409:148::o:0;66602:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71497:540::-;71558:16;71588:18;71609:17;71619:6;71609:9;:17::i;:::-;71588:38;;71655:1;71641:10;:15;71637:393;;;71732:1;71718:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71711:23;;;;;71637:393;71767:23;71807:10;71793:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71767:51;;71833:13;71861:130;71885:10;71877:5;:18;71861:130;;;71941:34;71961:6;71969:5;71941:19;:34::i;:::-;71925:6;71932:5;71925:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;71897:7;;;;;:::i;:::-;;;;71861:130;;;72012:6;72005:13;;;;;71497:540;;;;:::o;73434:123::-;57989:12;:10;:12::i;:::-;57978:23;;:7;:5;:7::i;:::-;:23;;;57970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73509:10:::1;73501:24;;:47;73526:21;73501:47;;;;;;;;;;;;;;;;;;;;;;;73493:56;;;::::0;::::1;;73434:123::o:0;73013:117::-;57989:12;:10;:12::i;:::-;57978:23;;:7;:5;:7::i;:::-;:23;;;57970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73117:5:::1;73092:22;:30;;;;;;;;;;;;:::i;:::-;;73013:117:::0;:::o;57758:87::-;57804:7;57831:6;;;;;;;;;;;57824:13;;57758:87;:::o;43717:104::-;43773:13;43806:7;43799:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43717:104;:::o;74119:231::-;74187:13;74221:16;74229:7;74221;:16::i;:::-;74213:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;74298:22;74322:18;:7;:16;:18::i;:::-;74281:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74267:75;;74119:231;;;:::o;46627:295::-;46742:12;:10;:12::i;:::-;46730:24;;:8;:24;;;;46722:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46842:8;46797:18;:32;46816:12;:10;:12::i;:::-;46797:32;;;;;;;;;;;;;;;:42;46830:8;46797:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46895:8;46866:48;;46881:12;:10;:12::i;:::-;46866:48;;;46905:8;46866:48;;;;;;:::i;:::-;;;;;;;;46627:295;;:::o;73569:247::-;73625:7;73652:16;73660:7;73652;:16::i;:::-;73644:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;73748:4;73755:13;:22;73769:7;73755:22;;;;;;;;;;;;73779:8;:17;73788:7;73779:17;;;;;;;;;;;;;;;;;;;;;73798:7;73723:83;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73713:94;;;;;;73698:110;;73569:247;;;:::o;47822:285::-;47954:41;47973:12;:10;:12::i;:::-;47987:7;47954:18;:41::i;:::-;47946:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;48060:39;48074:4;48080:2;48084:7;48093:5;48060:13;:39::i;:::-;47822:285;;;;:::o;72159:680::-;66314:4;72231:13;:11;:13::i;:::-;:26;72223:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;72315:1;72303:9;:13;:32;;;;;72333:2;72320:9;:15;;72303:32;72295:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;66314:4;72401:28;72419:9;72401:13;:11;:13::i;:::-;:17;;:28;;;;:::i;:::-;:42;;72393:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;72498:31;72519:9;72498:16;:14;:16::i;:::-;:20;;:31;;;;:::i;:::-;72485:9;:44;;72477:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;72595:6;72590:242;72611:9;72607:1;:13;72590:242;;;72642:14;72659:13;:11;:13::i;:::-;72642:30;;72687:32;72697:10;72709:9;72687;:32::i;:::-;72761:12;72734:13;:24;72748:9;72734:24;;;;;;;;;;;:39;;;;72810:10;72788:8;:19;72797:9;72788:19;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;72590:242;72622:3;;;;;:::i;:::-;;;;72590:242;;;;72159:680;:::o;43892:792::-;43965:13;43999:16;44007:7;43999;:16::i;:::-;43991:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44080:23;44106:10;:19;44117:7;44106:19;;;;;;;;;;;44080:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44136:18;44157:9;:7;:9::i;:::-;44136:30;;44264:1;44248:4;44242:18;:23;44238:72;;;44289:9;44282:16;;;;;;44238:72;44440:1;44420:9;44414:23;:27;44410:108;;;44489:4;44495:9;44472:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44458:48;;;;;;44410:108;44650:4;44656:18;:7;:16;:18::i;:::-;44633:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44619:57;;;;43892:792;;;;:::o;66366:49::-;;;;;;;;;;;;;;;;;:::o;66422:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;72049:99::-;72096:7;72123:17;72116:24;;72049:99;:::o;46993:164::-;47090:4;47114:18;:25;47133:5;47114:25;;;;;;;;;;;;;;;:35;47140:8;47114:35;;;;;;;;;;;;;;;;;;;;;;;;;47107:42;;46993:164;;;;:::o;66650:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66473:43::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58712:244::-;57989:12;:10;:12::i;:::-;57978:23;;:7;:5;:7::i;:::-;:23;;;57970:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58821:1:::1;58801:22;;:8;:22;;;;58793:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58911:8;58882:38;;58903:6;;;;;;;;;;;58882:38;;;;;;;;;;;;58940:8;58931:6;;:17;;;;;;;;;;;;;;;;;;58712:244:::0;:::o;66280:38::-;66314:4;66280:38;:::o;20646:131::-;20713:4;20737:32;20742:3;:10;;20762:5;20754:14;;20737:4;:32::i;:::-;20730:39;;20646:131;;;;:::o;9476:185::-;9565:4;9589:64;9594:3;:10;;9614:3;9606:12;;9644:5;9628:23;;9620:32;;9589:4;:64::i;:::-;9582:71;;9476:185;;;;;:::o;22818:422::-;22878:4;23086:12;23197:7;23185:20;23177:28;;23231:1;23224:4;:8;23217:15;;;22818:422;;;:::o;10053:151::-;10137:4;10161:35;10171:3;:10;;10191:3;10183:12;;10161:9;:35::i;:::-;10154:42;;10053:151;;;;:::o;49574:127::-;49639:4;49663:30;49685:7;49663:12;:21;;:30;;;;:::i;:::-;49656:37;;49574:127;;;:::o;40766:98::-;40819:7;40846:10;40839:17;;40766:98;:::o;55718:183::-;55811:2;55784:15;:24;55800:7;55784:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55867:7;55863:2;55829:46;;55838:23;55853:7;55838:14;:23::i;:::-;55829:46;;;;;;;;;;;;55718:183;;:::o;10292:123::-;10361:7;10388:19;10396:3;:10;;10388:7;:19::i;:::-;10381:26;;10292:123;;;:::o;49868:355::-;49961:4;49986:16;49994:7;49986;:16::i;:::-;49978:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50062:13;50078:23;50093:7;50078:14;:23::i;:::-;50062:39;;50131:5;50120:16;;:7;:16;;;:51;;;;50164:7;50140:31;;:20;50152:7;50140:11;:20::i;:::-;:31;;;50120:51;:94;;;;50175:39;50199:5;50206:7;50175:23;:39::i;:::-;50120:94;50112:103;;;49868:355;;;;:::o;53004:597::-;53129:4;53102:31;;:23;53117:7;53102:14;:23::i;:::-;:31;;;53094:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;53230:1;53216:16;;:2;:16;;;;53208:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53286:39;53307:4;53313:2;53317:7;53286:20;:39::i;:::-;53390:29;53407:1;53411:7;53390:8;:29::i;:::-;53432:35;53459:7;53432:13;:19;53446:4;53432:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;53478:30;53500:7;53478:13;:17;53492:2;53478:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;53521:29;53538:7;53547:2;53521:12;:16;;:29;;;;;:::i;:::-;;53585:7;53581:2;53566:27;;53575:4;53566:27;;;;;;;;;;;;53004:597;;;:::o;21866:137::-;21937:7;21972:22;21976:3;:10;;21988:5;21972:3;:22::i;:::-;21964:31;;21957:38;;21866:137;;;;:::o;10754:236::-;10834:7;10843;10864:11;10877:13;10894:22;10898:3;:10;;10910:5;10894:3;:22::i;:::-;10863:53;;;;10943:3;10935:12;;10973:5;10965:14;;10927:55;;;;;;10754:236;;;;;:::o;54202:100::-;54286:8;54275;:19;;;;;;;;;;;;:::i;:::-;;54202:100;:::o;12040:213::-;12147:7;12198:44;12203:3;:10;;12223:3;12215:12;;12229;12198:4;:44::i;:::-;12190:53;;12167:78;;12040:213;;;;;:::o;436:723::-;492:13;722:1;713:5;:10;709:53;;;740:10;;;;;;;;;;;;;;;;;;;;;709:53;772:12;787:5;772:20;;803:14;828:78;843:1;835:4;:9;828:78;;861:8;;;;;:::i;:::-;;;;892:2;884:10;;;;;:::i;:::-;;;828:78;;;916:19;948:6;938:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;916:39;;966:154;982:1;973:5;:10;966:154;;1010:1;1000:11;;;;;:::i;:::-;;;1077:2;1069:5;:10;;;;:::i;:::-;1056:2;:24;;;;:::i;:::-;1043:39;;1026:6;1033;1026:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1106:2;1097:11;;;;;:::i;:::-;;;966:154;;;1144:6;1130:21;;;;;436:723;;;;:::o;21408:114::-;21468:7;21495:19;21503:3;:10;;21495:7;:19::i;:::-;21488:26;;21408:114;;;:::o;48989:272::-;49103:28;49113:4;49119:2;49123:7;49103:9;:28::i;:::-;49150:48;49173:4;49179:2;49183:7;49192:5;49150:22;:48::i;:::-;49142:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;48989:272;;;;:::o;61798:98::-;61856:7;61887:1;61883;:5;;;;:::i;:::-;61876:12;;61798:98;;;;:::o;62536:::-;62594:7;62625:1;62621;:5;;;;:::i;:::-;62614:12;;62536:98;;;;:::o;50566:110::-;50642:26;50652:2;50656:7;50642:26;;;;;;;;;;;;:9;:26::i;:::-;50566:110;;:::o;14016:414::-;14079:4;14101:21;14111:3;14116:5;14101:9;:21::i;:::-;14096:327;;14139:3;:11;;14156:5;14139:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14322:3;:11;;:18;;;;14300:3;:12;;:19;14313:5;14300:19;;;;;;;;;;;:40;;;;14362:4;14355:11;;;;14096:327;14406:5;14399:12;;14016:414;;;;;:::o;4151:692::-;4227:4;4343:16;4362:3;:12;;:17;4375:3;4362:17;;;;;;;;;;;;4343:36;;4408:1;4396:8;:13;4392:444;;;4463:3;:12;;4481:38;;;;;;;;4498:3;4481:38;;;;4511:5;4481:38;;;4463:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4678:3;:12;;:19;;;;4658:3;:12;;:17;4671:3;4658:17;;;;;;;;;;;:39;;;;4719:4;4712:11;;;;;4392:444;4792:5;4756:3;:12;;4780:1;4769:8;:12;;;;:::i;:::-;4756:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:41;;;;4819:5;4812:12;;;4151:692;;;;;;:::o;6651:125::-;6722:4;6767:1;6746:3;:12;;:17;6759:3;6746:17;;;;;;;;;;;;:22;;6739:29;;6651:125;;;;:::o;6871:110::-;6927:7;6954:3;:12;;:19;;;;6947:26;;6871:110;;;:::o;56514:93::-;;;;:::o;20953:137::-;21023:4;21047:35;21055:3;:10;;21075:5;21067:14;;21047:7;:35::i;:::-;21040:42;;20953:137;;;;:::o;16904:204::-;16971:7;17020:5;16999:3;:11;;:18;;;;:26;16991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17082:3;:11;;17094:5;17082:18;;;;;;;;;;;;;;;;;;;;;;;;17075:25;;16904:204;;;;:::o;7336:279::-;7403:7;7412;7462:5;7440:3;:12;;:19;;;;:27;7432:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7519:22;7544:3;:12;;7557:5;7544:19;;;;;;;;;;;;;;;;;;;;;;;;;;7519:44;;7582:5;:10;;;7594:5;:12;;;7574:33;;;;;7336:279;;;;;:::o;8833:319::-;8927:7;8947:16;8966:3;:12;;:17;8979:3;8966:17;;;;;;;;;;;;8947:36;;9014:1;9002:8;:13;;9017:12;8994:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;9084:3;:12;;9108:1;9097:8;:12;;;;:::i;:::-;9084:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;9077:40;;;8833:319;;;;;:::o;16451:109::-;16507:7;16534:3;:11;;:18;;;;16527:25;;16451:109;;;:::o;54867:843::-;54988:4;55014:15;:2;:13;;;:15::i;:::-;55010:693;;;55066:2;55050:36;;;55087:12;:10;:12::i;:::-;55101:4;55107:7;55116:5;55050:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55046:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55313:1;55296:6;:13;:18;55292:341;;;55339:60;;;;;;;;;;:::i;:::-;;;;;;;;55292:341;55583:6;55577:13;55568:6;55564:2;55560:15;55553:38;55046:602;55183:45;;;55173:55;;;:6;:55;;;;55166:62;;;;;55010:693;55687:4;55680:11;;54867:843;;;;;;;:::o;50903:250::-;50999:18;51005:2;51009:7;50999:5;:18::i;:::-;51036:54;51067:1;51071:2;51075:7;51084:5;51036:22;:54::i;:::-;51028:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;50903:250;;;:::o;16236:129::-;16309:4;16356:1;16333:3;:12;;:19;16346:5;16333:19;;;;;;;;;;;;:24;;16326:31;;16236:129;;;;:::o;14606:1544::-;14672:4;14790:18;14811:3;:12;;:19;14824:5;14811:19;;;;;;;;;;;;14790:40;;14861:1;14847:10;:15;14843:1300;;15209:21;15246:1;15233:10;:14;;;;:::i;:::-;15209:38;;15262:17;15303:1;15282:3;:11;;:18;;;;:22;;;;:::i;:::-;15262:42;;15549:17;15569:3;:11;;15581:9;15569:22;;;;;;;;;;;;;;;;;;;;;;;;15549:42;;15715:9;15686:3;:11;;15698:13;15686:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;15834:1;15818:13;:17;;;;:::i;:::-;15792:3;:12;;:23;15805:9;15792:23;;;;;;;;;;;:43;;;;15944:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16039:3;:12;;:19;16052:5;16039:19;;;;;;;;;;;16032:26;;;16082:4;16075:11;;;;;;;;14843:1300;16126:5;16119:12;;;14606:1544;;;;;:::o;51489:404::-;51583:1;51569:16;;:2;:16;;;;51561:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51642:16;51650:7;51642;:16::i;:::-;51641:17;51633:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51704:45;51733:1;51737:2;51741:7;51704:20;:45::i;:::-;51762:30;51784:7;51762:13;:17;51776:2;51762:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;51805:29;51822:7;51831:2;51805:12;:16;;:29;;;;;:::i;:::-;;51877:7;51873:2;51852:33;;51869:1;51852:33;;;;;;;;;;;;51489: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:231::-;39457:34;39453:1;39445:6;39441:14;39434:58;39526:14;39521:2;39513:6;39509:15;39502:39;39423:125;:::o;39554:243::-;39694:34;39690:1;39682:6;39678:14;39671:58;39763:26;39758:2;39750:6;39746:15;39739:51;39660:137;:::o;39803:229::-;39943:34;39939:1;39931:6;39927:14;39920:58;40012:12;40007:2;39999:6;39995:15;39988:37;39909:123;:::o;40038:222::-;40178:34;40174:1;40166:6;40162:14;40155:58;40247:5;40242:2;40234:6;40230:15;40223:30;40144:116;:::o;40266:221::-;40406:34;40402:1;40394:6;40390:14;40383:58;40475:4;40470:2;40462:6;40458:15;40451:29;40372:115;:::o;40493:182::-;40633:34;40629:1;40621:6;40617:14;40610:58;40599:76;:::o;40681:231::-;40821:34;40817:1;40809:6;40805:14;40798:58;40890:14;40885:2;40877:6;40873:15;40866:39;40787:125;:::o;40918:182::-;41058:34;41054:1;41046:6;41042:14;41035:58;41024:76;:::o;41106:228::-;41246:34;41242:1;41234:6;41230:14;41223:58;41315:11;41310:2;41302:6;41298:15;41291:36;41212:122;:::o;41340:234::-;41480:34;41476:1;41468:6;41464:14;41457:58;41549:17;41544:2;41536:6;41532:15;41525:42;41446:128;:::o;41580:220::-;41720:34;41716:1;41708:6;41704:14;41697:58;41789:3;41784:2;41776:6;41772:15;41765:28;41686:114;:::o;41806:172::-;41946:24;41942:1;41934:6;41930:14;41923:48;41912:66;:::o;41984:229::-;42124:34;42120:1;42112:6;42108:14;42101:58;42193:12;42188:2;42180:6;42176:15;42169:37;42090:123;:::o;42219:236::-;42359:34;42355:1;42347:6;42343:14;42336:58;42428:19;42423:2;42415:6;42411:15;42404:44;42325:130;:::o;42461:164::-;42601:16;42597:1;42589:6;42585:14;42578:40;42567:58;:::o;42631:168::-;42771:20;42767:1;42759:6;42755:14;42748:44;42737:62;:::o;42805:122::-;42878:24;42896:5;42878:24;:::i;:::-;42871:5;42868:35;42858:2;;42917:1;42914;42907:12;42858:2;42848:79;:::o;42933:116::-;43003:21;43018:5;43003:21;:::i;:::-;42996:5;42993:32;42983:2;;43039:1;43036;43029:12;42983:2;42973:76;:::o;43055:120::-;43127:23;43144:5;43127:23;:::i;:::-;43120:5;43117:34;43107:2;;43165:1;43162;43155:12;43107:2;43097:78;:::o;43181:122::-;43254:24;43272:5;43254:24;:::i;:::-;43247:5;43244:35;43234:2;;43293:1;43290;43283:12;43234:2;43224:79;:::o

Swarm Source

ipfs://575df3c2471571c8b92d192a0ddddd06549a627768dc33736a80641c90023f4f
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.