ETH Price: $3,374.24 (-1.38%)

Token

WavesOnChain (WOC)
 

Overview

Max Total Supply

1,024 WOC

Holders

406

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WOC
0xcbfc78d7e26c2ff131867ed74fa65572dad6fc90
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Waves on chain is the first collection that launched on https://chromorphs.xyz/woc

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WavesOnChain

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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: MIT

contract WavesOnChain is ERC721, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    uint public constant MAX_WAVES = 1024;
    uint256 public constant WAVES_PRICE = 10000000000000000; // 0.01 ETH
    uint public constant DEVELOPER_SHARE = 45;
    uint public constant ARTIST_SHARE = 45;
    uint public constant ADVISOR_SHARE = 10;
    uint public constant SHARE_SUM = 100;
    address public developerAddress = 0xf049ED4da9E12c6E2a0928fA6c975eBb60C872F3;
    address public artistAddress = 0xb7275Da969bCa3112D1fDBa03385eD2C02002642;
    address public constant ADVISOR_ADDRESS = 0x0b8F4C4E7626A91460dac057eB43e0de59d5b44F;
    string public script;
    string public scriptType = "p5js";
    bool public saleStarted = false;
    mapping (uint256 => uint256) public creationDates;

    constructor() ERC721("WavesOnChain","WOC")  {
        setBaseURI("https://api.chromorphs.xyz/woc/json/");
    }
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            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 mint(uint256 wavesNumber) public payable {
        require(saleStarted, "Sale has not started yet");
        require(totalSupply() < MAX_WAVES, "Sale has already ended");
        require(wavesNumber > 0 && wavesNumber <= 20, "Waves number must be between 1 and 20");
        require(totalSupply().add(wavesNumber) <= MAX_WAVES, "Exceeds MAX_WAVES");
        require(msg.value >= WAVES_PRICE.mul(wavesNumber), "Ether value sent is below the price");

        for (uint i = 0; i < wavesNumber; i++) {
            uint mintIndex = totalSupply();
            _safeMint(msg.sender, mintIndex);
            creationDates[mintIndex] = block.number;
        }
    }
    
   function reserve(uint256 wavesNumber, address toAddress) public onlyOwner {
        require(totalSupply() < MAX_WAVES, "There are no waves left");
        require(totalSupply().add(wavesNumber) <= MAX_WAVES, "Exceeds MAX_WAVES");

        for (uint i = 0; i < wavesNumber; i++) {
            uint mintIndex = totalSupply();
            _safeMint(toAddress, mintIndex);
            creationDates[mintIndex] = block.number;
        }
    }
    
    function setScript(string memory _script) public onlyOwner {
        script = _script;
    }
    
    function setScriptType(string memory _scriptType) public onlyOwner {
        script = _scriptType;
    }
    
    function setDeveloperAddress(address _developerAddress) public onlyOwner {
        developerAddress = _developerAddress;
    }
    
    function setArtistAddress(address _artistAddress) public onlyOwner {
        artistAddress = _artistAddress;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }
    
    function flipSaleState() public onlyOwner {
        saleStarted = !saleStarted;
    }
    
    function tokenHash(uint256 tokenId) public view returns(bytes32){
        require(_exists(tokenId), "DOES NOT EXIST");
        return bytes32(keccak256(abi.encodePacked(address(this), creationDates[tokenId], tokenId)));
    }
    
    function withdraw() public payable onlyOwner {
        uint256 balance = address(this).balance;
        uint toDeveloper = balance.mul(DEVELOPER_SHARE).div(SHARE_SUM);
        uint toArtist = balance.mul(ARTIST_SHARE).div(SHARE_SUM);
        uint toAdvisor = balance.mul(ADVISOR_SHARE).div(SHARE_SUM);
        payable(developerAddress).transfer(toDeveloper);
        payable(artistAddress).transfer(toArtist);
        payable(ADVISOR_ADDRESS).transfer(toAdvisor);
        assert(address(this).balance == 0);
    }
}

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":"ADVISOR_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADVISOR_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ARTIST_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPER_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WAVES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_SUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WAVES_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creationDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"wavesNumber","type":"uint256"}],"name":"mint","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wavesNumber","type":"uint256"},{"internalType":"address","name":"toAddress","type":"address"}],"name":"reserve","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":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"script","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scriptType","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":"address","name":"_artistAddress","type":"address"}],"name":"setArtistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developerAddress","type":"address"}],"name":"setDeveloperAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_script","type":"string"}],"name":"setScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_scriptType","type":"string"}],"name":"setScriptType","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":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405273f049ed4da9e12c6e2a0928fa6c975ebb60c872f3600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b7275da969bca3112d1fdba03385ed2c02002642600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600481526020017f70356a7300000000000000000000000000000000000000000000000000000000815250600e9080519060200190620000fb92919062000533565b506000600f60006101000a81548160ff0219169083151502179055503480156200012457600080fd5b506040518060400160405280600c81526020017f57617665734f6e436861696e00000000000000000000000000000000000000008152506040518060400160405280600381526020017f574f430000000000000000000000000000000000000000000000000000000000815250620001c27f01ffc9a7000000000000000000000000000000000000000000000000000000006200036a60201b60201c565b8160069080519060200190620001da92919062000533565b508060079080519060200190620001f392919062000533565b50620002257f80ac58cd000000000000000000000000000000000000000000000000000000006200036a60201b60201c565b620002567f5b5e139f000000000000000000000000000000000000000000000000000000006200036a60201b60201c565b620002877f780e9d63000000000000000000000000000000000000000000000000000000006200036a60201b60201c565b505060006200029b6200044260201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620003646040518060600160405280602481526020016200541c602491396200044a60201b60201c565b62000721565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620003d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003cd9062000667565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6200045a6200044260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000480620004ed60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004d9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004d09062000689565b60405180910390fd5b620004ea816200051760201b60201c565b50565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600990805190602001906200052f92919062000533565b5050565b8280546200054190620006bc565b90600052602060002090601f016020900481019282620005655760008555620005b1565b82601f106200058057805160ff1916838001178555620005b1565b82800160010185558215620005b1579182015b82811115620005b057825182559160200191906001019062000593565b5b509050620005c09190620005c4565b5090565b5b80821115620005df576000816000905550600101620005c5565b5090565b6000620005f2601c83620006ab565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600062000634602083620006ab565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600060208201905081810360008301526200068281620005e3565b9050919050565b60006020820190508181036000830152620006a48162000625565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620006d557607f821691505b60208210811415620006ec57620006eb620006f2565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614ceb80620007316000396000f3fe6080604052600436106102675760003560e01c806378a4ab8511610144578063c623c543116100b6578063dcc345f21161007a578063dcc345f214610916578063e406a6b91461093f578063e985e9c51461096a578063ebe9eb9f146109a7578063f069062a146109d2578063f2fde38b146109fd57610267565b8063c623c5431461081b578063c87b56dd14610846578063c8a0122614610883578063caccd7f7146108c0578063d7eb3f3a146108eb57610267565b806395d89b411161010857806395d89b411461071c578063a0712d6814610747578063a22cb46514610763578063a22e4faa1461078c578063a3864397146107b5578063b88d4fde146107f257610267565b806378a4ab85146106355780638462151c1461065e5780638da5cb5b1461069b578063925fbd6a146106c657806394bc2ae7146106f157610267565b806342842e0e116101dd5780635d69dbdd116101a15780635d69dbdd1461052357806362aee5441461054e5780636352211e146105795780636c0360eb146105b657806370a08231146105e1578063715018a61461061e57610267565b806342842e0e1461043e5780634f6ccce71461046757806355f804b3146104a457806356d01e7b146104cd5780635c474f9e146104f857610267565b8063171ce0941161022f578063171ce0941461036357806318160ddd1461038c57806323b872dd146103b75780632f745c59146103e057806334918dfd1461041d5780633ccfd60b1461043457610267565b806301ffc9a71461026c57806303339bcb146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613879565b610a26565b6040516102a09190614427565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613935565b610a8d565b005b3480156102de57600080fd5b506102e7610c04565b6040516102f4919061445d565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f919061390c565b610c96565b604051610331919061439e565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c919061383d565b610d1b565b005b34801561036f57600080fd5b5061038a600480360381019061038591906138cb565b610e33565b005b34801561039857600080fd5b506103a1610ec9565b6040516103ae919061477f565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190613737565b610eda565b005b3480156103ec57600080fd5b506104076004803603810190610402919061383d565b610f3a565b604051610414919061477f565b60405180910390f35b34801561042957600080fd5b50610432610f95565b005b61043c61103d565b005b34801561044a57600080fd5b5061046560048036038101906104609190613737565b6112a9565b005b34801561047357600080fd5b5061048e6004803603810190610489919061390c565b6112c9565b60405161049b919061477f565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c691906138cb565b6112ec565b005b3480156104d957600080fd5b506104e2611374565b6040516104ef919061477f565b60405180910390f35b34801561050457600080fd5b5061050d61137a565b60405161051a9190614427565b60405180910390f35b34801561052f57600080fd5b5061053861138d565b604051610545919061445d565b60405180910390f35b34801561055a57600080fd5b5061056361141b565b604051610570919061477f565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b919061390c565b611420565b6040516105ad919061439e565b60405180910390f35b3480156105c257600080fd5b506105cb611457565b6040516105d8919061445d565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906136d2565b6114e9565b604051610615919061477f565b60405180910390f35b34801561062a57600080fd5b506106336115a8565b005b34801561064157600080fd5b5061065c600480360381019061065791906138cb565b6116e5565b005b34801561066a57600080fd5b50610685600480360381019061068091906136d2565b61177b565b6040516106929190614405565b60405180910390f35b3480156106a757600080fd5b506106b06118f7565b6040516106bd919061439e565b60405180910390f35b3480156106d257600080fd5b506106db611921565b6040516106e8919061477f565b60405180910390f35b3480156106fd57600080fd5b5061070661192c565b604051610713919061477f565b60405180910390f35b34801561072857600080fd5b50610731611931565b60405161073e919061445d565b60405180910390f35b610761600480360381019061075c919061390c565b6119c3565b005b34801561076f57600080fd5b5061078a60048036038101906107859190613801565b611bb8565b005b34801561079857600080fd5b506107b360048036038101906107ae91906136d2565b611d39565b005b3480156107c157600080fd5b506107dc60048036038101906107d7919061390c565b611df9565b6040516107e99190614442565b60405180910390f35b3480156107fe57600080fd5b5061081960048036038101906108149190613786565b611e88565b005b34801561082757600080fd5b50610830611eea565b60405161083d919061477f565b60405180910390f35b34801561085257600080fd5b5061086d6004803603810190610868919061390c565b611eef565b60405161087a919061445d565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a5919061390c565b612062565b6040516108b7919061477f565b60405180910390f35b3480156108cc57600080fd5b506108d561207a565b6040516108e2919061439e565b60405180910390f35b3480156108f757600080fd5b506109006120a0565b60405161090d919061439e565b60405180910390f35b34801561092257600080fd5b5061093d600480360381019061093891906136d2565b6120c6565b005b34801561094b57600080fd5b50610954612186565b604051610961919061477f565b60405180910390f35b34801561097657600080fd5b50610991600480360381019061098c91906136fb565b61218b565b60405161099e9190614427565b60405180910390f35b3480156109b357600080fd5b506109bc61221f565b6040516109c9919061445d565b60405180910390f35b3480156109de57600080fd5b506109e76122ad565b6040516109f4919061439e565b60405180910390f35b348015610a0957600080fd5b50610a246004803603810190610a1f91906136d2565b6122c5565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b610a95612471565b73ffffffffffffffffffffffffffffffffffffffff16610ab36118f7565b73ffffffffffffffffffffffffffffffffffffffff1614610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b009061467f565b60405180910390fd5b610400610b14610ec9565b10610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b9061455f565b60405180910390fd5b610400610b7183610b63610ec9565b61247990919063ffffffff16565b1115610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba99061475f565b60405180910390fd5b60005b82811015610bff576000610bc7610ec9565b9050610bd3838261248f565b436010600083815260200190815260200160002081905550508080610bf790614aae565b915050610bb5565b505050565b606060068054610c1390614a7c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f90614a7c565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b5050505050905090565b6000610ca1826124ad565b610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd79061465f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2682611420565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e906146df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db6612471565b73ffffffffffffffffffffffffffffffffffffffff161480610de55750610de481610ddf612471565b61218b565b5b610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b9061459f565b60405180910390fd5b610e2e83836124ca565b505050565b610e3b612471565b73ffffffffffffffffffffffffffffffffffffffff16610e596118f7565b73ffffffffffffffffffffffffffffffffffffffff1614610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea69061467f565b60405180910390fd5b80600d9080519060200190610ec59291906134f6565b5050565b6000610ed56002612583565b905090565b610eeb610ee5612471565b82612598565b610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f219061471f565b60405180910390fd5b610f35838383612676565b505050565b6000610f8d82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061288d90919063ffffffff16565b905092915050565b610f9d612471565b73ffffffffffffffffffffffffffffffffffffffff16610fbb6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110089061467f565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b611045612471565b73ffffffffffffffffffffffffffffffffffffffff166110636118f7565b73ffffffffffffffffffffffffffffffffffffffff16146110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b09061467f565b60405180910390fd5b600047905060006110e760646110d9602d856128a790919063ffffffff16565b6128bd90919063ffffffff16565b905060006111126064611104602d866128a790919063ffffffff16565b6128bd90919063ffffffff16565b9050600061113d606461112f600a876128a790919063ffffffff16565b6128bd90919063ffffffff16565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156111a7573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611210573d6000803e3d6000fd5b50730b8f4c4e7626a91460dac057eb43e0de59d5b44f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561126b573d6000803e3d6000fd5b50600047146112a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b50505050565b6112c483838360405180602001604052806000815250611e88565b505050565b6000806112e08360026128d390919063ffffffff16565b50905080915050919050565b6112f4612471565b73ffffffffffffffffffffffffffffffffffffffff166113126118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f9061467f565b60405180910390fd5b611371816128ff565b50565b61040081565b600f60009054906101000a900460ff1681565b600e805461139a90614a7c565b80601f01602080910402602001604051908101604052809291908181526020018280546113c690614a7c565b80156114135780601f106113e857610100808354040283529160200191611413565b820191906000526020600020905b8154815290600101906020018083116113f657829003601f168201915b505050505081565b600a81565b600061145082604051806060016040528060298152602001614c8d6029913960026129199092919063ffffffff16565b9050919050565b60606009805461146690614a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461149290614a7c565b80156114df5780601f106114b4576101008083540402835291602001916114df565b820191906000526020600020905b8154815290600101906020018083116114c257829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611551906145bf565b60405180910390fd5b6115a1600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612938565b9050919050565b6115b0612471565b73ffffffffffffffffffffffffffffffffffffffff166115ce6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b9061467f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116ed612471565b73ffffffffffffffffffffffffffffffffffffffff1661170b6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611761576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117589061467f565b60405180910390fd5b80600d90805190602001906117779291906134f6565b5050565b60606000611788836114e9565b9050600081141561180b57600067ffffffffffffffff8111156117d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156118025781602001602082028036833780820191505090505b509150506118f2565b60008167ffffffffffffffff81111561184d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561187b5781602001602082028036833780820191505090505b50905060005b828110156118eb576118938582610f3a565b8282815181106118cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806118e390614aae565b915050611881565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b662386f26fc1000081565b606481565b60606007805461194090614a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461196c90614a7c565b80156119b95780601f1061198e576101008083540402835291602001916119b9565b820191906000526020600020905b81548152906001019060200180831161199c57829003601f168201915b5050505050905090565b600f60009054906101000a900460ff16611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a099061449f565b60405180910390fd5b610400611a1d610ec9565b10611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a54906146ff565b60405180910390fd5b600081118015611a6e575060148111155b611aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa4906145df565b60405180910390fd5b610400611aca82611abc610ec9565b61247990919063ffffffff16565b1115611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b029061475f565b60405180910390fd5b611b2581662386f26fc100006128a790919063ffffffff16565b341015611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e906145ff565b60405180910390fd5b60005b81811015611bb4576000611b7c610ec9565b9050611b88338261248f565b436010600083815260200190815260200160002081905550508080611bac90614aae565b915050611b6a565b5050565b611bc0612471565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c259061453f565b60405180910390fd5b8060056000611c3b612471565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ce8612471565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d2d9190614427565b60405180910390a35050565b611d41612471565b73ffffffffffffffffffffffffffffffffffffffff16611d5f6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac9061467f565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611e04826124ad565b611e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3a9061473f565b60405180910390fd5b30601060008481526020019081526020016000205483604051602001611e6b9392919061433d565b604051602081830303815290604052805190602001209050919050565b611e99611e93612471565b83612598565b611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf9061471f565b60405180910390fd5b611ee48484848461294d565b50505050565b602d81565b6060611efa826124ad565b611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f30906146bf565b60405180910390fd5b6000600860008481526020019081526020016000208054611f5990614a7c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8590614a7c565b8015611fd25780601f10611fa757610100808354040283529160200191611fd2565b820191906000526020600020905b815481529060010190602001808311611fb557829003601f168201915b505050505090506000611fe3611457565b9050600081511415611ff957819250505061205d565b60008251111561202e57808260405160200161201692919061437a565b6040516020818303038152906040529250505061205d565b80612038856129a9565b60405160200161204992919061437a565b604051602081830303815290604052925050505b919050565b60106020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120ce612471565b73ffffffffffffffffffffffffffffffffffffffff166120ec6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614612142576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121399061467f565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602d81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d805461222c90614a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461225890614a7c565b80156122a55780601f1061227a576101008083540402835291602001916122a5565b820191906000526020600020905b81548152906001019060200180831161228857829003601f168201915b505050505081565b730b8f4c4e7626a91460dac057eb43e0de59d5b44f81565b6122cd612471565b73ffffffffffffffffffffffffffffffffffffffff166122eb6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614612341576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123389061467f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a8906144df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000818361248791906148a7565b905092915050565b6124a9828260405180602001604052806000815250612b56565b5050565b60006124c3826002612bb190919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661253d83611420565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061259182600001612bcb565b9050919050565b60006125a3826124ad565b6125e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d99061457f565b60405180910390fd5b60006125ed83611420565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265c57508373ffffffffffffffffffffffffffffffffffffffff1661264484610c96565b73ffffffffffffffffffffffffffffffffffffffff16145b8061266d575061266c818561218b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661269682611420565b73ffffffffffffffffffffffffffffffffffffffff16146126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e39061469f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127539061451f565b60405180910390fd5b612767838383612bdc565b6127726000826124ca565b6127c381600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612be190919063ffffffff16565b5061281581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfb90919063ffffffff16565b5061282c81836002612c159092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061289c8360000183612c4a565b60001c905092915050565b600081836128b5919061492e565b905092915050565b600081836128cb91906148fd565b905092915050565b6000806000806128e68660000186612ce4565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906129159291906134f6565b5050565b600061292c846000018460001b84612d94565b60001c90509392505050565b600061294682600001612e5b565b9050919050565b612958848484612676565b61296484848484612e6c565b6129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a906144bf565b60405180910390fd5b50505050565b606060008214156129f1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b51565b600082905060005b60008214612a23578080612a0c90614aae565b915050600a82612a1c91906148fd565b91506129f9565b60008167ffffffffffffffff811115612a65577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a975781602001600182028036833780820191505090505b5090505b60008514612b4a57600182612ab09190614988565b9150600a85612abf9190614b25565b6030612acb91906148a7565b60f81b818381518110612b07577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b4391906148fd565b9450612a9b565b8093505050505b919050565b612b608383613003565b612b6d6000848484612e6c565b612bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba3906144bf565b60405180910390fd5b505050565b6000612bc3836000018360001b613191565b905092915050565b600081600001805490509050919050565b505050565b6000612bf3836000018360001b6131b4565b905092915050565b6000612c0d836000018360001b61333e565b905092915050565b6000612c41846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6133ae565b90509392505050565b600081836000018054905011612c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8c9061447f565b60405180910390fd5b826000018281548110612cd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d279061461f565b60405180910390fd5b6000846000018481548110612d6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ded919061445d565b60405180910390fd5b5084600001600182612e089190614988565b81548110612e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612e8d8473ffffffffffffffffffffffffffffffffffffffff166134c0565b15612ff6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb6612471565b8786866040518563ffffffff1660e01b8152600401612ed894939291906143b9565b602060405180830381600087803b158015612ef257600080fd5b505af1925050508015612f2357506040513d601f19601f82011682018060405250810190612f2091906138a2565b60015b612fa6573d8060008114612f53576040519150601f19603f3d011682016040523d82523d6000602084013e612f58565b606091505b50600081511415612f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f95906144bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ffb565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306a9061463f565b60405180910390fd5b61307c816124ad565b156130bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b3906144ff565b60405180910390fd5b6130c860008383612bdc565b61311981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfb90919063ffffffff16565b5061313081836002612c159092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146133325760006001826131e69190614988565b90506000600186600001805490506131fe9190614988565b9050600086600001828154811061323e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613288577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001836132a391906148a7565b87600101600083815260200190815260200160002081905550866000018054806132f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613338565b60009150505b92915050565b600061334a83836134d3565b6133a35782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506133a8565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613455578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506134b9565b82856000016001836134679190614988565b8154811061349e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b600080836001016000848152602001908152602001600020541415905092915050565b82805461350290614a7c565b90600052602060002090601f016020900481019282613524576000855561356b565b82601f1061353d57805160ff191683800117855561356b565b8280016001018555821561356b579182015b8281111561356a57825182559160200191906001019061354f565b5b509050613578919061357c565b5090565b5b8082111561359557600081600090555060010161357d565b5090565b60006135ac6135a7846147cb565b61479a565b9050828152602081018484840111156135c457600080fd5b6135cf848285614a3a565b509392505050565b60006135ea6135e5846147fb565b61479a565b90508281526020810184848401111561360257600080fd5b61360d848285614a3a565b509392505050565b60008135905061362481614c30565b92915050565b60008135905061363981614c47565b92915050565b60008135905061364e81614c5e565b92915050565b60008151905061366381614c5e565b92915050565b600082601f83011261367a57600080fd5b813561368a848260208601613599565b91505092915050565b600082601f8301126136a457600080fd5b81356136b48482602086016135d7565b91505092915050565b6000813590506136cc81614c75565b92915050565b6000602082840312156136e457600080fd5b60006136f284828501613615565b91505092915050565b6000806040838503121561370e57600080fd5b600061371c85828601613615565b925050602061372d85828601613615565b9150509250929050565b60008060006060848603121561374c57600080fd5b600061375a86828701613615565b935050602061376b86828701613615565b925050604061377c868287016136bd565b9150509250925092565b6000806000806080858703121561379c57600080fd5b60006137aa87828801613615565b94505060206137bb87828801613615565b93505060406137cc878288016136bd565b925050606085013567ffffffffffffffff8111156137e957600080fd5b6137f587828801613669565b91505092959194509250565b6000806040838503121561381457600080fd5b600061382285828601613615565b92505060206138338582860161362a565b9150509250929050565b6000806040838503121561385057600080fd5b600061385e85828601613615565b925050602061386f858286016136bd565b9150509250929050565b60006020828403121561388b57600080fd5b60006138998482850161363f565b91505092915050565b6000602082840312156138b457600080fd5b60006138c284828501613654565b91505092915050565b6000602082840312156138dd57600080fd5b600082013567ffffffffffffffff8111156138f757600080fd5b61390384828501613693565b91505092915050565b60006020828403121561391e57600080fd5b600061392c848285016136bd565b91505092915050565b6000806040838503121561394857600080fd5b6000613956858286016136bd565b925050602061396785828601613615565b9150509250929050565b600061397d8383614308565b60208301905092915050565b613992816149bc565b82525050565b6139a96139a4826149bc565b614af7565b82525050565b60006139ba8261483b565b6139c48185614869565b93506139cf8361482b565b8060005b83811015613a005781516139e78882613971565b97506139f28361485c565b9250506001810190506139d3565b5085935050505092915050565b613a16816149ce565b82525050565b613a25816149da565b82525050565b6000613a3682614846565b613a40818561487a565b9350613a50818560208601614a49565b613a5981614c12565b840191505092915050565b6000613a6f82614851565b613a79818561488b565b9350613a89818560208601614a49565b613a9281614c12565b840191505092915050565b6000613aa882614851565b613ab2818561489c565b9350613ac2818560208601614a49565b80840191505092915050565b6000613adb60228361488b565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b4160188361488b565b91507f53616c6520686173206e6f7420737461727465642079657400000000000000006000830152602082019050919050565b6000613b8160328361488b565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613be760268361488b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4d601c8361488b565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613c8d60248361488b565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cf360198361488b565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613d3360178361488b565b91507f546865726520617265206e6f207761766573206c6566740000000000000000006000830152602082019050919050565b6000613d73602c8361488b565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613dd960388361488b565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613e3f602a8361488b565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ea560258361488b565b91507f5761766573206e756d626572206d757374206265206265747765656e2031206160008301527f6e642032300000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f0b60238361488b565b91507f45746865722076616c75652073656e742069732062656c6f772074686520707260008301527f69636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f7160228361488b565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fd760208361488b565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614017602c8361488b565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061407d60208361488b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006140bd60298361488b565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614123602f8361488b565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061418960218361488b565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ef60168361488b565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b600061422f60318361488b565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614295600e8361488b565b91507f444f4553204e4f542045584953540000000000000000000000000000000000006000830152602082019050919050565b60006142d560118361488b565b91507f45786365656473204d41585f57415645530000000000000000000000000000006000830152602082019050919050565b61431181614a30565b82525050565b61432081614a30565b82525050565b61433761433282614a30565b614b1b565b82525050565b60006143498286613998565b6014820191506143598285614326565b6020820191506143698284614326565b602082019150819050949350505050565b60006143868285613a9d565b91506143928284613a9d565b91508190509392505050565b60006020820190506143b36000830184613989565b92915050565b60006080820190506143ce6000830187613989565b6143db6020830186613989565b6143e86040830185614317565b81810360608301526143fa8184613a2b565b905095945050505050565b6000602082019050818103600083015261441f81846139af565b905092915050565b600060208201905061443c6000830184613a0d565b92915050565b60006020820190506144576000830184613a1c565b92915050565b600060208201905081810360008301526144778184613a64565b905092915050565b6000602082019050818103600083015261449881613ace565b9050919050565b600060208201905081810360008301526144b881613b34565b9050919050565b600060208201905081810360008301526144d881613b74565b9050919050565b600060208201905081810360008301526144f881613bda565b9050919050565b6000602082019050818103600083015261451881613c40565b9050919050565b6000602082019050818103600083015261453881613c80565b9050919050565b6000602082019050818103600083015261455881613ce6565b9050919050565b6000602082019050818103600083015261457881613d26565b9050919050565b6000602082019050818103600083015261459881613d66565b9050919050565b600060208201905081810360008301526145b881613dcc565b9050919050565b600060208201905081810360008301526145d881613e32565b9050919050565b600060208201905081810360008301526145f881613e98565b9050919050565b6000602082019050818103600083015261461881613efe565b9050919050565b6000602082019050818103600083015261463881613f64565b9050919050565b6000602082019050818103600083015261465881613fca565b9050919050565b600060208201905081810360008301526146788161400a565b9050919050565b6000602082019050818103600083015261469881614070565b9050919050565b600060208201905081810360008301526146b8816140b0565b9050919050565b600060208201905081810360008301526146d881614116565b9050919050565b600060208201905081810360008301526146f88161417c565b9050919050565b60006020820190508181036000830152614718816141e2565b9050919050565b6000602082019050818103600083015261473881614222565b9050919050565b6000602082019050818103600083015261475881614288565b9050919050565b60006020820190508181036000830152614778816142c8565b9050919050565b60006020820190506147946000830184614317565b92915050565b6000604051905081810181811067ffffffffffffffff821117156147c1576147c0614be3565b5b8060405250919050565b600067ffffffffffffffff8211156147e6576147e5614be3565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561481657614815614be3565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148b282614a30565b91506148bd83614a30565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148f2576148f1614b56565b5b828201905092915050565b600061490882614a30565b915061491383614a30565b92508261492357614922614b85565b5b828204905092915050565b600061493982614a30565b915061494483614a30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561497d5761497c614b56565b5b828202905092915050565b600061499382614a30565b915061499e83614a30565b9250828210156149b1576149b0614b56565b5b828203905092915050565b60006149c782614a10565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a67578082015181840152602081019050614a4c565b83811115614a76576000848401525b50505050565b60006002820490506001821680614a9457607f821691505b60208210811415614aa857614aa7614bb4565b5b50919050565b6000614ab982614a30565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614aec57614aeb614b56565b5b600182019050919050565b6000614b0282614b09565b9050919050565b6000614b1482614c23565b9050919050565b6000819050919050565b6000614b3082614a30565b9150614b3b83614a30565b925082614b4b57614b4a614b85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614c39816149bc565b8114614c4457600080fd5b50565b614c50816149ce565b8114614c5b57600080fd5b50565b614c67816149e4565b8114614c7257600080fd5b50565b614c7e81614a30565b8114614c8957600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212209165f029d8196168e9350bb3e3c82faf06864f1e827a5a92c910b842bda38fdb64736f6c6343000800003368747470733a2f2f6170692e6368726f6d6f727068732e78797a2f776f632f6a736f6e2f

