├── ipvseeyou-slides.pdf ├── requirements.txt ├── BSSIDApple.proto ├── .gitignore ├── README.md ├── BSSIDApple_pb2.py ├── offsets.txt ├── IPvSeeYou.py └── LICENSE /ipvseeyou-slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/6int/IPvSeeYou/HEAD/ipvseeyou-slides.pdf -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | beautifulsoup4==4.9.3 2 | certifi==2021.5.30 3 | chardet==4.0.0 4 | idna==2.10 5 | protobuf==3.17.3 6 | requests==2.25.1 7 | simplekml==1.3.5 8 | six==1.16.0 9 | soupsieve==2.2.1 10 | urllib3==1.26.5 11 | -------------------------------------------------------------------------------- /BSSIDApple.proto: -------------------------------------------------------------------------------- 1 | syntax="proto3"; 2 | 3 | message WifiGeo { 4 | string bssid = 1; 5 | message Location { 6 | int64 lat = 1; 7 | int64 lon = 2; 8 | int64 unk1 = 3; 9 | } 10 | Location location= 2; 11 | } 12 | 13 | message BSSIDResp { 14 | int64 unk1 = 1; 15 | repeated WifiGeo wifi = 2; 16 | int32 unk2 = 3; 17 | int32 unk3 = 4; 18 | string APIName = 5; 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # IPvSeeYou Geolocation Lookup Tool 2 | 3 | ## Overview 4 | 5 | `IPvSeeYou.py` is a tool to assist with geolocating EUI-64 IPv6 hosts. It 6 | 7 | 1. takes as input an EUI-64-derived MAC address, 8 | 1. uses a previously-generated WAN MAC address to BSSID offset table to predict 9 | the BSSID for the EUI-64-derived MAC address, 10 | 1. queries a geolocation API for the predicted BSSID, and 11 | 1. prints the results (and optionally outputs to KML.) 12 | 13 | ## Requirements 14 | 15 | `IPvSeeYou.py` is written in and has been tested only using Python3. Installing 16 | the packages from the `requirements.txt` file using: 17 | 18 | ``` 19 | pip3 install -r requirements.txt 20 | ``` 21 | 22 | will ensure you have the required dependencies. 23 | 24 | ## Usage 25 | 26 | `IPvSeeYou.py` is written in Python3 and uses `argparse`, so you can always get 27 | help by passing the `-h` flag: 28 | 29 | ``` 30 | user@host % ./IPvSeeYou.py -h 31 | usage: IPvSeeYou.py [-h] (-M MAC_FILE | -m MAC | -e EUI | -E EUI_FILE) (-a | -w) [-o OFFSET_FILE] 32 | [-k KML] [-U API_USER] [-P API_PASS] 33 | 34 | optional arguments: 35 | -h, --help show this help message and exit 36 | -M MAC_FILE, --mac-file MAC_FILE 37 | File of MAC addresses from EUI-64 IPv6 addresses to bulk lookup 38 | -m MAC, --mac MAC Single MAC address from EUI-64 IPv6 address to attempt to geolocate 39 | -e EUI, --eui EUI Single EUI-64 IPv6 address to extract MAC from and attempt to geolocate 40 | -E EUI_FILE, --eui-file EUI_FILE 41 | File of EUI-64 IPv6 addresses to extract MAC from and attempt to geolocate 42 | -a, --apple Use Apple's location services API to geolocate BSSID 43 | -w, --wigle Use WiGLE's API to geolocate BSSID (requires -U API_USER and -P API_PASS) 44 | -o OFFSET_FILE, --offset-file OFFSET_FILE 45 | File containing inferred OUI offsets (default ./offsets.txt) 46 | -k KML, --kml KML Output KML filename 47 | -U API_USER, --api-user API_USER 48 | WiGLE API username (required for -w) 49 | -P API_PASS, --api-pass API_PASS 50 | WiGLE API password (required for -w) 51 | ``` 52 | 53 | The first set of mutually exclusive arguments indicates how the program should 54 | expect EUI-64-derived MAC addresses. 55 | 56 | 1. `-e EUI` indicates that the user is specifying a single EUI-64 IPv6 address 57 | to attempt to geolocate, as in `-e 2001::0211:22ff:fe33:4455` 58 | 1. `-E EUI_FILE` indicates that the user is specifying a file that contains one 59 | or more EUI-64 IPv6 addresses, each separated by a newline, as in 60 | `-E euis.txt` 61 | 1. `-m MAC` indicates that the user is specifying a single MAC address (that 62 | presumably they derived from an EUI-64 IPv6 address), as in `-m 63 | 00:11:22:33:44:55` 64 | 1. `-M MAC_FILE` indicates that they user is specifying a file containing one or 65 | more MAC addresses, each separated by a newline, as in `-M macs.txt` 66 | 67 | The second set of mutually exclusive arguments indicates how the program should 68 | look up the predicted BSSID (if one is found) for the EUI-64 derived MAC 69 | addresses. 70 | 71 | 1. `-a/--apple` will use Apple's location services API. `IPvSeeYou.py` uses 72 | logic derived from hubert3's [iSniff-GPS](https://github.com/hubert3/iSniff-GPS) 73 | 1. `-w/--wigle` will use WiGLE's API to query for the predicted BSSID. This 74 | requires a WiGLE API username and password to be specified using 75 | `-U/--api-user` and `-P/--api-pass`. 76 | 77 | `-o/--offset-file OFFSET_FILE` is an optional argument to specify OUI and their WAN MAC to 78 | BSSID offsets, each on a new line. For example: 79 | 80 | ``` 81 | 00:11:22 -3 82 | 00:77:88 2 83 | ``` 84 | 85 | indicates that the OUI `00:11:22` has a WAN MAC to BSSID offset of -3. By 86 | default, a file called `./offsets.txt` is used and need not be specified if it 87 | exists. 88 | 89 | `-k/--kml KML` is an optional argument that will generate a KML output file with 90 | a point for each geolocated EUI-64-derived MAC address. 91 | 92 | ### Examples 93 | 94 | MAC addresses, username/password and geolocations in this section are for 95 | example purposes only, and will not provide an actual geolocation or 96 | authentication to WiGLE. 97 | 98 | To specify a single EUI-64 IPv6 address to geolocate using Apple's location 99 | services API and output to a KML file called `output.kml`, we: 100 | 101 | ``` 102 | ./IPvSeeYou.py -e 2001:0:1:2:0200:11ff:fe22:3344 -k output.kml -a 103 | 104 | #EUI-64-Derived MAC BSSID lat,lon 105 | 00:00:11:22:33:44 00:00:11:22:33:46 12.34,56.78 106 | ``` 107 | 108 | To specify a file containing EUI-64-derived MAC addresses to geolocate using the 109 | WiGLE API, with WiGLE API username `` and password ``, we: 110 | 111 | ``` 112 | ./IPvSeeYou.py -M fileOfMacs.txt -w -U abcdefabcdefabcdefabcdef -P 1234567890abcdef 113 | #EUI-64-Derived MAC BSSID lat,lon 114 | 00:00:11:22:33:44 00:00:11:22:33:46 12.34,56.78 115 | f8:00:11:22:33:44 f8:00:11:22:33:40 23.45,-12.34 116 | ``` 117 | 118 | ## Credits 119 | 120 | Much of the code that interacts with Apple's Location Services was borrowed from 121 | @hubert3's excellent [`iSniff-GPS`](https://github.com/hubert3/iSniff-GPS), 122 | presented at Black Hat USA 2012. 123 | -------------------------------------------------------------------------------- /BSSIDApple_pb2.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by the protocol buffer compiler. DO NOT EDIT! 3 | # source: BSSIDApple.proto 4 | """Generated protocol buffer code.""" 5 | from google.protobuf import descriptor as _descriptor 6 | from google.protobuf import message as _message 7 | from google.protobuf import reflection as _reflection 8 | from google.protobuf import symbol_database as _symbol_database 9 | # @@protoc_insertion_point(imports) 10 | 11 | _sym_db = _symbol_database.Default() 12 | 13 | 14 | 15 | 16 | DESCRIPTOR = _descriptor.FileDescriptor( 17 | name='BSSIDApple.proto', 18 | package='', 19 | syntax='proto3', 20 | serialized_options=None, 21 | create_key=_descriptor._internal_create_key, 22 | serialized_pb=b'\n\x10\x42SSIDApple.proto\"q\n\x07WifiGeo\x12\r\n\x05\x62ssid\x18\x01 \x01(\t\x12#\n\x08location\x18\x02 \x01(\x0b\x32\x11.WifiGeo.Location\x1a\x32\n\x08Location\x12\x0b\n\x03lat\x18\x01 \x01(\x03\x12\x0b\n\x03lon\x18\x02 \x01(\x03\x12\x0c\n\x04unk1\x18\x03 \x01(\x03\"^\n\tBSSIDResp\x12\x0c\n\x04unk1\x18\x01 \x01(\x03\x12\x16\n\x04wifi\x18\x02 \x03(\x0b\x32\x08.WifiGeo\x12\x0c\n\x04unk2\x18\x03 \x01(\x05\x12\x0c\n\x04unk3\x18\x04 \x01(\x05\x12\x0f\n\x07\x41PIName\x18\x05 \x01(\tb\x06proto3' 23 | ) 24 | 25 | 26 | 27 | 28 | _WIFIGEO_LOCATION = _descriptor.Descriptor( 29 | name='Location', 30 | full_name='WifiGeo.Location', 31 | filename=None, 32 | file=DESCRIPTOR, 33 | containing_type=None, 34 | create_key=_descriptor._internal_create_key, 35 | fields=[ 36 | _descriptor.FieldDescriptor( 37 | name='lat', full_name='WifiGeo.Location.lat', index=0, 38 | number=1, type=3, cpp_type=2, label=1, 39 | has_default_value=False, default_value=0, 40 | message_type=None, enum_type=None, containing_type=None, 41 | is_extension=False, extension_scope=None, 42 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 43 | _descriptor.FieldDescriptor( 44 | name='lon', full_name='WifiGeo.Location.lon', index=1, 45 | number=2, type=3, cpp_type=2, label=1, 46 | has_default_value=False, default_value=0, 47 | message_type=None, enum_type=None, containing_type=None, 48 | is_extension=False, extension_scope=None, 49 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 50 | _descriptor.FieldDescriptor( 51 | name='unk1', full_name='WifiGeo.Location.unk1', index=2, 52 | number=3, type=3, cpp_type=2, label=1, 53 | has_default_value=False, default_value=0, 54 | message_type=None, enum_type=None, containing_type=None, 55 | is_extension=False, extension_scope=None, 56 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 57 | ], 58 | extensions=[ 59 | ], 60 | nested_types=[], 61 | enum_types=[ 62 | ], 63 | serialized_options=None, 64 | is_extendable=False, 65 | syntax='proto3', 66 | extension_ranges=[], 67 | oneofs=[ 68 | ], 69 | serialized_start=83, 70 | serialized_end=133, 71 | ) 72 | 73 | _WIFIGEO = _descriptor.Descriptor( 74 | name='WifiGeo', 75 | full_name='WifiGeo', 76 | filename=None, 77 | file=DESCRIPTOR, 78 | containing_type=None, 79 | create_key=_descriptor._internal_create_key, 80 | fields=[ 81 | _descriptor.FieldDescriptor( 82 | name='bssid', full_name='WifiGeo.bssid', index=0, 83 | number=1, type=9, cpp_type=9, label=1, 84 | has_default_value=False, default_value=b"".decode('utf-8'), 85 | message_type=None, enum_type=None, containing_type=None, 86 | is_extension=False, extension_scope=None, 87 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 88 | _descriptor.FieldDescriptor( 89 | name='location', full_name='WifiGeo.location', index=1, 90 | number=2, type=11, cpp_type=10, label=1, 91 | has_default_value=False, default_value=None, 92 | message_type=None, enum_type=None, containing_type=None, 93 | is_extension=False, extension_scope=None, 94 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 95 | ], 96 | extensions=[ 97 | ], 98 | nested_types=[_WIFIGEO_LOCATION, ], 99 | enum_types=[ 100 | ], 101 | serialized_options=None, 102 | is_extendable=False, 103 | syntax='proto3', 104 | extension_ranges=[], 105 | oneofs=[ 106 | ], 107 | serialized_start=20, 108 | serialized_end=133, 109 | ) 110 | 111 | 112 | _BSSIDRESP = _descriptor.Descriptor( 113 | name='BSSIDResp', 114 | full_name='BSSIDResp', 115 | filename=None, 116 | file=DESCRIPTOR, 117 | containing_type=None, 118 | create_key=_descriptor._internal_create_key, 119 | fields=[ 120 | _descriptor.FieldDescriptor( 121 | name='unk1', full_name='BSSIDResp.unk1', index=0, 122 | number=1, type=3, cpp_type=2, label=1, 123 | has_default_value=False, default_value=0, 124 | message_type=None, enum_type=None, containing_type=None, 125 | is_extension=False, extension_scope=None, 126 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 127 | _descriptor.FieldDescriptor( 128 | name='wifi', full_name='BSSIDResp.wifi', index=1, 129 | number=2, type=11, cpp_type=10, label=3, 130 | has_default_value=False, default_value=[], 131 | message_type=None, enum_type=None, containing_type=None, 132 | is_extension=False, extension_scope=None, 133 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 134 | _descriptor.FieldDescriptor( 135 | name='unk2', full_name='BSSIDResp.unk2', index=2, 136 | number=3, type=5, cpp_type=1, label=1, 137 | has_default_value=False, default_value=0, 138 | message_type=None, enum_type=None, containing_type=None, 139 | is_extension=False, extension_scope=None, 140 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 141 | _descriptor.FieldDescriptor( 142 | name='unk3', full_name='BSSIDResp.unk3', index=3, 143 | number=4, type=5, cpp_type=1, label=1, 144 | has_default_value=False, default_value=0, 145 | message_type=None, enum_type=None, containing_type=None, 146 | is_extension=False, extension_scope=None, 147 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 148 | _descriptor.FieldDescriptor( 149 | name='APIName', full_name='BSSIDResp.APIName', index=4, 150 | number=5, type=9, cpp_type=9, label=1, 151 | has_default_value=False, default_value=b"".decode('utf-8'), 152 | message_type=None, enum_type=None, containing_type=None, 153 | is_extension=False, extension_scope=None, 154 | serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), 155 | ], 156 | extensions=[ 157 | ], 158 | nested_types=[], 159 | enum_types=[ 160 | ], 161 | serialized_options=None, 162 | is_extendable=False, 163 | syntax='proto3', 164 | extension_ranges=[], 165 | oneofs=[ 166 | ], 167 | serialized_start=135, 168 | serialized_end=229, 169 | ) 170 | 171 | _WIFIGEO_LOCATION.containing_type = _WIFIGEO 172 | _WIFIGEO.fields_by_name['location'].message_type = _WIFIGEO_LOCATION 173 | _BSSIDRESP.fields_by_name['wifi'].message_type = _WIFIGEO 174 | DESCRIPTOR.message_types_by_name['WifiGeo'] = _WIFIGEO 175 | DESCRIPTOR.message_types_by_name['BSSIDResp'] = _BSSIDRESP 176 | _sym_db.RegisterFileDescriptor(DESCRIPTOR) 177 | 178 | WifiGeo = _reflection.GeneratedProtocolMessageType('WifiGeo', (_message.Message,), { 179 | 180 | 'Location' : _reflection.GeneratedProtocolMessageType('Location', (_message.Message,), { 181 | 'DESCRIPTOR' : _WIFIGEO_LOCATION, 182 | '__module__' : 'BSSIDApple_pb2' 183 | # @@protoc_insertion_point(class_scope:WifiGeo.Location) 184 | }) 185 | , 186 | 'DESCRIPTOR' : _WIFIGEO, 187 | '__module__' : 'BSSIDApple_pb2' 188 | # @@protoc_insertion_point(class_scope:WifiGeo) 189 | }) 190 | _sym_db.RegisterMessage(WifiGeo) 191 | _sym_db.RegisterMessage(WifiGeo.Location) 192 | 193 | BSSIDResp = _reflection.GeneratedProtocolMessageType('BSSIDResp', (_message.Message,), { 194 | 'DESCRIPTOR' : _BSSIDRESP, 195 | '__module__' : 'BSSIDApple_pb2' 196 | # @@protoc_insertion_point(class_scope:BSSIDResp) 197 | }) 198 | _sym_db.RegisterMessage(BSSIDResp) 199 | 200 | 201 | # @@protoc_insertion_point(module_scope) 202 | -------------------------------------------------------------------------------- /offsets.txt: -------------------------------------------------------------------------------- 1 | 00:00:00 0 2 | 00:02:61 2 3 | 00:04:16 0 4 | 00:04:df -1 5 | 00:0a:c2 0 6 | 00:0c:c3 0 7 | 00:0e:8f 2 8 | 00:0e:b4 4 9 | 00:0f:94 4 10 | 00:19:46 5 11 | 00:1a:3f -1 12 | 00:1d:aa -1 13 | 00:1d:cd -2 14 | 00:1d:ce -2 15 | 00:1d:cf -2 16 | 00:1d:d0 -2 17 | 00:1d:d1 -2 18 | 00:1d:d2 -2 19 | 00:1d:d3 -2 20 | 00:1d:d4 -2 21 | 00:1d:d5 -2 22 | 00:1d:d6 -2 23 | 00:1f:3f -1 24 | 00:1f:ce 0 25 | 00:22:07 -2 26 | 00:24:fe -1 27 | 00:2e:c7 5 28 | 00:34:fe 1 29 | 00:37:b7 0 30 | 00:4a:77 0 31 | 00:5a:13 0 32 | 00:60:64 1 33 | 00:60:6b 7 34 | 00:67:62 0 35 | 00:6d:61 -2 36 | 00:72:63 0 37 | 00:78:9e 0 38 | 00:8c:54 -1 39 | 00:9a:cd 2 40 | 00:ac:e0 -2 41 | 00:ad:24 -1 42 | 00:cb:51 0 43 | 00:d0:cb 2 44 | 00:e0:4c 3 45 | 00:f8:1c 11 46 | 04:02:1f 2 47 | 04:25:c5 15 48 | 04:33:89 12 49 | 04:4f:4c 5 50 | 04:5e:a4 -1 51 | 04:88:5f 8 52 | 04:8c:16 7 53 | 04:8d:38 -1 54 | 04:8d:39 -1 55 | 04:92:26 3 56 | 04:95:e6 1 57 | 04:9f:ca 13 58 | 04:a1:51 0 59 | 04:a2:22 1 60 | 04:b0:e7 7 61 | 04:bd:70 6 62 | 04:bf:6d 14 63 | 04:c0:6f 2 64 | 04:d4:c4 0 65 | 04:fe:8d 12 66 | 08:02:8e 3 67 | 08:26:97 3 68 | 08:36:c9 3 69 | 08:3e:0c -2 70 | 08:3e:5d 0 71 | 08:3f:bc 0 72 | 08:4f:0a 6 73 | 08:63:61 2 74 | 08:6a:0a 0 75 | 08:7a:4c 2 76 | 08:86:3b 0 77 | 08:96:d7 -1 78 | 08:c0:21 14 79 | 08:d5:9d 0 80 | 08:e8:4f 8 81 | 0c:2a:86 1 82 | 0c:2c:54 0 83 | 0c:35:fe 6 84 | 0c:37:47 0 85 | 0c:45:ba 7 86 | 0c:6a:bc 1 87 | 0c:70:4a 0 88 | 0c:73:29 8 89 | 0c:80:63 0 90 | 0c:84:47 6 91 | 0c:8e:29 1 92 | 0c:8f:ff 5 93 | 0c:96:bf 2 94 | 0c:9d:92 -8 95 | 0c:b5:27 0 96 | 0c:b6:d2 -1 97 | 0c:c6:cc 5 98 | 0c:d6:bd 2 99 | 0c:f0:b4 -5 100 | 0c:f8:93 -2 101 | 10:0c:6b 3 102 | 10:13:31 1 103 | 10:50:72 7 104 | 10:58:87 1 105 | 10:62:d0 1 106 | 10:62:eb -1 107 | 10:72:23 1 108 | 10:78:5b 1 109 | 10:7b:44 0 110 | 10:7b:ef -4 111 | 10:86:8c -2 112 | 10:b1:f8 -6 113 | 10:b3:6f 10 114 | 10:be:f5 -1 115 | 10:c1:72 8 116 | 10:c2:5a 1 117 | 10:c6:1f 2 118 | 10:da:43 3 119 | 14:09:dc 6 120 | 14:22:33 0 121 | 14:2e:5e 0 122 | 14:30:04 5 123 | 14:57:9f 7 124 | 14:59:c0 3 125 | 14:5f:94 -3 126 | 14:60:80 0 127 | 14:91:82 0 128 | 14:9d:09 -6 129 | 14:a0:f8 5 130 | 14:a5:1a 1 131 | 14:ab:f0 -2 132 | 14:ae:85 2 133 | 14:b7:f8 1 134 | 14:b9:68 2 135 | 14:cf:e2 -2 136 | 14:dd:a9 0 137 | 18:0d:2c -1 138 | 18:0f:76 -1 139 | 18:17:25 0 140 | 18:1e:78 0 141 | 18:3d:5e 6 142 | 18:44:e6 0 143 | 18:45:93 8 144 | 18:56:44 8 145 | 18:62:2c 0 146 | 18:82:8c 3 147 | 18:83:bf 2 148 | 18:90:d8 0 149 | 18:a3:e8 0 150 | 18:a6:f7 0 151 | 18:c5:8a 6 152 | 18:d0:71 2 153 | 18:d2:76 -6 154 | 18:d6:c7 -1 155 | 18:f1:45 -9 156 | 1c:18:4a 0 157 | 1c:24:cd 0 158 | 1c:3b:f3 0 159 | 1c:44:19 -1 160 | 1c:5f:2b 0 161 | 1c:67:58 0 162 | 1c:74:0d -2 163 | 1c:a5:32 -1 164 | 1c:ae:cb 7 165 | 1c:b0:44 0 166 | 1c:c6:3c 2 167 | 20:08:ed 2 168 | 20:28:3e 6 169 | 20:2b:c1 2 170 | 20:73:55 -2 171 | 20:89:6f 1 172 | 20:9a:7d 5 173 | 20:a6:80 2 174 | 20:e8:82 0 175 | 20:f1:7c 13 176 | 20:f3:a3 2 177 | 24:00:ba 2 178 | 24:09:95 2 179 | 24:16:6d 8 180 | 24:1f:a0 2 181 | 24:20:c7 0 182 | 24:43:e2 5 183 | 24:44:27 12 184 | 24:4c:07 7 185 | 24:58:6e 0 186 | 24:65:11 -1 187 | 24:69:a5 2 188 | 24:7f:20 0 189 | 24:9e:ab 6 190 | 24:a5:2c 5 191 | 24:bc:f8 12 192 | 24:ca:cb 1 193 | 24:d3:f2 0 194 | 24:df:6a 2 195 | 24:f5:a2 1 196 | 24:fd:0d -1 197 | 28:11:ec 7 198 | 28:28:5d 0 199 | 28:3b:82 -1 200 | 28:41:c6 8 201 | 28:80:88 3 202 | 28:9e:fc 0 203 | 28:a6:db 5 204 | 28:b4:48 6 205 | 28:de:e5 6 206 | 28:ff:3e 0 207 | 2c:30:33 3 208 | 2c:39:96 0 209 | 2c:3a:fd 5 210 | 2c:55:d3 14 211 | 2c:79:d7 5 212 | 2c:91:ab -1 213 | 2c:95:7f 0 214 | 2c:97:b1 6 215 | 2c:99:24 -2 216 | 2c:ab:00 8 217 | 2c:cf:58 6 218 | 2c:e4:12 2 219 | 2c:fd:a1 3 220 | 30:23:03 1 221 | 30:24:78 0 222 | 30:5a:3a 3 223 | 30:74:96 -6 224 | 30:7c:b2 0 225 | 30:91:8f 1 226 | 30:93:bc 0 227 | 30:99:35 0 228 | 30:b1:b5 3 229 | 30:b5:c2 0 230 | 30:d1:7e 5 231 | 30:e9:8e 7 232 | 30:f3:35 8 233 | 30:fb:b8 8 234 | 30:fd:65 8 235 | 34:00:a3 6 236 | 34:0a:33 -1 237 | 34:0a:98 6 238 | 34:1e:6b 6 239 | 34:31:c4 -1 240 | 34:3d:c4 -14 241 | 34:49:5b -7 242 | 34:4d:ea 0 243 | 34:57:60 0 244 | 34:6a:c2 12 245 | 34:6b:46 0 246 | 34:6b:d3 2 247 | 34:81:c4 -1 248 | 34:8a:ae 0 249 | 34:97:f6 0 250 | 34:a2:a2 6 251 | 34:b3:54 6 252 | 34:da:b7 0 253 | 34:db:9c -7 254 | 34:e0:cf 0 255 | 34:e8:94 0 256 | 38:10:d5 5 257 | 38:14:4e 6 258 | 38:17:66 0 259 | 38:35:fb 5 260 | 38:37:8b 0 261 | 38:46:08 0 262 | 38:4c:4f -5 263 | 38:4c:90 -2 264 | 38:70:0c -2 265 | 38:94:ed 3 266 | 38:bc:01 7 267 | 38:d5:47 0 268 | 38:d8:2f 0 269 | 3c:15:fb 5 270 | 3c:17:10 0 271 | 3c:1e:04 -1 272 | 3c:37:86 3 273 | 3c:47:11 2 274 | 3c:67:8c 1 275 | 3c:78:43 5 276 | 3c:7a:8a -2 277 | 3c:81:d8 0 278 | 3c:84:6a 0 279 | 3c:8c:f8 1 280 | 3c:98:72 0 281 | 3c:9d:56 7 282 | 3c:a6:2f 5 283 | 3c:e8:24 6 284 | 3c:f8:08 5 285 | 3c:fa:43 1 286 | 40:16:7e 0 287 | 40:4a:03 -4 288 | 40:4d:8e 2 289 | 40:5a:9b 0 290 | 40:5d:82 3 291 | 40:65:a3 0 292 | 40:70:09 -2 293 | 40:7d:0f 4 294 | 40:9b:cd 0 295 | 40:b0:76 0 296 | 40:c7:29 0 297 | 40:ee:dd 8 298 | 40:f2:01 5 299 | 44:00:4d 8 300 | 44:13:d0 0 301 | 44:4e:6d 6 302 | 44:55:b1 8 303 | 44:67:47 7 304 | 44:6e:e5 1 305 | 44:82:e5 5 306 | 44:a1:91 8 307 | 44:a5:6e 3 308 | 44:a6:1e 0 309 | 44:c3:46 -6 310 | 44:d4:37 -2 311 | 44:d4:53 3 312 | 44:e9:dd 0 313 | 44:f4:36 0 314 | 44:fb:5a 0 315 | 44:fe:3b 1 316 | 44:ff:ba 0 317 | 48:00:33 1 318 | 48:29:52 -7 319 | 48:35:2e -7 320 | 48:3c:0c -6 321 | 48:43:5a 13 322 | 48:55:5f 1 323 | 48:57:02 7 324 | 48:7b:6b 7 325 | 48:83:c7 0 326 | 48:8d:36 0 327 | 48:8e:ef 15 328 | 48:8f:5a 0 329 | 48:ad:08 7 330 | 48:d2:4f 0 331 | 48:db:50 2 332 | 48:ee:0c -1 333 | 48:f8:b3 1 334 | 48:f8:db 8 335 | 4c:09:b4 0 336 | 4c:09:d4 2 337 | 4c:1b:86 1 338 | 4c:8b:30 4 339 | 4c:9e:ff -2 340 | 4c:ac:0a 0 341 | 4c:c5:3e -4 342 | 4c:ed:fb 0 343 | 4c:f5:5b 7 344 | 4c:f9:5d 6 345 | 4c:fb:45 0 346 | 50:01:d9 1 347 | 50:04:b8 1 348 | 50:09:59 1 349 | 50:0f:f5 -7 350 | 50:1b:32 8 351 | 50:1d:93 6 352 | 50:4e:dc -5 353 | 50:5d:ac 6 354 | 50:68:0a 2 355 | 50:6a:03 3 356 | 50:6f:77 5 357 | 50:78:b3 0 358 | 50:7e:5d 2 359 | 50:a7:2b 2 360 | 50:c7:bf -1 361 | 50:d4:f7 0 362 | 50:ff:20 -1 363 | 54:13:10 7 364 | 54:22:f8 0 365 | 54:25:ea 1 366 | 54:2f:8a -1 367 | 54:4b:40 0 368 | 54:51:1b 5 369 | 54:64:d9 0 370 | 54:65:de -2 371 | 54:83:3a -4 372 | 54:b6:1e -2 373 | 54:b8:0a -1 374 | 54:be:53 0 375 | 54:c1:5e -2 376 | 54:d7:2e -2 377 | 54:e2:e0 0 378 | 58:10:8c -1 379 | 58:1f:28 2 380 | 58:2a:f7 2 381 | 58:52:8a 2 382 | 58:60:5f 15 383 | 58:6d:8f 1 384 | 58:7f:66 2 385 | 58:8b:f3 -2 386 | 58:90:43 0 387 | 58:ba:d4 -6 388 | 58:d5:6e -1 389 | 58:d7:59 1 390 | 58:d9:d5 1 391 | 58:ef:68 -11 392 | 58:f9:87 6 393 | 5c:03:39 1 394 | 5c:1a:6f -4 395 | 5c:3a:3d 0 396 | 5c:49:79 -1 397 | 5c:4c:a9 2 398 | 5c:54:6d 7 399 | 5c:57:1a -2 400 | 5c:6a:80 -3 401 | 5c:7d:5e 2 402 | 5c:8f:e0 -2 403 | 5c:a8:6a 2 404 | 5c:c9:d3 -1 405 | 5c:dc:96 2 406 | 5c:e2:8c 12 407 | 5c:f4:ab -4 408 | 60:03:47 1 409 | 60:08:10 15 410 | 60:19:71 -2 411 | 60:2e:20 5 412 | 60:31:97 0 413 | 60:32:b1 0 414 | 60:38:e0 1 415 | 60:3d:26 1 416 | 60:45:cb 0 417 | 60:63:4c -1 418 | 60:83:34 2 419 | 60:8d:26 3 420 | 60:b6:17 1 421 | 60:ce:86 -1 422 | 60:d7:55 6 423 | 60:de:f3 5 424 | 60:e3:27 0 425 | 60:e7:01 2 426 | 60:f1:8a 8 427 | 60:fa:9d 13 428 | 64:13:6c 0 429 | 64:20:9f 2 430 | 64:2c:ac -11 431 | 64:3e:8c 14 432 | 64:6d:6c 5 433 | 64:a6:51 2 434 | 64:cc:22 1 435 | 64:ee:b7 0 436 | 68:15:90 0 437 | 68:1a:b2 0 438 | 68:4a:ae 5 439 | 68:89:c1 5 440 | 68:8f:84 -5 441 | 68:a0:3e 0 442 | 68:a0:f6 2 443 | 68:a8:28 12 444 | 68:cc:6e 14 445 | 68:f9:56 -7 446 | 68:ff:7b 0 447 | 6c:16:32 8 448 | 6c:19:8f -1 449 | 6c:2e:85 0 450 | 6c:72:20 -1 451 | 6c:9e:7c 6 452 | 6c:b0:ce 3 453 | 6c:ba:b8 -3 454 | 6c:c6:3b 8 455 | 6c:d2:ba 0 456 | 6c:e4:da -3 457 | 6c:eb:b6 6 458 | 70:0b:01 0 459 | 70:2e:22 0 460 | 70:4d:7b 0 461 | 70:4f:57 0 462 | 70:5a:9e 1 463 | 70:62:b8 -1 464 | 70:79:90 14 465 | 70:8a:09 1 466 | 70:8b:cd 0 467 | 70:9f:2d 0 468 | 70:b9:21 0 469 | 70:c7:f2 8 470 | 70:cd:91 6 471 | 70:f1:96 1 472 | 70:f2:20 1 473 | 70:f8:2b -1 474 | 70:fd:45 5 475 | 74:12:bb 1 476 | 74:31:70 2 477 | 74:3c:18 8 478 | 74:42:7f 5 479 | 74:4d:28 0 480 | 74:5a:aa -5 481 | 74:9d:79 0 482 | 74:9d:8f 14 483 | 74:a0:63 5 484 | 74:a5:28 2 485 | 74:a7:8e 0 486 | 74:b5:7e 0 487 | 74:c1:4f 0 488 | 74:c9:a3 1 489 | 74:cc:39 0 490 | 74:da:88 0 491 | 74:da:da -1 492 | 78:17:35 8 493 | 78:29:ed 0 494 | 78:30:3b -3 495 | 78:31:2b 0 496 | 78:32:1b -1 497 | 78:58:60 8 498 | 78:65:59 0 499 | 78:6a:89 2 500 | 78:71:9c -2 501 | 78:81:02 0 502 | 78:94:b4 0 503 | 78:96:82 0 504 | 78:98:e8 2 505 | 78:b2:13 0 506 | 78:b4:6a 5 507 | 78:c1:a7 0 508 | 78:d2:94 3 509 | 78:d7:52 7 510 | 78:dd:12 1 511 | 78:f5:57 14 512 | 7c:03:d8 0 513 | 7c:11:cb 4 514 | 7c:1c:f1 14 515 | 7c:26:64 0 516 | 7c:39:53 0 517 | 7c:4f:b5 2 518 | 7c:7d:3d 2 519 | 7c:8b:ca 0 520 | 7c:8f:de 8 521 | 7c:a2:3e 13 522 | 7c:b7:33 0 523 | 7c:c3:85 7 524 | 7c:ff:4d -1 525 | 80:13:82 2 526 | 80:20:da 0 527 | 80:26:89 0 528 | 80:38:bc 5 529 | 80:41:26 7 530 | 80:69:33 5 531 | 80:71:7a 2 532 | 80:78:71 -3 533 | 80:7d:14 -11 534 | 80:8f:e8 0 535 | 80:b5:75 7 536 | 80:b6:86 2 537 | 80:d4:a5 12 538 | 80:f5:03 0 539 | 80:fb:06 6 540 | 84:16:f9 0 541 | 84:26:15 -1 542 | 84:47:65 1 543 | 84:5b:12 8 544 | 84:74:2a 0 545 | 84:9c:a6 2 546 | 84:a0:6e 0 547 | 84:a1:d1 0 548 | 84:a4:23 0 549 | 84:a8:e4 2 550 | 84:a9:c4 5 551 | 84:aa:9c 0 552 | 84:be:52 1 553 | 84:db:ac 2 554 | 84:e0:58 0 555 | 88:03:55 2 556 | 88:25:2c 2 557 | 88:28:b3 2 558 | 88:44:77 -6 559 | 88:53:d4 2 560 | 88:5d:fb 0 561 | 88:66:39 4 562 | 88:6a:e3 -1 563 | 88:94:7e 1 564 | 88:a6:c6 5 565 | 88:b3:62 4 566 | 88:cf:98 6 567 | 88:d2:74 0 568 | 88:d2:75 -2 569 | 88:d7:f6 0 570 | 88:e3:ab 2 571 | 8c:09:f4 -2 572 | 8c:0d:76 1 573 | 8c:10:d4 0 574 | 8c:34:fd 2 575 | 8c:3b:ad -2 576 | 8c:59:73 0 577 | 8c:68:3a 7 578 | 8c:68:c8 0 579 | 8c:6d:77 7 580 | 8c:c5:b4 3 581 | 8c:dc:02 0 582 | 8c:e0:81 0 583 | 8c:e1:17 0 584 | 8c:e5:ef 8 585 | 8c:eb:c6 2 586 | 8c:f8:13 0 587 | 8c:fd:18 5 588 | 90:03:25 8 589 | 90:0d:cb -2 590 | 90:17:ac 5 591 | 90:1a:ca -2 592 | 90:2b:d2 -5 593 | 90:4d:4a 0 594 | 90:67:1c 2 595 | 90:72:82 0 596 | 90:8d:78 -1 597 | 90:c7:92 -2 598 | 90:ef:68 14 599 | 90:f8:91 5 600 | 90:fd:73 0 601 | 94:04:9c 6 602 | 94:0b:19 7 603 | 94:10:3e 0 604 | 94:46:96 2 605 | 94:4a:0c 2 606 | 94:6a:b0 -8 607 | 94:77:2b 2 608 | 94:87:7c -2 609 | 94:91:7f -3 610 | 94:a6:7e 3 611 | 94:a7:b7 0 612 | 94:db:da 6 613 | 94:ea:ea 1 614 | 94:fb:b2 -1 615 | 94:fe:22 0 616 | 98:00:6a 0 617 | 98:00:74 -7 618 | 98:0d:67 -4 619 | 98:13:33 0 620 | 98:1e:19 0 621 | 98:35:ed 6 622 | 98:6b:3d -2 623 | 98:97:d1 0 624 | 98:9b:cb -1 625 | 98:da:c4 0 626 | 98:de:d0 -1 627 | 98:e7:f5 2 628 | 98:f4:28 0 629 | 98:fc:11 2 630 | 9c:1d:36 7 631 | 9c:1e:95 1 632 | 9c:34:26 -2 633 | 9c:37:f4 5 634 | 9c:3d:cf 3 635 | 9c:52:f8 7 636 | 9c:5c:8e 0 637 | 9c:65:ee 5 638 | 9c:69:b4 -2 639 | 9c:6f:52 0 640 | 9c:71:3a 6 641 | 9c:74:1a 12 642 | 9c:7d:a3 12 643 | 9c:80:df 2 644 | 9c:88:ad 0 645 | 9c:97:26 1 646 | 9c:b2:b2 1 647 | 9c:c1:72 2 648 | 9c:c7:a6 -1 649 | 9c:c9:eb 3 650 | 9c:d2:4b 0 651 | a0:04:60 3 652 | a0:08:6f 6 653 | a0:1b:29 0 654 | a0:39:ee 0 655 | a0:40:a0 3 656 | a0:63:91 3 657 | a0:64:8f 0 658 | a0:65:18 1 659 | a0:8c:f8 7 660 | a0:8d:16 2 661 | a0:8e:78 0 662 | a0:ab:1b -1 663 | a0:b5:49 9 664 | a0:e4:cb -2 665 | a0:ec:80 0 666 | a0:f4:79 7 667 | a4:00:e2 8 668 | a4:08:f5 0 669 | a4:15:88 -2 670 | a4:2b:8c 1 671 | a4:2b:b0 0 672 | a4:33:d7 0 673 | a4:3e:51 0 674 | a4:63:a1 -1 675 | a4:71:74 2 676 | a4:91:b1 1 677 | a4:93:3f 5 678 | a4:99:47 2 679 | a4:b1:e9 1 680 | a4:be:2b 6 681 | a4:c7:de 4 682 | a4:ca:a0 0 683 | a4:dc:be 7 684 | a4:f4:c2 1 685 | a8:25:eb -4 686 | a8:6a:bb 0 687 | a8:9a:93 0 688 | a8:a7:95 1 689 | a8:c8:3a 0 690 | a8:d3:f7 0 691 | a8:f5:ac 5 692 | ac:3b:77 0 693 | ac:61:75 12 694 | ac:64:62 0 695 | ac:75:1d 7 696 | ac:84:c6 0 697 | ac:84:c9 0 698 | ac:92:32 0 699 | ac:b3:13 -2 700 | ac:b3:b5 6 701 | ac:c6:62 0 702 | ac:cf:85 2 703 | ac:e8:7b 2 704 | ac:f9:70 6 705 | b0:08:75 6 706 | b0:39:56 0 707 | b0:4e:26 0 708 | b0:55:08 0 709 | b0:6e:bf 0 710 | b0:7f:b9 3 711 | b0:89:00 4 712 | b0:95:75 0 713 | b0:98:2b 0 714 | b0:ac:d2 0 715 | b0:b2:8f 0 716 | b0:b2:dc -4 717 | b0:b9:8a 3 718 | b0:bb:e5 3 719 | b0:be:76 0 720 | b0:c5:54 -1 721 | b0:e1:7e 0 722 | b0:e5:ed 1 723 | b0:ea:bc 0 724 | b0:eb:57 0 725 | b4:09:31 -12 726 | b4:0f:3b -8 727 | b4:26:5d 8 728 | b4:2a:0e 1 729 | b4:30:52 2 730 | b4:43:26 8 731 | b4:6e:08 8 732 | b4:75:0e 1 733 | b4:a5:ef 0 734 | b4:b3:62 0 735 | b4:cd:27 5 736 | b4:ee:b4 0 737 | b4:fb:f9 8 738 | b8:08:d7 1 739 | b8:19:04 8 740 | b8:26:6c 0 741 | b8:66:85 -7 742 | b8:69:f4 0 743 | b8:bc:1b 2 744 | b8:c3:85 0 745 | b8:d5:26 12 746 | b8:d9:4d 0 747 | b8:ec:a3 -2 748 | b8:ee:0e 0 749 | bc:05:43 3 750 | bc:0f:9a -1 751 | bc:25:e0 1 752 | bc:30:d9 1 753 | bc:3f:8f 12 754 | bc:62:0e -5 755 | bc:75:74 2 756 | bc:96:80 1 757 | bc:98:89 8 758 | bc:99:11 3 759 | bc:9c:31 5 760 | bc:a5:11 3 761 | bc:c0:0f 0 762 | bc:ca:b5 -2 763 | c0:25:06 -1 764 | c0:25:a2 -2 765 | c0:25:e9 0 766 | c0:3d:d9 0 767 | c0:56:27 1 768 | c0:70:09 5 769 | c0:9f:e1 0 770 | c0:a0:bb -1 771 | c0:ac:54 0 772 | c0:b1:01 -1 773 | c0:bf:c0 12 774 | c0:c1:c0 1 775 | c0:c5:22 -2 776 | c0:fd:84 0 777 | c0:ff:d4 3 778 | c4:04:15 0 779 | c4:07:2f 2 780 | c4:12:f5 -1 781 | c4:44:7d 6 782 | c4:47:3f 7 783 | c4:6e:1f -2 784 | c4:71:54 0 785 | c4:86:e9 -6 786 | c4:a3:66 0 787 | c4:a8:1d -1 788 | c4:ad:34 0 789 | c4:b8:b4 6 790 | c4:e9:0a -1 791 | c4:e9:84 0 792 | c4:ea:1d 1 793 | c4:f0:81 2 794 | c4:f0:ec 6 795 | c4:ff:1f 5 796 | c8:0c:c8 -6 797 | c8:0e:14 -1 798 | c8:14:51 1 799 | c8:3a:35 8 800 | c8:3f:b4 -2 801 | c8:51:95 1 802 | c8:54:4b 12 803 | c8:5a:9f 0 804 | c8:64:c7 0 805 | c8:6c:87 -4 806 | c8:8d:83 -3 807 | c8:91:f9 -2 808 | c8:94:bb -6 809 | c8:a7:76 8 810 | c8:d3:a3 -2 811 | c8:f6:c8 6 812 | cc:05:77 5 813 | cc:06:77 0 814 | cc:1a:fa 0 815 | cc:2d:21 1 816 | cc:2d:e0 0 817 | cc:32:e5 0 818 | cc:40:d0 0 819 | cc:5d:4e -4 820 | cc:64:a6 7 821 | cc:7b:35 0 822 | cc:a2:23 2 823 | cc:a4:62 -2 824 | cc:bb:fe 8 825 | cc:ce:1e -1 826 | cc:d4:2e 3 827 | cc:d4:a1 0 828 | cc:ed:dc 0 829 | d0:05:2a 2 830 | d0:0f:6d -1 831 | d0:15:4a 0 832 | d0:57:94 0 833 | d0:60:8c 0 834 | d0:65:ca 2 835 | d0:6e:de -7 836 | d0:6f:82 1 837 | d0:76:8f 7 838 | d0:84:b0 0 839 | d0:96:fb 5 840 | d0:b2:c4 1 841 | d0:d0:4b 6 842 | d0:ef:c1 6 843 | d0:ff:98 -6 844 | d4:21:22 2 845 | d4:40:f0 2 846 | d4:58:00 6 847 | d4:60:e3 0 848 | d4:61:2e 2 849 | d4:63:fe 0 850 | d4:6e:0e 0 851 | d4:76:ea 0 852 | d4:7b:b0 0 853 | d4:9a:04 -2 854 | d4:9a:06 -2 855 | d4:9a:a0 1 856 | d4:a1:48 2 857 | d4:ad:2d 0 858 | d4:c1:c8 0 859 | d4:f8:29 0 860 | d4:f9:a1 12 861 | d8:07:b6 0 862 | d8:0d:17 0 863 | d8:77:8b 1 864 | d8:7d:7f 0 865 | d8:9b:3b -5 866 | d8:a7:56 0 867 | d8:c6:78 0 868 | d8:c7:71 4 869 | d8:d7:75 0 870 | d8:fb:5e 0 871 | dc:02:8e 0 872 | dc:09:4c 2 873 | dc:15:c8 5 874 | dc:16:b2 0 875 | dc:39:6f 5 876 | dc:99:14 8 877 | dc:d9:16 2 878 | dc:d9:ae 8 879 | dc:e3:05 -1 880 | dc:ef:09 3 881 | dc:f8:b9 0 882 | e0:0e:e4 -1 883 | e0:19:1d 2 884 | e0:19:54 0 885 | e0:1d:3b 4 886 | e0:28:61 7 887 | e0:28:6d -1 888 | e0:36:76 6 889 | e0:41:36 0 890 | e0:51:63 0 891 | e0:60:66 2 892 | e0:8e:3c 0 893 | e0:97:96 13 894 | e0:a3:ac 2 895 | e0:b9:e5 1 896 | e0:cc:7a 8 897 | e0:ce:c3 0 898 | e0:e8:e6 -7 899 | e4:18:6b 0 900 | e4:26:86 -1 901 | e4:3e:d7 0 902 | e4:47:b3 0 903 | e4:6f:13 -1 904 | e4:75:dc 3 905 | e4:7e:66 5 906 | e4:83:26 7 907 | e4:8d:8c 0 908 | e4:a8:b6 7 909 | e4:ab:89 0 910 | e4:be:ed -1 911 | e4:ca:12 0 912 | e4:ea:83 4 913 | e4:f4:c6 0 914 | e4:fb:5d -6 915 | e8:01:8d 0 916 | e8:1b:69 -2 917 | e8:37:7a -2 918 | e8:3e:fc -2 919 | e8:5a:d1 6 920 | e8:65:d4 1 921 | e8:68:19 5 922 | e8:89:2c -2 923 | e8:ad:a6 0 924 | e8:cd:2d 2 925 | e8:d1:1b 0 926 | e8:df:70 -1 927 | e8:ed:05 -2 928 | ec:08:6b 1 929 | ec:22:80 -1 930 | ec:23:3d 2 931 | ec:38:8f 13 932 | ec:43:f6 -4 933 | ec:4c:4d -3 934 | ec:4d:47 7 935 | ec:56:23 0 936 | ec:6c:9a 3 937 | ec:84:b4 4 938 | ec:ad:e0 -1 939 | ec:be:dd 0 940 | ec:cb:30 2 941 | ec:f0:fe 0 942 | ec:f4:51 0 943 | f0:2f:a7 12 944 | f0:33:e5 13 945 | f0:3f:95 13 946 | f0:40:7b 1 947 | f0:43:47 0 948 | f0:63:f9 5 949 | f0:68:65 8 950 | f0:81:75 -16 951 | f0:82:61 0 952 | f0:84:2f -1 953 | f0:86:20 2 954 | f0:b0:14 -1 955 | f0:b4:d2 -1 956 | f0:c8:50 5 957 | f4:1d:6b 8 958 | f4:4c:7f 4 959 | f4:55:9c 2 960 | f4:57:3e 1 961 | f4:6b:ef 0 962 | f4:79:60 7 963 | f4:8c:eb -1 964 | f4:8e:92 2 965 | f4:9f:f3 2 966 | f4:a4:d6 7 967 | f4:b5:aa 0 968 | f4:b7:8d 8 969 | f4:b8:a7 0 970 | f4:bf:80 0 971 | f4:c7:14 2 972 | f4:cb:52 2 973 | f4:de:af 7 974 | f4:e3:fb 2 975 | f4:e5:f2 8 976 | f4:f2:6d 0 977 | f8:01:13 2 978 | f8:08:4f 5 979 | f8:23:b2 2 980 | f8:3d:ff 2 981 | f8:5b:3b -3 982 | f8:6c:e1 4 983 | f8:6e:ee 6 984 | f8:75:88 5 985 | f8:98:b9 5 986 | f8:98:ef 5 987 | f8:9a:78 5 988 | f8:ab:05 0 989 | f8:af:db 1 990 | f8:b7:97 -3 991 | f8:bf:09 5 992 | f8:c3:9e 0 993 | f8:ca:59 -9 994 | f8:df:a8 0 995 | f8:e8:11 -5 996 | f8:e9:03 -1 997 | f8:ed:a5 -2 998 | fc:1b:d1 8 999 | fc:2b:b2 1 1000 | fc:3f:7c 1 1001 | fc:52:8d 2 1002 | fc:6f:b7 0 1003 | fc:a6:cd 0 1004 | fc:b4:e6 0 1005 | fc:bc:d1 8 1006 | fc:c8:97 0 1007 | fc:e3:3c 8 1008 | fc:f5:28 -4 1009 | -------------------------------------------------------------------------------- /IPvSeeYou.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | import sys 4 | import json 5 | import logging 6 | import argparse 7 | import ipaddress 8 | import requests 9 | import BSSIDApple_pb2 10 | import simplekml 11 | from urllib3.exceptions import InsecureRequestWarning 12 | 13 | #suppress certificate warnings for hitting Apple's location services API 14 | #endpoint 15 | requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) 16 | logging.basicConfig(level=logging.INFO) 17 | 18 | def isMAC(s): 19 | ''' 20 | @brief: Checks if string s is a valid MAC address 21 | @param: s -- string, colon-separated MAC address in aa:bb:cc:dd:ee:ff form 22 | @return: True if valid, False else 23 | ''' 24 | if len(s.split(':')) != 6: 25 | return False 26 | for x in s.split(':'): 27 | if len(x) != 2: 28 | return False 29 | try: 30 | i = int(x,16) 31 | if i < 0 or i > 255: 32 | return False 33 | except ValueError: 34 | return False 35 | 36 | return True 37 | 38 | def isEUI64(addr): 39 | ''' 40 | @params: addr -- full 32-hex digit address 41 | @returns: True if an EUI64 address, False if not 42 | ''' 43 | if not addr or "*" in addr: 44 | return False 45 | try: 46 | addr.split(':') 47 | except IndexError: 48 | return False 49 | 50 | hextets = addr.split(':') 51 | 52 | if hextets[-3].endswith('ff') and hextets[-2].startswith('fe'): 53 | return True 54 | else: 55 | return False 56 | 57 | def checkArgs(args): 58 | ''' 59 | @brief: Checks arguments for errors/format 60 | @param: args -- Argparse args object 61 | @return: None 62 | ''' 63 | 64 | #Validate MAC/MAC file/EUI-64 IPv6/EUI-64 IPv6 file 65 | if args.mac and not isMAC(args.mac): 66 | print(f"[-] Error: {args.mac} is not a valid MAC address (e.g. " +\ 67 | "00:11:22:33:44:55)") 68 | sys.exit(1) 69 | elif args.mac_file and not os.path.exists(args.mac_file): 70 | print(f"[-] Error: {args.mac_file} does not exist") 71 | sys.exit(2) 72 | elif args.eui and not isEUI64(args.eui): 73 | print(f"[-] Error: {args.eui} is not an EUI-64 IPv6 address") 74 | sys.exit(3) 75 | elif args.eui_file and not os.path.exists(args.eui_file): 76 | print(f"[-] Error: {args.eui_file} does not exist") 77 | sys.exit(4) 78 | 79 | if not args.offset_file: 80 | print(f"[-] Error: Offset file must be specified") 81 | sys.exit(5) 82 | 83 | if args.wigle and (not args.api_user or not args.api_pass): 84 | print(f"[-] Error: -w/--wigle requires -U/--api-user USERNAME and "+\ 85 | "-P/--api-pass PASS where USERNAME and PASS are the user's "+\ 86 | "WiGLE API authentication parameters") 87 | sys.exit(6) 88 | 89 | def getOUI(mac): 90 | ''' 91 | @brief: returns OUI from a MAC address 92 | @param: mac: MAC address in xx:xx:xx:xx:xx (colon-separated) 93 | format 94 | @return: OUI 95 | ''' 96 | return ':'.join(mac.split(':')[:3]) 97 | 98 | 99 | def getOffsets(fname): 100 | ''' 101 | @brief: reads file of OUI offsets, returns OUI-keyed dict of these offsets 102 | @param: fname: string filename parameter 103 | @returns: ouiDict: dictionary keyed by OUI, each OUI maps to the WAN-BSSID 104 | offset integer 105 | ''' 106 | ouiDict = {} 107 | with open(fname) as f: 108 | for line in f: 109 | l = line.strip().split() 110 | oui = l[0] 111 | offset = int(l[1]) 112 | ouiDict[oui] = offset 113 | return ouiDict 114 | 115 | def macToInt(mac): 116 | ''' 117 | @brief: converts a MAC into an integer 118 | @param: mac: a MAC address in colon-separated format 119 | @returns: macInt, that MAC address as an integer 120 | ''' 121 | translation_table = dict.fromkeys(map(ord, ':.- '), None) 122 | 123 | macInt = int(mac.translate(translation_table), 16) 124 | 125 | return macInt 126 | 127 | def intToMAC(n): 128 | ''' 129 | @brief intToMac converts an integer into a MAC address 130 | @param: n: integer to convert into a MAC address 131 | @returns: macStr: the converted MAC address 132 | ''' 133 | if n > (2**48 - 1): 134 | print(f"{n} is too large to fit into a 48-bit MAC address") 135 | macHex = "{:012x}".format(n) 136 | macStr = ":".join(macHex[i:i+2] for i in range(0, len(macHex), 2)) 137 | return macStr 138 | 139 | 140 | def getPredictedBSSID(mac, ouiDict): 141 | ''' 142 | @brief: returns the predicted BSSID for an EUI-64-derived MAC given the MAC 143 | and a dictionary of OUI->(WAN-BSSID offset) mappings 144 | @param: mac: the EUI-64-derived MAC address 145 | @param: ouiDict: a dictionary keyed by OUI that maps to each OUI's WAN-BSSID 146 | offset value 147 | @returns: the predicted BSSID 148 | ''' 149 | oui = getOUI(mac) 150 | 151 | if not oui in ouiDict: 152 | logging.info(f"{oui} has no WAN-BSSID inferences; can't "+\ 153 | f"geolocate {mac}") 154 | return None 155 | 156 | offset = ouiDict[oui] 157 | 158 | macInt = macToInt(mac) 159 | 160 | return intToMAC(macInt + offset) 161 | 162 | def delocalize(mac): 163 | ''' 164 | @param: mac: MAC address string of the form (xy:xx:xx:xx:xx:xx) where the 165 | y position has the local bit on 166 | @returns: delocalized mac address string 167 | ''' 168 | first_byte = mac.split(':')[0] 169 | first_nybble = first_byte[0] 170 | second_nybble = first_byte[1] 171 | 172 | #if this is global already, return 173 | if not (int(second_nybble,16) >> 1) & 1: 174 | return mac 175 | 176 | second_nybble = hex(int(second_nybble,16) ^ 0x2)[2:] 177 | if second_nybble ==2: 178 | sys.exit(1) 179 | first_byte = first_nybble + second_nybble 180 | 181 | return first_byte + ':' + ':'.join(mac.split(':')[1:]) 182 | 183 | def getMAC(addr): 184 | ''' 185 | @params: addr -- full 32-hex digit EUI-64 address 186 | @returns: de-localized MAC address (unless explicit deloc=False in call) 187 | ''' 188 | lower64 = addr.split(':')[4:] 189 | one_two = lower64[0][:2] + ':' + lower64[0][2:] 190 | three = lower64[1][:2] 191 | four = lower64[2][2:] 192 | five_six = lower64[3][:2] + ':' + lower64[3][2:] 193 | 194 | return delocalize(':'.join([one_two,three,four,five_six])) 195 | 196 | def geolocateApple(bssid): 197 | ''' 198 | @brief: Attempts to geolocate a BSSID using the Apple location services API 199 | @param: bssid: the BSSID to attempt to geolocate 200 | @returns: (lat,lon) tuple of floats 201 | 202 | @notes: much of this code borrowed from iSniff-GPS, who borrowed it from 203 | Mostly taken from paper by François-Xavier Aguessy and Côme Demoustier 204 | http://fxaguessy.fr/rapport-pfe-interception-ssl-analyse-donnees-localisation-smartphones/ 205 | ''' 206 | 207 | print("Geolocating bssid", bssid) 208 | 209 | data_bssid = f"\x12\x13\n\x11{bssid}\x18\x00\x20\01" 210 | headers = {'Content-Type':'application/x-www-form-urlencoded', 211 | 'Accept':'*/*', 212 | "Accept-Charset": "utf-8", 213 | "Accept-Encoding": "gzip, deflate", 214 | "Accept-Language":"en-us", 215 | 'User-Agent':'locationd/1753.17 CFNetwork/711.1.12 Darwin/14.0.0' 216 | } 217 | data = "\x00\x01\x00\x05en_US\x00\x13com.apple.locationd\x00\x0a"+\ 218 | "8.1.12B411\x00\x00\x00\x01\x00\x00\x00" + \ 219 | chr(len(data_bssid)) + data_bssid; 220 | 221 | r = requests.post('https://gs-loc.apple.com/clls/wloc',headers=headers,data=data,verify=False) # CN of cert on this hostname is sometimes *.ls.apple.com / ls.apple.com, so have to disable SSL verify 222 | 223 | bssidResponse = BSSIDApple_pb2.BSSIDResp() 224 | bssidResponse.ParseFromString(r.content[10:]) 225 | 226 | for wifi in bssidResponse.wifi: 227 | #Skip any BSSIDs Apple returns that aren't the one we requested 228 | #Need to normalize each MAC byte because the string representation will 229 | #strip out leading 0s for some reason. So for e.g., need to turn 230 | # 0:11:22:33:44:55 231 | # into 00:11:22:33:44:55 232 | checkBSSID = ":".join("0" + x if len(x) == 1 else x for x in 233 | wifi.bssid.split(":")) 234 | if checkBSSID != bssid: 235 | continue 236 | lat = wifi.location.lat * pow(10,-8) 237 | lon = wifi.location.lon * pow(10,-8) 238 | 239 | return lat, lon 240 | 241 | return -180.0, -180.0 242 | 243 | def geolocateMylnikov(bssid): 244 | ''' 245 | @brief: Attempts to geolocate BSSID using the api.mylnikov.org API. 246 | @param: bssid: a string BSSID to attempt to geolocate 247 | @returns: lat, lon, float tuple representing the BSSID's geolocation 248 | according to the API, or -180.0,-180.0 if not found 249 | ''' 250 | lat, lon = -180.0, -180.0 251 | 252 | session = requests.Session() 253 | url = f"https://api.mylnikov.org/geolocation/wifi?v=1.1&data=open&"+\ 254 | f"bssid={bssid}" 255 | try: 256 | r = session.get(url) 257 | resp = json.loads(r.text) 258 | 259 | if resp['result'] != 200: 260 | print(f"[-] Failure geolocating {bssid}") 261 | else: 262 | #we got a successful geolocation, so return it 263 | lat = resp["lat"] 264 | lon = resp["lon"] 265 | 266 | except Exception as e: 267 | print(f"[-] Exception {e} querying mylnikov") 268 | 269 | return lat, lon 270 | 271 | def geolocateWiGLE(bssid, apiUser, apiPass): 272 | ''' 273 | @brief: Attempts to geolocate BSSID using WiGLE's API. Requires a valid, 274 | active API key apiKey 275 | @param: bssid: a string BSSID to attempt to geolocate 276 | @param: apiKey: a valid WiGLE API key 277 | @returns: lat, lon, float tuple representing the BSSID's geolocation 278 | according to WiGLE, or -180.0,-180.0 if not found 279 | ''' 280 | 281 | lat, lon = -180.0, -180.0 282 | 283 | session = requests.Session() 284 | session.auth = (apiUser, apiPass) 285 | 286 | url = f"https://api.wigle.net/api/v2/network/search?netid={bssid}" 287 | try: 288 | r = session.get(url) 289 | resp = json.loads(r.text) 290 | 291 | if resp['success'] != True or 'results' not in resp or not resp['results']: 292 | print(f"[-] Failure geolocating {bssid}") 293 | else: 294 | #we got a successful geolocation, so return it 295 | results = resp['results'] 296 | for item in results: 297 | resBssid = item['netid'].lower() 298 | if bssid != resBssid: 299 | continue 300 | lat = item['trilat'] 301 | lon = item['trilong'] 302 | break 303 | 304 | except Exception as e: 305 | print(f"[-] Exception {e} querying WiGLE") 306 | 307 | return lat, lon 308 | 309 | def geolocate(bssid, args): 310 | ''' 311 | @brief: Decides which geolocation engine to use and passes the required 312 | parameters off to that function 313 | @param: bssid: string BSSID to attempt to geolocate 314 | @param: args: argparse argument object 315 | @returns: Lat/lon from geolocation (unable to geolocate returns 316 | -180.0,-180.0) 317 | ''' 318 | lat, lon = -180.0, -180.0 319 | 320 | #short circuit if there wasn't a valid BSSID guess 321 | if not bssid: return lat, lon 322 | 323 | if args.apple: 324 | lat, lon = geolocateApple(bssid) 325 | elif args.wigle: 326 | lat, lon = geolocateWiGLE(bssid, args.api_user, args.api_pass) 327 | elif args.mylnikov: 328 | lat, lon = geolocateMylnikov(bssid) 329 | 330 | return lat, lon 331 | 332 | def validateIP(ip): 333 | ''' 334 | @brief: Checks whether an IP address parameter is valid 335 | @param: ip: string to verify is a legit IPv6 address 336 | @returns: bool: True if ip is a valid IPv6 address, False else 337 | ''' 338 | try: 339 | ipaddress.IPv6Address(ip) 340 | except ipaddress.AddressValueError as e: 341 | print(f"[-] Error: {ip} is an invalid IPv6 address: {e}") 342 | return False 343 | except Exception as e: 344 | print(f"[-] Unexpected error validating IP address: {e}") 345 | return False 346 | 347 | return True 348 | 349 | 350 | def printLocations(locations): 351 | ''' 352 | @brief: Prints the lookup results in a friendly manner 353 | @param: locations: dictionary keyed by EUI-64-derived MAC address 354 | @return: None 355 | ''' 356 | 357 | print("#EUI-64-Derived MAC\tBSSID\tlat,lon") 358 | for euiMAC in locations: 359 | res = locations[euiMAC] 360 | BSSID = res[0] 361 | lat = res[1] 362 | lon = res[2] 363 | print(f"{euiMAC}\t{BSSID}\t{lat},{lon}") 364 | 365 | return None 366 | 367 | def writeKML(locations, fname): 368 | ''' 369 | @brief: Writes the KML output file if user wanted one written 370 | @param: locations: dictionary keyed by EUI-64-derived MAC address 371 | @return: None 372 | ''' 373 | 374 | kml = simplekml.Kml() 375 | 376 | for euiMAC in locations: 377 | res = locations[euiMAC] 378 | BSSID = res[0] 379 | lat = res[1] 380 | lon = res[2] 381 | 382 | #skip the default invalid coordinates we return if we can't find a 383 | #predicted BSSID 384 | if lat == -180 and lon == -180: 385 | continue 386 | 387 | point = kml.newpoint(name=BSSID, description=f"EUI-64-Derived MAC: {euiMAC}", 388 | coords=[(lon, lat)]) 389 | 390 | kml.save(fname) 391 | 392 | return None 393 | 394 | def main(args): 395 | 396 | locations = {} 397 | ouiDict = getOffsets(args.offset_file) 398 | 399 | #Single MAC geolocation requested 400 | if args.mac: 401 | predictedBSSID = getPredictedBSSID(args.mac, ouiDict) 402 | lat, lon = geolocate(predictedBSSID, args) 403 | locations[args.mac] = (predictedBSSID, lat, lon) 404 | 405 | #File of EUI-64 MAC geolocations requested 406 | elif args.mac_file: 407 | 408 | with open(args.mac_file) as f: 409 | for line in f: 410 | mac = line.strip() 411 | if not isMAC(mac): 412 | print(f"[-] {mac} is not a valid MAC address") 413 | continue 414 | 415 | predictedBSSID = getPredictedBSSID(mac, ouiDict) 416 | lat, lon = geolocate(predictedBSSID, args) 417 | locations[mac] = (predictedBSSID, lat, lon) 418 | 419 | #Single EUI-64 IPv6 address to geolocate requested 420 | elif args.eui: 421 | 422 | if not validateIP(args.eui): 423 | sys.exit(6) 424 | 425 | mac = getMAC(ipaddress.IPv6Address(args.eui).exploded) 426 | predictedBSSID = getPredictedBSSID(mac, ouiDict) 427 | lat, lon = geolocate(predictedBSSID, args) 428 | locations[mac] = (predictedBSSID, lat, lon) 429 | 430 | #File of EUI-64 IPv6 address geolocations requested 431 | elif args.eui_file: 432 | 433 | with open(args.eui_file) as f: 434 | for line in f: 435 | ip = line.strip() 436 | 437 | if not validateIP(ip): 438 | continue 439 | 440 | if not isEUI64(ip): 441 | print(f"[-] {ip} is not a valid EUI-64 IPv6 address") 442 | continue 443 | 444 | mac = getMAC(ipaddress.IPv6Address(ip).exploded) 445 | 446 | predictedBSSID = getPredictedBSSID(mac, ouiDict) 447 | lat, lon = geolocate(predictedBSSID, args) 448 | locations[mac] = (predictedBSSID, lat, lon) 449 | 450 | printLocations(locations) 451 | 452 | if args.kml: 453 | writeKML(locations, args.kml) 454 | 455 | if __name__ == "__main__": 456 | parser = argparse.ArgumentParser() 457 | 458 | inputType = parser.add_mutually_exclusive_group(required=True) 459 | inputType.add_argument("-M", "--mac-file", help="File of MAC addresses "+\ 460 | "from EUI-64 IPv6 addresses to bulk lookup") 461 | inputType.add_argument("-m", "--mac", help="Single MAC address from "+\ 462 | "EUI-64 IPv6 address to attempt to geolocate") 463 | inputType.add_argument("-e", "--eui", help="Single EUI-64 IPv6 address" +\ 464 | " to extract MAC from and attempt to geolocate") 465 | inputType.add_argument("-E", "--eui-file", help="File of EUI-64 IPv6 " +\ 466 | "addresses to extract MAC from and attempt to geolocate") 467 | lookupType = parser.add_mutually_exclusive_group(required=True) 468 | lookupType.add_argument("-a", "--apple", help="Use Apple's location " +\ 469 | "services API to geolocate BSSID", action="store_true") 470 | lookupType.add_argument("-w", "--wigle", help="Use WiGLE's API to " +\ 471 | "geolocate BSSID (requires -U API_USER and -P API_PASS)", 472 | action="store_true") 473 | lookupType.add_argument("-y", "--mylnikov", help="Use api.mylnikov.org "+\ 474 | "API to geolocate BSSID", action="store_true") 475 | parser.add_argument("-o", "--offset-file", help="File containing " + \ 476 | "inferred OUI offsets (default ./offsets.txt)", default="offsets.txt") 477 | parser.add_argument("-k", "--kml", help="Output KML filename") 478 | parser.add_argument("-U", "--api-user", help="WiGLE API username (required for -w)") 479 | parser.add_argument("-P", "--api-pass", help="WiGLE API password (required for -w)") 480 | args = parser.parse_args() 481 | 482 | checkArgs(args) 483 | 484 | main(args) 485 | 486 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | --------------------------------------------------------------------------------