ip2location_ruby 8.4.0 → 8.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +16 -0
- data/VERSION +1 -1
- data/example.rb +8 -1
- data/ip2location_ruby.gemspec +6 -2
- data/lib/ip2location_ruby.rb +140 -14
- data/rb/data/IP2LOCATION-COUNTRY-INFORMATION-BASIC.CSV +250 -0
- data/rb/data/IP2LOCATION-ISO3166-2.CSV +3625 -0
- data/spec/ip2location_ruby_country_spec.rb +21 -0
- data/spec/ip2location_ruby_region_spec.rb +9 -0
- metadata +7 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3b96ea3f6c523f75a72a00b44179ed6cfa7101bcd9adacc1edfb58b74df8885e
|
|
4
|
+
data.tar.gz: c3e223b2caf2b0b8e72d80586229db8addb576a8286878f3cda360194f411562
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8f587dfa25da7d4437c4dfb6089e5806461acc6917b4201922ac4dcf492e8d78507e003a4229afd324aee99d92851711fb1ed3f6071aa30934df7fa5dd164621
|
|
7
|
+
data.tar.gz: 8b8522bee147a05b3c799deaf8fbc4eacf26bf8109a4ad00e7fde806bd3462bc3909917075041a61352bfabbe922e0eee77742dfbb0793e230c998fdf58b4505
|
data/README.md
CHANGED
|
@@ -83,6 +83,22 @@ Below is the description of the functions available in the **IpTools** class.
|
|
|
83
83
|
| compress_ipv6 | Compress a IPv6 to shorten the length. |
|
|
84
84
|
| expand_ipv6 | Expand a shorten IPv6 to full length. |
|
|
85
85
|
|
|
86
|
+
## Country
|
|
87
|
+
Below is the description of the functions available in the **Country** class.
|
|
88
|
+
|
|
89
|
+
| Function Name | Description |
|
|
90
|
+
|---|---|
|
|
91
|
+
| Constructor | Expect a IP2Location Country Information CSV file. This database is free for download at https://www.ip2location.com/free/country-information |
|
|
92
|
+
| get_country_info | Provide a ISO 3166 country code to get the country information in array. Will return a full list of countries information if country code not provided. Below is the information returned: <ul><li>country_code</li><li>country_alpha3_code</li><li>country_numeric_code</li><li>capital</li><li>country_demonym</li><li>total_area</li><li>population</li><li>idd_code</li><li>currency_code</li><li>currency_name</li><li>currency_symbol</li><li>lang_code</li><li>lang_name</li><li>cctld</li></ul> |
|
|
93
|
+
|
|
94
|
+
## Region
|
|
95
|
+
Below is the description of the functions available in the **Region** class.
|
|
96
|
+
|
|
97
|
+
| Function Name | Description |
|
|
98
|
+
|---|---|
|
|
99
|
+
| Constructor | Expect a IP2Location ISO 3166-2 Subdivision Code CSV file. This database is free for download at https://www.ip2location.com/free/iso3166-2 |
|
|
100
|
+
| get_region_code | Provide a ISO 3166 country code and the region name to get ISO 3166-2 subdivision code for the region. |
|
|
101
|
+
|
|
86
102
|
# Dependencies
|
|
87
103
|
This library requires IP2Location BIN data file to function. You may download the BIN data file at
|
|
88
104
|
* IP2Location LITE BIN Data (Free): https://lite.ip2location.com
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
8.
|
|
1
|
+
8.6.0
|
data/example.rb
CHANGED
|
@@ -29,7 +29,6 @@ puts record['elevation']
|
|
|
29
29
|
puts 'Usage Type: ' + record['usagetype']
|
|
30
30
|
puts 'Address Type: ' + record['addresstype']
|
|
31
31
|
puts 'Category: ' + record['category']
|
|
32
|
-
|
|
33
32
|
i2l.close()
|
|
34
33
|
|
|
35
34
|
# Web Service
|
|
@@ -52,3 +51,11 @@ puts iptool.ipv6_to_cidr('2002:0000:0000:1234:abcd:ffff:c0a8:0000', '2002:0000:0
|
|
|
52
51
|
puts iptool.cidr_to_ipv6('2002::1234:abcd:ffff:c0a8:101/64')
|
|
53
52
|
puts iptool.compress_ipv6('2002:0000:0000:1234:ffff:ffff:ffff:ffff')
|
|
54
53
|
puts iptool.expand_ipv6('2002::1234:ffff:ffff:ffff:ffff')
|
|
54
|
+
|
|
55
|
+
# Country Class
|
|
56
|
+
country = Ip2locationCountry.new('./data/IP2LOCATION-COUNTRY-INFORMATION-BASIC.CSV')
|
|
57
|
+
puts country.get_country_info('US')
|
|
58
|
+
|
|
59
|
+
# Region Class
|
|
60
|
+
region = Ip2locationRegion.new('./data/IP2LOCATION-ISO3166-2.CSV')
|
|
61
|
+
puts region.get_region_code('US', 'California')
|
data/ip2location_ruby.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Gem::Specification.new do |s|
|
|
2
2
|
s.name = "ip2location_ruby"
|
|
3
|
-
s.version = "8.
|
|
3
|
+
s.version = "8.6.0"
|
|
4
4
|
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
6
6
|
s.require_paths = ["lib"]
|
|
@@ -30,11 +30,15 @@ Gem::Specification.new do |s|
|
|
|
30
30
|
"lib/ip2location_ruby/ip2location_config.rb",
|
|
31
31
|
"lib/ip2location_ruby/ip2location_record.rb",
|
|
32
32
|
"spec/assets/IP2LOCATION-LITE-DB1.IPV6.BIN",
|
|
33
|
+
"spec/ip2location_ruby_country_spec.rb",
|
|
33
34
|
"spec/ip2location_ruby_database_spec.rb",
|
|
34
35
|
"spec/ip2location_ruby_iptools_spec.rb",
|
|
36
|
+
"spec/ip2location_ruby_region_spec.rb",
|
|
35
37
|
"spec/ip2location_ruby_webservice_spec.rb",
|
|
36
38
|
"spec/spec_helper.rb",
|
|
37
|
-
"rb/data/IP2LOCATION-LITE-DB1.IPV6.BIN"
|
|
39
|
+
"rb/data/IP2LOCATION-LITE-DB1.IPV6.BIN",
|
|
40
|
+
"rb/data/IP2LOCATION-COUNTRY-INFORMATION-BASIC.CSV",
|
|
41
|
+
"rb/data/IP2LOCATION-ISO3166-2.CSV"
|
|
38
42
|
]
|
|
39
43
|
s.homepage = "https://github.com/ip2location/ip2location-ruby"
|
|
40
44
|
s.licenses = ["MIT"]
|
data/lib/ip2location_ruby.rb
CHANGED
|
@@ -3,6 +3,7 @@ require 'bindata'
|
|
|
3
3
|
require 'ipaddr'
|
|
4
4
|
require 'net/http'
|
|
5
5
|
require 'json'
|
|
6
|
+
require 'csv'
|
|
6
7
|
require 'ip2location_ruby/ip2location_config'
|
|
7
8
|
require 'ip2location_ruby/database_config'
|
|
8
9
|
require 'ip2location_ruby/i2l_float_data'
|
|
@@ -13,7 +14,7 @@ require 'ip2location_ruby/ip2location_record'
|
|
|
13
14
|
class Ip2location
|
|
14
15
|
attr_accessor :record_class4, :record_class6, :v4, :file, :db_index, :count, :base_addr, :ipno, :count, :record, :database, :columns, :ip_version, :ipv4databasecount, :ipv4databaseaddr, :ipv4indexbaseaddr, :ipv6databasecount, :ipv6databaseaddr, :ipv6indexbaseaddr, :databaseyear, :databasemonth, :databaseday, :last_err_msg
|
|
15
16
|
|
|
16
|
-
VERSION = '8.
|
|
17
|
+
VERSION = '8.6.0'
|
|
17
18
|
FIELD_NOT_SUPPORTED = 'NOT SUPPORTED'
|
|
18
19
|
INVALID_IP_ADDRESS = 'INVALID IP ADDRESS'
|
|
19
20
|
INVALID_BIN_DATABASE = 'Incorrect IP2Location BIN file format. Please make sure that you are using the latest IP2Location BIN file.'
|
|
@@ -88,7 +89,7 @@ class Ip2location
|
|
|
88
89
|
if ip_version == 6 && self.ipv6databasecount == 0
|
|
89
90
|
return IPV6_ADDRESS_IN_IPV4_BIN
|
|
90
91
|
end
|
|
91
|
-
col_length = columns * 4
|
|
92
|
+
col_length = self.columns * 4
|
|
92
93
|
if ipv4indexbaseaddr > 0 || ipv6indexbaseaddr > 0
|
|
93
94
|
indexpos = 0
|
|
94
95
|
case ip_version
|
|
@@ -107,8 +108,7 @@ class Ip2location
|
|
|
107
108
|
ipnum = realipno - 1
|
|
108
109
|
end
|
|
109
110
|
end
|
|
110
|
-
low =
|
|
111
|
-
high = read32(indexpos + 4)
|
|
111
|
+
low, high = read32x2(indexpos)
|
|
112
112
|
return self.record = bsearch(low, high, ipnum, self.base_addr, col_length)
|
|
113
113
|
else
|
|
114
114
|
return self.record = bsearch(0, self.count, ipnum, self.base_addr, col_length)
|
|
@@ -618,7 +618,7 @@ class Ip2location
|
|
|
618
618
|
mid = (low + high) >> 1
|
|
619
619
|
ip_from, ip_to = get_from_to(mid, base_addr, col_length)
|
|
620
620
|
if ipnum >= ip_from && ipnum < ip_to
|
|
621
|
-
from_base = (
|
|
621
|
+
from_base = (base_addr + mid * (col_length + (self.v4 ? 0 : 12)))
|
|
622
622
|
file.seek(from_base)
|
|
623
623
|
if v4
|
|
624
624
|
return self.record_class4.read(file)
|
|
@@ -636,11 +636,12 @@ class Ip2location
|
|
|
636
636
|
end
|
|
637
637
|
|
|
638
638
|
def get_from_to(mid, base_addr, col_length)
|
|
639
|
-
from_base = (
|
|
639
|
+
from_base = (base_addr + mid * (col_length + (v4 ? 0 : 12)))
|
|
640
|
+
data_length = col_length + (v4 ? 4 : (12 + 16))
|
|
640
641
|
file.seek(from_base)
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
ip_to = v4 ?
|
|
642
|
+
data_read = file.read(data_length)
|
|
643
|
+
ip_from = v4 ? data_read[0..3].unpack('V').first : readipv6(data_read[0..15].unpack('V*'))
|
|
644
|
+
ip_to = v4 ? data_read[(data_length - 4)..(data_length - 1)].unpack('V').first : readipv6(data_read[(data_length - 16)..(data_length - 1)].unpack('V*'))
|
|
644
645
|
[ip_from, ip_to]
|
|
645
646
|
end
|
|
646
647
|
|
|
@@ -676,17 +677,19 @@ class Ip2location
|
|
|
676
677
|
[ipv, ipnum]
|
|
677
678
|
end
|
|
678
679
|
|
|
679
|
-
def
|
|
680
|
+
def read32x2(indexp)
|
|
680
681
|
file.seek(indexp - 1)
|
|
681
|
-
|
|
682
|
+
data_read = file.read(8)
|
|
683
|
+
data1 = data_read[0..3].unpack('V').first
|
|
684
|
+
data2 = data_read[4..7].unpack('V').first
|
|
685
|
+
return [data1, data2]
|
|
682
686
|
end
|
|
683
687
|
|
|
684
|
-
def readipv6(
|
|
685
|
-
parts = filer.read(16).unpack('V*')
|
|
688
|
+
def readipv6(parts)
|
|
686
689
|
return parts[0] + parts[1] * 4294967296 + parts[2] * 4294967296**2 + parts[3] * 4294967296**3
|
|
687
690
|
end
|
|
688
691
|
|
|
689
|
-
private :get_record, :bsearch, :get_from_to, :
|
|
692
|
+
private :get_record, :bsearch, :get_from_to, :read32x2, :readipv6
|
|
690
693
|
end
|
|
691
694
|
|
|
692
695
|
class Ip2locationWebService
|
|
@@ -962,4 +965,127 @@ class Ip2locationIpTools
|
|
|
962
965
|
return
|
|
963
966
|
end
|
|
964
967
|
end
|
|
968
|
+
end
|
|
969
|
+
|
|
970
|
+
class Ip2locationCountry
|
|
971
|
+
attr_accessor :fields, :records
|
|
972
|
+
|
|
973
|
+
def initialize(csv)
|
|
974
|
+
if csv == ''
|
|
975
|
+
abort('The CSV file "' + csv + '" is not found.')
|
|
976
|
+
end
|
|
977
|
+
|
|
978
|
+
begin
|
|
979
|
+
csvfile = File.open(File.expand_path csv, 'rb')
|
|
980
|
+
rescue
|
|
981
|
+
abort('Error in opening ' + csv + '. No such CSV file in the /your_ip2location_ruby_library_path/rb/ folder.')
|
|
982
|
+
else
|
|
983
|
+
end
|
|
984
|
+
|
|
985
|
+
begin
|
|
986
|
+
CSV.parse(csvfile)
|
|
987
|
+
rescue
|
|
988
|
+
abort('Unable to read "' + csv + '".')
|
|
989
|
+
else
|
|
990
|
+
line = 1
|
|
991
|
+
self.records = Hash.new
|
|
992
|
+
CSV.foreach((csvfile)) do |data|
|
|
993
|
+
if line == 1
|
|
994
|
+
if data[0] != 'country_code'
|
|
995
|
+
abort('Invalid country information CSV file.')
|
|
996
|
+
end
|
|
997
|
+
self.fields = data
|
|
998
|
+
else
|
|
999
|
+
self.records[data[0]] = data
|
|
1000
|
+
end
|
|
1001
|
+
line = line + 1
|
|
1002
|
+
end
|
|
1003
|
+
end
|
|
1004
|
+
end
|
|
1005
|
+
|
|
1006
|
+
def get_country_info(country_code = nil)
|
|
1007
|
+
if self.records.empty?
|
|
1008
|
+
abort('No record available.')
|
|
1009
|
+
end
|
|
1010
|
+
|
|
1011
|
+
if country_code
|
|
1012
|
+
if (self.records[country_code]).nil?
|
|
1013
|
+
return []
|
|
1014
|
+
end
|
|
1015
|
+
results = Hash.new
|
|
1016
|
+
for i in 0..(self.fields.length()-1)
|
|
1017
|
+
results[self.fields[i]] = self.records[country_code][i]
|
|
1018
|
+
end
|
|
1019
|
+
return results
|
|
1020
|
+
end
|
|
1021
|
+
|
|
1022
|
+
results = []
|
|
1023
|
+
self.records.each do |key, value|
|
|
1024
|
+
data = Hash.new
|
|
1025
|
+
for i in 0..(self.fields.length()-1)
|
|
1026
|
+
data[self.fields[i]] = self.records[key][i]
|
|
1027
|
+
end
|
|
1028
|
+
results = results.append(data)
|
|
1029
|
+
end
|
|
1030
|
+
return results
|
|
1031
|
+
end
|
|
1032
|
+
end
|
|
1033
|
+
|
|
1034
|
+
class Ip2locationRegion
|
|
1035
|
+
attr_accessor :records
|
|
1036
|
+
|
|
1037
|
+
def initialize(csv)
|
|
1038
|
+
if csv == ''
|
|
1039
|
+
abort('The CSV file "' + csv + '" is not found.')
|
|
1040
|
+
end
|
|
1041
|
+
|
|
1042
|
+
begin
|
|
1043
|
+
csvfile = File.open(File.expand_path csv, 'rb')
|
|
1044
|
+
rescue
|
|
1045
|
+
abort('Error in opening ' + csv + '. No such CSV file in the /your_ip2location_ruby_library_path/rb/ folder.')
|
|
1046
|
+
else
|
|
1047
|
+
end
|
|
1048
|
+
|
|
1049
|
+
begin
|
|
1050
|
+
CSV.parse(csvfile)
|
|
1051
|
+
rescue
|
|
1052
|
+
abort('Unable to read "' + csv + '".')
|
|
1053
|
+
else
|
|
1054
|
+
line = 1
|
|
1055
|
+
self.records = Hash.new
|
|
1056
|
+
CSV.foreach((csvfile)) do |data|
|
|
1057
|
+
if line == 1
|
|
1058
|
+
if data[1] != 'subdivision_name'
|
|
1059
|
+
abort('Invalid region information CSV file.')
|
|
1060
|
+
end
|
|
1061
|
+
else
|
|
1062
|
+
temp_data = Hash.new
|
|
1063
|
+
temp_data['code'] = data[2]
|
|
1064
|
+
temp_data['name'] = data[1]
|
|
1065
|
+
if self.records[data[0]]
|
|
1066
|
+
self.records[data[0]].push temp_data
|
|
1067
|
+
else
|
|
1068
|
+
self.records[data[0]] = [temp_data]
|
|
1069
|
+
end
|
|
1070
|
+
end
|
|
1071
|
+
line = line + 1
|
|
1072
|
+
end
|
|
1073
|
+
end
|
|
1074
|
+
end
|
|
1075
|
+
|
|
1076
|
+
def get_region_code(country_code, region_name)
|
|
1077
|
+
if self.records.empty?
|
|
1078
|
+
abort('No record available.')
|
|
1079
|
+
end
|
|
1080
|
+
|
|
1081
|
+
if (self.records[country_code]).nil?
|
|
1082
|
+
return
|
|
1083
|
+
end
|
|
1084
|
+
|
|
1085
|
+
for i in 0..(self.records[country_code].length()-1)
|
|
1086
|
+
if region_name.upcase == self.records[country_code][i]["name"].upcase
|
|
1087
|
+
return self.records[country_code][i]["code"]
|
|
1088
|
+
end
|
|
1089
|
+
end
|
|
1090
|
+
end
|
|
965
1091
|
end
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"country_code","capital","total_area"
|
|
2
|
+
"AD","Andorra la Vella","468"
|
|
3
|
+
"AE","Abu Dhabi","83600"
|
|
4
|
+
"AF","Kabul","652230"
|
|
5
|
+
"AG","Saint John's","442"
|
|
6
|
+
"AI","The Valley","91"
|
|
7
|
+
"AL","Tirana","28748"
|
|
8
|
+
"AM","Yerevan","29743"
|
|
9
|
+
"AO","Luanda","1246700"
|
|
10
|
+
"AQ","-","14000000"
|
|
11
|
+
"AR","Buenos Aires","2780400"
|
|
12
|
+
"AS","Pago Pago","199"
|
|
13
|
+
"AT","Vienna","83871"
|
|
14
|
+
"AU","Canberra","7741220"
|
|
15
|
+
"AW","Oranjestad","180"
|
|
16
|
+
"AX","Mariehamn","1552"
|
|
17
|
+
"AZ","Baku","86600"
|
|
18
|
+
"BA","Sarajevo","51197"
|
|
19
|
+
"BB","Bridgetown","430"
|
|
20
|
+
"BD","Dhaka","143998"
|
|
21
|
+
"BE","Brussels","30528"
|
|
22
|
+
"BF","Ouagadougou","274200"
|
|
23
|
+
"BG","Sofia","110879"
|
|
24
|
+
"BH","Manama","760"
|
|
25
|
+
"BI","Bujumbura","27830"
|
|
26
|
+
"BJ","Porto-Novo","112622"
|
|
27
|
+
"BL","Gustavia","21"
|
|
28
|
+
"BM","Hamilton","54"
|
|
29
|
+
"BN","Bandar Seri Begawan","5765"
|
|
30
|
+
"BO","Sucre","1098581"
|
|
31
|
+
"BQ","Kralendijk","328"
|
|
32
|
+
"BR","Brasilia","8514877"
|
|
33
|
+
"BS","Nassau","13880"
|
|
34
|
+
"BT","Thimphu","38394"
|
|
35
|
+
"BV","-","49"
|
|
36
|
+
"BW","Gaborone","581730"
|
|
37
|
+
"BY","Minsk","207600"
|
|
38
|
+
"BZ","Belmopan","22966"
|
|
39
|
+
"CA","Ottawa","9984670"
|
|
40
|
+
"CC","West Island","14"
|
|
41
|
+
"CD","Kinshasa","2344858"
|
|
42
|
+
"CF","Bangui","622984"
|
|
43
|
+
"CG","Brazzaville","342000"
|
|
44
|
+
"CH","Bern","41277"
|
|
45
|
+
"CI","Yamoussoukro","322463"
|
|
46
|
+
"CK","Avarua","236"
|
|
47
|
+
"CL","Santiago","756102"
|
|
48
|
+
"CM","Yaounde","475440"
|
|
49
|
+
"CN","Beijing","9596961"
|
|
50
|
+
"CO","Bogota","1138910"
|
|
51
|
+
"CR","San Jose","51100"
|
|
52
|
+
"CU","Havana","110860"
|
|
53
|
+
"CV","Praia","4033"
|
|
54
|
+
"CW","Willemstad","444"
|
|
55
|
+
"CX","Flying Fish Cove","135"
|
|
56
|
+
"CY","Nicosia","9251"
|
|
57
|
+
"CZ","Prague","78867"
|
|
58
|
+
"DE","Berlin","357022"
|
|
59
|
+
"DJ","Djibouti","23200"
|
|
60
|
+
"DK","Copenhagen","43094"
|
|
61
|
+
"DM","Roseau","751"
|
|
62
|
+
"DO","Santo Domingo","48670"
|
|
63
|
+
"DZ","Algiers","2381741"
|
|
64
|
+
"EC","Quito","283561"
|
|
65
|
+
"EE","Tallinn","45228"
|
|
66
|
+
"EG","Cairo","1001450"
|
|
67
|
+
"EH","Laayoune / El Aaiun","266000"
|
|
68
|
+
"ER","Asmara","117600"
|
|
69
|
+
"ES","Madrid","505370"
|
|
70
|
+
"ET","Addis Ababa","1104300"
|
|
71
|
+
"FI","Helsinki","338145"
|
|
72
|
+
"FJ","Suva","18274"
|
|
73
|
+
"FK","Stanley","12173"
|
|
74
|
+
"FM","Palikir","702"
|
|
75
|
+
"FO","Torshavn","1393"
|
|
76
|
+
"FR","Paris","643801"
|
|
77
|
+
"GA","Libreville","267667"
|
|
78
|
+
"GB","London","243610"
|
|
79
|
+
"GD","Saint George's","344"
|
|
80
|
+
"GE","Tbilisi","69700"
|
|
81
|
+
"GF","Cayenne","86504"
|
|
82
|
+
"GG","Saint Peter Port","78"
|
|
83
|
+
"GH","Accra","238533"
|
|
84
|
+
"GI","Gibraltar","6"
|
|
85
|
+
"GL","Nuuk","2166086"
|
|
86
|
+
"GM","Banjul","11295"
|
|
87
|
+
"GN","Conakry","245857"
|
|
88
|
+
"GP","Basse-terre","1630"
|
|
89
|
+
"GQ","Malabo","28051"
|
|
90
|
+
"GR","Athens","131957"
|
|
91
|
+
"GS","Grytviken","3903"
|
|
92
|
+
"GT","Guatemala City","108889"
|
|
93
|
+
"GU","Hagatna","544"
|
|
94
|
+
"GW","Bissau","36125"
|
|
95
|
+
"GY","Georgetown","214969"
|
|
96
|
+
"HK","-","1104"
|
|
97
|
+
"HM","-","412"
|
|
98
|
+
"HN","Tegucigalpa","112090"
|
|
99
|
+
"HR","Zagreb","56594"
|
|
100
|
+
"HT","Port-au-prince","27750"
|
|
101
|
+
"HU","Budapest","93028"
|
|
102
|
+
"ID","Jakarta","1904569"
|
|
103
|
+
"IE","Dublin","70273"
|
|
104
|
+
"IL","Jerusalem","20770"
|
|
105
|
+
"IM","Douglas","572"
|
|
106
|
+
"IN","New Delhi","3287263"
|
|
107
|
+
"IO","Diego Garcia","54400"
|
|
108
|
+
"IQ","Baghdad","438317"
|
|
109
|
+
"IR","Tehran","1648195"
|
|
110
|
+
"IS","Reykjavik","103000"
|
|
111
|
+
"IT","Roma","301340"
|
|
112
|
+
"JE","Saint Helier","116"
|
|
113
|
+
"JM","Kingston","10991"
|
|
114
|
+
"JO","Amman","89342"
|
|
115
|
+
"JP","Tokyo","377915"
|
|
116
|
+
"KE","Nairobi","580367"
|
|
117
|
+
"KG","Bishkek","199951"
|
|
118
|
+
"KH","Phnom Penh","181035"
|
|
119
|
+
"KI","Tarawa","811"
|
|
120
|
+
"KM","Moroni","2235"
|
|
121
|
+
"KN","Basseterre","261"
|
|
122
|
+
"KP","Pyongyang","120538"
|
|
123
|
+
"KR","Seoul","99720"
|
|
124
|
+
"KW","Kuwait","17818"
|
|
125
|
+
"KY","George Town","264"
|
|
126
|
+
"KZ","Astana","2724900"
|
|
127
|
+
"LA","Vientiane","236800"
|
|
128
|
+
"LB","Beirut","10400"
|
|
129
|
+
"LC","Castries","616"
|
|
130
|
+
"LI","Vaduz","160"
|
|
131
|
+
"LK","Sri Jayewardenepura Kotte","65610"
|
|
132
|
+
"LR","Monrovia","111369"
|
|
133
|
+
"LS","Maseru","30355"
|
|
134
|
+
"LT","Vilnius","65300"
|
|
135
|
+
"LU","Luxembourg","2586"
|
|
136
|
+
"LV","Riga","64589"
|
|
137
|
+
"LY","Tripoli","1759540"
|
|
138
|
+
"MA","Rabat","446550"
|
|
139
|
+
"MC","Monaco","2"
|
|
140
|
+
"MD","Chisinau","33851"
|
|
141
|
+
"ME","Podgorica","13812"
|
|
142
|
+
"MF","Marigot","54"
|
|
143
|
+
"MG","Antananarivo","587041"
|
|
144
|
+
"MH","Majuro","181"
|
|
145
|
+
"MK","Skopje","25713"
|
|
146
|
+
"ML","Bamako","1240192"
|
|
147
|
+
"MM","Pyinmana","676578"
|
|
148
|
+
"MN","Ulaanbaatar","1564116"
|
|
149
|
+
"MO","-","31.3"
|
|
150
|
+
"MP","Saipan","464"
|
|
151
|
+
"MQ","Fort-de-france","1128"
|
|
152
|
+
"MR","Nouakchott","1030700"
|
|
153
|
+
"MS","Plymouth","102"
|
|
154
|
+
"MT","Valletta","316"
|
|
155
|
+
"MU","Port Louis","2040"
|
|
156
|
+
"MV","Male","298"
|
|
157
|
+
"MW","Lilongwe","118484"
|
|
158
|
+
"MX","Mexico City","1964375"
|
|
159
|
+
"MY","Kuala Lumpur","329847"
|
|
160
|
+
"MZ","Maputo","799380"
|
|
161
|
+
"NA","Windhoek","824292"
|
|
162
|
+
"NC","Noumea","18575"
|
|
163
|
+
"NE","Niamey","1186408"
|
|
164
|
+
"NF","Kingston","36"
|
|
165
|
+
"NG","Abuja","923768"
|
|
166
|
+
"NI","Managua","130370"
|
|
167
|
+
"NL","Amsterdam","41543"
|
|
168
|
+
"NO","Oslo","323802"
|
|
169
|
+
"NP","Kathmandu","147181"
|
|
170
|
+
"NR","Yaren","21"
|
|
171
|
+
"NU","Alofi","260"
|
|
172
|
+
"NZ","Wellington","267710"
|
|
173
|
+
"OM","Muscat","309500"
|
|
174
|
+
"PA","Panama","75420"
|
|
175
|
+
"PE","Lima","1285216"
|
|
176
|
+
"PF","Papeete","4167"
|
|
177
|
+
"PG","Port Moresby","462840"
|
|
178
|
+
"PH","Manila","300000"
|
|
179
|
+
"PK","Islamabad","796095"
|
|
180
|
+
"PL","Warsaw","312685"
|
|
181
|
+
"PM","Saint-pierre","242"
|
|
182
|
+
"PN","Adamstown","47"
|
|
183
|
+
"PR","San Juan","13790"
|
|
184
|
+
"PS","-","5860"
|
|
185
|
+
"PT","Lisbon","92090"
|
|
186
|
+
"PW","Melekeok - Palau State Capital","459"
|
|
187
|
+
"PY","Asuncion","406752"
|
|
188
|
+
"QA","Doha","11586"
|
|
189
|
+
"RE","Saint-denis","2512"
|
|
190
|
+
"RO","Bucharest","238391"
|
|
191
|
+
"RS","Belgrade","77474"
|
|
192
|
+
"RU","Moscow","17098242"
|
|
193
|
+
"RW","Kigali","26338"
|
|
194
|
+
"SA","Riyadh","2149690"
|
|
195
|
+
"SB","Honiara","28896"
|
|
196
|
+
"SC","Victoria","455"
|
|
197
|
+
"SD","Khartoum","1861484"
|
|
198
|
+
"SE","Stockholm","450295"
|
|
199
|
+
"SG","Singapore","697"
|
|
200
|
+
"SH","Jamestown","122"
|
|
201
|
+
"SI","Ljubljana","20273"
|
|
202
|
+
"SJ","Longyearbyen","62045"
|
|
203
|
+
"SK","Bratislava","49035"
|
|
204
|
+
"SL","Freetown","71740"
|
|
205
|
+
"SM","San Marino","61"
|
|
206
|
+
"SN","Dakar","196722"
|
|
207
|
+
"SO","Mogadishu","637657"
|
|
208
|
+
"SR","Paramaribo","163820"
|
|
209
|
+
"SS","Juba","644329"
|
|
210
|
+
"ST","Sao Tome","964"
|
|
211
|
+
"SV","San Salvador","21041"
|
|
212
|
+
"SX","Philipsburg","34"
|
|
213
|
+
"SY","Damascus","185180"
|
|
214
|
+
"SZ","Mbabane","17364"
|
|
215
|
+
"TC","Cockburn Town","948"
|
|
216
|
+
"TD","N'djamena","1284000"
|
|
217
|
+
"TF","Port-aux-francais","439781"
|
|
218
|
+
"TG","Lome","56785"
|
|
219
|
+
"TH","Bangkok","513120"
|
|
220
|
+
"TJ","Dushanbe","143100"
|
|
221
|
+
"TK","-","12"
|
|
222
|
+
"TL","Dili","14874"
|
|
223
|
+
"TM","Ashgabat","488100"
|
|
224
|
+
"TN","Tunis","163610"
|
|
225
|
+
"TO","Nuku'alofa","747"
|
|
226
|
+
"TR","Ankara","783562"
|
|
227
|
+
"TT","Port of Spain","5128"
|
|
228
|
+
"TV","Funafuti","26"
|
|
229
|
+
"TW","Taipei","35980"
|
|
230
|
+
"TZ","Dodoma","947300"
|
|
231
|
+
"UA","Kiev","603550"
|
|
232
|
+
"UG","Kampala","241038"
|
|
233
|
+
"UM","-","34.2"
|
|
234
|
+
"US","Washington, D.C.","9826675"
|
|
235
|
+
"UY","Montevideo","176215"
|
|
236
|
+
"UZ","Tashkent","447400"
|
|
237
|
+
"VA","Vatican City","0.44"
|
|
238
|
+
"VC","Kingstown","389"
|
|
239
|
+
"VE","Caracas","912050"
|
|
240
|
+
"VG","Road Town","151"
|
|
241
|
+
"VI","Charlotte Amalie","1910"
|
|
242
|
+
"VN","Ha Noi","331210"
|
|
243
|
+
"VU","Port-vila","12189"
|
|
244
|
+
"WF","Mata'utu","142"
|
|
245
|
+
"WS","Apia","2831"
|
|
246
|
+
"YE","Sanaa","527968"
|
|
247
|
+
"YT","Mamoudzou","374"
|
|
248
|
+
"ZA","Cape Town","1219090"
|
|
249
|
+
"ZM","Lusaka","752618"
|
|
250
|
+
"ZW","Harare","390757"
|