Deployed Bytecode

0x6080604052600436106102675760003560e01c806378a4ab8511610144578063c623c543116100b6578063dcc345f21161007a578063dcc345f214610916578063e406a6b91461093f578063e985e9c51461096a578063ebe9eb9f146109a7578063f069062a146109d2578063f2fde38b146109fd57610267565b8063c623c5431461081b578063c87b56dd14610846578063c8a0122614610883578063caccd7f7146108c0578063d7eb3f3a146108eb57610267565b806395d89b411161010857806395d89b411461071c578063a0712d6814610747578063a22cb46514610763578063a22e4faa1461078c578063a3864397146107b5578063b88d4fde146107f257610267565b806378a4ab85146106355780638462151c1461065e5780638da5cb5b1461069b578063925fbd6a146106c657806394bc2ae7146106f157610267565b806342842e0e116101dd5780635d69dbdd116101a15780635d69dbdd1461052357806362aee5441461054e5780636352211e146105795780636c0360eb146105b657806370a08231146105e1578063715018a61461061e57610267565b806342842e0e1461043e5780634f6ccce71461046757806355f804b3146104a457806356d01e7b146104cd5780635c474f9e146104f857610267565b8063171ce0941161022f578063171ce0941461036357806318160ddd1461038c57806323b872dd146103b75780632f745c59146103e057806334918dfd1461041d5780633ccfd60b1461043457610267565b806301ffc9a71461026c57806303339bcb146102a957806306fdde03146102d2578063081812fc146102fd578063095ea7b31461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e9190613879565b610a26565b6040516102a09190614427565b60405180910390f35b3480156102b557600080fd5b506102d060048036038101906102cb9190613935565b610a8d565b005b3480156102de57600080fd5b506102e7610c04565b6040516102f4919061445d565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f919061390c565b610c96565b604051610331919061439e565b60405180910390f35b34801561034657600080fd5b50610361600480360381019061035c919061383d565b610d1b565b005b34801561036f57600080fd5b5061038a600480360381019061038591906138cb565b610e33565b005b34801561039857600080fd5b506103a1610ec9565b6040516103ae919061477f565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190613737565b610eda565b005b3480156103ec57600080fd5b506104076004803603810190610402919061383d565b610f3a565b604051610414919061477f565b60405180910390f35b34801561042957600080fd5b50610432610f95565b005b61043c61103d565b005b34801561044a57600080fd5b5061046560048036038101906104609190613737565b6112a9565b005b34801561047357600080fd5b5061048e6004803603810190610489919061390c565b6112c9565b60405161049b919061477f565b60405180910390f35b3480156104b057600080fd5b506104cb60048036038101906104c691906138cb565b6112ec565b005b3480156104d957600080fd5b506104e2611374565b6040516104ef919061477f565b60405180910390f35b34801561050457600080fd5b5061050d61137a565b60405161051a9190614427565b60405180910390f35b34801561052f57600080fd5b5061053861138d565b604051610545919061445d565b60405180910390f35b34801561055a57600080fd5b5061056361141b565b604051610570919061477f565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b919061390c565b611420565b6040516105ad919061439e565b60405180910390f35b3480156105c257600080fd5b506105cb611457565b6040516105d8919061445d565b60405180910390f35b3480156105ed57600080fd5b50610608600480360381019061060391906136d2565b6114e9565b604051610615919061477f565b60405180910390f35b34801561062a57600080fd5b506106336115a8565b005b34801561064157600080fd5b5061065c600480360381019061065791906138cb565b6116e5565b005b34801561066a57600080fd5b50610685600480360381019061068091906136d2565b61177b565b6040516106929190614405565b60405180910390f35b3480156106a757600080fd5b506106b06118f7565b6040516106bd919061439e565b60405180910390f35b3480156106d257600080fd5b506106db611921565b6040516106e8919061477f565b60405180910390f35b3480156106fd57600080fd5b5061070661192c565b604051610713919061477f565b60405180910390f35b34801561072857600080fd5b50610731611931565b60405161073e919061445d565b60405180910390f35b610761600480360381019061075c919061390c565b6119c3565b005b34801561076f57600080fd5b5061078a60048036038101906107859190613801565b611bb8565b005b34801561079857600080fd5b506107b360048036038101906107ae91906136d2565b611d39565b005b3480156107c157600080fd5b506107dc60048036038101906107d7919061390c565b611df9565b6040516107e99190614442565b60405180910390f35b3480156107fe57600080fd5b5061081960048036038101906108149190613786565b611e88565b005b34801561082757600080fd5b50610830611eea565b60405161083d919061477f565b60405180910390f35b34801561085257600080fd5b5061086d6004803603810190610868919061390c565b611eef565b60405161087a919061445d565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a5919061390c565b612062565b6040516108b7919061477f565b60405180910390f35b3480156108cc57600080fd5b506108d561207a565b6040516108e2919061439e565b60405180910390f35b3480156108f757600080fd5b506109006120a0565b60405161090d919061439e565b60405180910390f35b34801561092257600080fd5b5061093d600480360381019061093891906136d2565b6120c6565b005b34801561094b57600080fd5b50610954612186565b604051610961919061477f565b60405180910390f35b34801561097657600080fd5b50610991600480360381019061098c91906136fb565b61218b565b60405161099e9190614427565b60405180910390f35b3480156109b357600080fd5b506109bc61221f565b6040516109c9919061445d565b60405180910390f35b3480156109de57600080fd5b506109e76122ad565b6040516109f4919061439e565b60405180910390f35b348015610a0957600080fd5b50610a246004803603810190610a1f91906136d2565b6122c5565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b610a95612471565b73ffffffffffffffffffffffffffffffffffffffff16610ab36118f7565b73ffffffffffffffffffffffffffffffffffffffff1614610b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b009061467f565b60405180910390fd5b610400610b14610ec9565b10610b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4b9061455f565b60405180910390fd5b610400610b7183610b63610ec9565b61247990919063ffffffff16565b1115610bb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba99061475f565b60405180910390fd5b60005b82811015610bff576000610bc7610ec9565b9050610bd3838261248f565b436010600083815260200190815260200160002081905550508080610bf790614aae565b915050610bb5565b505050565b606060068054610c1390614a7c565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3f90614a7c565b8015610c8c5780601f10610c6157610100808354040283529160200191610c8c565b820191906000526020600020905b815481529060010190602001808311610c6f57829003601f168201915b5050505050905090565b6000610ca1826124ad565b610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd79061465f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d2682611420565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e906146df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610db6612471565b73ffffffffffffffffffffffffffffffffffffffff161480610de55750610de481610ddf612471565b61218b565b5b610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b9061459f565b60405180910390fd5b610e2e83836124ca565b505050565b610e3b612471565b73ffffffffffffffffffffffffffffffffffffffff16610e596118f7565b73ffffffffffffffffffffffffffffffffffffffff1614610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea69061467f565b60405180910390fd5b80600d9080519060200190610ec59291906134f6565b5050565b6000610ed56002612583565b905090565b610eeb610ee5612471565b82612598565b610f2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f219061471f565b60405180910390fd5b610f35838383612676565b505050565b6000610f8d82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061288d90919063ffffffff16565b905092915050565b610f9d612471565b73ffffffffffffffffffffffffffffffffffffffff16610fbb6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110089061467f565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b611045612471565b73ffffffffffffffffffffffffffffffffffffffff166110636118f7565b73ffffffffffffffffffffffffffffffffffffffff16146110b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b09061467f565b60405180910390fd5b600047905060006110e760646110d9602d856128a790919063ffffffff16565b6128bd90919063ffffffff16565b905060006111126064611104602d866128a790919063ffffffff16565b6128bd90919063ffffffff16565b9050600061113d606461112f600a876128a790919063ffffffff16565b6128bd90919063ffffffff16565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156111a7573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611210573d6000803e3d6000fd5b50730b8f4c4e7626a91460dac057eb43e0de59d5b44f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561126b573d6000803e3d6000fd5b50600047146112a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b50505050565b6112c483838360405180602001604052806000815250611e88565b505050565b6000806112e08360026128d390919063ffffffff16565b50905080915050919050565b6112f4612471565b73ffffffffffffffffffffffffffffffffffffffff166113126118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f9061467f565b60405180910390fd5b611371816128ff565b50565b61040081565b600f60009054906101000a900460ff1681565b600e805461139a90614a7c565b80601f01602080910402602001604051908101604052809291908181526020018280546113c690614a7c565b80156114135780601f106113e857610100808354040283529160200191611413565b820191906000526020600020905b8154815290600101906020018083116113f657829003601f168201915b505050505081565b600a81565b600061145082604051806060016040528060298152602001614c8d6029913960026129199092919063ffffffff16565b9050919050565b60606009805461146690614a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461149290614a7c565b80156114df5780601f106114b4576101008083540402835291602001916114df565b820191906000526020600020905b8154815290600101906020018083116114c257829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561155a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611551906145bf565b60405180910390fd5b6115a1600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612938565b9050919050565b6115b0612471565b73ffffffffffffffffffffffffffffffffffffffff166115ce6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b9061467f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116ed612471565b73ffffffffffffffffffffffffffffffffffffffff1661170b6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611761576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117589061467f565b60405180910390fd5b80600d90805190602001906117779291906134f6565b5050565b60606000611788836114e9565b9050600081141561180b57600067ffffffffffffffff8111156117d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156118025781602001602082028036833780820191505090505b509150506118f2565b60008167ffffffffffffffff81111561184d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561187b5781602001602082028036833780820191505090505b50905060005b828110156118eb576118938582610f3a565b8282815181106118cc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806118e390614aae565b915050611881565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b662386f26fc1000081565b606481565b60606007805461194090614a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461196c90614a7c565b80156119b95780601f1061198e576101008083540402835291602001916119b9565b820191906000526020600020905b81548152906001019060200180831161199c57829003601f168201915b5050505050905090565b600f60009054906101000a900460ff16611a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a099061449f565b60405180910390fd5b610400611a1d610ec9565b10611a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a54906146ff565b60405180910390fd5b600081118015611a6e575060148111155b611aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa4906145df565b60405180910390fd5b610400611aca82611abc610ec9565b61247990919063ffffffff16565b1115611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b029061475f565b60405180910390fd5b611b2581662386f26fc100006128a790919063ffffffff16565b341015611b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5e906145ff565b60405180910390fd5b60005b81811015611bb4576000611b7c610ec9565b9050611b88338261248f565b436010600083815260200190815260200160002081905550508080611bac90614aae565b915050611b6a565b5050565b611bc0612471565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c259061453f565b60405180910390fd5b8060056000611c3b612471565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ce8612471565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d2d9190614427565b60405180910390a35050565b611d41612471565b73ffffffffffffffffffffffffffffffffffffffff16611d5f6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac9061467f565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611e04826124ad565b611e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3a9061473f565b60405180910390fd5b30601060008481526020019081526020016000205483604051602001611e6b9392919061433d565b604051602081830303815290604052805190602001209050919050565b611e99611e93612471565b83612598565b611ed8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ecf9061471f565b60405180910390fd5b611ee48484848461294d565b50505050565b602d81565b6060611efa826124ad565b611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f30906146bf565b60405180910390fd5b6000600860008481526020019081526020016000208054611f5990614a7c565b80601f0160208091040260200160405190810160405280929190818152602001828054611f8590614a7c565b8015611fd25780601f10611fa757610100808354040283529160200191611fd2565b820191906000526020600020905b815481529060010190602001808311611fb557829003601f168201915b505050505090506000611fe3611457565b9050600081511415611ff957819250505061205d565b60008251111561202e57808260405160200161201692919061437a565b6040516020818303038152906040529250505061205d565b80612038856129a9565b60405160200161204992919061437a565b604051602081830303815290604052925050505b919050565b60106020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120ce612471565b73ffffffffffffffffffffffffffffffffffffffff166120ec6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614612142576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121399061467f565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602d81565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d805461222c90614a7c565b80601f016020809104026020016040519081016040528092919081815260200182805461225890614a7c565b80156122a55780601f1061227a576101008083540402835291602001916122a5565b820191906000526020600020905b81548152906001019060200180831161228857829003601f168201915b505050505081565b730b8f4c4e7626a91460dac057eb43e0de59d5b44f81565b6122cd612471565b73ffffffffffffffffffffffffffffffffffffffff166122eb6118f7565b73ffffffffffffffffffffffffffffffffffffffff1614612341576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123389061467f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a8906144df565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b6000818361248791906148a7565b905092915050565b6124a9828260405180602001604052806000815250612b56565b5050565b60006124c3826002612bb190919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661253d83611420565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061259182600001612bcb565b9050919050565b60006125a3826124ad565b6125e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d99061457f565b60405180910390fd5b60006125ed83611420565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265c57508373ffffffffffffffffffffffffffffffffffffffff1661264484610c96565b73ffffffffffffffffffffffffffffffffffffffff16145b8061266d575061266c818561218b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661269682611420565b73ffffffffffffffffffffffffffffffffffffffff16146126ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e39061469f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127539061451f565b60405180910390fd5b612767838383612bdc565b6127726000826124ca565b6127c381600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612be190919063ffffffff16565b5061281581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfb90919063ffffffff16565b5061282c81836002612c159092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061289c8360000183612c4a565b60001c905092915050565b600081836128b5919061492e565b905092915050565b600081836128cb91906148fd565b905092915050565b6000806000806128e68660000186612ce4565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906129159291906134f6565b5050565b600061292c846000018460001b84612d94565b60001c90509392505050565b600061294682600001612e5b565b9050919050565b612958848484612676565b61296484848484612e6c565b6129a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299a906144bf565b60405180910390fd5b50505050565b606060008214156129f1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b51565b600082905060005b60008214612a23578080612a0c90614aae565b915050600a82612a1c91906148fd565b91506129f9565b60008167ffffffffffffffff811115612a65577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a975781602001600182028036833780820191505090505b5090505b60008514612b4a57600182612ab09190614988565b9150600a85612abf9190614b25565b6030612acb91906148a7565b60f81b818381518110612b07577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b4391906148fd565b9450612a9b565b8093505050505b919050565b612b608383613003565b612b6d6000848484612e6c565b612bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba3906144bf565b60405180910390fd5b505050565b6000612bc3836000018360001b613191565b905092915050565b600081600001805490509050919050565b505050565b6000612bf3836000018360001b6131b4565b905092915050565b6000612c0d836000018360001b61333e565b905092915050565b6000612c41846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6133ae565b90509392505050565b600081836000018054905011612c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8c9061447f565b60405180910390fd5b826000018281548110612cd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d279061461f565b60405180910390fd5b6000846000018481548110612d6e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ded919061445d565b60405180910390fd5b5084600001600182612e089190614988565b81548110612e3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612e8d8473ffffffffffffffffffffffffffffffffffffffff166134c0565b15612ff6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612eb6612471565b8786866040518563ffffffff1660e01b8152600401612ed894939291906143b9565b602060405180830381600087803b158015612ef257600080fd5b505af1925050508015612f2357506040513d601f19601f82011682018060405250810190612f2091906138a2565b60015b612fa6573d8060008114612f53576040519150601f19603f3d011682016040523d82523d6000602084013e612f58565b606091505b50600081511415612f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f95906144bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ffb565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306a9061463f565b60405180910390fd5b61307c816124ad565b156130bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b3906144ff565b60405180910390fd5b6130c860008383612bdc565b61311981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612bfb90919063ffffffff16565b5061313081836002612c159092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146133325760006001826131e69190614988565b90506000600186600001805490506131fe9190614988565b9050600086600001828154811061323e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613288577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055506001836132a391906148a7565b87600101600083815260200190815260200160002081905550866000018054806132f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613338565b60009150505b92915050565b600061334a83836134d3565b6133a35782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506133a8565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613455578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506134b9565b82856000016001836134679190614988565b8154811061349e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b600080836001016000848152602001908152602001600020541415905092915050565b82805461350290614a7c565b90600052602060002090601f016020900481019282613524576000855561356b565b82601f1061353d57805160ff191683800117855561356b565b8280016001018555821561356b579182015b8281111561356a57825182559160200191906001019061354f565b5b509050613578919061357c565b5090565b5b8082111561359557600081600090555060010161357d565b5090565b60006135ac6135a7846147cb565b61479a565b9050828152602081018484840111156135c457600080fd5b6135cf848285614a3a565b509392505050565b60006135ea6135e5846147fb565b61479a565b90508281526020810184848401111561360257600080fd5b61360d848285614a3a565b509392505050565b60008135905061362481614c30565b92915050565b60008135905061363981614c47565b92915050565b60008135905061364e81614c5e565b92915050565b60008151905061366381614c5e565b92915050565b600082601f83011261367a57600080fd5b813561368a848260208601613599565b91505092915050565b600082601f8301126136a457600080fd5b81356136b48482602086016135d7565b91505092915050565b6000813590506136cc81614c75565b92915050565b6000602082840312156136e457600080fd5b60006136f284828501613615565b91505092915050565b6000806040838503121561370e57600080fd5b600061371c85828601613615565b925050602061372d85828601613615565b9150509250929050565b60008060006060848603121561374c57600080fd5b600061375a86828701613615565b935050602061376b86828701613615565b925050604061377c868287016136bd565b9150509250925092565b6000806000806080858703121561379c57600080fd5b60006137aa87828801613615565b94505060206137bb87828801613615565b93505060406137cc878288016136bd565b925050606085013567ffffffffffffffff8111156137e957600080fd5b6137f587828801613669565b91505092959194509250565b6000806040838503121561381457600080fd5b600061382285828601613615565b92505060206138338582860161362a565b9150509250929050565b6000806040838503121561385057600080fd5b600061385e85828601613615565b925050602061386f858286016136bd565b9150509250929050565b60006020828403121561388b57600080fd5b60006138998482850161363f565b91505092915050565b6000602082840312156138b457600080fd5b60006138c284828501613654565b91505092915050565b6000602082840312156138dd57600080fd5b600082013567ffffffffffffffff8111156138f757600080fd5b61390384828501613693565b91505092915050565b60006020828403121561391e57600080fd5b600061392c848285016136bd565b91505092915050565b6000806040838503121561394857600080fd5b6000613956858286016136bd565b925050602061396785828601613615565b9150509250929050565b600061397d8383614308565b60208301905092915050565b613992816149bc565b82525050565b6139a96139a4826149bc565b614af7565b82525050565b60006139ba8261483b565b6139c48185614869565b93506139cf8361482b565b8060005b83811015613a005781516139e78882613971565b97506139f28361485c565b9250506001810190506139d3565b5085935050505092915050565b613a16816149ce565b82525050565b613a25816149da565b82525050565b6000613a3682614846565b613a40818561487a565b9350613a50818560208601614a49565b613a5981614c12565b840191505092915050565b6000613a6f82614851565b613a79818561488b565b9350613a89818560208601614a49565b613a9281614c12565b840191505092915050565b6000613aa882614851565b613ab2818561489c565b9350613ac2818560208601614a49565b80840191505092915050565b6000613adb60228361488b565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b4160188361488b565b91507f53616c6520686173206e6f7420737461727465642079657400000000000000006000830152602082019050919050565b6000613b8160328361488b565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613be760268361488b565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c4d601c8361488b565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613c8d60248361488b565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cf360198361488b565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613d3360178361488b565b91507f546865726520617265206e6f207761766573206c6566740000000000000000006000830152602082019050919050565b6000613d73602c8361488b565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613dd960388361488b565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613e3f602a8361488b565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ea560258361488b565b91507f5761766573206e756d626572206d757374206265206265747765656e2031206160008301527f6e642032300000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f0b60238361488b565b91507f45746865722076616c75652073656e742069732062656c6f772074686520707260008301527f69636500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f7160228361488b565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fd760208361488b565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614017602c8361488b565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061407d60208361488b565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006140bd60298361488b565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614123602f8361488b565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061418960218361488b565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ef60168361488b565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b600061422f60318361488b565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614295600e8361488b565b91507f444f4553204e4f542045584953540000000000000000000000000000000000006000830152602082019050919050565b60006142d560118361488b565b91507f45786365656473204d41585f57415645530000000000000000000000000000006000830152602082019050919050565b61431181614a30565b82525050565b61432081614a30565b82525050565b61433761433282614a30565b614b1b565b82525050565b60006143498286613998565b6014820191506143598285614326565b6020820191506143698284614326565b602082019150819050949350505050565b60006143868285613a9d565b91506143928284613a9d565b91508190509392505050565b60006020820190506143b36000830184613989565b92915050565b60006080820190506143ce6000830187613989565b6143db6020830186613989565b6143e86040830185614317565b81810360608301526143fa8184613a2b565b905095945050505050565b6000602082019050818103600083015261441f81846139af565b905092915050565b600060208201905061443c6000830184613a0d565b92915050565b60006020820190506144576000830184613a1c565b92915050565b600060208201905081810360008301526144778184613a64565b905092915050565b6000602082019050818103600083015261449881613ace565b9050919050565b600060208201905081810360008301526144b881613b34565b9050919050565b600060208201905081810360008301526144d881613b74565b9050919050565b600060208201905081810360008301526144f881613bda565b9050919050565b6000602082019050818103600083015261451881613c40565b9050919050565b6000602082019050818103600083015261453881613c80565b9050919050565b6000602082019050818103600083015261455881613ce6565b9050919050565b6000602082019050818103600083015261457881613d26565b9050919050565b6000602082019050818103600083015261459881613d66565b9050919050565b600060208201905081810360008301526145b881613dcc565b9050919050565b600060208201905081810360008301526145d881613e32565b9050919050565b600060208201905081810360008301526145f881613e98565b9050919050565b6000602082019050818103600083015261461881613efe565b9050919050565b6000602082019050818103600083015261463881613f64565b9050919050565b6000602082019050818103600083015261465881613fca565b9050919050565b600060208201905081810360008301526146788161400a565b9050919050565b6000602082019050818103600083015261469881614070565b9050919050565b600060208201905081810360008301526146b8816140b0565b9050919050565b600060208201905081810360008301526146d881614116565b9050919050565b600060208201905081810360008301526146f88161417c565b9050919050565b60006020820190508181036000830152614718816141e2565b9050919050565b6000602082019050818103600083015261473881614222565b9050919050565b6000602082019050818103600083015261475881614288565b9050919050565b60006020820190508181036000830152614778816142c8565b9050919050565b60006020820190506147946000830184614317565b92915050565b6000604051905081810181811067ffffffffffffffff821117156147c1576147c0614be3565b5b8060405250919050565b600067ffffffffffffffff8211156147e6576147e5614be3565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561481657614815614be3565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148b282614a30565b91506148bd83614a30565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148f2576148f1614b56565b5b828201905092915050565b600061490882614a30565b915061491383614a30565b92508261492357614922614b85565b5b828204905092915050565b600061493982614a30565b915061494483614a30565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561497d5761497c614b56565b5b828202905092915050565b600061499382614a30565b915061499e83614a30565b9250828210156149b1576149b0614b56565b5b828203905092915050565b60006149c782614a10565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a67578082015181840152602081019050614a4c565b83811115614a76576000848401525b50505050565b60006002820490506001821680614a9457607f821691505b60208210811415614aa857614aa7614bb4565b5b50919050565b6000614ab982614a30565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614aec57614aeb614b56565b5b600182019050919050565b6000614b0282614b09565b9050919050565b6000614b1482614c23565b9050919050565b6000819050919050565b6000614b3082614a30565b9150614b3b83614a30565b925082614b4b57614b4a614b85565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614c39816149bc565b8114614c4457600080fd5b50565b614c50816149ce565b8114614c5b57600080fd5b50565b614c67816149e4565b8114614c7257600080fd5b50565b614c7e81614a30565b8114614c8957600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212209165f029d8196168e9350bb3e3c82faf06864f1e827a5a92c910b842bda38fdb64736f6c63430008000033

