diff --git a/daemon.py b/daemon.py index e9746cdfa..844a771fd 100644 --- a/daemon.py +++ b/daemon.py @@ -239,7 +239,7 @@ from content import addHtmlTags from content import extractMediaInFormPOST from content import saveMediaInFormPOST from content import extractTextFieldsInPOST -from media import removeMetaData +from media import processMetaData from cache import checkForChangedActor from cache import storePersonInCache from cache import getPersonFromCache @@ -312,6 +312,18 @@ def saveDomainQrcode(baseDir: str, httpPrefix: str, class PubServer(BaseHTTPRequestHandler): protocol_version = 'HTTP/1.1' + def _getSpoofedCity(self, baseDir: str, nickname: str, domain: str) -> str: + """Returns the name of the city to use as a GPS spoofing location for + image metadata + """ + city = self.server.city + cityFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/city.txt' + if os.path.isfile(cityFilename): + with open(cityFilename, 'r') as fp: + city = fp.read().replace('\n', '') + return city + def _getInstalceUrl(self, callingDomain: str) -> str: """Returns the URL for this instance """ @@ -420,6 +432,9 @@ class PubServer(BaseHTTPRequestHandler): eventDate = None eventTime = None location = None + city = self._getSpoofedCity(self.server.baseDir, + nickname, self.server.domain) + messageJson = \ createPublicPost(self.server.baseDir, nickname, @@ -428,7 +443,7 @@ class PubServer(BaseHTTPRequestHandler): answer, False, False, False, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, inReplyTo, inReplyToAtomUri, subject, @@ -1144,9 +1159,13 @@ class PubServer(BaseHTTPRequestHandler): Client to server message post https://www.w3.org/TR/activitypub/#client-to-server-outbox-delivery """ + city = self.server.city + if postToNickname: print('Posting to nickname ' + postToNickname) self.postToNickname = postToNickname + city = self._getSpoofedCity(self.server.baseDir, + postToNickname, self.server.domain) return postMessageToOutbox(self.server.session, self.server.translate, @@ -1170,7 +1189,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.debug, self.server.YTReplacementDomain, self.server.showPublishedDateOnly, - self.server.allowLocalNetworkAccess) + self.server.allowLocalNetworkAccess, + city) def _postToOutboxThread(self, messageJson: {}) -> bool: """Creates a thread to send a post @@ -4075,7 +4095,11 @@ class PubServer(BaseHTTPRequestHandler): os.remove(postImageFilename + '.etag') except BaseException: pass - removeMetaData(filename, postImageFilename) + + city = self._getSpoofedCity(baseDir, nickname, domain) + + processMetaData(baseDir, nickname, domain, + filename, postImageFilename, city) if os.path.isfile(postImageFilename): print('profile update POST ' + mType + ' image or font saved to ' + postImageFilename) @@ -4226,6 +4250,13 @@ class PubServer(BaseHTTPRequestHandler): nickname, pwd) + # change city + if fields.get('cityDropdown'): + cityFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/city.txt' + with open(cityFilename, 'w+') as fp: + fp.write(fields['cityDropdown']) + # change displayed name if fields.get('displayNickname'): if fields['displayNickname'] != actorJson['name']: @@ -4244,118 +4275,175 @@ class PubServer(BaseHTTPRequestHandler): if checkNameAndBio: redirectPath = 'previewAvatar' - # change media instance status - if fields.get('mediaInstance'): - self.server.mediaInstance = False - self.server.defaultTimeline = 'inbox' - if fields['mediaInstance'] == 'on': - self.server.mediaInstance = True - self.server.blogsInstance = False - self.server.newsInstance = False - self.server.defaultTimeline = 'tlmedia' - setConfigParam(baseDir, - "mediaInstance", - self.server.mediaInstance) - setConfigParam(baseDir, - "blogsInstance", - self.server.blogsInstance) - setConfigParam(baseDir, - "newsInstance", - self.server.newsInstance) - else: - if self.server.mediaInstance: + if nickname == adminNickname: + # change media instance status + if fields.get('mediaInstance'): self.server.mediaInstance = False self.server.defaultTimeline = 'inbox' + if fields['mediaInstance'] == 'on': + self.server.mediaInstance = True + self.server.blogsInstance = False + self.server.newsInstance = False + self.server.defaultTimeline = 'tlmedia' setConfigParam(baseDir, "mediaInstance", self.server.mediaInstance) - - # is this a news theme? - if isNewsThemeName(self.server.baseDir, - self.server.themeName): - fields['newsInstance'] = 'on' - - # change news instance status - if fields.get('newsInstance'): - self.server.newsInstance = False - self.server.defaultTimeline = 'inbox' - if fields['newsInstance'] == 'on': - self.server.newsInstance = True - self.server.blogsInstance = False - self.server.mediaInstance = False - self.server.defaultTimeline = 'tlfeatures' - setConfigParam(baseDir, - "mediaInstance", - self.server.mediaInstance) - setConfigParam(baseDir, - "blogsInstance", - self.server.blogsInstance) - setConfigParam(baseDir, - "newsInstance", - self.server.newsInstance) - else: - if self.server.newsInstance: - self.server.newsInstance = False - self.server.defaultTimeline = 'inbox' - setConfigParam(baseDir, - "newsInstance", - self.server.mediaInstance) - - # change blog instance status - if fields.get('blogsInstance'): - self.server.blogsInstance = False - self.server.defaultTimeline = 'inbox' - if fields['blogsInstance'] == 'on': - self.server.blogsInstance = True - self.server.mediaInstance = False - self.server.newsInstance = False - self.server.defaultTimeline = 'tlblogs' - setConfigParam(baseDir, - "blogsInstance", - self.server.blogsInstance) - setConfigParam(baseDir, - "mediaInstance", - self.server.mediaInstance) - setConfigParam(baseDir, - "newsInstance", - self.server.newsInstance) - else: - if self.server.blogsInstance: - self.server.blogsInstance = False - self.server.defaultTimeline = 'inbox' setConfigParam(baseDir, "blogsInstance", self.server.blogsInstance) + setConfigParam(baseDir, + "newsInstance", + self.server.newsInstance) + else: + if self.server.mediaInstance: + self.server.mediaInstance = False + self.server.defaultTimeline = 'inbox' + setConfigParam(baseDir, + "mediaInstance", + self.server.mediaInstance) - # change theme - if fields.get('themeDropdown'): - self.server.themeName = fields['themeDropdown'] - setTheme(baseDir, self.server.themeName, domain, - allowLocalNetworkAccess, systemLanguage) - self.server.textModeBanner = \ - getTextModeBanner(self.server.baseDir) - self.server.iconsCache = {} - self.server.fontsCache = {} - self.server.showPublishAsIcon = \ - getConfigParam(self.server.baseDir, - 'showPublishAsIcon') - self.server.fullWidthTimelineButtonHeader = \ - getConfigParam(self.server.baseDir, - 'fullWidthTimelineButtonHeader') - self.server.iconsAsButtons = \ - getConfigParam(self.server.baseDir, - 'iconsAsButtons') - self.server.rssIconAtTop = \ - getConfigParam(self.server.baseDir, - 'rssIconAtTop') - self.server.publishButtonAtTop = \ - getConfigParam(self.server.baseDir, - 'publishButtonAtTop') - setNewsAvatar(baseDir, - fields['themeDropdown'], - httpPrefix, - domain, - domainFull) + # is this a news theme? + if isNewsThemeName(self.server.baseDir, + self.server.themeName): + fields['newsInstance'] = 'on' + + # change news instance status + if fields.get('newsInstance'): + self.server.newsInstance = False + self.server.defaultTimeline = 'inbox' + if fields['newsInstance'] == 'on': + self.server.newsInstance = True + self.server.blogsInstance = False + self.server.mediaInstance = False + self.server.defaultTimeline = 'tlfeatures' + setConfigParam(baseDir, + "mediaInstance", + self.server.mediaInstance) + setConfigParam(baseDir, + "blogsInstance", + self.server.blogsInstance) + setConfigParam(baseDir, + "newsInstance", + self.server.newsInstance) + else: + if self.server.newsInstance: + self.server.newsInstance = False + self.server.defaultTimeline = 'inbox' + setConfigParam(baseDir, + "newsInstance", + self.server.mediaInstance) + + # change blog instance status + if fields.get('blogsInstance'): + self.server.blogsInstance = False + self.server.defaultTimeline = 'inbox' + if fields['blogsInstance'] == 'on': + self.server.blogsInstance = True + self.server.mediaInstance = False + self.server.newsInstance = False + self.server.defaultTimeline = 'tlblogs' + setConfigParam(baseDir, + "blogsInstance", + self.server.blogsInstance) + setConfigParam(baseDir, + "mediaInstance", + self.server.mediaInstance) + setConfigParam(baseDir, + "newsInstance", + self.server.newsInstance) + else: + if self.server.blogsInstance: + self.server.blogsInstance = False + self.server.defaultTimeline = 'inbox' + setConfigParam(baseDir, + "blogsInstance", + self.server.blogsInstance) + + # change theme + if fields.get('themeDropdown'): + self.server.themeName = fields['themeDropdown'] + setTheme(baseDir, self.server.themeName, domain, + allowLocalNetworkAccess, systemLanguage) + self.server.textModeBanner = \ + getTextModeBanner(self.server.baseDir) + self.server.iconsCache = {} + self.server.fontsCache = {} + self.server.showPublishAsIcon = \ + getConfigParam(self.server.baseDir, + 'showPublishAsIcon') + self.server.fullWidthTimelineButtonHeader = \ + getConfigParam(self.server.baseDir, + 'fullWidthTimelineButtonHeader') + self.server.iconsAsButtons = \ + getConfigParam(self.server.baseDir, + 'iconsAsButtons') + self.server.rssIconAtTop = \ + getConfigParam(self.server.baseDir, + 'rssIconAtTop') + self.server.publishButtonAtTop = \ + getConfigParam(self.server.baseDir, + 'publishButtonAtTop') + setNewsAvatar(baseDir, + fields['themeDropdown'], + httpPrefix, + domain, + domainFull) + + # change instance title + if fields.get('instanceTitle'): + currInstanceTitle = \ + getConfigParam(baseDir, 'instanceTitle') + if fields['instanceTitle'] != currInstanceTitle: + setConfigParam(baseDir, 'instanceTitle', + fields['instanceTitle']) + + # change YouTube alternate domain + if fields.get('ytdomain'): + currYTDomain = self.server.YTReplacementDomain + if fields['ytdomain'] != currYTDomain: + newYTDomain = fields['ytdomain'] + if '://' in newYTDomain: + newYTDomain = newYTDomain.split('://')[1] + if '/' in newYTDomain: + newYTDomain = newYTDomain.split('/')[0] + if '.' in newYTDomain: + setConfigParam(baseDir, + 'youtubedomain', + newYTDomain) + self.server.YTReplacementDomain = \ + newYTDomain + else: + setConfigParam(baseDir, + 'youtubedomain', '') + self.server.YTReplacementDomain = None + + # change instance description + currInstanceDescriptionShort = \ + getConfigParam(baseDir, + 'instanceDescriptionShort') + if fields.get('instanceDescriptionShort'): + if fields['instanceDescriptionShort'] != \ + currInstanceDescriptionShort: + iDesc = fields['instanceDescriptionShort'] + setConfigParam(baseDir, + 'instanceDescriptionShort', + iDesc) + else: + if currInstanceDescriptionShort: + setConfigParam(baseDir, + 'instanceDescriptionShort', '') + currInstanceDescription = \ + getConfigParam(baseDir, 'instanceDescription') + if fields.get('instanceDescription'): + if fields['instanceDescription'] != \ + currInstanceDescription: + setConfigParam(baseDir, + 'instanceDescription', + fields['instanceDescription']) + else: + if currInstanceDescription: + setConfigParam(baseDir, + 'instanceDescription', '') # change email address currentEmailAddress = getEmailAddress(actorJson) @@ -4536,62 +4624,6 @@ class PubServer(BaseHTTPRequestHandler): del actorJson['alsoKnownAs'] actorChanged = True - # change instance title - if fields.get('instanceTitle'): - currInstanceTitle = \ - getConfigParam(baseDir, 'instanceTitle') - if fields['instanceTitle'] != currInstanceTitle: - setConfigParam(baseDir, 'instanceTitle', - fields['instanceTitle']) - - # change YouTube alternate domain - if fields.get('ytdomain'): - currYTDomain = self.server.YTReplacementDomain - if fields['ytdomain'] != currYTDomain: - newYTDomain = fields['ytdomain'] - if '://' in newYTDomain: - newYTDomain = newYTDomain.split('://')[1] - if '/' in newYTDomain: - newYTDomain = newYTDomain.split('/')[0] - if '.' in newYTDomain: - setConfigParam(baseDir, - 'youtubedomain', - newYTDomain) - self.server.YTReplacementDomain = \ - newYTDomain - else: - setConfigParam(baseDir, - 'youtubedomain', '') - self.server.YTReplacementDomain = None - - # change instance description - currInstanceDescriptionShort = \ - getConfigParam(baseDir, - 'instanceDescriptionShort') - if fields.get('instanceDescriptionShort'): - if fields['instanceDescriptionShort'] != \ - currInstanceDescriptionShort: - iDesc = fields['instanceDescriptionShort'] - setConfigParam(baseDir, - 'instanceDescriptionShort', - iDesc) - else: - if currInstanceDescriptionShort: - setConfigParam(baseDir, - 'instanceDescriptionShort', '') - currInstanceDescription = \ - getConfigParam(baseDir, 'instanceDescription') - if fields.get('instanceDescription'): - if fields['instanceDescription'] != \ - currInstanceDescription: - setConfigParam(baseDir, - 'instanceDescription', - fields['instanceDescription']) - else: - if currInstanceDescription: - setConfigParam(baseDir, - 'instanceDescription', '') - # change user bio if fields.get('bio'): if fields['bio'] != actorJson['summary']: @@ -10293,6 +10325,11 @@ class PubServer(BaseHTTPRequestHandler): """ if '/users/' in path and path.endswith('/editprofile'): peertubeInstances = self.server.peertubeInstances + nickname = getNicknameFromActor(path) + if nickname: + city = self._getSpoofedCity(baseDir, nickname, domain) + else: + city = self.server.city msg = htmlEditProfile(self.server.cssCache, translate, baseDir, @@ -10302,7 +10339,8 @@ class PubServer(BaseHTTPRequestHandler): self.server.defaultTimeline, self.server.themeName, peertubeInstances, - self.server.textModeBanner).encode('utf-8') + self.server.textModeBanner, + city).encode('utf-8') if msg: msglen = len(msg) self._set_headers('text/html', msglen, @@ -13053,7 +13091,11 @@ class PubServer(BaseHTTPRequestHandler): filename.endswith('.gif'): postImageFilename = filename.replace('.temp', '') print('Removing metadata from ' + postImageFilename) - removeMetaData(filename, postImageFilename) + city = self._getSpoofedCity(self.server.baseDir, + nickname, self.server.domain) + processMetaData(self.server.baseDir, + nickname, self.server.domain, + filename, postImageFilename, city) if os.path.isfile(postImageFilename): print('POST media saved to ' + postImageFilename) else: @@ -13158,6 +13200,8 @@ class PubServer(BaseHTTPRequestHandler): nickname, self.server.domain) return 1 + city = self._getSpoofedCity(self.server.baseDir, + nickname, self.server.domain) messageJson = \ createPublicPost(self.server.baseDir, nickname, @@ -13168,6 +13212,7 @@ class PubServer(BaseHTTPRequestHandler): False, False, False, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + city, fields['replyTo'], fields['replyTo'], fields['subject'], fields['schedulePost'], fields['eventDate'], fields['eventTime'], @@ -13304,15 +13349,20 @@ class PubServer(BaseHTTPRequestHandler): imgDescription = fields['imageDescription'] if filename: + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) postJsonObject['object'] = \ attachMedia(self.server.baseDir, self.server.httpPrefix, + nickname, self.server.domain, self.server.port, postJsonObject['object'], filename, attachmentMediaType, - imgDescription) + imgDescription, + city) replaceYouTube(postJsonObject, self.server.YTReplacementDomain) @@ -13334,6 +13384,9 @@ class PubServer(BaseHTTPRequestHandler): str(fields['postUrl'])) return -1 elif postType == 'newunlisted': + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createUnlistedPost(self.server.baseDir, nickname, @@ -13343,6 +13396,7 @@ class PubServer(BaseHTTPRequestHandler): False, False, False, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + city, fields['replyTo'], fields['replyTo'], fields['subject'], @@ -13364,6 +13418,9 @@ class PubServer(BaseHTTPRequestHandler): else: return -1 elif postType == 'newfollowers': + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createFollowersOnlyPost(self.server.baseDir, nickname, @@ -13375,6 +13432,7 @@ class PubServer(BaseHTTPRequestHandler): commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + city, fields['replyTo'], fields['replyTo'], fields['subject'], @@ -13416,6 +13474,9 @@ class PubServer(BaseHTTPRequestHandler): maximumAttendeeCapacity = \ int(fields['maximumAttendeeCapacity']) + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createEventPost(self.server.baseDir, nickname, @@ -13427,6 +13488,7 @@ class PubServer(BaseHTTPRequestHandler): False, False, commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + city, fields['subject'], fields['schedulePost'], fields['eventDate'], @@ -13452,6 +13514,9 @@ class PubServer(BaseHTTPRequestHandler): messageJson = None print('A DM was posted') if '@' in mentionsStr: + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createDirectMessagePost(self.server.baseDir, nickname, @@ -13464,6 +13529,7 @@ class PubServer(BaseHTTPRequestHandler): commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + city, fields['replyTo'], fields['replyTo'], fields['subject'], @@ -13492,6 +13558,9 @@ class PubServer(BaseHTTPRequestHandler): print('A reminder was posted for ' + handle) if '@' + handle not in mentionsStr: mentionsStr = '@' + handle + ' ' + mentionsStr + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createDirectMessagePost(self.server.baseDir, nickname, @@ -13502,6 +13571,7 @@ class PubServer(BaseHTTPRequestHandler): True, False, False, False, filename, attachmentMediaType, fields['imageDescription'], + city, None, None, fields['subject'], True, fields['schedulePost'], @@ -13525,6 +13595,9 @@ class PubServer(BaseHTTPRequestHandler): # and not accounts being reported we disable any # included fediverse addresses by replacing '@' with '-at-' fields['message'] = fields['message'].replace('@', '-at-') + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createReportPost(self.server.baseDir, nickname, @@ -13534,6 +13607,7 @@ class PubServer(BaseHTTPRequestHandler): True, False, False, True, filename, attachmentMediaType, fields['imageDescription'], + city, self.server.debug, fields['subject']) if messageJson: if self._postToOutbox(messageJson, __version__, nickname): @@ -13553,6 +13627,9 @@ class PubServer(BaseHTTPRequestHandler): str(questionCtr)]) if not qOptions: return -1 + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) messageJson = \ createQuestionPost(self.server.baseDir, nickname, @@ -13564,6 +13641,7 @@ class PubServer(BaseHTTPRequestHandler): commentsEnabled, filename, attachmentMediaType, fields['imageDescription'], + city, fields['subject'], int(fields['duration'])) if messageJson: @@ -13588,6 +13666,9 @@ class PubServer(BaseHTTPRequestHandler): if durationStr: if ' ' not in durationStr: durationStr = durationStr + ' days' + city = self._getSpoofedCity(self.server.baseDir, + nickname, + self.server.domain) addShare(self.server.baseDir, self.server.httpPrefix, nickname, @@ -13599,7 +13680,8 @@ class PubServer(BaseHTTPRequestHandler): fields['category'], fields['location'], durationStr, - self.server.debug) + self.server.debug, + city) if filename: if os.path.isfile(filename): os.remove(filename) @@ -14661,7 +14743,8 @@ def loadTokens(baseDir: str, tokensDict: {}, tokensLookup: {}) -> None: break -def runDaemon(showNodeInfoAccounts: bool, +def runDaemon(city: str, + showNodeInfoAccounts: bool, showNodeInfoVersion: bool, brochMode: bool, verifyAllSignatures: bool, @@ -14819,6 +14902,9 @@ def runDaemon(showNodeInfoAccounts: bool, print('ERROR: no translations were loaded') sys.exit() + # spoofed city for gps location misdirection + httpd.city = city + # For moderated newswire feeds this is the amount of time allowed # for voting after the post arrives httpd.votingTimeMins = votingTimeMins diff --git a/desktop_client.py b/desktop_client.py index 6c19a422d..de1ad92b0 100644 --- a/desktop_client.py +++ b/desktop_client.py @@ -458,6 +458,7 @@ def _desktopReplyToPost(session, postId: str, isArticle = False subject = None commentsEnabled = True + city = 'London, England' sayStr = 'Sending reply' _sayCommand(sayStr, sayStr, screenreader, systemLanguage, espeak) if sendPostViaServer(__version__, @@ -466,7 +467,7 @@ def _desktopReplyToPost(session, postId: str, toNickname, toDomain, toPort, ccUrl, httpPrefix, replyMessage, followersOnly, commentsEnabled, attach, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, debug, postId, postId, subject) == 0: sayStr = 'Reply sent' @@ -514,6 +515,7 @@ def _desktopNewPost(session, attach = None mediaType = None attachedImageDescription = None + city = 'London, England' isArticle = False subject = None commentsEnabled = True @@ -526,7 +528,7 @@ def _desktopNewPost(session, None, '#Public', port, ccUrl, httpPrefix, newMessage, followersOnly, commentsEnabled, attach, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, debug, None, None, subject) == 0: sayStr = 'Post sent' @@ -1158,6 +1160,7 @@ def _desktopNewDMbase(session, toHandle: str, attach = None mediaType = None attachedImageDescription = None + city = 'London, England' isArticle = False subject = None commentsEnabled = True @@ -1206,7 +1209,7 @@ def _desktopNewDMbase(session, toHandle: str, toNickname, toDomain, toPort, ccUrl, httpPrefix, newMessage, followersOnly, commentsEnabled, attach, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, debug, None, None, subject) == 0: sayStr = 'Direct message sent' diff --git a/emoji/default_emoji.json b/emoji/default_emoji.json index d4818af2e..3f3052309 100644 --- a/emoji/default_emoji.json +++ b/emoji/default_emoji.json @@ -762,5 +762,6 @@ "talkingemote2": "talkingEmote2", "veryhappyemote": "veryHappyEmote", "worriedemote": "worriedEmote", - "tor": "tor" + "tor": "tor", + "pine64": "pine64" } diff --git a/emoji/pine64.png b/emoji/pine64.png new file mode 100644 index 000000000..2a5cc5a00 Binary files /dev/null and b/emoji/pine64.png differ diff --git a/epicyon.py b/epicyon.py index 2384a9421..c7c6a4438 100644 --- a/epicyon.py +++ b/epicyon.py @@ -464,6 +464,9 @@ parser.add_argument('--attach', dest='attach', type=str, default=None, help='File to attach to a post') parser.add_argument('--imagedescription', dest='imageDescription', type=str, default=None, help='Description of an attached image') +parser.add_argument('--city', dest='city', type=str, + default='London, England', + help='Spoofed city for image metadata misdirection') parser.add_argument('--warning', '--warn', '--cwsubject', '--subject', dest='subject', type=str, default=None, help='Subject of content warning') @@ -1110,6 +1113,7 @@ if args.message: followersOnly = args.followersonly clientToServer = args.client attachedImageDescription = args.imageDescription + city = 'London, England' sendThreads = [] postLog = [] personCache = {} @@ -1130,7 +1134,7 @@ if args.message: toNickname, toDomain, toPort, ccUrl, httpPrefix, sendMessage, followersOnly, args.commentsEnabled, attach, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, args.debug, replyTo, replyTo, subject) for i in range(10): @@ -1959,8 +1963,9 @@ if args.avatar: if not args.nickname: print('Specify a nickname with --nickname [name]') sys.exit() + city = 'London, England' if setProfileImage(baseDir, httpPrefix, args.nickname, domain, - port, args.avatar, 'avatar', '128x128'): + port, args.avatar, 'avatar', '128x128', city): print('Avatar added for ' + args.nickname) else: print('Avatar was not added for ' + args.nickname) @@ -1973,8 +1978,10 @@ if args.backgroundImage: if not args.nickname: print('Specify a nickname with --nickname [name]') sys.exit() + city = 'London, England' if setProfileImage(baseDir, httpPrefix, args.nickname, domain, - port, args.backgroundImage, 'background', '256x256'): + port, args.backgroundImage, 'background', + '256x256', city): print('Background image added for ' + args.nickname) else: print('Background image was not added for ' + args.nickname) @@ -2347,6 +2354,7 @@ if args.unfilterStr: sys.exit() if args.testdata: + city = 'London, England' nickname = 'testuser567' password = 'boringpassword' print('Generating some test data for user: ' + nickname) @@ -2394,7 +2402,7 @@ if args.testdata: "mechanical", "City", "2 months", - debug) + debug, city) addShare(baseDir, httpPrefix, nickname, domain, port, "witch hat", @@ -2404,7 +2412,7 @@ if args.testdata: "clothing", "City", "3 months", - debug) + debug, city) deleteAllPosts(baseDir, nickname, domain, 'inbox') deleteAllPosts(baseDir, nickname, domain, 'outbox') @@ -2416,6 +2424,7 @@ if args.testdata: testAttachImageFilename = None testMediaType = None testImageDescription = None + testCity = 'London, England' createPublicPost(baseDir, nickname, domain, port, httpPrefix, "like this is totally just a #test man", @@ -2424,7 +2433,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Zoiks!!!", testFollowersOnly, @@ -2432,7 +2441,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Hey scoob we need like a hundred more #milkshakes", testFollowersOnly, @@ -2440,7 +2449,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "Getting kinda spooky around here", testFollowersOnly, @@ -2448,7 +2457,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription, + testMediaType, testImageDescription, testCity, 'someone') createPublicPost(baseDir, nickname, domain, port, httpPrefix, "And they would have gotten away with it too" + @@ -2458,7 +2467,7 @@ if args.testdata: testC2S, testCommentsEnabled, 'img/logo.png', 'image/png', - 'Description of image') + 'Description of image', testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "man these centralized sites are like the worst!", testFollowersOnly, @@ -2466,7 +2475,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "another mystery solved #test", testFollowersOnly, @@ -2474,7 +2483,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) createPublicPost(baseDir, nickname, domain, port, httpPrefix, "let's go bowling", testFollowersOnly, @@ -2482,7 +2491,7 @@ if args.testdata: testC2S, testCommentsEnabled, testAttachImageFilename, - testMediaType, testImageDescription) + testMediaType, testImageDescription, testCity) domainFull = domain + ':' + str(port) clearFollows(baseDir, nickname, domain) @@ -2620,6 +2629,11 @@ showNodeInfoVersion = \ if showNodeInfoVersion is not None: args.showNodeInfoVersion = bool(showNodeInfoVersion) +city = \ + getConfigParam(baseDir, 'city') +if city is not None: + args.city = city + YTDomain = getConfigParam(baseDir, 'youtubedomain') if YTDomain: if '://' in YTDomain: @@ -2634,7 +2648,8 @@ if setTheme(baseDir, themeName, domain, print('Theme set to ' + themeName) if __name__ == "__main__": - runDaemon(args.showNodeInfoAccounts, + runDaemon(args.city, + args.showNodeInfoAccounts, args.showNodeInfoVersion, args.brochMode, args.verifyAllSignatures, diff --git a/inbox.py b/inbox.py index b35498529..825e06df3 100644 --- a/inbox.py +++ b/inbox.py @@ -2183,6 +2183,7 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, attachImageFilename = None mediaType = None imageDescription = '' + city = 'London, England' inReplyTo = removeIdEnding(senderPostId) inReplyToAtomUri = None schedulePost = False @@ -2195,7 +2196,7 @@ def _bounceDM(senderPostId: str, session, httpPrefix: str, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, inReplyTo, inReplyToAtomUri, subject, debug, schedulePost, eventDate, eventTime, location) diff --git a/locations.txt b/locations.txt new file mode 100644 index 000000000..289a89078 --- /dev/null +++ b/locations.txt @@ -0,0 +1,4158 @@ +GOROKA, PAPUA NEW GUINEA:-6.08167:145.392 +MADANG, PAPUA NEW GUINEA:-5.20694:145.789 +MOUNT HAGEN, PAPUA NEW GUINEA:-5.82611:144.296 +NADZAB, PAPUA NEW GUINEA:-6.56972:146.726 +PORT MORESBY, PAPUA NEW GUINEA:-9.44333:147.22 +WEWAK, PAPUA NEW GUINEA:-3.58361:143.669 +NARSSARSSUAQ, GREENLAND:61.1611:W45.4275 +NERLERIT INAAT, GREENLAND:70.7394:W22.6458 +GODTHAAB, GREENLAND:64.1908:W51.6781 +JAKOBSHAVN, GREENLAND:69.2333:W51.0667 +KULUSUK, GREENLAND:65.5833:W37.15 +SONDRESTROM, GREENLAND:67.0169:W50.6892 +THULE, GREENLAND:76.5311:W68.7031 +AKUREYRI, ICELAND:65.6597:W18.0725 +EGILSSTADIR, ICELAND:65.2833:W14.4014 +HOFN, ICELAND:64.2956:W15.2272 +HUSAVIK, ICELAND:65.9522:W17.4258 +ISAFJORDUR, ICELAND:66.0581:W23.1353 +KEFLAVIK, ICELAND:63.985:W22.6056 +KOPASKER, ICELAND:66.3136:W16.4611 +PATREKSFJORDUR, ICELAND:65.5558:W23.965 +REYKJAVIK, ICELAND:64.13:W21.9406 +SIGLUFJORDUR, ICELAND:66.1333:W18.9167 +VESTMANNAEYJAR, ICELAND:63.4242:W20.2786 +SAULT SAINTE MARIE, CANADA:46.485:W84.5094 +WINNIPEG, CANADA:50.0564:W97.0325 +HALIFAX, CANADA:44.6397:W63.4994 +ST. ANTHONY, CANADA:51.3917:W56.0844 +TOFINO, CANADA:49.0822:W125.772 +PELLY BAY, CANADA:68.5344:W89.8081 +BAIE COMEAU, CANADA:49.1322:W68.2072 +BAGOTVILLE, CANADA:48.3306:W70.9964 +BAKER LAKE, CANADA:64.2989:W96.0778 +CAMPBELL RIVER, CANADA:49.9508:W125.271 +BRANDON, CANADA:49.91:W99.9519 +CAMBRIDGE BAY, CANADA:69.1081:W105.138 +NANAIMO, CANADA:49.0522:W123.87 +CASTLEGAR, CANADA:49.2964:W117.632 +CHATHAM, CANADA:47.0078:W65.4492 +CHARLO, CANADA:47.9906:W66.3314 +COPPERMINE, CANADA:67.8167:W115.144 +CORONATION, CANADA:52.075:W111.445 +CHILLIWACK, CANADA:49.1528:W121.939 +CLYDE RIVER, CANADA:70.4861:W68.5167 +CORAL HARBOUR, CANADA:50.3319:W115.874 +DAWSON, CANADA:64.0431:W139.128 +BURWASH, CANADA:61.3711:W139.041 +PRINCETON, CANADA:49.4675:W120.512 +DEER LAKE, CANADA:49.2108:W57.3914 +DEASE LAKE, CANADA:58.4222:W130.032 +DAUPHIN, CANADA:51.1008:W100.052 +DAWSON CREEK, CANADA:55.7417:W120.182 +EDMONTON, CANADA:53.6667:W113.467 +EDMONTON, CANADA:53.3097:W113.58 +ESKIMO POINT, CANADA:61.0942:W94.0708 +ESTEVAN, CANADA:49.2103:W102.966 +EDSON, CANADA:53.5789:W116.465 +EUREKA, CANADA:79.9947:W85.8133 +INUVIK, CANADA:68.3042:W133.483 +IQALUIT, CANADA:63.7564:W68.5558 +FREDERICTON, CANADA:45.8694:W66.5317 +FORESTVILLE, CANADA:48.7461:W69.0972 +FLIN FLON, CANADA:54.6781:W101.682 +FORT RESOLUTION, CANADA:61.1808:W113.69 +FORT SIMPSON, CANADA:61.7603:W121.237 +KINGSTON, CANADA:44.2253:W76.5969 +LA GRANDE RIVIERE, CANADA:53.6253:W77.7042 +GASPE, CANADA:48.7753:W64.4786 +GERALDTON, CANADA:49.7783:W86.9394 +ILES DE LA MADELEINE, CANADA:47.4247:W61.7781 +KUUJJUARARAPIK, CANADA:55.2833:W77.7667 +GILLAM, CANADA:56.35:W94.7 +HUDSON BAY, CANADA:52.8167:W102.311 +DRYDEN, CANADA:49.8317:W92.7442 +HOLMAN ISLAND, CANADA:70.7631:W117.806 +GJOA HAVEN, CANADA:68.6356:W95.8497 +HAMILTON, CANADA:43.1731:W79.935 +MONTREAL, CANADA:45.5175:W73.4169 +HAY RIVER, CANADA:60.8397:W115.783 +HALIFAX, CANADA:44.8808:W63.5086 +ATIKOKAN, CANADA:48.7739:W91.6386 +POND INLET, CANADA:72.6833:W77.9667 +ST. JEAN, CANADA:45.2944:W73.2811 +STEPHENVILLE, CANADA:48.5442:W58.55 +KAMLOOPS, CANADA:50.7022:W120.442 +WATERLOO, CANADA:43.4589:W80.3844 +SCHEFFERVILLE, CANADA:54.805:W66.8053 +KINDERSLEY, CANADA:51.5175:W109.181 +TORONTO, CANADA:43.8622:W79.37 +CHAPLEAU, CANADA:47.82:W83.3464 +MEADOW LAKE, CANADA:54.1253:W108.523 +LLOYDMINSTER, CANADA:53.3092:W110.072 +ALERT, CANADA:82.5178:W62.2806 +KELOWNA, CANADA:49.9561:W119.378 +MAYO, CANADA:63.6167:W135.867 +MOOSE JAW, CANADA:50.3303:W105.559 +FORT MCMURRAY, CANADA:56.6533:W111.222 +MOOSONEE, CANADA:51.2911:W80.6078 +MANIWAKI, CANADA:46.2744:W75.99 +MONTREAL, CANADA:45.6797:W74.0386 +NATASHQUAN, CANADA:50.1897:W61.7892 +GATINEAU, CANADA:45.5214:W75.5642 +MATAGAMI, CANADA:49.7617:W77.8028 +OLD CROW, CANADA:67.5706:W139.839 +COLD LAKE, CANADA:54.405:W110.279 +HIGH LEVEL, CANADA:58.6214:W117.165 +OTTAWA, CANADA:45.3225:W75.6692 +PRINCE ALBERT, CANADA:53.2142:W105.673 +PEACE RIVER, CANADA:56.2269:W117.447 +PORTAGE-LA-PRAIRIE, CANADA:49.9028:W98.2747 +PITT MEADOWS, CANADA:49.2161:W122.71 +PICKLE LAKE, CANADA:51.4464:W90.2142 +PORT MENIER, CANADA:49.8364:W64.2886 +PETERBOROUGH, CANADA:44.23:W78.3633 +PRINCE PUPERT, CANADA:54.2861:W130.445 +FORT CHIPEWYAN, CANADA:58.7672:W111.117 +MUSKOKA, CANADA:44.9747:W79.3033 +QUEBEC, CANADA:46.7883:W71.3975 +RED DEER INDUSTRIAL, CANADA:52.1786:W113.893 +WINDSOR, CANADA:42.2756:W82.9556 +WATSON LAKE, CANADA:60.1178:W128.822 +KENORA, CANADA:49.7883:W94.3631 +LETHBRIDGE, CANADA:49.6303:W112.8 +MONCTON, CANADA:46.1122:W64.6786 +NAKINA, CANADA:50.1828:W86.6964 +COMOX, CANADA:49.7108:W124.887 +REGINA, CANADA:50.4319:W104.666 +THUNDER BAY, CANADA:48.3719:W89.3239 +GRANDE PRAIRIE, CANADA:55.1797:W118.885 +YORKTON, CANADA:51.2647:W102.462 +NORTH BATTLEFORD, CANADA:52.7692:W108.244 +GANDER, CANADA:48.9369:W54.5681 +SYDNEY, CANADA:46.1614:W60.0478 +QUESNEL, CANADA:53.0261:W122.51 +RESOLUTE, CANADA:74.7169:W94.9694 +RIVIERE DU LOUP, CANADA:47.7644:W69.5847 +ROBERVAL, CANADA:48.52:W72.2656 +ROCKY MOUNTAIN HOUSE, CANADA:52.4297:W114.904 +RANKIN INLET, CANADA:62.8114:W92.1158 +SUDBURY, CANADA:46.625:W80.7989 +SHERBROOKE, CANADA:45.4381:W71.6906 +ST. JOHN, CANADA:45.3161:W65.8903 +FORT SMITH, CANADA:60.0222:W111.96 +NANISIVIK, CANADA:72.9822:W84.6136 +SUMMERSIDE, CANADA:46.4428:W63.8311 +SACHS HARBOUR, CANADA:71.9939:W125.243 +CAPE DORSET, CANADA:64.23:W76.5267 +THOMPSON, CANADA:55.8011:W97.8642 +TRENTON, CANADA:44.1189:W77.5281 +TIMMINS, CANADA:48.5697:W81.3767 +TORONTO, CANADA:43.6275:W79.3961 +TUKTOYAKTUK, CANADA:69.4333:W133.026 +MONTREAL, CANADA:45.4681:W73.7414 +REPULSE BAY, CANADA:66.5214:W86.2247 +HALL BEACH, CANADA:68.7761:W81.2436 +ROUYN, CANADA:48.2061:W78.8356 +LA RONGE, CANADA:55.1514:W105.262 +VERMILLION, CANADA:53.3558:W110.824 +BROUGHTON ISLAND, CANADA:67.5458:W64.0314 +VAL D'OR, CANADA:48.0533:W77.7828 +QUUJJUAQ, CANADA:58.0961:W68.4269 +NORMAN WELLS, CANADA:65.2825:W126.8 +VANCOUVER, CANADA:49.195:W123.182 +BUFFALO NARROWS, CANADA:55.8419:W108.418 +WIARTON, CANADA:44.7458:W81.1072 +PETAWAWA, CANADA:45.9522:W77.3192 +WINNIPEG, CANADA:49.91:W97.2344 +WABUSH, CANADA:52.9219:W66.8644 +WILLIAMS LAKE, CANADA:52.1831:W122.054 +WRIGLEY, CANADA:63.2094:W123.437 +CRANBROOK, CANADA:49.6103:W115.782 +EDMONTON, CANADA:53.5725:W113.521 +SASKATOON, CANADA:52.1708:W106.7 +MEDICINE HAT, CANADA:50.0189:W110.721 +FORT SAINT JOHN, CANADA:56.2381:W120.74 +SIOUX LOOKOUT, CANADA:50.1144:W91.9042 +PANGNIRTUNG, CANADA:66.145:W65.7136 +EARLTON, CANADA:47.695:W79.8489 +PRINCE GEORGE, CANADA:53.8894:W122.679 +TERRACE, CANADA:54.4664:W128.577 +LONDON, CANADA:43.0356:W81.1539 +ABBOTSFORD, CANADA:49.0253:W122.363 +WHITEHORSE, CANADA:60.7094:W135.068 +NORTH BAY, CANADA:46.3636:W79.4228 +CALGARY, CANADA:51.1139:W114.02 +SMITHERS, CANADA:54.8247:W127.183 +FORT NELSON, CANADA:58.8364:W122.597 +PENTICTON, CANADA:49.4628:W119.602 +CHARLOTTETOWN, CANADA:46.29:W63.1211 +SPENCE BAY, CANADA:69.5467:W93.5767 +VICTORIA, CANADA:48.6469:W123.426 +LYNN LAKE, CANADA:56.8639:W101.076 +SWIFT CURRENT, CANADA:50.2919:W107.691 +CHURCHILL, CANADA:58.7392:W94.065 +GOOSE BAY, CANADA:53.3192:W60.4258 +ST. JOHN'S, CANADA:47.6186:W52.7519 +KAPUSKASING, CANADA:49.4139:W82.4675 +ARMSTRONG, CANADA:50.2903:W88.9097 +MONT JOLI, CANADA:48.6086:W68.2081 +TORONTO, CANADA:43.6772:W79.6306 +TORONTO, CANADA:43.7425:W79.4656 +GORE BAY, CANADA:45.8853:W82.5678 +YELLOWKNIFE, CANADA:62.4628:W114.44 +SLAVE LAKE, CANADA:55.2933:W114.778 +SANDSPIT, CANADA:53.2542:W131.814 +SARNIA, CANADA:42.9994:W82.3089 +PORT HARDY, CANADA:50.6806:W127.367 +WHITECOURT, CANADA:54.1439:W115.787 +SEPT-ILES, CANADA:50.2233:W66.2656 +TESLIN, CANADA:60.1728:W132.743 +GREENWOOD, CANADA:44.9844:W64.9169 +FARO, CANADA:62.2075:W133.376 +FORT MCPHERSON, CANADA:67.4078:W134.86 +BLIDA, ALGERIA:36.5036:2.81417 +BOU SAADA, ALGERIA:35.3325:4.20639 +BEJAJA, ALGERIA:36.7119:5.06972 +ALGIER, ALGERIA:36.6908:3.21528 +DJANET, ALGERIA:24.2925:9.45222 +BOUFARIK, ALGERIA:36.5458:2.87611 +TELERGMA, ALGERIA:36.1086:6.36444 +REGGAN, ALGERIA:26.71:0.285556 +ILLIZI, ALGERIA:26.5733:8.48361 +AIN OUSSERA, ALGERIA:35.5253:2.87861 +SETIF, ALGERIA:36.1781:5.32444 +TAMANRASSET, ALGERIA:22.8108:5.45083 +JIJEL, ALGERIA:36.795:5.87333 +MECHERIA, ALGERIA:33.5358:W0.242222 +RELIZANE, ALGERIA:35.7522:0.626111 +ANNABA, ALGERIA:36.8222:7.80917 +CONSTANTINE, ALGERIA:36.2767:6.62389 +TEBESSA, ALGERIA:35.4314:8.12056 +TILREMPT, ALGERIA:32.9297:3.31222 +TIARET, ALGERIA:35.3411:1.46306 +BOU SFER, ALGERIA:35.7353:W0.805278 +TINDOUF, ALGERIA:27.7003:W8.16694 +ECH-CHELIFF, ALGERIA:36.2125:1.33167 +ORAN, ALGERIA:35.5422:W0.532222 +TLEMCEN, ALGERIA:35.0167:W1.45 +ORAN, ALGERIA:35.6236:W0.621111 +SIDI BEL ABBES, ALGERIA:35.1717:W0.593056 +GHRISS, ALGERIA:35.2075:0.146944 +ADRAR, ALGERIA:27.8375:W0.186389 +BISKRA, ALGERIA:34.7931:5.73806 +EL GOLEA, ALGERIA:30.5711:2.85944 +GHARDAIA, ALGERIA:32.3839:3.79389 +HASSI-MESSAOUD, ALGERIA:31.6728:6.14028 +IN SALAH, ALGERIA:27.2508:2.51194 +TOUGGOURT, ALGERIA:33.0678:6.08861 +LAGHOUAT, ALGERIA:33.7639:2.92722 +TIMIMOUN, ALGERIA:29.2369:0.275833 +OUARGLA, ALGERIA:31.9172:5.41278 +ZARZAITINE, ALGERIA:28.0514:9.64278 +COTONOU, BENIN:6.35722:2.38417 +PARAKOU, BENIN:9.35694:2.60889 +OUAGADOUGOU, BURKINA FASO:12.3531:W1.51222 +BOBO-DIOULASSO, BURKINA FASO:11.16:W4.33083 +ACCRA, GHANA:5.60278:W0.168056 +TAMALE, GHANA:9.56333:W0.863333 +WA, GHANA:10.0825:W2.5075 +SUNYANI, GHANA:7.36167:W2.32861 +TAKORADI, GHANA:4.89333:W1.775 +ABIDJAN, IVORY COAST:5.25972:W3.92639 +BOUAKE, IVORY COAST:7.73861:W5.07361 +DALOA, IVORY COAST:6.7925:W6.47306 +KORHOGO, IVORY COAST:9.38694:W5.55639 +MAN, IVORY COAST:7.27194:W7.58694 +SAN PEDRO, IVORY COAST:4.74667:W6.66056 +YAMOUSSOUKRO, IVORY COAST:6.90306:W5.36583 +ABUJA, NIGERIA:9.00667:7.26306 +AKURE, NIGERIA:7.24667:5.30083 +BENIN, NIGERIA:6.31722:5.59944 +CALABAR, NIGERIA:4.97583:8.34694 +ENUGU, NIGERIA:6.47417:7.56194 +GUSAU, NIGERIA:12.1717:6.69611 +IBADAN, NIGERIA:7.36222:3.97833 +ILORIN, NIGERIA:8.44:4.49389 +JOS, NIGERIA:9.63972:8.86889 +KADUNA, NIGERIA:10.6958:7.32 +KANO, NIGERIA:12.0475:8.52444 +MAIDUGURI, NIGERIA:11.8553:13.0808 +MAKURDI, NIGERIA:7.70361:8.61389 +LAGOS, NIGERIA:6.57722:3.32111 +MINNA, NIGERIA:9.65194:6.46222 +PORT HARTCOURT, NIGERIA:5.01528:6.94944 +SOKOTO, NIGERIA:12.9161:5.20694 +YOLA, NIGERIA:9.26028:12.4297 +ZARIA, NIGERIA:11.13:7.68556 +MARADI, NIGER:13.5025:7.12667 +NIAMEY, NIGER:13.4814:2.18361 +TAHOUA, NIGER:14.8756:5.26528 +AGADEZ, NIGER:16.9647:7.99694 +DIRKOU, NIGER:18.9686:12.8686 +DIFFA, NIGER:13.3728:12.6267 +ZINDER, NIGER:13.7789:8.98361 +TANOUT, NIGER:14.9994:8.76694 +MONASTIR, TUNISIA:35.7581:10.7547 +TUNIS, TUNISIA:36.8508:10.2269 +BIZERTE, TUNISIA:37.2453:9.79139 +REMADA, TUNISIA:32.3061:10.3819 +GAFSA, TUNISIA:34.4219:8.8225 +GABES, TUNISIA:33.8767:10.1033 +BORDJ EL AMRI, TUNISIA:36.7211:9.94306 +DJERBA, TUNISIA:33.875:10.7753 +EL BORMA, TUNISIA:31.7042:9.25444 +SFAX, TUNISIA:34.7178:10.6908 +TOZEUR, TUNISIA:33.9397:8.11056 +NIATOUGOU, TOGO:9.76722:1.09111 +LOME, TOGO:6.16556:1.25389 +ANTWERP, BELGIUM:51.19:4.46278 +BEAUVECHAIN, BELGIUM:50.7586:4.76833 +KLEINE BROGEL, BELGIUM:51.1678:5.47083 +BRUSSELS, BELGIUM:50.9022:4.49861 +BRASSCHAAT, BELGIUM:51.3333:4.5 +BERTRIX, BELGIUM:49.8872:5.22861 +CHARLEROI, BELGIUM:50.4592:4.45361 +CHIEVRES, BELGIUM:50.5758:3.83083 +KOKSIJDE, BELGIUM:51.09:2.65278 +FLORENNES, BELGIUM:50.2436:4.64861 +KORTRIJK-VEVELGEM, BELGIUM:50.8178:3.20833 +LIEGE, BELGIUM:50.6372:5.44306 +OSTEND, BELGIUM:51.1989:2.86222 +ZUTENDAAL, BELGIUM:50.9483:5.59167 +SINT-TRUIDEN, BELGIUM:50.7883:5.19278 +URSEL, BELGIUM:51.1439:3.47417 +WEELDE, BELGIUM:51.395:4.96056 +ZOERSEL, BELGIUM:51.2656:4.75472 +BAUTZEN, GERMANY:51.1933:14.5197 +ALTENBURG, GERMANY:50.9817:12.5061 +DESSAU, GERMANY:51.8319:12.1858 +EISENHUETTENSTADT, GERMANY:52.1972:14.5856 +HERINGSDORF, GERMANY:53.8786:14.1522 +SUHL, GERMANY:51.3081:13.5547 +MUEHLHAUSEN, GERMANY:51.3628:11.9408 +HALLE, GERMANY:51.5519:12.0525 +RIESA, GERMANY:51.2944:13.3589 +RECHLIN-LAERZ, GERMANY:53.3064:12.7531 +STRAUSBERG, GERMANY:52.5797:13.9156 +SCHOENHAGEN, GERMANY:52.2033:13.1586 +COCHSTEDT, GERMANY:51.8558:11.4181 +GOTHA OST, GERMANY:35.4606:W77.9647 +BARTH, GERMANY:54.3381:12.71 +JENA, GERMANY:50.9172:11.7136 +KYRITZ, GERMANY:52.9186:12.4253 +MAGDEBURG, GERMANY:52.0736:11.6264 +NEUBRANDENBURG, GERMANY:51.3281:12.6567 +ROTHENBURG/OL, GERMANY:51.3644:14.9519 +ANKLAM, GERMANY:53.8325:13.6689 +COTTBUS, GERMANY:51.8894:14.5317 +KOETHEN, GERMANY:51.7211:11.9617 +KAMENZ, GERMANY:51.2961:14.1289 +BERLIN, GERMANY:52.5170365:13.3888599 +DRESDEN, GERMANY:51.0493286:13.7381437 +ERFURT, GERMANY:50.98:10.9581 +FRANKFURT, GERMANY:50.1106444:8.6820917 +MUENSTER/OSNABRUECK, GERMANY:52.1344:7.68472 +HAMBURG, GERMANY:53.550341:10.000654 +COLOGNE, GERMANY:50.8658:7.1425 +DUESSELDORF, GERMANY:51.2894:6.76667 +MUNICH, GERMANY:48.1371079:11.5753822 +NUERNBERG, GERMANY:49.453872:11.077298 +LEIPZIG, GERMANY:51.3406321:12.3747329 +SAARBRUECKEN, GERMANY:49.2144:7.10944 +STUTTGART, GERMANY:48.7784485:9.1800132 +HANNOVER, GERMANY:52.3744779:9.7385532 +BREMEN, GERMANY:53.0758196:8.8071646 +EGELSBACH, GERMANY:49.9608:8.64361 +HAHN, GERMANY:49.9497:7.26389 +MANNHEIM, GERMANY:49.4725:8.51361 +ALLENDORF, GERMANY:51.0353:8.67889 +WORMS, GERMANY:49.6064:8.36833 +MAINZ, GERMANY:49.9689:8.1475 +EISENACH, GERMANY:50.9928:10.4725 +SIEGERLAND, GERMANY:50.7075:8.08194 +KIEL, GERMANY:54.3794:10.145 +LUEBECK, GERMANY:53.8053:10.7192 +AACHEN, GERMANY:50.8228:6.18722 +DAHLEMER BINZ, GERMANY:50.4058:6.52806 +MEINERZHAGEN, GERMANY:51.0994:7.60194 +ARNSBERG, GERMANY:51.4833:7.89917 +KAMP, GERMANY:51.5303:6.53694 +ESSEN, GERMANY:51.4582235:7.0158171 +MOENCHENGLADBACH, GERMANY:51.2303:6.50444 +PADERBORN, GERMANY:51.6142:8.61611 +STADTLOHN, GERMANY:51.9958:6.84028 +DORTMUND, GERMANY:51.5142273:7.4652789 +AUGSBURG, GERMANY:48.425:10.9317 +BIBERACH, GERMANY:48.1108:9.76278 +EGGENFELDEN, GERMANY:48.3961:12.7236 +OBERPFAFFENHOFEN, GERMANY:48.0814:11.2833 +STRAUBING, GERMANY:48.9008:12.5181 +VILSHOFEN, GERMANY:48.6364:13.1953 +LEUTKIRCH, GERMANY:47.8589:10.0144 +FRIEDRICHSHAFEN, GERMANY:47.6711:9.51139 +PARCHIM, GERMANY:53.4269:11.7833 +STENDAL, GERMANY:52.6289:11.8197 +AALEN-HEIDENHEIM, GERMANY:48.7778:10.2644 +COBURG, GERMANY:50.2625:10.9958 +BAYREUTH, GERMANY:49.9842:11.6383 +BURG FEUERSTEIN, GERMANY:49.7942:11.1322 +HOF, GERMANY:50.2886:11.8547 +ROSENTHAL, GERMANY:49.8628:11.7878 +HASSFURT, GERMANY:50.0178:10.5294 +KOBLENZ, GERMANY:50.3247:7.53083 +TRIER, GERMANY:49.8633:6.78889 +SPEYER, GERMANY:49.3025:8.45111 +ZWEIBRUECKEN, GERMANY:49.2094:7.40056 +BADEN-BADEN, GERMANY:48.7911:8.18694 +DONAUESCHINGEN, GERMANY:47.9731:8.52222 +FREIBURG, GERMANY:48.0203:7.83361 +KARLSRUHE, GERMANY:48.9822:8.33333 +MENGEN, GERMANY:48.0536:9.37278 +SCHWAEBISCH HALL, GERMANY:49.1181:9.77722 +SOEST, GERMANY:51.6075:13.7378 +BRAUNSCHWEIG, GERMANY:52.3192:10.5561 +KASSEL, GERMANY:51.4083:9.3775 +HILDESHEIM, GERMANY:52.1775:9.94556 +BREMERHAVEN, GERMANY:53.5033:8.57333 +LEMWERDER, GERMANY:53.1431:8.62333 +EMDEN, GERMANY:53.3911:7.22722 +LEER, GERMANY:53.2719:7.44278 +WILHELMSHAVEN, GERMANY:53.5047:8.05333 +BORKUM, GERMANY:53.5953:6.70917 +NORDERNEY, GERMANY:53.7067:7.23 +FLENSBURG, GERMANY:54.7717:9.37806 +RENDSBURG, GERMANY:54.2208:9.60056 +WESTERLAND, GERMANY:54.9131:8.34028 +ARMARI AIR FORCE BASE, ESTONIA:59.2594:24.2044 +KARDLA, ESTONIA:58.9906:22.8306 +KURESSAARE, ESTONIA:58.2297:22.5094 +PARNU, ESTONIA:58.4189:24.4728 +TALLINN-ULEMISTE INTERNATIONAL, ESTONIA:59.4131:24.8328 +TARTU-ULENURME, ESTONIA:58.3072:26.6903 +ENONTEKIO, FINLAND:68.3625:23.4242 +EURA, FINLAND:61.1161:22.2014 +HALLI, FINLAND:61.8558:24.7864 +HELSINKI, FINLAND:60.23542123800722:24.927984421582043 +HAMEENKYRO, FINLAND:61.6894:23.0736 +HANKO, FINLAND:59.8486:23.0833 +HYVINKAA, FINLAND:60.6544:24.8811 +KIKALA, FINLAND:60.4625:23.6525 +IMMOLA, FINLAND:61.2492:28.9036 +KITEE, FINLAND:62.1661:30.0736 +IVALO, FINLAND:68.6072:27.4053 +JOENSUU, FINLAND:62.6589:29.6244 +JYVASKYLA, FINLAND:62.3994:25.6781 +KAUHAVA, FINLAND:63.1269:23.0514 +KEMI, FINLAND:65.7817:24.5989 +KAJAANI, FINLAND:64.2853:27.6922 +KAUHAJOKI, FINLAND:62.4625:22.3931 +KRUUNUPYY, FINLAND:63.7211:23.1431 +KEMIJARVI, FINLAND:66.7128:27.1567 +KUUSAMO, FINLAND:65.9875:29.2392 +KITTILA, FINLAND:67.7008:24.8467 +KUOPIO, FINLAND:63.0069:27.7975 +VESIVEHMAA, FINLAND:61.1439:25.6933 +LAPPEENRANTA, FINLAND:61.0444:28.1442 +MARIEHAMN, FINLAND:60.1219:19.8981 +MENKIJARVI, FINLAND:62.9467:23.5189 +MIKKELI, FINLAND:61.6864:27.2017 +NUMMELA, FINLAND:60.3339:24.2964 +OULU, FINLAND:64.93:25.3544 +PIIKAJARVI, FINLAND:61.2456:22.1933 +PORI, FINLAND:61.4617:21.7997 +PUDASJARVI, FINLAND:65.4022:26.9469 +PYHASALMI, FINLAND:63.7317:25.9261 +PATTIJOKI, FINLAND:64.6881:24.6958 +RANTASALMI, FINLAND:62.0653:28.3564 +ROVANIEMI, FINLAND:66.5647:25.8303 +RAYSKALA, FINLAND:60.7447:24.1078 +SAVONLINNA, FINLAND:61.9431:28.945 +SELANPAA, FINLAND:61.0622:26.7986 +SODANKYLA, FINLAND:67.395:26.6189 +TAMPERE, FINLAND:61.4139:23.6042 +TEISKO, FINLAND:61.7733:24.0269 +TURKU, FINLAND:60.5139:22.2628 +UTTI, FINLAND:60.8964:26.9383 +VAASA, FINLAND:63.0511:21.7614 +VARKAUS, FINLAND:62.1711:27.8686 +YLIVIESKA-RAUDASKYLA, FINLAND:64.0603:24.7158 +BELFAST, NORTH IRELAND:54.6575:W6.21583 +ENNISKILLEN, ENGLAND:54.3989:W7.65167 +LONDONDERRY, NORTH IRELAND:54.9978678:W7.3213056 +BIRMINGHAM, ENGLAND:52.4796992:W1.9026911 +COVENTRY, ENGLAND:52.4081812:W1.510477 +LEICESTER, ENGLAND:52.6361398:W1.1330789 +GOLOUCHESTERSHIRE, ENGLAND:51.8942:W2.16722 +NOTTINGHAM, ENGLAND:52.9534193:W1.1496461 +HALFPENNY GREEN, ENGLAND:52.5175:W2.25972 +PAILTON, UK:51.6681:W2.05694 +TURWESTON, UK:52.0408:W1.09556 +MANCHESTER, ENGLAND:53.4794892:W2.2451148 +WOODFORT, ENGLAND:53.3381:W2.14889 +SANDTOFT, UK:53.5597:W0.858333 +CHIVENOR, ENGLAND:51.0869:W4.15028 +NEWQUAI, ENGLAND:50.4406:W4.99528 +LYNEHAM, UK:51.505:W1.99333 +BOSCOMBE DOWN, ENGLAND:51.1519:W1.74722 +CULDROSE, ENGLAND:50.0858:W5.25556 +ST. ATHAN, UK:51.4047:W3.43556 +YEOVILTON, UK:51.0092:W2.63861 +HAVERFORDWEST, ENGLAND:51.8331:W4.96111 +CARDIFF, WALES:51.4816546:W3.1791934 +SWANSEA, ENGLAND:51.623192463569175:W3.9580269270752 +BRISTOL, ENGLAND:51.4538022:W2.5972985 +LIVERPOOL, ENGLAND:53.407154:W2.991665 +LONDON, ENGLAND:51.5073219:W0.1276474 +PLYMOUTH, ENGLAND:50.38433871605018:W4.142479969311532 +BOURNEMOUTH, ENGLAND:50.7423141383493:W1.8999454858886722 +SOUTHAMPTON, ENGLAND:50.92571412096368:W1.4174069260253863 +LASHAM, ENGLAND:51.185:W1.03222 +GUERNSEY, GUERNSEY ISLD.:49.4347:W2.60194 +JERSEY, ENGLAND:51.7682578:W0.293425 +FARNBOROUGH, ENGLAND:51.2758:W0.776111 +CHALSGROVE, ENGLAND:51.6761:W1.08083 +BLACKBUSHE, ENGLAND:51.3239:W0.8475 +SOUTHEND, ENGLAND:51.5714:0.695556 +LYDD, UK:50.9561:0.939167 +MANSTON, ENGLAND:51.3422:1.34611 +BROUGH, ENGLAND:53.7194:W0.566111 +CARLISLE, ENGLAND:54.9375:W2.80917 +BLACKPOOL, ENGLAND:53.7717:W3.02861 +HUMBERSIDE, ENGLAND:53.5744:W0.350833 +BARROW ISLAND, ENGLAND:54.1297:W3.25611 +LEEDS, ENGLAND:53.7974185:W1.5437941 +WARTON, UK:53.745:W2.88306 +HAWARDEN, ENGLAND:53.1781:W2.97778 +ISLE OF MAN, ENGLAND:54.0833:W4.62389 +NEWCASTLE, ENGLAND:54.9738474:W1.6131572 +MIDDLESBROUGH, ENGLAND:54.5760419:W1.2344047 +LLANBEDR, ENGLAND:52.8117:W4.12333 +TERNHILL, UK:52.8711:W2.53333 +MONA, UK:53.2583:W4.37333 +SHAWBURY, UK:52.7981:W2.66778 +VALLEY, UK:53.2481:W4.53528 +WOODVALE, UK:53.5814:W3.05528 +WEST FREUGH, UK:54.8511:W4.94778 +KIRKWALL, SCOTLAND:58.9581:W2.905 +SUMBURGH, UK:59.8789:W1.29556 +WICK, UK:58.4586:W3.09278 +ABERDEEN, UK:57.145278438534575:W2.1125505583496174 +INVERNESS, UK:57.4790124:W4.225739 +GLASGOW, UK:55.8609825:W4.2488787 +EDINBURGH, UK:55.945672242712185:W3.1995328895019592 +ISLAY, UK:55.6819:W6.25667 +PRESTWICK, UK:55.5078:W4.58667 +BENBECULA, UK:57.4811:W7.36278 +SCATSTA, UK:60.4322:W1.29806 +DUNDEE, UK:56.47786741082439:W2.9823779577636778 +STORNOWAY, UK:58.2141245782211:W6.379953784594727 +TIREE, UK:56.4992:W6.86917 +LEUCHARS, UK:56.3728:W2.86833 +LOSSIEMOUTH, UK:57.705:W3.33917 +BRACKNELL, ENGLAND:51.3833:W0.783333 +CAMBRIDGE, ENGLAND:52.205:0.175 +PETERBOROUGH, ENGLAND:52.5725769:W0.2427336 +NORWICH, ENGLAND:52.628606:1.29227 +NORTH WEALD, UK:51.7217:0.154167 +FOWLMERE, ENGLAND:53.3942:W1.38833 +CRANFIELD, ENGLAND:52.0722:W0.616667 +DUNSFOLD, ENGLAND:51.1167:W0.534444 +EXETER, ENGLAND:50.7344:W3.41389 +BRISTOL, ENGLAND:51.5194:W2.59083 +HATFIELD, ENGLAND:51.7667:0.25 +OXFORD, ENGLAND:51.7520131:W1.2578499 +BENSON, ENGLAND:51.6161:W1.09556 +LAKENHEATH, ENGLAND:52.4092:0.560833 +MILDENHALL, ENGLAND:52.3608:0.488333 +WATTISHAM, UK:52.1272:0.955833 +WYTON, UK:52.3572:W0.107778 +FAIRFORD, ENGLAND:51.6819:W1.79 +BRIZE NORTON, ENGLAND:51.7497:W1.58361 +ODIHAM, UK:51.2342:W0.942778 +COSFORD, ENGLAND:52.64:W2.30556 +NORTHOLT, UK:51.5528:W0.418056 +CONINGSBY, ENGLAND:53.0928:W0.165833 +DISHFORTH, ENGLAND:54.1369:W1.42 +LEEMING, ENGLAND:54.2922:W1.535 +CHURCH FENTON, ENGLAND:53.8342:W1.19528 +HONINGTON, ENGLAND:52.3425:0.772778 +COTTESMORE, ENGLAND:52.7356:W0.648611 +SCAMPTON, UK:53.3075:W0.550833 +WITTERING, UK:52.6125:W0.476389 +LINTON-ON-OUSE, ENGLAND:54.0494:W1.25194 +WADDINGTON, UK:53.1661:W0.523611 +COLTISHALL, ENGLAND:52.7547:1.35722 +CRANWELL, ENGLAND:53.0306:W0.481111 +BARKSTON HEATH, ENGLAND:52.9622:W0.561389 +MARHAM, UK:52.6483:0.550278 +MOUNT PLEASANT, FALKLAND ISLANDS:-51.8228:W58.4472 +AMSTERDAM, NETHERLANDS:52.3086:4.76389 +WEERT, NETHERLANDS:51.2553:5.60139 +MAASTRICHT, NETHERLANDS:50.9114:5.77 +DEELEN, NETHERLANDS:52.0606:5.87306 +DRACHTEN, NETHERLANDS:53.1192:6.12972 +EINDHOVEN, NETHERLANDS:51.45:5.37444 +GRONINGEN, NETHERLANDS:53.1194:6.57944 +GILZE-RIJEN, NETHERLANDS:51.5678:4.93306 +DE KOOY, NETHERLANDS:52.9233:4.78056 +LELYSTAD, NETHERLANDS:52.4603:5.52722 +LEEUWARDEN, NETHERLANDS:53.2286:5.76056 +ROTTERDAM, NETHERLANDS:51.9572:4.44167 +SOESTERBERG, NETHERLANDS:52.1269:5.27639 +ENSCHEDE, NETHERLANDS:52.27:6.87417 +VALKENBURG, NETHERLANDS:52.1697:4.42611 +WOENSDRECHT, NETHERLANDS:51.4489:4.34194 +CORK, IRELAND:51.8428:W8.49194 +GALWAY, IRELAND:53.3014:W8.93917 +DONEGAL, IRELAND:55.0442:W8.34083 +DUBLIN, IRELAND:53.4211:W6.27 +CONNAUGHT, IRELAND:53.9103:W8.81833 +KERRY, IRELAND:52.1808:W9.52361 +CASEMENT, IRELAND:53.3028:W6.44278 +SHANNON, IRELAND:52.7019:W8.92472 +SLIGO, IRELAND:54.28:W8.59917 +WATERFORD, IRELAND:52.1869:W7.08694 +AARHUS, DENMARK:56.3042:10.6194 +BILLUND, DENMARK:55.7403:9.15167 +COPENHAGEN, DENMARK:55.6178:12.6558 +ESBJERG, DENMARK:55.5258:8.55333 +GRONHOLT, DENMARK:55.9411:12.3822 +LINDTORP, DENMARK:56.3967:8.44333 +KARUP, DENMARK:56.2972:9.12444 +LAESO, DENMARK:57.2778:11.0014 +MARIBO, DENMARK:54.6992:11.44 +ODENSE, DENMARK:55.4761:10.3292 +KRUSA-PADBORG, DENMARK:54.8703:9.27917 +COPENHAGEN, DENMARK:55.5856:12.1314 +RONNE, DENMARK:55.0631:14.7594 +SOENDERBORG, DENMARK:54.9642:9.79167 +SINDAL, DENMARK:57.5033:10.2292 +SKRYDSTRUP, DENMARK:55.2253:9.26389 +SKIVE, DENMARK:56.55:9.17278 +THISTED, DENMARK:57.0686:8.705 +VANDEL, DENMARK:55.6969:9.19333 +KOLDING, DENMARK:55.4361:9.33083 +VAGAR, FAROE ISL.:62.0636:W7.27694 +VESTHIMMERLAND, DENMARK:56.8469:9.45861 +STAUNING, DENMARK:55.99:8.35389 +VAERLOSE, DENMARK:55.7672:12.3433 +AALBORG, DENMARK:57.0928:9.84889 +LUXEMBURG, LUXEMBURG:49.6264:6.21139 +ALESUND, NORWAY:62.5603:6.11 +ANDOYA, NORWAY:69.2925:16.1442 +ALTA, NORWAY:69.9769:23.3661 +FORDE, NORWAY:61.3925:5.76417 +BOMOEN, NORWAY:60.6386:6.50139 +BRONNOYSUND, NORWAY:65.4592:12.2136 +BODOE, NORWAY:67.2689:14.3633 +BERGEN, NORWAY:60.2933:5.21806 +BATSFJORD, NORWAY:70.6:29.6925 +KRISTIANSAND, NORWAY:58.2042:8.08528 +DAGLI, NORWAY:60.4167:8.51389 +BARDUFOSS, NORWAY:69.0556:18.5403 +EVENES, NORWAY:68.4911:16.6781 +OSLO, NORWAY:59.8956:10.6169 +FAGERNES, NORWAY:61.0111:9.29306 +FLORO, NORWAY:61.5839:5.025 +OSLO, NORWAY:60.1939:11.1003 +HAMAR, NORWAY:60.8183:11.0672 +HAUGESUND, NORWAY:59.345:5.20833 +HASVIK, NORWAY:70.4867:22.1397 +KRISTIANSUND, NORWAY:63.1117:7.82444 +KJELLER, NORWAY:59.9692:11.0358 +KIRKENES, NORWAY:69.725:29.8875 +LISTA, NORWAY:58.1003:6.625 +MOLDE, NORWAY:62.7461:7.2725 +MOSJOEN, NORWAY:65.7839:13.2147 +BANAK, NORWAY:70.0686:24.9733 +NOTODDEN, NORWAY:59.5656:9.21167 +ORLAND, NORWAY:63.6989:9.60389 +ROROS, NORWAY:62.5783:11.3422 +RYGGE, NORWAY:59.3789:10.7856 +SVALBARD, NORWAY:78.2461:15.4656 +SOGNDAL, NORWAY:61.1561:7.13639 +SKIEN, NORWAY:59.185:9.56694 +STORD, NORWAY:59.7917:5.34083 +SORKJOSEN, NORWAY:69.7869:20.9594 +SVARTNES, NORWAY:70.3553:31.0447 +SANDNESSJOEN, NORWAY:65.9567:12.4689 +TROMSO, NORWAY:69.6833:18.9189 +TORP, NORWAY:59.1867:10.2586 +TRONDHEIM, NORWAY:63.4575:10.9397 +STAVANGER, NORWAY:58.8767:5.63778 +GDANSK, POLAND:54.3775:18.4661 +KRAKOW, POLAND:50.0775:19.7847 +KATOWICE, POLAND:50.2383:19.035 +KOSZALIN, POLAND:54.0422:16.2636 +KATOWICE, POLAND:50.4742:19.08 +LODZ, POLAND:51.7219:19.3981 +MIELEC, POLAND:50.3222:21.4619 +POZNAN, POLAND:52.4211:16.8264 +RZESZOW, POLAND:50.11:22.0189 +SZCZECHIN, POLAND:53.5847:14.9019 +SZCZECHIN, POLAND:53.3919:14.6336 +SLUPSK, POLAND:54.4789:17.1075 +SHAPAJA, PERU:53.7906:15.8281 +WARSAW, POLAND:52.1656:20.9669 +WROCLAW, POLAND:51.1025:16.8858 +ZIELONA GORA, POLAND:52.1386:15.7986 +LINKOEPING, SWEDEN:58.4022:15.5256 +NORRKOEPING, SWEDEN:58.6108:16.1033 +UPPSALA, SWEDEN:59.8972:17.5883 +STOCKHOLM, SWEDEN:59.1808:17.9122 +ANGELHOLM, SWEDEN:56.2958:12.8469 +RONNEBY, SWEDEN:56.2667:15.265 +HASSLOSA, SWEDEN:58.4092:13.2625 +KNISLINGE, SWEDEN:56.1836:14.1322 +MOHOLM, SWEDEN:58.5981:14.1136 +KOSTA, SWEDEN:56.8442:15.4525 +RADA, SWEDEN:58.4981:13.0531 +BYHOLMA, SWEDEN:56.785:13.6017 +GOTHENBORG, SWEDEN:57.6628:12.2797 +JOENKOEPING, SWEDEN:57.7575:14.0686 +FALKOPING, SWEDEN:58.1697:13.5878 +LIDKOPING, SWEDEN:58.4653:13.1742 +GOTHENBORG, SWEDEN:57.7747:11.8703 +SKOVDE, SWEDEN:58.4564:13.9725 +TROLLHATTAN, SWEDEN:58.3181:12.345 +KARLSBORG, SWEDEN:58.5136:14.5069 +SATENAS, SWEDEN:58.4264:12.7142 +GIMO, SWEDEN:60.1328:18.105 +STOCKHOLM, SWEDEN:59.4186:17.8906 +KARLSKOGA, SWEDEN:59.3458:14.4958 +MORA, SWEDEN:60.9578:14.5111 +STOCKHOLM, SWEDEN:58.7886:16.9119 +STRANGNAS, SWEDEN:59.3139:17.1092 +ARVIKA, SWEDEN:59.6758:12.6392 +BJORKVIK, SWEDEN:58.7908:16.5708 +EMMABODA, SWEDEN:56.6106:15.6047 +LJUNGBY, SWEDEN:56.9503:13.9217 +KRISTIANSTAD, SWEDEN:55.9217:14.0853 +LANDSKRONA, SWEDEN:55.9447:12.8608 +OSKARSHAMN, SWEDEN:57.3503:16.4978 +ANDERSTORP, SWEDEN:57.2642:13.5992 +KALKMAR, SWEDEN:56.6853:16.2875 +MALMOE, SWEDEN:55.53:13.3714 +HALMSTAD, SWEDEN:56.6911:12.82 +HAGSHULT, SWEDEN:57.2922:14.1372 +VAXJO, SWEDEN:56.9289:14.7278 +HALLVIKEN, SWEDEN:63.7383:15.4583 +HEDE, SWEDEN:62.4089:13.7472 +SVEG, SWEDEN:62.0478:14.4228 +FARILA, SWEDEN:61.8981:15.7053 +GALLIVARE, SWEDEN:67.1322:20.8144 +HUDIKSVALL, SWEDEN:61.7681:17.0806 +KUBBE, SWEDEN:63.6336:17.9397 +JOKKMOKK, SWEDEN:66.4961:20.1469 +KRAMFORS, SWEDEN:63.0483:17.7686 +LYCKSELE, SWEDEN:64.5481:18.7161 +OPTAND, SWEDEN:63.1286:14.8028 +SUNDSVALL, SWEDEN:62.5281:17.4439 +ORNSKOLDSVIK, SWEDEN:63.4083:18.99 +PITEA, SWEDEN:65.3994:21.2653 +KIRUNA, SWEDEN:67.8219:20.3367 +ORSA, SWEDEN:61.19:14.7125 +SKELLEFTEA, SWEDEN:64.6247:21.0767 +SATTNA, SWEDEN:62.4811:17.0028 +UMEA, SWEDEN:63.7917:20.2825 +VILHELMINA, SWEDEN:64.5789:16.8333 +ARVIDSJAUR, SWEDEN:65.59:19.2817 +OREBRO, SWEDEN:59.2236:15.0378 +HAGFORS, SWEDEN:60.02:13.5789 +VASTERAS, SWEDEN:59.5894:16.6336 +LULEA, SWEDEN:65.5436:22.1219 +OSTERSUND, SWEDEN:63.1939:14.5019 +VIDSEL, SWEDEN:65.8753:20.1497 +HEDEN, SWEDEN:65.8361:21.4714 +ARBOGA, SWEDEN:59.3864:15.9239 +STOCKHOLM, SWEDEN:59.6519:17.9186 +STOCKHOLM, SWEDEN:59.3542:17.9414 +BORLANGE, SWEDEN:60.4219:15.515 +HULTSFRED, SWEDEN:57.5256:15.8239 +GAVLE, SWEDEN:60.5933:16.9514 +LINKOEPING, SWEDEN:58.4061:15.6803 +NORRKOEPING, SWEDEN:58.5861:16.2506 +TORSBY, SWEDEN:60.1575:12.9911 +ESKILSTUNA, SWEDEN:59.3508:16.7083 +VISBY, SWEDEN:57.6628:18.3461 +AMSELE, SWEDEN:64.5706:19.3142 +MOHED, SWEDEN:64.9608:17.6964 +IDRE, SWEDEN:61.8686:12.6906 +FALLFORS, SWEDEN:65.1064:20.7606 +KALIXFORS, SWEDEN:67.7647:20.2572 +HEMAVAN, SWEDEN:65.8061:15.0828 +SPANGDAHLEM, GERMANY:49.9725:6.6925 +RAMSTEIN, GERMANY:49.4375:7.60139 +BAMBERG, GERMANY:49.9203:10.9142 +BAUMHOLDER, GERMANY:49.65:7.3 +GIEBELSTADT, GERMANY:49.6481:9.96639 +BRUECKEBURG, GERMANY:52.2783:9.08194 +CELLE, GERMANY:52.5911:10.0219 +RHEINE-BRENTLANGE, GERMANY:52.2911:7.38694 +FRITZLAR, GERMANY:51.1144:9.28583 +ITZEHOE, GERMANY:53.9944:9.57833 +LAUPHEIM, GERMANY:48.2203:9.91 +MENDIG, GERMANY:50.3658:7.315 +NIEDERSTETTEN, GERMANY:49.3917:9.95806 +ROTH, GERMANY:49.2175:11.1006 +FASSBERG, GERMANY:52.9192:10.1836 +COTTBUS, GERMANY:51.7678:14.2919 +GRAFENWOEHR, GERMANY:49.6994:11.9411 +HANAU, GERMANY:50.1692:8.96139 +HEIDELBERG, GERMANY:49.3933:8.65194 +HOHENFELS, GERMANY:49.2181:11.8361 +KITZINGEN, GERMANY:49.7431:10.2006 +EGGEBECK, GERMANY:54.6247:9.34139 +NORDHOLZ, GERMANY:53.7675:8.65833 +DIEPHOLZ, GERMANY:52.5853:8.34056 +GEILENKIRCHEN, GERMANY:50.9608:6.0425 +HOHN, GERMANY:54.3119:9.53806 +JEVER, GERMANY:53.5333:7.88861 +LAAGE, GERMANY:53.9181:12.2792 +NOERVENICH, GERMANY:50.8311:6.65806 +HOPSTEN, GERMANY:52.3386:7.54111 +PRESCHEN, GERMANY:51.6636:14.6336 +SCHLESWIG, GERMANY:54.4592:9.51611 +WITTMUNDHAFEN, GERMANY:53.5478:7.66722 +NEUBRANDENBURG, GERMANY:53.6019:13.3058 +WUNSTORF, GERMANY:52.4572:9.42694 +VILSECK, GERMANY:49.6336:11.7672 +COLEMAN, GERMANY:49.5633:8.46333 +WIESBADEN, GERMANY:50.0497:8.32528 +LANDSBERG, GERMANY:48.0706:10.9058 +BUECHEL, GERMANY:50.1736:7.06333 +ERDING, GERMANY:48.3222:11.9486 +FUERSTENFELDBRUCK, GERMANY:48.2056:11.2669 +HOLZDORF, GERMANY:51.7678:13.1675 +INGOLSTADT, GERMANY:48.7156:11.5339 +LECHFELD, GERMANY:48.1861:10.8622 +MEMMINGEN, GERMANY:47.9886:10.2394 +NEUBURG, GERMANY:48.7108:11.2111 +LAARBRUCH, GERMANY:51.6017:6.1425 +GUETERSLOH, GERMANY:51.9228:8.30611 +BRUEGGEN, GERMANY:51.1997:6.13194 +ALEXANDER BAY, SOUTH AFRICA:-28.575:16.5333 +AGGENEYS, SOUTH AFRICA:-29.2817:18.8136 +ARNOT POWER STATION, SOUTH AFRICA:-25.9436:29.81 +BRAKPAN, SOUTH AFRICA:-26.2386:28.3017 +BISHO, SOUTH AFRICA:-32.8969:27.2789 +BLOEMFONTEIN, SOUTH AFRICA:-29.0925:26.3022 +BETHLEHEM, SOUTH AFRICA:-28.2483:28.3361 +BOTHAVILLE, SOUTH AFRICA:-27.3667:26.6292 +CARLETONVILLE, SOUTH AFRICA:-26.3694:27.35 +CAPE TOWN, SOUTH AFRICA:-33.9647:18.6017 +CALVINIA, SOUTH AFRICA:-31.5003:19.7258 +DE AAR, SOUTH AFRICA:-30.6367:23.92 +DWAALBOOM, SOUTH AFRICA:-24.805:26.8317 +DUNDEE, SOUTH AFRICA:-28.1825:30.2244 +DURBAN, SOUTH AFRICA:-29.97:30.9503 +EAST LONDON, SOUTH AFRICA:-33.0356:27.8258 +ERMELO, SOUTH AFRICA:-26.4953:29.98 +ELLISRAS, SOUTH AFRICA:-23.7261:27.6875 +FICKSBURG, SOUTH AFRICA:-28.8231:27.9089 +JOHANNESBURG, SOUTH AFRICA:-25.9861:28.14 +GEORGE, SOUTH AFRICA:-34.0053:22.3789 +GIYANI, SOUTH AFRICA:-23.2836:30.6497 +JOHANNESBURG, SOUTH AFRICA:-26.2425:28.1511 +GRAHAMSTOWN, SOUTH AFRICA:-33.2847:26.4981 +GREYTOWN, SOUTH AFRICA:-29.1219:30.5867 +HARMONY, SOUTH AFRICA:-28.0786:26.8611 +PULLENSHOPE, SOUTH AFRICA:-25.9794:29.6186 +HEIDELBERG, SOUTH AFRICA:-26.5061:28.3939 +HEIBRON, SOUTH AFRICA:-27.2783:27.9958 +HARRISMITH, SOUTH AFRICA:-28.235:29.1061 +HOEDSPRUIT, SOUTH AFRICA:-24.3686:31.0486 +HENDRIK VERWOERDDAM, SOUTH AFRICA:-30.5619:25.5281 +JOHANNESBURG, SOUTH AFRICA:-26.1392:28.2458 +KLERKSDORP, SOUTH AFRICA:-26.8708:26.7178 +KOMATI POWER STATION, SOUTH AFRICA:-26.0933:29.4547 +KRIEL, SOUTH AFRICA:-26.2517:29.1944 +KIMBERLEY, SOUTH AFRICA:-28.8028:24.765 +KOMATIPOORT, SOUTH AFRICA:-25.4406:31.9297 +KRUGERSDORP, SOUTH AFRICA:-26.0808:27.7256 +KROONSTAD, SOUTH AFRICA:-27.6606:27.3156 +KURUMAN, SOUTH AFRICA:-27.4567:23.4114 +KLEINSEE, SOUTH AFRICA:-29.6883:17.0939 +JOHANNESBURG, SOUTH AFRICA:-25.9383:27.9261 +LADYBRAND, SOUTH AFRICA:-29.1811:27.4531 +LICHTENBURG, SOUTH AFRICA:-26.1756:26.1844 +LOUIS TRICHARDT, SOUTH AFRICA:-23.1597:29.6964 +LANGEBAANWEG, SOUTH AFRICA:-32.9689:18.1603 +LADYSMITH, SOUTH AFRICA:-28.5817:29.7497 +MIDDELBURG, SOUTH AFRICA:-25.6847:29.44 +MARGATE, SOUTH AFRICA:-30.8572:30.3428 +MARBLE HALL, SOUTH AFRICA:-24.9889:29.2831 +MAJUBA POWER STATION, SOUTH AFRICA:-27.0792:29.7783 +MAFIKENG, SOUTH AFRICA:-25.7528:25.6119 +MMABATHO, SOUTH AFRICA:-25.7983:25.5478 +MALALANE, SOUTH AFRICA:-25.4733:31.5656 +MESSINA, SOUTH AFRICA:-22.3558:29.9864 +MKUZE, SOUTH AFRICA:-27.6258:32.0442 +NEWCASTLE, SOUTH AFRICA:-27.7706:29.9767 +NELSPRUIT, SOUTH AFRICA:-25.5006:30.9133 +NYLSTROOM, SOUTH AFRICA:-24.6858:28.4347 +OVERBERG, SOUTH AFRICA:-34.5553:20.2503 +OUDTSHOORN, SOUTH AFRICA:-33.6069:22.1889 +PIETERSBURG, SOUTH AFRICA:-23.8453:29.4586 +PORT ELIZABETH, SOUTH AFRICA:-33.9847:25.6172 +PLETTENBERG BAY, SOUTH AFRICA:-34.0903:23.3278 +PHALABORWA, SOUTH AFRICA:-23.9369:31.1553 +PIETERSBURG, SOUTH AFRICA:-23.9258:29.4842 +PORT SAINT JOHNS, SOUTH AFRICA:-31.6058:29.5197 +PIETERMARITZBURG, SOUTH AFRICA:-29.6489:30.3986 +PILANESBERG, SOUTH AFRICA:-25.3336:27.1733 +POTGIETERSRUS, SOUTH AFRICA:-24.2303:28.9836 +POMFRET, SOUTH AFRICA:-25.8469:23.5378 +POTCHEFSTROOM, SOUTH AFRICA:-26.6708:27.0817 +PARYS, SOUTH AFRICA:-26.8892:27.5033 +QUEENSTOWN, SOUTH AFRICA:-31.92:26.8819 +RICHARD'S BAY, SOUTH AFRICA:-28.7408:32.0919 +RUSTENBURG, SOUTH AFRICA:-25.6442:27.2711 +ROBERTSON, SOUTH AFRICA:-33.8119:19.9028 +SPRINGBOK, SOUTH AFRICA:-29.6892:17.9394 +SECUNDA, SOUTH AFRICA:-26.5239:29.17 +SALDANHA, SOUTH AFRICA:-32.9639:17.9692 +SPRINGS, SOUTH AFRICA:-26.2483:28.3975 +SWARTKOP, SOUTH AFRICA:-25.8094:28.1644 +SISHEN, SOUTH AFRICA:-27.6483:22.9992 +SACE, SOUTH AFRICA:-25.9614:29.2086 +SKUKUZA, SOUTH AFRICA:-24.9608:31.5886 +TOMMY'S FIELD, SOUTH AFRICA:-28.26:22.9931 +THOHOYANDOU, SOUTH AFRICA:-23.0786:30.3833 +THABA NCHU, BOPHUTHATSWANA:-29.3192:26.8233 +BLOEMFONTEIN, SOUTH AFRICA:-29.0328:26.1575 +TUTUKA, SOUTH AFRICA:-26.7764:29.3386 +TZANEEN, SOUTH AFRICA:-23.8242:30.3292 +ULUNDI, SOUTH AFRICA:-28.3206:31.4164 +UPINGTON, SOUTH AFRICA:-28.4008:21.2606 +UMTATA, SOUTH AFRICA:-31.5478:28.6742 +VRYBURG, SOUTH AFRICA:-26.9822:24.7286 +DURBAN, SOUTH AFRICA:-29.7706:31.0583 +VANDERBIJLPARK, SOUTH AFRICA:-26.6922:27.7778 +VREDENDAL, SOUTH AFRICA:-31.6408:18.5447 +VEREENIGING, SOUTH AFRICA:-26.5661:27.9606 +VRYHEID, SOUTH AFRICA:-27.7867:30.7953 +PRETORIA, SOUTH AFRICA:-25.6536:28.2242 +WITBANK, SOUTH AFRICA:-25.8322:29.1919 +WATERKLOOF, SOUTH AFRICA:-25.83:28.2225 +WELKOM, SOUTH AFRICA:-27.9978:26.6694 +WESSELSBRUNN, SOUTH AFRICA:-27.8472:26.3497 +YSTERPLAAT, SOUTH AFRICA:-33.9:18.4981 +ZEERUST, SOUTH AFRICA:-25.5989:26.0422 +FRANCISTOWN, BOTSWANA:-21.1594:27.4744 +JWANENG, BOTSWANA:-24.6022:24.6908 +KASANE, BOTSWANA:-17.8328:25.1622 +MAUN, BOTSWANA:-19.9725:23.4308 +ORAPA, BOTSWANA:-21.2664:25.3203 +GABERONE, BOTSWANA:-24.555:25.9181 +SELEBI-PHIKWE, BOTSWANA:-22.0583:27.8286 +BRAZZAVILLE, CONGO:-4.25167:15.2528 +IMPFONDO, CONGO:1.58944:18.0469 +MAKOUA, CONGO:-0.0213889:15.5753 +OWANDO, CONGO:-0.531111:15.95 +OUESSO, CONGO:1.61583:16.0378 +MAKABANA, CONGO:-3.48333:12.6167 +LOUDIMA, CONGO:-4.20778:12.6608 +POINTE-NOIRE, CONGO:-4.81333:11.8858 +MANZINI, SWAZILAND:-26.5289:31.3075 +BANGUI, CENTRAL AFRICAN REP.:4.39833:18.5186 +BANGASSOU, CENTRAL AFRICAN REP.:4.78444:22.7814 +BIRAO, CENTRAL AFRICAN REP.:10.2361:22.7172 +BAMBARI, CENTRAL AFRICAN REP.:5.84694:20.6494 +N'DELE, CENTRAL AFRICAN REP.:8.42667:20.635 +BOUAR, CENTRAL AFRICAN REP.:5.95806:15.6375 +BRIA, CENTRAL AFRICAN REP.:6.52806:21.9889 +BERBERATI, CENTRAL AFRICAN REP.:4.22139:15.7861 +YALINGA, CENTRAL AFRICAN REP.:45.1542:W89.1108 +BATA, EQUATORIAL GUINEA:1.90528:9.80556 +MALABO, EQUATORIAL GUINEA:3.75528:8.70861 +WIDE AWAKE, ACORES:-7.96944:W14.3936 +PLAISANCE, MAURITIUS:-20.43:57.6833 +RODRIGUEZ ISLAND, MAURITIUS:-19.7578:63.3619 +DIEGO GARCIA ISLAND, DIEGO GARCIA ISLAND:-7.31306:72.4108 +TIKO, CAMEROON:4.08917:9.36028 +DOUALA, CAMEROON:4.00583:9.71944 +BATOURI, CAMEROON:4.47306:14.3636 +MAROUA, CAMEROON:10.4514:14.2572 +FOUMBAN, CAMEROON:5.63667:10.7506 +N'GAOUNDERE, CAMEROON:7.35694:13.5592 +GAROUA, CAMEROON:9.33583:13.37 +BAFOUSSAM, CAMEROON:5.53694:10.3542 +BAMENDA, CAMEROON:6.03917:10.1225 +YAOUNDE, CAMEROON:3.83528:11.5236 +KASOMPE, ZAMBIA:-12.5728:27.8939 +KALABO, ZAMBIA:-14.9975:22.6475 +LIVINGSTONE, ZAMBIA:-17.8217:25.8225 +LUSAKA, ZAMBIA:-15.3306:28.4525 +MANSA, ZAMBIA:-11.1381:28.875 +MFUWE, ZAMBIA:-13.2586:31.9364 +MONGU, ZAMBIA:-15.2544:23.1622 +MUFULIRA, ZAMBIA:-12.5647:28.2986 +NDOLA, ZAMBIA:-12.9981:28.6647 +SOUTHDOWNS, ZAMBIA:-12.9003:28.1497 +ZAMBEZI, ZAMBIA:-13.5386:23.1097 +MORONI, COMOROS ISLANDS:-11.5336:43.2717 +MOHELI, COMOROS ISLANDS:-12.2981:43.7664 +MORONI, COMOROS ISLANDS:-11.7106:43.2436 +ANJOUAN, COMOROS ISLANDS:-12.1317:44.4303 +DZAOUDZI, MAYOTTE ISLAND:-12.8047:45.2811 +ST.-DENIS, REUNION ISLAND:-20.8869:55.5103 +ST.-PIERRE, REUNION ISLAND:-21.3208:55.4247 +ANTANANARIVO, MADAGASCAR:-18.7967:47.4786 +MIANDRIVAZO, MADAGASCAR:-19.5628:45.4508 +SAINTE MARIE, MADAGASCAR:-17.0939:49.8158 +TOAMASINA, MADAGASCAR:-18.1094:49.3925 +MORONDAVA, MADAGASCAR:-20.2847:44.3175 +ANTSIRANANA, MADAGASCAR:-12.3492:49.2917 +MANANARA, MADAGASCAR:-16.1639:49.7736 +ANDAPA, MADAGASCAR:-14.6517:49.6206 +AMBILOBE, MADAGASCAR:-13.1883:48.9878 +ANTALAHA, MADAGASCAR:-14.9992:50.32 +ANALALAVA, MADAGASCAR:-14.6294:47.7636 +MAHAJANGA, MADAGASCAR:-15.6672:46.3517 +NOSY-BE, MADAGASCAR:-13.3122:48.3139 +BESALAMPY, MADAGASCAR:-16.7419:44.4814 +MAROANTSETRA, MADAGASCAR:-15.4367:49.6883 +SAMBAVA, MADAGASCAR:-14.2786:50.1747 +VOHEMAR, MADAGASCAR:-13.3758:50.0028 +ANTSOHIHY, MADAGASCAR:-14.8986:47.9939 +AMPAMPAMENA, MADAGASCAR:-13.4847:48.6325 +TOLAGNARO, MADAGASCAR:-25.0381:46.9561 +FIANARANTSOA, MADAGASCAR:-21.4414:47.1117 +FARAFANGANA, MADAGASCAR:-22.8053:47.8206 +MANAKARA, MADAGASCAR:-22.1197:48.0217 +MANANJARY, MADAGASCAR:-21.2017:48.3581 +MOROMBE, MADAGASCAR:-21.7536:43.3753 +TOLIARA, MADAGASCAR:-23.3833:43.7283 +M'BANZA-CONGO, ANGOLA:-6.26972:14.2469 +BENGUELA, ANGOLA:-12.6089:13.4036 +CABINDA, ANGOLA:-5.59694:12.1883 +CHITATO, ANGOLA:-7.3575:20.8036 +CAMAXILO, ANGOLA:-8.37361:18.9236 +CAZOMBO, ANGOLA:-11.8936:22.9161 +N'GIVA, ANGOLA:-17.0447:15.6869 +HUAMBO, ANGOLA:-12.8086:15.7603 +KUITO, ANGOLA:-12.4044:16.9472 +LOBITO, ANGOLA:-12.3711:13.5364 +LUANDA, ANGOLA:-8.85833:13.2311 +MALANJE, ANGOLA:-9.525:16.3122 +MENONGUE, ANGOLA:-14.6575:17.7197 +MOCAMEDES, ANGOLA:-15.2611:12.1467 +NEGAGE, ANGOLA:-7.75444:15.2875 +PORTO AMBOIM, ANGOLA:-10.7219:13.7653 +SAURIMO, ANGOLA:-9.68889:20.4317 +SOYO, ANGOLA:-6.14083:12.3717 +TOTO, ANGOLA:-7.14722:14.2481 +LUENA, ANGOLA:-11.7681:19.8975 +UIGE, ANGOLA:-7.60306:15.0278 +XANGONGO, ANGOLA:-16.7553:14.9653 +OYEM, GABON:1.54111:11.5808 +OKONDJA, GABON:-0.665278:13.6731 +LAMBARENE, GABON:-0.704167:10.2456 +BITAM, GABON:2.07556:11.4931 +MOANDA, GABON:-1.5375:13.2692 +PORT GENTIL, GABON:-0.711667:8.75417 +OMBOUE HOSPIAL, GABON:-1.57472:9.26278 +MAKOKOU, GABON:0.579167:12.8908 +LIBREVILLE, GABON:0.458333:9.41222 +MITZIC, GABON:0.775556:11.5525 +FRANCEVILLE, GABON:-1.65611:13.4378 +LASTOURVILLE, GABON:-0.826389:12.7467 +TCHIBANGA, GABON:-2.88889:10.9194 +PRINCIPE, SAO TOME & PRINCIPE:1.66278:7.41167 +SAO TOME, SAO TOME & PRINCIPE:0.378056:6.71194 +BEIRA, MOZAMBIQUE:-19.7964:34.9075 +CUAMBA, MOZAMBIQUE:-14.82:36.5319 +CHIMOIO, MOZAMBIQUE:-19.1511:33.4289 +ESTIMA, MOZAMBIQUE:-15.7342:32.7567 +INHAMBANE, MOZAMBIQUE:-23.8764:35.4083 +LICHINGA, MOZAMBIQUE:-13.2739:35.2661 +LUMBO, MOZAMBIQUE:-15.0331:40.6717 +MAPUTO, MOZAMBIQUE:-25.9208:32.5725 +MUEDA, MOZAMBIQUE:-11.6728:39.5631 +MOCIMBOA DA PRAIA, MOZAMBIQUE:-11.3617:40.3547 +MARRUPA, MOZAMBIQUE:-13.225:37.5519 +NACALA, MOZAMBIQUE:-14.4881:40.7122 +NAMPULA, MOZAMBIQUE:-15.1056:39.2817 +PEMBA, MOZAMBIQUE:-12.9867:40.5222 +QUELIMANE, MOZAMBIQUE:-17.8556:36.8692 +SONGO, MOZAMBIQUE:-15.6025:32.7731 +TETE, MOZAMBIQUE:-16.1047:33.64 +ULONGWE, MOZAMBIQUE:-14.7044:34.3522 +VILANKULU, MOZAMBIQUE:-22.0183:35.3131 +ALPHONSE, SEYCHELLES:-7.00472:52.7261 +DESROCHES, SEYCHELLES:-5.69583:53.6544 +FARQUHAR, SEYCHELLES:-10.1094:51.1761 +MAHE, SEYCHELLES:-4.67417:55.5217 +PRASLIN, SEYCHELLES:-4.31917:55.6914 +COETIVY, SEYCHELLES:-7.16417:56.2639 +SARH, CHAD:9.15111:18.3794 +ABECHE, CHAD:13.8469:20.8442 +MOUNDOU, CHAD:8.62028:16.0683 +N'DJAMENA, CHAD:12.1336:15.0339 +PALA, CHAD:9.37917:14.9258 +FAYA-LARGEAU, CHAD:17.9169:19.1108 +BULAWAYO, ZIMBABWE:-20.0172:28.6178 +HARARE, ZIMBABWE:-17.7514:30.9244 +CHIREDZI, ZIMBABWE:-21.0081:31.5783 +VICTORIA FALLS, ZIMBABWE:-18.0961:25.8392 +MUTARE, ZIMBABWE:-18.9775:32.4506 +HARARE, ZIMBABWE:-17.9317:31.0928 +KARIBA, ZIMBABWE:-16.5197:28.8847 +MUTOKO, ZIMBABWE:-17.4317:32.1844 +MUTARE, ZIMBABWE:-18.9975:32.6272 +MASVINGO, ZIMBABWE:-20.0553:30.8589 +ZVISHAVANE, ZIMBABWE:-20.2894:30.0883 +GWERT, ZIMBABWE:-19.4367:29.8617 +HWANGE NATIONAL PARK, ZIMBABWE:-18.6297:27.0208 +ZISCO, ZIMBABWE:-19.0286:29.7219 +BLANTYRE, MALAWI:-15.6789:34.9739 +KARONGA, MALAWI:-9.95333:33.8928 +KASUNGU, MALAWI:-13.0144:33.4683 +MANGOCHI, MALAWI:30.8378:W85.1817 +MZUZU, MALAWI:-11.4447:34.0117 +MASERU, LESOTHO:-29.4622:27.5525 +MASERU, LESOTHO:-29.3039:27.5033 +KINSHASA, ZAIRE:-4.38556:15.4444 +KINSHASA, ZAIRE:-4.32472:15.3283 +MUANDA, ZAIRE:-5.93083:12.3517 +KITONA BASE, ZAIRE:-5.91806:12.4475 +MATADI, ZAIRE:-5.79944:13.4408 +BANDOUNDU, ZAIRE:-3.31111:17.3817 +KIKWIT, ZAIRE:-5.03556:18.7856 +MBANDAKA, ZAIRE:0.0225:18.2886 +GBADOLITE, ZAIRE:4.25306:20.9753 +GEMENA, ZAIRE:3.23528:19.7711 +KOTAKOLI, ZAIRE:4.1575:21.6508 +LISALA, ZAIRE:2.17056:21.4967 +KISANGANI, ZAIRE:0.5175:25.155 +ISIRO, ZAIRE:2.8275:27.5881 +BUNIA, ZAIRE:1.56556:30.2208 +BUTA ZEGA, ZAIRE:2.81778:24.7939 +BUKAVU/KAVUMU, ZAIRE:-2.30889:28.8086 +GOMA, ZAIRE:-1.67056:29.2383 +KINDU, ZAIRE:-2.91917:25.9153 +LUBUMASHI, ZAIRE:-11.5911:27.5308 +KOLWEZI, ZAIRE:-10.7658:25.5056 +KALEMIE, ZAIRE:-5.87556:29.25 +KAMINA BASE, ZAIRE:-8.64194:25.2528 +LUENA, ZAIRE:-9.46944:25.7589 +KANANGA, ZAIRE:-5.9:22.4692 +MBUJI-MAYI, ZAIRE:-6.12111:23.5689 +BAMAKO, MALI:12.5333:W7.94972 +GAO, MALI:16.2483:W0.00527778 +KAYES, MALI:14.4311:W11.4394 +MOPTI, MALI:14.5128:W4.07944 +NIORO, MALI:15.2386:W9.57639 +TOMBOUCTOU, MALI:16.7303:W3.0075 +TESSALIT, MALI:20.2461:0.980833 +BANJUL, GAMBIA:13.3378:W16.6519 +FUERTEVENTURA, CANARY ISLANDS:28.4525:W13.8636 +HIERRO, CANARY ISLANDS:27.8147:W17.8869 +SANTA CRUZ DE LA PALMA, SPAIN:28.6264:W17.7556 +GRAN CANARIA, CANARY ISLANDS:27.9317:W15.3864 +LANZEROTE, CANARY ISLANDS:28.9453:W13.605 +TENERIFE, CANARY ISLANDS:28.0444:W16.5722 +TENERIFE, CANARY ISLANDS:28.4825:W16.3414 +MELILLA, SPANISH NORTH AFRICA:35.2797:W2.95611 +HASTINGS, SIERRA LEONE:8.39444:W13.1283 +FREETOWN, SIERRA LEONE:8.61639:W13.1953 +CUFAR, GUINEA BISSAU:11.2881:W15.1806 +BISSAU, GUINEA BISSAU:11.8947:W15.6536 +MONROVIA, LIBERIA:6.28889:W10.7586 +MONROVIA, LIBERIA:6.23361:W10.3622 +AGADIR, MOROCCO:30.3811:W9.54611 +TAN TAN, MOROCCO:28.4481:W11.1611 +FEZ, MOROCCO:33.9272:W4.97778 +IFRANE, MOROCCO:33.5053:W5.15278 +ER-RACHIDIA, MOROCCO:31.9489:W4.40056 +MEKNES, MOROCCO:33.8789:W5.515 +NADOR, MOROCCO:35.1533:W2.92 +OUJDA, MOROCCO:34.7869:W1.92389 +CASABLANCA, MOROCCO:33.5533:W7.66139 +RABAT, MOROCCO:34.0514:W6.75139 +SIDI IFINI, MOROCCO:29.3689:W10.18 +ESSADOUIRA, MOROCCO:31.4039:W9.68472 +CASABLANCA, MOROCCO:33.3678:W7.58778 +MARRAKECH, MOROCCO:31.6067:W8.03611 +KENTIRA, MOROCCO:34.2989:W6.59583 +OUARZAZATE, MOROCCO:30.9389:W6.90917 +AL HOCIEMA, MOROCCO:35.1769:W3.83944 +TETOUAN, MOROCCO:35.5942:W5.32 +TANGER, MOROCCO:35.7267:W5.91667 +ZIGUINCHOR, SENEGAL:12.5556:W16.2817 +KOLDA, SENEGAL:12.88:W14.9553 +CAP SKIRING, SENEGAL:12.41:W16.7461 +KAOLACK, SENEGAL:14.1467:W16.0511 +DAKAR, SENEGAL:14.7394:W17.49 +ST. LOUIS, SENEGAL:16.0497:W16.4611 +BAKEL, SENEGAL:14.8472:W12.4681 +KEDOUGOU, SENEGAL:12.5722:W12.2203 +TAMBACOUNDA, SENEGAL:13.7367:W13.6531 +AIOUN EL ATROUSS, MAURITANIA:16.7111:W9.63778 +TIDJIKJA, MAURITANIA:18.5703:W11.4231 +KIFFA, MAURITANIA:16.5897:W11.4061 +NEMA, MAURITANIA:16.6219:W7.31444 +KAEDI, MAURITANIA:16.1594:W13.5075 +NOUAKSCHOTT, MAURITANIA:18.0978:W15.9478 +SELIBABI, MAURITANIA:15.1794:W12.2072 +ATAR, MAURITANIA:20.5067:W13.0431 +NOUADHIBOU, MAURITANIA:20.9283:W17.0311 +BIR MOGHREIN, MAURITANIA:25.2367:W11.5886 +FIRA, GUINEA:10.3506:W13.5692 +FARANAH, GUINEA:10.0356:W10.7697 +LABE, GUINEA:11.3261:W12.2869 +MACENTA, GUINEA:8.48111:W9.52583 +N'ZEREKORE, GUINEA:7.80583:W8.70167 +AMILCAR CABRAL, CAPE VERDE ISLANDS:16.7414:W22.9494 +BOA VISTA, CAPE VERDE ISLANDS:16.1367:W22.8889 +FRANCISCO MENDEZ, CAPE VERDE ISLANDS:14.9244:W23.4933 +MAIO, CAPE VERDE ISLANDS:15.1558:W23.2136 +SAO NOCOLAU ISLAND, CAPE VERDE ISLANDS:16.5883:W24.2844 +SAO VICENTE ISLAND, CAPE VERDE ISLANDS:16.8339:W25.0567 +ADDIS ABABA, ETHIOPIA:8.97694:38.8 +ADDIS ABABA, ETHIOPIA:9.00361:38.7256 +BAHAR DAR, ETHIOPIA:11.6081:37.3214 +DIRE DAWA, ETHIOPIA:9.625:41.8542 +GAMBELLA, ETHIOPIA:8.12833:34.5633 +GONDAR, ETHIOPIA:12.5183:37.4322 +DEBRE ZEIT, ETHIOPIA:8.71556:39.0081 +JIMMA, ETHIOPIA:7.66583:36.8164 +LALIBELLA, ETHIOPIA:11.9747:38.9797 +MAKALE, ETHIOPIA:13.4672:39.5333 +BUJUMBURA, BURUNDI:-3.32389:29.3183 +BAIDOA, SOMALIA:3.09861:43.6242 +HARGEISA, SOMALIA:9.51806:44.0886 +BERBERA, SOMALIA:10.3892:44.9408 +KISMAYU, SOMALIA:-0.377222:42.4592 +MOGADISHU, SOMALIA:2.01361:45.3047 +EL ARISH, EGYPT:31.0733:33.8358 +ASYUT, EGYPT:27.0464:31.0119 +ALEXANDRIA, EGYPT:31.1839:29.9489 +ABU SIMBEL, EGYPT:22.3758:31.6117 +CAIRO, EGYPT:30.1219:31.4056 +CAIRO, EGYPT:30.1161:30.9153 +EMBABA, EGYPT:30.0744:31.1919 +HURGHADA, EGYPT:27.1839:33.7983 +EL-GORA, EGYPT:31.0689:34.1292 +LUXOR, EGYPT:25.6708:32.7064 +MERSA-MATRUH, EGYPT:31.3253:27.2217 +PORT SAID, EGYPT:31.2794:32.24 +ST. CATHERINE, EGYPT:28.6853:34.0625 +ASWAN, EGYPT:23.9642:32.8197 +EL-TOR, EGYPT:28.2089:33.6453 +ELDORET, KENYA:0.404167:35.2381 +GARISSA, KENYA:-0.463333:39.6481 +ISIOLO, KENYA:0.339167:37.5908 +KAKAMEGA, KENYA:0.271111:34.7872 +KISUMU, KENYA:-0.0861111:34.7289 +KITALE, KENYA:0.971944:34.9583 +LOKICHOGGIO, KENYA:4.20417:34.3481 +LODWAR, KENYA:3.12194:35.6086 +LAMU, KENYA:-2.25222:40.9131 +LOYANGALANI, KENYA:2.76306:36.7183 +MANDERA, KENYA:3.93361:41.8442 +MARSABIT, KENYA:2.345:37.9992 +MERU, KENYA:0.230278:38.1703 +MALINDI, KENYA:-3.22917:40.1017 +MOMBASA, KENYA:-4.03472:39.5942 +MOYALE LOWER, KENYA:3.46972:39.1014 +NYERI, KENYA:-0.368889:36.98 +NAIVASHA, KENYA:-0.787778:36.4333 +NAIROBI, KENYA:-1.32167:36.8147 +NANYUKI, KENYA:-0.0608333:37.0386 +NAIROBI, KENYA:-1.27722:36.8622 +WAJIR, KENYA:1.73306:40.0914 +BUATTIFEL, LIBYA:28.7953:22.0808 +GIALLO, LIBYA:28.6383:21.4378 +GHAT, LIBYA:25.1456:10.1425 +KUFRA, LIBYA:24.1786:23.3139 +BENGHAZI, LIBYA:32.0967:20.2694 +EL BEIDA, LIBYA:32.7886:21.9642 +SEBHA, LIBYA:26.9869:14.4725 +TRIPOLI, LIBYA:32.6633:13.1589 +MARSA BREGA, LIBYA:30.3781:19.5764 +RAS LANOUF V 40, LIBYA:30.5:18.5269 +HON, LIBYA:29.11:15.9656 +DAHRA, LIBYA:29.4697:17.9311 +GHADAMES, LIBYA:30.1517:9.71528 +ZELLA 74, LIBYA:28.59:17.2942 +GISENYI, RWANDA:-1.67694:29.2586 +KIGALI, RWANDA:-1.96861:30.1394 +KAMEMBE, RWANDA:-2.46222:28.9078 +DONGOLA, SUDAN:19.1536:30.43 +DAMAZIN, SUDAN:11.7858:34.3364 +EL FASHER, SUDAN:13.615:25.3247 +KASSALA, SUDAN:15.3858:36.3281 +NYALA, SUDAN:12.0536:24.9553 +EL OBEID, SUDAN:13.1531:30.2325 +JUBA, SUDAN:4.87194:31.6011 +MALAKAL, SUDAN:9.55861:31.6525 +PORT SUDAN, SUDAN:19.5764:37.2158 +KHARTOUM, SUDAN:15.5894:32.5531 +WAU, SUDAN:7.72556:27.9794 +ARUSHA, TANZANIA:-3.36778:36.6333 +DAR ES SALAAM, TANZANIA:-6.87806:39.2025 +DODOMA, TANZANIA:-6.17028:35.7525 +IRINGA, TANZANIA:-7.66861:35.7519 +KILIMANJARO, TANZANIA:-3.42917:37.0744 +LAKE MANYARA, TANZANIA:-3.37611:35.8181 +MWADUI, TANZANIA:-3.51417:33.6189 +MOSHI, TANZANIA:-3.36278:37.3233 +MTWARA, TANZANIA:-10.3389:40.1817 +MWANZA, TANZANIA:-2.44444:32.9325 +NGERENGERE, TANZANIA:-6.71722:38.1536 +PEMBA, TANZANIA:-5.25722:39.8114 +TANGA, TANZANIA:-5.09222:39.0711 +ZANZIBAR, TANZANIA:-6.22194:39.2247 +ENTEBBE, UGANDA:0.0422222:32.4433 +GULU, UGANDA:2.80556:32.2717 +SOROTI, UGANDA:1.7275:33.6228 +ABILENE, USA:32.4111:W99.6817 +NANTUCKET, USA:41.2528:W70.06 +WACO, USA:31.6111:W97.2303 +ATLANTIC CITY, USA:39.4575:W74.5769 +ARDMORE, USA:34.3031:W97.0194 +CAMP SPRINGS, USA:38.8106:W76.8669 +ALEXANDRIA, USA:31.3272:W92.5483 +BUSH FIELD, USA:33.3697:W81.9644 +AKRON, USA:41.0375:W81.4667 +ALBANY, USA:42.7481:W73.8028 +ALICE, USA:27.7408:W98.0269 +AMARILLO, USA:35.2192:W101.706 +ANNISTON, USA:33.5881:W85.8581 +ANDERSEN, USA:34.495:W82.7092 +ALTOONA, USA:40.2964:W78.32 +ABERDEEN, USA:39.4661:W76.1694 +LOUISIANA, USA:30.0375:W91.8839 +WATERTOWN, USA:43.9917:W76.0217 +ATLANTA, USA:33.6403:W84.4269 +AUGUSTA, USA:44.3206:W69.7972 +AUSTIN, USA:30.1944:W97.6697 +MARYSVILLE, USA:39.1358:W121.436 +SHREVEPORT, USA:32.5017:W93.6625 +BOCA RATON, USA:26.3783:W80.1075 +BAUDETTE, USA:48.7283:W94.6122 +WINDSOR LOCKS, USA:41.9389:W72.6831 +STRATFORD, USA:41.1633:W73.1261 +BEDFORD, USA:42.4697:W71.2889 +SEATTLE, USA:47.5297:W122.302 +BAKERSFIELD, USA:35.4333:W119.057 +MOBILE, USA:30.6264:W88.0678 +BANGOR, USA:44.8072:W68.8281 +BIRMINGHAM, USA:33.5628:W86.7533 +EL PASO, USA:31.8494:W106.38 +BILOXI, USA:30.4108:W88.9236 +BUCKLEY, USA:39.7017:W104.751 +BELLINGHAM, USA:48.7925:W122.537 +BELLEVILLE, USA:38.545:W89.835 +NASHVILLE, USA:36.1244:W86.6781 +BOISE, USA:43.5642:W116.223 +BOSTON, USA:42.3642:W71.005 +BEAUMONT, USA:29.9508:W94.0206 +BROWNSVILLE, USA:25.9067:W97.4258 +BATON ROUGE, USA:30.5331:W91.1494 +BURLINGTON, USA:44.4717:W73.1531 +BUFFALO, USA:42.9403:W78.7319 +BURBANK, USA:34.2006:W118.359 +BALTIMORE, USA:39.1753:W76.6683 +BLYTHEVILLE, USA:35.9642:W89.9433 +FORT IRWIN, USA:35.2803:W116.63 +COLOMBIA, USA:33.9386:W81.1194 +CARIBOU, USA:46.8714:W68.0178 +COLOMBUS, USA:33.6439:W88.4436 +CEDAR CITY, USA:37.7008:W113.099 +CHILDRESS, USA:34.4336:W100.288 +CHICOPEE FALLS, USA:42.1981:W72.5342 +CRESTVIEW, USA:30.7786:W86.5219 +BRYAN, USA:30.7156:W96.3311 +CHATTANOOGA, USA:35.0353:W85.2036 +CHARLESTON, USA:32.8986:W80.0403 +CHICO, USA:39.7953:W121.858 +CLEVELAND, USA:41.4117:W81.8497 +COLLEGE STATION, USA:30.5883:W96.3636 +CHARLOTTE, USA:35.2139:W80.9431 +COLUMBUS, USA:39.9978:W82.8917 +CARLSBAD, USA:32.3372:W104.263 +WACO, USA:31.6378:W97.0739 +COCO BEACH, USA:28.2347:W80.61 +COLORADO SPRINGS, USA:38.8056:W104.7 +COTULLA, USA:28.4581:W99.22 +COLUMBIA, USA:38.8181:W92.2194 +CASPER, USA:42.9078:W106.464 +CORPUS CHRISTI, USA:27.7703:W97.5011 +CUTBANK, USA:48.6083:W112.376 +CINCINNATI, USA:39.0461:W84.6619 +CLOVIS, USA:34.3825:W103.322 +CALEXICO, USA:32.6694:W115.513 +CONROE, USA:30.3517:W95.4144 +CHEYENNE, USA:41.1556:W104.812 +DALLAS, USA:32.8469:W96.8517 +DAYTON, USA:39.9022:W84.2192 +WASHINGTON, USA:38.8519:W77.0375 +DENVER, USA:39.8583:W104.667 +DETROIT, USA:42.4092:W83.0097 +DALLAS-FORT WORTH, USA:32.8964:W97.0375 +DOTHAN, USA:31.3211:W85.4494 +DALHART, USA:36.0225:W102.547 +DEL RIO, USA:29.3594:W100.778 +DULUTH, USA:46.8419:W92.1936 +TUCSON, USA:32.1664:W110.883 +DOVER, USA:39.13:W75.4664 +WEST CHICAGO, USA:41.9078:W88.2486 +DERIDDER, USA:30.8317:W93.3397 +DURANGO, USA:37.1514:W107.754 +DEL RIO, USA:29.3728:W100.926 +DES MOINES, USA:41.5339:W93.6625 +DETROIT, USA:42.2122:W83.3533 +DOUGLAS, USA:31.4689:W109.604 +ABILENE, USA:32.4206:W99.8544 +ELIZABETH CITY, USA:36.2606:W76.1744 +EDWARDS AFB, USA:34.9053:W117.884 +HOUSTON, USA:29.6072:W95.1586 +EAGLE PASS, USA:28.7:W100.479 +ELKINS, USA:38.8894:W79.8569 +EL DORADO, USA:33.2208:W92.8131 +EL PASO, USA:31.8067:W106.378 +ENID, USA:36.3397:W97.9161 +WENDOVER, USA:40.7186:W114.031 +ALEXANDRIA, USA:31.3947:W92.2956 +NEW BERN, USA:35.0728:W77.0428 +NEWARK, USA:40.6922:W74.1686 +KEY WEST, USA:24.5561:W81.7594 +FORT EUSTIS, USA:37.1325:W76.6086 +FRESNO, USA:36.7761:W119.718 +FORT CARSON, USA:38.6783:W104.756 +DAYTON, USA:39.8261:W84.0483 +FORT HUACHUCA, USA:31.5883:W110.344 +FORT LAUDERDALE, USA:26.0725:W80.1525 +FLORENCE, USA:34.1853:W79.7239 +FORT LEAVENWORTH, USA:39.3683:W94.9144 +FORT MEADE, USA:39.0853:W76.7592 +FALMOUTH, USA:41.6583:W70.5214 +FARMINGTON, USA:36.7411:W108.23 +FORT MYERS, USA:26.5864:W81.8631 +FORT DODGE, USA:42.5514:W94.1925 +TOPEKA, USA:38.9508:W95.6636 +WEST HAMPTON BEACH, USA:40.8436:W72.6317 +FORT RILEY, USA:39.055:W96.7644 +FORT SILL, USA:34.6497:W98.4019 +FORT SMITH, USA:35.3364:W94.3672 +FORT KNOX, USA:37.9069:W85.9719 +FORT WORTH, USA:32.8197:W97.3622 +FORT LAUDERDALE, USA:26.1972:W80.1706 +FAYETTEVILLE, USA:36.005:W94.17 +GAGE, USA:36.2953:W99.7764 +GARDEN CITY, USA:37.9275:W100.724 +SPOKANE, USA:47.6197:W117.534 +GRAND FORKS, USA:47.9492:W97.1761 +LONGVIEW, USA:32.3847:W94.7114 +GALVESTON, USA:29.2653:W94.8603 +GRANTS, USA:35.1653:W107.901 +GAINESVILLE, USA:29.69:W82.2717 +GREEN BAY, USA:44.485:W88.1294 +FORT LEWIS, USA:47.0792:W122.581 +KILLEEN, USA:31.0672:W97.8289 +GRAND RAPIDS, USA:42.8808:W85.5228 +GOLDSBORO, USA:35.3392:W77.9606 +FORT DRUM, USA:44.0556:W75.7194 +GREAT FALLS, USA:47.4819:W111.371 +PERU, USA:40.6481:W86.1519 +GREENVILE, USA:33.0678:W96.0653 +GRANDVIEW, USA:38.8433:W94.5606 +GREENWOOD, USA:33.4942:W90.0844 +HOBART, USA:34.9911:W99.0511 +HARTFORD, USA:41.7361:W72.65 +HAWTHORNE, USA:33.9228:W118.335 +HIBBING, USA:47.3864:W92.8389 +OGDEN, USA:41.1239:W111.973 +HICKORY, USA:35.7411:W81.3894 +HELENA, USA:46.6067:W111.983 +FORT HOOD, USA:31.1386:W97.7144 +ALAMOGORDO, USA:32.8525:W106.106 +HOBBS, USA:32.6875:W103.217 +HURON, USA:44.385:W98.2283 +HOPKINSVILLE, USA:36.6683:W87.4961 +HOUSTON, USA:29.6453:W95.2789 +WHITE PLAINS, USA:41.0669:W73.7075 +HARLINGEN, USA:26.2283:W97.6542 +HARRISON, USA:36.2614:W93.1547 +MARY ESTHER, USA:30.4278:W86.6892 +HOMESTEAD, USA:25.4883:W80.3836 +HOUGHTON LAKE, USA:44.3597:W84.6711 +REDSTONE, USA:34.6786:W86.6847 +TERRE HAUTE, USA:39.4514:W87.3075 +HOULTON, USA:46.1231:W67.7919 +HAVRE, USA:48.5428:W109.762 +HOLLYWOOD, USA:26.0014:W80.2403 +WICHITA, USA:37.6228:W97.2672 +WASHINGTON, USA:38.9444:W77.4556 +NIAGARA FALLS, USA:43.1072:W78.9461 +HOUSTON, USA:29.9803:W95.3397 +WICHITA, USA:37.6497:W97.4331 +KANKAKEE, USA:41.0714:W87.8461 +KIRTLAND A.F.B., USA:35.04:W106.609 +WILMINGTON, USA:39.6786:W75.6064 +WILMINGTON, USA:34.2706:W77.9025 +INDIANAPOLIS, USA:39.7172:W86.2942 +WINK, USA:31.7794:W103.201 +INTERNATIONAL FALLS, USA:48.5661:W93.4031 +INDIAN SPRINGS, USA:36.5869:W115.673 +WINSTON-SALEM, USA:36.1336:W80.2219 +IMPERIAL, USA:32.8342:W115.579 +WILLIAMSPORT, USA:41.2419:W76.9211 +WILLISTON, USA:48.1778:W103.642 +ISLIP, USA:40.795:W73.1 +JACKSON, USA:32.3111:W90.0758 +JACKSONVILLE, USA:30.4939:W81.6878 +JONESBORO, USA:35.8317:W90.6461 +NEW YORK, USA:40.7127281:W74.0060152 +LANSING, USA:42.7786:W84.5872 +LAS VEGAS, USA:36.0803:W115.152 +LOS ANGELES, USA:34.0536909:W118.242766 +LUBBOCK, USA:33.6636:W101.823 +LAKE CHARLES, USA:30.1261:W93.2233 +COLUMBUS, USA:39.8136:W82.9278 +HAMPTON, USA:37.0828:W76.3603 +LUFKIN, USA:31.2339:W94.75 +LAFAYETTE, USA:30.2053:W91.9875 +NEW YORK, USA:40.7772:W73.8725 +LONG BEACH, USA:33.8175:W118.151 +WRIGHT, USA:31.8889:W81.5622 +LITTLE ROCK, USA:34.7294:W92.2242 +WEST PALM BEACH, USA:26.5928:W80.085 +LINCOLN, USA:40.8508:W96.7592 +LOUISVILLE, USA:38.2278:W85.6636 +LAREDO, USA:27.5436:W99.4614 +JACKSONVILLE, USA:34.9181:W92.1464 +FORT BENNING, USA:32.3372:W84.9911 +LAS VEGAS, USA:36.2361:W115.034 +ALTUS, USA:34.6669:W99.2667 +PHOENIX, USA:33.535:W112.383 +CINCINNATI, USA:39.1033:W84.4186 +MIDLAND, USA:31.9425:W102.202 +SACRAMENTO, USA:38.6675:W121.401 +TAMPA, USA:27.8492:W82.5211 +KANSAS CITY, USA:39.100105:W94.5781416 +MACON, USA:32.6928:W83.6492 +ORLANDO, USA:28.5421109:W81.3790304 +HARRISBURG, USA:40.1933:W76.7633 +CHICAGO, USA:41.85574666473487:W87.76552685185547 +MEMPHIS, USA:35.1490215:W90.0516285 +MERCED, USA:37.3803:W120.568 +MCALLEN, USA:26.1758:W98.2386 +MARIETTA, USA:33.9153:W84.5161 +SACRAMENTO, USA:38.5810606:W121.493895 +MIAMI, USA:25.804570343778067:W80.29181030761718 +MINOT, USA:48.4156:W101.357 +MILLVILLE, USA:39.3678:W75.0722 +MILWAUKEE, USA:42.9472:W87.8964 +JACKSON, USA:32.2990384:W90.1847691 +MUSKOGEE, USA:35.6575:W95.3614 +MELBOURNE, USA:28.1025:W80.645 +MCALESTER, USA:34.8822:W95.7833 +MILLINOCKET, USA:45.6478:W68.6856 +MONROE, USA:32.5108:W92.0375 +MACKMINNVILLE, USA:45.1944:W123.136 +MACON, USA:45.1264:W87.6383 +MOBILE, USA:30.6914:W88.2428 +MODESTO, USA:37.6256:W120.954 +MINOT, USA:48.2592:W101.28 +MONTPELIER, USA:44.2033:W72.5622 +MARQUETTE, USA:46.5339:W87.5617 +MADISON, USA:43.1397:W89.3375 +MINNEAPOLIS, USA:44.8803:W93.2167 +MASSENA, USA:44.9358:W74.8453 +NEW ORLEANS, USA:29.9933:W90.2578 +MOUNT CLEMENS, USA:42.6128:W82.8317 +MUIR, USA:40.4347:W76.5692 +MOUNTAIN HOME, USA:43.0433:W115.872 +GRANT COUNTY AIRPORT, USA:47.2075:W119.32 +MINERAL WELLS, USA:32.7814:W98.06 +MONTGOMERY, USA:32.3792:W86.3625 +MYRTLE BEACH, USA:33.6797:W78.9283 +BEAUFORT, USA:32.4772:W80.7231 +NEW ORLEANS, USA:29.8253:W90.035 +JACKSONVILLE, USA:34.7083:W77.4394 +LAKEHURST, USA:40.0333:W74.3533 +FALLON, USA:39.4164:W118.701 +NORFOLK, USA:36.9375:W76.2892 +PATUXENT RIVER, USA:38.2858:W76.4117 +CHINA, USA:35.6878:W117.691 +JACKSONVILLE, USA:30.2358:W81.6806 +EL CENTRO, USA:32.8292:W115.672 +CHERRY POINT, USA:34.9025:W76.8808 +MIRAMAR, USA:32.8683:W117.143 +LEMOORE, USA:36.3328:W119.952 +MERIDIAN, USA:32.5519:W88.5556 +PORT ANGELES, USA:48.1414:W123.414 +PENSACOLA, USA:30.3525:W87.3186 +MILLINGTON, USA:35.3567:W89.8703 +KINGSVILLE, USA:27.5072:W97.8097 +KEY WEST, USA:24.5758:W81.6889 +MILTON, USA:30.7242:W87.0219 +POINT MUGU, USA:34.1203:W119.121 +TUSTIN, USA:33.7061:W117.827 +OCEANA, USA:36.8206:W76.0333 +MOUNTAIN VIEW, USA:37.415:W122.048 +WHIDBEY ISLAND, USA:48.3517:W122.656 +TWENTY NINE PALMS, USA:34.2961:W116.162 +WILLOW GROVE, USA:40.1997:W75.1481 +QUANTICO, USA:38.5017:W77.3053 +JACKSONVILLE, USA:30.2186:W81.8764 +SAN DIEGO, USA:32.6992:W117.215 +OAKLAND, USA:37.7211:W122.221 +OMAHA, USA:41.1183:W95.9125 +OGDENSBURG, USA:44.6819:W75.4656 +OKLAHOMA CITY, USA:35.3931:W97.6006 +NOGALES, USA:31.4175:W110.848 +OMAHA, USA:41.3025:W95.8936 +ONTARIO, USA:34.0558:W117.601 +MIAMI, USA:25.9069:W80.2783 +CHICAGO, USA:41.9794:W87.9044 +NORFOLK, USA:36.8944:W76.2011 +ORLANDO, USA:28.5453:W81.3328 +OSCODA, USA:44.4514:W83.3939 +EVERETT, USA:47.9061:W122.281 +PANAMA CITY, USA:30.0697:W85.5764 +PINE BLUFF, USA:34.1747:W91.9344 +PLATTSBURGH, USA:44.6508:W73.4681 +WEST PALM BEACH, USA:26.6831:W80.0956 +PORTLAND, USA:45.5886:W122.597 +NEWPORT NEWS, USA:37.1317:W76.4928 +PHILADELPHIA, USA:39.8719:W75.2411 +PORT HURON, USA:42.9108:W82.5286 +PHOENIX, USA:33.4342:W112.008 +ST. PETERSBURG, USA:27.9106:W82.6872 +PITTSBURGH (PENNSYLVA), USA:40.4914:W80.2328 +PEMBINA, USA:48.9425:W97.2408 +PALMDALE, USA:34.6292:W118.084 +PONCA CITY, USA:36.7306:W97.0997 +PHILADELPHIA, USA:40.0819:W75.0106 +PRINCETON, USA:45.5597:W93.6081 +PENSACOLA, USA:30.4731:W87.1872 +FAYETTEVILLE, USA:35.1708:W79.0144 +FORT POLK, USA:31.0447:W93.1914 +PRESQUE ISLE, USA:46.6889:W68.0447 +PRESCOTT, USA:34.6544:W112.419 +PALM SPRINGS, USA:33.8294:W116.507 +PALACIOS, USA:28.7275:W96.2508 +PUEBLO MEMORIAL, USA:38.2889:W104.496 +PROVIDENCE, USA:41.7239:W71.4281 +PORTLAND, USA:43.6461:W70.3086 +RIVERSIDE, USA:33.9517:W117.445 +ROBINSON, USA:34.85:W92.3 +RAPID CITY, USA:44.145:W103.103 +RED RIVER, USA:47.9608:W97.4011 +RALEIGH-DURHAM, USA:35.8775:W78.7872 +RICHMOND, USA:37.505:W77.3194 +RANCHO MURIETA, USA:38.4886:W121.102 +RIVERSIDE, USA:33.8806:W117.259 +ROME, USA:43.2336:W75.4069 +SAN ANTONIO, USA:29.5294:W98.2789 +RENO, USA:39.4983:W119.768 +ROCHESTER, USA:43.1186:W77.6722 +ROSWELL, USA:33.3014:W104.531 +FORT MYERS, USA:26.5361:W81.755 +SACRAMENTO, USA:38.5125:W121.493 +SANTA FE, USA:35.6167:W106.088 +SAN DIEGO, USA:32.7333:W117.189 +SAN ANTONIO, USA:29.5336:W98.4697 +SAVANNAH, USA:32.1275:W81.2019 +GWINN, USA:46.3536:W87.3958 +SANTA BARBARA, USA:32.6083:W82.3686 +SALISBURY, USA:38.3403:W75.5103 +STOCKTON, USA:37.8942:W121.239 +SEATTLE, USA:47.59840153253106:W122.31143714060059 +SELMA, USA:32.3439:W86.9878 +SPOKANE, USA:47.6828:W117.322 +SAN FRANCISCO, USA:37.74594738515095:W122.44299445520019 +SMITHFIELD, USA:41.9206:W71.4911 +SHREVEPORT, USA:32.4464:W93.8256 +SAN JOSE, USA:37.32149403063839:W121.9286918256836 +SAN ANGELO, USA:31.3575:W100.496 +SPOKANE, USA:47.615:W117.656 +SAN ANTONIO, USA:29.3842:W98.5808 +SANDUSKY, USA:41.4333:W82.6522 +SALT LAKE CITY, USA:40.7883:W111.978 +SACRAMENTO, USA:38.6953:W121.591 +SANTA ANA, USA:33.6756:W117.868 +SAN LUIS, USA:45.7725:W122.862 +ST. PETERSBURG, USA:27.765:W82.6269 +WICHITA FALLS, USA:33.9886:W98.4917 +SUMTER, USA:33.9728:W80.4728 +ST. LOUIS, USA:38.7475:W90.3597 +FAIRFIELD, USA:38.2625:W121.927 +SIOUX CITY, USA:42.4025:W96.3842 +HUNTER AAF, USA:32.01:W81.1456 +NEWBURGH, USA:41.5039:W74.1047 +SYRACUSE, USA:43.1111:W76.1061 +KNOBNOSTER, USA:38.7303:W93.5478 +FORT LEONARDWOOD, USA:37.7414:W92.1406 +TUCUMCARI, USA:35.1828:W103.603 +TACOMA, USA:47.1375:W122.476 +TRUTH OR CONSEQUENCES, USA:33.2369:W107.272 +TETERBORO, USA:40.8497:W74.0608 +OKLAHOMA CITY, USA:35.4147:W97.3864 +TALLAHASSEE, USA:30.3964:W84.3503 +KENDALL-TAMIAMI, USA:25.6478:W80.4328 +MIAMI, USA:25.8617:W80.8969 +TONOPAH, USA:37.7944:W116.779 +TAMPA, USA:27.9753:W82.5331 +TRENTON, USA:40.2767:W74.8133 +TULSA, USA:36.1983:W95.8881 +TUCSON, USA:32.1161:W110.941 +TEXARKANA, USA:33.4536:W93.9908 +TYLER, USA:32.3539:W95.4022 +KNOXVILLE, USA:35.8122:W83.9928 +CHICAGO, USA:42.4219:W87.8678 +VALDOSTA, USA:30.9678:W83.1928 +LOMPOC, USA:34.7294:W120.577 +VICTORVILLE, USA:34.5931:W117.379 +VALPARAISO, USA:30.4831:W86.5253 +VERO BEACH, USA:27.6556:W80.4178 +WALLOPS ISLAND, USA:37.94:W75.4664 +MACON, USA:32.64:W83.5917 +WRIGHTSTOWN, USA:40.0156:W74.5936 +WHITE SANDS, USA:32.3414:W106.403 +WILDWOOD, USA:39.0083:W74.9081 +DETROIT, USA:42.2378:W83.5303 +YOUNGSTOWN, USA:41.2606:W80.6789 +YUMA, USA:32.6564:W114.606 +ZUNI PUEBLO, USA:35.0833:W108.792 +TIRANA, ALBANIA:41.4147:19.7206 +BOURGAS, BULGARIA:42.5689:27.5139 +GORNA ORECHOVICA, BULGARIA:43.1514:25.7128 +PLOVDIV, BULGARIA:42.0678:24.8508 +SOFIA, BULGARIA:42.695:23.4061 +STARA ZAGORA, BULGARIA:42.3767:25.655 +VARNA, BULGARIA:43.2319:27.825 +LARNACA, CYPRUS:34.875:33.6247 +PAPHOS, CYPRUS:34.7178:32.4856 +AKROTIRI, CYPRUS:34.5903:32.9878 +DUBROVNIK, CROATIA:42.5611:18.2681 +CEPIN, CROATIA:45.5419:18.6361 +OSIJEK, CROATIA:45.4625:18.8114 +PULA, CROATIA:44.8933:13.9219 +GROBNIK, CROATIA:45.3794:14.5036 +RIJEKA, CROATIA:45.2167:14.57 +SPLIT, CROATIA:43.5389:16.2978 +VARAZDIN, CROATIA:46.2947:16.3811 +ZAGREB, CROATIA:45.7428:16.0686 +ZADAR, CROATIA:44.1081:15.3467 +UDBINA, CROATIA:44.5575:15.7742 +ALBACETE, SPAIN:38.9483:W1.86333 +ALICANTE, SPAIN:38.2819:W0.558056 +ALMERIA, SPAIN:36.8439:W2.37 +AVILES, SPAIN:43.5633:W6.03444 +CORDOBA, SPAIN:37.8419:W4.84861 +BILBAO, SPAIN:43.3008:W2.91056 +BURGOS, SPAIN:42.3575:W3.62056 +BARCELONA, SPAIN:41.40016140348051:2.159836908862287 +BADAJOZ, SPAIN:38.8911:W6.82111 +LA CORUNA, SPAIN:43.3019:W8.37722 +GRANADA, SPAIN:37.1331:W3.63556 +GERONA, SPAIN:41.9008:2.76028 +GRANADA, SPAIN:37.1886:W3.77722 +MADRID, SPAIN:40.44076992155027:W3.68693134643554 +IBIZA, SPAIN:38.9743901:1.4197463 +JEREZ, SPAIN:36.7444:W6.06 +MURCIA, SPAIN:37.7747:W0.812222 +LEON, SPAIN:42.5889:W5.65556 +MALAGA, SPAIN:36.6736:W4.49889 +MENORCA, SPAIN:39.8625:4.21861 +SEVILLA, SPAIN:37.1747:W5.61583 +OCANA, SPAIN:39.9375:W3.50333 +PALMA DE MALLORCA, SPAIN:39.55:2.73333 +PAMPLONA, SPAIN:42.77:W1.64611 +MURCIA, SPAIN:37.9511:W1.23028 +REUS, SPAIN:41.1472:1.16694 +ROTA, SPAIN:36.645:W6.34944 +SALAMANCA, SPAIN:40.9519:W5.50194 +SON BONET, SPAIN:39.5989:2.70278 +PALMA DE MALLORCA, SPAIN:39.5517:2.73861 +SAN LUIS, SPAIN:39.8622:4.25833 +SAN SEBASTIAN, SPAIN:43.3564:W1.79056 +SANTIAGO, SPAIN:42.8961:W8.415 +SEO DE URGEL, SPAIN:42.3386:1.40917 +VALENCIA, SPAIN:39.4892:W0.481389 +VALLADOLID, SPAIN:41.7061:W4.85194 +VITORIA, SPAIN:42.8828:W2.72444 +VIGO, SPAIN:42.2317:W8.62667 +SANTANDER, SPAIN:43.4269:W3.82 +ZARAGOZA, SPAIN:41.6661:W1.04139 +SEVILLA, SPAIN:37.4178:W5.89306 +PERONNE, FRANCE:49.8689:3.02778 +NANGIS, FRANCE:48.5936:3.005 +BAGNOLE-DE-L'ORNE, FRANCE:48.5458:W0.387222 +ALBERT, FRANCE:49.9714:2.69972 +LE TOURQUET, FRANCE:50.5147:1.62722 +VALENCIENNES, FRANCE:50.3256:3.46111 +AMIENS, FRANCE:49.8714:2.38639 +AGEN, FRANCE:44.1747:0.590556 +CAZAUX, FRANCE:44.5333:W1.125 +BORDEAUX, FRANCE:44.841225:W0.5800364 +BERGERAC, FRANCE:44.8534568:0.487531 +TOULOUSE, FRANCE:43.6044622:1.4442469 +COGNAC, FRANCE:45.693165:W0.325018 +POITIERS, FRANCE:46.5875:0.306667 +MONTLUCON-GUERET, FRANCE:46.2244:2.36306 +LIMOGES, FRANCE:45.8628:1.17944 +MONT-DE-MARSAN, FRANCE:43.9117:W0.5075 +NIORT, FRANCE:46.3111:W0.401389 +TOULOUSE, FRANCE:43.6044622:1.4442469 +PAU, FRANCE:43.38:W0.418611 +LA ROCHELLE, FRANCE:46.17127895533832:W1.1405420877441474 +TARBES, FRANCE:43.1786:W0.00638889 +ANGOULEME, FRANCE:45.7292:0.221389 +BRIVE, FRANCE:45.1508:1.46917 +PERIGUEUX, FRANCE:45.1981:0.815556 +BIARRITZ-BAYONNE, FRANCE:43.4683:W1.52306 +CAHORS, FRANCE:44.3511:1.47528 +ST.-GIRONS, FRANCE:43.0075:1.10306 +ARCACHON, FRANCE:44.5964:W1.11083 +ALBI, FRANCE:43.9136:2.11306 +CASTRES, FRANCE:43.5561:2.28917 +TOULOUSE, FRANCE:43.5861:1.49917 +MILLAU, FRANCE:43.99:3.18306 +RODEZ, FRANCE:44.4078:2.4825 +USSEL, FRANCE:45.5347:2.42389 +VILLENEUVE-SUR-LOT, FRANCE:44.3969:0.758889 +ROYAN, FRANCE:45.6281:W0.9725 +MIMIZAN, FRANCE:44.1461:W1.17444 +AIRE-SUR-L'ADOUR, FRANCE:43.7094:W0.245278 +MONTAUBAN, FRANCE:44.0256:1.37778 +AUCH, FRANCE:43.6878:0.601667 +LIBOURNE, FRANCE:44.9822:W0.134722 +PAMIERS, FRANCE:43.0906:1.69583 +MARMANDE, FRANCE:44.4989:0.200278 +ROCHEFORT, FRANCE:45.8878:W0.983056 +OUESSANT, FRANCE:48.4628:W5.06389 +PONTIVY, FRANCE:48.0583:W2.92167 +GUISCRIFF-SCAER, FRANCE:48.0525:W3.66444 +ILE D'YEU, FRANCE:46.7186:W2.39111 +ANCENIS, FRANCE:47.4081:W1.1775 +BRIENNE-LE CHATEAU, FRANCE:48.4297:4.48111 +COLMAR, FRANCE:48.1097:7.35889 +BEAUNE, FRANCE:47.0058:4.89333 +DOLE, FRANCE:47.0389:5.42722 +JOIGNY, FRANCE:47.9922:3.39222 +VERDUN, FRANCE:49.1222:5.46889 +AUBENAS-VALS-LANAS, FRANCE:44.5442:4.37194 +LE PUY, FRANCE:45.0794:3.76472 +ST.-FLOUR, FRANCE:45.0764:2.99361 +BOURG, FRANCE:46.2008:5.29194 +VILEFRANCE, FRANCE:45.9164:4.64056 +MOULINS, FRANCE:46.5344:3.42361 +CASSAGNES-BEGHONES, FRANCE:44.1775:2.515 +TOULOUSE, FRANCE:43.5689:1.48083 +METZ, FRANCE:48.9822:6.25361 +BASTIA, CORSE ISL.:42.5539:9.48333 +CALVI, CORSE ISL.:42.5306:8.79306 +FIGARI, CORSE ISL.:41.5006:9.09778 +AJACCIO, CORSE ISL.:41.9236:8.80278 +PROPRIANO, FRANCE:41.6631:8.89028 +SOLENZARA, CORSE ISL.:41.9242:9.40583 +CORTE, FRANCE:42.2936:9.19306 +AUXERRE, FRANCE:47.85:3.49694 +CHAMBERY, FRANCE:45.6378:5.88 +CLERMONT FERRAND, FRANCE:45.7864:3.16917 +BOURGES, FRANCE:47.0581:2.37028 +CHAMBERY, FRANCE:45.5608:5.97556 +CHALON, FRANCE:46.8258:4.8175 +ANNEMASSE, FRANCE:46.1919:6.26833 +LYON, FRANCE:45.7261:5.09083 +MACON, FRANCE:46.295:4.79556 +ST.-YAN, FRANCE:46.4125:4.01306 +ROANNE, FRANCE:46.0583:4.00139 +ANNECY, FRANCE:45.9292:6.09861 +GRENOBLE, FRANCE:45.3628:5.32917 +MONTLUCON, FRANCE:46.3525:2.57028 +VALENCE, FRANCE:44.9214:4.96972 +VICHY, FRANCE:46.1694:3.40361 +AURILLAC, FRANCE:44.8914:2.42194 +CHATEAUROUX, FRANCE:46.8619:1.73056 +LYON, FRANCE:45.7281:4.94472 +AIX-LES-MILLES, FRANCE:43.5053:5.36778 +LE LUC, FRANCE:43.3844:6.38694 +CANNES, FRANCE:43.5419:6.95333 +ST.-ETIENNE, FRANCE:45.5403:4.29639 +ISTRES, FRANCE:43.5225:4.92361 +CARCASSONNE, FRANCE:43.2158:2.30611 +MARSEILLE, FRANCE:43.29031232666344:5.397847473754878 +NICE, FRANCE:43.71335521461014:7.2626405438720765 +ORANGE, FRANCE:44.1371311:4.8078783 +PERPIGNAN, FRANCE:42.7403:2.87056 +LE CASTELLET, FRANCE:43.2525:5.785 +ALES, FRANCE:44.0694:4.14194 +MONTPELLIER, FRANCE:43.5761:3.96278 +BEZIERS, FRANCE:43.3239:3.35556 +AVIGNON, FRANCE:43.9072:4.90167 +SALON, FRANCE:43.6064:5.10917 +LEZIGNAN-CORBIERES, FRANCE:43.1758:2.73417 +MENDE, FRANCE:44.5019:3.53278 +CARPENTRAS, FRANCE:44.0297:5.07806 +AVORD, FRANCE:47.0533:2.6325 +BEAUVAIS, FRANCE:49.4544:2.11278 +CHATEAUDUN, FRANCE:48.0581:1.37639 +SAUMUR, FRANCE:47.2567:W0.115 +EVREUX, FRANCE:49.0286:1.21972 +LE HAVRE, FRANCE:49.5339:0.0880556 +ABBEVILLE, FRANCE:50.1433:1.83167 +ORLEANS, FRANCE:47.9878:1.76056 +CHALONS, FRANCE:48.7758:4.18444 +ROUEN, FRANCE:49.4404591:1.0939658 +TOURS, FRANCE:47.4322:0.7275 +CHOLET, FRANCE:47.0819:W0.876944 +LAVAL, FRANCE:48.0311:W0.742778 +ORLEANS, FRANCE:47.8969:2.16333 +PARIS, FRANCE:48.8566969:2.3514616 +CREIL, FRANCE:49.2533:2.51889 +COULOMMIERS, FRANCE:48.8375:3.01611 +MELUN, FRANCE:48.6047:2.67111 +TOUSSOUS-LE-NOBLE, FRANCE:48.7517:2.10611 +PONTOISE, FRANCE:49.0964:2.04083 +VILLACOUBLAY, FRANCE:48.7742:2.20139 +BRETIGNY-SUR-ORGE, FRANCE:48.5967:2.33139 +REIMS, FRANCE:49.2078:4.15667 +TROYES, FRANCE:48.3228:4.01778 +LUNEVILLE, FRANCE:48.5972:6.54472 +ETAIN, FRANCE:49.2267:5.67194 +AUTUN, FRANCE:46.9664:4.26028 +NEVERS, FRANCE:47.0011:3.11444 +CAMBRAI, FRANCE:50.2217:3.15417 +MAUBEUGE, FRANCE:50.3103:4.03306 +BESANCON-LA-VEZE, FRANCE:47.2083:6.08306 +PHALSBOURG, FRANCE:48.7661:7.20028 +LILLE, FRANCE:50.5617:3.08944 +MERVILLE, FRANCE:50.6183:2.64222 +CHARLEVILLE, FRANCE:49.7839:4.64694 +VESOUL-FROTEY, FRANCE:47.6375:6.20389 +ANGERS, FRANCE:47.4972:W0.5725 +BREST, FRANCE:48.4478:W4.41833 +CHERBOURG, FRANCE:49.65:W1.47028 +DINARD, FRANCE:48.5878:W2.08 +LA BAULE, FRANCE:47.2894:W2.34639 +GRANVILLE, FRANCE:48.8831:W1.56417 +DEAUVILLE, FRANCE:49.3653:0.154167 +LORIENT, FRANCE:47.7606:W3.44 +LA ROCHE-SUR-YON, FRANCE:46.7019:W1.37861 +LANDIVISIAU, FRANCE:48.53:W4.15139 +CAEN, FRANCE:49.1733:W0.45 +LANVEDOC, FRANCE:48.2817:W4.445 +LE MANS, FRANCE:47.9486:0.201667 +RENNES, FRANCE:48.0694:W1.73472 +LANNION, FRANCE:48.7542:W3.47139 +QUIMPER, FRANCE:47.9747:W4.16778 +NANTES, FRANCE:47.1531:W1.61056 +ST.-BRIEUC ARMOR, FRANCE:48.5378:W2.85444 +MORLAIX, FRANCE:48.6031:W3.81556 +VANNES, FRANCE:47.7231:W2.71833 +ST.-NAZAIRE, FRANCE:47.3119:W2.14917 +MULHOUSE, FRANCE:47.5894:7.52972 +COLMAR, FRANCE:47.9219:7.39944 +DIJON, FRANCE:47.2689:5.09 +METZ, FRANCE:49.0717:6.13167 +EPINAL, FRANCE:48.3247:6.06972 +HAGUENAU, FRANCE:48.7933:7.81611 +ST.-DIZIER, FRANCE:48.6358:4.89917 +TOUL, FRANCE:48.78:5.97972 +MONTBELIARD, FRANCE:47.4869:6.7925 +NANCY, FRANCE:48.6919:6.23028 +NANCY, FRANCE:48.5831:5.955 +PONTARLIER, FRANCE:46.9044:6.32694 +REIMS, FRANCE:49.31:4.05 +STRASSBOURG, FRANCE:48.5381:7.62806 +LUXEUIL, FRANCE:47.7831:6.36389 +CUERS, FRANCE:43.2478:6.12667 +HYERES, FRANCE:43.0972:6.14583 +NIMES, FRANCE:43.7572:4.41611 +MIQUELON, FRANCE:47.0953:W56.3803 +ST.-PIERRE, ST. PIERRE & MIQUELON:46.7625:W56.1753 +AMBERIEU, FRANCE:45.9872:5.32833 +APT, FRANCE:44.0567:5.49528 +DAMBLAIN, FRANCE:48.0847:5.665 +CAMBRAI, FRANCE:50.1414:3.26306 +BROYE-LES-PESMES, FRANCE:47.335:5.51361 +LURE, FRANCE:47.7044:6.54583 +ST.-SIMON, FRANCE:49.7583:3.21194 +ANDRAVIDA, GREECE:37.9206:21.2925 +AGRINION, GREECE:38.6019:21.3511 +ALEXANDROUPOLIS, GREECE:40.8558:25.9561 +ATHENS, GREECE:37.9839412:23.7283052 +ALEXANDRIA, GREECE:35.50580479245094:24.024996747143533 +NEA ANGHIALOS, GREECE:39.2194:22.7942 +ELEFSIS, GREECE:38.0636:23.5558 +CHIOS, GREECE:38.3431:26.1406 +IOANNINA, GREECE:39.6964:20.8225 +HERAKLION, GREECE:35.3394:25.1803 +KASTORIA, GREECE:40.4494:21.2761 +KITHIRA, GREECE:36.2742:23.0169 +KEFFALLINIA, GREECE:38.1197:20.5006 +KALAMATA, GREECE:37.0683:22.0256 +KAVALA, GREECE:40.9722:24.3417 +KOS, GREECE:36.891437287176245:27.281127520593273 +KARPATHOS, GREECE:35.4214:27.1458 +KERKYRA/CORFU, GREECE:39.6019:19.9117 +KASOS, GREECE:35.4211:26.91 +KAVALA, GREECE:40.9131:24.6192 +KOZANI, GREECE:40.2861:21.8408 +LEROS, GREECE:37.1847:26.8003 +LIMNOS, GREECE:39.9169:25.2361 +LARISSA, GREECE:39.65:22.4653 +MEGARA, GREECE:37.9811:23.3653 +MYKONOS, GREECE:37.435:25.3481 +MARATHON, GREECE:38.145:24.0142 +MYTILINI, GREECE:39.0567:26.5983 +PREVEZA, GREECE:38.9253:20.7653 +RHODOS, GREECE:36.3831:28.1089 +RHODOS, GREECE:36.4053:28.0861 +PATRAS, GREECE:38.1511:21.4256 +CHANIA, GREECE:35.5317:24.1494 +SKIATHOS, GREECE:39.1769:23.5036 +SAMOS, GREECE:37.69:26.9117 +SYROS, GREECE:37.4228:24.9508 +SPARTI, GREECE:36.9733:22.5261 +SANTORINI, GREECE:36.4003:25.4786 +SITIA, GREECE:35.2136:26.0975 +STEFANOVIKION, GREECE:39.48:22.7672 +SKIROS, GREECE:38.9675:24.4872 +TANAGRA, GREECE:38.3397:23.5647 +KASTELI, GREECE:35.1869:25.3267 +TRIPOLIS, GREECE:37.5308:22.405 +THESSALONIKI, GREECE:40.5197:22.9708 +DEKELIA, GREECE:38.1089:23.7836 +ZAKYNTHOS, GREECE:37.75:20.8819 +BUDAPEST, HUNGARY:47.4367:19.2556 +DEBRECEN, HUNGARY:47.4889:21.6153 +GODOLLO, HUNGARY:47.5708:19.3386 +KECSKEMET, HUNGARY:46.9175:19.7492 +KAPOSVAR, HUNGARY:46.3892:17.7314 +NYIRREGYHAZA, HUNGARY:47.9839:21.6922 +OCSENY, HUNGARY:46.3039:18.7692 +PAPA, HUNGARY:47.3639:17.5008 +AZENTKILYSZABADJA, HUNGARY:47.0778:17.9683 +SIOFOK, HUNGARY:46.8581:18.0956 +SARMELLEK, HUNGARY:46.6864:17.1589 +SZOLNOK, HUNGARY:47.1228:20.2353 +TASZAR, HUNGARY:46.3931:17.9172 +TOKOL, HUNGARY:47.3453:18.9808 +AMENDOLA, ITALY:41.5386:15.7133 +CROTONE, ITALY:38.9972:17.08 +BARI, ITALY:41.1383:16.7606 +FOGGIA, ITALY:41.4328:15.535 +GROTTAGLIE, ITALY:40.5161:17.4022 +LECCE, ITALY:40.2386:18.1331 +PESCARA, ITALY:42.4314:14.1808 +BRINDISI, ITALY:40.6575:17.9469 +GIOIA DEL COLLE, ITALY:40.7678:16.9333 +LAMEZIA, ITALY:38.9064:16.2422 +CATANIA, ITALY:37.4667:15.0661 +LAMPEDUSA, ITALY:35.4978:12.6181 +PANTELLERIA, ITALY:36.8164:11.9686 +PALERMO, ITALY:38.1758:13.0908 +PALERMO, ITALY:38.1108:13.3133 +REGGIO CALABRIA, ITALY:38.0711:15.6514 +TRAPANI, ITALY:37.9125:12.4881 +SIGONELLA, ITALY:37.4014:14.9222 +ALGHERO, ITALY:40.6319:8.29056 +DECIMOMANNU, ITALY:39.3542:8.97222 +CAGLIARI, ITALY:39.2514:9.05417 +OLBIA, ITALY:40.8986:9.5175 +TORTOLI, ITALY:39.9186:9.68278 +ROME, ITALY:41.8933203:12.4829321 +TURIN, ITALY:45.0677551:7.6824892 +MILANO, ITALY:45.5397:9.20222 +MILANO, ITALY:45.6314:8.72778 +BERGAMO, ITALY:45.6739:9.70417 +TORINO, ITALY:45.2006:7.64944 +ALBENGA, ITALY:44.0506:8.12722 +GENOA, ITALY:44.4119:8.84167 +MILAN, ITALY:45.4453:9.27694 +CAMERI, ITALY:45.5294:8.66917 +PARMA, ITALY:44.8244:10.2961 +PIACENZA, ITALY:44.9131:9.72333 +AOSTA, ITALY:45.7383:7.36778 +LEVALDIGI, ITALY:44.5464:7.62222 +AVIANO, ITALY:46.0317:12.5964 +BOLZANO, ITALY:46.4606:11.3261 +CERVIA, ITALY:44.2236:12.3061 +BOLOGNA, ITALY:44.5342:11.2903 +TREVISO, ITALY:45.6486:12.1953 +RIVOLTO, ITALY:45.9806:13.0544 +FORLI, ITALY:44.1947:12.07 +GHEDI, ITALY:45.4319:10.2675 +VERONA, ITALY:45.4719:10.9278 +MONTICHIARI, ITALY:45.4289:10.3306 +RONCHI DE LEGIONARI, ITALY:45.8278:13.4664 +RIMINI, ITALY:44.0203:12.6119 +TREVISO, ITALY:45.6844:12.0861 +VICENZA, ITALY:45.5742:11.5306 +PADOVA, ITALY:45.3956:11.8478 +VILLAFRANCA, ITALY:45.3956:10.8883 +VENICE, ITALY:45.505:12.3517 +SIENA, ITALY:43.2572:11.2542 +PRATICA DI MARE, ITALY:41.6536:12.4444 +GUIDONIA, ITALY:41.9903:12.7408 +SALERNO, ITALY:40.6203:14.9111 +MARINA DI CAMPO, ITALY:42.7603:10.2394 +LATINA, ITALY:41.5422:12.9089 +GRAZZANISE, ITALY:41.0608:14.0819 +NAPLES, ITALY:40.8858:14.2906 +PISA, ITALY:43.6839:10.3925 +FIRENZE, ITALY:43.8097:11.205 +GROSSETO, ITALY:42.7608:11.0722 +VITERBO, ITALY:42.4303:12.0642 +PERUGIA, ITALY:43.0958:12.5131 +CERKLJE, SLOVENIA:45.8997:15.53 +LJUBLIANA, SLOVENIA:46.2236:14.4575 +MARIBOR, SLOVENIA:46.4797:15.6861 +PORTOROZ, SLOVENIA:45.4733:13.6147 +SLOVENJ GRADEC, SLOVENIA:46.4719:15.1169 +CESKE BUDEJOVICE, CZECH REPUBLIC:48.9461:14.4272 +CHOTEBOR, CZECH REPUBLIC:49.6844:15.6761 +CASLAV, CZECH REPUBLIC:49.9394:15.3817 +HRADEC KRALOVE, CZECH REPUBLIC:50.2531:15.845 +PRAHA, CZECH REPUBLIC:50.1211:14.5436 +KUNOVICE, CZECH REPUBLIC:49.0294:17.4397 +KARLOVY VARY, CZECH REPUBLIC:50.2028:12.9147 +LINE, CZECH REPUBLIC:49.675:13.2744 +MNICHOVO HRADISTE, CZECH REPUBLIC:50.54:15.0064 +OSTRAVA, CZECH REPUBLIC:49.6964:18.1111 +NAMEST, CZECH REPUBLIC:49.1658:16.1247 +PARDUBICE, CZECH REPUBLIC:50.0133:15.7386 +PRIBRAM, CZECH REPUBLIC:49.7186:14.0969 +PREROV, CZECH REPUBLIC:49.4258:17.4047 +PRAGUE, CZECH REPUBLIC:50.1008:14.26 +SOBESLAV, CZECH REPUBLIC:49.2447:14.7136 +TURANY, CZECH REPUBLIC:49.1511:16.6942 +VODOCHODY, CZECH REPUBLIC:50.2164:14.3956 +TEL-AVIV, ISRAEL:32.0094:34.8767 +BEER-SHEBA, ISRAEL:31.2869:34.7228 +TEL-NOF, ISRAEL:31.8394:34.8217 +EYN-SHEMER, ISRAEL:32.4408:35.0061 +ELAT, ISRAEL:29.5611:34.96 +EYN-YAHAV, ISRAEL:30.6231:35.2019 +HAIFA, ISRAEL:32.8111:35.0439 +HAZTOR, ISRAEL:31.7625:34.7272 +ROSH PINA, ISRAEL:32.9808:35.5717 +JERUSALEM, ISRAEL:31.8667:35.2167 +TEL-AVIV FIR/CTA/UTA, ISRAEL:31.2286:35.1908 +MEGIDO AIRSTRIP, ISRAEL:32.5986:35.2283 +METZADA, ISRAEL:31.3281:35.3883 +NEVATIM, ISRAEL:31.2083:35.0122 +OVDA, ISRAEL:29.94:34.9358 +RAMAT DAVID, ISRAEL:32.6603:35.1822 +RAMON, ISRAEL:30.7761:34.6667 +TEL-AVIV, ISRAEL:32.1144:34.7819 +MALTA, MALTA:35.8572:14.4775 +MALTA ACC, MALTA:35.9167:14.4167 +WIENER NEUSTADT OST, AUSTRIA:47.8433:16.26 +WELS, AUSTRIA:48.1831:14.0408 +GRAZ, AUSTRIA:47:15.4333 +INNSBRUCK, AUSTRIA:47.26:11.3439 +KLAGENFURT, AUSTRIA:46.65:14.3333 +LINZ, AUSTRIA:48.2333:14.1833 +VIENNA, AUSTRIA:48:16.5 +SALZBURG, AUSTRIA:47.7931:13.0042 +VIENNA, AUSTRIA:48.1103:16.5697 +GRAZ, AUSTRIA:46.9908:15.4394 +KLAGENFURT, AUSTRIA:46.6425:14.3375 +LINZ, AUSTRIA:48.2331:14.1875 +LANGENLEBARN, AUSTRIA:48.3208:16.1117 +ZELTWEG, AUSTRIA:47.2028:14.7442 +ALVERCA, ACORES:38.8831:W9.03 +SANTA MARIA (ISLAND), ACORES:36.9714:W25.1706 +BRAGANCA, ACORES:41.8683:W6.71194 +BEJA (MADEIRA), ACORES:38.0789:W7.93222 +BRAGA, ACORES:41.5869:W8.445 +COIMBA, ACORES:40.1572:W8.47 +CASCAIS, ACORES:38.725:W9.355 +COVILHA, ACORES:40.2647:W7.47972 +EVORA, ACORES:38.5333:W7.88944 +FLORES (FLORES ISL.), ACORES:39.455:W31.1311 +FARO, ACORES:37.0142:W7.96583 +GRACIOSA ISLAND, ACORES:39.0919:W28.0297 +HORTA, ACORES:38.5197:W28.7158 +ESPINHO, PORTUGAL:40.9742:W8.64528 +LAJES (TERCEIRA ISLAND), ACORES:38.7642:W27.0933 +LISBON, PORTUGAL:38.7167:W9.15583 +MONTE REAL, ACORES:39.8311:W8.88722 +MONTIJO, ACORES:38.7036:W9.03583 +OVAR, PORTUGAL:40.9158:W8.64583 +PONTA DELGADA, ACORES:37.7411:W25.6978 +PICO, ACORES:38.5544:W28.4397 +PORTIMAO, ACORES:37.1492:W8.58389 +PORTO, ACORES:41.2481:W8.68139 +PORTO SANTO, MADEIRA:33.0733:W16.3497 +LISBON, PORTUGAL:38.7811:W9.13583 +SAO JORGE ISLAND, ACORES:38.6653:W28.1756 +SINTRA, ACORES:38.8308:W9.33944 +TANCOS, ACORES:39.475:W8.36444 +VILA REAL, ACORES:41.2742:W7.72028 +VISEU, ACORES:40.7253:W7.88889 +BANJA LUKA, BOSNIA-HERCEGOVINA:44.9414:17.2975 +MOSTAR, BOSNIA-HERCEGOVINA:43.2828:17.8458 +SARAJEVO, BOSNIA-HERCEGOVINA:43.8244:18.3314 +ARAD, ROMANIA:46.1764:21.2619 +BACAU, ROMANIA:46.5219:26.9103 +BAIA MARE, ROMANIA:47.6583:23.47 +BUCHAREST, ROMANIA:44.5031:26.1019 +CONSTANTA, ROMANIA:44.3622:28.4883 +CLUJ-NAPOCA, ROMANIA:46.785:23.6861 +CARANSEBES, ROMANIA:45.42:22.2533 +CRAIOVA, ROMANIA:44.3181:23.8886 +IASI, ROMANIA:47.1789:27.62 +ORADEA, ROMANIA:47.0253:21.9025 +BUCHAREST, ROMANIA:44.5736:26.1033 +SIBIU, ROMANIA:45.7856:24.0911 +SATU MARE, ROMANIA:47.7033:22.8856 +SUCEAVA, ROMANIA:47.6875:26.3539 +TULCEA, ROMANIA:45.0622:28.7142 +TIRGU MURES, ROMANIA:46.4675:24.4125 +TIMISOARA, ROMANIA:45.81:21.3378 +ZURICH AREA, SWITZERLAND:46.6136:7.67778 +LES EPLATURES, SWITZERLAND:47.0836:6.79278 +GENEVA, SWITZERLAND:46.2381:6.10889 +SAANEN, SWITZERLAND:46.4875:7.25083 +SION, SWITZERLAND:46.2194:7.32667 +ALPNACH, SWITZERLAND:46.9439:8.28417 +ULRICHEN, SWITZERLAND:46.5011:8.29556 +DUBENDORF, SWITZERLAND:47.3986:8.64806 +EMMEN, SWITZERLAND:47.0922:8.305 +MOLLIS, SWITZERLAND:47.0786:9.06472 +INTERLAKEN, SWITZERLAND:46.6764:7.87917 +TURTMANN, SWITZERLAND:46.3039:7.71444 +MEIRINGEN, SWITZERLAND:46.7433:8.11 +RARON, SWITZERLAND:46.3036:7.82333 +PAYERNE, SWITZERLAND:46.8431:6.915 +BUOCHS, SWITZERLAND:46.9747:8.39889 +ZURICH, SWITZERLAND:47.3833:8.56667 +LUGANO, SWITZERLAND:46.0042:8.91056 +BERN, SWITZERLAND:46.9139:7.49694 +GRENCHEN, SWITZERLAND:47.1814:7.41694 +ZURICH, SWITZERLAND:47.4647:8.54917 +ALTENRHEIN, SWITZERLAND:47.485:9.56056 +SAMEDAN, SWITZERLAND:46.5325:9.88278 +ANKARA ACC/FIR/FIC, TURKEY:40:32 +ANKARA, TURKEY:39.9347:32.7406 +ANKARA, TURKEY:40.1281:32.995 +ANKARA, TURKEY:39.9497:32.6886 +ANKARA, TURKEY:40.0789:32.5656 +ADANA, TURKEY:36.9819:35.2803 +ADANA, TURKEY:37.0019:35.4258 +AFYON, TURKEY:38.7261:30.6011 +ANTALYA, TURKEY:36.9014:30.7917 +GAZIANTEP, TURKEY:36.9481:37.4792 +ISKENDERUN, TURKEY:36.5733:36.1539 +KASTAMONU, TURKEY:41.3139:33.7958 +KONYA, TURKEY:37.9789:32.5617 +MERZIFON, TURKEY:40.8292:35.5219 +SAMSUN, TURKEY:41.2764:36.3036 +SIVAS, TURKEY:39.8136:36.9033 +ZONGULDAK, TURKEY:41.5158:32.0997 +MALATYA, TURKEY:38.4358:38.0917 +KAYSERI, TURKEY:38.7703:35.4953 +SIVRIHISAR, TURKEY:39.4514:31.3653 +TOKAT, TURKEY:40.305:36.3678 +EREGLI, TURKEY:41.2544:31.415 +DENIZLI, TURKEY:37.785:29.7011 +NEVSEHIR, TURKEY:38.7717:34.5342 +ISTANBUL, TURKEY:41.05497681583172:28.908688006982437 +AYDIN, TURKEY:37.8158:27.8861 +BURSA, TURKEY:40.2317:29.0092 +BALIKESIR, TURKEY:39.6189:27.9247 +BANDIRMA, TURKEY:40.3178:27.9775 +CANAKKALE, TURKEY:40.1375:26.4267 +ESKISEHIR, TURKEY:39.7839:30.5819 +IZMIR, TURKEY:38.2922:27.1569 +ISPARTA, TURKEY:37.7853:30.5817 +KUTAHYA, TURKEY:39.4267:30.0164 +USAK, TURKEY:38.6811:29.4714 +YALOVA, TURKEY:40.6833:29.3786 +TOPEL, TURKEY:40.735:30.0831 +YENISEHIR, TURKEY:40.255:29.5625 +DALAMAN, TURKEY:36.7131:28.7925 +AKHISAR, TURKEY:38.8086:27.8336 +CORLU, TURKEY:41.1381:27.9189 +ESKISSEHIR, TURKEY:39.8097:30.5194 +ELAZIG, TURKEY:38.6067:39.2914 +DIYABAKIR, TURKEY:37.8936:40.2006 +ERZINCAN, TURKEY:39.71:39.5261 +ERZURUM, TURKEY:39.9564:41.17 +KARS, TURKEY:40.5622:43.115 +TRABZON, TURKEY:40.995:39.7897 +SANLIURFA, TURKEY:37.0919:38.8461 +VAN, TURKEY:38.4681:43.3322 +BATMAN, TURKEY:37.9289:41.1161 +MUS, TURKEY:38.7544:41.6611 +SIIRT, TURKEY:37.9786:41.8403 +NINIOP, TURKEY:42.0189:35.0792 +SALTSY, MOLDOVA:47.8378:27.7811 +KICHINAU FIR/ACC/COM, MOLDOVA:46.9278:28.9314 +OHRID, FORMER MACEDONIA:41.1797:20.7422 +SKOPJE, FORMER MACEDONIA:41.9614:21.6214 +GIBRALTAR, GIBRALTAR:36.1508:W5.34944 +BEOGRAD, YUGOSLAVIA:44.8183:20.3089 +PODGORICA, YUGOSLAVIA:42.3592:19.2517 +PRISTINA, YUGOSLAVIA:42.5728:21.0358 +TIVAT, YUGOSLAVIA:42.4044:18.7231 +VRSAC, YUGOSLAVIA:45.1467:21.3097 +BRATISLAVA, SLOVAKIA:48.17:17.2125 +KOSICE, SLOVAKIA:48.6631:21.2411 +MALACKY, SLOVAKIA:48.4019:17.1183 +PIESTANY, SLOVAKIA:48.625:17.8283 +SLIAC, SLOVAKIA:48.6378:19.1339 +TRENCIN, SLOVAKIA:48.865:17.9922 +POPRAD, SLOVAKIA:49.0733:20.2408 +ZILINA, SLOVAKIA:49.2317:18.6136 +NORTH CAICOS, TURKS & CAICOS I.:21.9172:W71.9394 +PROVIDENCIALES, TURKS & CAICOS I.:21.7736:W72.2658 +SOUTH CAICOS, TURKS & CAICOS I.:21.5156:W71.5283 +SAMANA, DOMINICAN REPUBLIC:19.1986:W69.43 +BARAHONA, DOMINICAN REPUBLIC:18.2514:W71.1203 +CABO ROJO, DOMINICAN REPUBLIC:17.9289:W71.6447 +CONSTANZA, DOMINICAN REPUBLIC:18.9081:W70.72 +SANTO DOMINGO, DOMINICAN REPUBLIC:18.4711:W69.9689 +LA ROMANA, DOMINICAN REPUBLIC:18.4519:W68.9117 +PUNTA CANA, DOMINICAN REPUBLIC:18.5672:W68.3633 +PUERTO PLATA, DOMINICAN REPUBLIC:19.7572:W70.5697 +SANTO DOMINGO, DOMINICAN REPUBLIC:18.4294:W69.6686 +SAN ISIDORO, DOMINICAN REPUBLIC:18.5036:W69.7617 +SANTIAGO, DOMINICAN REPUBLIC:19.4092:W70.6164 +BANANERA, GUATEMALA:15.4733:W88.8372 +COBAN, GUATEMALA:15.4689:W90.4067 +GUATEMALA CITY, GUATEMALA:14.5831:W90.5275 +PUERTO BARRIOS, GUATEMALA:15.7308:W88.5836 +POPTUN, GUATEMALA:16.3261:W89.4169 +QUEZALTENANGO, GUATEMALA:14.8653:W91.5019 +RETALHULEU, ARGENTINA:14.5208:W91.6972 +SAN JOSE, GUATEMALA:13.9361:W90.8358 +ISLAS DEL CISNE, HONDURAS:17.4072:W83.9325 +LA CEIBA, HONDURAS:15.7422:W86.8533 +SAN PEDRO SULA, HONDURAS:15.4525:W87.9233 +GUANAJA, HONDURAS:16.4453:W85.9064 +PUERTO LEMPIRA, HONDURAS:15.2608:W83.7814 +ROATAN, HONDURAS:16.3167:W86.5225 +TELA, HONDURAS:15.7758:W87.4756 +TEGUCIGALPA, HONDURAS:14.0608:W87.2169 +TRUJILLO, HONDURAS:15.9267:W85.9381 +OCHO RIOS, JAMAICA:18.4042:W76.9689 +KINGSTON, JAMAICA:17.9356:W76.7875 +MONTEGO BAY, JAMAICA:18.5036:W77.9133 +PORT ANTONIO, JAMAICA:18.1986:W76.5344 +KINGSTON, JAMAICA:17.9883:W76.8236 +ACAPULCO, MEXICO:16.7567:W99.7533 +MONTERREY, MEXICO:25.8656:W100.237 +AGUASCALIENTES, MEXICO:21.7053:W102.318 +BAHIAS DEHUATULCO, MEXICO:15.7747:W96.2608 +CUERNAVACA, MEXICO:18.835:W99.2619 +CIUDAD ACUNA, BRAZIL:29.3319:W100.981 +CIUDAD DEL CARMEN, MEXICO:18.6536:W91.7989 +NUEVO CASAS GRANDES, MEXICO:30.3972:W107.875 +CHILPANCINGO, MEXICO:17.5736:W99.5142 +CULIACAN, MEXICO:24.7644:W107.474 +CHETUMAL, MEXICO:18.5044:W88.3267 +CIUDAD OBREGON, MEXICO:27.3925:W109.833 +CAMPECHE, MEXICO:19.8167:W90.5003 +CIUDAD JUAREZ, MEXICO:31.6361:W106.429 +CHIHUAHUA, MEXICO:28.7028:W105.964 +CIUDAD VICTORIA, MEXICO:23.7039:W98.9564 +CELAYA, MEXICO:20.5458:W100.886 +COZUMEL, MEXICO:20.5222:W86.9256 +CIUDAD MANTE, MEXICO:22.7403:W99.0181 +DURANGO, MEXICO:24.1242:W104.528 +TEPIC, MEXICO:21.4194:W104.843 +ENSENADA, MEXICO:31.7953:W116.602 +GUADALAJARA, MEXICO:20.5217:W103.311 +GUAYMAS, MEXICO:27.9689:W110.925 +TEHUACAN, MEXICO:18.4969:W97.4197 +HERMOSILLO, MEXICO:29.0958:W111.048 +COLIMA, MEXICO:19.2769:W103.577 +ISLA MUJERES, MEXICO:21.245:W86.7397 +SALTILLO, MEXICO:25.5494:W100.929 +IZTEPEC, MEXICO:16.4492:W95.0936 +JALAPA, MEXICO:19.475:W96.7975 +LAZARD CARDENAS, MEXICO:18.0017:W102.22 +LOS MOCHIS, MEXICO:25.685:W109.081 +DEL BAJIO, MEXICO:20.9933:W101.481 +LA PAZ, MEXICO:24.0725:W110.362 +LORETO, MEXICO:25.9892:W111.348 +MATAMOROS, MEXICO:25.7697:W97.5253 +MERIDA, MEXICO:20.9369:W89.6575 +MEXICALI, MEXICO:32.6306:W115.241 +MORELIA, MEXICO:19.8497:W101.025 +MINATITLAN, MEXICO:18.1033:W94.5806 +MONCLOVA, MEXICO:26.9556:W101.47 +MEXICO CITY, MEXICO:19.4361:W99.0719 +MONTERREY, MEXICO:25.7783:W100.107 +MAZATLAN, MEXICO:23.1611:W106.266 +NOGALES, MEXICO:31.2258:W110.976 +NUEVO LAREDO, MEXICO:27.4439:W99.5703 +OAXACA, MEXICO:16.9997:W96.7264 +POZA RICO, MEXICO:20.6025:W97.4608 +PUEBLA, MEXICO:19.1581:W98.3714 +PACHUCA, MEXICO:20.0772:W98.7822 +PUNTA PENASCO, MEXICO:31.3517:W113.526 +PIEDRAS NEGRAS, MEXICO:28.6272:W100.535 +URUAPAN, MEXICO:19.3967:W102.039 +PUERTO VALLARTA, MEXICO:20.68:W105.254 +PUERTO ESCONDIDO, MEXICO:15.8767:W97.0889 +QUERETARO, MEXICO:20.6239:W100.369 +REYNOSA, MEXICO:26.0089:W98.2283 +SAN JOSE DEL CABO, MEXICO:23.1517:W109.721 +SAN FILIPE, MEXICO:30.93:W114.809 +SAN LUIS POTOSI, MEXICO:22.2542:W100.931 +TLAXCALA, MEXICO:19.5364:W98.1733 +TORREON, MEXICO:25.5681:W103.411 +TUXTLA GUTIERREZ, MEXICO:16.7694:W93.3414 +TIJUANA, MEXICO:32.5408:W116.97 +TAMPICO, MEXICO:22.2964:W97.8658 +TAMUIN, MEXICO:22.0381:W98.8064 +TOLUCA, MEXICO:19.3369:W99.5658 +TAPACHULA, MEXICO:14.7942:W92.37 +TUXPAN, MEXICO:19.5983:W103.372 +CANCUN, MEXICO:21.0364:W86.8769 +VILLAHERMOSA, MEXICO:17.9969:W92.8172 +VERA CRUZ, MEXICO:19.1453:W96.1869 +ZACATECAS, MEXICO:22.8969:W102.687 +ZIHUATANEJO, MEXICO:17.6014:W101.46 +ZAMORA, MEXICO:20.045:W102.276 +MANZANILLO, MEXICO:19.1447:W104.559 +ZAPOPAN, MEXICO:20.7558:W103.465 +BLUEFIELDS, NICARAGUA:11.9889:W83.7742 +LOS BRASILES, NICARAGUA:12.1894:W86.3539 +LEON, NICARAGUA:12.4278:W86.9022 +MANAGUA, NICARAGUA:12.1411:W86.1681 +PUERTO CABEZAS, NICARAGUA:14.0469:W83.3867 +BOCAS DEL TORO, PANAMA:9.34083:W82.2508 +CHANGUINOLA, PANAMA:9.45861:W82.5167 +DAVID, PANAMA:8.39083:W82.4347 +HOWARD, PANAMA:8.91444:W79.5994 +JAQUE, PANAMA:7.51722:W78.1567 +LA PALMA, PANAMA:8.40667:W78.1417 +PANAMA, PANAMA:8.97333:W79.5556 +SANTIAGO, PANAMA:8.08556:W80.945 +PANAMA CITY, PANAMA:9.07111:W79.3833 +BUENOS AIRES, COSTA RICA:9.16694:W83.3325 +BARRA DEL COLORADO, COSTA RICA:10.7686:W83.5858 +COTO 47, COSTA RICA:8.60111:W82.97 +CABO VELAS, COSTA RICA:10.3556:W85.8528 +EL CARMEN, COSTA RICA:10.2019:W83.4719 +FINCA 10, COSTA RICA:8.91611:W83.5072 +FINCA 63, COSTA RICA:8.6525:W83.0653 +GOLFITO, COSTA RICA:8.65389:W83.1819 +GUAPILES, COSTA RICA:10.2172:W83.7947 +LIBERIA, COSTA RICA:10.5931:W85.5442 +LOS CHILES, COSTA RICA:11.0353:W84.7061 +LIMON, COSTA RICA:9.95778:W83.0219 +NOSARA BEACH, COSTA RICA:9.97639:W85.6528 +SAN JOSE, COSTA RICA:9.99361:W84.2086 +PANDORA, COSTA RICA:9.73194:W82.9831 +PALMAR SUR, COSTA RICA:8.95083:W83.4683 +SAN JOSE, COSTA RICA:9.95722:W84.1419 +QUEPOS, COSTA RICA:9.44306:W84.1297 +SANTA CLARA, COSTA RICA:10.2883:W83.7136 +SAN VITO DE JABA, COSTA RICA:8.82611:W82.9589 +SAN SALVADOR, EL SALVADOR:13.4406:W89.0558 +SAN SALVADOR, EL SALVADOR:13.7:W89.12 +CAP HAITIEN, HAITI:19.7325:W72.1947 +PORT-AU-PRINCE, HAITI:18.58:W72.2925 +BARACOA PLAYA, CUBA:20.3656:W74.5064 +BAYAMO, CUBA:20.3964:W76.6214 +CIEGO DE AVILA, CUBA:22.0269:W78.7894 +CAIBARIEN, CUBA:22.5064:W79.4697 +CUNAGUA, CUBA:22.4611:W78.3286 +CIENFUEGOS, CUBA:22.15:W80.4142 +CAYO, CUBA:21.6161:W81.5456 +CAMAGUEY, CUBA:21.4203:W77.8475 +SANTIAGO DE CUBA, CUBA:19.97:W75.8356 +FLORIDA, CUBA:21.4997:W78.2028 +GUANTANAMO, CUBA:19.9064:W75.2069 +GUANTANAMO, CUBA:20.0853:W75.1583 +HAVANA, CUBA:22.9892:W82.4092 +HOLGUIN, CUBA:20.7856:W76.315 +LA COLOMA, CUBA:22.3358:W83.6419 +MANAGUA, CUBA:22.9697:W82.2747 +MARIEL, CUBA:23.0072:W82.7675 +MOA, CUBA:20.6542:W74.9217 +MANZANILLO, CUBA:20.2881:W77.0892 +NICARO, CUBA:20.6886:W75.5314 +NUEVA GERONA, CUBA:21.8347:W82.7839 +BARACOA PLAYA, CUBA:23.0328:W82.5794 +PINAR DEL RIO NORTE, CUBA:22.4211:W83.6775 +SAN ANTONIO DE BANOS, CUBA:22.8714:W82.5092 +SANTA CLARA, CUBA:22.4919:W79.9436 +SAN JULIAN, CUBA:22.0953:W84.1519 +SANTA LUCIA, CUBA:21.5094:W77.0175 +SIGUANEA, CUBA:21.6425:W82.955 +SANCTI SPIRITUS, CUBA:21.9706:W79.4422 +TRINIDAD, CUBA:21.7883:W79.9972 +VARADERO, CUBA:23.0344:W81.4353 +LAS TUNAS, CUBA:20.9878:W76.9358 +CAYMAN BARAC, CAYMAN ISLANDS:19.6867:W79.8828 +GEORGETOWN, CAYMAN ISLANDS:19.2928:W81.3575 +CLARENCE BAIN, BAHAMAS:24.2875:W77.6844 +ANDROS TOWN, BAHAMAS:24.6978:W77.7956 +CONGO TOWN, BAHAMAS:24.1586:W77.5897 +MARSH HARBOR, BAHAMAS:26.5114:W77.0833 +SAN ANDROS, BAHAMAS:25.0536:W78.0489 +SPRING POINT, BAHAMAS:22.4417:W73.9708 +SANDY POINT, BAHAMAS:26.0044:W77.3953 +TREASURE CAY, BAHAMAS:26.7453:W77.3911 +CHUB CAY, BAHAMAS:25.4169:W77.8808 +BULLOCKS HARBOUR, BAHAMAS:25.7381:W77.84 +ALICE TOWN, BAHAMAS:25.6997:W79.2644 +ARTHUR'S TOWN, BAHAMAS:24.6292:W75.6736 +NEW BIGHT, BAHAMAS:24.315:W75.4539 +COLONEL HILL, BAHAMAS:22.7456:W74.1822 +GREAT EXUMA, BAHAMAS:23.5625:W75.8778 +NORTH ELEUTHERA, BAHAMAS:25.4756:W76.6811 +GOVERNOR'S HARBOR, BAHAMAS:25.2844:W76.3308 +NORMAN'S CAY, BAHAMAS:24.5944:W76.8319 +ROCK SOUND, BAHAMAS:24.8917:W76.1775 +STANIEL CAY, BAHAMAS:24.1689:W76.4389 +FREEPORT, BAHAMAS:26.5586:W78.6953 +WEST END, BAHAMAS:26.6861:W78.9775 +MATTHEW TOWN, BAHAMAS:20.975:W73.6667 +DEAD MAN'S CAY, BAHAMAS:23.1789:W75.0933 +STELLA MARIS, BAHAMAS:23.5828:W75.2686 +MAYAGUANA, BAHAMAS:22.3794:W73.0133 +NASSAU, BAHAMAS:25.0389:W77.4661 +DUNCAN TOWN, BAHAMAS:22.1817:W75.7294 +COCKBURN TOWN, BAHAMAS:24.0631:W74.5239 +BELIZE CITY, BELIZE:17.5389:W88.3081 +AITUTAKI, COOK ISLANDS:-18.825:W159.774 +AVARUA, COOK ISLANDS:-21.2025:W159.806 +NANDI, FIJI:-17.7544:177.443 +NAUSORI, FIJI:-18.0431:178.559 +LAMBASA, FIJI:-16.4667:179.34 +TONGATAPU, TONGA:-21.2408:W175.15 +HA'APAI, TONGA:-19.7769:W174.341 +VAVA'U, TONGA:-18.5853:W173.963 +FUNAFUTI, TUVALU ISLAND:-8.51667:179.217 +TARAWA, KIRIBATI:1.38139:173.147 +TABITEUEA NORTH, KIRIBATI:-1.22361:174.776 +ALOFI, NEW ZEALAND:-19.08:W169.926 +WALLIS, WALLIS & FUTUNA:-13.2381:W176.199 +FALEOLO, SAMOA:-13.8297:W172.008 +PAGO PAGO, SAMOA:-14.3308:W170.71 +RURUTU, FRENCH POLYNESIA:-22.4339:W151.361 +TUBUAI, FRENCH POLYNESIA:-23.3653:W149.524 +ANAA, FRENCH POLYNESIA:-17.3525:W145.51 +FANGATAU, FRENCH POLYNESIA:-15.8197:W140.887 +TIKEHAU, FRENCH POLYNESIA:-15.1194:W148.231 +REAO, FRENCH POLYNESIA:-18.4658:W136.439 +FAKARAVA, FRENCH POLYNESIA:-16.0544:W145.657 +MANIHI, FRENCH POLYNESIA:-14.4367:W146.07 +TOTEGEGIE, FRENCH POLYNESIA:-23.0797:W134.89 +KAUKURA ATOLL, TUAMOTU ISLANDS:-15.6633:W146.885 +MAKEMO, FRENCH POLYNESIA:-16.5847:W143.657 +NAPUKA ISLAND, FRENCH POLYNESIA:-14.1767:W141.267 +PUKA PUKA, FRENCH POLYNESIA:-14.8094:W138.813 +TAKAPOTO, FRENCH POLYNESIA:-14.7125:W145.253 +ARUTUA, TUAMOTU ISLANDS:-15.2481:W146.616 +MATAIVA, FRENCH POLYNESIA:-14.8681:W148.717 +TUREIA, FRENCH POLYNESIA:-20.7833:W138.568 +TAKAROA, FRENCH POLYNESIA:-14.4556:W145.024 +NUKU HIVA, FRENCH POLYNESIA:-8.79556:W140.229 +HIVA-OA, FRENCH POLYNESIA:-9.76861:W139.011 +BORA BORA, FRENCH POLYNESIA:-16.4442:W151.751 +RANGIROA, FRENCH POLYNESIA:-14.9542:W147.661 +HUAHINE ISLAND, FRENCH POLYNESIA:-16.6872:W151.022 +MOOREA, FRENCH POLYNESIA:-17.4897:W149.762 +HAO ISLAND, TUAMOTU ISLANDS:-18.0747:W140.946 +MAUPITI, FRENCH POLYNESIA:-16.4264:W152.244 +RAIATEA ISLAND, FRENCH POLYNESIA:-16.7228:W151.466 +MURUROA, FRENCH POLYNESIA:-21.8083:W138.794 +SANTO, VANUATU:-15.5011:167.222 +PORT-VILA, VANUATU:-17.6992:168.32 +KONE, NEW CALEDONIA:-21.0533:164.838 +KOUMAC, NEW CALEDONIA:-20.5461:164.256 +LIFOU, NEW CALEDONIA:-20.7747:167.24 +NOUMEA, NEW CALEDONIA:-22.2581:166.473 +MARE, NEW CALEDONIA:-21.4817:168.037 +TOUHO, NEW CALEDONIA:-20.7911:165.259 +OUVEA, NEW CALEDONIA:-20.6406:166.573 +NOUMEA, NEW CALEDONIA:-22.0144:166.213 +AUCKLAND, NEW ZEALAND:-37.0081:174.792 +TAUPO, NEW ZEALAND:-38.7397:176.084 +ARDMORE, NEW ZEALAND:-37.0297:174.973 +CHRISTCHURCH, NEW ZEALAND:-43.4892:172.532 +CHATHAM ISLAND, NEW ZEALAND:-43.81:W176.457 +DUNEDIN, NEW ZEALAND:-45.9281:170.198 +GISBORNE, NEW ZEALAND:-38.6633:177.978 +GLENTANNER, NEW ZEALAND:-43.9067:170.128 +HOKITIKA, NEW ZEALAND:-42.7136:170.985 +HAMILTON, NEW ZEALAND:-37.8664:175.332 +HASTINGS, NEW ZEALAND:-39.6467:176.767 +KERIKERI, NEW ZEALAND:-35.2628:173.912 +KAITAIA, NEW ZEALAND:-35.07:173.285 +ALEXANDRA, NEW ZEALAND:-45.2117:169.373 +MOUNT COOK, NEW ZEALAND:-43.765:170.133 +MANAPOURI, NEW ZEALAND:-45.5331:167.65 +MASTERTON, NEW ZEALAND:-40.9733:175.634 +NEW PLYMOUTH, NEW ZEALAND:-39.0086:174.179 +NELSON, NEW ZEALAND:-41.2983:173.221 +INVERCARGILL, NEW ZEALAND:-46.4122:168.313 +OHAKEA, NEW ZEALAND:-40.2058:175.388 +OAMARU, NEW ZEALAND:-44.97:171.082 +PALMERSTON NORTH, NEW ZEALAND:-40.3206:175.617 +PARAPARAUMU, NEW ZEALAND:-40.9047:174.989 +QUEENSTOWN INTERNATIONAL, NEW ZEALAND:-45.0211:168.739 +ROTORUA, NEW ZEALAND:-38.1092:176.317 +WAIOURU, NEW ZEALAND:-39.4464:175.658 +STEPHEN'S ISLAND, NEW ZEALAND:-89.9997:0 +TAURANGA, NEW ZEALAND:-37.6719:176.196 +TIMARU, NEW ZEALAND:-44.3028:171.225 +PUKAKI, NEW ZEALAND:-44.235:170.118 +WOODBOURNE, NEW ZEALAND:-41.5183:173.87 +WEYDON, NEW ZEALAND:-77.8833:166.65 +WANAKA, NEW ZEALAND:-44.7253:169.243 +WIGRAM, NEW ZEALAND:-43.5511:172.553 +WHAKATANE, NEW ZEALAND:-37.9206:176.914 +WELLINGTON, NEW ZEALAND:-41.3272:174.805 +WAIROA, NEW ZEALAND:-39.0069:177.407 +WHENUAPAI, NEW ZEALAND:-36.7878:174.63 +WHANGAREI, NEW ZEALAND:-35.7683:174.365 +WESTPORT, NEW ZEALAND:-41.7381:171.581 +WANGANUI, NEW ZEALAND:-39.9622:175.025 +HERAT, AFGHANISTAN:34.2097:62.2278 +JALALABAD, AFGHANISTAN:34.3992:70.4994 +KABUL, AFGHANISTAN:34.5658:69.2122 +KANDAHAR, AFGHANISTAN:31.5058:65.8478 +MAIMAMA, AFGHANISTAN:35.9342:64.7592 +MAZAR-I-SHARIF, AFGHANISTAN:36.7069:67.2092 +SHINDAND, AFGHANISTAN:33.3911:62.2608 +SHEBERGHAN, AFGHANISTAN:36.7503:65.9122 +TALUQAN, AFGHANISTAN:36.775:69.5325 +KUNDUZ, AFGHANISTAN:36.665:68.9108 +BAHRAIN, BAHRAIN:26.2708:50.6336 +BAHRAIN, BAHRAIN:25.9183:50.5906 +ABHA, SAUDI ARABIA:18.24:42.6556 +AL-AHSA, SAUDI ARABIA:25.2842:49.4861 +EL-BAHA, SAUDI ARABIA:20.2961:41.6342 +BISHA, SAUDI ARABIA:19.9839:42.6228 +ABQAIQ, SAUDI ARABIA:25.9114:49.5914 +DAMMAM, SAUDI ARABIA:26.4711:49.7978 +DHAHRAN, SAUDI ARABIA:26.2653:50.1519 +GIZAN, SAUDI ARABIA:16.9011:42.5858 +GASSIM, SAUDI ARABIA:26.3028:43.7744 +GURIAT, SAUDI ARABIA:31.4108:37.2789 +HAIL, SAUDI ARABIA:27.4378:41.6861 +JUBAIL, SAUDI ARABIA:27.0389:49.405 +JEDDAH, SAUDI ARABIA:21.3481:39.1728 +JEDDAH, SAUDI ARABIA:21.6794:39.1564 +KING KHALID MIL.CITY, SAUDI ARABIA:27.9008:45.5281 +MADINAH, SAUDI ARABIA:24.5533:39.705 +NEJRAN, SAUDI ARABIA:17.6114:44.4192 +HAFR AL-BATIN, SAUDI ARABIA:28.335:46.125 +PETROLINE 3, SAUDI ARABIA:25.1744:47.4883 +PETROLINE 6, SAUDI ARABIA:24.7103:44.9644 +PETROLINE 10, SAUDI ARABIA:24.1072:41.0358 +RABIGH, SAUDI ARABIA:22.7025:39.0697 +RAFHA, SAUDI ARABIA:29.6264:43.4906 +RIYADH, SAUDI ARABIA:24.9575:46.6986 +RASH MISHAB, SAUDI ARABIA:28.0794:48.6108 +ARAR, SAUDI ARABIA:30.9072:41.1383 +RAS TANURA, SAUDI ARABIA:26.7231:50.0306 +SHARURAH, SAUDI ARABIA:17.4667:47.1211 +AL-JOUF, SAUDI ARABIA:29.785:40.1 +SULAYEL, SAUDI ARABIA:20.4647:45.6194 +TABUK, SAUDI ARABIA:28.3653:36.6189 +TAIF, SAUDI ARABIA:21.4833:40.5442 +THUMAMAH, SAUDI ARABIA:25.2142:46.6406 +RAS TANAJIB, SAUDI ARABIA:27.8689:48.7683 +TURAIF, SAUDI ARABIA:31.6925:38.7311 +WADI-AL-DAWASIR, SAUDI ARABIA:20.5042:45.1994 +WEJH, SAUDI ARABIA:26.1975:36.4761 +YENBO, SAUDI ARABIA:24.1442:38.0633 +ABADAN, IRAN:30.365:48.2331 +DEZFUL, IRAN:32.4344:48.3975 +AGHAJARI, IRAN:30.7453:49.6761 +GACHSARAN, IRAN:30.3375:50.8278 +MASJED SOLEIMAN, IRAN:32.0022:49.2706 +OMIDYEH, IRAN:30.835:49.5347 +BANDAR MAHSHAHR, IRAN:30.5561:49.1517 +AHWAZ, IRAN:31.3372:48.7619 +ABUMUSA I., IRAN:25.8758:55.0328 +BUSHEHR, IRAN:28.9447:50.8344 +BASTAK, IRAN:27.2125:54.3183 +GOLBANDI, IRAN:27.4839:52.6183 +KISH ISLAND, IRAN:26.5267:53.9817 +BANDAR LENGEH, IRAN:26.5317:54.8217 +KHARK ISLAND, IRAN:29.2592:50.3239 +SIRI ISLAND, IRAN:25.9094:54.5392 +LAVAN ISLAND, IRAN:26.81:53.3564 +BAKHTARAN, IRAN:34.3464:47.1564 +ABDANAN, IRAN:32.9344:47.4833 +ILAM, IRAN:33.5856:46.4053 +KHORRAM ABAD, IRAN:33.4364:48.2858 +SANANDAJ, IRAN:35.2469:47.0069 +DARAN, IRAN:32.9294:51.5608 +ESFAHAN, IRAN:32.5669:51.6914 +ESFAHAN, IRAN:32.7506:51.8617 +SEPAH, IRAN:32.6208:51.6967 +RASHT, IRAN:37.3253:49.6056 +HAMADAN, IRAN:34.8681:48.5522 +ARAK, IRAN:34.1403:49.8483 +TEHERAN, IRAN:35.7028:51.475 +TEHERAN, IRAN:35.6447:51.3806 +TEHERAN, IRAN:35.6892:51.3133 +GHAZVIN, IRAN:36.2414:50.0475 +SEMNAN, IRAN:35.5908:53.495 +BANDAR ABBAS, IRAN:27.2181:56.3778 +JIROFT, IRAN:28.7267:57.67 +KERMAN, IRAN:30.2611:56.9567 +BAM, IRAN:29.0839:58.4503 +BANDAR ABBAS, IRAN:27.1581:56.1722 +GHESHM I., IRAN:26.755:55.9019 +RAFSANJAN, IRAN:30.2978:56.0519 +SIRJAN, IRAN:29.5508:55.6725 +BIRJAND, IRAN:32.8956:59.2756 +SARAKHS, IRAN:36.5011:61.0647 +EMAM SHAHR, IRAN:36.4236:55.1058 +BOJNORD, IRAN:37.4931:57.3006 +TABAS, IRAN:33.6678:56.8925 +SHAHR ABAD, IRAN:37.6278:56.1731 +KALALEH, IRAN:37.3831:55.4519 +GORGAN, IRAN:36.9092:54.4017 +MAHMOOD ABAD, IRAN:34.1692:51.3175 +NOSHAHR, IRAN:36.6633:51.4647 +RAMSAR, IRAN:36.9097:50.6794 +DASHT-E-NAZ, IRAN:36.6436:53.1883 +DARAB, IRAN:28.7214:54.4411 +FASA, IRAN:28.8919:53.7228 +JAHROM, IRAN:28.5864:53.5789 +LAR, IRAN:27.6736:54.3814 +ZARGHAN, IRAN:29.7542:52.6942 +LAMERD, IRAN:27.3708:53.1892 +SHIRAZ, IRAN:29.5392:52.5894 +ARDABIL, IRAN:38.3261:48.4242 +MARAGHEH, IRAN:37.3486:46.1261 +PARSABAD, IRAN:39.6036:47.8811 +TABRIZ, IRAN:38.1328:46.2347 +ZANJAN, IRAN:36.7742:48.3597 +YAZD, IRAN:31.9047:54.2764 +ZABOL, IRAN:31.0969:61.5439 +CHAH BAHAR, IRAN:25.4433:60.3819 +ZAHEDAN, IRAN:29.4761:60.9058 +IRAN SHAHR, IRAN:27.2364:60.72 +JASK, IRAN:25.6533:57.7992 +AMMAN, JORDAN:31.7225:35.9931 +AMMAN, JORDAN:31.9725:35.9914 +AQABA, JORDAN:29.6114:35.0181 +JERUSALEM, JORDAN:31.8647:35.2192 +MAFRAQ, JORDAN:32.3561:36.2592 +KUWAIT, KUWAIT:29.2267:47.98 +BEIRUT, LEBANON:33.8133:35.4886 +KLEIAT, LEBANON:34.5892:36.0111 +ABU DHABI, UNITED ARAB EMIRATES:24.4328:54.6511 +ABU DHABI, UNITED ARAB EMIRATES:24.4283:54.4581 +AL HAMRA, UNITED ARAB EMIRATES:24.0736:52.4633 +JEBEL DHANA, UNITED ARAB EMIRATES:24.1872:52.6139 +AL AIN, UNITED ARAB EMIRATES:24.2617:55.6092 +ABU DHABI, UNITED ARAB EMIRATES:24.2481:54.5475 +ARZANA, UNITED ARAB EMIRATES:24.7803:52.5597 +DAS ISLAND, UNITED ARAB EMIRATES:25.1461:52.8736 +ZIRKU, UNITED ARAB EMIRATES:24.8614:53.0778 +DUBAI, UNITED ARAB EMIRATES:25.2547:55.3642 +FUJEIRAH, UNITED ARAB EMIRATES:25.1122:56.3239 +RAS AL KHAIMAH, UNITED ARAB EMIRATES:25.6133:55.9386 +SHARJAH, UNITED ARAB EMIRATES:25.3283:55.5169 +KHASAB, OMAN:26.1711:56.2406 +MASIRAH, OMAN:20.6753:58.8903 +MUSCAT, OMAN:23.5931:58.2844 +SALALAH, OMAN:17.0386:54.0911 +SAIQ, OMAN:23.0667:57.65 +THUMRAIT, OMAN:17.6658:54.0244 +BANNU, PAKISTAN:32.9719:70.5247 +BAHAWALPURE, PAKISTAN:29.3469:71.7114 +CHITRAL, PAKISTAN:35.8864:71.8006 +DALBANDIN, PAKISTAN:28.8747:64.4044 +DERA GHAZI KHAN, PAKISTAN:29.9611:70.4856 +DERA ISMAIL KHAN, PAKISTAN:31.9092:70.8964 +FAISALABAD, PAKISTAN:31.365:72.9953 +GWADAR, PAKISTAN:25.2331:62.3294 +GILGIT, PAKISTAN:35.9186:74.3336 +JACOBSBAD, PAKISTAN:28.2842:68.4494 +JIWANI, PAKISTAN:25.0678:61.8053 +KARACHI, PAKISTAN:24.9064:67.1606 +HYDERABAD, PAKISTAN:25.3181:68.3661 +KHUZDHAR, PAKISTAN:27.7925:66.6428 +KHARAN, PAKISTAN:28.5944:65.4247 +LAHORE, PAKISTAN:31.5214:74.4033 +LAHORE, PAKISTAN:31.4947:74.3461 +MANGLA, PAKISTAN:33.05:73.6383 +MUZAFFARABAD, PAKISTAN:34.3383:73.5083 +MIANWALI, PAKISTAN:32.5631:71.5706 +MOENJODARO, PAKISTAN:27.335:68.1428 +MIR PUR KHAS, PAKISTAN:25.6825:69.0728 +MIRANSHAH, PAKISTAN:33.0125:70.0642 +KARACHI, PAKISTAN:24.8933:66.9386 +MULTAN, PAKISTAN:30.2031:71.4189 +NAWABSHAH, PAKISTAN:26.2192:68.39 +NAUSHKI, PAKISTAN:29.5378:66.0222 +OKARA, PAKISTAN:30.7408:73.3575 +ORMARA, PAKISTAN:25.2731:64.5883 +PARACHINAR, PAKISTAN:33.9025:70.0714 +PANJGUR, PAKISTAN:26.9544:64.1325 +PASNI, PAKISTAN:25.2836:63.3328 +PESHAWAR, PAKISTAN:33.9939:71.5144 +QASIM, PAKISTAN:33.5611:73.0319 +QUETTA, PAKISTAN:30.2511:66.9375 +RAHIM YAR KHAN, PAKISTAN:28.3853:70.2797 +ISLAMABAD, PAKISTAN:33.6164:73.0992 +SHOREKOTE, PAKISTAN:30.7581:72.2825 +RISALPUR, PAKISTAN:34.0811:71.9725 +RAWALA KOT, PAKISTAN:33.8492:73.7978 +SKARDU, PAKISTAN:35.3347:75.5364 +SUKKUR, PAKISTAN:27.7219:68.7917 +SARGODHA, PAKISTAN:32.0486:72.665 +SAIDU SHARIF, PAKISTAN:34.8131:72.3519 +SUI, PAKISTAN:28.645:69.1767 +SAHIWAL, PAKISTAN:31.8894:72.3092 +TERBELA, PAKISTAN:33.9861:72.6114 +TALHAR, PAKISTAN:24.8414:68.8383 +WANA, PAKISTAN:32.3053:69.5694 +ZHOB, PAKISTAN:31.3583:69.4633 +BAGHDAD, IRAQ:33.2619:44.2339 +BASRAH, IRAQ:30.5486:47.6622 +ALEPPO, SYRIA:36.1806:37.2242 +DAMASCUS, SYRIA:33.4114:36.5156 +DEIRE ZOR, SYRIA:35.2853:40.1758 +KAMISHLI, SYRIA:37.0236:41.1944 +LATAKIA, SYRIA:35.4008:35.9486 +PALMYRA, SYRIA:34.5572:38.3167 +DOHA, QATAR:25.2611:51.565 +PALMER, USA:61.5947:W149.089 +BARTER ISLAND, USA:70.1339:W143.577 +BETHEL, USA:60.7797:W161.838 +DELTA JUNCTION, USA:63.9944:W145.721 +BIG MOUNTAIN, USA:59.3617:W155.257 +BARROW, USA:71.2853:W156.766 +BETTLES, USA:66.9153:W151.528 +COLD BAY, USA:55.2056:W162.724 +CLEAR MEWS, USA:64.3011:W149.12 +CORDOVA, USA:60.4917:W145.477 +CAPE ROMANZOF, USA:61.7803:W166.039 +ADAK ISLAND, USA:51.8778:W176.646 +DILLINGHAM, USA:59.0453:W158.503 +KODIAK, USA:57.75:W152.494 +UNALASKA, USA:53.9:W166.543 +ANCHORAGE, USA:61.2511:W149.806 +CAPE NEWENHAM, USA:58.6472:W162.061 +FAIRBANKS, USA:64.6656:W147.101 +KENAI, USA:60.5731:W151.245 +FAIRBANKS, USA:64.815:W147.856 +FORT WAINWRIGHT, USA:64.8375:W147.614 +FORT RICHARDSON, USA:61.2661:W149.653 +GALENA, USA:64.7361:W156.937 +GULKANA, USA:62.1547:W145.456 +SKAGWAY, USA:59.46:W135.316 +HOMER, USA:59.6456:W151.476 +ILIAMNA, USA:59.7536:W154.911 +INDIAN MOUNTAINS, USA:65.9928:W153.704 +JUNEAU, USA:58.3547:W134.576 +KING SALMON, USA:58.6767:W156.649 +KETCHIKAN, USA:55.3556:W131.714 +CAPE LISBURNE, USA:68.875:W166.11 +MCGRATH, USA:62.9528:W155.606 +MIDDLETON ISLAND, USA:59.4497:W146.309 +ANCHORAGE, USA:61.2142:W149.846 +ANCHORAGE, USA:61.1742:W149.996 +ANNETTE ISLAND, USA:55.0422:W131.572 +NOME, USA:64.5119:W165.445 +NORTHWAY, USA:62.9611:W141.929 +KOTZEBUE, USA:66.8844:W162.598 +POINT BARROW, USA:56.5783:W169.661 +PORT MOLLER, USA:59.0111:W161.819 +DEADHORSE, USA:70.1947:W148.465 +SITKA, USA:57.0469:W135.361 +ST. PAUL ISLAND, USA:57.1672:W170.22 +SPARREVOHN, USA:61.0972:W155.574 +SHEMYA, USA:52.7122:174.114 +TANANA, USA:65.1742:W152.109 +TIN CITY, USA:65.5631:W167.922 +TALKEETNA, USA:62.3203:W150.094 +TATALINA, USA:62.8942:W155.976 +UNALAKLEET, USA:63.8883:W160.799 +VALDEZ, USA:61.1339:W146.248 +FORT WAINWRIGHT, USA:70.6133:W159.86 +YAKUTAT, USA:59.5031:W139.66 +CANTON ISLAND, PHOENIX ISL.:-2.76667:W0 +FORT YUKON, USA:66.5714:W145.25 +ROTA, MARIANA ISLANDS:14.1744:145.243 +SAIPAN, MARIANA ISLANDS:15.1194:145.729 +TYPHOON WARNING CTR, MARIANA ISLANDS:13.5:144.833 +ANDERSEN, MARIANA ISLANDS:13.5839:144.93 +AGANA, MARIANA ISLANDS:13.4839:144.797 +WEST TINIAN, MARIANA ISLANDS:14.9978:145.619 +BARKING SANDS, USA:22.0217:W159.787 +DILLINGHAM, USA:21.5792:W158.21 +WHEELER AFB., USA:21.4833:W158.039 +HANA, USA:20.7956:W156.014 +LAHANIA-KAPALUA, USA:20.9628:W156.674 +KONA, USA:19.7386:W156.046 +LIHUE, USA:21.9761:W159.339 +MOLOKAI, USA:21.1528:W157.096 +KAMUELA, USA:20.0011:W155.668 +KANEOHE BAY, USA:21.4492:W157.768 +HONOLULU, USA:21.3158:W157.927 +LANAI, USA:20.7856:W156.951 +KAHULUI, USA:20.8986:W156.431 +BRADSHAW FIELD, USA:19.76:W155.554 +HILO, USA:19.7203:W155.049 +OPOLU, USA:20.265:W155.86 +JOHNSTON ISLAND, JOHNSTON ATOLL:16.7286:W169.534 +ENIWETOK ISLAND, MARSHALL ISLANDS:11.3408:162.328 +MAJURO, MARSHALL ISLANDS:7.06472:171.272 +KWAJALEIN, MARSHALL ISLANDS:9.39667:167.471 +KWAJALEIN, MARSHALL ISLANDS:8.72:167.731 +KIRITIMATI, KIRIBATI:1.98611:W157.35 +MIDWAY, MIDWAY ISLAND:28.2014:W177.381 +OLIKTOK POINT, USA:70.4994:W149.879 +POINT LAY, USA:69.7328:W163.005 +CHUUK, MICRONESIA:7.46167:151.843 +POHNPEI, MICRONESIA:6.985:158.209 +BABELTHUAP, PALAU ISLAND:7.3675:134.544 +KOSRAE, MICRONESIA:5.35667:162.958 +YAP, MICRONESIA:9.49861:138.082 +CHINMEN, TAIWAN:24.4319:118.359 +PINGTUNG, TAIWAN:22.6722:120.462 +LONGTANG, TAIWAN:24.855:121.237 +FENGNIN, TAIWAN:22.7567:121.093 +GREEN ISLAND, TAIWAN:22.6744:121.458 +TAOYUAN, TAIWAN:25.0556:121.243 +KAOHSIUNG, TAIWAN:22.5753:120.351 +CHIAYI, TAIWAN:23.4617:120.393 +CHUNG, TAIWAN:24.1861:120.654 +LANYU, TAIWAN:22.0294:121.527 +CHINGCHUAKANG, TAIWAN:24.2644:120.621 +MATSU, TAIWAN:26.2239:120.002 +TAINAN, TAIWAN:22.9503:120.206 +HSINCHU, TAIWAN:24.8178:120.939 +MAKUNG, TAIWAN:23.5686:119.628 +TAITUNG, TAIWAN:22.7931:121.182 +TSOYING, TAIWAN:22.7047:120.281 +PINGTUNG, TAIWAN:22.7:120.482 +TAIPEI, TAIWAN:25.0694:121.552 +TAIPEI, TAIWAN:25.08:121.232 +WANG AN, TAIWAN:23.3708:119.494 +HUALIEN, TAIWAN:24.0231:121.618 +TOKYO, JAPAN:35.7647:140.386 +MATSUMOTO, JAPAN:36.1667:137.923 +HYAKURI, JAPAN:36.1808:140.415 +MINAMI TORI SHIMA, JAPAN:24.2894:153.979 +IWOJIMA, JAPAN:24.7839:141.322 +NANKI-SHIRAHAMA, JAPAN:33.6622:135.364 +KOHNAN, JAPAN:34.5908:133.933 +OBIHIRO, JAPAN:42.7333:143.217 +SAPPORO, JAPAN:42.775:141.692 +HAKODATE, JAPAN:41.77:140.822 +CHITOSE, JAPAN:42.7944:141.666 +MEMANBETSU, JAPAN:43.8806:144.164 +NAKASHIBETSU, JAPAN:43.5772:144.96 +SAPPORO, JAPAN:43.1161:141.38 +TOKACHI, JAPAN:42.8903:143.158 +WAKKANAI, JAPAN:45.4039:141.801 +IKI, JAPAN:33.7489:129.785 +YAMAGUCHI, JAPAN:33.93:131.279 +TSUSHIMA, JAPAN:34.2847:129.33 +MONBETSU, JAPAN:44.3039:143.404 +ASAHIKAWA, JAPAN:43.6708:142.447 +RISHIRI ISLAND, JAPAN:45.2419:141.186 +ASHIYA, JAPAN:33.8831:130.653 +YAKUSHIMA, JAPAN:30.3856:130.659 +FUKUE, JAPAN:32.6661:128.833 +FUKUOKA, JAPAN:33.5864:130.45 +TANEGASHIMA, JAPAN:30.5467:130.95 +KAGOSHIMA, JAPAN:31.8033:130.719 +MIYAZAKI, JAPAN:31.8769:131.448 +NYUTABARU, JAPAN:32.0836:131.452 +OITA, JAPAN:33.4794:131.737 +KITAKYUSHU, JAPAN:33.8361:130.947 +KUMAMOTO, JAPAN:32.8372:130.855 +NAGASAKI, JAPAN:32.9225:129.923 +KANOYA, JAPAN:31.3675:130.845 +TSUIKI, JAPAN:33.6853:131.041 +AMAMI, JAPAN:28.4306:129.712 +OKIERABU, JAPAN:27.4253:128.701 +TOKUNOSHIMA, JAPAN:27.8361:128.881 +FUKUI, JAPAN:36.1428:136.224 +GIFU, JAPAN:35.3942:136.869 +HAMAMATSU, JAPAN:34.75:137.703 +KANAZAWA, JAPAN:36.3936:136.408 +NAGOYA, JAPAN:35.255:136.924 +OKI ISLAND, JAPAN:36.1811:133.325 +TOYAMA, JAPAN:36.6483:137.187 +YAIZU, JAPAN:34.8125:138.298 +HIROSHIMA, JAPAN:34.4353:132.922 +OKAYAMA, JAPAN:34.7569:133.856 +IZUMO, JAPAN:35.4136:132.89 +HOFU, JAPAN:34.0344:131.549 +MIHO, JAPAN:35.4922:133.236 +IWAKUNI, JAPAN:34.1436:132.236 +KOCHI, JAPAN:33.5444:133.671 +MATSUYAMA, JAPAN:33.8272:132.7 +OSAKA, JAPAN:34.7853:135.438 +TOTTORI, JAPAN:35.53:134.166 +TOKUSHIMA, JAPAN:34.1328:134.606 +TAKAMATSU, JAPAN:34.2139:134.016 +OSAKA, JAPAN:34.5961:135.603 +OZUKI, JAPAN:34.0453:131.052 +AOMORI, JAPAN:40.7344:140.691 +YAMAGATA, JAPAN:38.4117:140.371 +HACHINOE, JAPAN:40.5564:141.466 +HANAMAKI, JAPAN:39.4308:141.136 +AKITA, JAPAN:39.6156:140.219 +MISAWA, JAPAN:40.7031:141.368 +SENDAI, JAPAN:38.1394:140.917 +MATSUSHIMA, JAPAN:38.4047:141.219 +SHONAI, JAPAN:38.8117:139.787 +ATSUGI, JAPAN:35.4544:139.45 +TATEYAMA, JAPAN:34.9869:139.829 +TOKYO, JAPAN:35.6717:139.528 +HACHIJOJIMA, JAPAN:33.115:139.786 +IRUMA, JAPAN:35.8414:139.41 +KISARAZU, JAPAN:35.3981:139.91 +SHIMOFUSA, JAPAN:35.7989:140.011 +OSHIMA, JAPAN:34.7844:139.361 +MIYAKE JIMA, JAPAN:34.0719:139.56 +ZAMA, JAPAN:35.5136:139.394 +TOKYO, JAPAN:35.5522:139.779 +YOKOTA, JAPAN:35.7483:139.348 +KWANGJU, KOREA:35.1256:126.81 +KUNSAN, KOREA:35.9036:126.616 +MOKPO, KOREA:34.7589:126.38 +JHUNJU, KOREA:35.8783:127.119 +YEOSU, KOREA:34.8397:127.615 +CHUNCHON, KOREA:37.8836:127.718 +SOKCH'O, KOREA:38.1475:128.601 +KANGNUNG, KOREA:37.7533:128.944 +WONJU, KOREA:37.4381:127.96 +YANGKU, KOREA:38.0611:128.669 +CHEJU, KOREA:33.5111:126.493 +CHINHAE, KOREA:35.1411:128.696 +KIMHAE, KOREA:35.1794:128.938 +BUSAN, KOREA:35.1708:129.129 +SACHON, KOREA:35.0883:128.07 +ULSAN, KOREA:35.5933:129.352 +PYONGTAEK, KOREA:36.9606:127.033 +SEOUL EAST, KOREA:37.4458:127.114 +OSAN, KOREA:37.0906:127.029 +SEOUL, KOREA:37.5581:126.791 +SUWON, KOREA:37.2392:127.007 +POHANG, KOREA:35.9878:129.42 +KYUNGJU, KOREA:35.8564:129.211 +TAEGU, KOREA:35.8939:128.659 +CHONGJU, KOREA:36.7164:127.499 +YECHON, KOREA:36.6317:128.355 +NAHA, JAPAN:26.1956:127.646 +IEJIMA, JAPAN:26.7286:127.762 +KADENA, JAPAN:26.3556:127.767 +ISHIGAKI, JAPAN:24.3444:124.187 +KUMEJIMA, JAPAN:26.3633:126.714 +MINAMI DAITO, JAPAN:25.8464:131.263 +MIYAKO, JAPAN:24.7828:125.295 +KITADAITO, JAPAN:25.9478:131.321 +SHIMOJISHIMA, JAPAN:24.8267:125.145 +YORON, JAPAN:27.0439:128.401 +FUTEMA, JAPAN:26.2742:127.756 +YONAGUNI JIMA, JAPAN:24.4669:122.978 +MANILA, PHILIPPINES:14.5086:121.019 +CUBI NAS, PHILIPPINES:6.10556:125.236 +CEBU, PHILIPPINES:7.16472:124.21 +LADAG, PHILIPPINES:8.41444:124.611 +MANILA, PHILIPPINES:7.61722:124.059 +LEGAZPI, PHILIPPINES:7.82778:123.46 +ROMBLON, PHILIPPINES:6.05806:125.096 +SANGLEY POINT, PHILIPPINES:9.75778:125.481 +ZAMBOANGA, PHILIPPINES:6.92222:122.059 +BAGUIO, PHILIPPINES:16.375:120.619 +DAET, PHILIPPINES:14.1292:122.98 +FLORIDABLANCA, PHILIPPINES:14.9864:120.493 +LINGAYEN, PHILIPPINES:16.0347:120.241 +SAN JOSE, PHILIPPINES:12.3614:121.046 +IBA, PHILIPPINES:15.3256:119.969 +LIPA, PHILIPPINES:13.955:121.125 +MAMBURAO, PHILIPPINES:13.2081:120.605 +NAGA, PHILIPPINES:13.5853:123.271 +BASCO, PHILIPPINES:20.4517:121.98 +JOSE PANGANIBAN, PHILIPPINES:14.2928:122.646 +VIGAN, PHILIPPINES:17.5536:120.357 +SAN FERNANDO, PHILIPPINES:16.5956:120.303 +TUGUEGARAO, PHILIPPINES:17.6381:121.731 +VIRAC, PHILIPPINES:13.5775:124.206 +MARINDUQUE, PHILIPPINES:13.3611:121.825 +CAUAYAN, PHILIPPINES:16.9297:121.753 +BAGABAG, PHILIPPINES:16.6189:121.252 +TACLOBAN, PHILIPPINES:11.2272:125.028 +BACOLOD, PHILIPPINES:10.6425:122.929 +CALBAYOG, PHILIPPINES:12.0725:124.545 +DUMAGUETE, PHILIPPINES:9.33417:123.302 +CATARMAN, PHILIPPINES:12.5022:124.636 +GUIUAN, PHILIPPINES:11.0356:125.743 +ILOILO, PHILIPPINES:10.7131:122.545 +KALIBO, PHILIPPINES:11.6811:122.378 +MASBATE, PHILIPPINES:10.3075:123.979 +ORMOC, PHILIPPINES:11.0558:124.566 +PUERTO PRINCESA, PHILIPPINES:9.74194:118.759 +ROXAS, PHILIPPINES:11.5975:122.753 +SAN JOSE, PHILIPPINES:10.7661:121.932 +CONCORDIA, ARGENTINA:-31.2969:W57.9964 +GUALEGUAYCHU, ARGENTINA:-33.0058:W58.6131 +PUNTA INDIO, ARGENTINA:-35.3478:W57.2939 +JUNIN, ARGENTINA:-34.5458:W60.9306 +PARANA, ARGENTINA:-31.7947:W60.4803 +ROSARIO, ARGENTINA:-32.9033:W60.7844 +SANTA FE, ARGENTINA:-31.7117:W60.8117 +BUENOS AIRES, ARGENTINA:-34.5592:W58.4156 +LA CUMBRE, ARGENTINA:-31.0067:W64.5325 +CORDOBA, ARGENTINA:-31.3236:W64.2078 +GOBERNADOR GORDILLO, ARGENTINA:-30.3453:W66.2936 +BUENOS AIRES, ARGENTINA:-34.5006:W58.6042 +SAN FERNANDO, ARGENTINA:-34.4531:W58.5894 +JOSE C. PAZ, ARGENTINA:-34.5606:W58.7894 +LA PLATA, ARGENTINA:-34.9722:W57.8944 +MORON, ARGENTINA:-34.6761:W58.6425 +EL PALOMAR, ARGENTINA:-34.6097:W58.6125 +SAN JUSTO, ARGENTINA:-34.7314:W58.5994 +CHOSMADAL, ARGENTINA:-37.4444:W70.2222 +FUERTE GRAL ROCA, ARGENTINA:-39.0006:W67.6203 +MENDOZA, ARGENTINA:-32.8317:W68.7928 +MALARGUE, ARGENTINA:-35.4839:W69.5825 +MENDOZA, ARGENTINA:-32.8658:W68.8722 +SAN RAFAEL, ARGENTINA:-34.5881:W68.4025 +CATAMARCA, ARGENTINA:-28.5956:W65.7517 +SANTIAGO DEL ESTERO, ARGENTINA:-27.7656:W64.31 +TINOGASTA, ARGENTINA:-28.0375:W67.5803 +LA RIOJA, ARGENTINA:-29.3814:W66.7958 +CHILECITO, ARGENTINA:-29.2239:W67.4389 +TUCUMAN, ARGENTINA:-26.8408:W65.1047 +SAN JULIAN, ARGENTINA:-31.5714:W68.4181 +RIO CUARTO, ARGENTINA:-33.0856:W64.2614 +VILLA DOLORES, ARGENTINA:-31.9411:W65.1422 +LABOULAYE, ARGENTINA:-34.1353:W63.3622 +MARCOS JUAREZ, ARGENTINA:-32.6836:W62.1578 +VILLA REYNOLDS, ARGENTINA:-33.7297:W65.3872 +SAN LUIS, ARGENTINA:-33.2731:W66.3564 +CORRIENTES, ARGENTINA:-27.4453:W58.7617 +RESISTENCIA, ARGENTINA:-27.4497:W59.0561 +FORMOSA, ARGENTINA:-26.2125:W58.2281 +IGUAZU FALLS, ARGENTINA:-25.7375:W54.4731 +PASO DE LOS LIBRES, ARGENTINA:-29.6892:W57.1519 +MONTE CASEROS, ARGENTINA:-30.2717:W57.64 +POSADAS, ARGENTINA:-27.3858:W55.9706 +PRESIDENCIA R.S.PENA, ARGENTINA:-26.7564:W60.4931 +SALTA, ARGENTINA:-24.8558:W65.4861 +JUJUY, ARGENTINA:-24.3928:W65.0978 +ORAN, ARGENTINA:-23.1528:W64.3292 +LA QUIACA, ARGENTINA:-22.1622:W65.5697 +TARTAGAL, ARGENTINA:-22.6197:W63.7936 +GOYA, ARGENTINA:-29.1058:W59.2186 +LAS LOMITAS, ARGENTINA:-24.7211:W60.5486 +MERCEDES, ARGENTINA:-29.2231:W58.0881 +OBERA, ARGENTINA:-27.5181:W55.1239 +RECONQUISTA, ARGENTINA:-29.21:W59.6908 +CURUZU CUATIA, ARGENTINA:-29.7706:W57.9789 +EL BOLSON, ARGENTINA:-41.9431:W71.5322 +COMODORO RIVADAVIA, ARGENTINA:-45.785:W67.4656 +EL MAITEN, ARGENTINA:-42.0306:W71.1697 +ESQUEL, ARGENTINA:-42.9078:W71.1394 +LAS HERAS, ARGENTINA:-46.5383:W68.9658 +TRELEW, ARGENTINA:-43.2103:W65.2703 +VIEDMA, ARGENTINA:-40.8692:W63.0003 +PUERTO MADRYN, ARGENTINA:-42.7589:W65.1025 +LAGO ARGENTINO, ARGENTINA:-50.3353:W72.2483 +MARAMBIO BASE, ANTARCTICA:-64.2383:W56.6308 +PUERTO DESEADO, ARGENTINA:-47.7353:W65.9039 +RIO GRANDE, ARGENTINA:-53.7775:W67.7492 +RIO GALLEGOS, ARGENTINA:-51.6086:W69.3125 +USHUAIA, ARGENTINA:-54.8431:W68.2956 +SAN JULIAN, ARGENTINA:-49.3067:W67.8025 +JOSE DE SAN MARTIN, ARGENTINA:-44.0481:W70.4592 +RIO TURBIO, ARGENTINA:-51.6064:W72.2167 +SANTA CRUZ, ARGENTINA:-50.0164:W68.5792 +BAHIA BLANCA, ARGENTINA:-38.7247:W62.1692 +COLONEL SUAREZ, ARGENTINA:-37.4461:W61.8892 +DOLORES, ARGENTINA:-36.3203:W57.7217 +OLAVARRIA, ARGENTINA:-36.8908:W60.2161 +GENERAL PICO, ARGENTINA:-35.6961:W63.7581 +TRES ARROYOS, ARGENTINA:-38.3867:W60.3294 +BOLIVAR, ARGENTINA:-36.1869:W61.0761 +SANTA TERESITA, ARGENTINA:-36.5422:W56.7217 +MAR DEL PLATA, ARGENTINA:-37.9342:W57.5733 +NEUQUEN, ARGENTINA:-38.9489:W68.1556 +NECOCHEA, ARGENTINA:-38.4894:W58.8158 +PEHUAJO, ARGENTINA:-35.8456:W61.8578 +SANTA ROSA, ARGENTINA:-36.5881:W64.2753 +SAN CARLOS DE BARILOCH, ARGENTINA:-41.1511:W71.1575 +TANDIL, ARGENTINA:-37.2372:W59.2278 +VILLA GESELL, ARGENTINA:-37.2353:W57.0292 +CUTRALCO, ARGENTINA:-38.9394:W69.2644 +SAN MARTIN DES ANDES, ARGENTINA:-40.0753:W71.1372 +CONCEICAO DO ARAGUAIA, BRAZIL:-8.34833:W49.3014 +RIO DE JANEIRO, BRAZIL:-22.875:W43.3844 +AMAPA, BRAZIL:2.07667:W50.8622 +ARARACUARA, BRAZIL:-21.8119:W48.1328 +ARACAJU, BRAZIL:-10.9839:W37.0703 +ASSIS, BRAZIL:-22.6383:W50.4558 +ALTA FLORESTA, BRAZIL:-9.86583:W56.1061 +ARACATUBA, BRAZIL:-21.1411:W50.4247 +TEODORO SAMPAIO, BRAZIL:-22.5256:W52.9719 +BELEM, BRAZIL:-1.37917:W48.4761 +BAGE, BRAZIL:-31.3903:W54.1122 +BELO HORIZONTE, BRAZIL:-19.8517:W43.9503 +CURITIBA, BRAZIL:-25.405:W49.2319 +BARBACENA, BRAZIL:-21.2669:W43.7608 +BRASILIA, BRAZIL:-15.8625:W47.9125 +BAURU, BRAZIL:-22.345:W49.0536 +BOA VISTA, BRAZIL:2.84611:W60.69 +BARRA DO GARCAS, BRAZIL:-15.8611:W52.3889 +CASCAVEL, BRAZIL:-25.0003:W53.5006 +ITAITUBA, BRAZIL:-9.33389:W54.9653 +BELO HORIZONTE, BRAZIL:-19.6336:W43.9686 +CAMPO GRANDE, BRAZIL:-20.4686:W54.6725 +CHAPECO, BRAZIL:-27.1342:W52.6564 +CAROLINA, BRAZIL:-7.32028:W47.4586 +CRICIUMA, BRAZIL:-28.7256:W49.4247 +PORTO ALEGRE, BRAZIL:-29.9458:W51.1444 +CAMPOS, BRAZIL:-21.6983:W41.3017 +CORUMBA, BRAZIL:-19.0117:W57.6728 +CURITIBA, BRAZIL:-25.5283:W49.1756 +CARAVELAS, BRAZIL:-17.6522:W39.2531 +CAXIAS DO SUL, BRAZIL:-29.1969:W51.1875 +CUIABA, BRAZIL:-15.6528:W56.1167 +CRUIZIRO DO SUL, BRAZIL:-7.6:W72.7694 +PRESIDENT PRUDENTE, BRAZIL:-22.175:W51.4244 +MANAUS, BRAZIL:-3.03861:W60.0497 +JACARE-ACANGA, BRAZIL:-6.23306:W57.7767 +SAO PEDRO DA ALDEIA, BRAZIL:-22.8128:W42.0925 +FRANCA, BRAZIL:-20.5919:W47.3828 +FOZ DO IGUACU, BRAZIL:-25.5961:W54.4869 +FLORIANOPOLIS, BRAZIL:-27.6725:W48.5478 +FERNANDO DO NORONHA, BRAZIL:-3.85472:W32.4233 +FRONTEIRA, BRAZIL:-20.2783:W49.1872 +ALPINOPOLIS, BRAZIL:-20.7028:W46.335 +FORTALEZA, BRAZIL:-3.77611:W38.5325 +RIO DE JANEIRO, BRAZIL:-22.8089:W43.2436 +GUAJARA-MIRIM, BRAZIL:-10.7861:W65.2847 +GOIANIA, BRAZIL:-16.6311:W49.2222 +SAO PAULO, BRAZIL:-23.4322:W46.4692 +PONTA GROSSA, BRAZIL:-25.1844:W50.1439 +GUARATINGUETA, BRAZIL:-22.7914:W45.2047 +ALTAMIRA, BRAZIL:-3.25389:W52.2539 +ITAITUBA, BRAZIL:-3.12722:W58.4811 +ITAITUBA, BRAZIL:-4.24222:W56.0006 +ILHEUS, BRAZIL:-14.8158:W39.0331 +IPATINGA, BRAZIL:-19.4706:W42.4875 +ITUMBIARA, BRAZIL:-18.4444:W49.2133 +IMPERATRIZ, BRAZIL:-5.53111:W47.46 +BELEM, BRAZIL:-1.41389:W48.4606 +JUIZ DE FORA, BRAZIL:-21.7914:W43.3867 +JOAO PESSOA, BRAZIL:-7.26972:W35.8961 +JOINVILLE, BRAZIL:-26.2247:W48.7972 +CAMPINAS, BRAZIL:-23.0081:W47.1344 +LAJES, BRAZIL:-27.7819:W50.2814 +LINS, BRAZIL:-21.6639:W49.7303 +LONDRINA, BRAZIL:-23.3336:W51.13 +BOM JESUS DA LAPA, BRAZIL:-13.2619:W43.4081 +LAGOA SANTA, BRAZIL:-19.6614:W43.8964 +MARABA, BRAZIL:-5.36833:W49.1378 +ALMEIRIM, BRAZIL:-0.889722:W52.6022 +MARINGA, BRAZIL:-23.4397:W51.9069 +MONTES CLAROS, BRAZIL:-16.7067:W43.8189 +MARILIA, BRAZIL:-22.1967:W49.9264 +MANAUS, BRAZIL:-3.14556:W59.9861 +MACEIO, BRAZIL:-9.51028:W35.7933 +MACAPA, BRAZIL:0.0505556:W51.0719 +MOCORD, BRAZIL:-5.20167:W37.3642 +SAO PAULO, BRAZIL:-23.5089:W46.6375 +MANICORE, BRAZIL:-5.81139:W61.2786 +NAVEGANTES, BRAZIL:-26.88:W48.6514 +SANTO ANGELO, BRAZIL:-28.2817:W54.1689 +NATAL, BRAZIL:-5.91111:W35.2478 +OIOIAPOQUE, BRAZIL:3.85528:W51.7967 +PORTO ALEGRE, BRAZIL:-29.9942:W51.1714 +PARNAIBA, BRAZIL:-2.89361:W41.7319 +POCOS DE CALDAS, BRAZIL:-21.8428:W46.5678 +PASSO FUNDO, BRAZIL:-28.2439:W52.3264 +PELOTAS, BRAZIL:-31.7183:W52.3275 +PETROLINA, BRAZIL:-9.36389:W40.5639 +PORTO NACIONAL, BRAZIL:-10.7192:W48.3997 +PONTA PORA, BRAZIL:-22.5494:W55.7025 +PORTO VELHO, BRAZIL:-8.70917:W63.9022 +VITORIA DA CONQUISTA, BRAZIL:-14.8625:W40.8631 +RIO BRANCO, BRAZIL:-9.86889:W67.8936 +RECIFE, BRAZIL:-8.12639:W34.9233 +RIO GRANDE, BRAZIL:-32.0825:W52.1664 +RIO DE JANEIRO, BRAZIL:-22.9103:W43.1631 +RIBEIRAO PRETO, BRAZIL:-21.1342:W47.7742 +RIO DE JANEIRO, BRAZIL:-22.9322:W43.7189 +SAO JOSE DOS CAMPOS, BRAZIL:-23.2292:W45.8614 +SAO LUIS, BRAZIL:-2.58861:W44.2364 +SANTAREM, BRAZIL:-29.7111:W53.6881 +SAO PAULO, BRAZIL:-23.6267:W46.6553 +SAO JOSE DO RIO PRETO, BRAZIL:-20.8164:W49.4064 +SANTOS, BRAZIL:-23.925:W46.2875 +SALVADOR, BRAZIL:-12.9108:W38.3308 +ORIXIMINA, BRAZIL:-1.48944:W56.3967 +TERESINA, BRAZIL:-5.05972:W42.8233 +TEFE, BRAZIL:-3.38278:W64.7239 +TARAUACA, BRAZIL:-8.155:W70.7831 +TELEMACO BORBA, BRAZIL:-24.3175:W50.6514 +OBIDOS TIRIOS, BRAZIL:2.22333:W55.9458 +TABATINGA, BRAZIL:-4.25556:W69.9356 +TUCURUI, BRAZIL:-3.785:W49.7194 +SAO GABRIEL, BRAZIL:-0.148333:W66.9856 +PAULO ALFONSO, BRAZIL:-9.40083:W38.2506 +URUGUAIANA, BRAZIL:-29.7819:W57.0381 +UBERLANDIA, BRAZIL:-18.8828:W48.2256 +CASTILHO, BRAZIL:-20.7769:W51.5647 +UBERABA, BRAZIL:-19.765:W47.9647 +VARGINHA, BRAZIL:-21.59:W45.4733 +VILHENA, BRAZIL:-12.6942:W60.0981 +VITORIA, BRAZIL:-20.2556:W40.2889 +IAUARETE, BRAZIL:0.6075:W69.1858 +PIRACUNUNGA, BRAZIL:-21.9853:W47.3381 +ANCUD, CHILE:-41.9061:W73.7967 +ALTO PALENA, CHILE:-43.6153:W71.8069 +ARICA, CHILE:-18.3483:W70.3386 +BALMACEDA, CHILE:-45.9158:W71.6892 +SANTIAGO, CHILE:-33.5617:W70.6883 +CHILE CHICO, CHILE:-46.5817:W71.6975 +CALAMA, CHILE:-22.4986:W68.9042 +CHILLAN, CHILE:-36.5828:W72.0317 +PUNTA ARENAS, CHILE:-53.0028:W70.8547 +COYHAIQUE, CHILE:-45.5942:W72.1061 +IQUIQUE, CHILE:-20.535:W70.1811 +SANTIAGO, CHILE:-33.3928:W70.7856 +ANTOFAGASTA, CHILE:-23.4444:W70.445 +PORVENIR, CHILE:-53.2536:W70.3192 +LOS ANGELES, CHILE:-37.4017:W72.4256 +PUERTO WILLIAMS, CHILE:-54.9308:W67.6261 +COPIAPO, CHILE:-27.2961:W70.4136 +CURICO, CHILE:-34.9669:W71.2169 +CONCEPCION, CHILE:-36.7725:W73.0631 +EASTER ISLAND, CHILE:-27.1647:W109.422 +OSORNO, CHILE:-40.6114:W73.0603 +VALLENAR, CHILE:-28.5975:W70.7592 +RANCAGUA, CHILE:-34.1736:W70.7756 +ISLA REY JORGE, ANTARCTICA:-62.1908:W58.9867 +LA SERENA, CHILE:-29.9164:W71.1911 +SANTO DOMINGO, CHILE:-33.6567:W71.6156 +CASTRO, CHILE:-42.4908:W73.7744 +SANTIAGO, CHILE:-33.4564:W70.5467 +TEMUCO, CHILE:-38.7686:W72.6358 +PUERTO MONTT, CHILE:-41.4386:W73.0939 +SANTIAGO, CHILE:-33.4933:W70.6975 +CHAITEN, CHILE:-42.9331:W72.6992 +VALDIVIA, CHILE:-39.6497:W73.0861 +AMBATO, ECUADOR:-1.2125:W78.5742 +CLEMENTIA, ECUADOR:-1.70611:W79.3789 +COCA, ECUADOR:-0.462778:W76.9864 +CUENCA, ECUADOR:-2.88944:W78.9842 +GALAPAGOS, GALAPAGOS I. (ECUADOR:-0.453611:W90.2658 +GUAYAQUIL, ECUADOR:-2.15778:W79.8839 +GUALAQUIZA, ECUADOR:-3.42333:W78.5731 +IBARRA, ECUADOR:0.338333:W78.1364 +LAGO AGRIO, ECUADOR:0.0922222:W76.8692 +LA JULIA, ECUADOR:-1.70417:W79.5522 +LOMA LARGA, ECUADOR:-1.50139:W79.4808 +LATACUNGA, ECUADOR:-0.906667:W78.6156 +MACARA, ECUADOR:-4.38028:W79.9406 +MACAS, ECUADOR:-2.29917:W78.1206 +MACHALA, ECUADOR:-3.26889:W79.9617 +MONTALVO, ECUADOR:-2.06694:W76.9753 +MANTA, ECUADOR:-0.945556:W80.6781 +MARAGROSA, ECUADOR:-2.85083:W79.8036 +MARTINICA, ECUADOR:-1.73972:W79.6217 +PEDERNALES, ECUADOR:0.0730556:W80.0522 +PORTOVIEJO, ECUADOR:-1.04139:W80.4719 +QUITO, ECUADOR:-0.141111:W78.4881 +RIOBAMBA, ECUADOR:-1.65361:W78.6561 +SANTA ROSA, ECUADOR:-3.43528:W79.9778 +SALINAS, ECUADOR:-2.20472:W80.9886 +SANTO DOMINGO, ECUADOR:-0.248056:W79.2144 +SAN CRISTOBAL, ECUADOR:-0.909722:W89.6158 +TAURA, ECUADOR:-2.26083:W79.6892 +TENA, ECUADOR:-0.986667:W77.8194 +TARAPOA, ECUADOR:-0.122778:W76.3375 +TULCAN, ECUADOR:0.809444:W77.7081 +STANLEY, FALKLAND ISLANDS:-51.6856:W57.7775 +ASUNCION, PARAGUAY:-25.2397:W57.5189 +AYOLAS, PARAGUAY:-27.3706:W56.8539 +CONCEPTION, PARAGUAY:-23.4417:W57.4269 +FILADELFIA, PARAGUAY:-22.3597:W60.0536 +ITAIPU, PARAGUAY:-25.4075:W54.6194 +MARISCAL ESTIGARRIBIA, PARAGUAY:-22.0447:W60.6217 +PILAR, PARAGUAY:-26.8814:W58.3178 +ARMENIA, COLOMBIA:4.536307:W75.6723751 +PUERTO ASIS, COLOMBIA:9.4424024:W75.1379851 +EL BANCO, COLOMBIA:9.04528:W73.9747 +BUCARAMANGA, COLOMBIA:7.12639:W73.1847 +BOGOTA, COLOMBIA:4.6533326:W74.083652 +BARRANQUILLA, COLOMBIA:10.8894:W74.7806 +BAHIA SOLANO, COLOMBIA:6.20278:W77.3944 +BUENAVENTURA, COLOMBIA:3.81944:W76.9897 +CUCUTA, COLOMBIA:7.9275:W72.5114 +CONDOTO, COLOMBIA:5.07167:W76.6764 +CARTAGENA, COLOMBIA:10.4422:W75.5128 +CALI, COLOMBIA:3.54306:W76.3814 +TUMACO, COLOMBIA:1.81417:W78.7492 +COROZAL, COLOMBIA:9.3325:W75.2856 +BARRANCABERMEJA, COLOMBIA:7.02417:W73.8067 +FLORENCIA, COLOMBIA:1.59028:W75.5639 +GIRARDOT, COLOMBIA:4.27611:W74.7967 +CARTAGO, COLOMBIA:4.75806:W75.9556 +GUAPI, COLOMBIA:2.57:W77.8983 +GUAYMARAL, COLOMBIA:4.81222:W74.0647 +IBAGUE, COLOMBIA:4.42139:W75.1331 +IPIALES, COLOMBIA:0.861667:W77.6717 +CAREPA, COLOMBIA:7.81194:W76.7164 +LA MINA, COLOMBIA:11.2325:W72.49 +LETICIA, COLOMBIA:-4.19306:W69.9425 +MEDELLIN, COLOMBIA:6.22:W75.5906 +MAGANGUE, COLOMBIA:9.28333:W74.8394 +MONTERIA, COLOMBIA:8.82361:W75.8258 +MITU, COLOMBIA:1.25361:W70.2336 +MANIZALES, COLOMBIA:5.02972:W75.465 +NEIVA, COLOMBIA:2.95:W75.2939 +OCANA, COLOMBIA:8.31472:W73.3583 +OTU, COLOMBIA:7.01028:W74.7153 +PUERTO BOLIVAR, COLOMBIA:12.2214:W71.9847 +PUERTO CARRENO, COLOMBIA:6.18444:W67.4931 +PEREIRA, COLOMBIA:4.8125:W75.7394 +PITALITO, COLOMBIA:1.85833:W76.0858 +POPAYAN, COLOMBIA:2.45417:W76.61 +PASTO, COLOMBIA:1.39639:W77.2908 +PROVIDENCIA, COLOMBIA:13.3569:W81.3583 +MARIQUITA, COLOMBIA:5.2125:W74.8836 +RIO NEGRO, COLOMBIA:6.16444:W75.4231 +RIO HACHA, COLOMBIA:11.5261:W72.9258 +SARAVENA, COLOMBIA:6.95806:W71.855 +SAN JOSE DEL GUAVIARE, COLOMBIA:2.57944:W72.6392 +SANTA MARTA, COLOMBIA:11.1194:W74.2306 +SAN ANDRES ISLAND, COLOMBIA:12.5833:W81.7111 +SAN VINCENTE DE CAGUAN, COLOMBIA:2.15194:W74.7661 +TRINIDAD, COLOMBIA:5.43028:W71.6581 +TAME, COLOMBIA:6.45083:W71.76 +TURBO, COLOMBIA:8.07444:W76.7411 +ARAUCA, COLOMBIA:7.06861:W70.7367 +QUIBDO, COLOMBIA:5.69056:W76.6411 +TULUA, COLOMBIA:4.08833:W76.235 +VALLEDUPAR, COLOMBIA:10.435:W73.2494 +VILLAVICENCIO, COLOMBIA:4.16778:W73.6136 +EL-YOPAL, COLOMBIA:5.31889:W72.3839 +APOLO, BOLIVIA:-14.7394:W68.4108 +ASCENSION DE GUARAYOS, BOLIVIA:-15.7192:W63.0922 +BERMEJO, BOLIVIA:-22.7694:W64.315 +CAMIRI, BOLIVIA:-20.0069:W63.5275 +COCHABAMBA, BOLIVIA:-17.4208:W66.1769 +CHAPACURA, BOLIVIA:-16.99:W65.1414 +CHARANA, BOLIVIA:-17.5939:W69.4342 +COBIJA, BOLIVIA:-11.0403:W68.7828 +CONCEPTION, BOLIVIA:-16.1433:W62.0258 +GUAYARAMERIN, BOLIVIA:-10.8217:W65.3458 +SAN JOAQUIN, BOLIVIA:-13.0528:W64.6617 +LA PAZ, BOLIVIA:-16.5131:W68.1922 +MAGDALENA, BOLIVIA:-13.2536:W64.0628 +ORURO, BOLIVIA:-17.9633:W67.0761 +POTOSI, BOLIVIA:-19.5433:W65.7239 +PUERTO SUAREZ, BOLIVIA:-18.9753:W57.8206 +SAN RAMON, BOLIVIA:-13.2636:W64.6053 +ROBORE, BOLIVIA:-18.3281:W59.7661 +RIBERALTA, BOLIVIA:-11.0103:W66.0733 +RURRENABAQUE, BOLIVIA:-14.4283:W67.5014 +REYES, BOLIVIA:-14.3061:W67.3536 +SANTA ANA, BOLIVIA:-13.7619:W65.435 +SAN BORJA, BOLIVIA:-14.8575:W66.7375 +SAN IGNACIO DE VELASCO, BOLIVIA:-16.3844:W60.9628 +SAN IGNACIO DE MOXOS, BOLIVIA:-14.9656:W65.6336 +SUCRE, BOLIVIA:-19.0069:W65.2889 +SAN MATHIAS, BOLIVIA:-16.3386:W58.4017 +TARIJA, BOLIVIA:-21.5556:W64.7008 +TRINIDAD, BOLIVIA:-14.8194:W64.9183 +SANTA CRUZ, BOLIVIA:-17.6447:W63.1353 +ZANDERY, SURINAM:5.45278:W55.1878 +PARAMARIBO, SURINAM:5.81083:W55.1906 +CAYENNE, FRENCH GUYANA:4.81972:W52.3603 +ST.-GEORGES OYAPOCK, FRENCH GUYANA:3.8975:W51.8039 +CIRO ALEGRIA, PERU:-4.6075:W77.9408 +ANDOAS, PERU:-2.795:W76.4661 +ATALAYA, PERU:-10.7289:W73.7664 +MOYOBAMBA, PERU:-6.01889:W76.9883 +CABALLOCOCHA, PERU:-3.91667:W70.5081 +IBERIA, PERU:-11.4114:W69.4886 +PUCALLPA, PERU:-8.37778:W74.5742 +CHIMBOTE, PERU:-9.15083:W78.5236 +PUERTO ESPERANZA, PERU:-9.76806:W70.7064 +MOQUEGUA, PERU:-17.1789:W70.9306 +TINGO MARIA, PERU:-9.29:W76.0058 +CHICLAYO, PERU:-6.78722:W79.8281 +AYACUCHO, PERU:-13.1547:W74.2042 +ANDAHUAYLAS, PERU:-13.7064:W73.3503 +ANTA, PERU:-9.34722:W77.5983 +LIMA, PERU:-12.0217:W77.1142 +JUANJUI, PERU:-7.16944:W76.7278 +JAUJA, PERU:-11.7831:W75.4733 +JULIACA, PERU:-15.4669:W70.1581 +SAN JUAN, PERU:-15.3575:W75.1356 +CAJAMARCA, PERU:-7.13639:W78.49 +ILO, PERU:-17.695:W71.3439 +LAS PALMAS, PERU:-12.1606:W76.9989 +TUMBES, PERU:-3.5525:W80.3808 +YURIMAGUAS, PERU:-5.89389:W76.1183 +HUANUCO, PERU:-9.87806:W76.2042 +COLLIQUE, PERU:-11.9286:W77.0611 +CHACHAPOYAS, PERU:-6.20167:W77.8558 +IQUITOS, PERU:-3.78472:W73.3086 +AREQUIPA, PERU:-16.3408:W71.5831 +SAN RAMON, PERU:-11.1286:W75.3503 +TRUJILLO, PERU:-8.08472:W79.1094 +PISCO, PERU:-13.7447:W76.2203 +TARAPOTO, PERU:-6.50861:W76.3731 +TACNA, PERU:-18.0533:W70.2758 +TALARA, PERU:-4.54972:W81.2239 +PUERTO MALDONADO, PERU:-12.6136:W69.2289 +PIURA, PERU:-5.20556:W80.6164 +TALARA, PERU:-4.57639:W81.2539 +NAZCA, PERU:-14.8539:W74.9614 +CUZCO, PERU:-13.5356:W71.9386 +MONTEVIDEO, URUGUAY:-34.7892:W56.2644 +ARTIGAS, URUGUAY:-30.4006:W56.5078 +COLONIA, URUGUAY:-34.4564:W57.7706 +DURAZNO, URUGUAY:-33.3586:W56.4992 +MALDONADO, URUGUAY:-34.855:W55.0942 +MELO, URUGUAY:-32.3378:W54.2167 +MONTEVIDEO, URUGUAY:-34.8378:W56.0303 +PUNTA DEL ESTE, URUGUAY:-34.9136:W54.9206 +PAYSANDU, URUGUAY:-32.365:W58.0611 +RIVERA, URUGUAY:-30.9744:W55.4761 +SALTO, URUGUAY:-31.4397:W57.9906 +TACUAREMBO, URUGUAY:-31.7489:W55.9256 +ACARIGUA, VENEZUELA:9.55333:W69.2378 +ANACO, VENEZUELA:9.42917:W64.4708 +SAN FERNANDO DEATABAPO, VENEZUELA:4.05167:W67.7008 +BARCELONA, VENEZUELA:10.1069:W64.6889 +BARINAS, VENEZUELA:8.61944:W70.2206 +MARACAIBO, VENEZUELA:10.1833:W67.5572 +BARQUISIMETO, VENEZUELA:10.0425:W69.3583 +MARACAY, VENEZUELA:10.2497:W67.6492 +CIUDAD BOLIVAR, VENEZUELA:8.12194:W63.5369 +CAICARA DE ORINOCO, VENEZUELA:7.62583:W66.1647 +SAN CARLOS, VENEZUELA:9.64889:W68.5753 +CALABOZO, VENEZUELA:8.92444:W67.4169 +CANAIMA, VENEZUELA:6.23194:W62.8542 +CARORA, VENEZUELA:10.1756:W70.065 +CARUPANO, VENEZUELA:10.66:W63.2617 +CORO, VENEZUELA:11.4147:W69.6808 +CARACAS, VENEZUELA:10.2861:W66.8158 +CUMANA, VENEZUELA:10.4503:W64.1303 +CARRIZAL, VENEZUELA:9.37194:W66.9228 +EL DORADO, VENEZUELA:6.715:W61.6389 +ELORZA, VENEZUELA:7.05972:W69.4967 +GUASDUALITO, VENEZUELA:7.21083:W70.7564 +GUIRIA, VENEZUELA:10.5739:W62.3125 +GUANARE, VENEZUELA:9.02694:W69.755 +HIGUEROTE, VENEZUELA:10.4622:W66.0925 +ISLA DE COCHE, VENEZUELA:10.7942:W63.9814 +PARAGUANA, VENEZUELA:11.7808:W70.1517 +SAN JUAN DE LOS MORROS, VENEZUELA:9.90694:W67.3794 +LA FRIA, VENEZUELA:8.23917:W72.2708 +LA ORCHILA, VENEZUELA:11.8086:W66.1792 +MARACAIBO, VENEZUELA:10.5581:W71.7278 +MERIDA, VENEZUELA:8.58194:W71.1608 +PORLAMAR, VENEZUELA:10.9125:W63.9664 +CARACAS, VENEZUELA:10.6031:W66.9906 +MATURIN, VENEZUELA:9.74917:W63.1522 +PUERTO AYACUCHO, VENEZUELA:5.61972:W67.6058 +PUERTO CABELLO, VENEZUELA:10.4803:W68.0728 +SAN CRISTOBAL, VENEZUELA:7.80111:W72.2028 +GUAYANA, VENEZUELA:8.28833:W62.7603 +PALMARITO, VENEZUELA:7.57556:W70.1742 +SAN ANTONIO, VENEZUELA:7.85222:W72.4347 +SANTA BARBARA, VENEZUELA:7.80333:W71.1656 +SANTO DOMINGO, VENEZUELA:7.565:W72.035 +SAN FELIPE, VENEZUELA:10.2786:W68.755 +SAN FERNANDO DE APURE, VENEZUELA:7.8825:W67.4436 +SAN TOME, VENEZUELA:8.945:W64.1508 +SANTA BARBARA, VENEZUELA:8.97444:W71.9431 +TUCUPITA, VENEZUELA:9.08889:W62.0942 +TUMEREMO, VENEZUELA:7.24917:W61.5289 +VALENCIA, VENEZUELA:10.1581:W67.9267 +MERIDA, VENEZUELA:8.62417:W71.6728 +VALERA, VENEZUELA:9.34056:W70.5839 +VALLE DE LA PASCUA, VENEZUELA:9.22194:W65.9933 +KAMARANG, GUYANA:5.86528:W60.6142 +LINDEN, GUYANA:5.96583:W58.2703 +LETHEM, GUYANA:3.3725:W59.7892 +ANTIGUA, LEEWARD ISLANDS:17.1367:W61.7925 +BRIDGETOWN, BARBADOS:13.0744:W59.4922 +CANEFIELD, DOMINICA:15.3367:W61.3919 +DOMINICA, DOMINICA:15.5469:W61.3 +FORT-DE-FRANCE, ANTILLES:14.5908:W61.0031 +ST. MARTIN, ANTILLES:18.0997:W63.0469 +ST.-BARTHELEMY, ANTILLES:17.9:W62.85 +GRAND-BOURG, ANTILLES:15.8686:W61.27 +POINTE-A-PITRE, ANTILLES:16.2653:W61.5317 +POINT SALINES, GRENADA:12.0042:W61.7861 +ST. THOMAS, VIRGIN ISL.:18.3372:W64.9733 +ST. CRIOX ISLAND, VIRGIN ISL.:17.7017:W64.7983 +AGUADILLA, PUERTO RICO:18.4947:W67.1294 +FAJARDO, PUERTO RICO:18.3089:W65.6617 +SAN JUAN, PUERTO RICO:18.4567:W66.0981 +MAYAGUEZ, PUERTO RICO:18.2556:W67.1483 +ROOSEVELT ROADS, PUERTO RICO:18.245:W65.6433 +PONCE, PUERTO RICO:18.0081:W66.5628 +SAN JUAN, PUERTO RICO:18.4392:W66.0017 +BASSE TERRE, ST. KITTS & NEVIS:17.3111:W62.7186 +CHARLESTOWN, ST. KITTS & NEVIS:17.2056:W62.5897 +CASTRIES, ST. LUCIA ISLAND:14.02:W60.9928 +HEWANDORRA, ST. LUCIA ISLAND:13.7331:W60.9525 +ORANJESTAD, ARUBA:12.5014:W70.015 +KRALENDIJK, ANTILLES:12.1308:W68.2683 +WILLEMSTAD, ANTILLES:12.1886:W68.9597 +ORANJESTAD, ANTILLES:17.4964:W62.9792 +PHILIPSBURG, ANTILLES:18.0408:W63.1089 +THE VALLEY, ANGUILLA ISL.:18.2047:W63.055 +PLYMOUTH, MONTSERRAT ISLAND:33.5869:W80.2086 +SCARBOROUGH, TRINIDAD & TOBAGO:11.1494:W60.8319 +PORT-OF-SPAIN, TRINIDAD & TOBAGO:10.5953:W61.3372 +ROADTOWN/BEEF ISLAND, VIRGIN ISL.:18.4447:W64.5428 +BEQUIA, ST.VINCENT/GRENADINES:12.9883:W61.2619 +CANOUAN ISLAND, ST.VINCENT/GRENADINES:12.6989:W61.3422 +MUSTIQUE, ST.VINCENT/GRENADINES:12.8875:W61.18 +KINGSTOWN, ST.VINCENT/GRENADINES:13.1442:W61.2108 +ALMA-ATA, KAZAKHSTAN:43.3519:77.0403 +BALKHASH, RUSSIA:46.8942:75.0047 +TSELINOGRAD, RUSSIA:51.0222:71.4672 +BISHKEK, RUSSIA:43.0617:74.4783 +OSH, RUSSIA:40.6089:72.7931 +CHIMKENT, RUSSIA:42.3644:69.4792 +DZHEZKAZGAN, RUSSIA:47.7083:67.7333 +URALSK, RUSSIA:51.1517:51.5456 +SEMIPLATINSK, RUSSIA:50.3511:80.2342 +SHEVCHENKO, RUSSIA:43.86:51.0919 +AKTYUBINSK, RUSSIA:50.245:57.2033 +KUSTANAY, RUSSIA:53.2064:63.5508 +BAKU, RUSSIA:40.4675:50.0467 +ALDAN, RUSSIA:34.8042:W96.6711 +YAKUTSK, RUSSIA:62.0931:129.771 +POLYARNY, RUSSIA:66.4167:112.05 +YEREVAN, RUSSIA:40.1483:44.3967 +TBILISI, GEORGIA:41.6692:44.9547 +SUKHUMI, GEORGIA:42.8581:41.1281 +BLAGOVESCHENSK, RUSSIA:50.4217:127.41 +KHABAROVSK, RUSSIA:48.5278:135.188 +ANADYR, RUSSIA:64.7347:177.741 +PROVIDENIYA BAY, RUSSIA:64.38:W173.247 +MAGADAN, RUSSIA:59.91:150.717 +PEVEK, RUSSIA:67.5:171 +PETROPAVLOVSK, RUSSIA:53.1664:158.453 +OKHA, RUSSIA:53.515:142.888 +YUZHNO-SAKHALINSK, RUSSIA:46.8886:142.717 +VLADIVOSTOK, RUSSIA:43.3989:132.151 +CHITA, RUSSIA:52.0261:113.305 +BRATSK, RUSSIA:56.3708:101.699 +IRKUTSK, RUSSIA:52.2669:104.395 +ULAN-UDE, RUSSIA:51.8067:107.438 +KIEV, RUSSIA:50.345:30.895 +DONETSK, RUSSIA:48.0733:37.74 +DNEPROPETROVSK, RUSSIA:48.3567:35.1017 +SIMFEROPOL, RUSSIA:45.0386:33.9831 +KHARKOV, RUSSIA:49.3589:26.9339 +KIEV, RUSSIA:50.4017:30.4517 +LVOV, RUSSIA:49.8125:23.9561 +CHERNOVTSK, RUSSIA:48.26:25.9817 +ODESSA, RUSSIA:46.4269:30.6781 +ST. PETERSBURG, RUSSIA:59.8:30.265 +MURMANSK, RUSSIA:68.7817:32.7506 +GOMEL, RUSSIA:52.5269:31.0167 +VITEBSK, RUSSIA:55.1667:30.1333 +KALININGRAD, RUSSIA:54.89:20.5925 +MINSK, RUSSIA:53.8644:27.5394 +MINSK 2, RUSSIA:53.8822:28.0306 +ABAKAN, RUSSIA:53.74:91.385 +BARNAUL, RUSSIA:53.3639:83.5419 +KEMOROVO, RUSSIA:55.2697:86.1069 +OMSK, RUSSIA:54.9669:73.31 +KRASNODAR, RUSSIA:45.035:39.1717 +MAKHACHKALA, RUSSIA:42.8167:47.6522 +MINERALNYE VODY, RUSSIA:44.225:43.0817 +STAVROPOL, RUSSIA:45.1092:42.1128 +ROSTOV, RUSSIA:47.2581:39.8178 +SOCHI, RUSSIA:43.4458:39.9475 +ASTRAKHAN, RUSSIA:46.2833:48.0061 +VOLGOGRAD, RUSSIA:48.7822:44.3447 +CHELYABINSK, RUSSIA:55.3033:61.5067 +MAGNETIOGORSK, RUSSIA:53.3933:58.76 +SALEKHARD, RUSSIA:66.59:66.6103 +NIZHNEVARTOVSK, RUSSIA:60.95:76.4667 +PERM, RUSSIA:57.9167:56.0256 +SURGUT, RUSSIA:61.25:73.5 +SVERDLOVSK, RUSSIA:56.7414:60.8036 +TOBOLSK, RUSSIA:37.1322:W92.0839 +KURGAN, RUSSIA:55.475:65.4147 +ASHKHABAD, RUSSIA:37.9917:58.3633 +KRASNOVODSK, RUSSIA:40.0333:52.9833 +CHARDZHOU, RUSSIA:39.0833:63.6133 +DUSHANBE, RUSSIA:38.5433:68.825 +NUKUS, RUSSIA:42.4864:59.6225 +BUKHARA, RUSSIA:39.775:64.48 +SAMARKAND, RUSSIA:39.7006:66.9847 +TERMEZ, RUSSIA:37.2864:67.3083 +TASHKENT, UZBEKISTAN:41.2572:69.2817 +BRYANSK, RUSSIA:53.2142:34.1764 +MOSCOW, RUSSIA:55.7504461:37.6174943 +TVER, RUSSIA:56.8247:35.7575 +VORONEZH, RUSSIA:51.8142:39.2297 +SYKTYVKAR, RUSSIA:61.6475:50.8456 +KAZAN, RUSSIA:55.6078:49.2772 +ORENBURG, RUSSIA:51.7956:55.4567 +PENZA, RUSSIA:28.9542:W98.5197 +UFA, RUSSIA:54.5575:55.8742 +SAMARA, RUSSIA:53.5053:50.1644 +AHMEDABAD, INDIA:23.0747:72.6317 +AKOLA, INDIA:20.6989:77.0564 +AURANGABAD, INDIA:19.8631:75.3981 +BOMBAY, INDIA:19.0886:72.8678 +BILASPUR, INDIA:21.9886:82.1111 +BHUJ, INDIA:23.2878:69.67 +BELGAUM, INDIA:15.8592:74.6181 +BARODA, INDIA:22.3361:73.2261 +BHOPAL, INDIA:23.285:77.3372 +BHAUNAGAR, INDIA:21.7519:72.185 +DAMAN, INDIA:20.435:72.8436 +DEESA, INDIA:24.2678:72.2053 +GOA, INDIA:15.3806:73.8331 +INDORE, INDIA:22.7217:75.8008 +JABALPUR, INDIA:23.1778:80.0519 +BOMBAY, INDIA:19.0981:72.8339 +JAMNAGAR, INDIA:22.4664:70.0114 +KANDLA, INDIA:23.1125:70.1003 +KHAJURAHO, INDIA:24.8194:79.9192 +KOLHAPUR, INDIA:16.6639:74.2881 +KESHOD, INDIA:21.3167:70.27 +NAGPUR, INDIA:21.0919:79.0469 +NASIK ROAD, INDIA:19.9625:73.8069 +PUNE, INDIA:18.5819:73.9194 +PORBANDAR, INDIA:21.6494:69.6564 +RAJKOT, INDIA:22.3092:70.7794 +RAIPUR, INDIA:21.1803:81.7386 +SHOLAPUR, INDIA:17.6278:75.9347 +SURAT, INDIA:21.115:72.7428 +UDAIPUR, INDIA:24.6175:73.9128 +COLOMBO, SRI LANKA:7.18111:79.8836 +ANURADHAPURA, SRI LANKA:8.30111:80.4281 +BATTICALOA, SRI LANKA:7.70556:81.6778 +COLOMBO, SRI LANKA:6.82194:79.8861 +GALOYA, SRI LANKA:7.3375:81.6256 +JAFFNA, SRI LANKA:9.79222:80.07 +TRINCIOMALEE, SRI LANKA:8.53889:81.1814 +WIRAWILA, SRI LANKA:6.25444:81.235 +BATTAMBANG, CAMBODIA:13.0956:103.224 +KOMPONG CHNANG, CAMBODIA:12.255:104.564 +PHNOM-PENH, CAMBODIA:11.5464:104.844 +SIEM-REAP, CAMBODIA:13.4106:103.813 +STUNG TRENG, CAMBODIA:13.5314:106.014 +ALONG, INDIA:28.1747:94.8019 +AGARTALA, INDIA:23.8889:91.2408 +AIZWAL, INDIA:23.7461:92.8031 +BAGHDOGRA, INDIA:26.6814:88.3281 +BALURGHAT, INDIA:25.2608:88.7956 +BOKARO, INDIA:23.6433:86.1486 +BHUBANESWAR, INDIA:20.2442:85.8178 +CALCUTTA, INDIA:22.6547:88.4467 +COOCH-BEHAR, INDIA:26.3303:89.4669 +DHANBAD, INDIA:23.8339:86.425 +DEPARIZO, INDIA:27.9889:94.2233 +GORAKHPUR, INDIA:26.7394:83.4494 +GAUHATI, INDIA:26.1061:91.5847 +GAYA, INDIA:24.7481:84.9425 +HIRAKUD, INDIA:21.5792:84.0061 +IMPHAL, INDIA:24.7597:93.8969 +JHARSUGUDA, INDIA:21.9133:84.0503 +JEYPORE, INDIA:18.8797:82.5519 +JAMSHEDPUR, INDIA:22.8119:86.1675 +JORHAT, INDIA:26.7306:94.1756 +KAMALPUR, INDIA:24.135:91.8106 +KAILASHAHAR, INDIA:24.3083:92.0075 +SILCHAR, INDIA:24.9128:92.9786 +LILABARI, INDIA:27.2906:94.0967 +MOHANBARI, INDIA:27.4833:95.0175 +MAZUFFARPUR, INDIA:26.12:85.3131 +NAWAPARA, INDIA:20.87:82.5194 +PASIGHAT, INDIA:28.0661:95.3356 +PANAGARH, INDIA:23.4744:87.4278 +PATINA, INDIA:25.5906:85.0878 +PURNEA, INDIA:25.76:87.4092 +RANCHI, INDIA:23.3147:85.3214 +ROURKELA, INDIA:22.2564:84.8144 +UTKELA, INDIA:20.0975:83.1833 +ZERO, INDIA:27.5881:93.8283 +COX'S BAZAR, BANGLADESH:21.4519:91.9642 +CHITTAGONG, BANGLADESH:22.2494:91.8131 +ISHURDI, BANGLADESH:24.1525:89.0494 +JESSORE, BANGLADESH:23.1836:89.1608 +RAJSHAHI, BANGLADESH:24.4369:88.6164 +SAIDPUR, BANGLADESH:25.7592:88.9086 +SYLHET OSMANI, BANGLADESH:24.9628:91.8672 +DHAKA, BANGLADESH:23.7783:90.3825 +DHAKA, BANGLADESH:23.8433:90.3978 +HONG KONG, HONG KONG:22.3089:113.914 +SEK KONG, HONG KONG:22.4364:114.08 +AGRA, INDIA:27.1556:77.9608 +ALLAHABAD, INDIA:25.4389:81.7342 +AMRITSAR, INDIA:31.7075:74.7992 +BIKANER, INDIA:28.0725:73.2067 +BAKSHI KA TALAB, INDIA:26.9883:80.8931 +VARANASI, INDIA:25.4519:82.8589 +KULU, INDIA:31.8817:77.1844 +BHATINDA, INDIA:30.27:74.7556 +BHIWANI, INDIA:28.8375:76.1775 +BAREILLY, INDIA:28.4222:79.4497 +CHANDIGARH, INDIA:30.6733:76.7883 +KANPUR, INDIA:26.4042:80.41 +DELHI, INDIA:28.5842:77.2053 +DEHRA DUN, INDIA:30.1872:78.18 +DELHI, INDIA:28.5664:77.1031 +GUNA, INDIA:24.6544:77.3472 +GWALIOR, INDIA:26.2939:78.2275 +HISSAR, INDIA:29.1806:75.7531 +JHANSI, INDIA:25.4897:78.5594 +JODHPUR, INDIA:26.2514:73.0481 +JAIPUR, INDIA:26.8239:75.8097 +JAISALMER, INDIA:26.8892:70.8644 +JAMMU, INDIA:32.6897:74.8381 +KANPUR, INDIA:26.4411:80.3633 +KOTA, INDIA:25.1606:75.8447 +LUDHIAHA, INDIA:30.8544:75.9511 +LEH, INDIA:34.1356:77.5456 +LUCKNOW, INDIA:26.7606:80.8864 +PATHANKOT, INDIA:32.2336:75.6344 +PATIALA, INDIA:30.315:76.3633 +NAINITAL, INDIA:29.0331:79.4736 +RAIBARELLI, INDIA:26.2503:81.3806 +SHIMLA, INDIA:31.0817:77.0581 +SAHARANPUR, INDIA:29.9942:77.4242 +SRINAGAR, INDIA:33.9867:74.7736 +BANE HOUEI SAY, LAOS:20.2572:100.437 +LUANG PRABANG, LAOS:19.8972:102.161 +PAKSE, LAOS:15.1319:105.781 +PHONG SAVANH, LAOS:19.4547:103.218 +SAVANNAKHET, LAOS:16.5564:104.759 +VIENTIANE, LAOS:17.9881:102.563 +MACAU, MACAU:22.1494:113.591 +BHAIRAWA, NEPAL:27.5056:83.4161 +CHANDRAGARHI, NEPAL:26.5706:88.0794 +JANAKPUR, NEPAL:26.7086:85.9222 +KATHMANDU, NEPAL:27.6964:85.3592 +NEPALGUNJ, NEPAL:28.1036:81.6669 +POKHARA, NEPAL:28.2003:83.9811 +SIMARA, NEPAL:27.1594:84.98 +BIRATNAGAR, NEPAL:26.4833:87.2636 +AGATTI ISLAND, INDIA:10.8233:72.1756 +BANGALORE, INDIA:12.9497:77.6681 +BIDAR, INDIA:17.9078:77.4858 +VIJAYAWADA, INDIA:16.5303:80.7967 +COIMBATORE, INDIA:11.0314:77.0439 +CALICUT, INDIA:11.1356:75.9547 +CUDDAPAH, INDIA:14.5097:78.7728 +CARNICOBAR, INDIA:9.15306:92.8192 +DUNDIGUL, INDIA:17.6292:78.4033 +HYDERABAD, INDIA:17.4522:78.4611 +MADURAI, INDIA:9.83444:78.0933 +MANGALORE, INDIA:12.96:74.8925 +MADRAS, INDIA:12.9942:80.1803 +NAGARJUNSAGAR, INDIA:16.5408:79.3178 +PORT BLAIR, INDIA:11.6456:92.7331 +RAJAHMUNDRY, INDIA:17.1094:81.8183 +SALEM, INDIA:11.7819:78.0653 +TANJORE, INDIA:10.7197:79.1036 +TIRUPETI, INDIA:13.6319:79.5431 +TIRUCHCHIRAPPALLI, INDIA:10.7653:78.7089 +TRIVANDRUM, INDIA:8.48194:76.9181 +TAMBARAM, INDIA:12.9067:80.1211 +WARANGAL, INDIA:17.9181:79.5986 +PARO, BHUTAN:27.4031:89.4258 +MALE, MALDIVES:4.19167:73.5289 +BANGKOK, THAILAND:13.9125:100.607 +NAKHON PATHOM, THAILAND:14.1019:99.9169 +LOP BURI, THAILAND:14.8744:100.663 +RAYONG, THAILAND:12.6797:101.005 +PRACHIN BURI, THAILAND:13.7686:102.315 +CHIANG RAI, THAILAND:19.4972:100.286 +LAMPANG, THAILAND:18.2719:99.5039 +PHRAE, THAILAND:18.1319:100.164 +PRACHUAP KHIRI KHAN, THAILAND:12.6339:99.9508 +NAKHON SAWAN, THAILAND:15.2772:100.296 +PHETCHABUN, THAILAND:16.8208:101.254 +TAK, THAILAND:16.6997:98.545 +NAKHON SAWAN, THAILAND:15.6728:100.137 +PHITSANULOK, THAILAND:16.7828:100.279 +UTTARADIT, THAILAND:17.6736:100.235 +TAK, THAILAND:17.2342:99.0578 +NARATHIWAT, THAILAND:6.51972:101.743 +KRBI, THAILAND:8.09889:98.9861 +SONGKHLA, THAILAND:7.18639:100.608 +PATTANI, THAILAND:6.78528:101.153 +SURAT THANI, THAILAND:9.54778:100.062 +NAKHON SI THAMMARAT, THAILAND:8.47111:99.9556 +PHUKET, THAILAND:8.11306:98.3167 +RANONG, THAILAND:9.7775:98.5853 +SONGKHLA, THAILAND:6.93306:100.393 +TRANG, THAILAND:7.50861:99.6164 +YA LA, THAILAND:6.52667:101.242 +UDON THANI, THAILAND:17.3864:102.788 +SAKON NAKHON, THAILAND:17.195:104.119 +SURIN, THAILAND:14.8692:103.489 +LOEI, THAILAND:17.4389:101.722 +NAKHON RATCHASIMA, THAILAND:14.9342:102.079 +NAKHON PHANOM, THAILAND:17.4125:104.777 +NAKHON PHANOM, THAILAND:17.3836:104.643 +DANANG, VIET NAM:16.0439:108.199 +HANOI, VIET NAM:21.2217:105.806 +NHATRANG, VIET NAM:12.2181:109.2 +HO CHI MINH CITY, VIET NAM:10.82:106.662 +BAGAN, MYANMAR:21.1819:94.9292 +BANMAW, MYANMAR:24.2689:97.2461 +COCO ISLAND, MYANMAR:14.1414:93.3683 +DAWEI, MYANMAR:14.0981:98.2017 +HEHO, MYANMAR:20.7431:96.7917 +KENGTUNG, MYANMAR:21.3006:99.6367 +KALAY, MYANMAR:23.1886:94.0508 +KYAUKPYU, MYANMAR:19.4267:93.5344 +KAWTHOUNG, MYANMAR:10.0492:98.5378 +LOIKAW, MYANMAR:19.6922:97.2147 +LASHIO, MYANMAR:22.9775:97.7522 +LANYWA, MYANMAR:20.9403:94.8225 +MANDALAY, MYANMAR:21.7019:95.9778 +MYEIK, MYANMAR:12.4433:98.6211 +MYITKYINA, MYANMAR:25.3825:97.3528 +MAWLAMYINE, MYANMAR:16.4447:97.6606 +MOMEIK, MYANMAR:23.0925:96.645 +MONG HSAT, MYANMAR:20.5167:99.2567 +NAMPONG, MYANMAR:25.3542:97.295 +NAMSANG, MYANMAR:20.89:97.7361 +HPA-AN, MYANMAR:16.8944:97.6753 +PATHEIN, MYANMAR:16.8128:94.7753 +PUTAO, MYANMAR:27.3297:97.4261 +PYAY, MYANMAR:18.8244:95.2658 +SHANTE, MYANMAR:20.9417:95.9144 +SITTWE, MYANMAR:20.1325:92.8725 +THANDWE, MYANMAR:18.4606:94.2994 +TACHILEK, MYANMAR:20.4836:99.9353 +TAUNGOO, MYANMAR:19.0311:96.4014 +YANGON, MYANMAR:16.9072:96.1331 +UJUNG PANDANG, INDONESIA:-5.06167:119.554 +PONGGALUKU, INDONESIA:-4.31667:122.467 +MASAMBA, INDONESIA:-2.55778:120.324 +SOROAKO, INDONESIA:-2.52944:121.357 +MAKALE, INDONESIA:-3.045:119.822 +KENDARI, INDONESIA:-4.08222:122.417 +BIAK, INDONESIA:-1.19:136.108 +NABIRE, INDONESIA:-3.36806:135.496 +TIMIKA, INDONESIA:-4.52806:136.887 +JAYAPURA, INDONESIA:-2.57694:140.516 +WAMENA, INDONESIA:-4.09611:138.952 +MERAUKE, INDONESIA:-8.52028:140.418 +GORONTALO, INDONESIA:0.636667:122.852 +TAHUNA, INDONESIA:3.68306:125.528 +PALU, INDONESIA:-0.918333:119.909 +MANADO, INDONESIA:1.54917:124.926 +POSO, INDONESIA:-1.41667:120.657 +TERNATE, INDONESIA:0.831944:127.381 +LUWUK, INDONESIA:-1.03889:122.772 +LANGGUR, INDONESIA:-5.66139:132.731 +AMBON, INDONESIA:-3.70889:128.09 +KAIMANA, INDONESIA:-3.64389:133.695 +MANOKWARI, INDONESIA:-0.88:134.05 +SORONG, INDONESIA:-0.925833:131.12 +BINTULU, MALAYSIA:3.17222:113.044 +KUCHING, MALAYSIA:1.48472:110.346 +MARUDI, MALAYSIA:4.17806:114.331 +MIRI, MALAYSIA:4.325:113.988 +SIBU, MALAYSIA:2.26389:111.983 +LAHAD DATU, MALAYSIA:5.03222:118.324 +KOTA KINABALU, MALAYSIA:5.93722:116.051 +LABUAN, MALAYSIA:5.30056:115.25 +TAWAU, MALAYSIA:4.31333:118.122 +BRUNEI, BRUNEI:4.94556:114.928 +SABANG, INDONESIA:5.87389:95.3394 +TASIKMALAYA, INDONESIA:-7.34556:108.246 +MADIUN, INDONESIA:-7.61583:111.434 +MALANG, INDONESIA:-7.92611:112.714 +PEKANBARU, INDONESIA:0.461111:101.444 +DUMAI, INDONESIA:1.60917:101.433 +TANGERANG, INDONESIA:-6.29306:106.57 +BANDUNG, INDONESIA:-6.90056:107.576 +CIREBON, INDONESIA:-6.75583:108.539 +JAKARTA, INDONESIA:-6.26639:106.891 +JAKARTA, INDONESIA:-6.12556:106.656 +YOGYAKARTA, INDONESIA:-7.78806:110.432 +CILACAP, INDONESIA:-7.645:109.034 +JAKARTA, INDONESIA:-6.33694:106.764 +SEMARANG, INDONESIA:-6.97306:110.375 +TANJUNG KARANG, INDONESIA:-5.24222:105.179 +BATAM, INDONESIA:1.12083:104.119 +TANJUNG PANDAN, INDONESIA:-2.74556:107.755 +PANGKAL PINANG, INDONESIA:-2.16278:106.139 +TANJUNG PINANG, INDONESIA:0.9225:104.532 +SINGKEP, INDONESIA:-0.479167:104.579 +GUNUNG SITOLI, INDONESIA:1.16639:97.7028 +PADANG SIDEMPUAN, INDONESIA:1.39917:99.4319 +PADANG, INDONESIA:-0.876111:100.352 +MEDAN, INDONESIA:3.55806:98.6717 +SIBOLGA, INDONESIA:1.55472:98.8903 +NANGAPINOH, INDONESIA:-0.348611:111.748 +KETAPANG, INDONESIA:-1.81639:109.963 +NATUNA, INDONESIA:3.90861:108.388 +PONTIANAK, INDONESIA:-0.150556:109.404 +PUTUSIBAU, INDONESIA:0.835833:112.936 +SINTANG, INDONESIA:0.0636111:111.475 +JAMBI, INDONESIA:-1.63778:103.644 +BENGKULU, INDONESIA:-3.86389:102.341 +PALEMBANG, INDONESIA:-2.89778:104.701 +PENDORO, INDONESIA:-3.28583:103.879 +RENGAT, INDONESIA:-0.352778:102.335 +MUKO MUKO, INDONESIA:-2.54222:101.088 +LHOK SUKON, INDONESIA:5.06944:97.2592 +WHOK SEUMAWE, INDONESIA:5.22667:96.9503 +BANDA ACEH, INDONESIA:5.52333:95.4203 +KLUANG, MALAYSIA:2.04139:103.307 +PULAU PIOMAN, MALAYSIA:2.81806:104.16 +ALOR SETAR, MALAYSIA:6.19389:100.403 +BUTTERWORTH, MALAYSIA:5.46583:100.391 +KOTA BAHRU, MALAYSIA:6.16639:102.294 +KUANTAN, MALAYSIA:3.77528:103.209 +KERTEH, MALAYSIA:4.53722:103.426 +SIMPANG, MALAYSIA:3.11222:101.703 +IPOH, MALAYSIA:4.56778:101.092 +JOHOR BAHRU, MALAYSIA:1.64111:103.669 +KUALA LUMPUR, MALAYSIA:2.74556:101.71 +PULAU, MALAYSIA:6.32972:99.7286 +MALACCA, MALAYSIA:2.26333:102.251 +KUALA TERENGGANU, MALAYSIA:5.3825:103.103 +PENANG, MALAYSIA:5.29694:100.277 +SUAI, EAST TIMOR:-9.30306:125.287 +BAUCAU, WEST TIMOR:-8.48528:126.399 +BANJARMASIN, INDONESIA:-3.44194:114.761 +BATU LICIN, INDONESIA:-3.4125:115.996 +PANGKALAN BUN, INDONESIA:-2.705:111.673 +PALANGKARAYA, INDONESIA:-2.225:113.943 +SAMPIT, INDONESIA:-2.50111:112.977 +MAUMERE, INDONESIA:-8.64056:122.237 +ENDE, INDONESIA:-8.84889:121.662 +RUTENG, INDONESIA:-8.59556:120.478 +KUPANG, INDONESIA:-10.1714:123.671 +LABUHAN BAJO, INDONESIA:-8.48611:119.889 +TANJUNG REDEP, INDONESIA:2.15444:117.432 +BALIKPAPAN, INDONESIA:-1.26806:116.894 +TARAKEN, INDONESIA:3.32639:117.566 +SAMARINDA, INDONESIA:-0.484444:117.157 +TANJUNG SANTAN, INDONESIA:-0.0930556:117.439 +MATARAM, INDONESIA:-8.56056:116.094 +BIMA, INDONESIA:-8.53944:118.687 +DENPASAR, INDONESIA:-8.74833:115.167 +SUMBAWA, INDONESIA:-8.48889:117.412 +WAIKABUBAK, INDONESIA:-9.40944:119.246 +WAINGAPU, INDONESIA:-9.67:120.304 +SURABAYA, INDONESIA:-7.37972:112.787 +SOLO CITY, INDONESIA:-7.51583:110.757 +SEMBAWANG, SINGAPORE:1.42361:103.811 +PAYA LEBAR, SINGAPORE:1.36028:103.909 +TENGAH, SINGAPORE:1.38722:103.709 +SINGAPORE, SINGAPORE:1.41694:103.867 +SINGAPORE, SINGAPORE:1.35556:103.987 +BRISBANE, AUSTRALIA:-27.5703:153.008 +AMBERLEY, AUSTRALIA:-10.9508:142.459 +ALICE SPRINGS, AUSTRALIA:-23.8069:133.902 +BRISBANE, AUSTRALIA:-27.3842:153.118 +COOLANGATTA, AUSTRALIA:-28.1644:153.505 +CAIRNS, AUSTRALIA:-16.8858:145.755 +CHARLIEVILLE, AUSTRALIA:-26.4133:146.262 +MOUNT ISA, AUSTRALIA:-20.6639:139.489 +MAROOCHYDORE, AUSTRALIA:-26.6033:153.091 +MACKAY, AUSTRALIA:-21.1717:149.18 +OAKEY, AUSTRALIA:-27.4114:151.735 +PROSSERPINE, AUSTRALIA:-20.495:148.552 +ROCKHAMPTON, AUSTRALIA:-23.3819:150.475 +TOWNSVILLE, AUSTRALIA:-19.2525:146.765 +WEIPA, AUSTRALIA:-12.6786:141.925 +AVALON, AUSTRALIA:-38.0394:144.469 +ALBURY, AUSTRALIA:-36.0678:146.958 +MELBOURNE, AUSTRALIA:-37.7281:144.902 +EAST SALE, AUSTRALIA:-38.0989:147.149 +HOBART, AUSTRALIA:-42.8361:147.51 +LAUNCESTON, AUSTRALIA:-41.5453:147.214 +MELBOURNE, AUSTRALIA:-37.9758:145.102 +MELBOURNE, AUSTRALIA:-37.6733:144.843 +POINT COOK, AUSTRALIA:-37.9322:144.753 +ADELAIDE, AUSTRALIA:-34.945:138.531 +ARGYLE, AUSTRALIA:-32.5069:137.717 +EDINBURGH, AUSTRALIA:-34.7025:138.621 +PERTH, AUSTRALIA:-32.0972:115.881 +KARRATHA, AUSTRALIA:-20.7122:116.773 +KALGOORLIE, AUSTRALIA:-30.7894:121.462 +KUNUNURRA, AUSTRALIA:-15.7781:128.707 +LEARMONTH, AUSTRALIA:-22.2356:114.089 +PORT HEDLAND, AUSTRALIA:-20.3778:118.626 +ADELAIDE, AUSTRALIA:-34.7933:138.633 +PERTH, AUSTRALIA:-31.9403:115.967 +WOOMERA, AUSTRALIA:-31.1442:136.817 +CHRISTMAS ISLAND, CHRISTMAS ISLAND:-10.4506:105.69 +SYDNEY, AUSTRALIA:-33.9244:150.988 +CANBERRA, AUSTRALIA:-35.3083:149.194 +COFF'S HARBOUR, AUSTRALIA:-30.3206:153.116 +CAMDEN, AUSTRALIA:-34.0403:150.687 +DUBBO, AUSTRALIA:-32.2167:148.575 +NORFOLK ISLAND, AUSTRALIA:-29.0414:167.939 +RICHMOND, AUSTRALIA:-33.6006:150.781 +SYDNEY, AUSTRALIA:-33.9461:151.177 +TAMWORTH, AUSTRALIA:-31.0839:150.847 +WAGGA WAGGA, AUSTRALIA:-35.1653:147.466 +BEIJING, CHINA:40.08:116.584 +HUHHOT, CHINA:40.8533:111.822 +HAILAR, CHINA:49.205:119.825 +SHIJIAZHUANG, CHINA:38.2806:114.696 +TIANJIN, CHINA:39.1239:117.346 +TAIYUAN, CHINA:37.7467:112.629 +GUANGZHOU, CHINA:23.1842:113.266 +CHANGCHA, CHINA:28.1889:113.219 +GUILIN, CHINA:25.2178:110.039 +NANNING, CHINA:22.6081:108.172 +SHANTOU, CHINA:23.4:116.683 +SHENZHEN, CHINA:22.6394:113.812 +ZHENGZHOU, CHINA:34.5194:113.841 +WUHAN, CHINA:30.7836:114.208 +TICHANG, CHINA:30.5522:111.469 +PYONGYANG, KOREA:39.0333:125.783 +LANZHOU, CHINA:36.5167:103.622 +XI'AN, CHINA:34.4458:108.752 +ULAN BATOR, MONGOLIA:47.8431:106.766 +JINGHONGGASA, CHINA:21.975:100.76 +KUNMING, CHINA:24.9922:102.743 +XIAMEN, CHINA:24.5439:118.127 +NANCHANG, CHINA:28.6:115.917 +FUZHOU, CHINA:25.9333:119.662 +HANGZHOU, CHINA:30.2283:120.432 +NINBO, CHINA:29.8247:121.465 +NANJING, CHINA:31.74:118.86 +HEFEI, CHINA:31.78:117.298 +QINGDAO, CHINA:36.2625:120.375 +SHANGHAI, CHINA:31.1978:121.336 +YANTAI, CHINA:37.4017:121.372 +CHONGQING, CHINA:29.7189:106.641 +CHENGDU, CHINA:30.5783:103.947 +XICHANG, CHINA:27.9886:102.184 +KASHI, CHINA:39.5433:76.0217 +HOTAN, CHINA:37.0378:79.8658 +URUMQI, CHINA:43.9069:87.4742 +HARBIN, CHINA:45.6233:126.25 +JIAMUSI, CHINA:46.8433:130.465 +MUDANJIANG, CHINA:44.5239:129.569 +DALIAN, CHINA:38.9656:121.538 +YANJI, CHINA:42.8817:129.448 diff --git a/media.py b/media.py index 358c98932..18ff3a9ea 100644 --- a/media.py +++ b/media.py @@ -8,6 +8,9 @@ __status__ = "Production" import os import datetime +import random +import math +from random import randint from hashlib import sha1 from auth import createPassword from utils import getFullDomain @@ -37,7 +40,7 @@ def replaceYouTube(postJsonObject: {}, replacementDomain: str) -> None: replacementDomain) -def removeMetaData(imageFilename: str, outputFilename: str) -> None: +def _removeMetaData(imageFilename: str, outputFilename: str) -> None: """Attempts to do this with pure python didn't work well, so better to use a dedicated tool if one is installed """ @@ -53,6 +56,201 @@ def removeMetaData(imageFilename: str, outputFilename: str) -> None: os.system('/usr/bin/mogrify -strip ' + outputFilename) # nosec +def _getCityPulse(currTimeOfDay, decoySeed: int) -> (float, float): + """The data decoy + This simulates expected average patterns of movement in a city. + Jane or Joe average lives and works in the city, commuting in + and out of the central district for work. They have a unique + life pattern, which machine learning can latch onto. + This returns a polar coordinate: + Distance from the city centre is in the range 0.0 - 1.0 + Angle is in radians + """ + randgen = random.Random(decoySeed) + variance = 3 + busyStates = ("work", "shop", "play", "party") + dataDecoyState = "sleep" + dataDecoyIndex = 0 + weekday = currTimeOfDay.weekday() + minHour = 7 + randint(0, variance) + maxHour = 17 + randint(0, variance) + if currTimeOfDay.hour > minHour: + if currTimeOfDay.hour <= maxHour: + if weekday < 5: + dataDecoyState = "work" + dataDecoyIndex = 1 + elif weekday == 5: + dataDecoyState = "shop" + dataDecoyIndex = 2 + else: + dataDecoyState = "play" + dataDecoyIndex = 3 + else: + if weekday < 5: + dataDecoyState = "evening" + dataDecoyIndex = 4 + else: + dataDecoyState = "party" + dataDecoyIndex = 5 + angleRadians = \ + (randgen.randint(0, 100000 - 5 + dataDecoyIndex) / 100000) * \ + 2 * math.pi + # some people are quite random, others have more predictable habits + decoyRandomness = randgen.randint(1, 3) + # occasionally throw in a wildcard to keep the machine learning guessing + if randint(0, 100) < decoyRandomness: + distanceFromCityCenter = (randint(0, 100000) / 100000) + angleRadians = (randint(0, 100000) / 100000) * 2 * math.pi + else: + # what consitutes the central district is fuzzy + centralDistrictFuzz = (randgen.randint(0, 100000) / 100000) * 0.1 + busyRadius = 0.3 + centralDistrictFuzz + if dataDecoyState in busyStates: + # if we are busy then we're somewhere in the city center + distanceFromCityCenter = \ + (randgen.randint(0, 100000) / 100000) * busyRadius + else: + # otherwise we're in the burbs + distanceFromCityCenter = busyRadius + \ + ((1.0 - busyRadius) * (randgen.randint(0, 100000) / 100000)) + return distanceFromCityCenter, angleRadians + + +def spoofGeolocation(baseDir: str, + city: str, currTime, decoySeed: int, + citiesList: []) -> (float, float, str, str): + """Given a city and the current time spoofs the location + for an image + returns latitude, longitude, N/S, E/W + """ + locationsFilename = baseDir + '/custom_locations.txt' + if not os.path.isfile(locationsFilename): + locationsFilename = baseDir + '/locations.txt' + cityRadius = 0.1 + variance = 0.001 + default_latitude = 51.8744 + default_longitude = 0.368333 + default_latdirection = 'N' + default_longdirection = 'W' + + if citiesList: + cities = citiesList + else: + if not os.path.isfile(locationsFilename): + return (default_latitude, default_longitude, + default_latdirection, default_longdirection) + cities = [] + with open(locationsFilename, "r") as f: + cities = f.readlines() + + city = city.lower() + for cityName in cities: + if city in cityName.lower(): + latitude = cityName.split(':')[1] + longitude = cityName.split(':')[2] + latdirection = 'N' + longdirection = 'E' + if 'S' in latitude: + latdirection = 'S' + latitude = latitude.replace('S', '') + if 'W' in longitude: + longdirection = 'W' + longitude = longitude.replace('W', '') + latitude = float(latitude) + longitude = float(longitude) + # get the time of day at the city + approxTimeZone = int(longitude / 15.0) + if longdirection == 'E': + approxTimeZone = -approxTimeZone + currTimeAdjusted = currTime - \ + datetime.timedelta(hours=approxTimeZone) + # patterns of activity change in the city over time + (distanceFromCityCenter, angleRadians) = \ + _getCityPulse(currTimeAdjusted, decoySeed) + # Get the position within the city, with some randomness added + latitude += \ + distanceFromCityCenter * cityRadius * math.cos(angleRadians) + # add a small amount of variance around the location + fraction = randint(0, 100000) / 100000 + latitude += (fraction * fraction * variance) - (variance / 2.0) + + longitude += \ + distanceFromCityCenter * cityRadius * math.sin(angleRadians) + # add a small amount of variance around the location + fraction = randint(0, 100000) / 100000 + longitude += (fraction * fraction * variance) - (variance / 2.0) + + # gps locations aren't transcendental, so round to a fixed + # number of decimal places + latitude = int(latitude * 10000) / 10000.0 + longitude = int(longitude * 10000) / 10000.0 + return latitude, longitude, latdirection, longdirection + + return (default_latitude, default_longitude, + default_latdirection, default_longdirection) + + +def _spoofMetaData(baseDir: str, nickname: str, domain: str, + outputFilename: str, spoofCity: str) -> None: + """Spoof image metadata using a decoy model for a given city + """ + if not os.path.isfile(outputFilename): + print('ERROR: unable to spoof metadata within ' + outputFilename) + return + + # get the random seed used to generate a unique pattern for this account + decoySeedFilename = \ + baseDir + '/accounts/' + nickname + '@' + domain + '/decoyseed' + decoySeed = 63725 + if os.path.isfile(decoySeedFilename): + with open(decoySeedFilename, 'r') as fp: + decoySeed = int(fp.read()) + else: + decoySeed = randint(10000, 10000000000000000) + try: + with open(decoySeedFilename, 'w+') as fp: + fp.write(str(decoySeed)) + except BaseException: + pass + + if os.path.isfile('/usr/bin/exiftool'): + print('Spoofing metadata in ' + outputFilename + ' using exiftool') + currTimeAdjusted = \ + datetime.datetime.utcnow() - \ + datetime.timedelta(minutes=randint(2, 120)) + published = currTimeAdjusted.strftime("%Y:%m:%d %H:%M:%S+00:00") + (latitude, longitude, latitudeRef, longitudeRef) = \ + spoofGeolocation(baseDir, spoofCity, currTimeAdjusted, + decoySeed, None) + os.system('exiftool -artist="' + nickname + '" ' + + '-DateTimeOriginal="' + published + '" ' + + '-FileModifyDate="' + published + '" ' + + '-CreateDate="' + published + '" ' + + '-GPSLongitudeRef=' + longitudeRef + ' ' + + '-GPSAltitude=0 ' + + '-GPSLongitude=' + str(longitude) + ' ' + + '-GPSLatitudeRef=' + latitudeRef + ' ' + + '-GPSLatitude=' + str(latitude) + ' ' + + '-Comment="" ' + + outputFilename) # nosec + else: + print('ERROR: exiftool is not installed') + return + + +def processMetaData(baseDir: str, nickname: str, domain: str, + imageFilename: str, outputFilename: str, + city: str) -> None: + """Handles image metadata. This tries to spoof the metadata + if possible, but otherwise just removes it + """ + # first remove the metadata + _removeMetaData(imageFilename, outputFilename) + + # now add some spoofed data to misdirect surveillance capitalists + _spoofMetaData(baseDir, nickname, domain, outputFilename, city) + + def _isMedia(imageFilename: str) -> bool: """Is the given file a media file? """ @@ -131,9 +329,11 @@ def _updateEtag(mediaFilename: str) -> None: pass -def attachMedia(baseDir: str, httpPrefix: str, domain: str, port: int, +def attachMedia(baseDir: str, httpPrefix: str, + nickname: str, domain: str, port: int, postJson: {}, imageFilename: str, - mediaType: str, description: str) -> {}: + mediaType: str, description: str, + city: str) -> {}: """Attaches media to a json object post The description can be None """ @@ -179,7 +379,8 @@ def attachMedia(baseDir: str, httpPrefix: str, domain: str, port: int, if baseDir: if mediaType.startswith('image/'): - removeMetaData(imageFilename, mediaFilename) + processMetaData(baseDir, nickname, domain, + imageFilename, mediaFilename, city) else: copyfile(imageFilename, mediaFilename) _updateEtag(mediaFilename) diff --git a/newsdaemon.py b/newsdaemon.py index a32628428..e4484beea 100644 --- a/newsdaemon.py +++ b/newsdaemon.py @@ -527,11 +527,17 @@ def _convertRSStoActivityPub(baseDir: str, httpPrefix: str, # NOTE: the id when the post is created will not be # consistent (it's based on the current time, not the # published time), so we change that later + saveToFile = False + attachImageFilename = None + mediaType = None + imageDescription = None + city = 'London, England' blog = createNewsPost(baseDir, domain, port, httpPrefix, rssDescription, - followersOnly, False, - None, None, None, + followersOnly, saveToFile, + attachImageFilename, mediaType, + imageDescription, city, rssTitle) if not blog: continue diff --git a/outbox.py b/outbox.py index 8ad268251..8da8fa6d2 100644 --- a/outbox.py +++ b/outbox.py @@ -176,7 +176,8 @@ def postMessageToOutbox(session, translate: {}, proxyType: str, version: str, debug: bool, YTReplacementDomain: str, showPublishedDateOnly: bool, - allowLocalNetworkAccess: bool) -> bool: + allowLocalNetworkAccess: bool, + city: str) -> bool: """post is received by the outbox Client to server message post https://www.w3.org/TR/activitypub/#client-to-server-outbox-delivery @@ -545,7 +546,7 @@ def postMessageToOutbox(session, translate: {}, print('DEBUG: handle share uploads') outboxShareUpload(baseDir, httpPrefix, postToNickname, domain, - port, messageJson, debug) + port, messageJson, debug, city) if debug: print('DEBUG: handle undo share uploads') diff --git a/person.py b/person.py index a72ca31d7..3d7f6d04e 100644 --- a/person.py +++ b/person.py @@ -34,7 +34,7 @@ from posts import createModeration from auth import storeBasicCredentials from auth import removePassword from roles import setRole -from media import removeMetaData +from media import processMetaData from utils import getStatusNumber from utils import getFullDomain from utils import validNickname @@ -74,7 +74,7 @@ def generateRSAKey() -> (str, str): def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, port: int, imageFilename: str, imageType: str, - resolution: str) -> bool: + resolution: str, city: str) -> bool: """Saves the given image file as an avatar or background image for the given person """ @@ -135,7 +135,8 @@ def setProfileImage(baseDir: str, httpPrefix: str, nickname: str, domain: str, '/usr/bin/convert ' + imageFilename + ' -size ' + \ resolution + ' -quality 50 ' + profileFilename subprocess.call(cmd, shell=True) - removeMetaData(profileFilename, profileFilename) + processMetaData(baseDir, nickname, domain, + profileFilename, profileFilename, city) return True return False diff --git a/posts.py b/posts.py index e54802509..401e82037 100644 --- a/posts.py +++ b/posts.py @@ -867,7 +867,7 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, - mediaType: str, imageDescription: str, + mediaType: str, imageDescription: str, city: str, isModerationReport: bool, isArticle: bool, inReplyTo=None, @@ -1059,6 +1059,10 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, idStr = \ httpPrefix + '://' + domain + '/users/' + nickname + \ '/statuses/' + statusNumber + '/replies' + newPostUrl = \ + httpPrefix + '://' + domain + '/@' + nickname + '/'+statusNumber + newPostAttributedTo = \ + httpPrefix + '://' + domain + '/users/' + nickname newPost = { '@context': postContext, 'id': newPostId + '/activity', @@ -1073,8 +1077,8 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, 'summary': summary, 'inReplyTo': inReplyTo, 'published': published, - 'url': httpPrefix+'://'+domain+'/@'+nickname+'/'+statusNumber, - 'attributedTo': httpPrefix+'://'+domain+'/users/'+nickname, + 'url': newPostUrl, + 'attributedTo': newPostAttributedTo, 'to': toRecipients, 'cc': toCC, 'sensitive': sensitive, @@ -1101,9 +1105,9 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, } if attachImageFilename: newPost['object'] = \ - attachMedia(baseDir, httpPrefix, domain, port, + attachMedia(baseDir, httpPrefix, nickname, domain, port, newPost['object'], attachImageFilename, - mediaType, imageDescription) + mediaType, imageDescription, city) _appendEventFields(newPost['object'], eventUUID, eventStatus, anonymousParticipationEnabled, repliesModerationOption, @@ -1115,6 +1119,8 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, idStr = \ httpPrefix + '://' + domain + '/users/' + nickname + \ '/statuses/' + statusNumber + '/replies' + newPostUrl = \ + httpPrefix + '://' + domain + '/@' + nickname+'/' + statusNumber newPost = { "@context": postContext, 'id': newPostId, @@ -1122,8 +1128,8 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, 'summary': summary, 'inReplyTo': inReplyTo, 'published': published, - 'url': httpPrefix+'://'+domain+'/@'+nickname+'/'+statusNumber, - 'attributedTo': httpPrefix+'://'+domain+'/users/'+nickname, + 'url': newPostUrl, + 'attributedTo': httpPrefix + '://' + domain + '/users/' + nickname, 'to': toRecipients, 'cc': toCC, 'sensitive': sensitive, @@ -1149,9 +1155,9 @@ def _createPostBase(baseDir: str, nickname: str, domain: str, port: int, } if attachImageFilename: newPost = \ - attachMedia(baseDir, httpPrefix, domain, port, + attachMedia(baseDir, httpPrefix, nickname, domain, port, newPost, attachImageFilename, - mediaType, imageDescription) + mediaType, imageDescription, city) _appendEventFields(newPost, eventUUID, eventStatus, anonymousParticipationEnabled, repliesModerationOption, @@ -1391,7 +1397,7 @@ def createPublicPost(baseDir: str, content: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, schedulePost=False, eventDate=None, eventTime=None, location=None, @@ -1417,7 +1423,7 @@ def createPublicPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, isModerationReport, isArticle, inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, @@ -1464,7 +1470,7 @@ def createBlogPost(baseDir: str, content: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, schedulePost=False, eventDate=None, eventTime=None, location=None) -> {}: @@ -1474,7 +1480,7 @@ def createBlogPost(baseDir: str, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, True) @@ -1489,7 +1495,7 @@ def createNewsPost(baseDir: str, domain: str, port: int, httpPrefix: str, content: str, followersOnly: bool, saveToFile: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, subject: str) -> {}: clientToServer = False inReplyTo = None @@ -1504,7 +1510,7 @@ def createNewsPost(baseDir: str, content, followersOnly, saveToFile, clientToServer, False, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, True) @@ -1518,7 +1524,7 @@ def createQuestionPost(baseDir: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, subject: str, durationDays: int) -> {}: """Question post with multiple choice options """ @@ -1531,7 +1537,7 @@ def createQuestionPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, False, False, None, None, subject, False, None, None, None, None, None, None, None, None, @@ -1562,7 +1568,7 @@ def createUnlistedPost(baseDir: str, content: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, schedulePost=False, eventDate=None, eventTime=None, location=None) -> {}: @@ -1576,8 +1582,9 @@ def createUnlistedPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, - False, False, inReplyTo, inReplyToAtomUri, subject, + imageDescription, city, + False, False, + inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, None, None, None, None, None, None, None, None, None, None) @@ -1590,7 +1597,7 @@ def createFollowersOnlyPost(baseDir: str, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, schedulePost=False, eventDate=None, eventTime=None, @@ -1605,8 +1612,9 @@ def createFollowersOnlyPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, - False, False, inReplyTo, inReplyToAtomUri, subject, + imageDescription, city, + False, False, + inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, None, None, None, None, None, None, None, None, None, None) @@ -1619,7 +1627,7 @@ def createEventPost(baseDir: str, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, subject=None, schedulePost=False, eventDate=None, eventTime=None, location=None, category=None, joinMode=None, @@ -1652,7 +1660,7 @@ def createEventPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, False, False, None, None, subject, schedulePost, eventDate, eventTime, location, eventUUID, category, joinMode, @@ -1704,7 +1712,7 @@ def createDirectMessagePost(baseDir: str, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, inReplyTo=None, inReplyToAtomUri=None, subject=None, debug=False, schedulePost=False, @@ -1727,8 +1735,9 @@ def createDirectMessagePost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, - False, False, inReplyTo, inReplyToAtomUri, subject, + imageDescription, city, + False, False, + inReplyTo, inReplyToAtomUri, subject, schedulePost, eventDate, eventTime, location, None, None, None, None, None, None, None, None, None, None) @@ -1748,7 +1757,7 @@ def createReportPost(baseDir: str, content: str, followersOnly: bool, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, debug: bool, subject=None) -> {}: """Send a report to moderators """ @@ -1817,7 +1826,7 @@ def createReportPost(baseDir: str, httpPrefix, content, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, True, False, None, None, subject, False, None, None, None, None, None, None, None, None, @@ -1902,7 +1911,7 @@ def sendPost(projectVersion: str, saveToFile: bool, clientToServer: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, federationList: [], sendThreads: [], postLog: [], cachedWebfingers: {}, personCache: {}, isArticle: bool, @@ -1961,7 +1970,7 @@ def sendPost(projectVersion: str, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, False, isArticle, inReplyTo, inReplyToAtomUri, subject, False, None, None, None, None, None, @@ -2023,7 +2032,7 @@ def sendPostViaServer(projectVersion: str, httpPrefix: str, content: str, followersOnly: bool, commentsEnabled: bool, attachImageFilename: str, mediaType: str, - imageDescription: str, + imageDescription: str, city: str, cachedWebfingers: {}, personCache: {}, isArticle: bool, debug=False, inReplyTo=None, inReplyToAtomUri=None, subject=None) -> int: @@ -2100,7 +2109,7 @@ def sendPostViaServer(projectVersion: str, followersOnly, saveToFile, clientToServer, commentsEnabled, attachImageFilename, mediaType, - imageDescription, + imageDescription, city, False, isArticle, inReplyTo, inReplyToAtomUri, subject, False, None, None, None, None, None, diff --git a/schedule.py b/schedule.py index 13f2f4586..7790b98c1 100644 --- a/schedule.py +++ b/schedule.py @@ -108,7 +108,8 @@ def _updatePostSchedule(baseDir: str, handle: str, httpd, httpd.debug, httpd.YTReplacementDomain, httpd.showPublishedDateOnly, - httpd.allowLocalNetworkAccess): + httpd.allowLocalNetworkAccess, + httpd.city): indexLines.remove(line) os.remove(postFilename) continue diff --git a/shares.py b/shares.py index ecf59dfc1..7e21ae8d8 100644 --- a/shares.py +++ b/shares.py @@ -18,7 +18,7 @@ from utils import validNickname from utils import loadJson from utils import saveJson from utils import getImageExtensions -from media import removeMetaData +from media import processMetaData def getValidSharedItemID(displayName: str) -> str: @@ -73,7 +73,7 @@ def addShare(baseDir: str, httpPrefix: str, nickname: str, domain: str, port: int, displayName: str, summary: str, imageFilename: str, itemType: str, itemCategory: str, location: str, - duration: str, debug: bool) -> None: + duration: str, debug: bool, city: str) -> None: """Adds a new share """ sharesFilename = baseDir + '/accounts/' + \ @@ -129,7 +129,9 @@ def addShare(baseDir: str, formats = getImageExtensions() for ext in formats: if imageFilename.endswith('.' + ext): - removeMetaData(imageFilename, itemIDfile + '.' + ext) + processMetaData(baseDir, nickname, domain, + imageFilename, itemIDfile + '.' + ext, + city) if moveImage: os.remove(imageFilename) imageUrl = \ @@ -512,7 +514,7 @@ def sendUndoShareViaServer(baseDir: str, session, def outboxShareUpload(baseDir: str, httpPrefix: str, nickname: str, domain: str, port: int, - messageJson: {}, debug: bool) -> None: + messageJson: {}, debug: bool, city: str) -> None: """ When a shared item is received by the outbox from c2s """ if not messageJson.get('type'): @@ -564,7 +566,7 @@ def outboxShareUpload(baseDir: str, httpPrefix: str, messageJson['object']['itemCategory'], messageJson['object']['location'], messageJson['object']['duration'], - debug) + debug, city) if debug: print('DEBUG: shared item received via c2s') diff --git a/tests.py b/tests.py index 15bdb9ccf..88136a331 100644 --- a/tests.py +++ b/tests.py @@ -10,6 +10,8 @@ import time import os import shutil import json +import datetime +from random import randint from time import gmtime, strftime from pprint import pprint from httpsig import signPostHeaders @@ -75,6 +77,7 @@ from like import likePost from like import sendLikeViaServer from announce import announcePublic from announce import sendAnnounceViaServer +from media import spoofGeolocation from media import getMediaPath from media import getAttachmentMediaType from delete import sendDeleteViaServer @@ -463,6 +466,7 @@ def createServerAlice(path: str, domain: str, port: int, testAttachImageFilename = None testMediaType = None testImageDescription = None + testCity = 'London, England' createPublicPost(path, nickname, domain, port, httpPrefix, "No wise fish would go anywhere without a porpoise", testFollowersOnly, @@ -471,7 +475,7 @@ def createServerAlice(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) createPublicPost(path, nickname, domain, port, httpPrefix, "Curiouser and curiouser!", testFollowersOnly, @@ -480,7 +484,7 @@ def createServerAlice(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) createPublicPost(path, nickname, domain, port, httpPrefix, "In the gardens of memory, in the palace " + "of dreams, that is where you and I shall meet", @@ -490,7 +494,7 @@ def createServerAlice(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) global testServerAliceRunning testServerAliceRunning = True maxMentions = 10 @@ -506,8 +510,10 @@ def createServerAlice(path: str, domain: str, port: int, brochMode = False showNodeInfoAccounts = True showNodeInfoVersion = True + city = 'London, England' print('Server running: Alice') - runDaemon(showNodeInfoAccounts, + runDaemon(city, + showNodeInfoAccounts, showNodeInfoVersion, brochMode, verifyAllSignatures, @@ -564,6 +570,7 @@ def createServerBob(path: str, domain: str, port: int, testAttachImageFilename = None testImageDescription = None testMediaType = None + testCity = 'London, England' createPublicPost(path, nickname, domain, port, httpPrefix, "It's your life, live it your way.", testFollowersOnly, @@ -572,7 +579,7 @@ def createServerBob(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) createPublicPost(path, nickname, domain, port, httpPrefix, "One of the things I've realised is that " + "I am very simple", @@ -582,7 +589,7 @@ def createServerBob(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) createPublicPost(path, nickname, domain, port, httpPrefix, "Quantum physics is a bit of a passion of mine", testFollowersOnly, @@ -591,7 +598,7 @@ def createServerBob(path: str, domain: str, port: int, testCommentsEnabled, testAttachImageFilename, testMediaType, - testImageDescription) + testImageDescription, testCity) global testServerBobRunning testServerBobRunning = True maxMentions = 10 @@ -607,8 +614,10 @@ def createServerBob(path: str, domain: str, port: int, brochMode = False showNodeInfoAccounts = True showNodeInfoVersion = True + city = 'London, England' print('Server running: Bob') - runDaemon(showNodeInfoAccounts, + runDaemon(city, + showNodeInfoAccounts, showNodeInfoVersion, brochMode, verifyAllSignatures, @@ -662,8 +671,10 @@ def createServerEve(path: str, domain: str, port: int, federationList: [], brochMode = False showNodeInfoAccounts = True showNodeInfoVersion = True + city = 'London, England' print('Server running: Eve') - runDaemon(showNodeInfoAccounts, + runDaemon(city, + showNodeInfoAccounts, showNodeInfoVersion, brochMode, verifyAllSignatures, @@ -768,6 +779,7 @@ def testPostMessageBetweenServers(): mediaType = getAttachmentMediaType(attachedImageFilename) attachedImageDescription = 'Logo' isArticle = False + city = 'London, England' # nothing in Alice's outbox outboxPath = aliceDir + '/accounts/alice@' + aliceDomain + '/outbox' assert len([name for name in os.listdir(outboxPath) @@ -782,7 +794,7 @@ def testPostMessageBetweenServers(): followersOnly, saveToFile, clientToServer, True, attachedImageFilename, mediaType, - attachedImageDescription, federationList, + attachedImageDescription, city, federationList, aliceSendThreads, alicePostLog, aliceCachedWebfingers, alicePersonCache, isArticle, inReplyTo, inReplyToAtomUri, subject) @@ -1085,13 +1097,14 @@ def testFollowBetweenServers(): aliceCachedWebfingers = {} alicePostLog = [] isArticle = False + city = 'London, England' sendResult = \ sendPost(__version__, sessionAlice, aliceDir, 'alice', aliceDomain, alicePort, 'bob', bobDomain, bobPort, ccUrl, httpPrefix, 'Alice message', followersOnly, saveToFile, clientToServer, True, - None, None, None, federationList, + None, None, None, city, federationList, aliceSendThreads, alicePostLog, aliceCachedWebfingers, alicePersonCache, isArticle, inReplyTo, inReplyToAtomUri, subject) @@ -1390,7 +1403,7 @@ def testCreatePerson(): createPublicPost(baseDir, nickname, domain, port, httpPrefix, "G'day world!", False, True, clientToServer, True, None, None, None, None, - 'Not suitable for Vogons') + 'Not suitable for Vogons', 'London, England') os.chdir(currDir) shutil.rmtree(baseDir) @@ -1593,6 +1606,7 @@ def testClientToServer(): attachedImageFilename = baseDir + '/img/logo.png' mediaType = getAttachmentMediaType(attachedImageFilename) attachedImageDescription = 'Logo' + city = 'London, England' isArticle = False cachedWebfingers = {} personCache = {} @@ -1611,7 +1625,7 @@ def testClientToServer(): httpPrefix, 'Sent from my ActivityPub client', followersOnly, True, attachedImageFilename, mediaType, - attachedImageDescription, + attachedImageDescription, city, cachedWebfingers, personCache, isArticle, True, None, None, None) print('sendResult: ' + str(sendResult)) @@ -2822,11 +2836,21 @@ def testReplyToPublicPost() -> None: port = 443 httpPrefix = 'https' postId = httpPrefix + '://rat.site/users/ninjarodent/statuses/63746173435' + content = "@ninjarodent@rat.site This is a test." + followersOnly = False + saveToFile = False + clientToServer = False + commentsEnabled = True + attachImageFilename = None + mediaType = None + imageDescription = 'Some description' + city = 'London, England' reply = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, - "@ninjarodent@rat.site This is a test.", - False, False, False, True, - None, None, False, postId) + content, followersOnly, saveToFile, + clientToServer, commentsEnabled, + attachImageFilename, mediaType, + imageDescription, city, postId) # print(str(reply)) assert reply['object']['content'] == \ '

' + \ @@ -3244,11 +3268,20 @@ def testLinksWithinPost() -> None: httpPrefix = 'https' content = 'This is a test post with links.\n\n' + \ 'ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/v4/\n\nhttps://freedombone.net' + followersOnly = False + saveToFile = False + clientToServer = False + commentsEnabled = True + mediaType = None + imageDescription = None + city = 'London, England' + postJsonObject = \ createPublicPost(baseDir, nickname, domain, port, httpPrefix, - content, - False, False, False, True, - None, None, False, None) + content, followersOnly, saveToFile, + clientToServer, commentsEnabled, + mediaType, imageDescription, city, + False, None) assert postJsonObject['object']['content'] == \ '

This is a test post with links.

' + \ ' None: assert not removePostInteractions(postJsonObject, False) +def testSpoofGeolocation() -> None: + print('testSpoofGeolocation') + citiesList = [ + 'NEW YORK, USA:40.6397:W73.7789', + 'LOS ANGELES, USA:33.9425:W118.408', + 'HOUSTON, USA:29.9803:W95.3397', + 'MANCHESTER, ENGLAND:53.4794892:W2.2451148' + ] + currTime = datetime.datetime.utcnow() + decoySeed = 7634681 + cityRadius = 0.1 + coords = spoofGeolocation('', 'los angeles', currTime, + decoySeed, citiesList) + assert coords[0] >= 33.9425 - cityRadius + assert coords[0] <= 33.9425 + cityRadius + assert coords[1] >= 118.408 - cityRadius + assert coords[1] <= 118.408 + cityRadius + assert coords[2] == 'N' + assert coords[3] == 'W' + coords = spoofGeolocation('', 'unknown', currTime, + decoySeed, citiesList) + assert coords[0] >= 51.8744 - cityRadius + assert coords[0] <= 51.8744 + cityRadius + assert coords[1] >= 0.368333 - cityRadius + assert coords[1] <= 0.368333 + cityRadius + assert coords[2] == 'N' + assert coords[3] == 'W' + kmlStr = '\n' + kmlStr += '\n' + kmlStr += '\n' + for i in range(1000): + dayNumber = randint(10, 30) + hour = randint(1, 23) + hourStr = str(hour) + if hour < 10: + hourStr = '0' + hourStr + currTime = datetime.datetime.strptime("2021-05-" + str(dayNumber) + + " " + hourStr + ":14", + "%Y-%m-%d %H:%M") + coords = spoofGeolocation('', 'manchester, england', currTime, + decoySeed, citiesList) + kmlStr += '\n' + kmlStr += ' ' + str(i) + '\n' + kmlStr += ' \n' + kmlStr += ' ' + str(-coords[1]) + ',' + \ + str(coords[0]) + ',0\n' + kmlStr += ' \n' + kmlStr += '\n' + kmlStr += '\n' + kmlStr += '' + kmlFile = open('unittest_decoy.kml', 'w+') + if kmlFile: + kmlFile.write(kmlStr) + kmlFile.close() + + def runAllTests(): print('Running tests...') testFunctions() + testSpoofGeolocation() testRemovePostInteractions() testExtractPGPPublicKey() testEmojiImages() diff --git a/translations/ar.json b/translations/ar.json index a16ebaa19..29042f88f 100644 --- a/translations/ar.json +++ b/translations/ar.json @@ -440,5 +440,6 @@ "These access keys may be used": "قد يتم استخدام مفاتيح الوصول هذه، عادة مع مفتاح ALT + SHIFT + مفتاح ALT +", "Show numbers of accounts within instance metadata": "إظهار عدد الحسابات داخل البيانات الوصفية للمثيلات", "Show version number within instance metadata": "إظهار رقم الإصدار داخل البيانات الوصفية للمثيل", - "Joined": "تاريخ الانضمام" + "Joined": "تاريخ الانضمام", + "City for spoofed GPS image metadata": "مدينة للبيانات الوصفية لصور GPS المخادعة" } diff --git a/translations/ca.json b/translations/ca.json index a1739b8f8..f16675caf 100644 --- a/translations/ca.json +++ b/translations/ca.json @@ -440,5 +440,6 @@ "These access keys may be used": "Es poden utilitzar aquestes tecles d'accés, típicament amb Alt + Maj + tecla o Alt + clau", "Show numbers of accounts within instance metadata": "Mostra el nombre de comptes a les metadades de la instància", "Show version number within instance metadata": "Mostra el número de versió a les metadades de la instància", - "Joined": "Data d'unió" + "Joined": "Data d'unió", + "City for spoofed GPS image metadata": "Ciutat per a metadades d'imatges GPS falsificades" } diff --git a/translations/cy.json b/translations/cy.json index 06f365df7..dde27f918 100644 --- a/translations/cy.json +++ b/translations/cy.json @@ -440,5 +440,6 @@ "These access keys may be used": "Gellir defnyddio'r allweddi mynediad hyn, fel arfer gyda ALT + Shift + Allwedd Allwedd neu ALT +", "Show numbers of accounts within instance metadata": "Dangos nifer y cyfrifon o fewn metadata", "Show version number within instance metadata": "Dangos rhif y fersiwn o fewn metadata", - "Joined": "Dyddiad ymuno" + "Joined": "Dyddiad ymuno", + "City for spoofed GPS image metadata": "Dinas ar gyfer metadata delwedd GPS spoofed" } diff --git a/translations/de.json b/translations/de.json index 87a610034..e4f00a856 100644 --- a/translations/de.json +++ b/translations/de.json @@ -440,5 +440,6 @@ "These access keys may be used": "Diese Zugriffstasten können verwendet werden, typischerweise mit ALT + SHIFT + -Taste oder ALT + -Taste", "Show numbers of accounts within instance metadata": "Anzahl der Konten in Instanzmetadaten anzeigen", "Show version number within instance metadata": "Versionsnummer in Instanzmetadaten anzeigen", - "Joined": "Verbundenes Datum" + "Joined": "Verbundenes Datum", + "City for spoofed GPS image metadata": "Stadt für gefälschte GPS-Bildmetadaten" } diff --git a/translations/en.json b/translations/en.json index 93c245167..387101a1e 100644 --- a/translations/en.json +++ b/translations/en.json @@ -440,5 +440,6 @@ "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key", "Show numbers of accounts within instance metadata": "Show numbers of accounts within instance metadata", "Show version number within instance metadata": "Show version number within instance metadata", - "Joined": "Joined" + "Joined": "Joined", + "City for spoofed GPS image metadata": "City for spoofed GPS image metadata" } diff --git a/translations/es.json b/translations/es.json index 15849bc83..bded71c6b 100644 --- a/translations/es.json +++ b/translations/es.json @@ -440,5 +440,6 @@ "These access keys may be used": "Se pueden usar estas teclas de acceso, típicamente con teclas ALT + MAYÚS + teclas o ALT +", "Show numbers of accounts within instance metadata": "Muestra el número de cuentas dentro de los metadatos de la instancia.", "Show version number within instance metadata": "Mostrar el número de versión dentro de los metadatos de la instancia", - "Joined": "Fecha unida" + "Joined": "Fecha unida", + "City for spoofed GPS image metadata": "Ciudad para metadatos de imagen GPS falsificados" } diff --git a/translations/fr.json b/translations/fr.json index 6f8d9e7e5..9f73c5ee2 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -440,5 +440,6 @@ "These access keys may be used": "Ces touches d'accès peuvent être utilisées typiquement avec une touche Alt + Maj + ou Alt +", "Show numbers of accounts within instance metadata": "Afficher le nombre de comptes dans les métadonnées de l'instance", "Show version number within instance metadata": "Afficher le numéro de version dans les métadonnées de l'instance", - "Joined": "Joint" + "Joined": "Joint", + "City for spoofed GPS image metadata": "Ville pour les métadonnées d'image GPS falsifiées" } diff --git a/translations/ga.json b/translations/ga.json index 2473e9712..be92f6613 100644 --- a/translations/ga.json +++ b/translations/ga.json @@ -440,5 +440,6 @@ "These access keys may be used": "Is féidir na heochracha rochtana seo a úsáid, de ghnáth le Alt + Shift + Eochair nó Alt + Eochair", "Show numbers of accounts within instance metadata": "Taispeáin líon na gcuntas laistigh de mheiteashonraí", "Show version number within instance metadata": "Taispeáin uimhir an leagain laistigh de mheiteashonraí", - "Joined": "Dáta comhcheangailte" + "Joined": "Dáta comhcheangailte", + "City for spoofed GPS image metadata": "Cathair le haghaidh meiteashonraí íomhá GPS spoofed" } diff --git a/translations/hi.json b/translations/hi.json index 520c9ce47..d2f1df28f 100644 --- a/translations/hi.json +++ b/translations/hi.json @@ -440,5 +440,6 @@ "These access keys may be used": "इन एक्सेस कुंजियों का उपयोग किया जा सकता है, आमतौर पर Alt + Shift + कुंजी या Alt + कुंजी के साथ", "Show numbers of accounts within instance metadata": "उदाहरण मेटाडेटा के भीतर खातों की संख्या दिखाएं", "Show version number within instance metadata": "उदाहरण मेटाडेटा के भीतर संस्करण संख्या दिखाएं", - "Joined": "दिनांक" + "Joined": "दिनांक", + "City for spoofed GPS image metadata": "स्पूफ जीपीएस जीपीएस मेटाडेटा के लिए शहर" } diff --git a/translations/it.json b/translations/it.json index 0473de4f0..95f68e575 100644 --- a/translations/it.json +++ b/translations/it.json @@ -440,5 +440,6 @@ "These access keys may be used": "Questi tasti di accesso possono essere utilizzati, in genere con tasto ALT + MAIUSC + o ALT + Key", "Show numbers of accounts within instance metadata": "Mostra il numero di account all'interno dei metadati dell'istanza", "Show version number within instance metadata": "Mostra il numero di versione nei metadati dell'istanza", - "Joined": "Unito" + "Joined": "Unito", + "City for spoofed GPS image metadata": "Città per metadati di immagini GPS falsificate" } diff --git a/translations/ja.json b/translations/ja.json index 972432fe1..44aa8f38c 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -440,5 +440,6 @@ "These access keys may be used": "これらのアクセスキーは、通常はAlt + Shift +キーまたはAlt +キーを使用して使用できます。", "Show numbers of accounts within instance metadata": "インスタンスメタデータ内のアカウント数を表示する", "Show version number within instance metadata": "インスタンスメタデータ内にバージョン番号を表示する", - "Joined": "参加日" + "Joined": "参加日", + "City for spoofed GPS image metadata": "なりすましGPS画像メタデータの都市" } diff --git a/translations/ku.json b/translations/ku.json index 452a3ea93..3f1295df3 100644 --- a/translations/ku.json +++ b/translations/ku.json @@ -440,5 +440,6 @@ "These access keys may be used": "Dibe ku ev keysên gihîştinê bikar bînin, bi gelemperî bi alt + shift + key an alt + key", "Show numbers of accounts within instance metadata": "Di nav metadata mînakê de hejmarên hesaban nîşan bidin", "Show version number within instance metadata": "Di nav metadata mînakê de nimreya guhertoyê nîşan bide", - "Joined": "Beşdarbûna Dîrokê" + "Joined": "Beşdarbûna Dîrokê", + "City for spoofed GPS image metadata": "Bajar ji bo metadata wêneya GPS ya xapînok" } diff --git a/translations/oc.json b/translations/oc.json index 40ca10e0a..47b3ca685 100644 --- a/translations/oc.json +++ b/translations/oc.json @@ -436,5 +436,6 @@ "These access keys may be used": "These access keys may be used, typically with ALT + SHIFT + key or ALT + key", "Show numbers of accounts within instance metadata": "Show numbers of accounts within instance metadata", "Show version number within instance metadata": "Show version number within instance metadata", - "Joined": "Joined" + "Joined": "Joined", + "City for spoofed GPS image metadata": "City for spoofed GPS image metadata" } diff --git a/translations/pt.json b/translations/pt.json index 28d1a7f06..a139c9f3d 100644 --- a/translations/pt.json +++ b/translations/pt.json @@ -440,5 +440,6 @@ "These access keys may be used": "Essas teclas de acesso podem ser usadas, normalmente com tecla Alt + Shift + Key ou Alt +", "Show numbers of accounts within instance metadata": "Mostra o número de contas nos metadados da instância", "Show version number within instance metadata": "Mostrar o número da versão nos metadados da instância", - "Joined": "Data juntada" + "Joined": "Data juntada", + "City for spoofed GPS image metadata": "Cidade para metadados de imagem GPS falsificados" } diff --git a/translations/ru.json b/translations/ru.json index 55857de58..1d2b79ecc 100644 --- a/translations/ru.json +++ b/translations/ru.json @@ -440,5 +440,6 @@ "These access keys may be used": "Эти ключевые ключи доступа могут быть использованы, обычно с ALT + Shift + Key или Alt + Key", "Show numbers of accounts within instance metadata": "Показать количество учетных записей в метаданных экземпляра", "Show version number within instance metadata": "Показать номер версии в метаданных экземпляра", - "Joined": "Присоединенная дата" + "Joined": "Присоединенная дата", + "City for spoofed GPS image metadata": "Город для поддельных метаданных изображения GPS" } diff --git a/translations/zh.json b/translations/zh.json index c2492f167..cb3996ace 100644 --- a/translations/zh.json +++ b/translations/zh.json @@ -440,5 +440,6 @@ "These access keys may be used": "可以使用这些访问密钥,通常使用Alt + Shift +键或ALT +键", "Show numbers of accounts within instance metadata": "显示实例元数据中的帐户数", "Show version number within instance metadata": "在实例元数据中显示版本号", - "Joined": "加入日期" + "Joined": "加入日期", + "City for spoofed GPS image metadata": "欺骗性GPS影像元数据的城市" } diff --git a/webapp_profile.py b/webapp_profile.py index 8b1ef701d..e02201a46 100644 --- a/webapp_profile.py +++ b/webapp_profile.py @@ -1068,7 +1068,7 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, domain: str, port: int, httpPrefix: str, defaultTimeline: str, theme: str, peertubeInstances: [], - textModeBanner: str) -> str: + textModeBanner: str, city: str) -> str: """Shows the edit profile screen """ imageFormats = getImageFormats() @@ -1770,6 +1770,41 @@ def htmlEditProfile(cssCache: {}, translate: {}, baseDir: str, path: str, editProfileForm += '

' + \ translate['Filtering and Blocking'] + '\n' editProfileForm += '
\n' + + editProfileForm += \ + '
\n' + + cityFilename = baseDir + '/accounts/' + \ + nickname + '@' + domain + '/city.txt' + if os.path.isfile(cityFilename): + with open(cityFilename, 'r') as fp: + city = fp.read().replace('\n', '') + locationsFilename = baseDir + '/custom_locations.txt' + if not os.path.isfile(locationsFilename): + locationsFilename = baseDir + '/locations.txt' + cities = [] + with open(locationsFilename, "r") as f: + cities = f.readlines() + cities.sort() + editProfileForm += '
\n' + editProfileForm += \ ' \n' diff --git a/webapp_utils.py b/webapp_utils.py index d154d8a51..6a9666a77 100644 --- a/webapp_utils.py +++ b/webapp_utils.py @@ -543,6 +543,8 @@ def getPersonAvatarUrl(baseDir: str, personUrl: str, personCache: {}, return None # get from locally stored image + if not personJson.get('id'): + return None actorStr = personJson['id'].replace('/', '-') avatarImagePath = baseDir + '/cache/avatars/' + actorStr