validators 3.2.1 → 3.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +3 -0
- data/README.md +4 -4
- data/bin/sync-disposable-hostnames +120 -110
- data/bin/sync-tld +2 -2
- data/data/country_tlds.txt +235 -0
- data/data/disposable_domains.txt +110996 -0
- data/data/disposable_emails.txt +38 -0
- data/data/reserved_subdomains.txt +2830 -0
- data/data/tld.txt +1508 -0
- data/lib/validators.rb +1 -0
- data/lib/validators/constants.rb +1 -1
- data/lib/validators/disposable_emails.rb +19 -0
- data/lib/validators/disposable_hostnames.rb +2 -2
- data/lib/validators/locale/en.yml +2 -1
- data/lib/validators/locale/pt-BR.yml +1 -0
- data/lib/validators/reserved_subdomains.rb +2 -4
- data/lib/validators/tld.rb +2 -2
- data/lib/validators/validates_email_format_of.rb +19 -4
- data/lib/validators/version.rb +2 -2
- data/test/test_helper.rb +17 -1
- data/test/validators/disposable_email_test.rb +18 -5
- data/test/validators/validates_email_format_of_test.rb +4 -2
- data/validators.gemspec +3 -0
- metadata +53 -43
- data/data/country_tlds.json +0 -237
- data/data/disposable.json +0 -128
- data/data/disposable/10minutemail.json +0 -3
- data/data/disposable/1secmail.json +0 -5
- data/data/disposable/FGRibreau_mailchecker.json +0 -33602
- data/data/disposable/andreis_disposable_email_domains.json +0 -48320
- data/data/disposable/clipmails.json +0 -27
- data/data/disposable/cs.json +0 -15
- data/data/disposable/emailfake.json +0 -128
- data/data/disposable/fake_email_generator.json +0 -11
- data/data/disposable/fnando_dafe542cac13f831bbf5521a55248116.json +0 -20
- data/data/disposable/gmailnator.json +0 -3
- data/data/disposable/guerrillamail.json +0 -13
- data/data/disposable/ically.json +0 -28
- data/data/disposable/itemp.json +0 -4
- data/data/disposable/ivolo_disposable_email_domains.json +0 -48177
- data/data/disposable/jespernissen_disposable_maildomain_list.json +0 -2372
- data/data/disposable/maxmalysh_disposable_emails.json +0 -21372
- data/data/disposable/moakt.json +0 -12
- data/data/disposable/receivemail.json +0 -9
- data/data/disposable/sneakykiwi_LeagueCreatorPublic.json +0 -2364
- data/data/disposable/tempemail.json +0 -7
- data/data/disposable/tempemails.json +0 -10
- data/data/disposable/tempmail.json +0 -31
- data/data/disposable/tempmail_io.json +0 -8
- data/data/disposable/tempmailaddress.json +0 -4
- data/data/disposable/tempomail.json +0 -3
- data/data/disposable/tempr.json +0 -97
- data/data/disposable/tmail.json +0 -3
- data/data/disposable/wesbos_burner_email_providers.json +0 -4711
- data/data/disposable/willwhite_freemail.json +0 -352
- data/data/disposable/yepmail.json +0 -12
- data/data/disposable_emails.json +0 -3
- data/data/disposable_patterns.json +0 -3
- data/data/disposable_raw.json +0 -128
- data/data/reserved_subdomains.json +0 -2838
- data/data/sld.json +0 -5564
- data/data/tld.json +0 -1518
data/lib/validators.rb
CHANGED
data/lib/validators/constants.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Validators
|
4
4
|
EMAIL_FORMAT = /\A[a-z0-9]+([-._][a-z0-9]+)*(\+[^@]+)?@[a-z0-9]+([.-][a-z0-9]+)*\.[a-z]{2,}\z/i.freeze
|
5
|
-
MICROSOFT_EMAIL_FORMAT = /\A[
|
5
|
+
MICROSOFT_EMAIL_FORMAT = /\A[a-z0-9][a-z0-9._-]*[a-z0-9_-]+(\+[a-z0-9]+)?@(hotmail|outlook).com\z/i.freeze
|
6
6
|
|
7
7
|
# Source: https://github.com/henrik/validates_url_format_of
|
8
8
|
IPV4_PART = /\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]/.freeze # 0-255
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Validators
|
4
|
+
class DisposableEmails
|
5
|
+
FILE_PATH = File.expand_path("../../data/disposable_emails.txt", __dir__)
|
6
|
+
|
7
|
+
def self.all
|
8
|
+
@all ||= File.read(FILE_PATH).lines.map(&:chomp)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.include?(email)
|
12
|
+
mailbox, domain = email.to_s.split("@")
|
13
|
+
mailbox = mailbox.to_s.gsub(".", "")
|
14
|
+
mailbox = mailbox.gsub(/\+(.+)?\Z/, "")
|
15
|
+
|
16
|
+
all.include?("#{mailbox}@#{domain}")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
module Validators
|
4
4
|
class DisposableHostnames
|
5
|
-
FILE_PATH = File.expand_path("../../data/
|
5
|
+
FILE_PATH = File.expand_path("../../data/disposable_domains.txt", __dir__)
|
6
6
|
|
7
7
|
def self.all
|
8
|
-
@all ||=
|
8
|
+
@all ||= File.read(FILE_PATH).lines.map(&:chomp)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -3,7 +3,8 @@ en:
|
|
3
3
|
activemodel: &activemodel
|
4
4
|
errors:
|
5
5
|
messages:
|
6
|
-
disposable_email: "is not allowed (high-bounce
|
6
|
+
disposable_email: "is not allowed (high-bounce email)"
|
7
|
+
disposable_domain: "is not allowed (high-bounce domain)"
|
7
8
|
invalid_cnpj: "is not a valid CNPJ"
|
8
9
|
invalid_cpf: "is not a valid CPF"
|
9
10
|
invalid_date: "is not a valid date"
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Validators
|
4
4
|
class ReservedSubdomains
|
5
|
-
FILE_PATH = File.expand_path("../../data/reserved_subdomains.
|
5
|
+
FILE_PATH = File.expand_path("../../data/reserved_subdomains.txt", __dir__)
|
6
6
|
|
7
7
|
def self.reserved?(hostname, matchers = nil)
|
8
8
|
matchers = parse_list(matchers) if matchers
|
@@ -11,9 +11,7 @@ module Validators
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.all
|
14
|
-
@all ||=
|
15
|
-
.parse(File.read(FILE_PATH))
|
16
|
-
.map {|matcher| parse(matcher) }
|
14
|
+
@all ||= File.read(FILE_PATH).lines.map {|matcher| parse(matcher.chomp) }
|
17
15
|
end
|
18
16
|
|
19
17
|
def self.parse(matcher)
|
data/lib/validators/tld.rb
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
module Validators
|
4
4
|
class TLD
|
5
|
-
FILE_PATH = File.expand_path("../../data/tld.
|
5
|
+
FILE_PATH = File.expand_path("../../data/tld.txt", __dir__)
|
6
6
|
|
7
7
|
def self.all
|
8
|
-
@all ||=
|
8
|
+
@all ||= File.read(FILE_PATH).lines.map(&:chomp)
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.host_with_valid_tld?(host)
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "root_domain"
|
4
|
+
|
3
5
|
module ActiveModel
|
4
6
|
module Validations
|
5
7
|
class EmailValidator < EachValidator
|
@@ -14,6 +16,7 @@ module ActiveModel
|
|
14
16
|
|
15
17
|
validate_tld(record, attribute, value, options) if check_tld
|
16
18
|
validate_email_format(record, attribute, value, options)
|
19
|
+
validate_disposable_domain(record, attribute, value, options) unless allow_disposable
|
17
20
|
validate_disposable_email(record, attribute, value, options) unless allow_disposable
|
18
21
|
end
|
19
22
|
|
@@ -41,12 +44,24 @@ module ActiveModel
|
|
41
44
|
)
|
42
45
|
end
|
43
46
|
|
44
|
-
def
|
47
|
+
def validate_disposable_domain(record, attribute, value, _options)
|
48
|
+
return unless value
|
49
|
+
|
45
50
|
hostname = value.to_s.split(AT_SIGN).last.to_s.downcase
|
51
|
+
root_domain = RootDomain.call(hostname)
|
46
52
|
|
47
|
-
return
|
48
|
-
|
49
|
-
|
53
|
+
return unless Validators::DisposableHostnames.all.include?(root_domain)
|
54
|
+
|
55
|
+
record.errors.add(
|
56
|
+
attribute,
|
57
|
+
:disposable_domain,
|
58
|
+
value: value
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
def validate_disposable_email(record, attribute, value, _options)
|
63
|
+
return unless value
|
64
|
+
return unless Validators::DisposableEmails.include?(value)
|
50
65
|
|
51
66
|
record.errors.add(
|
52
67
|
attribute,
|
data/lib/validators/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -17,9 +17,25 @@ require "active_support/all"
|
|
17
17
|
require "minitest/utils"
|
18
18
|
require "minitest/autorun"
|
19
19
|
|
20
|
+
def build_email_with_filter(email)
|
21
|
+
mailbox, domain = email.split("@")
|
22
|
+
"#{mailbox}+#{SecureRandom.hex(3)}@#{domain}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def build_email_with_dots(email)
|
26
|
+
mailbox, domain = email.split("@")
|
27
|
+
new_mailbox = mailbox.chars.map {|char| [char, "."] }.flatten[0..-2].join
|
28
|
+
|
29
|
+
"#{new_mailbox}@#{domain}"
|
30
|
+
end
|
31
|
+
|
20
32
|
Time.zone = "America/Sao_Paulo"
|
21
33
|
TLDs = Validators::TLD.all.sample(10)
|
22
|
-
|
34
|
+
DISPOSABLE_DOMAINS = Validators::DisposableHostnames.all.sample(10)
|
35
|
+
DISPOSABLE_EMAILS = Validators::DisposableEmails.all +
|
36
|
+
Validators::DisposableEmails.all.sample(10).map {|email| build_email_with_filter(email) } +
|
37
|
+
Validators::DisposableEmails.all.sample(10).map {|email| build_email_with_dots(email) } +
|
38
|
+
Validators::DisposableEmails.all.sample(10).map {|email| build_email_with_filter(build_email_with_dots(email)) }
|
23
39
|
|
24
40
|
Dir[File.join(__dir__, "support/**/*.rb")].sort.each {|f| require f }
|
25
41
|
|
@@ -3,18 +3,19 @@
|
|
3
3
|
require "test_helper"
|
4
4
|
|
5
5
|
class DisposableEmailTest < Minitest::Test
|
6
|
-
|
7
|
-
test "rejects disposable
|
6
|
+
DISPOSABLE_DOMAINS.each do |domain|
|
7
|
+
test "rejects disposable domain (#{domain})" do
|
8
8
|
User.validates_email_format_of :email
|
9
9
|
|
10
10
|
user = User.new(email: "user@#{domain}")
|
11
11
|
user.valid?
|
12
12
|
|
13
|
-
assert_includes user.errors[:email],
|
13
|
+
assert_includes user.errors[:email],
|
14
|
+
I18n.t("activerecord.errors.messages.disposable_domain")
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
+
DISPOSABLE_DOMAINS.each do |domain|
|
18
19
|
test "rejects disposable e-mail with subdomain (custom.#{domain})" do
|
19
20
|
User.validates_email_format_of :email
|
20
21
|
|
@@ -22,7 +23,7 @@ class DisposableEmailTest < Minitest::Test
|
|
22
23
|
user.valid?
|
23
24
|
|
24
25
|
assert_includes user.errors[:email],
|
25
|
-
"
|
26
|
+
I18n.t("activerecord.errors.messages.disposable_domain")
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
@@ -34,4 +35,16 @@ class DisposableEmailTest < Minitest::Test
|
|
34
35
|
|
35
36
|
assert user.errors[:email].empty?
|
36
37
|
end
|
38
|
+
|
39
|
+
DISPOSABLE_EMAILS.each do |email|
|
40
|
+
test "rejects disposable e-mail (#{email})" do
|
41
|
+
User.validates_email_format_of :email
|
42
|
+
|
43
|
+
user = User.new(email: email)
|
44
|
+
user.valid?
|
45
|
+
|
46
|
+
assert_includes user.errors[:email],
|
47
|
+
I18n.t("activerecord.errors.messages.disposable_email")
|
48
|
+
end
|
49
|
+
end
|
37
50
|
end
|
@@ -12,10 +12,12 @@ class ValidatesEmailFormatOfTest < Minitest::Test
|
|
12
12
|
VALID_EMAILS.each do |email|
|
13
13
|
test "accepts #{email.inspect} as a valid email" do
|
14
14
|
user = User.new(email: email, corporate_email: email)
|
15
|
-
|
15
|
+
user.valid?
|
16
|
+
assert_empty user.errors
|
16
17
|
|
17
18
|
user = Person.new(email: email)
|
18
|
-
|
19
|
+
user.valid?
|
20
|
+
assert_empty user.errors
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
data/validators.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.add_development_dependency "nokogiri"
|
29
29
|
s.add_development_dependency "pry-meta"
|
30
30
|
s.add_development_dependency "rake"
|
31
|
+
s.add_development_dependency "root_domain"
|
31
32
|
s.add_development_dependency "rubocop"
|
32
33
|
s.add_development_dependency "rubocop-fnando"
|
33
34
|
s.add_development_dependency "simplecov"
|
@@ -35,4 +36,6 @@ Gem::Specification.new do |s|
|
|
35
36
|
s.add_development_dependency "simpleidn"
|
36
37
|
s.add_development_dependency "sqlite3", "~> 1.4"
|
37
38
|
s.add_development_dependency "sshkey"
|
39
|
+
s.add_development_dependency "whois"
|
40
|
+
s.add_development_dependency "whois-parser"
|
38
41
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validators
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nando Vieira
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -122,6 +122,20 @@ dependencies:
|
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: root_domain
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
126
140
|
name: rubocop
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -220,6 +234,34 @@ dependencies:
|
|
220
234
|
- - ">="
|
221
235
|
- !ruby/object:Gem::Version
|
222
236
|
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: whois
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '0'
|
244
|
+
type: :development
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
251
|
+
- !ruby/object:Gem::Dependency
|
252
|
+
name: whois-parser
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
254
|
+
requirements:
|
255
|
+
- - ">="
|
256
|
+
- !ruby/object:Gem::Version
|
257
|
+
version: '0'
|
258
|
+
type: :development
|
259
|
+
prerelease: false
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
261
|
+
requirements:
|
262
|
+
- - ">="
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: '0'
|
223
265
|
description: Add some nice ActiveModel/ActiveRecord validators.
|
224
266
|
email:
|
225
267
|
- fnando.vieira@gmail.com
|
@@ -237,46 +279,14 @@ files:
|
|
237
279
|
- Rakefile
|
238
280
|
- bin/sync-disposable-hostnames
|
239
281
|
- bin/sync-tld
|
240
|
-
- data/country_tlds.
|
241
|
-
- data/
|
242
|
-
- data/
|
243
|
-
- data/
|
244
|
-
- data/
|
245
|
-
- data/disposable/andreis_disposable_email_domains.json
|
246
|
-
- data/disposable/clipmails.json
|
247
|
-
- data/disposable/cs.json
|
248
|
-
- data/disposable/emailfake.json
|
249
|
-
- data/disposable/fake_email_generator.json
|
250
|
-
- data/disposable/fnando_dafe542cac13f831bbf5521a55248116.json
|
251
|
-
- data/disposable/gmailnator.json
|
252
|
-
- data/disposable/guerrillamail.json
|
253
|
-
- data/disposable/ically.json
|
254
|
-
- data/disposable/itemp.json
|
255
|
-
- data/disposable/ivolo_disposable_email_domains.json
|
256
|
-
- data/disposable/jespernissen_disposable_maildomain_list.json
|
257
|
-
- data/disposable/maxmalysh_disposable_emails.json
|
258
|
-
- data/disposable/moakt.json
|
259
|
-
- data/disposable/receivemail.json
|
260
|
-
- data/disposable/sneakykiwi_LeagueCreatorPublic.json
|
261
|
-
- data/disposable/tempemail.json
|
262
|
-
- data/disposable/tempemails.json
|
263
|
-
- data/disposable/tempmail.json
|
264
|
-
- data/disposable/tempmail_io.json
|
265
|
-
- data/disposable/tempmailaddress.json
|
266
|
-
- data/disposable/tempomail.json
|
267
|
-
- data/disposable/tempr.json
|
268
|
-
- data/disposable/tmail.json
|
269
|
-
- data/disposable/wesbos_burner_email_providers.json
|
270
|
-
- data/disposable/willwhite_freemail.json
|
271
|
-
- data/disposable/yepmail.json
|
272
|
-
- data/disposable_emails.json
|
273
|
-
- data/disposable_patterns.json
|
274
|
-
- data/disposable_raw.json
|
275
|
-
- data/reserved_subdomains.json
|
276
|
-
- data/sld.json
|
277
|
-
- data/tld.json
|
282
|
+
- data/country_tlds.txt
|
283
|
+
- data/disposable_domains.txt
|
284
|
+
- data/disposable_emails.txt
|
285
|
+
- data/reserved_subdomains.txt
|
286
|
+
- data/tld.txt
|
278
287
|
- lib/validators.rb
|
279
288
|
- lib/validators/constants.rb
|
289
|
+
- lib/validators/disposable_emails.rb
|
280
290
|
- lib/validators/disposable_hostnames.rb
|
281
291
|
- lib/validators/hostname.rb
|
282
292
|
- lib/validators/ip.rb
|
@@ -333,7 +343,7 @@ homepage: http://rubygems.org/gems/validators
|
|
333
343
|
licenses:
|
334
344
|
- MIT
|
335
345
|
metadata: {}
|
336
|
-
post_install_message:
|
346
|
+
post_install_message:
|
337
347
|
rdoc_options: []
|
338
348
|
require_paths:
|
339
349
|
- lib
|
@@ -349,7 +359,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
349
359
|
version: '0'
|
350
360
|
requirements: []
|
351
361
|
rubygems_version: 3.1.2
|
352
|
-
signing_key:
|
362
|
+
signing_key:
|
353
363
|
specification_version: 4
|
354
364
|
summary: Add some nice ActiveModel/ActiveRecord validators.
|
355
365
|
test_files:
|
data/data/country_tlds.json
DELETED
@@ -1,237 +0,0 @@
|
|
1
|
-
[
|
2
|
-
"ad",
|
3
|
-
"ae",
|
4
|
-
"af",
|
5
|
-
"ag",
|
6
|
-
"ai",
|
7
|
-
"al",
|
8
|
-
"am",
|
9
|
-
"an",
|
10
|
-
"ao",
|
11
|
-
"aq",
|
12
|
-
"ar",
|
13
|
-
"as",
|
14
|
-
"at",
|
15
|
-
"au",
|
16
|
-
"aw",
|
17
|
-
"az",
|
18
|
-
"ba",
|
19
|
-
"bb",
|
20
|
-
"bd",
|
21
|
-
"be",
|
22
|
-
"bf",
|
23
|
-
"bg",
|
24
|
-
"bh",
|
25
|
-
"bi",
|
26
|
-
"bj",
|
27
|
-
"bm",
|
28
|
-
"bn",
|
29
|
-
"bo",
|
30
|
-
"br",
|
31
|
-
"bs",
|
32
|
-
"bt",
|
33
|
-
"bv",
|
34
|
-
"bw",
|
35
|
-
"by",
|
36
|
-
"bz",
|
37
|
-
"ca",
|
38
|
-
"cc",
|
39
|
-
"cd",
|
40
|
-
"cf",
|
41
|
-
"cg",
|
42
|
-
"ch",
|
43
|
-
"ci",
|
44
|
-
"ck",
|
45
|
-
"cl",
|
46
|
-
"cm",
|
47
|
-
"cn",
|
48
|
-
"co",
|
49
|
-
"cr",
|
50
|
-
"cu",
|
51
|
-
"cv",
|
52
|
-
"cx",
|
53
|
-
"cy",
|
54
|
-
"cz",
|
55
|
-
"de",
|
56
|
-
"dj",
|
57
|
-
"dk",
|
58
|
-
"dm",
|
59
|
-
"do",
|
60
|
-
"dz",
|
61
|
-
"ec",
|
62
|
-
"ee",
|
63
|
-
"eg",
|
64
|
-
"eh",
|
65
|
-
"er",
|
66
|
-
"es",
|
67
|
-
"et",
|
68
|
-
"fi",
|
69
|
-
"fj",
|
70
|
-
"fk",
|
71
|
-
"fr",
|
72
|
-
"ga",
|
73
|
-
"gb",
|
74
|
-
"gd",
|
75
|
-
"ge",
|
76
|
-
"gf",
|
77
|
-
"gh",
|
78
|
-
"gi",
|
79
|
-
"gl",
|
80
|
-
"gm",
|
81
|
-
"gn",
|
82
|
-
"gp",
|
83
|
-
"gq",
|
84
|
-
"gr",
|
85
|
-
"gs",
|
86
|
-
"gt",
|
87
|
-
"gu",
|
88
|
-
"gw",
|
89
|
-
"gy",
|
90
|
-
"hk",
|
91
|
-
"hm",
|
92
|
-
"hn",
|
93
|
-
"hr",
|
94
|
-
"ht",
|
95
|
-
"hu",
|
96
|
-
"id",
|
97
|
-
"ie",
|
98
|
-
"il",
|
99
|
-
"in",
|
100
|
-
"io",
|
101
|
-
"iq",
|
102
|
-
"ir",
|
103
|
-
"is",
|
104
|
-
"it",
|
105
|
-
"jm",
|
106
|
-
"jo",
|
107
|
-
"jp",
|
108
|
-
"ke",
|
109
|
-
"kg",
|
110
|
-
"kh",
|
111
|
-
"ki",
|
112
|
-
"km",
|
113
|
-
"kn",
|
114
|
-
"kp",
|
115
|
-
"kr",
|
116
|
-
"kw",
|
117
|
-
"ky",
|
118
|
-
"kz",
|
119
|
-
"la",
|
120
|
-
"lb",
|
121
|
-
"lc",
|
122
|
-
"li",
|
123
|
-
"lk",
|
124
|
-
"lr",
|
125
|
-
"ls",
|
126
|
-
"lt",
|
127
|
-
"lu",
|
128
|
-
"lv",
|
129
|
-
"ly",
|
130
|
-
"ma",
|
131
|
-
"mc",
|
132
|
-
"md",
|
133
|
-
"mg",
|
134
|
-
"mh",
|
135
|
-
"mk",
|
136
|
-
"ml",
|
137
|
-
"mm",
|
138
|
-
"mn",
|
139
|
-
"mo",
|
140
|
-
"mp",
|
141
|
-
"mq",
|
142
|
-
"mr",
|
143
|
-
"ms",
|
144
|
-
"mt",
|
145
|
-
"mu",
|
146
|
-
"mv",
|
147
|
-
"mw",
|
148
|
-
"mx",
|
149
|
-
"my",
|
150
|
-
"mz",
|
151
|
-
"na",
|
152
|
-
"nc",
|
153
|
-
"ne",
|
154
|
-
"nf",
|
155
|
-
"ng",
|
156
|
-
"ni",
|
157
|
-
"nl",
|
158
|
-
"no",
|
159
|
-
"np",
|
160
|
-
"nr",
|
161
|
-
"nu",
|
162
|
-
"nz",
|
163
|
-
"om",
|
164
|
-
"pa",
|
165
|
-
"pe",
|
166
|
-
"pf",
|
167
|
-
"pg",
|
168
|
-
"ph",
|
169
|
-
"pk",
|
170
|
-
"pl",
|
171
|
-
"pm",
|
172
|
-
"pn",
|
173
|
-
"pr",
|
174
|
-
"ps",
|
175
|
-
"pt",
|
176
|
-
"pw",
|
177
|
-
"py",
|
178
|
-
"qa",
|
179
|
-
"re",
|
180
|
-
"ro",
|
181
|
-
"ru",
|
182
|
-
"rw",
|
183
|
-
"sa",
|
184
|
-
"sb",
|
185
|
-
"sc",
|
186
|
-
"sd",
|
187
|
-
"se",
|
188
|
-
"sg",
|
189
|
-
"sh",
|
190
|
-
"si",
|
191
|
-
"sj",
|
192
|
-
"sk",
|
193
|
-
"sl",
|
194
|
-
"sm",
|
195
|
-
"sn",
|
196
|
-
"so",
|
197
|
-
"sr",
|
198
|
-
"ss",
|
199
|
-
"st",
|
200
|
-
"sv",
|
201
|
-
"sy",
|
202
|
-
"sz",
|
203
|
-
"tc",
|
204
|
-
"td",
|
205
|
-
"tf",
|
206
|
-
"tg",
|
207
|
-
"th",
|
208
|
-
"tj",
|
209
|
-
"tk",
|
210
|
-
"tl",
|
211
|
-
"tm",
|
212
|
-
"tn",
|
213
|
-
"to",
|
214
|
-
"tr",
|
215
|
-
"tt",
|
216
|
-
"tv",
|
217
|
-
"tz",
|
218
|
-
"ua",
|
219
|
-
"ug",
|
220
|
-
"us",
|
221
|
-
"uy",
|
222
|
-
"uz",
|
223
|
-
"va",
|
224
|
-
"vc",
|
225
|
-
"ve",
|
226
|
-
"vg",
|
227
|
-
"vi",
|
228
|
-
"vn",
|
229
|
-
"vu",
|
230
|
-
"wf",
|
231
|
-
"ws",
|
232
|
-
"ye",
|
233
|
-
"yt",
|
234
|
-
"za",
|
235
|
-
"zm",
|
236
|
-
"zw"
|
237
|
-
]
|