Deployed Bytecode Sourcemap

66229:4082:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31648:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68386:446;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43361:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46147:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45677:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68950:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45155:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47037:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44917:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69447:87;;;;;;;;;;;;;:::i;:::-;;69786:522;;;:::i;:::-;;47413:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45443:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69336:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66342:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66963:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66923:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66553:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43117:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44736:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42807:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58222:148;;;;;;;;;;;;;:::i;:::-;;68844:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67184:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57571:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66386:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66599:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43530:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67697:678;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46440:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69208:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69546:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47635:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66460:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43705:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67001:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66642:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66725:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69068:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66508:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46806:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66896:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66805:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58525:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31648:150;31733:4;31757:20;:33;31778:11;31757:33;;;;;;;;;;;;;;;;;;;;;;;;;;;31750:40;;31648:150;;;:::o;68386:446::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66375:4:::1;68479:13;:11;:13::i;:::-;:25;68471:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;66375:4;68551:30;68569:11;68551:13;:11;:13::i;:::-;:17;;:30;;;;:::i;:::-;:43;;68543:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68634:6;68629:196;68650:11;68646:1;:15;68629:196;;;68683:14;68700:13;:11;:13::i;:::-;68683:30;;68728:31;68738:9;68749;68728;:31::i;:::-;68801:12;68774:13;:24;68788:9;68774:24;;;;;;;;;;;:39;;;;68629:196;68663:3;;;;;:::i;:::-;;;;68629:196;;;;68386:446:::0;;:::o;43361:100::-;43415:13;43448:5;43441:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43361:100;:::o;46147:221::-;46223:7;46251:16;46259:7;46251;:16::i;:::-;46243:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46336:15;:24;46352:7;46336:24;;;;;;;;;;;;;;;;;;;;;46329:31;;46147:221;;;:::o;45677:404::-;45758:13;45774:23;45789:7;45774:14;:23::i;:::-;45758:39;;45822:5;45816:11;;:2;:11;;;;45808:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45902:5;45886:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;45911:44;45935:5;45942:12;:10;:12::i;:::-;45911:23;:44::i;:::-;45886:69;45878:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;46052:21;46061:2;46065:7;46052:8;:21::i;:::-;45677:404;;;:::o;68950:106::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69037:11:::1;69028:6;:20;;;;;;;;;;;;:::i;:::-;;68950:106:::0;:::o;45155:211::-;45216:7;45337:21;:12;:19;:21::i;:::-;45330:28;;45155:211;:::o;47037:305::-;47198:41;47217:12;:10;:12::i;:::-;47231:7;47198:18;:41::i;:::-;47190:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47306:28;47316:4;47322:2;47326:7;47306:9;:28::i;:::-;47037:305;;;:::o;44917:162::-;45014:7;45041:30;45065:5;45041:13;:20;45055:5;45041:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;45034:37;;44917:162;;;;:::o;69447:87::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69515:11:::1;;;;;;;;;;;69514:12;69500:11;;:26;;;;;;;;;;;;;;;;;;69447:87::o:0;69786:522::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69842:15:::1;69860:21;69842:39;;69892:16;69911:43;66632:3;69911:28;66499:2;69911:7;:11;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;69892:62;;69965:13;69981:40;66632:3;69981:25;66544:2;69981:7;:11;;:25;;;;:::i;:::-;:29;;:40;;;;:::i;:::-;69965:56;;70032:14;70049:41;66632:3;70049:26;66590:2;70049:7;:11;;:26;;;;:::i;:::-;:30;;:41;;;;:::i;:::-;70032:58;;70109:16;;;;;;;;;;;70101:34;;:47;70136:11;70101:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70167:13;;;;;;;;;;;70159:31;;:41;70191:8;70159:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66847:42;70211:33;;:44;70245:9;70211:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;70298:1;70273:21;:26;70266:34;;;;;;;;;;;;57862:1;;;;69786:522::o:0;47413:151::-;47517:39;47534:4;47540:2;47544:7;47517:39;;;;;;;;;;;;:16;:39::i;:::-;47413:151;;;:::o;45443:172::-;45518:7;45539:15;45560:22;45576:5;45560:12;:15;;:22;;;;:::i;:::-;45538:44;;;45600:7;45593:14;;;45443:172;;;:::o;69336:99::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69407:20:::1;69419:7;69407:11;:20::i;:::-;69336:99:::0;:::o;66342:37::-;66375:4;66342:37;:::o;66963:31::-;;;;;;;;;;;;;:::o;66923:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66553:39::-;66590:2;66553:39;:::o;43117:177::-;43189:7;43216:70;43233:7;43216:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;43209:77;;43117:177;;;:::o;44736:97::-;44784:13;44817:8;44810:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44736:97;:::o;42807:221::-;42879:7;42924:1;42907:19;;:5;:19;;;;42899:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42991:29;:13;:20;43005:5;42991:20;;;;;;;;;;;;;;;:27;:29::i;:::-;42984:36;;42807:221;;;:::o;58222:148::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58329:1:::1;58292:40;;58313:6;;;;;;;;;;;58292:40;;;;;;;;;;;;58360:1;58343:6;;:19;;;;;;;;;;;;;;;;;;58222:148::o:0;68844:94::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68923:7:::1;68914:6;:16;;;;;;;;;;;;:::i;:::-;;68844:94:::0;:::o;67184:502::-;67245:16;67275:18;67296:17;67306:6;67296:9;:17::i;:::-;67275:38;;67342:1;67328:10;:15;67324:355;;;67381:1;67367:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67360:23;;;;;67324:355;67416:23;67456:10;67442:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67416:51;;67482:13;67510:130;67534:10;67526:5;:18;67510:130;;;67590:34;67610:6;67618:5;67590:19;:34::i;:::-;67574:6;67581:5;67574:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;67546:7;;;;;:::i;:::-;;;;67510:130;;;67661:6;67654:13;;;;;67184:502;;;;:::o;57571:87::-;57617:7;57644:6;;;;;;;;;;;57637:13;;57571:87;:::o;66386:55::-;66424:17;66386:55;:::o;66599:36::-;66632:3;66599:36;:::o;43530:104::-;43586:13;43619:7;43612:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43530:104;:::o;67697:678::-;67766:11;;;;;;;;;;;67758:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;66375:4;67825:13;:11;:13::i;:::-;:25;67817:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;67910:1;67896:11;:15;:36;;;;;67930:2;67915:11;:17;;67896:36;67888:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;66375:4;67993:30;68011:11;67993:13;:11;:13::i;:::-;:17;;:30;;;;:::i;:::-;:43;;67985:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68090:28;68106:11;66424:17;68090:15;;:28;;;;:::i;:::-;68077:9;:41;;68069:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;68176:6;68171:197;68192:11;68188:1;:15;68171:197;;;68225:14;68242:13;:11;:13::i;:::-;68225:30;;68270:32;68280:10;68292:9;68270;:32::i;:::-;68344:12;68317:13;:24;68331:9;68317:24;;;;;;;;;;;:39;;;;68171:197;68205:3;;;;;:::i;:::-;;;;68171:197;;;;67697:678;:::o;46440:295::-;46555:12;:10;:12::i;:::-;46543:24;;:8;:24;;;;46535:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46655:8;46610:18;:32;46629:12;:10;:12::i;:::-;46610:32;;;;;;;;;;;;;;;:42;46643:8;46610:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46708:8;46679:48;;46694:12;:10;:12::i;:::-;46679:48;;;46718:8;46679:48;;;;;;:::i;:::-;;;;;;;;46440:295;;:::o;69208:116::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69302:14:::1;69286:13;;:30;;;;;;;;;;;;;;;;;;69208:116:::0;:::o;69546:228::-;69602:7;69629:16;69637:7;69629;:16::i;:::-;69621:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;69725:4;69732:13;:22;69746:7;69732:22;;;;;;;;;;;;69756:7;69700:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69690:75;;;;;;69675:91;;69546:228;;;:::o;47635:285::-;47767:41;47786:12;:10;:12::i;:::-;47800:7;47767:18;:41::i;:::-;47759:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47873:39;47887:4;47893:2;47897:7;47906:5;47873:13;:39::i;:::-;47635:285;;;;:::o;66460:41::-;66499:2;66460:41;:::o;43705:792::-;43778:13;43812:16;43820:7;43812;:16::i;:::-;43804:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43893:23;43919:10;:19;43930:7;43919:19;;;;;;;;;;;43893:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43949:18;43970:9;:7;:9::i;:::-;43949:30;;44077:1;44061:4;44055:18;:23;44051:72;;;44102:9;44095:16;;;;;;44051:72;44253:1;44233:9;44227:23;:27;44223:108;;;44302:4;44308:9;44285:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44271:48;;;;;;44223:108;44463:4;44469:18;:7;:16;:18::i;:::-;44446:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44432:57;;;;43705:792;;;;:::o;67001:49::-;;;;;;;;;;;;;;;;;:::o;66642:76::-;;;;;;;;;;;;;:::o;66725:73::-;;;;;;;;;;;;;:::o;69068:128::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69171:17:::1;69152:16;;:36;;;;;;;;;;;;;;;;;;69068:128:::0;:::o;66508:38::-;66544:2;66508:38;:::o;46806:164::-;46903:4;46927:18;:25;46946:5;46927:25;;;;;;;;;;;;;;;:35;46953:8;46927:35;;;;;;;;;;;;;;;;;;;;;;;;;46920:42;;46806:164;;;;:::o;66896:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66805:84::-;66847:42;66805:84;:::o;58525:244::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58634:1:::1;58614:22;;:8;:22;;;;58606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58724:8;58695:38;;58716:6;;;;;;;;;;;58695:38;;;;;;;;;;;;58753:8;58744:6;;:17;;;;;;;;;;;;;;;;;;58525:244:::0;:::o;40579:98::-;40632:7;40659:10;40652:17;;40579:98;:::o;61611:::-;61669:7;61700:1;61696;:5;;;;:::i;:::-;61689:12;;61611:98;;;;:::o;50379:110::-;50455:26;50465:2;50469:7;50455:26;;;;;;;;;;;;:9;:26::i;:::-;50379:110;;:::o;49387:127::-;49452:4;49476:30;49498:7;49476:12;:21;;:30;;;;:::i;:::-;49469:37;;49387:127;;;:::o;55531:183::-;55624:2;55597:15;:24;55613:7;55597:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55680:7;55676:2;55642:46;;55651:23;55666:7;55651:14;:23::i;:::-;55642:46;;;;;;;;;;;;55531:183;;:::o;10105:123::-;10174:7;10201:19;10209:3;:10;;10201:7;:19::i;:::-;10194:26;;10105:123;;;:::o;49681:355::-;49774:4;49799:16;49807:7;49799;:16::i;:::-;49791:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49875:13;49891:23;49906:7;49891:14;:23::i;:::-;49875:39;;49944:5;49933:16;;:7;:16;;;:51;;;;49977:7;49953:31;;:20;49965:7;49953:11;:20::i;:::-;:31;;;49933:51;:94;;;;49988:39;50012:5;50019:7;49988:23;:39::i;:::-;49933:94;49925:103;;;49681:355;;;;:::o;52817:597::-;52942:4;52915:31;;:23;52930:7;52915:14;:23::i;:::-;:31;;;52907:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;53043:1;53029:16;;:2;:16;;;;53021:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53099:39;53120:4;53126:2;53130:7;53099:20;:39::i;:::-;53203:29;53220:1;53224:7;53203:8;:29::i;:::-;53245:35;53272:7;53245:13;:19;53259:4;53245:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;53291:30;53313:7;53291:13;:17;53305:2;53291:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;53334:29;53351:7;53360:2;53334:12;:16;;:29;;;;;:::i;:::-;;53398:7;53394:2;53379:27;;53388:4;53379:27;;;;;;;;;;;;52817:597;;;:::o;21679:137::-;21750:7;21785:22;21789:3;:10;;21801:5;21785:3;:22::i;:::-;21777:31;;21770:38;;21679:137;;;;:::o;62349:98::-;62407:7;62438:1;62434;:5;;;;:::i;:::-;62427:12;;62349:98;;;;:::o;62748:::-;62806:7;62837:1;62833;:5;;;;:::i;:::-;62826:12;;62748:98;;;;:::o;10567:236::-;10647:7;10656;10677:11;10690:13;10707:22;10711:3;:10;;10723:5;10707:3;:22::i;:::-;10676:53;;;;10756:3;10748:12;;10786:5;10778:14;;10740:55;;;;;;10567:236;;;;;:::o;54015:100::-;54099:8;54088;:19;;;;;;;;;;;;:::i;:::-;;54015:100;:::o;11853:213::-;11960:7;12011:44;12016:3;:10;;12036:3;12028:12;;12042;12011:4;:44::i;:::-;12003:53;;11980:78;;11853:213;;;;;:::o;21221:114::-;21281:7;21308:19;21316:3;:10;;21308:7;:19::i;:::-;21301:26;;21221:114;;;:::o;48802:272::-;48916:28;48926:4;48932:2;48936:7;48916:9;:28::i;:::-;48963:48;48986:4;48992:2;48996:7;49005:5;48963:22;:48::i;:::-;48955:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;48802:272;;;;:::o;249:723::-;305:13;535:1;526:5;:10;522:53;;;553:10;;;;;;;;;;;;;;;;;;;;;522:53;585:12;600:5;585:20;;616:14;641:78;656:1;648:4;:9;641:78;;674:8;;;;;:::i;:::-;;;;705:2;697:10;;;;;:::i;:::-;;;641:78;;;729:19;761:6;751:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;729:39;;779:154;795:1;786:5;:10;779:154;;823:1;813:11;;;;;:::i;:::-;;;890:2;882:5;:10;;;;:::i;:::-;869:2;:24;;;;:::i;:::-;856:39;;839:6;846;839:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;919:2;910:11;;;;;:::i;:::-;;;779:154;;;957:6;943:21;;;;;249:723;;;;:::o;50716:250::-;50812:18;50818:2;50822:7;50812:5;:18::i;:::-;50849:54;50880:1;50884:2;50888:7;50897:5;50849:22;:54::i;:::-;50841:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;50716:250;;;:::o;9866:151::-;9950:4;9974:35;9984:3;:10;;10004:3;9996:12;;9974:9;:35::i;:::-;9967:42;;9866:151;;;;:::o;6684:110::-;6740:7;6767:3;:12;;:19;;;;6760:26;;6684:110;;;:::o;56327:93::-;;;;:::o;20766:137::-;20836:4;20860:35;20868:3;:10;;20888:5;20880:14;;20860:7;:35::i;:::-;20853:42;;20766:137;;;;:::o;20459:131::-;20526:4;20550:32;20555:3;:10;;20575:5;20567:14;;20550:4;:32::i;:::-;20543:39;;20459:131;;;;:::o;9289:185::-;9378:4;9402:64;9407:3;:10;;9427:3;9419:12;;9457:5;9441:23;;9433:32;;9402:4;:64::i;:::-;9395:71;;9289:185;;;;;:::o;16717:204::-;16784:7;16833:5;16812:3;:11;;:18;;;;:26;16804:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16895:3;:11;;16907:5;16895:18;;;;;;;;;;;;;;;;;;;;;;;;16888:25;;16717:204;;;;:::o;7149:279::-;7216:7;7225;7275:5;7253:3;:12;;:19;;;;:27;7245:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7332:22;7357:3;:12;;7370:5;7357:19;;;;;;;;;;;;;;;;;;;;;;;;;;7332:44;;7395:5;:10;;;7407:5;:12;;;7387:33;;;;;7149:279;;;;;:::o;8646:319::-;8740:7;8760:16;8779:3;:12;;:17;8792:3;8779:17;;;;;;;;;;;;8760:36;;8827:1;8815:8;:13;;8830:12;8807:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8897:3;:12;;8921:1;8910:8;:12;;;;:::i;:::-;8897:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;8890:40;;;8646:319;;;;;:::o;16264:109::-;16320:7;16347:3;:11;;:18;;;;16340:25;;16264:109;;;:::o;54680:843::-;54801:4;54827:15;:2;:13;;;:15::i;:::-;54823:693;;;54879:2;54863:36;;;54900:12;:10;:12::i;:::-;54914:4;54920:7;54929:5;54863:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54859:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55126:1;55109:6;:13;:18;55105:341;;;55152:60;;;;;;;;;;:::i;:::-;;;;;;;;55105:341;55396:6;55390:13;55381:6;55377:2;55373:15;55366:38;54859:602;54996:45;;;54986:55;;;:6;:55;;;;54979:62;;;;;54823:693;55500:4;55493:11;;54680:843;;;;;;;:::o;51302:404::-;51396:1;51382:16;;:2;:16;;;;51374:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51455:16;51463:7;51455;:16::i;:::-;51454:17;51446:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51517:45;51546:1;51550:2;51554:7;51517:20;:45::i;:::-;51575:30;51597:7;51575:13;:17;51589:2;51575:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;51618:29;51635:7;51644:2;51618:12;:16;;:29;;;;;:::i;:::-;;51690:7;51686:2;51665:33;;51682:1;51665:33;;;;;;;;;;;;51302:404;;:::o;6464:125::-;6535:4;6580:1;6559:3;:12;;:17;6572:3;6559:17;;;;;;;;;;;;:22;;6552:29;;6464:125;;;;:::o;14419:1544::-;14485:4;14603:18;14624:3;:12;;:19;14637:5;14624:19;;;;;;;;;;;;14603:40;;14674:1;14660:10;:15;14656:1300;;15022:21;15059:1;15046:10;:14;;;;:::i;:::-;15022:38;;15075:17;15116:1;15095:3;:11;;:18;;;;:22;;;;:::i;:::-;15075:42;;15362:17;15382:3;:11;;15394:9;15382:22;;;;;;;;;;;;;;;;;;;;;;;;15362:42;;15528:9;15499:3;:11;;15511:13;15499:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;15647:1;15631:13;:17;;;;:::i;:::-;15605:3;:12;;:23;15618:9;15605:23;;;;;;;;;;;:43;;;;15757:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15852:3;:12;;:19;15865:5;15852:19;;;;;;;;;;;15845:26;;;15895:4;15888:11;;;;;;;;14656:1300;15939:5;15932:12;;;14419:1544;;;;;:::o;13829:414::-;13892:4;13914:21;13924:3;13929:5;13914:9;:21::i;:::-;13909:327;;13952:3;:11;;13969:5;13952:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14135:3;:11;;:18;;;;14113:3;:12;;:19;14126:5;14113:19;;;;;;;;;;;:40;;;;14175:4;14168:11;;;;13909:327;14219:5;14212:12;;13829:414;;;;;:::o;3964:692::-;4040:4;4156:16;4175:3;:12;;:17;4188:3;4175:17;;;;;;;;;;;;4156:36;;4221:1;4209:8;:13;4205:444;;;4276:3;:12;;4294:38;;;;;;;;4311:3;4294:38;;;;4324:5;4294:38;;;4276:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4491:3;:12;;:19;;;;4471:3;:12;;:17;4484:3;4471:17;;;;;;;;;;;:39;;;;4532:4;4525:11;;;;;4205:444;4605:5;4569:3;:12;;4593:1;4582:8;:12;;;;:::i;:::-;4569:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:41;;;;4632:5;4625:12;;;3964:692;;;;;;:::o;22631:422::-;22691:4;22899:12;23010:7;22998:20;22990:28;;23044:1;23037:4;:8;23030:15;;;22631:422;;;:::o;16049:129::-;16122:4;16169:1;16146:3;:12;;:19;16159:5;16146:19;;;;;;;;;;;;:24;;16139:31;;16049:129;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:407::-;;;6209:2;6197:9;6188:7;6184:23;6180:32;6177:2;;;6225:1;6222;6215:12;6177:2;6268:1;6293:53;6338:7;6329:6;6318:9;6314:22;6293:53;:::i;:::-;6283:63;;6239:117;6395:2;6421:53;6466:7;6457:6;6446:9;6442:22;6421:53;:::i;:::-;6411:63;;6366:118;6167:324;;;;;:::o;6497:179::-;;6587:46;6629:3;6621:6;6587:46;:::i;:::-;6665:4;6660:3;6656:14;6642:28;;6577:99;;;;:::o;6682:118::-;6769:24;6787:5;6769:24;:::i;:::-;6764:3;6757:37;6747:53;;:::o;6806:157::-;6911:45;6931:24;6949:5;6931:24;:::i;:::-;6911:45;:::i;:::-;6906:3;6899:58;6889:74;;:::o;6999:732::-;;7147:54;7195:5;7147:54;:::i;:::-;7217:86;7296:6;7291:3;7217:86;:::i;:::-;7210:93;;7327:56;7377:5;7327:56;:::i;:::-;7406:7;7437:1;7422:284;7447:6;7444:1;7441:13;7422:284;;;7523:6;7517:13;7550:63;7609:3;7594:13;7550:63;:::i;:::-;7543:70;;7636:60;7689:6;7636:60;:::i;:::-;7626:70;;7482:224;7469:1;7466;7462:9;7457:14;;7422:284;;;7426:14;7722:3;7715:10;;7123:608;;;;;;;:::o;7737:109::-;7818:21;7833:5;7818:21;:::i;:::-;7813:3;7806:34;7796:50;;:::o;7852:118::-;7939:24;7957:5;7939:24;:::i;:::-;7934:3;7927:37;7917:53;;:::o;7976:360::-;;8090:38;8122:5;8090:38;:::i;:::-;8144:70;8207:6;8202:3;8144:70;:::i;:::-;8137:77;;8223:52;8268:6;8263:3;8256:4;8249:5;8245:16;8223:52;:::i;:::-;8300:29;8322:6;8300:29;:::i;:::-;8295:3;8291:39;8284:46;;8066:270;;;;;:::o;8342:364::-;;8458:39;8491:5;8458:39;:::i;:::-;8513:71;8577:6;8572:3;8513:71;:::i;:::-;8506:78;;8593:52;8638:6;8633:3;8626:4;8619:5;8615:16;8593:52;:::i;:::-;8670:29;8692:6;8670:29;:::i;:::-;8665:3;8661:39;8654:46;;8434:272;;;;;:::o;8712:377::-;;8846:39;8879:5;8846:39;:::i;:::-;8901:89;8983:6;8978:3;8901:89;:::i;:::-;8894:96;;8999:52;9044:6;9039:3;9032:4;9025:5;9021:16;8999:52;:::i;:::-;9076:6;9071:3;9067:16;9060:23;;8822:267;;;;;:::o;9095:366::-;;9258:67;9322:2;9317:3;9258:67;:::i;:::-;9251:74;;9355:34;9351:1;9346:3;9342:11;9335:55;9421:4;9416:2;9411:3;9407:12;9400:26;9452:2;9447:3;9443:12;9436:19;;9241:220;;;:::o;9467:322::-;;9630:67;9694:2;9689:3;9630:67;:::i;:::-;9623:74;;9727:26;9723:1;9718:3;9714:11;9707:47;9780:2;9775:3;9771:12;9764:19;;9613:176;;;:::o;9795:382::-;;9958:67;10022:2;10017:3;9958:67;:::i;:::-;9951:74;;10055:34;10051:1;10046:3;10042:11;10035:55;10121:20;10116:2;10111:3;10107:12;10100:42;10168:2;10163:3;10159:12;10152:19;;9941:236;;;:::o;10183:370::-;;10346:67;10410:2;10405:3;10346:67;:::i;:::-;10339:74;;10443:34;10439:1;10434:3;10430:11;10423:55;10509:8;10504:2;10499:3;10495:12;10488:30;10544:2;10539:3;10535:12;10528:19;;10329:224;;;:::o;10559:326::-;;10722:67;10786:2;10781:3;10722:67;:::i;:::-;10715:74;;10819:30;10815:1;10810:3;10806:11;10799:51;10876:2;10871:3;10867:12;10860:19;;10705:180;;;:::o;10891:368::-;;11054:67;11118:2;11113:3;11054:67;:::i;:::-;11047:74;;11151:34;11147:1;11142:3;11138:11;11131:55;11217:6;11212:2;11207:3;11203:12;11196:28;11250:2;11245:3;11241:12;11234:19;;11037:222;;;:::o;11265:323::-;;11428:67;11492:2;11487:3;11428:67;:::i;:::-;11421:74;;11525:27;11521:1;11516:3;11512:11;11505:48;11579:2;11574:3;11570:12;11563:19;;11411:177;;;:::o;11594:321::-;;11757:67;11821:2;11816:3;11757:67;:::i;:::-;11750:74;;11854:25;11850:1;11845:3;11841:11;11834:46;11906:2;11901:3;11897:12;11890:19;;11740:175;;;:::o;11921:376::-;;12084:67;12148:2;12143:3;12084:67;:::i;:::-;12077:74;;12181:34;12177:1;12172:3;12168:11;12161:55;12247:14;12242:2;12237:3;12233:12;12226:36;12288:2;12283:3;12279:12;12272:19;;12067:230;;;:::o;12303:388::-;;12466:67;12530:2;12525:3;12466:67;:::i;:::-;12459:74;;12563:34;12559:1;12554:3;12550:11;12543:55;12629:26;12624:2;12619:3;12615:12;12608:48;12682:2;12677:3;12673:12;12666:19;;12449:242;;;:::o;12697:374::-;;12860:67;12924:2;12919:3;12860:67;:::i;:::-;12853:74;;12957:34;12953:1;12948:3;12944:11;12937:55;13023:12;13018:2;13013:3;13009:12;13002:34;13062:2;13057:3;13053:12;13046:19;;12843:228;;;:::o;13077:369::-;;13240:67;13304:2;13299:3;13240:67;:::i;:::-;13233:74;;13337:34;13333:1;13328:3;13324:11;13317:55;13403:7;13398:2;13393:3;13389:12;13382:29;13437:2;13432:3;13428:12;13421:19;;13223:223;;;:::o;13452:367::-;;13615:67;13679:2;13674:3;13615:67;:::i;:::-;13608:74;;13712:34;13708:1;13703:3;13699:11;13692:55;13778:5;13773:2;13768:3;13764:12;13757:27;13810:2;13805:3;13801:12;13794:19;;13598:221;;;:::o;13825:366::-;;13988:67;14052:2;14047:3;13988:67;:::i;:::-;13981:74;;14085:34;14081:1;14076:3;14072:11;14065:55;14151:4;14146:2;14141:3;14137:12;14130:26;14182:2;14177:3;14173:12;14166:19;;13971:220;;;:::o;14197:330::-;;14360:67;14424:2;14419:3;14360:67;:::i;:::-;14353:74;;14457:34;14453:1;14448:3;14444:11;14437:55;14518:2;14513:3;14509:12;14502:19;;14343:184;;;:::o;14533:376::-;;14696:67;14760:2;14755:3;14696:67;:::i;:::-;14689:74;;14793:34;14789:1;14784:3;14780:11;14773:55;14859:14;14854:2;14849:3;14845:12;14838:36;14900:2;14895:3;14891:12;14884:19;;14679:230;;;:::o;14915:330::-;;15078:67;15142:2;15137:3;15078:67;:::i;:::-;15071:74;;15175:34;15171:1;15166:3;15162:11;15155:55;15236:2;15231:3;15227:12;15220:19;;15061:184;;;:::o;15251:373::-;;15414:67;15478:2;15473:3;15414:67;:::i;:::-;15407:74;;15511:34;15507:1;15502:3;15498:11;15491:55;15577:11;15572:2;15567:3;15563:12;15556:33;15615:2;15610:3;15606:12;15599:19;;15397:227;;;:::o;15630:379::-;;15793:67;15857:2;15852:3;15793:67;:::i;:::-;15786:74;;15890:34;15886:1;15881:3;15877:11;15870:55;15956:17;15951:2;15946:3;15942:12;15935:39;16000:2;15995:3;15991:12;15984:19;;15776:233;;;:::o;16015:365::-;;16178:67;16242:2;16237:3;16178:67;:::i;:::-;16171:74;;16275:34;16271:1;16266:3;16262:11;16255:55;16341:3;16336:2;16331:3;16327:12;16320:25;16371:2;16366:3;16362:12;16355:19;;16161:219;;;:::o;16386:320::-;;16549:67;16613:2;16608:3;16549:67;:::i;:::-;16542:74;;16646:24;16642:1;16637:3;16633:11;16626:45;16697:2;16692:3;16688:12;16681:19;;16532:174;;;:::o;16712:381::-;;16875:67;16939:2;16934:3;16875:67;:::i;:::-;16868:74;;16972:34;16968:1;16963:3;16959:11;16952:55;17038:19;17033:2;17028:3;17024:12;17017:41;17084:2;17079:3;17075:12;17068:19;;16858:235;;;:::o;17099:312::-;;17262:67;17326:2;17321:3;17262:67;:::i;:::-;17255:74;;17359:16;17355:1;17350:3;17346:11;17339:37;17402:2;17397:3;17393:12;17386:19;;17245:166;;;:::o;17417:315::-;;17580:67;17644:2;17639:3;17580:67;:::i;:::-;17573:74;;17677:19;17673:1;17668:3;17664:11;17657:40;17723:2;17718:3;17714:12;17707:19;;17563:169;;;:::o;17738:108::-;17815:24;17833:5;17815:24;:::i;:::-;17810:3;17803:37;17793:53;;:::o;17852:118::-;17939:24;17957:5;17939:24;:::i;:::-;17934:3;17927:37;17917:53;;:::o;17976:157::-;18081:45;18101:24;18119:5;18101:24;:::i;:::-;18081:45;:::i;:::-;18076:3;18069:58;18059:74;;:::o;18139:538::-;;18322:75;18393:3;18384:6;18322:75;:::i;:::-;18422:2;18417:3;18413:12;18406:19;;18435:75;18506:3;18497:6;18435:75;:::i;:::-;18535:2;18530:3;18526:12;18519:19;;18548:75;18619:3;18610:6;18548:75;:::i;:::-;18648:2;18643:3;18639:12;18632:19;;18668:3;18661:10;;18311:366;;;;;;:::o;18683:435::-;;18885:95;18976:3;18967:6;18885:95;:::i;:::-;18878:102;;18997:95;19088:3;19079:6;18997:95;:::i;:::-;18990:102;;19109:3;19102:10;;18867:251;;;;;:::o;19124:222::-;;19255:2;19244:9;19240:18;19232:26;;19268:71;19336:1;19325:9;19321:17;19312:6;19268:71;:::i;:::-;19222:124;;;;:::o;19352:640::-;;19585:3;19574:9;19570:19;19562:27;;19599:71;19667:1;19656:9;19652:17;19643:6;19599:71;:::i;:::-;19680:72;19748:2;19737:9;19733:18;19724:6;19680:72;:::i;:::-;19762;19830:2;19819:9;19815:18;19806:6;19762:72;:::i;:::-;19881:9;19875:4;19871:20;19866:2;19855:9;19851:18;19844:48;19909:76;19980:4;19971:6;19909:76;:::i;:::-;19901:84;;19552:440;;;;;;;:::o;19998:373::-;;20179:2;20168:9;20164:18;20156:26;;20228:9;20222:4;20218:20;20214:1;20203:9;20199:17;20192:47;20256:108;20359:4;20350:6;20256:108;:::i;:::-;20248:116;;20146:225;;;;:::o;20377:210::-;;20502:2;20491:9;20487:18;20479:26;;20515:65;20577:1;20566:9;20562:17;20553:6;20515:65;:::i;:::-;20469:118;;;;:::o;20593:222::-;;20724:2;20713:9;20709:18;20701:26;;20737:71;20805:1;20794:9;20790:17;20781:6;20737:71;:::i;:::-;20691:124;;;;:::o;20821:313::-;;20972:2;20961:9;20957:18;20949:26;;21021:9;21015:4;21011:20;21007:1;20996:9;20992:17;20985:47;21049:78;21122:4;21113:6;21049:78;:::i;:::-;21041:86;;20939:195;;;;:::o;21140:419::-;;21344:2;21333:9;21329:18;21321:26;;21393:9;21387:4;21383:20;21379:1;21368:9;21364:17;21357:47;21421:131;21547:4;21421:131;:::i;:::-;21413:139;;21311:248;;;:::o;21565:419::-;;21769:2;21758:9;21754:18;21746:26;;21818:9;21812:4;21808:20;21804:1;21793:9;21789:17;21782:47;21846:131;21972:4;21846:131;:::i;:::-;21838:139;;21736:248;;;:::o;21990:419::-;;22194:2;22183:9;22179:18;22171:26;;22243:9;22237:4;22233:20;22229:1;22218:9;22214:17;22207:47;22271:131;22397:4;22271:131;:::i;:::-;22263:139;;22161:248;;;:::o;22415:419::-;;22619:2;22608:9;22604:18;22596:26;;22668:9;22662:4;22658:20;22654:1;22643:9;22639:17;22632:47;22696:131;22822:4;22696:131;:::i;:::-;22688:139;;22586:248;;;:::o;22840:419::-;;23044:2;23033:9;23029:18;23021:26;;23093:9;23087:4;23083:20;23079:1;23068:9;23064:17;23057:47;23121:131;23247:4;23121:131;:::i;:::-;23113:139;;23011:248;;;:::o;23265:419::-;;23469:2;23458:9;23454:18;23446:26;;23518:9;23512:4;23508:20;23504:1;23493:9;23489:17;23482:47;23546:131;23672:4;23546:131;:::i;:::-;23538:139;;23436:248;;;:::o;23690:419::-;;23894:2;23883:9;23879:18;23871:26;;23943:9;23937:4;23933:20;23929:1;23918:9;23914:17;23907:47;23971:131;24097:4;23971:131;:::i;:::-;23963:139;;23861:248;;;:::o;24115:419::-;;24319:2;24308:9;24304:18;24296:26;;24368:9;24362:4;24358:20;24354:1;24343:9;24339:17;24332:47;24396:131;24522:4;24396:131;:::i;:::-;24388:139;;24286:248;;;:::o;24540:419::-;;24744:2;24733:9;24729:18;24721:26;;24793:9;24787:4;24783:20;24779:1;24768:9;24764:17;24757:47;24821:131;24947:4;24821:131;:::i;:::-;24813:139;;24711:248;;;:::o;24965:419::-;;25169:2;25158:9;25154:18;25146:26;;25218:9;25212:4;25208:20;25204:1;25193:9;25189:17;25182:47;25246:131;25372:4;25246:131;:::i;:::-;25238:139;;25136:248;;;:::o;25390:419::-;;25594:2;25583:9;25579:18;25571:26;;25643:9;25637:4;25633:20;25629:1;25618:9;25614:17;25607:47;25671:131;25797:4;25671:131;:::i;:::-;25663:139;;25561:248;;;:::o;25815:419::-;;26019:2;26008:9;26004:18;25996:26;;26068:9;26062:4;26058:20;26054:1;26043:9;26039:17;26032:47;26096:131;26222:4;26096:131;:::i;:::-;26088:139;;25986:248;;;:::o;26240:419::-;;26444:2;26433:9;26429:18;26421:26;;26493:9;26487:4;26483:20;26479:1;26468:9;26464:17;26457:47;26521:131;26647:4;26521:131;:::i;:::-;26513:139;;26411:248;;;:::o;26665:419::-;;26869:2;26858:9;26854:18;26846:26;;26918:9;26912:4;26908:20;26904:1;26893:9;26889:17;26882:47;26946:131;27072:4;26946:131;:::i;:::-;26938:139;;26836:248;;;:::o;27090:419::-;;27294:2;27283:9;27279:18;27271:26;;27343:9;27337:4;27333:20;27329:1;27318:9;27314:17;27307:47;27371:131;27497:4;27371:131;:::i;:::-;27363:139;;27261:248;;;:::o;27515:419::-;;27719:2;27708:9;27704:18;27696:26;;27768:9;27762:4;27758:20;27754:1;27743:9;27739:17;27732:47;27796:131;27922:4;27796:131;:::i;:::-;27788:139;;27686:248;;;:::o;27940:419::-;;28144:2;28133:9;28129:18;28121:26;;28193:9;28187:4;28183:20;28179:1;28168:9;28164:17;28157:47;28221:131;28347:4;28221:131;:::i;:::-;28213:139;;28111:248;;;:::o;28365:419::-;;28569:2;28558:9;28554:18;28546:26;;28618:9;28612:4;28608:20;28604:1;28593:9;28589:17;28582:47;28646:131;28772:4;28646:131;:::i;:::-;28638:139;;28536:248;;;:::o;28790:419::-;;28994:2;28983:9;28979:18;28971:26;;29043:9;29037:4;29033:20;29029:1;29018:9;29014:17;29007:47;29071:131;29197:4;29071:131;:::i;:::-;29063:139;;28961:248;;;:::o;29215:419::-;;29419:2;29408:9;29404:18;29396:26;;29468:9;29462:4;29458:20;29454:1;29443:9;29439:17;29432:47;29496:131;29622:4;29496:131;:::i;:::-;29488:139;;29386:248;;;:::o;29640:419::-;;29844:2;29833:9;29829:18;29821:26;;29893:9;29887:4;29883:20;29879:1;29868:9;29864:17;29857:47;29921:131;30047:4;29921:131;:::i;:::-;29913:139;;29811:248;;;:::o;30065:419::-;;30269:2;30258:9;30254:18;30246:26;;30318:9;30312:4;30308:20;30304:1;30293:9;30289:17;30282:47;30346:131;30472:4;30346:131;:::i;:::-;30338:139;;30236:248;;;:::o;30490:419::-;;30694:2;30683:9;30679:18;30671:26;;30743:9;30737:4;30733:20;30729:1;30718:9;30714:17;30707:47;30771:131;30897:4;30771:131;:::i;:::-;30763:139;;30661:248;;;:::o;30915:419::-;;31119:2;31108:9;31104:18;31096:26;;31168:9;31162:4;31158:20;31154:1;31143:9;31139:17;31132:47;31196:131;31322:4;31196:131;:::i;:::-;31188:139;;31086:248;;;:::o;31340:222::-;;31471:2;31460:9;31456:18;31448:26;;31484:71;31552:1;31541:9;31537:17;31528:6;31484:71;:::i;:::-;31438:124;;;;:::o;31568:283::-;;31634:2;31628:9;31618:19;;31676:4;31668:6;31664:17;31783:6;31771:10;31768:22;31747:18;31735:10;31732:34;31729:62;31726:2;;;31794:18;;:::i;:::-;31726:2;31834:10;31830:2;31823:22;31608:243;;;;:::o;31857:331::-;;32008:18;32000:6;31997:30;31994:2;;;32030:18;;:::i;:::-;31994:2;32115:4;32111:9;32104:4;32096:6;32092:17;32088:33;32080:41;;32176:4;32170;32166:15;32158:23;;31923:265;;;:::o;32194:332::-;;32346:18;32338:6;32335:30;32332:2;;;32368:18;;:::i;:::-;32332:2;32453:4;32449:9;32442:4;32434:6;32430:17;32426:33;32418:41;;32514:4;32508;32504:15;32496:23;;32261:265;;;:::o;32532:132::-;;32622:3;32614:11;;32652:4;32647:3;32643:14;32635:22;;32604:60;;;:::o;32670:114::-;;32771:5;32765:12;32755:22;;32744:40;;;:::o;32790:98::-;;32875:5;32869:12;32859:22;;32848:40;;;:::o;32894:99::-;;32980:5;32974:12;32964:22;;32953:40;;;:::o;32999:113::-;;33101:4;33096:3;33092:14;33084:22;;33074:38;;;:::o;33118:184::-;;33251:6;33246:3;33239:19;33291:4;33286:3;33282:14;33267:29;;33229:73;;;;:::o;33308:168::-;;33425:6;33420:3;33413:19;33465:4;33460:3;33456:14;33441:29;;33403:73;;;;:::o;33482:169::-;;33600:6;33595:3;33588:19;33640:4;33635:3;33631:14;33616:29;;33578:73;;;;:::o;33657:148::-;;33796:3;33781:18;;33771:34;;;;:::o;33811:305::-;;33870:20;33888:1;33870:20;:::i;:::-;33865:25;;33904:20;33922:1;33904:20;:::i;:::-;33899:25;;34058:1;33990:66;33986:74;33983:1;33980:81;33977:2;;;34064:18;;:::i;:::-;33977:2;34108:1;34105;34101:9;34094:16;;33855:261;;;;:::o;34122:185::-;;34179:20;34197:1;34179:20;:::i;:::-;34174:25;;34213:20;34231:1;34213:20;:::i;:::-;34208:25;;34252:1;34242:2;;34257:18;;:::i;:::-;34242:2;34299:1;34296;34292:9;34287:14;;34164:143;;;;:::o;34313:348::-;;34376:20;34394:1;34376:20;:::i;:::-;34371:25;;34410:20;34428:1;34410:20;:::i;:::-;34405:25;;34598:1;34530:66;34526:74;34523:1;34520:81;34515:1;34508:9;34501:17;34497:105;34494:2;;;34605:18;;:::i;:::-;34494:2;34653:1;34650;34646:9;34635:20;;34361:300;;;;:::o;34667:191::-;;34727:20;34745:1;34727:20;:::i;:::-;34722:25;;34761:20;34779:1;34761:20;:::i;:::-;34756:25;;34800:1;34797;34794:8;34791:2;;;34805:18;;:::i;:::-;34791:2;34850:1;34847;34843:9;34835:17;;34712:146;;;;:::o;34864:96::-;;34930:24;34948:5;34930:24;:::i;:::-;34919:35;;34909:51;;;:::o;34966:90::-;;35043:5;35036:13;35029:21;35018:32;;35008:48;;;:::o;35062:77::-;;35128:5;35117:16;;35107:32;;;:::o;35145:149::-;;35221:66;35214:5;35210:78;35199:89;;35189:105;;;:::o;35300:126::-;;35377:42;35370:5;35366:54;35355:65;;35345:81;;;:::o;35432:77::-;;35498:5;35487:16;;35477:32;;;:::o;35515:154::-;35599:6;35594:3;35589;35576:30;35661:1;35652:6;35647:3;35643:16;35636:27;35566:103;;;:::o;35675:307::-;35743:1;35753:113;35767:6;35764:1;35761:13;35753:113;;;35852:1;35847:3;35843:11;35837:18;35833:1;35828:3;35824:11;35817:39;35789:2;35786:1;35782:10;35777:15;;35753:113;;;35884:6;35881:1;35878:13;35875:2;;;35964:1;35955:6;35950:3;35946:16;35939:27;35875:2;35724:258;;;;:::o;35988:320::-;;36069:1;36063:4;36059:12;36049:22;;36116:1;36110:4;36106:12;36137:18;36127:2;;36193:4;36185:6;36181:17;36171:27;;36127:2;36255;36247:6;36244:14;36224:18;36221:38;36218:2;;;36274:18;;:::i;:::-;36218:2;36039:269;;;;:::o;36314:233::-;;36376:24;36394:5;36376:24;:::i;:::-;36367:33;;36422:66;36415:5;36412:77;36409:2;;;36492:18;;:::i;:::-;36409:2;36539:1;36532:5;36528:13;36521:20;;36357:190;;;:::o;36553:100::-;;36621:26;36641:5;36621:26;:::i;:::-;36610:37;;36600:53;;;:::o;36659:94::-;;36727:20;36741:5;36727:20;:::i;:::-;36716:31;;36706:47;;;:::o;36759:79::-;;36827:5;36816:16;;36806:32;;;:::o;36844:176::-;;36893:20;36911:1;36893:20;:::i;:::-;36888:25;;36927:20;36945:1;36927:20;:::i;:::-;36922:25;;36966:1;36956:2;;36971:18;;:::i;:::-;36956:2;37012:1;37009;37005:9;37000:14;;36878:142;;;;:::o;37026:180::-;37074:77;37071:1;37064:88;37171:4;37168:1;37161:15;37195:4;37192:1;37185:15;37212:180;37260:77;37257:1;37250:88;37357:4;37354:1;37347:15;37381:4;37378:1;37371:15;37398:180;37446:77;37443:1;37436:88;37543:4;37540:1;37533:15;37567:4;37564:1;37557:15;37584:180;37632:77;37629:1;37622:88;37729:4;37726:1;37719:15;37753:4;37750:1;37743:15;37770:102;;37862:2;37858:7;37853:2;37846:5;37842:14;37838:28;37828:38;;37818:54;;;:::o;37878:94::-;;37959:5;37955:2;37951:14;37930:35;;37920:52;;;:::o;37978:122::-;38051:24;38069:5;38051:24;:::i;:::-;38044:5;38041:35;38031:2;;38090:1;38087;38080:12;38031:2;38021:79;:::o;38106:116::-;38176:21;38191:5;38176:21;:::i;:::-;38169:5;38166:32;38156:2;;38212:1;38209;38202:12;38156:2;38146:76;:::o;38228:120::-;38300:23;38317:5;38300:23;:::i;:::-;38293:5;38290:34;38280:2;;38338:1;38335;38328:12;38280:2;38270:78;:::o;38354:122::-;38427:24;38445:5;38427:24;:::i;:::-;38420:5;38417:35;38407:2;;38466:1;38463;38456:12;38407:2;38397:79;:::o

Swarm Source

ipfs://9165f029d8196168e9350bb3e3c82faf06864f1e827a5a92c910b842bda38fdb
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.