ETH Price: $2,507.55 (-0.12%)

Token

ARTGLIXXX GENESIS (ARTGLIXXX)
 

Overview

Max Total Supply

2,851 ARTGLIXXX

Holders

316

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
stephanfivenine.eth
Balance
7 ARTGLIXXX
0xf7c2c336d0b8d40e4091f561d9d53f9e38bea00d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ARTGLIXXX

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-23
*/

// SPDX-License-Identifier: CONSTANTLY WANTS TO MAKE THE WORLD BEAUTIFUL

// ///..//*..//..//,..////////#,,,,,,,,,,,,,,,,,&&&&&,**(*./,///*%(.%,,%*,#%/%#(///
// *#%%%%%%%%%%/%/////*&@@(*#(#,,,,,,,,,,,,,,,,,@@@@@/***,./,///%./%#(%.#%/.(.*////
// *******%%%%(/(/(/(/******#(#,,,,,,,,,,,,,,,,,********((#((@%%.........%@@@@@@@@@
// #############%%%%%%%%%%%%%,,,,,,,,,,,,,,,,,**,*,/.**,,///////####%####,.///,*%*,
// .*,%,%./%#%(./,(,(*#*#*#*,,,**.,,,********//(****//(#((#(@@@@@*@@@@@&&&&&***&&&&
// /.%((%,*#&%% %.%%#&@&&&.%,*#*,,,.*,,******,,,,,,,,,##,....,,,,*,,,,,,,,,,%*%,,&&

//  █████╗ ██████╗ ████████╗ ██████╗ ██╗     ██╗██╗  ██╗██╗  ██╗██╗  ██╗
// ██╔══██╗██╔══██╗╚══██╔══╝██╔════╝ ██║     ██║╚██╗██╔╝╚██╗██╔╝╚██╗██╔╝
// ███████║██████╔╝   ██║   ██║  ███╗██║     ██║ ╚███╔╝  ╚███╔╝  ╚███╔╝ 
// ██╔══██║██╔══██╗   ██║   ██║   ██║██║     ██║ ██╔██╗  ██╔██╗  ██╔██╗ 
// ██║  ██║██║  ██║   ██║   ╚██████╔╝███████╗██║██╔╝ ██╗██╔╝ ██╗██╔╝ ██╗
// ╚═╝  ╚═╝╚═╝  ╚═╝   ╚═╝    ╚═════╝ ╚══════╝╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝
                                                                     
//  ██████╗ ███████╗███╗   ██╗███████╗███████╗██╗███████╗               
// ██╔════╝ ██╔════╝████╗  ██║██╔════╝██╔════╝██║██╔════╝               
// ██║  ███╗█████╗  ██╔██╗ ██║█████╗  ███████╗██║███████╗               
// ██║   ██║██╔══╝  ██║╚██╗██║██╔══╝  ╚════██║██║╚════██║               
// ╚██████╔╝███████╗██║ ╚████║███████╗███████║██║███████║               
//  ╚═════╝ ╚══════╝╚═╝  ╚═══╝╚══════╝╚══════╝╚═╝╚══════╝               
                                                                                           
// ,*//%@@@*%%(##@@@@&&&&&/,,//.(%@@@##%@##########%&**/,,,@@@@@@@@@@&&&&#######***
// ,*(/%@@@#*,/**((((((((&/,,/.**,,,,%%/,%%%%%&#%%&&&%%%#,,@@@@@@@@@@&&&&#######///
// ,...%@@@@@@@@@,,,,,,,,@/,,@&**,,,,##/,,/%%%&*/(//,/*/(,,@@@@@@@@@@&&&%....../***
// ,,,(##########((((&@@@@,,,*&**,,,,,,,,*##/#*//////*,**,,@@@@@@@@@@@@@%(%***%&&#%
// ,,,(############,,,,,,,,,,(#/&,,,,,,,,(*,/,(*%%%((%%##@@@@@@@@@@@@@@@&@@@/*#@&#(
// ,***/((%##%(//((#((##((((,,/*.%,/%/#*(*(*(#(#///####.,///(////(#./(/////*(#/////                                                                                                                                           

// first official GLICPIXXXVER002 on-chain remix project 

// by berk aka princesscamel aka guerrilla pimp minion god bastard

// @berkozdemir - berkozdemir.com - linktr.ee/0xberk - twitter.com/berkozdemir
// https://artglixxx.io/
// https://glicpixxx.love/

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


pragma solidity ^0.8.0;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

pragma solidity ^0.8.0;

/**
 * @dev Interface of GLIXTOKEN.
 */
interface IGLIX {
    function balanceOf(address account) external view returns (uint256);
    function mint(address to, uint256 amount) external returns(bool);
    function burn(address from, uint256 amount) external returns(bool);
    function minterPermissionCheck(address _address) external view returns(bool);
    function burnerPermissionCheck(address _address) external view returns(bool);
}

pragma solidity ^0.8.0;

contract ARTGLIXXX is ERC165, IERC2981Royalties, ERC721, Ownable {

    using Strings for uint256;

    uint public constant TOTAL_GLICPIXXX = 11500;
    bool public mintOpen;

    mapping (uint256 => uint256) public creationDates;
    mapping (uint256 => address) public creators;

    string public GENERATOR_ADDRESS;

    uint public BASE_MINT_PRICE = 100 ether; // 100 GLIX PER GENERATION

    address private GLICPIXXXVER002_ADDRESS = 0x1C60841b70821dcA733c9B1a26dBe1a33338bD43;
    address private GLIXTOKEN_ADDRESS = 0x4e09d18baa1dA0b396d1A48803956FAc01c28E88;

    IERC721 GLICPIXXXVER002 = IERC721(GLICPIXXXVER002_ADDRESS);
    IGLIX GLIXTOKEN = IGLIX(GLIXTOKEN_ADDRESS);

    mapping(address => uint256) public balanceELDEST;
    mapping(uint256 => uint256) public ARTGLIXXX_NEXT_GEN;

    mapping(address => uint256) public GLIXREWARDS;
	mapping(address => uint256) public GLIX_LAST_UPDATE;

    uint public DAILY_YIELD_RATE = 10 ether; // 10 $GLIX PER DAY
    uint public YIELD_END = block.timestamp + 315360000; // yield will go on for 10 years

    event RewardPaid(address indexed user, uint256 reward);
    event Mint(address indexed user, uint256 tokenId, uint256 Generation);

    // string public script;

    struct ProjectInfo {
        uint projectId;
        string name;
        string description;
        string license;
        string artist;
        string script;
        address royaltyReceiver;
        uint royaltyAmount;
    }

    ProjectInfo public projectInfo;

    constructor() ERC721("ARTGLIXXX GENESIS","ARTGLIXXX")  {

        setBaseURI("https://server.artglixxx.io/api/project/0/token/");
        setGeneratorAddress("https://server.artglixxx.io/generate/project/0/token/");

        projectInfo = ProjectInfo(
            0,
            "ARTGLIXXX GENESIS",
            "ARTGLIXXX GENESIS is the first badass on-chain remix collection of GLICPIXXX. Holding mouse on canvas and moving on x-axis changes the frame rate.",
            "Your ARTGLIXXX, your call. An ARTGLIXXX comes with full non-commercial/commercial rights.",
            "Berk aka Princess Camel aka Guerilla Pimp Minion God Bastard",
            "class Random{constructor(e){this.seed=e}random_dec(){return this.seed^=this.seed<<13,this.seed^=this.seed>>17,this.seed^=this.seed<<5,(this.seed<0?1+~this.seed:this.seed)%1e3/1e3}random_between(e,a){return e+(a-e)*this.random_dec()}random_int(e,a){return Math.floor(this.random_between(e,a+1))}random_choice(e){return e[Math.floor(this.random_between(0,.99*e.length))]}random_exp(e,a,n){return floor(map(Math.exp(map(this.random_between(0,999),0,1e3,0,n)),Math.exp(0),Math.exp(n),e,a+1))}}function hue2rgb(e,a,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(a-e)*n:n<.5?a:n<2/3?e+(a-e)*(2/3-n)*6:e}function changeHue(e,a,n,r){var t=rgbToHSL(e,a,n);return t.h+=r,t.h>360?t.h-=360:t.h<0&&(t.h+=360),hslToRGB(t)}function rgbToHSL(e,a,n){e/=255,a/=255,n/=255;var r=Math.max(e,a,n),t=Math.min(e,a,n),o=r-t,i=(r+t)/2;return{h:0==o?0:r==e?(a-n)/o%6*60:r==a?60*((n-e)/o+2):60*((e-a)/o+4),s:0==o?0:o/(1-Math.abs(2*i-1)),l:i}}function hslToRGB(e){var a,n,r,t=e.h,o=e.s,i=e.l,m=(1-Math.abs(2*i-1))*o,s=m*(1-Math.abs(t/60%2-1)),d=i-m/2;return t<60?(a=m,n=s,r=0):t<120?(a=s,n=m,r=0):t<180?(a=0,n=m,r=s):t<240?(a=0,n=s,r=m):t<300?(a=s,n=0,r=m):(a=m,n=0,r=s),[a=normalize_rgb_value(a,d),n=normalize_rgb_value(n,d),r=normalize_rgb_value(r,d)]}function normalize_rgb_value(e,a){return(e=Math.floor(255*(e+a)))<0&&(e=0),e}function hueShift(e,a){e.loadPixels();for(var n=0;n<e.pixels.length;n+=4){let r=changeHue(e.pixels[n],e.pixels[n+1],e.pixels[n+2],a);e.pixels[n]=r[0],e.pixels[n+1]=r[1],e.pixels[n+2]=r[2]}e.updatePixels()}function componentToHex(e){var a=e.toString(16);return 1==a.length?'0'+a:a}const rgbtohex=(e,a,n)=>'#'+componentToHex(e)+componentToHex(a)+componentToHex(n);let tokenData=window.tokenHash,seed=parseInt(tokenData.slice(0,16),16),rng=new Random(seed);var SIZE;let glicpixxxOrigin=window.glicpixxxOrigin,filenames=window.imagesList.split(',');var images=[];let params={},oncee=!1;function preload(){for(let e in filenames)images.push(loadImage(filenames[e]))}function setup(){params.GRIDS=rng.random_exp(1,16,2),params.DRAW_MODE=rng.random_exp(1,6,2),params.IMAGE_FILTER=rng.random_exp(0,7,2),5!=params.IMAGE_FILTER&&6!=params.IMAGE_FILTER||(params.HUE_DEGREE=rng.random_int(1,360)),params.ROTATE_MODE=rng.random_exp(0,3,1.5),1==params.ROTATE_MODE?params.ROTATE_N=[...new Set(Array.apply(0,new Array(rng.random_int(1,4))).map(e=>rng.random_int(1,45)))]:2!=params.ROTATE_MODE&&3!=params.ROTATE_MODE||(params.ROTATE_N=rng.random_int(1,45)),params.bgcolor=rgbtohex(rng.random_int(0,255),rng.random_int(0,255),rng.random_int(0,255)),SIZE=Math.min(window.innerHeight,window.innerWidth),createCanvas(SIZE,SIZE),background(params.bgcolor)}function draw(){noSmooth(),mouseIsPressed?frameRate(map(mouseX,0,SIZE,5,60,!0)):frameRate(60);let e=width/params.GRIDS;angleMode(DEGREES),rot=0;for(let a=0;a<params.GRIDS;a++)for(let n=0;n<params.GRIDS;n++){let r=rng.random_choice(images);rotateMe(params.ROTATE_MODE,params.ROTATE_N),applyFilter(params.IMAGE_FILTER,r),DRAW_MODE(params.DRAW_MODE,r,e,n,a)}}function DRAW_MODE(e,a,n,r,t){switch(e){case 1:imageMode(CENTER),image(a,n*r+n/2,n*t+n/2,rng.random_between(0,n),rng.random_between(0,n));break;case 2:imageMode(CORNER),image(a,n*r,n*t,rng.random_between(0,n),rng.random_between(0,n));break;case 3:imageMode(CORNERS),image(a,n*r+rng.random_between(0,n),n*t+rng.random_between(0,n),n*r+rng.random_between(0,n),n*t+rng.random_between(0,n));break;case 4:imageMode(CENTER),image(a,n*r+rng.random_between(0,n),n*t+rng.random_between(0,n),n*r+rng.random_between(0,n),n*t+rng.random_between(0,n));break;case 5:imageMode(CORNER),image(a,n*r+rng.random_between(0,n),n*t+rng.random_between(0,n),n*r+rng.random_between(0,n),n*t+rng.random_between(0,n));break;case 6:imageMode(CORNERS),image(a,rng.random_between(0,SIZE),rng.random_between(0,SIZE),rng.random_between(0,SIZE),rng.random_between(0,SIZE))}}function applyFilter(e,a,n){switch(e){case 1:0==oncee&&(a.filter(INVERT),oncee=!0);break;case 2:a.filter(INVERT);break;case 3:a.filter(POSTERIZE,4);break;case 4:a.filter(POSTERIZE,2),a.filter(INVERT);break;case 5:0==oncee&&(hueShift(a,params.HUE_DEGREE),oncee=!0);break;case 6:hueShift(a,params.HUE_DEGREE);break;case 7:a.filter(GRAY)}}function rotateMe(e,a){switch(e){case 1:rotate(rng.random_choice(a));break;case 2:rotate(rng.random_between(1,a));break;case 3:rotate(a)}}",
            0xe49381184A49CD2A48e4b09a979524e672Fdd10E, // glicpixyz.eth
            500 // %5 royalty
        );
    
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        receiver = projectInfo.royaltyReceiver;
        royaltyAmount = (value * projectInfo.royaltyAmount) / 10000;
    }

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

    /**
     * @dev Unique hash for token to generate the deterministic artwork.
     */
    function tokenHash(uint256 tokenId) public view returns(bytes32){
        require(_exists(tokenId), "DOES NOT EXIST");
        return bytes32(keccak256(abi.encodePacked(address(this), creationDates[tokenId], creators[tokenId], tokenId)));
    }
    
    /**
     * @dev Url to view generative art
     */
    function generatorAddress(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "DOES NOT EXIST");
        return string(abi.encodePacked(GENERATOR_ADDRESS, tokenId.toString()));
    }

    /**
     * @dev Calculates the amount of $GLIX to be burned to mint an ARTGLIXXX.
     */
    function calculateMint(uint _id) public view returns(uint) {
        return ARTGLIXXX_NEXT_GEN[_id % TOTAL_GLICPIXXX] * BASE_MINT_PRICE;
    }

    /**
     * @dev Minting function
     */
    function generateARTGLIXXX(address _to, uint _glicpixxxId) public {
        require(mintOpen == true, "Minting isn't open");
        require(GLICPIXXXVER002.ownerOf(_glicpixxxId) == msg.sender, "Not owner of GLICPIXXX");
        uint gen = ARTGLIXXX_NEXT_GEN[_glicpixxxId];
        if (gen > 0) {
            GLIXTOKEN.burn(msg.sender, gen * BASE_MINT_PRICE);       
        }
        uint mintIndex = _glicpixxxId + (TOTAL_GLICPIXXX * gen);
        _safeMint(_to, mintIndex);
        emit Mint(_to, mintIndex, gen);
        creationDates[mintIndex] = block.number;
        creators[mintIndex] = msg.sender;
        if (gen == 0){
            updateGlixRewardOnMint(_to);
            balanceELDEST[_to]++;
        }
        ARTGLIXXX_NEXT_GEN[_glicpixxxId]++;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
		return a < b ? a : b;
	}

    function exists(uint256 tokenId) external view returns (bool) {
        return _exists(tokenId);
    }

    /**
     * @dev As the function name says.
     */
    function getTokenGeneration(uint256 tokenId) external view returns (uint256) {
        require(_exists(tokenId));
        return tokenId / TOTAL_GLICPIXXX;
    }

    /**
     * @dev Returns the amount of $GLIX address can claim at the moment.
     */
    function getTotalClaimable(address _user) external view returns (uint256) {
        uint256 time = min(block.timestamp, YIELD_END);
		uint256 timerUser = GLIX_LAST_UPDATE[_user];
		if (timerUser > 0)
			return GLIXREWARDS[_user] + (balanceELDEST[_user] * DAILY_YIELD_RATE * (time - timerUser) / 86400);
        else
            return 0;
    }

	// updated_amount = (balanceELDEST(user) * base_rate * delta / 86400) + amount * initial rate
    /**
     * @dev Called inside mint function
     */
	function updateGlixRewardOnMint(address _user) internal {
		uint256 time = min(block.timestamp, YIELD_END);
		uint256 timerUser = GLIX_LAST_UPDATE[_user];
		if (timerUser > 0)
			GLIXREWARDS[_user] += (balanceELDEST[_user] * DAILY_YIELD_RATE * (time - timerUser) / 86400);
        if (timerUser != YIELD_END)
		    GLIX_LAST_UPDATE[_user] = time;
	}

	/**
     * @dev Called on transfers
     */
	function updateGlixReward(address _from, address _to, uint256 _tokenId) internal {
		if (_tokenId < TOTAL_GLICPIXXX) {
			uint256 time = min(block.timestamp, YIELD_END);
			uint256 timerFrom = GLIX_LAST_UPDATE[_from];
			if (timerFrom > 0)
				GLIXREWARDS[_from] += (balanceELDEST[_from] * DAILY_YIELD_RATE * (time - timerFrom) / 86400);
			if (timerFrom != YIELD_END)
				GLIX_LAST_UPDATE[_from] = time;
			if (_to != address(0)) {
				uint256 timerTo = GLIX_LAST_UPDATE[_to];
				if (timerTo > 0)
					GLIXREWARDS[_to] += (balanceELDEST[_to] * DAILY_YIELD_RATE * (time - timerTo) / 86400);
				if (timerTo != YIELD_END)
					GLIX_LAST_UPDATE[_to] = time;
			}
		}
	}

    /**
     * @dev Calculates the current claimable $GLIX and mints to the address
     */
    function getReward() public {
        updateGlixReward(msg.sender, address(0), 0);
		uint256 reward = GLIXREWARDS[msg.sender];
		if (reward > 0) {
			GLIXREWARDS[msg.sender] = 0;
			GLIXTOKEN.mint(msg.sender, reward);
			emit RewardPaid(msg.sender, reward);
		}
	}

    function transferFrom(address from, address to, uint256 tokenId) public override {
		updateGlixReward(from, to, tokenId);
		if (tokenId < TOTAL_GLICPIXXX)
		{
			balanceELDEST[from]--;
			balanceELDEST[to]++;
		}
		ERC721.transferFrom(from, to, tokenId);
	}

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override {
		updateGlixReward(from, to, tokenId);
		if (tokenId < TOTAL_GLICPIXXX)
		{
			balanceELDEST[from]--;
			balanceELDEST[to]++;
		}
		ERC721.safeTransferFrom(from, to, tokenId, _data);
	}

    // ONLYOWNER FUNCTIONS
        
    /**
     * @dev Sets URL to view the token art.
     */
    function setGeneratorAddress(string memory _address) public onlyOwner {
        GENERATOR_ADDRESS = _address;
    }

    /**
     * @dev Set base metadata URI.
     */
    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }
    
    /**
     * @dev Pause/resume NFT mints.
     */
    function toggleMint() public onlyOwner {
        mintOpen = !mintOpen;
    }

    function changeProjectName(string memory _name) public onlyOwner {
        projectInfo.name = _name;
    }

    function changeProjectDescription(string memory _description) public onlyOwner {
        projectInfo.description = _description;
    }
    
    function changeProjectArtistName(string memory _artist) public onlyOwner {
        projectInfo.artist = _artist;
    }

    function changeProjectLicense(string memory _license) public onlyOwner {
        projectInfo.license = _license;
    }
    
    function changeProjectRoyaltyReceiver(address _royaltyReceiver) public onlyOwner {
        projectInfo.royaltyReceiver = _royaltyReceiver;
    }

    function changeProjectRoyaltyAmount(uint _royaltyAmount) public onlyOwner {
        require (_royaltyAmount < 2500);
        projectInfo.royaltyAmount = _royaltyAmount;
    }

    function changeProjectScript(string memory _script) public onlyOwner {
        projectInfo.script = _script;
    }
    
}

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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"Generation","type":"uint256"}],"name":"Mint","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ARTGLIXXX_NEXT_GEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAILY_YIELD_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENERATOR_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"GLIXREWARDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"GLIX_LAST_UPDATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_GLICPIXXX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YIELD_END","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":[{"internalType":"address","name":"","type":"address"}],"name":"balanceELDEST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_id","type":"uint256"}],"name":"calculateMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_artist","type":"string"}],"name":"changeProjectArtistName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_description","type":"string"}],"name":"changeProjectDescription","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeProjectLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"changeProjectName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltyAmount","type":"uint256"}],"name":"changeProjectRoyaltyAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"}],"name":"changeProjectRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_script","type":"string"}],"name":"changeProjectScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creationDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_glicpixxxId","type":"uint256"}],"name":"generateARTGLIXXX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"generatorAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenGeneration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTotalClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"projectInfo","outputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"license","type":"string"},{"internalType":"string","name":"artist","type":"string"},{"internalType":"string","name":"script","type":"string"},{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_address","type":"string"}],"name":"setGeneratorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","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"}]

608060405268056bc75e2d63100000600e55731c60841b70821dca733c9b1a26dbe1a33338bd43600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550734e09d18baa1da0b396d1a48803956fac01c28e88601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550678ac7230489e800006017556312cc0300426200019f91906200097a565b601855348015620001af57600080fd5b506040518060400160405280601181526020017f415254474c495858582047454e455349530000000000000000000000000000008152506040518060400160405280600981526020017f415254474c4958585800000000000000000000000000000000000000000000008152506200024d7f01ffc9a7000000000000000000000000000000000000000000000000000000006200061d60201b60201c565b81600690805190602001906200026592919062000891565b5080600790805190602001906200027e92919062000891565b50620002b07f80ac58cd000000000000000000000000000000000000000000000000000000006200061d60201b60201c565b620002e17f5b5e139f000000000000000000000000000000000000000000000000000000006200061d60201b60201c565b620003127f780e9d63000000000000000000000000000000000000000000000000000000006200061d60201b60201c565b5050600062000326620006f560201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620003ef604051806060016040528060308152602001620078bd60309139620006fd60201b60201c565b620004196040518060600160405280603581526020016200668f60359139620007a060201b60201c565b604051806101000160405280600081526020016040518060400160405280601181526020017f415254474c495858582047454e4553495300000000000000000000000000000081525081526020016040518060c0016040528060928152602001620066c4609291398152602001604051806080016040528060598152602001620078286059913981526020016040518060600160405280603c815260200162007881603c913981526020016040518061110001604052806110d28152602001620067566110d29139815260200173e49381184a49cd2a48e4b09a979524e672fdd10e73ffffffffffffffffffffffffffffffffffffffff1681526020016101f481525060196000820151816000015560208201518160010190805190602001906200054692919062000891565b5060408201518160020190805190602001906200056592919062000891565b5060608201518160030190805190602001906200058492919062000891565b506080820151816004019080519060200190620005a392919062000891565b5060a0820151816005019080519060200190620005c292919062000891565b5060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e0820151816007015590505062000b31565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006809062000a38565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6200070d620006f560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620007336200084b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200078c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007839062000aaa565b60405180910390fd5b6200079d816200087560201b60201c565b50565b620007b0620006f560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620007d66200084b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200082f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008269062000aaa565b60405180910390fd5b80600d90805190602001906200084792919062000891565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600990805190602001906200088d92919062000891565b5050565b8280546200089f9062000afb565b90600052602060002090601f016020900481019282620008c357600085556200090f565b82601f10620008de57805160ff19168380011785556200090f565b828001600101855582156200090f579182015b828111156200090e578251825591602001919060010190620008f1565b5b5090506200091e919062000922565b5090565b5b808211156200093d57600081600090555060010162000923565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620009878262000941565b9150620009948362000941565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620009cc57620009cb6200094b565b5b828201905092915050565b600082825260208201905092915050565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b600062000a20601c83620009d7565b915062000a2d82620009e8565b602082019050919050565b6000602082019050818103600083015262000a538162000a11565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000a92602083620009d7565b915062000a9f8262000a5a565b602082019050919050565b6000602082019050818103600083015262000ac58162000a83565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b1457607f821691505b6020821081141562000b2b5762000b2a62000acc565b5b50919050565b615b4e8062000b416000396000f3fe608060405234801561001057600080fd5b50600436106103265760003560e01c806363d96941116101b8578063b7fc53b511610104578063d4c7c83e116100a2578063f1a272191161007c578063f1a2721914610a13578063f2fde38b14610a2f578063f6677cd014610a4b578063fb85936d14610a7b57610326565b8063d4c7c83e146109ab578063df8a10b4146109c7578063e985e9c5146109e357610326565b8063c87b56dd116100de578063c87b56dd14610911578063c8a0122614610941578063cd53d08e14610971578063d3dd5fe0146109a157610326565b8063b7fc53b514610895578063b88d4fde146108c5578063c81b70c4146108e157610326565b80638da5cb5b11610171578063a22cb4651161014b578063a22cb465146107fd578063a386439714610819578063a8f14af614610849578063aed225d51461086557610326565b80638da5cb5b1461079157806391785e6d146107af57806395d89b41146107df57610326565b806363d96941146106bb57806364cfc2dd146106eb5780636c0360eb1461070957806370a0823114610727578063715018a6146107575780638462151c1461076157610326565b8063267e8ab61161027757806342842e0e116102305780634f6ccce71161020a5780634f6ccce71461062357806355f804b314610653578063578e2c0c1461066f5780636352211e1461068b57610326565b806342842e0e146105bb5780634ba80c1e146105d75780634f558e79146105f357610326565b8063267e8ab6146104e65780632a55205a146105165780632d3454c5146105475780632ee2ac36146105635780632f745c59146105815780633d18b912146105b157610326565b806318160ddd116102e45780632137e2e1116102be5780632137e2e11461047457806322aeffc11461049057806323b872dd146104ac57806324bbd049146104c857610326565b806318160ddd14610401578063185b69101461041f5780631a8106a01461044457610326565b80629f69391461032b57806301ffc9a714610349578063054ee7891461037957806306fdde0314610397578063081812fc146103b5578063095ea7b3146103e5575b600080fd5b610333610a99565b60405161034091906141aa565b60405180910390f35b610363600480360381019061035e9190614231565b610a9f565b6040516103709190614279565b60405180910390f35b610381610b19565b60405161038e91906141aa565b60405180910390f35b61039f610b1f565b6040516103ac919061432d565b60405180910390f35b6103cf60048036038101906103ca919061437b565b610bb1565b6040516103dc91906143e9565b60405180910390f35b6103ff60048036038101906103fa9190614430565b610c36565b005b610409610d4e565b60405161041691906141aa565b60405180910390f35b610427610d5f565b60405161043b989796959493929190614470565b60405180910390f35b61045e6004803603810190610459919061437b565b61105d565b60405161046b91906141aa565b60405180910390f35b61048e60048036038101906104899190614646565b611075565b005b6104aa60048036038101906104a59190614430565b61110e565b005b6104c660048036038101906104c1919061468f565b6114b5565b005b6104d0611585565b6040516104dd9190614279565b60405180910390f35b61050060048036038101906104fb91906146e2565b611598565b60405161050d91906141aa565b60405180910390f35b610530600480360381019061052b919061470f565b6116c6565b60405161053e92919061474f565b60405180910390f35b610561600480360381019061055c9190614646565b611718565b005b61056b6117b1565b604051610578919061432d565b60405180910390f35b61059b60048036038101906105969190614430565b61183f565b6040516105a891906141aa565b60405180910390f35b6105b961189a565b005b6105d560048036038101906105d0919061468f565b611a2b565b005b6105f160048036038101906105ec91906146e2565b611a4b565b005b61060d6004803603810190610608919061437b565b611b0e565b60405161061a9190614279565b60405180910390f35b61063d6004803603810190610638919061437b565b611b20565b60405161064a91906141aa565b60405180910390f35b61066d60048036038101906106689190614646565b611b43565b005b61068960048036038101906106849190614646565b611bcb565b005b6106a560048036038101906106a0919061437b565b611c64565b6040516106b291906143e9565b60405180910390f35b6106d560048036038101906106d0919061437b565b611c9b565b6040516106e2919061432d565b60405180910390f35b6106f3611d17565b60405161070091906141aa565b60405180910390f35b610711611d1d565b60405161071e919061432d565b60405180910390f35b610741600480360381019061073c91906146e2565b611daf565b60405161074e91906141aa565b60405180910390f35b61075f611e6e565b005b61077b600480360381019061077691906146e2565b611fab565b6040516107889190614836565b60405180910390f35b6107996120b5565b6040516107a691906143e9565b60405180910390f35b6107c960048036038101906107c4919061437b565b6120df565b6040516107d691906141aa565b60405180910390f35b6107e7612108565b6040516107f4919061432d565b60405180910390f35b61081760048036038101906108129190614884565b61219a565b005b610833600480360381019061082e919061437b565b61231b565b60405161084091906148dd565b60405180910390f35b610863600480360381019061085e9190614646565b6123df565b005b61087f600480360381019061087a91906146e2565b612475565b60405161088c91906141aa565b60405180910390f35b6108af60048036038101906108aa91906146e2565b61248d565b6040516108bc91906141aa565b60405180910390f35b6108df60048036038101906108da9190614999565b6124a5565b005b6108fb60048036038101906108f6919061437b565b612577565b60405161090891906141aa565b60405180910390f35b61092b6004803603810190610926919061437b565b6125ae565b604051610938919061432d565b60405180910390f35b61095b6004803603810190610956919061437b565b612721565b60405161096891906141aa565b60405180910390f35b61098b6004803603810190610986919061437b565b612739565b60405161099891906143e9565b60405180910390f35b6109a961276c565b005b6109c560048036038101906109c09190614646565b612814565b005b6109e160048036038101906109dc9190614646565b6128ad565b005b6109fd60048036038101906109f89190614a1c565b612946565b604051610a0a9190614279565b60405180910390f35b610a2d6004803603810190610a28919061437b565b6129da565b005b610a496004803603810190610a4491906146e2565b612a71565b005b610a656004803603810190610a6091906146e2565b612c1d565b604051610a7291906141aa565b60405180910390f35b610a83612c35565b604051610a9091906141aa565b60405180910390f35b612cec81565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b125750610b1182612c3b565b5b9050919050565b600e5481565b606060068054610b2e90614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5a90614a8b565b8015610ba75780601f10610b7c57610100808354040283529160200191610ba7565b820191906000526020600020905b815481529060010190602001808311610b8a57829003601f168201915b5050505050905090565b6000610bbc82612ca2565b610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290614b2f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4182611c64565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990614bc1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd1612cbf565b73ffffffffffffffffffffffffffffffffffffffff161480610d005750610cff81610cfa612cbf565b612946565b5b610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690614c53565b60405180910390fd5b610d498383612cc7565b505050565b6000610d5a6002612d80565b905090565b6019806000015490806001018054610d7690614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610da290614a8b565b8015610def5780601f10610dc457610100808354040283529160200191610def565b820191906000526020600020905b815481529060010190602001808311610dd257829003601f168201915b505050505090806002018054610e0490614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3090614a8b565b8015610e7d5780601f10610e5257610100808354040283529160200191610e7d565b820191906000526020600020905b815481529060010190602001808311610e6057829003601f168201915b505050505090806003018054610e9290614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebe90614a8b565b8015610f0b5780601f10610ee057610100808354040283529160200191610f0b565b820191906000526020600020905b815481529060010190602001808311610eee57829003601f168201915b505050505090806004018054610f2090614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4c90614a8b565b8015610f995780601f10610f6e57610100808354040283529160200191610f99565b820191906000526020600020905b815481529060010190602001808311610f7c57829003601f168201915b505050505090806005018054610fae90614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610fda90614a8b565b80156110275780601f10610ffc57610100808354040283529160200191611027565b820191906000526020600020905b81548152906001019060200180831161100a57829003601f168201915b5050505050908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060070154905088565b60146020528060005260406000206000915090505481565b61107d612cbf565b73ffffffffffffffffffffffffffffffffffffffff1661109b6120b5565b73ffffffffffffffffffffffffffffffffffffffff16146110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614cbf565b60405180910390fd5b806019600401908051906020019061110a9291906140ee565b5050565b60011515600a60149054906101000a900460ff16151514611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90614d2b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016111d691906141aa565b602060405180830381865afa1580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190614d60565b73ffffffffffffffffffffffffffffffffffffffff161461126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126490614dd9565b60405180910390fd5b600060146000838152602001908152602001600020549050600081111561133d57601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33600e54846112db9190614e28565b6040518363ffffffff1660e01b81526004016112f892919061474f565b6020604051808303816000875af1158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614e97565b505b600081612cec61134d9190614e28565b836113589190614ec4565b90506113648482612d95565b8373ffffffffffffffffffffffffffffffffffffffff167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f82846040516113ac929190614f1a565b60405180910390a243600b60008381526020019081526020016000208190555033600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008214156114865761143084612db3565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061148090614f43565b91905055505b6014600084815260200190815260200160002060008154809291906114aa90614f43565b919050555050505050565b6114c0838383612f2a565b612cec81101561157557601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061151a90614f8c565b9190505550601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061156f90614f43565b91905055505b611580838383613246565b505050565b600a60149054906101000a900460ff1681565b6000806115a7426018546132a6565b90506000601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156116ba576201518081836116069190614fb6565b601754601360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116539190614e28565b61165d9190614e28565b6116679190615019565b601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116b19190614ec4565b925050506116c1565b6000925050505b919050565b600080601960060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612710601960070154846117059190614e28565b61170f9190615019565b90509250929050565b611720612cbf565b73ffffffffffffffffffffffffffffffffffffffff1661173e6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90614cbf565b60405180910390fd5b80601960050190805190602001906117ad9291906140ee565b5050565b600d80546117be90614a8b565b80601f01602080910402602001604051908101604052809291908181526020018280546117ea90614a8b565b80156118375780601f1061180c57610100808354040283529160200191611837565b820191906000526020600020905b81548152906001019060200180831161181a57829003601f168201915b505050505081565b600061189282600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206132bf90919063ffffffff16565b905092915050565b6118a633600080612f2a565b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611a28576000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b815260040161199592919061474f565b6020604051808303816000875af11580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190614e97565b503373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048682604051611a1f91906141aa565b60405180910390a25b50565b611a46838383604051806020016040528060008152506124a5565b505050565b611a53612cbf565b73ffffffffffffffffffffffffffffffffffffffff16611a716120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90614cbf565b60405180910390fd5b80601960060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611b1982612ca2565b9050919050565b600080611b378360026132d990919063ffffffff16565b50905080915050919050565b611b4b612cbf565b73ffffffffffffffffffffffffffffffffffffffff16611b696120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb690614cbf565b60405180910390fd5b611bc881613305565b50565b611bd3612cbf565b73ffffffffffffffffffffffffffffffffffffffff16611bf16120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90614cbf565b60405180910390fd5b8060196001019080519060200190611c609291906140ee565b5050565b6000611c9482604051806060016040528060298152602001615af060299139600261331f9092919063ffffffff16565b9050919050565b6060611ca682612ca2565b611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc90615096565b60405180910390fd5b600d611cf08361333e565b604051602001611d01929190615186565b6040516020818303038152906040529050919050565b60175481565b606060098054611d2c90614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5890614a8b565b8015611da55780601f10611d7a57610100808354040283529160200191611da5565b820191906000526020600020905b815481529060010190602001808311611d8857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e179061521c565b60405180910390fd5b611e67600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061349f565b9050919050565b611e76612cbf565b73ffffffffffffffffffffffffffffffffffffffff16611e946120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee190614cbf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606000611fb883611daf565b9050600081141561201557600067ffffffffffffffff811115611fde57611fdd61451b565b5b60405190808252806020026020018201604052801561200c5781602001602082028036833780820191505090505b509150506120b0565b60008167ffffffffffffffff8111156120315761203061451b565b5b60405190808252806020026020018201604052801561205f5781602001602082028036833780820191505090505b50905060005b828110156120a957612077858261183f565b82828151811061208a5761208961523c565b5b60200260200101818152505080806120a190614f43565b915050612065565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006120ea82612ca2565b6120f357600080fd5b612cec826121019190615019565b9050919050565b60606007805461211790614a8b565b80601f016020809104026020016040519081016040528092919081815260200182805461214390614a8b565b80156121905780601f1061216557610100808354040283529160200191612190565b820191906000526020600020905b81548152906001019060200180831161217357829003601f168201915b5050505050905090565b6121a2612cbf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612207906152b7565b60405180910390fd5b806005600061221d612cbf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122ca612cbf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161230f9190614279565b60405180910390a35050565b600061232682612ca2565b612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90615096565b60405180910390fd5b30600b600084815260200190815260200160002054600c600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040516020016123c29493929190615340565b604051602081830303815290604052805190602001209050919050565b6123e7612cbf565b73ffffffffffffffffffffffffffffffffffffffff166124056120b5565b73ffffffffffffffffffffffffffffffffffffffff161461245b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245290614cbf565b60405180910390fd5b80600d90805190602001906124719291906140ee565b5050565b60166020528060005260406000206000915090505481565b60156020528060005260406000206000915090505481565b6124b0848484612f2a565b612cec82101561256557601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061250a90614f8c565b9190505550601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061255f90614f43565b91905055505b612571848484846134b4565b50505050565b6000600e5460146000612cec8561258e919061538e565b8152602001908152602001600020546125a79190614e28565b9050919050565b60606125b982612ca2565b6125f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ef90615431565b60405180910390fd5b600060086000848152602001908152602001600020805461261890614a8b565b80601f016020809104026020016040519081016040528092919081815260200182805461264490614a8b565b80156126915780601f1061266657610100808354040283529160200191612691565b820191906000526020600020905b81548152906001019060200180831161267457829003601f168201915b5050505050905060006126a2611d1d565b90506000815114156126b857819250505061271c565b6000825111156126ed5780826040516020016126d5929190615451565b6040516020818303038152906040529250505061271c565b806126f78561333e565b604051602001612708929190615451565b604051602081830303815290604052925050505b919050565b600b6020528060005260406000206000915090505481565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612774612cbf565b73ffffffffffffffffffffffffffffffffffffffff166127926120b5565b73ffffffffffffffffffffffffffffffffffffffff16146127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df90614cbf565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b61281c612cbf565b73ffffffffffffffffffffffffffffffffffffffff1661283a6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288790614cbf565b60405180910390fd5b80601960030190805190602001906128a99291906140ee565b5050565b6128b5612cbf565b73ffffffffffffffffffffffffffffffffffffffff166128d36120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292090614cbf565b60405180910390fd5b80601960020190805190602001906129429291906140ee565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6129e2612cbf565b73ffffffffffffffffffffffffffffffffffffffff16612a006120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d90614cbf565b60405180910390fd5b6109c48110612a6457600080fd5b8060196007018190555050565b612a79612cbf565b73ffffffffffffffffffffffffffffffffffffffff16612a976120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614cbf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b54906154e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60136020528060005260406000206000915090505481565b60185481565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000612cb882600261351690919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d3a83611c64565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612d8e82600001613530565b9050919050565b612daf828260405180602001604052806000815250613541565b5050565b6000612dc1426018546132a6565b90506000601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115612ed757620151808183612e209190614fb6565b601754601360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6d9190614e28565b612e779190614e28565b612e819190615019565b601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ecf9190614ec4565b925050819055505b6018548114612f255781601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b612cec811015613241576000612f42426018546132a6565b90506000601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561305857620151808183612fa19190614fb6565b601754601360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fee9190614e28565b612ff89190614e28565b6130029190615019565b601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130509190614ec4565b925050819055505b60185481146130a65781601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461323e576000601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156131ee576201518081846131379190614fb6565b601754601360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131849190614e28565b61318e9190614e28565b6131989190615019565b601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131e69190614ec4565b925050819055505b601854811461323c5782601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505b50505b505050565b613257613251612cbf565b8261359c565b613296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328d90615579565b60405180910390fd5b6132a183838361367a565b505050565b60008183106132b557816132b7565b825b905092915050565b60006132ce8360000183613891565b60001c905092915050565b6000806000806132ec8660000186613905565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061331b9291906140ee565b5050565b6000613332846000018460001b8461398f565b60001c90509392505050565b60606000821415613386576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061349a565b600082905060005b600082146133b85780806133a190614f43565b915050600a826133b19190615019565b915061338e565b60008167ffffffffffffffff8111156133d4576133d361451b565b5b6040519080825280601f01601f1916602001820160405280156134065781602001600182028036833780820191505090505b5090505b600085146134935760018261341f9190614fb6565b9150600a8561342e919061538e565b603061343a9190614ec4565b60f81b8183815181106134505761344f61523c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561348c9190615019565b945061340a565b8093505050505b919050565b60006134ad82600001613a30565b9050919050565b6134c56134bf612cbf565b8361359c565b613504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fb90615579565b60405180910390fd5b61351084848484613a41565b50505050565b6000613528836000018360001b613a9d565b905092915050565b600081600001805490509050919050565b61354b8383613ac0565b6135586000848484613c4e565b613597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358e9061560b565b60405180910390fd5b505050565b60006135a782612ca2565b6135e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dd9061569d565b60405180910390fd5b60006135f183611c64565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061366057508373ffffffffffffffffffffffffffffffffffffffff1661364884610bb1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061367157506136708185612946565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661369a82611c64565b73ffffffffffffffffffffffffffffffffffffffff16146136f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e79061572f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613757906157c1565b60405180910390fd5b61376b838383613dd6565b613776600082612cc7565b6137c781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613ddb90919063ffffffff16565b5061381981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613df590919063ffffffff16565b5061383081836002613e0f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818360000180549050116138dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d390615853565b60405180910390fd5b8260000182815481106138f2576138f161523c565b5b9060005260206000200154905092915050565b60008082846000018054905011613951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613948906158e5565b60405180910390fd5b60008460000184815481106139695761396861523c565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906139f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e8919061432d565b60405180910390fd5b5084600001600182613a039190614fb6565b81548110613a1457613a1361523c565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613a4c84848461367a565b613a5884848484613c4e565b613a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8e9061560b565b60405180910390fd5b50505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2790615951565b60405180910390fd5b613b3981612ca2565b15613b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b70906159bd565b60405180910390fd5b613b8560008383613dd6565b613bd681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613df590919063ffffffff16565b50613bed81836002613e0f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613c6f8473ffffffffffffffffffffffffffffffffffffffff16613e44565b15613dc9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613c98612cbf565b8786866040518563ffffffff1660e01b8152600401613cba9493929190615a32565b6020604051808303816000875af1925050508015613cf657506040513d601f19601f82011682018060405250810190613cf39190615a93565b60015b613d79573d8060008114613d26576040519150601f19603f3d011682016040523d82523d6000602084013e613d2b565b606091505b50600081511415613d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d689061560b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613dce565b600190505b949350505050565b505050565b6000613ded836000018360001b613e57565b905092915050565b6000613e07836000018360001b613f6f565b905092915050565b6000613e3b846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613fdf565b90509392505050565b600080823b905060008111915050919050565b60008083600101600084815260200190815260200160002054905060008114613f63576000600182613e899190614fb6565b9050600060018660000180549050613ea19190614fb6565b90506000866000018281548110613ebb57613eba61523c565b5b9060005260206000200154905080876000018481548110613edf57613ede61523c565b5b9060005260206000200181905550600183613efa9190614ec4565b8760010160008381526020019081526020016000208190555086600001805480613f2757613f26615ac0565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613f69565b60009150505b92915050565b6000613f7b83836140cb565b613fd4578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613fd9565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415614086578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506140c4565b82856000016001836140989190614fb6565b815481106140a9576140a861523c565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b8280546140fa90614a8b565b90600052602060002090601f01602090048101928261411c5760008555614163565b82601f1061413557805160ff1916838001178555614163565b82800160010185558215614163579182015b82811115614162578251825591602001919060010190614147565b5b5090506141709190614174565b5090565b5b8082111561418d576000816000905550600101614175565b5090565b6000819050919050565b6141a481614191565b82525050565b60006020820190506141bf600083018461419b565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61420e816141d9565b811461421957600080fd5b50565b60008135905061422b81614205565b92915050565b600060208284031215614247576142466141cf565b5b60006142558482850161421c565b91505092915050565b60008115159050919050565b6142738161425e565b82525050565b600060208201905061428e600083018461426a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142ce5780820151818401526020810190506142b3565b838111156142dd576000848401525b50505050565b6000601f19601f8301169050919050565b60006142ff82614294565b614309818561429f565b93506143198185602086016142b0565b614322816142e3565b840191505092915050565b6000602082019050818103600083015261434781846142f4565b905092915050565b61435881614191565b811461436357600080fd5b50565b6000813590506143758161434f565b92915050565b600060208284031215614391576143906141cf565b5b600061439f84828501614366565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143d3826143a8565b9050919050565b6143e3816143c8565b82525050565b60006020820190506143fe60008301846143da565b92915050565b61440d816143c8565b811461441857600080fd5b50565b60008135905061442a81614404565b92915050565b60008060408385031215614447576144466141cf565b5b60006144558582860161441b565b925050602061446685828601614366565b9150509250929050565b600061010082019050614486600083018b61419b565b8181036020830152614498818a6142f4565b905081810360408301526144ac81896142f4565b905081810360608301526144c081886142f4565b905081810360808301526144d481876142f4565b905081810360a08301526144e881866142f4565b90506144f760c08301856143da565b61450460e083018461419b565b9998505050505050505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614553826142e3565b810181811067ffffffffffffffff821117156145725761457161451b565b5b80604052505050565b60006145856141c5565b9050614591828261454a565b919050565b600067ffffffffffffffff8211156145b1576145b061451b565b5b6145ba826142e3565b9050602081019050919050565b82818337600083830152505050565b60006145e96145e484614596565b61457b565b90508281526020810184848401111561460557614604614516565b5b6146108482856145c7565b509392505050565b600082601f83011261462d5761462c614511565b5b813561463d8482602086016145d6565b91505092915050565b60006020828403121561465c5761465b6141cf565b5b600082013567ffffffffffffffff81111561467a576146796141d4565b5b61468684828501614618565b91505092915050565b6000806000606084860312156146a8576146a76141cf565b5b60006146b68682870161441b565b93505060206146c78682870161441b565b92505060406146d886828701614366565b9150509250925092565b6000602082840312156146f8576146f76141cf565b5b60006147068482850161441b565b91505092915050565b60008060408385031215614726576147256141cf565b5b600061473485828601614366565b925050602061474585828601614366565b9150509250929050565b600060408201905061476460008301856143da565b614771602083018461419b565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147ad81614191565b82525050565b60006147bf83836147a4565b60208301905092915050565b6000602082019050919050565b60006147e382614778565b6147ed8185614783565b93506147f883614794565b8060005b8381101561482957815161481088826147b3565b975061481b836147cb565b9250506001810190506147fc565b5085935050505092915050565b6000602082019050818103600083015261485081846147d8565b905092915050565b6148618161425e565b811461486c57600080fd5b50565b60008135905061487e81614858565b92915050565b6000806040838503121561489b5761489a6141cf565b5b60006148a98582860161441b565b92505060206148ba8582860161486f565b9150509250929050565b6000819050919050565b6148d7816148c4565b82525050565b60006020820190506148f260008301846148ce565b92915050565b600067ffffffffffffffff8211156149135761491261451b565b5b61491c826142e3565b9050602081019050919050565b600061493c614937846148f8565b61457b565b90508281526020810184848401111561495857614957614516565b5b6149638482856145c7565b509392505050565b600082601f8301126149805761497f614511565b5b8135614990848260208601614929565b91505092915050565b600080600080608085870312156149b3576149b26141cf565b5b60006149c18782880161441b565b94505060206149d28782880161441b565b93505060406149e387828801614366565b925050606085013567ffffffffffffffff811115614a0457614a036141d4565b5b614a108782880161496b565b91505092959194509250565b60008060408385031215614a3357614a326141cf565b5b6000614a418582860161441b565b9250506020614a528582860161441b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614aa357607f821691505b60208210811415614ab757614ab6614a5c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614b19602c8361429f565b9150614b2482614abd565b604082019050919050565b60006020820190508181036000830152614b4881614b0c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bab60218361429f565b9150614bb682614b4f565b604082019050919050565b60006020820190508181036000830152614bda81614b9e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614c3d60388361429f565b9150614c4882614be1565b604082019050919050565b60006020820190508181036000830152614c6c81614c30565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ca960208361429f565b9150614cb482614c73565b602082019050919050565b60006020820190508181036000830152614cd881614c9c565b9050919050565b7f4d696e74696e672069736e2774206f70656e0000000000000000000000000000600082015250565b6000614d1560128361429f565b9150614d2082614cdf565b602082019050919050565b60006020820190508181036000830152614d4481614d08565b9050919050565b600081519050614d5a81614404565b92915050565b600060208284031215614d7657614d756141cf565b5b6000614d8484828501614d4b565b91505092915050565b7f4e6f74206f776e6572206f6620474c4943504958585800000000000000000000600082015250565b6000614dc360168361429f565b9150614dce82614d8d565b602082019050919050565b60006020820190508181036000830152614df281614db6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e3382614191565b9150614e3e83614191565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e7757614e76614df9565b5b828202905092915050565b600081519050614e9181614858565b92915050565b600060208284031215614ead57614eac6141cf565b5b6000614ebb84828501614e82565b91505092915050565b6000614ecf82614191565b9150614eda83614191565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f0f57614f0e614df9565b5b828201905092915050565b6000604082019050614f2f600083018561419b565b614f3c602083018461419b565b9392505050565b6000614f4e82614191565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f8157614f80614df9565b5b600182019050919050565b6000614f9782614191565b91506000821415614fab57614faa614df9565b5b600182039050919050565b6000614fc182614191565b9150614fcc83614191565b925082821015614fdf57614fde614df9565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061502482614191565b915061502f83614191565b92508261503f5761503e614fea565b5b828204905092915050565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b6000615080600e8361429f565b915061508b8261504a565b602082019050919050565b600060208201905081810360008301526150af81615073565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546150e381614a8b565b6150ed81866150b6565b9450600182166000811461510857600181146151195761514c565b60ff1983168652818601935061514c565b615122856150c1565b60005b8381101561514457815481890152600182019150602081019050615125565b838801955050505b50505092915050565b600061516082614294565b61516a81856150b6565b935061517a8185602086016142b0565b80840191505092915050565b600061519282856150d6565b915061519e8284615155565b91508190509392505050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615206602a8361429f565b9150615211826151aa565b604082019050919050565b60006020820190508181036000830152615235816151f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006152a160198361429f565b91506152ac8261526b565b602082019050919050565b600060208201905081810360008301526152d081615294565b9050919050565b60008160601b9050919050565b60006152ef826152d7565b9050919050565b6000615301826152e4565b9050919050565b615319615314826143c8565b6152f6565b82525050565b6000819050919050565b61533a61533582614191565b61531f565b82525050565b600061534c8287615308565b60148201915061535c8286615329565b60208201915061536c8285615308565b60148201915061537c8284615329565b60208201915081905095945050505050565b600061539982614191565b91506153a483614191565b9250826153b4576153b3614fea565b5b828206905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061541b602f8361429f565b9150615426826153bf565b604082019050919050565b6000602082019050818103600083015261544a8161540e565b9050919050565b600061545d8285615155565b91506154698284615155565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006154d160268361429f565b91506154dc82615475565b604082019050919050565b60006020820190508181036000830152615500816154c4565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061556360318361429f565b915061556e82615507565b604082019050919050565b6000602082019050818103600083015261559281615556565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006155f560328361429f565b915061560082615599565b604082019050919050565b60006020820190508181036000830152615624816155e8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615687602c8361429f565b91506156928261562b565b604082019050919050565b600060208201905081810360008301526156b68161567a565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061571960298361429f565b9150615724826156bd565b604082019050919050565b600060208201905081810360008301526157488161570c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006157ab60248361429f565b91506157b68261574f565b604082019050919050565b600060208201905081810360008301526157da8161579e565b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061583d60228361429f565b9150615848826157e1565b604082019050919050565b6000602082019050818103600083015261586c81615830565b9050919050565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006158cf60228361429f565b91506158da82615873565b604082019050919050565b600060208201905081810360008301526158fe816158c2565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061593b60208361429f565b915061594682615905565b602082019050919050565b6000602082019050818103600083015261596a8161592e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006159a7601c8361429f565b91506159b282615971565b602082019050919050565b600060208201905081810360008301526159d68161599a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615a04826159dd565b615a0e81856159e8565b9350615a1e8185602086016142b0565b615a27816142e3565b840191505092915050565b6000608082019050615a4760008301876143da565b615a5460208301866143da565b615a61604083018561419b565b8181036060830152615a7381846159f9565b905095945050505050565b600081519050615a8d81614205565b92915050565b600060208284031215615aa957615aa86141cf565b5b6000615ab784828501615a7e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220bbbe0fff368eba233dad95e0ad1e00872a40dcdedfccf236b78439ddf5919b4964736f6c634300080b003368747470733a2f2f7365727665722e617274676c697878782e696f2f67656e65726174652f70726f6a6563742f302f746f6b656e2f415254474c495858582047454e455349532069732074686520666972737420626164617373206f6e2d636861696e2072656d697820636f6c6c656374696f6e206f6620474c494350495858582e20486f6c64696e67206d6f757365206f6e2063616e76617320616e64206d6f76696e67206f6e20782d61786973206368616e67657320746865206672616d6520726174652e636c6173732052616e646f6d7b636f6e7374727563746f722865297b746869732e736565643d657d72616e646f6d5f64656328297b72657475726e20746869732e736565645e3d746869732e736565643c3c31332c746869732e736565645e3d746869732e736565643e3e31372c746869732e736565645e3d746869732e736565643c3c352c28746869732e736565643c303f312b7e746869732e736565643a746869732e7365656429253165332f3165337d72616e646f6d5f6265747765656e28652c61297b72657475726e20652b28612d65292a746869732e72616e646f6d5f64656328297d72616e646f6d5f696e7428652c61297b72657475726e204d6174682e666c6f6f7228746869732e72616e646f6d5f6265747765656e28652c612b3129297d72616e646f6d5f63686f6963652865297b72657475726e20655b4d6174682e666c6f6f7228746869732e72616e646f6d5f6265747765656e28302c2e39392a652e6c656e67746829295d7d72616e646f6d5f65787028652c612c6e297b72657475726e20666c6f6f72286d6170284d6174682e657870286d617028746869732e72616e646f6d5f6265747765656e28302c393939292c302c3165332c302c6e29292c4d6174682e6578702830292c4d6174682e657870286e292c652c612b3129297d7d66756e6374696f6e206875653272676228652c612c6e297b72657475726e206e3c302626286e2b3d31292c6e3e312626286e2d3d31292c6e3c312f363f652b362a28612d65292a6e3a6e3c2e353f613a6e3c322f333f652b28612d65292a28322f332d6e292a363a657d66756e6374696f6e206368616e676548756528652c612c6e2c72297b76617220743d726762546f48534c28652c612c6e293b72657475726e20742e682b3d722c742e683e3336303f742e682d3d3336303a742e683c30262628742e682b3d333630292c68736c546f5247422874297d66756e6374696f6e20726762546f48534c28652c612c6e297b652f3d3235352c612f3d3235352c6e2f3d3235353b76617220723d4d6174682e6d617828652c612c6e292c743d4d6174682e6d696e28652c612c6e292c6f3d722d742c693d28722b74292f323b72657475726e7b683a303d3d6f3f303a723d3d653f28612d6e292f6f25362a36303a723d3d613f36302a28286e2d65292f6f2b32293a36302a2828652d61292f6f2b34292c733a303d3d6f3f303a6f2f28312d4d6174682e61627328322a692d3129292c6c3a697d7d66756e6374696f6e2068736c546f5247422865297b76617220612c6e2c722c743d652e682c6f3d652e732c693d652e6c2c6d3d28312d4d6174682e61627328322a692d3129292a6f2c733d6d2a28312d4d6174682e61627328742f363025322d3129292c643d692d6d2f323b72657475726e20743c36303f28613d6d2c6e3d732c723d30293a743c3132303f28613d732c6e3d6d2c723d30293a743c3138303f28613d302c6e3d6d2c723d73293a743c3234303f28613d302c6e3d732c723d6d293a743c3330303f28613d732c6e3d302c723d6d293a28613d6d2c6e3d302c723d73292c5b613d6e6f726d616c697a655f7267625f76616c756528612c64292c6e3d6e6f726d616c697a655f7267625f76616c7565286e2c64292c723d6e6f726d616c697a655f7267625f76616c756528722c64295d7d66756e6374696f6e206e6f726d616c697a655f7267625f76616c756528652c61297b72657475726e28653d4d6174682e666c6f6f72283235352a28652b612929293c30262628653d30292c657d66756e6374696f6e20687565536869667428652c61297b652e6c6f6164506978656c7328293b666f7228766172206e3d303b6e3c652e706978656c732e6c656e6774683b6e2b3d34297b6c657420723d6368616e676548756528652e706978656c735b6e5d2c652e706978656c735b6e2b315d2c652e706978656c735b6e2b325d2c61293b652e706978656c735b6e5d3d725b305d2c652e706978656c735b6e2b315d3d725b315d2c652e706978656c735b6e2b325d3d725b325d7d652e757064617465506978656c7328297d66756e6374696f6e20636f6d706f6e656e74546f4865782865297b76617220613d652e746f537472696e67283136293b72657475726e20313d3d612e6c656e6774683f2730272b613a617d636f6e737420726762746f6865783d28652c612c6e293d3e2723272b636f6d706f6e656e74546f4865782865292b636f6d706f6e656e74546f4865782861292b636f6d706f6e656e74546f486578286e293b6c657420746f6b656e446174613d77696e646f772e746f6b656e486173682c736565643d7061727365496e7428746f6b656e446174612e736c69636528302c3136292c3136292c726e673d6e65772052616e646f6d2873656564293b7661722053495a453b6c657420676c696370697878784f726967696e3d77696e646f772e676c696370697878784f726967696e2c66696c656e616d65733d77696e646f772e696d616765734c6973742e73706c697428272c27293b76617220696d616765733d5b5d3b6c657420706172616d733d7b7d2c6f6e6365653d21313b66756e6374696f6e207072656c6f616428297b666f72286c6574206520696e2066696c656e616d657329696d616765732e70757368286c6f6164496d6167652866696c656e616d65735b655d29297d66756e6374696f6e20736574757028297b706172616d732e47524944533d726e672e72616e646f6d5f65787028312c31362c32292c706172616d732e445241575f4d4f44453d726e672e72616e646f6d5f65787028312c362c32292c706172616d732e494d4147455f46494c5445523d726e672e72616e646f6d5f65787028302c372c32292c35213d706172616d732e494d4147455f46494c544552262636213d706172616d732e494d4147455f46494c5445527c7c28706172616d732e4855455f4445475245453d726e672e72616e646f6d5f696e7428312c33363029292c706172616d732e524f544154455f4d4f44453d726e672e72616e646f6d5f65787028302c332c312e35292c313d3d706172616d732e524f544154455f4d4f44453f706172616d732e524f544154455f4e3d5b2e2e2e6e6577205365742841727261792e6170706c7928302c6e657720417272617928726e672e72616e646f6d5f696e7428312c342929292e6d617028653d3e726e672e72616e646f6d5f696e7428312c34352929295d3a32213d706172616d732e524f544154455f4d4f4445262633213d706172616d732e524f544154455f4d4f44457c7c28706172616d732e524f544154455f4e3d726e672e72616e646f6d5f696e7428312c343529292c706172616d732e6267636f6c6f723d726762746f68657828726e672e72616e646f6d5f696e7428302c323535292c726e672e72616e646f6d5f696e7428302c323535292c726e672e72616e646f6d5f696e7428302c32353529292c53495a453d4d6174682e6d696e2877696e646f772e696e6e65724865696768742c77696e646f772e696e6e65725769647468292c63726561746543616e7661732853495a452c53495a45292c6261636b67726f756e6428706172616d732e6267636f6c6f72297d66756e6374696f6e206472617728297b6e6f536d6f6f746828292c6d6f7573654973507265737365643f6672616d6552617465286d6170286d6f757365582c302c53495a452c352c36302c213029293a6672616d6552617465283630293b6c657420653d77696474682f706172616d732e47524944533b616e676c654d6f64652844454752454553292c726f743d303b666f72286c657420613d303b613c706172616d732e47524944533b612b2b29666f72286c6574206e3d303b6e3c706172616d732e47524944533b6e2b2b297b6c657420723d726e672e72616e646f6d5f63686f69636528696d61676573293b726f746174654d6528706172616d732e524f544154455f4d4f44452c706172616d732e524f544154455f4e292c6170706c7946696c74657228706172616d732e494d4147455f46494c5445522c72292c445241575f4d4f444528706172616d732e445241575f4d4f44452c722c652c6e2c61297d7d66756e6374696f6e20445241575f4d4f444528652c612c6e2c722c74297b7377697463682865297b6361736520313a696d6167654d6f64652843454e544552292c696d61676528612c6e2a722b6e2f322c6e2a742b6e2f322c726e672e72616e646f6d5f6265747765656e28302c6e292c726e672e72616e646f6d5f6265747765656e28302c6e29293b627265616b3b6361736520323a696d6167654d6f646528434f524e4552292c696d61676528612c6e2a722c6e2a742c726e672e72616e646f6d5f6265747765656e28302c6e292c726e672e72616e646f6d5f6265747765656e28302c6e29293b627265616b3b6361736520333a696d6167654d6f646528434f524e455253292c696d61676528612c6e2a722b726e672e72616e646f6d5f6265747765656e28302c6e292c6e2a742b726e672e72616e646f6d5f6265747765656e28302c6e292c6e2a722b726e672e72616e646f6d5f6265747765656e28302c6e292c6e2a742b726e672e72616e646f6d5f6265747765656e28302c6e29293b627265616b3b6361736520343a696d6167654d6f64652843454e544552292c696d61676528612c6e2a722b726e672e72616e646f6d5f6265747765656e28302c6e292c6e2a742b726e672e72616e646f6d5f6265747765656e28302c6e292c6e2a722b726e672e72616e646f6d5f6265747765656e28302c6e292c6e2a742b726e672e72616e646f6d5f6265747765656e28302c6e29293b627265616b3b6361736520353a696d6167654d6f646528434f524e4552292c696d61676528612c6e2a722b726e672e72616e646f6d5f6265747765656e28302c6e292c6e2a742b726e672e72616e646f6d5f6265747765656e28302c6e292c6e2a722b726e672e72616e646f6d5f6265747765656e28302c6e292c6e2a742b726e672e72616e646f6d5f6265747765656e28302c6e29293b627265616b3b6361736520363a696d6167654d6f646528434f524e455253292c696d61676528612c726e672e72616e646f6d5f6265747765656e28302c53495a45292c726e672e72616e646f6d5f6265747765656e28302c53495a45292c726e672e72616e646f6d5f6265747765656e28302c53495a45292c726e672e72616e646f6d5f6265747765656e28302c53495a4529297d7d66756e6374696f6e206170706c7946696c74657228652c612c6e297b7377697463682865297b6361736520313a303d3d6f6e636565262628612e66696c74657228494e56455254292c6f6e6365653d2130293b627265616b3b6361736520323a612e66696c74657228494e56455254293b627265616b3b6361736520333a612e66696c74657228504f53544552495a452c34293b627265616b3b6361736520343a612e66696c74657228504f53544552495a452c32292c612e66696c74657228494e56455254293b627265616b3b6361736520353a303d3d6f6e636565262628687565536869667428612c706172616d732e4855455f444547524545292c6f6e6365653d2130293b627265616b3b6361736520363a687565536869667428612c706172616d732e4855455f444547524545293b627265616b3b6361736520373a612e66696c7465722847524159297d7d66756e6374696f6e20726f746174654d6528652c61297b7377697463682865297b6361736520313a726f7461746528726e672e72616e646f6d5f63686f696365286129293b627265616b3b6361736520323a726f7461746528726e672e72616e646f6d5f6265747765656e28312c6129293b627265616b3b6361736520333a726f746174652861297d7d596f757220415254474c495858582c20796f75722063616c6c2e20416e20415254474c4958585820636f6d657320776974682066756c6c206e6f6e2d636f6d6d65726369616c2f636f6d6d65726369616c207269676874732e4265726b20616b61205072696e636573732043616d656c20616b612047756572696c6c612050696d70204d696e696f6e20476f64204261737461726468747470733a2f2f7365727665722e617274676c697878782e696f2f6170692f70726f6a6563742f302f746f6b656e2f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103265760003560e01c806363d96941116101b8578063b7fc53b511610104578063d4c7c83e116100a2578063f1a272191161007c578063f1a2721914610a13578063f2fde38b14610a2f578063f6677cd014610a4b578063fb85936d14610a7b57610326565b8063d4c7c83e146109ab578063df8a10b4146109c7578063e985e9c5146109e357610326565b8063c87b56dd116100de578063c87b56dd14610911578063c8a0122614610941578063cd53d08e14610971578063d3dd5fe0146109a157610326565b8063b7fc53b514610895578063b88d4fde146108c5578063c81b70c4146108e157610326565b80638da5cb5b11610171578063a22cb4651161014b578063a22cb465146107fd578063a386439714610819578063a8f14af614610849578063aed225d51461086557610326565b80638da5cb5b1461079157806391785e6d146107af57806395d89b41146107df57610326565b806363d96941146106bb57806364cfc2dd146106eb5780636c0360eb1461070957806370a0823114610727578063715018a6146107575780638462151c1461076157610326565b8063267e8ab61161027757806342842e0e116102305780634f6ccce71161020a5780634f6ccce71461062357806355f804b314610653578063578e2c0c1461066f5780636352211e1461068b57610326565b806342842e0e146105bb5780634ba80c1e146105d75780634f558e79146105f357610326565b8063267e8ab6146104e65780632a55205a146105165780632d3454c5146105475780632ee2ac36146105635780632f745c59146105815780633d18b912146105b157610326565b806318160ddd116102e45780632137e2e1116102be5780632137e2e11461047457806322aeffc11461049057806323b872dd146104ac57806324bbd049146104c857610326565b806318160ddd14610401578063185b69101461041f5780631a8106a01461044457610326565b80629f69391461032b57806301ffc9a714610349578063054ee7891461037957806306fdde0314610397578063081812fc146103b5578063095ea7b3146103e5575b600080fd5b610333610a99565b60405161034091906141aa565b60405180910390f35b610363600480360381019061035e9190614231565b610a9f565b6040516103709190614279565b60405180910390f35b610381610b19565b60405161038e91906141aa565b60405180910390f35b61039f610b1f565b6040516103ac919061432d565b60405180910390f35b6103cf60048036038101906103ca919061437b565b610bb1565b6040516103dc91906143e9565b60405180910390f35b6103ff60048036038101906103fa9190614430565b610c36565b005b610409610d4e565b60405161041691906141aa565b60405180910390f35b610427610d5f565b60405161043b989796959493929190614470565b60405180910390f35b61045e6004803603810190610459919061437b565b61105d565b60405161046b91906141aa565b60405180910390f35b61048e60048036038101906104899190614646565b611075565b005b6104aa60048036038101906104a59190614430565b61110e565b005b6104c660048036038101906104c1919061468f565b6114b5565b005b6104d0611585565b6040516104dd9190614279565b60405180910390f35b61050060048036038101906104fb91906146e2565b611598565b60405161050d91906141aa565b60405180910390f35b610530600480360381019061052b919061470f565b6116c6565b60405161053e92919061474f565b60405180910390f35b610561600480360381019061055c9190614646565b611718565b005b61056b6117b1565b604051610578919061432d565b60405180910390f35b61059b60048036038101906105969190614430565b61183f565b6040516105a891906141aa565b60405180910390f35b6105b961189a565b005b6105d560048036038101906105d0919061468f565b611a2b565b005b6105f160048036038101906105ec91906146e2565b611a4b565b005b61060d6004803603810190610608919061437b565b611b0e565b60405161061a9190614279565b60405180910390f35b61063d6004803603810190610638919061437b565b611b20565b60405161064a91906141aa565b60405180910390f35b61066d60048036038101906106689190614646565b611b43565b005b61068960048036038101906106849190614646565b611bcb565b005b6106a560048036038101906106a0919061437b565b611c64565b6040516106b291906143e9565b60405180910390f35b6106d560048036038101906106d0919061437b565b611c9b565b6040516106e2919061432d565b60405180910390f35b6106f3611d17565b60405161070091906141aa565b60405180910390f35b610711611d1d565b60405161071e919061432d565b60405180910390f35b610741600480360381019061073c91906146e2565b611daf565b60405161074e91906141aa565b60405180910390f35b61075f611e6e565b005b61077b600480360381019061077691906146e2565b611fab565b6040516107889190614836565b60405180910390f35b6107996120b5565b6040516107a691906143e9565b60405180910390f35b6107c960048036038101906107c4919061437b565b6120df565b6040516107d691906141aa565b60405180910390f35b6107e7612108565b6040516107f4919061432d565b60405180910390f35b61081760048036038101906108129190614884565b61219a565b005b610833600480360381019061082e919061437b565b61231b565b60405161084091906148dd565b60405180910390f35b610863600480360381019061085e9190614646565b6123df565b005b61087f600480360381019061087a91906146e2565b612475565b60405161088c91906141aa565b60405180910390f35b6108af60048036038101906108aa91906146e2565b61248d565b6040516108bc91906141aa565b60405180910390f35b6108df60048036038101906108da9190614999565b6124a5565b005b6108fb60048036038101906108f6919061437b565b612577565b60405161090891906141aa565b60405180910390f35b61092b6004803603810190610926919061437b565b6125ae565b604051610938919061432d565b60405180910390f35b61095b6004803603810190610956919061437b565b612721565b60405161096891906141aa565b60405180910390f35b61098b6004803603810190610986919061437b565b612739565b60405161099891906143e9565b60405180910390f35b6109a961276c565b005b6109c560048036038101906109c09190614646565b612814565b005b6109e160048036038101906109dc9190614646565b6128ad565b005b6109fd60048036038101906109f89190614a1c565b612946565b604051610a0a9190614279565b60405180910390f35b610a2d6004803603810190610a28919061437b565b6129da565b005b610a496004803603810190610a4491906146e2565b612a71565b005b610a656004803603810190610a6091906146e2565b612c1d565b604051610a7291906141aa565b60405180910390f35b610a83612c35565b604051610a9091906141aa565b60405180910390f35b612cec81565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b125750610b1182612c3b565b5b9050919050565b600e5481565b606060068054610b2e90614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5a90614a8b565b8015610ba75780601f10610b7c57610100808354040283529160200191610ba7565b820191906000526020600020905b815481529060010190602001808311610b8a57829003601f168201915b5050505050905090565b6000610bbc82612ca2565b610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290614b2f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4182611c64565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990614bc1565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cd1612cbf565b73ffffffffffffffffffffffffffffffffffffffff161480610d005750610cff81610cfa612cbf565b612946565b5b610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690614c53565b60405180910390fd5b610d498383612cc7565b505050565b6000610d5a6002612d80565b905090565b6019806000015490806001018054610d7690614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610da290614a8b565b8015610def5780601f10610dc457610100808354040283529160200191610def565b820191906000526020600020905b815481529060010190602001808311610dd257829003601f168201915b505050505090806002018054610e0490614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3090614a8b565b8015610e7d5780601f10610e5257610100808354040283529160200191610e7d565b820191906000526020600020905b815481529060010190602001808311610e6057829003601f168201915b505050505090806003018054610e9290614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebe90614a8b565b8015610f0b5780601f10610ee057610100808354040283529160200191610f0b565b820191906000526020600020905b815481529060010190602001808311610eee57829003601f168201915b505050505090806004018054610f2090614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4c90614a8b565b8015610f995780601f10610f6e57610100808354040283529160200191610f99565b820191906000526020600020905b815481529060010190602001808311610f7c57829003601f168201915b505050505090806005018054610fae90614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610fda90614a8b565b80156110275780601f10610ffc57610100808354040283529160200191611027565b820191906000526020600020905b81548152906001019060200180831161100a57829003601f168201915b5050505050908060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060070154905088565b60146020528060005260406000206000915090505481565b61107d612cbf565b73ffffffffffffffffffffffffffffffffffffffff1661109b6120b5565b73ffffffffffffffffffffffffffffffffffffffff16146110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e890614cbf565b60405180910390fd5b806019600401908051906020019061110a9291906140ee565b5050565b60011515600a60149054906101000a900460ff16151514611164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115b90614d2b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016111d691906141aa565b602060405180830381865afa1580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190614d60565b73ffffffffffffffffffffffffffffffffffffffff161461126d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126490614dd9565b60405180910390fd5b600060146000838152602001908152602001600020549050600081111561133d57601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33600e54846112db9190614e28565b6040518363ffffffff1660e01b81526004016112f892919061474f565b6020604051808303816000875af1158015611317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133b9190614e97565b505b600081612cec61134d9190614e28565b836113589190614ec4565b90506113648482612d95565b8373ffffffffffffffffffffffffffffffffffffffff167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f82846040516113ac929190614f1a565b60405180910390a243600b60008381526020019081526020016000208190555033600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008214156114865761143084612db3565b601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061148090614f43565b91905055505b6014600084815260200190815260200160002060008154809291906114aa90614f43565b919050555050505050565b6114c0838383612f2a565b612cec81101561157557601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061151a90614f8c565b9190505550601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061156f90614f43565b91905055505b611580838383613246565b505050565b600a60149054906101000a900460ff1681565b6000806115a7426018546132a6565b90506000601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156116ba576201518081836116069190614fb6565b601754601360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116539190614e28565b61165d9190614e28565b6116679190615019565b601560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116b19190614ec4565b925050506116c1565b6000925050505b919050565b600080601960060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150612710601960070154846117059190614e28565b61170f9190615019565b90509250929050565b611720612cbf565b73ffffffffffffffffffffffffffffffffffffffff1661173e6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b90614cbf565b60405180910390fd5b80601960050190805190602001906117ad9291906140ee565b5050565b600d80546117be90614a8b565b80601f01602080910402602001604051908101604052809291908181526020018280546117ea90614a8b565b80156118375780601f1061180c57610100808354040283529160200191611837565b820191906000526020600020905b81548152906001019060200180831161181a57829003601f168201915b505050505081565b600061189282600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206132bf90919063ffffffff16565b905092915050565b6118a633600080612f2a565b6000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115611a28576000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b815260040161199592919061474f565b6020604051808303816000875af11580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190614e97565b503373ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048682604051611a1f91906141aa565b60405180910390a25b50565b611a46838383604051806020016040528060008152506124a5565b505050565b611a53612cbf565b73ffffffffffffffffffffffffffffffffffffffff16611a716120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90614cbf565b60405180910390fd5b80601960060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611b1982612ca2565b9050919050565b600080611b378360026132d990919063ffffffff16565b50905080915050919050565b611b4b612cbf565b73ffffffffffffffffffffffffffffffffffffffff16611b696120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb690614cbf565b60405180910390fd5b611bc881613305565b50565b611bd3612cbf565b73ffffffffffffffffffffffffffffffffffffffff16611bf16120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e90614cbf565b60405180910390fd5b8060196001019080519060200190611c609291906140ee565b5050565b6000611c9482604051806060016040528060298152602001615af060299139600261331f9092919063ffffffff16565b9050919050565b6060611ca682612ca2565b611ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cdc90615096565b60405180910390fd5b600d611cf08361333e565b604051602001611d01929190615186565b6040516020818303038152906040529050919050565b60175481565b606060098054611d2c90614a8b565b80601f0160208091040260200160405190810160405280929190818152602001828054611d5890614a8b565b8015611da55780601f10611d7a57610100808354040283529160200191611da5565b820191906000526020600020905b815481529060010190602001808311611d8857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e179061521c565b60405180910390fd5b611e67600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061349f565b9050919050565b611e76612cbf565b73ffffffffffffffffffffffffffffffffffffffff16611e946120b5565b73ffffffffffffffffffffffffffffffffffffffff1614611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee190614cbf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60606000611fb883611daf565b9050600081141561201557600067ffffffffffffffff811115611fde57611fdd61451b565b5b60405190808252806020026020018201604052801561200c5781602001602082028036833780820191505090505b509150506120b0565b60008167ffffffffffffffff8111156120315761203061451b565b5b60405190808252806020026020018201604052801561205f5781602001602082028036833780820191505090505b50905060005b828110156120a957612077858261183f565b82828151811061208a5761208961523c565b5b60200260200101818152505080806120a190614f43565b915050612065565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006120ea82612ca2565b6120f357600080fd5b612cec826121019190615019565b9050919050565b60606007805461211790614a8b565b80601f016020809104026020016040519081016040528092919081815260200182805461214390614a8b565b80156121905780601f1061216557610100808354040283529160200191612190565b820191906000526020600020905b81548152906001019060200180831161217357829003601f168201915b5050505050905090565b6121a2612cbf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612210576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612207906152b7565b60405180910390fd5b806005600061221d612cbf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122ca612cbf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161230f9190614279565b60405180910390a35050565b600061232682612ca2565b612365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235c90615096565b60405180910390fd5b30600b600084815260200190815260200160002054600c600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040516020016123c29493929190615340565b604051602081830303815290604052805190602001209050919050565b6123e7612cbf565b73ffffffffffffffffffffffffffffffffffffffff166124056120b5565b73ffffffffffffffffffffffffffffffffffffffff161461245b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245290614cbf565b60405180910390fd5b80600d90805190602001906124719291906140ee565b5050565b60166020528060005260406000206000915090505481565b60156020528060005260406000206000915090505481565b6124b0848484612f2a565b612cec82101561256557601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061250a90614f8c565b9190505550601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061255f90614f43565b91905055505b612571848484846134b4565b50505050565b6000600e5460146000612cec8561258e919061538e565b8152602001908152602001600020546125a79190614e28565b9050919050565b60606125b982612ca2565b6125f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ef90615431565b60405180910390fd5b600060086000848152602001908152602001600020805461261890614a8b565b80601f016020809104026020016040519081016040528092919081815260200182805461264490614a8b565b80156126915780601f1061266657610100808354040283529160200191612691565b820191906000526020600020905b81548152906001019060200180831161267457829003601f168201915b5050505050905060006126a2611d1d565b90506000815114156126b857819250505061271c565b6000825111156126ed5780826040516020016126d5929190615451565b6040516020818303038152906040529250505061271c565b806126f78561333e565b604051602001612708929190615451565b604051602081830303815290604052925050505b919050565b600b6020528060005260406000206000915090505481565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612774612cbf565b73ffffffffffffffffffffffffffffffffffffffff166127926120b5565b73ffffffffffffffffffffffffffffffffffffffff16146127e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127df90614cbf565b60405180910390fd5b600a60149054906101000a900460ff1615600a60146101000a81548160ff021916908315150217905550565b61281c612cbf565b73ffffffffffffffffffffffffffffffffffffffff1661283a6120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288790614cbf565b60405180910390fd5b80601960030190805190602001906128a99291906140ee565b5050565b6128b5612cbf565b73ffffffffffffffffffffffffffffffffffffffff166128d36120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292090614cbf565b60405180910390fd5b80601960020190805190602001906129429291906140ee565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6129e2612cbf565b73ffffffffffffffffffffffffffffffffffffffff16612a006120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d90614cbf565b60405180910390fd5b6109c48110612a6457600080fd5b8060196007018190555050565b612a79612cbf565b73ffffffffffffffffffffffffffffffffffffffff16612a976120b5565b73ffffffffffffffffffffffffffffffffffffffff1614612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614cbf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b54906154e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60136020528060005260406000206000915090505481565b60185481565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000612cb882600261351690919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d3a83611c64565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612d8e82600001613530565b9050919050565b612daf828260405180602001604052806000815250613541565b5050565b6000612dc1426018546132a6565b90506000601660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811115612ed757620151808183612e209190614fb6565b601754601360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e6d9190614e28565b612e779190614e28565b612e819190615019565b601560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ecf9190614ec4565b925050819055505b6018548114612f255781601660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505050565b612cec811015613241576000612f42426018546132a6565b90506000601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561305857620151808183612fa19190614fb6565b601754601360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612fee9190614e28565b612ff89190614e28565b6130029190615019565b601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130509190614ec4565b925050819055505b60185481146130a65781601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461323e576000601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111156131ee576201518081846131379190614fb6565b601754601360008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546131849190614e28565b61318e9190614e28565b6131989190615019565b601560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131e69190614ec4565b925050819055505b601854811461323c5782601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b505b50505b505050565b613257613251612cbf565b8261359c565b613296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328d90615579565b60405180910390fd5b6132a183838361367a565b505050565b60008183106132b557816132b7565b825b905092915050565b60006132ce8360000183613891565b60001c905092915050565b6000806000806132ec8660000186613905565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061331b9291906140ee565b5050565b6000613332846000018460001b8461398f565b60001c90509392505050565b60606000821415613386576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061349a565b600082905060005b600082146133b85780806133a190614f43565b915050600a826133b19190615019565b915061338e565b60008167ffffffffffffffff8111156133d4576133d361451b565b5b6040519080825280601f01601f1916602001820160405280156134065781602001600182028036833780820191505090505b5090505b600085146134935760018261341f9190614fb6565b9150600a8561342e919061538e565b603061343a9190614ec4565b60f81b8183815181106134505761344f61523c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561348c9190615019565b945061340a565b8093505050505b919050565b60006134ad82600001613a30565b9050919050565b6134c56134bf612cbf565b8361359c565b613504576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fb90615579565b60405180910390fd5b61351084848484613a41565b50505050565b6000613528836000018360001b613a9d565b905092915050565b600081600001805490509050919050565b61354b8383613ac0565b6135586000848484613c4e565b613597576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161358e9061560b565b60405180910390fd5b505050565b60006135a782612ca2565b6135e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135dd9061569d565b60405180910390fd5b60006135f183611c64565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061366057508373ffffffffffffffffffffffffffffffffffffffff1661364884610bb1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061367157506136708185612946565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661369a82611c64565b73ffffffffffffffffffffffffffffffffffffffff16146136f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136e79061572f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613757906157c1565b60405180910390fd5b61376b838383613dd6565b613776600082612cc7565b6137c781600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613ddb90919063ffffffff16565b5061381981600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613df590919063ffffffff16565b5061383081836002613e0f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000818360000180549050116138dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d390615853565b60405180910390fd5b8260000182815481106138f2576138f161523c565b5b9060005260206000200154905092915050565b60008082846000018054905011613951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613948906158e5565b60405180910390fd5b60008460000184815481106139695761396861523c565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906139f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e8919061432d565b60405180910390fd5b5084600001600182613a039190614fb6565b81548110613a1457613a1361523c565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613a4c84848461367a565b613a5884848484613c4e565b613a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8e9061560b565b60405180910390fd5b50505050565b600080836001016000848152602001908152602001600020541415905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2790615951565b60405180910390fd5b613b3981612ca2565b15613b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b70906159bd565b60405180910390fd5b613b8560008383613dd6565b613bd681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613df590919063ffffffff16565b50613bed81836002613e0f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000613c6f8473ffffffffffffffffffffffffffffffffffffffff16613e44565b15613dc9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613c98612cbf565b8786866040518563ffffffff1660e01b8152600401613cba9493929190615a32565b6020604051808303816000875af1925050508015613cf657506040513d601f19601f82011682018060405250810190613cf39190615a93565b60015b613d79573d8060008114613d26576040519150601f19603f3d011682016040523d82523d6000602084013e613d2b565b606091505b50600081511415613d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d689061560b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613dce565b600190505b949350505050565b505050565b6000613ded836000018360001b613e57565b905092915050565b6000613e07836000018360001b613f6f565b905092915050565b6000613e3b846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613fdf565b90509392505050565b600080823b905060008111915050919050565b60008083600101600084815260200190815260200160002054905060008114613f63576000600182613e899190614fb6565b9050600060018660000180549050613ea19190614fb6565b90506000866000018281548110613ebb57613eba61523c565b5b9060005260206000200154905080876000018481548110613edf57613ede61523c565b5b9060005260206000200181905550600183613efa9190614ec4565b8760010160008381526020019081526020016000208190555086600001805480613f2757613f26615ac0565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613f69565b60009150505b92915050565b6000613f7b83836140cb565b613fd4578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613fd9565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415614086578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506140c4565b82856000016001836140989190614fb6565b815481106140a9576140a861523c565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b8280546140fa90614a8b565b90600052602060002090601f01602090048101928261411c5760008555614163565b82601f1061413557805160ff1916838001178555614163565b82800160010185558215614163579182015b82811115614162578251825591602001919060010190614147565b5b5090506141709190614174565b5090565b5b8082111561418d576000816000905550600101614175565b5090565b6000819050919050565b6141a481614191565b82525050565b60006020820190506141bf600083018461419b565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61420e816141d9565b811461421957600080fd5b50565b60008135905061422b81614205565b92915050565b600060208284031215614247576142466141cf565b5b60006142558482850161421c565b91505092915050565b60008115159050919050565b6142738161425e565b82525050565b600060208201905061428e600083018461426a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142ce5780820151818401526020810190506142b3565b838111156142dd576000848401525b50505050565b6000601f19601f8301169050919050565b60006142ff82614294565b614309818561429f565b93506143198185602086016142b0565b614322816142e3565b840191505092915050565b6000602082019050818103600083015261434781846142f4565b905092915050565b61435881614191565b811461436357600080fd5b50565b6000813590506143758161434f565b92915050565b600060208284031215614391576143906141cf565b5b600061439f84828501614366565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143d3826143a8565b9050919050565b6143e3816143c8565b82525050565b60006020820190506143fe60008301846143da565b92915050565b61440d816143c8565b811461441857600080fd5b50565b60008135905061442a81614404565b92915050565b60008060408385031215614447576144466141cf565b5b60006144558582860161441b565b925050602061446685828601614366565b9150509250929050565b600061010082019050614486600083018b61419b565b8181036020830152614498818a6142f4565b905081810360408301526144ac81896142f4565b905081810360608301526144c081886142f4565b905081810360808301526144d481876142f4565b905081810360a08301526144e881866142f4565b90506144f760c08301856143da565b61450460e083018461419b565b9998505050505050505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614553826142e3565b810181811067ffffffffffffffff821117156145725761457161451b565b5b80604052505050565b60006145856141c5565b9050614591828261454a565b919050565b600067ffffffffffffffff8211156145b1576145b061451b565b5b6145ba826142e3565b9050602081019050919050565b82818337600083830152505050565b60006145e96145e484614596565b61457b565b90508281526020810184848401111561460557614604614516565b5b6146108482856145c7565b509392505050565b600082601f83011261462d5761462c614511565b5b813561463d8482602086016145d6565b91505092915050565b60006020828403121561465c5761465b6141cf565b5b600082013567ffffffffffffffff81111561467a576146796141d4565b5b61468684828501614618565b91505092915050565b6000806000606084860312156146a8576146a76141cf565b5b60006146b68682870161441b565b93505060206146c78682870161441b565b92505060406146d886828701614366565b9150509250925092565b6000602082840312156146f8576146f76141cf565b5b60006147068482850161441b565b91505092915050565b60008060408385031215614726576147256141cf565b5b600061473485828601614366565b925050602061474585828601614366565b9150509250929050565b600060408201905061476460008301856143da565b614771602083018461419b565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147ad81614191565b82525050565b60006147bf83836147a4565b60208301905092915050565b6000602082019050919050565b60006147e382614778565b6147ed8185614783565b93506147f883614794565b8060005b8381101561482957815161481088826147b3565b975061481b836147cb565b9250506001810190506147fc565b5085935050505092915050565b6000602082019050818103600083015261485081846147d8565b905092915050565b6148618161425e565b811461486c57600080fd5b50565b60008135905061487e81614858565b92915050565b6000806040838503121561489b5761489a6141cf565b5b60006148a98582860161441b565b92505060206148ba8582860161486f565b9150509250929050565b6000819050919050565b6148d7816148c4565b82525050565b60006020820190506148f260008301846148ce565b92915050565b600067ffffffffffffffff8211156149135761491261451b565b5b61491c826142e3565b9050602081019050919050565b600061493c614937846148f8565b61457b565b90508281526020810184848401111561495857614957614516565b5b6149638482856145c7565b509392505050565b600082601f8301126149805761497f614511565b5b8135614990848260208601614929565b91505092915050565b600080600080608085870312156149b3576149b26141cf565b5b60006149c18782880161441b565b94505060206149d28782880161441b565b93505060406149e387828801614366565b925050606085013567ffffffffffffffff811115614a0457614a036141d4565b5b614a108782880161496b565b91505092959194509250565b60008060408385031215614a3357614a326141cf565b5b6000614a418582860161441b565b9250506020614a528582860161441b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614aa357607f821691505b60208210811415614ab757614ab6614a5c565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614b19602c8361429f565b9150614b2482614abd565b604082019050919050565b60006020820190508181036000830152614b4881614b0c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614bab60218361429f565b9150614bb682614b4f565b604082019050919050565b60006020820190508181036000830152614bda81614b9e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614c3d60388361429f565b9150614c4882614be1565b604082019050919050565b60006020820190508181036000830152614c6c81614c30565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ca960208361429f565b9150614cb482614c73565b602082019050919050565b60006020820190508181036000830152614cd881614c9c565b9050919050565b7f4d696e74696e672069736e2774206f70656e0000000000000000000000000000600082015250565b6000614d1560128361429f565b9150614d2082614cdf565b602082019050919050565b60006020820190508181036000830152614d4481614d08565b9050919050565b600081519050614d5a81614404565b92915050565b600060208284031215614d7657614d756141cf565b5b6000614d8484828501614d4b565b91505092915050565b7f4e6f74206f776e6572206f6620474c4943504958585800000000000000000000600082015250565b6000614dc360168361429f565b9150614dce82614d8d565b602082019050919050565b60006020820190508181036000830152614df281614db6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e3382614191565b9150614e3e83614191565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e7757614e76614df9565b5b828202905092915050565b600081519050614e9181614858565b92915050565b600060208284031215614ead57614eac6141cf565b5b6000614ebb84828501614e82565b91505092915050565b6000614ecf82614191565b9150614eda83614191565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f0f57614f0e614df9565b5b828201905092915050565b6000604082019050614f2f600083018561419b565b614f3c602083018461419b565b9392505050565b6000614f4e82614191565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f8157614f80614df9565b5b600182019050919050565b6000614f9782614191565b91506000821415614fab57614faa614df9565b5b600182039050919050565b6000614fc182614191565b9150614fcc83614191565b925082821015614fdf57614fde614df9565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061502482614191565b915061502f83614191565b92508261503f5761503e614fea565b5b828204905092915050565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b6000615080600e8361429f565b915061508b8261504a565b602082019050919050565b600060208201905081810360008301526150af81615073565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546150e381614a8b565b6150ed81866150b6565b9450600182166000811461510857600181146151195761514c565b60ff1983168652818601935061514c565b615122856150c1565b60005b8381101561514457815481890152600182019150602081019050615125565b838801955050505b50505092915050565b600061516082614294565b61516a81856150b6565b935061517a8185602086016142b0565b80840191505092915050565b600061519282856150d6565b915061519e8284615155565b91508190509392505050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615206602a8361429f565b9150615211826151aa565b604082019050919050565b60006020820190508181036000830152615235816151f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006152a160198361429f565b91506152ac8261526b565b602082019050919050565b600060208201905081810360008301526152d081615294565b9050919050565b60008160601b9050919050565b60006152ef826152d7565b9050919050565b6000615301826152e4565b9050919050565b615319615314826143c8565b6152f6565b82525050565b6000819050919050565b61533a61533582614191565b61531f565b82525050565b600061534c8287615308565b60148201915061535c8286615329565b60208201915061536c8285615308565b60148201915061537c8284615329565b60208201915081905095945050505050565b600061539982614191565b91506153a483614191565b9250826153b4576153b3614fea565b5b828206905092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061541b602f8361429f565b9150615426826153bf565b604082019050919050565b6000602082019050818103600083015261544a8161540e565b9050919050565b600061545d8285615155565b91506154698284615155565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006154d160268361429f565b91506154dc82615475565b604082019050919050565b60006020820190508181036000830152615500816154c4565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061556360318361429f565b915061556e82615507565b604082019050919050565b6000602082019050818103600083015261559281615556565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006155f560328361429f565b915061560082615599565b604082019050919050565b60006020820190508181036000830152615624816155e8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000615687602c8361429f565b91506156928261562b565b604082019050919050565b600060208201905081810360008301526156b68161567a565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061571960298361429f565b9150615724826156bd565b604082019050919050565b600060208201905081810360008301526157488161570c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006157ab60248361429f565b91506157b68261574f565b604082019050919050565b600060208201905081810360008301526157da8161579e565b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061583d60228361429f565b9150615848826157e1565b604082019050919050565b6000602082019050818103600083015261586c81615830565b9050919050565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006158cf60228361429f565b91506158da82615873565b604082019050919050565b600060208201905081810360008301526158fe816158c2565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061593b60208361429f565b915061594682615905565b602082019050919050565b6000602082019050818103600083015261596a8161592e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006159a7601c8361429f565b91506159b282615971565b602082019050919050565b600060208201905081810360008301526159d68161599a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615a04826159dd565b615a0e81856159e8565b9350615a1e8185602086016142b0565b615a27816142e3565b840191505092915050565b6000608082019050615a4760008301876143da565b615a5460208301866143da565b615a61604083018561419b565b8181036060830152615a7381846159f9565b905095945050505050565b600081519050615a8d81614205565b92915050565b600060208284031215615aa957615aa86141cf565b5b6000615ab784828501615a7e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220bbbe0fff368eba233dad95e0ad1e00872a40dcdedfccf236b78439ddf5919b4964736f6c634300080b0033

Deployed Bytecode Sourcemap

63794:14291:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63902:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70484:283;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64131:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47139:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49925:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49455:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48933:211;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65304:30;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;64555:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77361:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72669:782;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75984:265;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63953:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73998:350;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70814:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;77960:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64091:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48695:162;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75704:272;;;:::i;:::-;;51191:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77621:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73564:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49221:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76845:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77097:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46895:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72142:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64727:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48514:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46585:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62000:148;;;:::i;:::-;;71185:540;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61349:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73734:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47308:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50218:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71825:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76666:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64667:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64617:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76257:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72469:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47483:792;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63982:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64038:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77011:78;;;:::i;:::-;;77489:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77213:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50584:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77775:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62303:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64500:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64793:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63902:44;63941:5;63902:44;:::o;70484:283::-;70614:4;70671:35;70656:50;;;:11;:50;;;;:103;;;;70723:36;70747:11;70723:23;:36::i;:::-;70656:103;70636:123;;70484:283;;;:::o;64131:39::-;;;;:::o;47139:100::-;47193:13;47226:5;47219:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47139:100;:::o;49925:221::-;50001:7;50029:16;50037:7;50029;:16::i;:::-;50021:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50114:15;:24;50130:7;50114:24;;;;;;;;;;;;;;;;;;;;;50107:31;;49925:221;;;:::o;49455:404::-;49536:13;49552:23;49567:7;49552:14;:23::i;:::-;49536:39;;49600:5;49594:11;;:2;:11;;;;49586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49680:5;49664:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;49689:44;49713:5;49720:12;:10;:12::i;:::-;49689:23;:44::i;:::-;49664:69;49656:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;49830:21;49839:2;49843:7;49830:8;:21::i;:::-;49525:334;49455:404;;:::o;48933:211::-;48994:7;49115:21;:12;:19;:21::i;:::-;49108:28;;48933:211;:::o;65304:30::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64555:53::-;;;;;;;;;;;;;;;;;:::o;77361:120::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77466:7:::1;77445:11;:18;;:28;;;;;;;;;;;;:::i;:::-;;77361:120:::0;:::o;72669:782::-;72766:4;72754:16;;:8;;;;;;;;;;;:16;;;72746:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;72853:10;72812:51;;:15;;;;;;;;;;;:23;;;72836:12;72812:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;72804:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;72901:8;72912:18;:32;72931:12;72912:32;;;;;;;;;;;;72901:43;;72965:1;72959:3;:7;72955:96;;;72983:9;;;;;;;;;;;:14;;;72998:10;73016:15;;73010:3;:21;;;;:::i;:::-;72983:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;72955:96;73061:14;73112:3;63941:5;73094:21;;;;:::i;:::-;73078:12;:38;;;;:::i;:::-;73061:55;;73127:25;73137:3;73142:9;73127;:25::i;:::-;73173:3;73168:25;;;73178:9;73189:3;73168:25;;;;;;;:::i;:::-;;;;;;;;73231:12;73204:13;:24;73218:9;73204:24;;;;;;;;;;;:39;;;;73276:10;73254:8;:19;73263:9;73254:19;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;73308:1;73301:3;:8;73297:102;;;73325:27;73348:3;73325:22;:27::i;:::-;73367:13;:18;73381:3;73367:18;;;;;;;;;;;;;;;;:20;;;;;;;;;:::i;:::-;;;;;;73297:102;73409:18;:32;73428:12;73409:32;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;72735:716;;72669:782;;:::o;75984:265::-;76070:35;76087:4;76093:2;76097:7;76070:16;:35::i;:::-;63941:5;76114:7;:25;76110:92;;;76150:13;:19;76164:4;76150:19;;;;;;;;;;;;;;;;:21;;;;;;;;;:::i;:::-;;;;;;76177:13;:17;76191:2;76177:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;;76110:92;76206:38;76226:4;76232:2;76236:7;76206:19;:38::i;:::-;75984:265;;;:::o;63953:20::-;;;;;;;;;;;;;:::o;73998:350::-;74063:7;74083:12;74098:31;74102:15;74119:9;;74098:3;:31::i;:::-;74083:46;;74134:17;74154:16;:23;74171:5;74154:23;;;;;;;;;;;;;;;;74134:43;;74198:1;74186:9;:13;74182:158;;;74297:5;74284:9;74277:4;:16;;;;:::i;:::-;74257;;74234:13;:20;74248:5;74234:20;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:60;;;;:::i;:::-;:68;;;;:::i;:::-;74212:11;:18;74224:5;74212:18;;;;;;;;;;;;;;;;:91;;;;:::i;:::-;74205:98;;;;;;74182:158;74339:1;74332:8;;;;73998:350;;;;:::o;70814:286::-;70927:16;70945:21;70995:11;:27;;;;;;;;;;;;70984:38;;71087:5;71058:11;:25;;;71050:5;:33;;;;:::i;:::-;71049:43;;;;:::i;:::-;71033:59;;70814:286;;;;;:::o;77960:116::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78061:7:::1;78040:11;:18;;:28;;;;;;;;;;;;:::i;:::-;;77960:116:::0;:::o;64091:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48695:162::-;48792:7;48819:30;48843:5;48819:13;:20;48833:5;48819:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;48812:37;;48695:162;;;;:::o;75704:272::-;75743:43;75760:10;75780:1;75784;75743:16;:43::i;:::-;75791:14;75808:11;:23;75820:10;75808:23;;;;;;;;;;;;;;;;75791:40;;75849:1;75840:6;:10;75836:136;;;75884:1;75858:11;:23;75870:10;75858:23;;;;;;;;;;;;;;;:27;;;;75891:9;;;;;;;;;;;:14;;;75906:10;75918:6;75891:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;75947:10;75936:30;;;75959:6;75936:30;;;;;;:::i;:::-;;;;;;;;75836:136;75732:244;75704:272::o;51191:151::-;51295:39;51312:4;51318:2;51322:7;51295:39;;;;;;;;;;;;:16;:39::i;:::-;51191:151;;;:::o;77621:146::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77743:16:::1;77713:11;:27;;;:46;;;;;;;;;;;;;;;;;;77621:146:::0;:::o;73564:104::-;73620:4;73644:16;73652:7;73644;:16::i;:::-;73637:23;;73564:104;;;:::o;49221:172::-;49296:7;49317:15;49338:22;49354:5;49338:12;:15;;:22;;;;:::i;:::-;49316:44;;;49378:7;49371:14;;;49221:172;;;:::o;76845:99::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76916:20:::1;76928:7;76916:11;:20::i;:::-;76845:99:::0;:::o;77097:108::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77192:5:::1;77173:11;:16;;:24;;;;;;;;;;;;:::i;:::-;;77097:108:::0;:::o;46895:177::-;46967:7;46994:70;47011:7;46994:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;46987:77;;46895:177;;;:::o;72142:222::-;72206:13;72240:16;72248:7;72240;:16::i;:::-;72232:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;72317:17;72336:18;:7;:16;:18::i;:::-;72300:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72286:70;;72142:222;;;:::o;64727:39::-;;;;:::o;48514:97::-;48562:13;48595:8;48588:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48514:97;:::o;46585:221::-;46657:7;46702:1;46685:19;;:5;:19;;;;46677:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;46769:29;:13;:20;46783:5;46769:20;;;;;;;;;;;;;;;:27;:29::i;:::-;46762:36;;46585:221;;;:::o;62000:148::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62107:1:::1;62070:40;;62091:6;;;;;;;;;;;62070:40;;;;;;;;;;;;62138:1;62121:6;;:19;;;;;;;;;;;;;;;;;;62000:148::o:0;71185:540::-;71246:16;71276:18;71297:17;71307:6;71297:9;:17::i;:::-;71276:38;;71343:1;71329:10;:15;71325:393;;;71420:1;71406:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71399:23;;;;;71325:393;71455:23;71495:10;71481:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71455:51;;71521:13;71549:130;71573:10;71565:5;:18;71549:130;;;71629:34;71649:6;71657:5;71629:19;:34::i;:::-;71613:6;71620:5;71613:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;71585:7;;;;;:::i;:::-;;;;71549:130;;;71700:6;71693:13;;;;;71185:540;;;;:::o;61349:87::-;61395:7;61422:6;;;;;;;;;;;61415:13;;61349:87;:::o;73734:164::-;73802:7;73830:16;73838:7;73830;:16::i;:::-;73822:25;;;;;;63941:5;73865:7;:25;;;;:::i;:::-;73858:32;;73734:164;;;:::o;47308:104::-;47364:13;47397:7;47390:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47308:104;:::o;50218:295::-;50333:12;:10;:12::i;:::-;50321:24;;:8;:24;;;;50313:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50433:8;50388:18;:32;50407:12;:10;:12::i;:::-;50388:32;;;;;;;;;;;;;;;:42;50421:8;50388:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;50486:8;50457:48;;50472:12;:10;:12::i;:::-;50457:48;;;50496:8;50457:48;;;;;;:::i;:::-;;;;;;;;50218:295;;:::o;71825:247::-;71881:7;71908:16;71916:7;71908;:16::i;:::-;71900:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;72004:4;72011:13;:22;72025:7;72011:22;;;;;;;;;;;;72035:8;:17;72044:7;72035:17;;;;;;;;;;;;;;;;;;;;;72054:7;71979:83;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71969:94;;;;;;71954:110;;71825:247;;;:::o;76666:117::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76767:8:::1;76747:17;:28;;;;;;;;;;;;:::i;:::-;;76666:117:::0;:::o;64667:51::-;;;;;;;;;;;;;;;;;:::o;64617:46::-;;;;;;;;;;;;;;;;;:::o;76257:300::-;76367:35;76384:4;76390:2;76394:7;76367:16;:35::i;:::-;63941:5;76411:7;:25;76407:92;;;76447:13;:19;76461:4;76447:19;;;;;;;;;;;;;;;;:21;;;;;;;;;:::i;:::-;;;;;;76474:13;:17;76488:2;76474:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;;76407:92;76503:49;76527:4;76533:2;76537:7;76546:5;76503:23;:49::i;:::-;76257:300;;;;:::o;72469:144::-;72522:4;72590:15;;72546:18;:41;63941:5;72565:3;:21;;;;:::i;:::-;72546:41;;;;;;;;;;;;:59;;;;:::i;:::-;72539:66;;72469:144;;;:::o;47483:792::-;47556:13;47590:16;47598:7;47590;:16::i;:::-;47582:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47671:23;47697:10;:19;47708:7;47697:19;;;;;;;;;;;47671:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47727:18;47748:9;:7;:9::i;:::-;47727:30;;47855:1;47839:4;47833:18;:23;47829:72;;;47880:9;47873:16;;;;;;47829:72;48031:1;48011:9;48005:23;:27;48001:108;;;48080:4;48086:9;48063:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48049:48;;;;;;48001:108;48241:4;48247:18;:7;:16;:18::i;:::-;48224:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48210:57;;;;47483:792;;;;:::o;63982:49::-;;;;;;;;;;;;;;;;;:::o;64038:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;77011:78::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77073:8:::1;;;;;;;;;;;77072:9;77061:8;;:20;;;;;;;;;;;;;;;;;;77011:78::o:0;77489:120::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77593:8:::1;77571:11;:19;;:30;;;;;;;;;;;;:::i;:::-;;77489:120:::0;:::o;77213:136::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77329:12:::1;77303:11;:23;;:38;;;;;;;;;;;;:::i;:::-;;77213:136:::0;:::o;50584:164::-;50681:4;50705:18;:25;50724:5;50705:25;;;;;;;;;;;;;;;:35;50731:8;50705:35;;;;;;;;;;;;;;;;;;;;;;;;;50698:42;;50584:164;;;;:::o;77775:177::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77886:4:::1;77869:14;:21;77860:31;;;::::0;::::1;;77930:14;77902:11;:25;;:42;;;;77775:177:::0;:::o;62303:244::-;61580:12;:10;:12::i;:::-;61569:23;;:7;:5;:7::i;:::-;:23;;;61561:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62412:1:::1;62392:22;;:8;:22;;;;62384:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;62502:8;62473:38;;62494:6;;;;;;;;;;;62473:38;;;;;;;;;;;;62531:8;62522:6;;:17;;;;;;;;;;;;;;;;;;62303:244:::0;:::o;64500:48::-;;;;;;;;;;;;;;;;;:::o;64793:51::-;;;;:::o;35444:150::-;35529:4;35553:20;:33;35574:11;35553:33;;;;;;;;;;;;;;;;;;;;;;;;;;;35546:40;;35444:150;;;:::o;53165:127::-;53230:4;53254:30;53276:7;53254:12;:21;;:30;;;;:::i;:::-;53247:37;;53165:127;;;:::o;44375:98::-;44428:7;44455:10;44448:17;;44375:98;:::o;59309:183::-;59402:2;59375:15;:24;59391:7;59375:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59458:7;59454:2;59420:46;;59429:23;59444:7;59429:14;:23::i;:::-;59420:46;;;;;;;;;;;;59309:183;;:::o;13901:123::-;13970:7;13997:19;14005:3;:10;;13997:7;:19::i;:::-;13990:26;;13901:123;;;:::o;54157:110::-;54233:26;54243:2;54247:7;54233:26;;;;;;;;;;;;:9;:26::i;:::-;54157:110;;:::o;74508:356::-;74569:12;74584:31;74588:15;74605:9;;74584:3;:31::i;:::-;74569:46;;74620:17;74640:16;:23;74657:5;74640:23;;;;;;;;;;;;;;;;74620:43;;74684:1;74672:9;:13;74668:115;;;74777:5;74764:9;74757:4;:16;;;;:::i;:::-;74737;;74714:13;:20;74728:5;74714:20;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:60;;;;:::i;:::-;:68;;;;:::i;:::-;74691:11;:18;74703:5;74691:18;;;;;;;;;;;;;;;;:92;;;;;;;:::i;:::-;;;;;;;;74668:115;74811:9;;74798;:22;74794:65;;74855:4;74829:16;:23;74846:5;74829:23;;;;;;;;;;;;;;;:30;;;;74794:65;74564:300;;74508:356;:::o;74917:684::-;63941:5;75007:8;:26;75003:594;;;75041:12;75056:31;75060:15;75077:9;;75056:3;:31::i;:::-;75041:46;;75093:17;75113:16;:23;75130:5;75113:23;;;;;;;;;;;;;;;;75093:43;;75158:1;75146:9;:13;75142:116;;;75252:5;75239:9;75232:4;:16;;;;:::i;:::-;75212;;75189:13;:20;75203:5;75189:20;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:60;;;;:::i;:::-;:68;;;;:::i;:::-;75166:11;:18;75178:5;75166:18;;;;;;;;;;;;;;;;:92;;;;;;;:::i;:::-;;;;;;;;75142:116;75281:9;;75268;:22;75264:63;;75323:4;75297:16;:23;75314:5;75297:23;;;;;;;;;;;;;;;:30;;;;75264:63;75352:1;75337:17;;:3;:17;;;75333:259;;75363:15;75381:16;:21;75398:3;75381:21;;;;;;;;;;;;;;;;75363:39;;75423:1;75413:7;:11;75409:109;;;75512:5;75501:7;75494:4;:14;;;;:::i;:::-;75474:16;;75453:13;:18;75467:3;75453:18;;;;;;;;;;;;;;;;:37;;;;:::i;:::-;:56;;;;:::i;:::-;:64;;;;:::i;:::-;75432:11;:16;75444:3;75432:16;;;;;;;;;;;;;;;;:86;;;;;;;:::i;:::-;;;;;;;;75409:109;75540:9;;75529:7;:20;75525:60;;75581:4;75557:16;:21;75574:3;75557:21;;;;;;;;;;;;;;;:28;;;;75525:60;75356:236;75333:259;75035:562;;75003:594;74917:684;;;:::o;50815:305::-;50976:41;50995:12;:10;:12::i;:::-;51009:7;50976:18;:41::i;:::-;50968:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51084:28;51094:4;51100:2;51104:7;51084:9;:28::i;:::-;50815:305;;;:::o;73459:97::-;73517:7;73542:1;73538;:5;:13;;73550:1;73538:13;;;73546:1;73538:13;73531:20;;73459:97;;;;:::o;25475:137::-;25546:7;25581:22;25585:3;:10;;25597:5;25581:3;:22::i;:::-;25573:31;;25566:38;;25475:137;;;;:::o;14363:236::-;14443:7;14452;14473:11;14486:13;14503:22;14507:3;:10;;14519:5;14503:3;:22::i;:::-;14472:53;;;;14552:3;14544:12;;14582:5;14574:14;;14536:55;;;;;;14363:236;;;;;:::o;57793:100::-;57877:8;57866;:19;;;;;;;;;;;;:::i;:::-;;57793:100;:::o;15649:213::-;15756:7;15807:44;15812:3;:10;;15832:3;15824:12;;15838;15807:4;:44::i;:::-;15799:53;;15776:78;;15649:213;;;;;:::o;4045:723::-;4101:13;4331:1;4322:5;:10;4318:53;;;4349:10;;;;;;;;;;;;;;;;;;;;;4318:53;4381:12;4396:5;4381:20;;4412:14;4437:78;4452:1;4444:4;:9;4437:78;;4470:8;;;;;:::i;:::-;;;;4501:2;4493:10;;;;;:::i;:::-;;;4437:78;;;4525:19;4557:6;4547:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4525:39;;4575:154;4591:1;4582:5;:10;4575:154;;4619:1;4609:11;;;;;:::i;:::-;;;4686:2;4678:5;:10;;;;:::i;:::-;4665:2;:24;;;;:::i;:::-;4652:39;;4635:6;4642;4635:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4715:2;4706:11;;;;;:::i;:::-;;;4575:154;;;4753:6;4739:21;;;;;4045:723;;;;:::o;25017:114::-;25077:7;25104:19;25112:3;:10;;25104:7;:19::i;:::-;25097:26;;25017:114;;;:::o;51413:285::-;51545:41;51564:12;:10;:12::i;:::-;51578:7;51545:18;:41::i;:::-;51537:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;51651:39;51665:4;51671:2;51675:7;51684:5;51651:13;:39::i;:::-;51413:285;;;;:::o;13662:151::-;13746:4;13770:35;13780:3;:10;;13800:3;13792:12;;13770:9;:35::i;:::-;13763:42;;13662:151;;;;:::o;10480:110::-;10536:7;10563:3;:12;;:19;;;;10556:26;;10480:110;;;:::o;54494:250::-;54590:18;54596:2;54600:7;54590:5;:18::i;:::-;54627:54;54658:1;54662:2;54666:7;54675:5;54627:22;:54::i;:::-;54619:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;54494:250;;;:::o;53459:355::-;53552:4;53577:16;53585:7;53577;:16::i;:::-;53569:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53653:13;53669:23;53684:7;53669:14;:23::i;:::-;53653:39;;53722:5;53711:16;;:7;:16;;;:51;;;;53755:7;53731:31;;:20;53743:7;53731:11;:20::i;:::-;:31;;;53711:51;:94;;;;53766:39;53790:5;53797:7;53766:23;:39::i;:::-;53711:94;53703:103;;;53459:355;;;;:::o;56595:597::-;56720:4;56693:31;;:23;56708:7;56693:14;:23::i;:::-;:31;;;56685:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56821:1;56807:16;;:2;:16;;;;56799:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56877:39;56898:4;56904:2;56908:7;56877:20;:39::i;:::-;56981:29;56998:1;57002:7;56981:8;:29::i;:::-;57023:35;57050:7;57023:13;:19;57037:4;57023:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;57069:30;57091:7;57069:13;:17;57083:2;57069:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;57112:29;57129:7;57138:2;57112:12;:16;;:29;;;;;:::i;:::-;;57176:7;57172:2;57157:27;;57166:4;57157:27;;;;;;;;;;;;56595:597;;;:::o;20513:204::-;20580:7;20629:5;20608:3;:11;;:18;;;;:26;20600:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20691:3;:11;;20703:5;20691:18;;;;;;;;:::i;:::-;;;;;;;;;;20684:25;;20513:204;;;;:::o;10945:279::-;11012:7;11021;11071:5;11049:3;:12;;:19;;;;:27;11041:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;11128:22;11153:3;:12;;11166:5;11153:19;;;;;;;;:::i;:::-;;;;;;;;;;;;11128:44;;11191:5;:10;;;11203:5;:12;;;11183:33;;;;;10945:279;;;;;:::o;12442:319::-;12536:7;12556:16;12575:3;:12;;:17;12588:3;12575:17;;;;;;;;;;;;12556:36;;12623:1;12611:8;:13;;12626:12;12603:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12693:3;:12;;12717:1;12706:8;:12;;;;:::i;:::-;12693:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;12686:40;;;12442:319;;;;;:::o;20060:109::-;20116:7;20143:3;:11;;:18;;;;20136:25;;20060:109;;;:::o;52580:272::-;52694:28;52704:4;52710:2;52714:7;52694:9;:28::i;:::-;52741:48;52764:4;52770:2;52774:7;52783:5;52741:22;:48::i;:::-;52733:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;52580:272;;;;:::o;10260:125::-;10331:4;10376:1;10355:3;:12;;:17;10368:3;10355:17;;;;;;;;;;;;:22;;10348:29;;10260:125;;;;:::o;55080:404::-;55174:1;55160:16;;:2;:16;;;;55152:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55233:16;55241:7;55233;:16::i;:::-;55232:17;55224:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;55295:45;55324:1;55328:2;55332:7;55295:20;:45::i;:::-;55353:30;55375:7;55353:13;:17;55367:2;55353:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;55396:29;55413:7;55422:2;55396:12;:16;;:29;;;;;:::i;:::-;;55468:7;55464:2;55443:33;;55460:1;55443:33;;;;;;;;;;;;55080:404;;:::o;58458:843::-;58579:4;58605:15;:2;:13;;;:15::i;:::-;58601:693;;;58657:2;58641:36;;;58678:12;:10;:12::i;:::-;58692:4;58698:7;58707:5;58641:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;58637:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58904:1;58887:6;:13;:18;58883:341;;;58930:60;;;;;;;;;;:::i;:::-;;;;;;;;58883:341;59174:6;59168:13;59159:6;59155:2;59151:15;59144:38;58637:602;58774:45;;;58764:55;;;:6;:55;;;;58757:62;;;;;58601:693;59278:4;59271:11;;58458:843;;;;;;;:::o;60105:93::-;;;;:::o;24562:137::-;24632:4;24656:35;24664:3;:10;;24684:5;24676:14;;24656:7;:35::i;:::-;24649:42;;24562:137;;;;:::o;24255:131::-;24322:4;24346:32;24351:3;:10;;24371:5;24363:14;;24346:4;:32::i;:::-;24339:39;;24255:131;;;;:::o;13085:185::-;13174:4;13198:64;13203:3;:10;;13223:3;13215:12;;13253:5;13237:23;;13229:32;;13198:4;:64::i;:::-;13191:71;;13085:185;;;;;:::o;26427:422::-;26487:4;26695:12;26806:7;26794:20;26786:28;;26840:1;26833:4;:8;26826:15;;;26427:422;;;:::o;18215:1544::-;18281:4;18399:18;18420:3;:12;;:19;18433:5;18420:19;;;;;;;;;;;;18399:40;;18470:1;18456:10;:15;18452:1300;;18818:21;18855:1;18842:10;:14;;;;:::i;:::-;18818:38;;18871:17;18912:1;18891:3;:11;;:18;;;;:22;;;;:::i;:::-;18871:42;;19158:17;19178:3;:11;;19190:9;19178:22;;;;;;;;:::i;:::-;;;;;;;;;;19158:42;;19324:9;19295:3;:11;;19307:13;19295:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;19443:1;19427:13;:17;;;;:::i;:::-;19401:3;:12;;:23;19414:9;19401:23;;;;;;;;;;;:43;;;;19553:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19648:3;:12;;:19;19661:5;19648:19;;;;;;;;;;;19641:26;;;19691:4;19684:11;;;;;;;;18452:1300;19735:5;19728:12;;;18215:1544;;;;;:::o;17625:414::-;17688:4;17710:21;17720:3;17725:5;17710:9;:21::i;:::-;17705:327;;17748:3;:11;;17765:5;17748:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17931:3;:11;;:18;;;;17909:3;:12;;:19;17922:5;17909:19;;;;;;;;;;;:40;;;;17971:4;17964:11;;;;17705:327;18015:5;18008:12;;17625:414;;;;;:::o;7760:692::-;7836:4;7952:16;7971:3;:12;;:17;7984:3;7971:17;;;;;;;;;;;;7952:36;;8017:1;8005:8;:13;8001:444;;;8072:3;:12;;8090:38;;;;;;;;8107:3;8090:38;;;;8120:5;8090:38;;;8072:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8287:3;:12;;:19;;;;8267:3;:12;;:17;8280:3;8267:17;;;;;;;;;;;:39;;;;8328:4;8321:11;;;;;8001:444;8401:5;8365:3;:12;;8389:1;8378:8;:12;;;;:::i;:::-;8365:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;:41;;;;8428:5;8421:12;;;7760:692;;;;;;:::o;19845:129::-;19918:4;19965:1;19942:3;:12;;:19;19955:5;19942:19;;;;;;;;;;;;:24;;19935:31;;19845:129;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:1452::-;5679:4;5717:3;5706:9;5702:19;5694:27;;5731:71;5799:1;5788:9;5784:17;5775:6;5731:71;:::i;:::-;5849:9;5843:4;5839:20;5834:2;5823:9;5819:18;5812:48;5877:78;5950:4;5941:6;5877:78;:::i;:::-;5869:86;;6002:9;5996:4;5992:20;5987:2;5976:9;5972:18;5965:48;6030:78;6103:4;6094:6;6030:78;:::i;:::-;6022:86;;6155:9;6149:4;6145:20;6140:2;6129:9;6125:18;6118:48;6183:78;6256:4;6247:6;6183:78;:::i;:::-;6175:86;;6309:9;6303:4;6299:20;6293:3;6282:9;6278:19;6271:49;6337:78;6410:4;6401:6;6337:78;:::i;:::-;6329:86;;6463:9;6457:4;6453:20;6447:3;6436:9;6432:19;6425:49;6491:78;6564:4;6555:6;6491:78;:::i;:::-;6483:86;;6579:73;6647:3;6636:9;6632:19;6623:6;6579:73;:::i;:::-;6662;6730:3;6719:9;6715:19;6706:6;6662:73;:::i;:::-;5290:1452;;;;;;;;;;;:::o;6748:117::-;6857:1;6854;6847:12;6871:117;6980:1;6977;6970:12;6994:180;7042:77;7039:1;7032:88;7139:4;7136:1;7129:15;7163:4;7160:1;7153:15;7180:281;7263:27;7285:4;7263:27;:::i;:::-;7255:6;7251:40;7393:6;7381:10;7378:22;7357:18;7345:10;7342:34;7339:62;7336:88;;;7404:18;;:::i;:::-;7336:88;7444:10;7440:2;7433:22;7223:238;7180:281;;:::o;7467:129::-;7501:6;7528:20;;:::i;:::-;7518:30;;7557:33;7585:4;7577:6;7557:33;:::i;:::-;7467:129;;;:::o;7602:308::-;7664:4;7754:18;7746:6;7743:30;7740:56;;;7776:18;;:::i;:::-;7740:56;7814:29;7836:6;7814:29;:::i;:::-;7806:37;;7898:4;7892;7888:15;7880:23;;7602:308;;;:::o;7916:154::-;8000:6;7995:3;7990;7977:30;8062:1;8053:6;8048:3;8044:16;8037:27;7916:154;;;:::o;8076:412::-;8154:5;8179:66;8195:49;8237:6;8195:49;:::i;:::-;8179:66;:::i;:::-;8170:75;;8268:6;8261:5;8254:21;8306:4;8299:5;8295:16;8344:3;8335:6;8330:3;8326:16;8323:25;8320:112;;;8351:79;;:::i;:::-;8320:112;8441:41;8475:6;8470:3;8465;8441:41;:::i;:::-;8160:328;8076:412;;;;;:::o;8508:340::-;8564:5;8613:3;8606:4;8598:6;8594:17;8590:27;8580:122;;8621:79;;:::i;:::-;8580:122;8738:6;8725:20;8763:79;8838:3;8830:6;8823:4;8815:6;8811:17;8763:79;:::i;:::-;8754:88;;8570:278;8508:340;;;;:::o;8854:509::-;8923:6;8972:2;8960:9;8951:7;8947:23;8943:32;8940:119;;;8978:79;;:::i;:::-;8940:119;9126:1;9115:9;9111:17;9098:31;9156:18;9148:6;9145:30;9142:117;;;9178:79;;:::i;:::-;9142:117;9283:63;9338:7;9329:6;9318:9;9314:22;9283:63;:::i;:::-;9273:73;;9069:287;8854:509;;;;:::o;9369:619::-;9446:6;9454;9462;9511:2;9499:9;9490:7;9486:23;9482:32;9479:119;;;9517:79;;:::i;:::-;9479:119;9637:1;9662:53;9707:7;9698:6;9687:9;9683:22;9662:53;:::i;:::-;9652:63;;9608:117;9764:2;9790:53;9835:7;9826:6;9815:9;9811:22;9790:53;:::i;:::-;9780:63;;9735:118;9892:2;9918:53;9963:7;9954:6;9943:9;9939:22;9918:53;:::i;:::-;9908:63;;9863:118;9369:619;;;;;:::o;9994:329::-;10053:6;10102:2;10090:9;10081:7;10077:23;10073:32;10070:119;;;10108:79;;:::i;:::-;10070:119;10228:1;10253:53;10298:7;10289:6;10278:9;10274:22;10253:53;:::i;:::-;10243:63;;10199:117;9994:329;;;;:::o;10329:474::-;10397:6;10405;10454:2;10442:9;10433:7;10429:23;10425:32;10422:119;;;10460:79;;:::i;:::-;10422:119;10580:1;10605:53;10650:7;10641:6;10630:9;10626:22;10605:53;:::i;:::-;10595:63;;10551:117;10707:2;10733:53;10778:7;10769:6;10758:9;10754:22;10733:53;:::i;:::-;10723:63;;10678:118;10329:474;;;;;:::o;10809:332::-;10930:4;10968:2;10957:9;10953:18;10945:26;;10981:71;11049:1;11038:9;11034:17;11025:6;10981:71;:::i;:::-;11062:72;11130:2;11119:9;11115:18;11106:6;11062:72;:::i;:::-;10809:332;;;;;:::o;11147:114::-;11214:6;11248:5;11242:12;11232:22;;11147:114;;;:::o;11267:184::-;11366:11;11400:6;11395:3;11388:19;11440:4;11435:3;11431:14;11416:29;;11267:184;;;;:::o;11457:132::-;11524:4;11547:3;11539:11;;11577:4;11572:3;11568:14;11560:22;;11457:132;;;:::o;11595:108::-;11672:24;11690:5;11672:24;:::i;:::-;11667:3;11660:37;11595:108;;:::o;11709:179::-;11778:10;11799:46;11841:3;11833:6;11799:46;:::i;:::-;11877:4;11872:3;11868:14;11854:28;;11709:179;;;;:::o;11894:113::-;11964:4;11996;11991:3;11987:14;11979:22;;11894:113;;;:::o;12043:732::-;12162:3;12191:54;12239:5;12191:54;:::i;:::-;12261:86;12340:6;12335:3;12261:86;:::i;:::-;12254:93;;12371:56;12421:5;12371:56;:::i;:::-;12450:7;12481:1;12466:284;12491:6;12488:1;12485:13;12466:284;;;12567:6;12561:13;12594:63;12653:3;12638:13;12594:63;:::i;:::-;12587:70;;12680:60;12733:6;12680:60;:::i;:::-;12670:70;;12526:224;12513:1;12510;12506:9;12501:14;;12466:284;;;12470:14;12766:3;12759:10;;12167:608;;;12043:732;;;;:::o;12781:373::-;12924:4;12962:2;12951:9;12947:18;12939:26;;13011:9;13005:4;13001:20;12997:1;12986:9;12982:17;12975:47;13039:108;13142:4;13133:6;13039:108;:::i;:::-;13031:116;;12781:373;;;;:::o;13160:116::-;13230:21;13245:5;13230:21;:::i;:::-;13223:5;13220:32;13210:60;;13266:1;13263;13256:12;13210:60;13160:116;:::o;13282:133::-;13325:5;13363:6;13350:20;13341:29;;13379:30;13403:5;13379:30;:::i;:::-;13282:133;;;;:::o;13421:468::-;13486:6;13494;13543:2;13531:9;13522:7;13518:23;13514:32;13511:119;;;13549:79;;:::i;:::-;13511:119;13669:1;13694:53;13739:7;13730:6;13719:9;13715:22;13694:53;:::i;:::-;13684:63;;13640:117;13796:2;13822:50;13864:7;13855:6;13844:9;13840:22;13822:50;:::i;:::-;13812:60;;13767:115;13421:468;;;;;:::o;13895:77::-;13932:7;13961:5;13950:16;;13895:77;;;:::o;13978:118::-;14065:24;14083:5;14065:24;:::i;:::-;14060:3;14053:37;13978:118;;:::o;14102:222::-;14195:4;14233:2;14222:9;14218:18;14210:26;;14246:71;14314:1;14303:9;14299:17;14290:6;14246:71;:::i;:::-;14102:222;;;;:::o;14330:307::-;14391:4;14481:18;14473:6;14470:30;14467:56;;;14503:18;;:::i;:::-;14467:56;14541:29;14563:6;14541:29;:::i;:::-;14533:37;;14625:4;14619;14615:15;14607:23;;14330:307;;;:::o;14643:410::-;14720:5;14745:65;14761:48;14802:6;14761:48;:::i;:::-;14745:65;:::i;:::-;14736:74;;14833:6;14826:5;14819:21;14871:4;14864:5;14860:16;14909:3;14900:6;14895:3;14891:16;14888:25;14885:112;;;14916:79;;:::i;:::-;14885:112;15006:41;15040:6;15035:3;15030;15006:41;:::i;:::-;14726:327;14643:410;;;;;:::o;15072:338::-;15127:5;15176:3;15169:4;15161:6;15157:17;15153:27;15143:122;;15184:79;;:::i;:::-;15143:122;15301:6;15288:20;15326:78;15400:3;15392:6;15385:4;15377:6;15373:17;15326:78;:::i;:::-;15317:87;;15133:277;15072:338;;;;:::o;15416:943::-;15511:6;15519;15527;15535;15584:3;15572:9;15563:7;15559:23;15555:33;15552:120;;;15591:79;;:::i;:::-;15552:120;15711:1;15736:53;15781:7;15772:6;15761:9;15757:22;15736:53;:::i;:::-;15726:63;;15682:117;15838:2;15864:53;15909:7;15900:6;15889:9;15885:22;15864:53;:::i;:::-;15854:63;;15809:118;15966:2;15992:53;16037:7;16028:6;16017:9;16013:22;15992:53;:::i;:::-;15982:63;;15937:118;16122:2;16111:9;16107:18;16094:32;16153:18;16145:6;16142:30;16139:117;;;16175:79;;:::i;:::-;16139:117;16280:62;16334:7;16325:6;16314:9;16310:22;16280:62;:::i;:::-;16270:72;;16065:287;15416:943;;;;;;;:::o;16365:474::-;16433:6;16441;16490:2;16478:9;16469:7;16465:23;16461:32;16458:119;;;16496:79;;:::i;:::-;16458:119;16616:1;16641:53;16686:7;16677:6;16666:9;16662:22;16641:53;:::i;:::-;16631:63;;16587:117;16743:2;16769:53;16814:7;16805:6;16794:9;16790:22;16769:53;:::i;:::-;16759:63;;16714:118;16365:474;;;;;:::o;16845:180::-;16893:77;16890:1;16883:88;16990:4;16987:1;16980:15;17014:4;17011:1;17004:15;17031:320;17075:6;17112:1;17106:4;17102:12;17092:22;;17159:1;17153:4;17149:12;17180:18;17170:81;;17236:4;17228:6;17224:17;17214:27;;17170:81;17298:2;17290:6;17287:14;17267:18;17264:38;17261:84;;;17317:18;;:::i;:::-;17261:84;17082:269;17031:320;;;:::o;17357:231::-;17497:34;17493:1;17485:6;17481:14;17474:58;17566:14;17561:2;17553:6;17549:15;17542:39;17357:231;:::o;17594:366::-;17736:3;17757:67;17821:2;17816:3;17757:67;:::i;:::-;17750:74;;17833:93;17922:3;17833:93;:::i;:::-;17951:2;17946:3;17942:12;17935:19;;17594:366;;;:::o;17966:419::-;18132:4;18170:2;18159:9;18155:18;18147:26;;18219:9;18213:4;18209:20;18205:1;18194:9;18190:17;18183:47;18247:131;18373:4;18247:131;:::i;:::-;18239:139;;17966:419;;;:::o;18391:220::-;18531:34;18527:1;18519:6;18515:14;18508:58;18600:3;18595:2;18587:6;18583:15;18576:28;18391:220;:::o;18617:366::-;18759:3;18780:67;18844:2;18839:3;18780:67;:::i;:::-;18773:74;;18856:93;18945:3;18856:93;:::i;:::-;18974:2;18969:3;18965:12;18958:19;;18617:366;;;:::o;18989:419::-;19155:4;19193:2;19182:9;19178:18;19170:26;;19242:9;19236:4;19232:20;19228:1;19217:9;19213:17;19206:47;19270:131;19396:4;19270:131;:::i;:::-;19262:139;;18989:419;;;:::o;19414:243::-;19554:34;19550:1;19542:6;19538:14;19531:58;19623:26;19618:2;19610:6;19606:15;19599:51;19414:243;:::o;19663:366::-;19805:3;19826:67;19890:2;19885:3;19826:67;:::i;:::-;19819:74;;19902:93;19991:3;19902:93;:::i;:::-;20020:2;20015:3;20011:12;20004:19;;19663:366;;;:::o;20035:419::-;20201:4;20239:2;20228:9;20224:18;20216:26;;20288:9;20282:4;20278:20;20274:1;20263:9;20259:17;20252:47;20316:131;20442:4;20316:131;:::i;:::-;20308:139;;20035:419;;;:::o;20460:182::-;20600:34;20596:1;20588:6;20584:14;20577:58;20460:182;:::o;20648:366::-;20790:3;20811:67;20875:2;20870:3;20811:67;:::i;:::-;20804:74;;20887:93;20976:3;20887:93;:::i;:::-;21005:2;21000:3;20996:12;20989:19;;20648:366;;;:::o;21020:419::-;21186:4;21224:2;21213:9;21209:18;21201:26;;21273:9;21267:4;21263:20;21259:1;21248:9;21244:17;21237:47;21301:131;21427:4;21301:131;:::i;:::-;21293:139;;21020:419;;;:::o;21445:168::-;21585:20;21581:1;21573:6;21569:14;21562:44;21445:168;:::o;21619:366::-;21761:3;21782:67;21846:2;21841:3;21782:67;:::i;:::-;21775:74;;21858:93;21947:3;21858:93;:::i;:::-;21976:2;21971:3;21967:12;21960:19;;21619:366;;;:::o;21991:419::-;22157:4;22195:2;22184:9;22180:18;22172:26;;22244:9;22238:4;22234:20;22230:1;22219:9;22215:17;22208:47;22272:131;22398:4;22272:131;:::i;:::-;22264:139;;21991:419;;;:::o;22416:143::-;22473:5;22504:6;22498:13;22489:22;;22520:33;22547:5;22520:33;:::i;:::-;22416:143;;;;:::o;22565:351::-;22635:6;22684:2;22672:9;22663:7;22659:23;22655:32;22652:119;;;22690:79;;:::i;:::-;22652:119;22810:1;22835:64;22891:7;22882:6;22871:9;22867:22;22835:64;:::i;:::-;22825:74;;22781:128;22565:351;;;;:::o;22922:172::-;23062:24;23058:1;23050:6;23046:14;23039:48;22922:172;:::o;23100:366::-;23242:3;23263:67;23327:2;23322:3;23263:67;:::i;:::-;23256:74;;23339:93;23428:3;23339:93;:::i;:::-;23457:2;23452:3;23448:12;23441:19;;23100:366;;;:::o;23472:419::-;23638:4;23676:2;23665:9;23661:18;23653:26;;23725:9;23719:4;23715:20;23711:1;23700:9;23696:17;23689:47;23753:131;23879:4;23753:131;:::i;:::-;23745:139;;23472:419;;;:::o;23897:180::-;23945:77;23942:1;23935:88;24042:4;24039:1;24032:15;24066:4;24063:1;24056:15;24083:348;24123:7;24146:20;24164:1;24146:20;:::i;:::-;24141:25;;24180:20;24198:1;24180:20;:::i;:::-;24175:25;;24368:1;24300:66;24296:74;24293:1;24290:81;24285:1;24278:9;24271:17;24267:105;24264:131;;;24375:18;;:::i;:::-;24264:131;24423:1;24420;24416:9;24405:20;;24083:348;;;;:::o;24437:137::-;24491:5;24522:6;24516:13;24507:22;;24538:30;24562:5;24538:30;:::i;:::-;24437:137;;;;:::o;24580:345::-;24647:6;24696:2;24684:9;24675:7;24671:23;24667:32;24664:119;;;24702:79;;:::i;:::-;24664:119;24822:1;24847:61;24900:7;24891:6;24880:9;24876:22;24847:61;:::i;:::-;24837:71;;24793:125;24580:345;;;;:::o;24931:305::-;24971:3;24990:20;25008:1;24990:20;:::i;:::-;24985:25;;25024:20;25042:1;25024:20;:::i;:::-;25019:25;;25178:1;25110:66;25106:74;25103:1;25100:81;25097:107;;;25184:18;;:::i;:::-;25097:107;25228:1;25225;25221:9;25214:16;;24931:305;;;;:::o;25242:332::-;25363:4;25401:2;25390:9;25386:18;25378:26;;25414:71;25482:1;25471:9;25467:17;25458:6;25414:71;:::i;:::-;25495:72;25563:2;25552:9;25548:18;25539:6;25495:72;:::i;:::-;25242:332;;;;;:::o;25580:233::-;25619:3;25642:24;25660:5;25642:24;:::i;:::-;25633:33;;25688:66;25681:5;25678:77;25675:103;;;25758:18;;:::i;:::-;25675:103;25805:1;25798:5;25794:13;25787:20;;25580:233;;;:::o;25819:171::-;25858:3;25881:24;25899:5;25881:24;:::i;:::-;25872:33;;25927:4;25920:5;25917:15;25914:41;;;25935:18;;:::i;:::-;25914:41;25982:1;25975:5;25971:13;25964:20;;25819:171;;;:::o;25996:191::-;26036:4;26056:20;26074:1;26056:20;:::i;:::-;26051:25;;26090:20;26108:1;26090:20;:::i;:::-;26085:25;;26129:1;26126;26123:8;26120:34;;;26134:18;;:::i;:::-;26120:34;26179:1;26176;26172:9;26164:17;;25996:191;;;;:::o;26193:180::-;26241:77;26238:1;26231:88;26338:4;26335:1;26328:15;26362:4;26359:1;26352:15;26379:185;26419:1;26436:20;26454:1;26436:20;:::i;:::-;26431:25;;26470:20;26488:1;26470:20;:::i;:::-;26465:25;;26509:1;26499:35;;26514:18;;:::i;:::-;26499:35;26556:1;26553;26549:9;26544:14;;26379:185;;;;:::o;26570:164::-;26710:16;26706:1;26698:6;26694:14;26687:40;26570:164;:::o;26740:366::-;26882:3;26903:67;26967:2;26962:3;26903:67;:::i;:::-;26896:74;;26979:93;27068:3;26979:93;:::i;:::-;27097:2;27092:3;27088:12;27081:19;;26740:366;;;:::o;27112:419::-;27278:4;27316:2;27305:9;27301:18;27293:26;;27365:9;27359:4;27355:20;27351:1;27340:9;27336:17;27329:47;27393:131;27519:4;27393:131;:::i;:::-;27385:139;;27112:419;;;:::o;27537:148::-;27639:11;27676:3;27661:18;;27537:148;;;;:::o;27691:141::-;27740:4;27763:3;27755:11;;27786:3;27783:1;27776:14;27820:4;27817:1;27807:18;27799:26;;27691:141;;;:::o;27862:845::-;27965:3;28002:5;27996:12;28031:36;28057:9;28031:36;:::i;:::-;28083:89;28165:6;28160:3;28083:89;:::i;:::-;28076:96;;28203:1;28192:9;28188:17;28219:1;28214:137;;;;28365:1;28360:341;;;;28181:520;;28214:137;28298:4;28294:9;28283;28279:25;28274:3;28267:38;28334:6;28329:3;28325:16;28318:23;;28214:137;;28360:341;28427:38;28459:5;28427:38;:::i;:::-;28487:1;28501:154;28515:6;28512:1;28509:13;28501:154;;;28589:7;28583:14;28579:1;28574:3;28570:11;28563:35;28639:1;28630:7;28626:15;28615:26;;28537:4;28534:1;28530:12;28525:17;;28501:154;;;28684:6;28679:3;28675:16;28668:23;;28367:334;;28181:520;;27969:738;;27862:845;;;;:::o;28713:377::-;28819:3;28847:39;28880:5;28847:39;:::i;:::-;28902:89;28984:6;28979:3;28902:89;:::i;:::-;28895:96;;29000:52;29045:6;29040:3;29033:4;29026:5;29022:16;29000:52;:::i;:::-;29077:6;29072:3;29068:16;29061:23;;28823:267;28713:377;;;;:::o;29096:429::-;29273:3;29295:92;29383:3;29374:6;29295:92;:::i;:::-;29288:99;;29404:95;29495:3;29486:6;29404:95;:::i;:::-;29397:102;;29516:3;29509:10;;29096:429;;;;;:::o;29531:229::-;29671:34;29667:1;29659:6;29655:14;29648:58;29740:12;29735:2;29727:6;29723:15;29716:37;29531:229;:::o;29766:366::-;29908:3;29929:67;29993:2;29988:3;29929:67;:::i;:::-;29922:74;;30005:93;30094:3;30005:93;:::i;:::-;30123:2;30118:3;30114:12;30107:19;;29766:366;;;:::o;30138:419::-;30304:4;30342:2;30331:9;30327:18;30319:26;;30391:9;30385:4;30381:20;30377:1;30366:9;30362:17;30355:47;30419:131;30545:4;30419:131;:::i;:::-;30411:139;;30138:419;;;:::o;30563:180::-;30611:77;30608:1;30601:88;30708:4;30705:1;30698:15;30732:4;30729:1;30722:15;30749:175;30889:27;30885:1;30877:6;30873:14;30866:51;30749:175;:::o;30930:366::-;31072:3;31093:67;31157:2;31152:3;31093:67;:::i;:::-;31086:74;;31169:93;31258:3;31169:93;:::i;:::-;31287:2;31282:3;31278:12;31271:19;;30930:366;;;:::o;31302:419::-;31468:4;31506:2;31495:9;31491:18;31483:26;;31555:9;31549:4;31545:20;31541:1;31530:9;31526:17;31519:47;31583:131;31709:4;31583:131;:::i;:::-;31575:139;;31302:419;;;:::o;31727:94::-;31760:8;31808:5;31804:2;31800:14;31779:35;;31727:94;;;:::o;31827:::-;31866:7;31895:20;31909:5;31895:20;:::i;:::-;31884:31;;31827:94;;;:::o;31927:100::-;31966:7;31995:26;32015:5;31995:26;:::i;:::-;31984:37;;31927:100;;;:::o;32033:157::-;32138:45;32158:24;32176:5;32158:24;:::i;:::-;32138:45;:::i;:::-;32133:3;32126:58;32033:157;;:::o;32196:79::-;32235:7;32264:5;32253:16;;32196:79;;;:::o;32281:157::-;32386:45;32406:24;32424:5;32406:24;:::i;:::-;32386:45;:::i;:::-;32381:3;32374:58;32281:157;;:::o;32444:679::-;32640:3;32655:75;32726:3;32717:6;32655:75;:::i;:::-;32755:2;32750:3;32746:12;32739:19;;32768:75;32839:3;32830:6;32768:75;:::i;:::-;32868:2;32863:3;32859:12;32852:19;;32881:75;32952:3;32943:6;32881:75;:::i;:::-;32981:2;32976:3;32972:12;32965:19;;32994:75;33065:3;33056:6;32994:75;:::i;:::-;33094:2;33089:3;33085:12;33078:19;;33114:3;33107:10;;32444:679;;;;;;;:::o;33129:176::-;33161:1;33178:20;33196:1;33178:20;:::i;:::-;33173:25;;33212:20;33230:1;33212:20;:::i;:::-;33207:25;;33251:1;33241:35;;33256:18;;:::i;:::-;33241:35;33297:1;33294;33290:9;33285:14;;33129:176;;;;:::o;33311:234::-;33451:34;33447:1;33439:6;33435:14;33428:58;33520:17;33515:2;33507:6;33503:15;33496:42;33311:234;:::o;33551:366::-;33693:3;33714:67;33778:2;33773:3;33714:67;:::i;:::-;33707:74;;33790:93;33879:3;33790:93;:::i;:::-;33908:2;33903:3;33899:12;33892:19;;33551:366;;;:::o;33923:419::-;34089:4;34127:2;34116:9;34112:18;34104:26;;34176:9;34170:4;34166:20;34162:1;34151:9;34147:17;34140:47;34204:131;34330:4;34204:131;:::i;:::-;34196:139;;33923:419;;;:::o;34348:435::-;34528:3;34550:95;34641:3;34632:6;34550:95;:::i;:::-;34543:102;;34662:95;34753:3;34744:6;34662:95;:::i;:::-;34655:102;;34774:3;34767:10;;34348:435;;;;;:::o;34789:225::-;34929:34;34925:1;34917:6;34913:14;34906:58;34998:8;34993:2;34985:6;34981:15;34974:33;34789:225;:::o;35020:366::-;35162:3;35183:67;35247:2;35242:3;35183:67;:::i;:::-;35176:74;;35259:93;35348:3;35259:93;:::i;:::-;35377:2;35372:3;35368:12;35361:19;;35020:366;;;:::o;35392:419::-;35558:4;35596:2;35585:9;35581:18;35573:26;;35645:9;35639:4;35635:20;35631:1;35620:9;35616:17;35609:47;35673:131;35799:4;35673:131;:::i;:::-;35665:139;;35392:419;;;:::o;35817:236::-;35957:34;35953:1;35945:6;35941:14;35934:58;36026:19;36021:2;36013:6;36009:15;36002:44;35817:236;:::o;36059:366::-;36201:3;36222:67;36286:2;36281:3;36222:67;:::i;:::-;36215:74;;36298:93;36387:3;36298:93;:::i;:::-;36416:2;36411:3;36407:12;36400:19;;36059:366;;;:::o;36431:419::-;36597:4;36635:2;36624:9;36620:18;36612:26;;36684:9;36678:4;36674:20;36670:1;36659:9;36655:17;36648:47;36712:131;36838:4;36712:131;:::i;:::-;36704:139;;36431:419;;;:::o;36856:237::-;36996:34;36992:1;36984:6;36980:14;36973:58;37065:20;37060:2;37052:6;37048:15;37041:45;36856:237;:::o;37099:366::-;37241:3;37262:67;37326:2;37321:3;37262:67;:::i;:::-;37255:74;;37338:93;37427:3;37338:93;:::i;:::-;37456:2;37451:3;37447:12;37440:19;;37099:366;;;:::o;37471:419::-;37637:4;37675:2;37664:9;37660:18;37652:26;;37724:9;37718:4;37714:20;37710:1;37699:9;37695:17;37688:47;37752:131;37878:4;37752:131;:::i;:::-;37744:139;;37471:419;;;:::o;37896:231::-;38036:34;38032:1;38024:6;38020:14;38013:58;38105:14;38100:2;38092:6;38088:15;38081:39;37896:231;:::o;38133:366::-;38275:3;38296:67;38360:2;38355:3;38296:67;:::i;:::-;38289:74;;38372:93;38461:3;38372:93;:::i;:::-;38490:2;38485:3;38481:12;38474:19;;38133:366;;;:::o;38505:419::-;38671:4;38709:2;38698:9;38694:18;38686:26;;38758:9;38752:4;38748:20;38744:1;38733:9;38729:17;38722:47;38786:131;38912:4;38786:131;:::i;:::-;38778:139;;38505:419;;;:::o;38930:228::-;39070:34;39066:1;39058:6;39054:14;39047:58;39139:11;39134:2;39126:6;39122:15;39115:36;38930:228;:::o;39164:366::-;39306:3;39327:67;39391:2;39386:3;39327:67;:::i;:::-;39320:74;;39403:93;39492:3;39403:93;:::i;:::-;39521:2;39516:3;39512:12;39505:19;;39164:366;;;:::o;39536:419::-;39702:4;39740:2;39729:9;39725:18;39717:26;;39789:9;39783:4;39779:20;39775:1;39764:9;39760:17;39753:47;39817:131;39943:4;39817:131;:::i;:::-;39809:139;;39536:419;;;:::o;39961:223::-;40101:34;40097:1;40089:6;40085:14;40078:58;40170:6;40165:2;40157:6;40153:15;40146:31;39961:223;:::o;40190:366::-;40332:3;40353:67;40417:2;40412:3;40353:67;:::i;:::-;40346:74;;40429:93;40518:3;40429:93;:::i;:::-;40547:2;40542:3;40538:12;40531:19;;40190:366;;;:::o;40562:419::-;40728:4;40766:2;40755:9;40751:18;40743:26;;40815:9;40809:4;40805:20;40801:1;40790:9;40786:17;40779:47;40843:131;40969:4;40843:131;:::i;:::-;40835:139;;40562:419;;;:::o;40987:221::-;41127:34;41123:1;41115:6;41111:14;41104:58;41196:4;41191:2;41183:6;41179:15;41172:29;40987:221;:::o;41214:366::-;41356:3;41377:67;41441:2;41436:3;41377:67;:::i;:::-;41370:74;;41453:93;41542:3;41453:93;:::i;:::-;41571:2;41566:3;41562:12;41555:19;;41214:366;;;:::o;41586:419::-;41752:4;41790:2;41779:9;41775:18;41767:26;;41839:9;41833:4;41829:20;41825:1;41814:9;41810:17;41803:47;41867:131;41993:4;41867:131;:::i;:::-;41859:139;;41586:419;;;:::o;42011:221::-;42151:34;42147:1;42139:6;42135:14;42128:58;42220:4;42215:2;42207:6;42203:15;42196:29;42011:221;:::o;42238:366::-;42380:3;42401:67;42465:2;42460:3;42401:67;:::i;:::-;42394:74;;42477:93;42566:3;42477:93;:::i;:::-;42595:2;42590:3;42586:12;42579:19;;42238:366;;;:::o;42610:419::-;42776:4;42814:2;42803:9;42799:18;42791:26;;42863:9;42857:4;42853:20;42849:1;42838:9;42834:17;42827:47;42891:131;43017:4;42891:131;:::i;:::-;42883:139;;42610:419;;;:::o;43035:182::-;43175:34;43171:1;43163:6;43159:14;43152:58;43035:182;:::o;43223:366::-;43365:3;43386:67;43450:2;43445:3;43386:67;:::i;:::-;43379:74;;43462:93;43551:3;43462:93;:::i;:::-;43580:2;43575:3;43571:12;43564:19;;43223:366;;;:::o;43595:419::-;43761:4;43799:2;43788:9;43784:18;43776:26;;43848:9;43842:4;43838:20;43834:1;43823:9;43819:17;43812:47;43876:131;44002:4;43876:131;:::i;:::-;43868:139;;43595:419;;;:::o;44020:178::-;44160:30;44156:1;44148:6;44144:14;44137:54;44020:178;:::o;44204:366::-;44346:3;44367:67;44431:2;44426:3;44367:67;:::i;:::-;44360:74;;44443:93;44532:3;44443:93;:::i;:::-;44561:2;44556:3;44552:12;44545:19;;44204:366;;;:::o;44576:419::-;44742:4;44780:2;44769:9;44765:18;44757:26;;44829:9;44823:4;44819:20;44815:1;44804:9;44800:17;44793:47;44857:131;44983:4;44857:131;:::i;:::-;44849:139;;44576:419;;;:::o;45001:98::-;45052:6;45086:5;45080:12;45070:22;;45001:98;;;:::o;45105:168::-;45188:11;45222:6;45217:3;45210:19;45262:4;45257:3;45253:14;45238:29;;45105:168;;;;:::o;45279:360::-;45365:3;45393:38;45425:5;45393:38;:::i;:::-;45447:70;45510:6;45505:3;45447:70;:::i;:::-;45440:77;;45526:52;45571:6;45566:3;45559:4;45552:5;45548:16;45526:52;:::i;:::-;45603:29;45625:6;45603:29;:::i;:::-;45598:3;45594:39;45587:46;;45369:270;45279:360;;;;:::o;45645:640::-;45840:4;45878:3;45867:9;45863:19;45855:27;;45892:71;45960:1;45949:9;45945:17;45936:6;45892:71;:::i;:::-;45973:72;46041:2;46030:9;46026:18;46017:6;45973:72;:::i;:::-;46055;46123:2;46112:9;46108:18;46099:6;46055:72;:::i;:::-;46174:9;46168:4;46164:20;46159:2;46148:9;46144:18;46137:48;46202:76;46273:4;46264:6;46202:76;:::i;:::-;46194:84;;45645:640;;;;;;;:::o;46291:141::-;46347:5;46378:6;46372:13;46363:22;;46394:32;46420:5;46394:32;:::i;:::-;46291:141;;;;:::o;46438:349::-;46507:6;46556:2;46544:9;46535:7;46531:23;46527:32;46524:119;;;46562:79;;:::i;:::-;46524:119;46682:1;46707:63;46762:7;46753:6;46742:9;46738:22;46707:63;:::i;:::-;46697:73;;46653:127;46438:349;;;;:::o;46793:180::-;46841:77;46838:1;46831:88;46938:4;46935:1;46928:15;46962:4;46959:1;46952:15

Swarm Source

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