├── .gitattributes
├── CHANGELOG.md
├── types
└── index.d.ts
├── data
├── generate.js
├── ccTldMap.json
├── second_level_domains.csv
└── sldMap.json
├── .editorconfig
├── example
├── main.js
├── index.html
└── dist
│ └── bundle.js
├── LICENSE
├── package.json
├── .gitignore
├── README.md
├── index.js
└── test
└── domain.test.js
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Convert line endings to LF (Line Feed)
2 | * text=auto
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 | All notable changes to this project will be documented in this file.
3 |
--------------------------------------------------------------------------------
/types/index.d.ts:
--------------------------------------------------------------------------------
1 | declare function isValidDomain(text: string, opts?: { subdomain?: boolean; wildcard?: boolean, allowUnicode?: boolean, topLevel?: boolean }): boolean;
2 |
3 | export = isValidDomain;
4 |
--------------------------------------------------------------------------------
/data/generate.js:
--------------------------------------------------------------------------------
1 | var fs = require('fs')
2 | var path = require('path')
3 | var csv = fs.readFileSync(path.resolve(__dirname, 'second_level_domains.csv'))
4 |
5 | var lines = csv.toString('utf8').split('\n')
6 | var list = {}
7 | for (var i = 0; i < lines.length; i++) {
8 | if (!lines[i]) continue
9 | var domain = lines[i].split(',')[1].trim().substr(1)
10 | list[domain] = true
11 | }
12 |
13 | fs.writeFileSync(path.resolve(__dirname, 'sldMap.json'), JSON.stringify(list, null, 2))
14 | console.log('done')
15 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig is awesome: http://EditorConfig.org
2 |
3 | # top-most EditorConfig file
4 | root = true
5 |
6 | [*]
7 | # use line feed
8 | end_of_line = lf
9 |
10 | # ensure file ends with a newline when saving
11 | insert_final_newline = true
12 |
13 | # soft tabs
14 | indent_style = space
15 |
16 | # number of columns used for each indentation level
17 | indent_size = 2
18 |
19 | # remove any whitespace characters preceding newline characters
20 | trim_trailing_whitespace = true
21 |
22 | # character set
23 | charset = utf-8
24 |
--------------------------------------------------------------------------------
/example/main.js:
--------------------------------------------------------------------------------
1 | const isValidDomain = require('../')
2 |
3 | const domain = document.querySelector('#domain')
4 | const subdomain = document.querySelector('#subdomain')
5 | const topLevel = document.querySelector('#topLevel')
6 | const wildcard = document.querySelector('#wildcard')
7 | const unicode = document.querySelector('#unicode')
8 | const output = document.querySelector('#output')
9 |
10 | domain.addEventListener('input', update)
11 | subdomain.addEventListener('change', update)
12 | topLevel.addEventListener('change', update)
13 | wildcard.addEventListener('change', update)
14 | unicode.addEventListener('change', update)
15 |
16 | update()
17 |
18 | function update(event) {
19 | if (event) event.preventDefault()
20 | output.innerHTML = String(isValidDomain(domain.value, {
21 | subdomain: subdomain.checked,
22 | topLevel: topLevel.checked,
23 | wildcard: wildcard.checked,
24 | allowUnicode: unicode.checked,
25 | }))
26 | }
27 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT license
2 |
3 | Copyright (C) 2014 Miguel Mota
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of
6 | this software and associated documentation files (the "Software"), to deal in
7 | the Software without restriction, including without limitation the rights to
8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
9 | of the Software, and to permit persons to whom the Software is furnished to do
10 | so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/example/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | valid domain checker
7 |
8 |
9 | valid domain checker
10 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "is-valid-domain",
3 | "version": "0.1.6",
4 | "description": "Validate domain name",
5 | "main": "index.js",
6 | "types": "types/index.d.ts",
7 | "scripts": {
8 | "test": "tape test/*.js",
9 | "lint": "standard --fix index.js",
10 | "build:example": "browserify example/main.js -o example/dist/bundle.js",
11 | "generate": "node data/generate.js"
12 | },
13 | "repository": {
14 | "type": "git",
15 | "url": "https://github.com/miguelmota/is-valid-domain"
16 | },
17 | "keywords": [
18 | "valid",
19 | "validate",
20 | "validator",
21 | "check",
22 | "checker",
23 | "domain",
24 | "subdomain",
25 | "wildcard",
26 | "host",
27 | "hostname"
28 | ],
29 | "author": {
30 | "name": "Miguel Mota",
31 | "email": "hello@miguelmota.com",
32 | "url": "https://miguelmota.com/"
33 | },
34 | "license": {
35 | "type": "MIT",
36 | "url": "https://github.com/miguelmota/is-valid-domain/blob/master/LICENSE"
37 | },
38 | "bugs": {
39 | "url": "https://github.com/miguelmota/is-valid-domain/issues"
40 | },
41 | "homepage": "https://github.com/miguelmota/is-valid-domain",
42 | "devDependencies": {
43 | "browserify": "^16.2.3",
44 | "standard": "^16.0.4",
45 | "tape": "^4.9.2"
46 | },
47 | "testling": {
48 | "files": "test/*.js",
49 | "browsers": [
50 | "ie/6..latest",
51 | "chrome/22..latest",
52 | "firefox/16..latest",
53 | "safari/latest",
54 | "opera/11.0..latest",
55 | "iphone/6",
56 | "ipad/6",
57 | "android-browser/latest"
58 | ]
59 | },
60 | "dependencies": {
61 | "punycode": "^2.1.1"
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | //this will affect all the git repos
2 | git config --global core.excludesfile ~/.gitignore
3 |
4 |
5 | //update files since .ignore won't if already tracked
6 | git rm --cached
7 |
8 | # Compiled source #
9 | ###################
10 | *.com
11 | *.class
12 | *.dll
13 | *.exe
14 | *.o
15 | *.so
16 |
17 | # Packages #
18 | ############
19 | # it's better to unpack these files and commit the raw source
20 | # git has its own built in compression methods
21 | *.7z
22 | *.dmg
23 | *.gz
24 | *.iso
25 | *.jar
26 | *.rar
27 | *.tar
28 | *.zip
29 |
30 | # Logs and databases #
31 | ######################
32 | *.log
33 | *.sql
34 | *.sqlite
35 |
36 | # OS generated files #
37 | ######################
38 | .DS_Store
39 | .DS_Store?
40 | ._*
41 | .Spotlight-V100
42 | .Trashes
43 | # Icon?
44 | ehthumbs.db
45 | Thumbs.db
46 | .cache
47 | .project
48 | .settings
49 | .tmproj
50 | *.esproj
51 | nbproject
52 |
53 | # Numerous always-ignore extensions #
54 | #####################################
55 | *.diff
56 | *.err
57 | *.orig
58 | *.rej
59 | *.swn
60 | *.swo
61 | *.swp
62 | *.vi
63 | *~
64 | *.sass-cache
65 | *.grunt
66 | *.tmp
67 |
68 | # Dreamweaver added files #
69 | ###########################
70 | _notes
71 | dwsync.xml
72 |
73 | # Komodo #
74 | ###########################
75 | *.komodoproject
76 | .komodotools
77 |
78 | # Node #
79 | #####################
80 | node_modules
81 |
82 | # Bower #
83 | #####################
84 | bower_components
85 |
86 | # Folders to ignore #
87 | #####################
88 | .hg
89 | .svn
90 | .CVS
91 | intermediate
92 | publish
93 | .idea
94 | .graphics
95 | _test
96 | _archive
97 | uploads
98 | tmp
99 |
100 | # Files to ignore #
101 | #######################
102 | package-lock.json
103 |
104 | # Vim files to ignore #
105 | #######################
106 | .VimballRecord
107 | .netrwhist
108 |
109 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # is-valid-domain
2 |
3 | > Validate domain name in JavaScript
4 |
5 | ## Demo
6 |
7 | [https://lab.miguelmota.com/is-valid-domain](https://lab.miguelmota.com/is-valid-domain)
8 |
9 | ## Install
10 |
11 | ```bash
12 | npm install is-valid-domain
13 | ```
14 |
15 | ## Usage
16 |
17 | ```javascript
18 | const isValidDomain = require('is-valid-domain')
19 |
20 | isValidDomain('example.com') // true
21 | isValidDomain('foo.example.com') // true
22 | isValidDomain('bar.foo.example.com') // true
23 | isValidDomain('exa-mple.co.uk') // true
24 | isValidDomain('xn--80ak6aa92e.com') // true
25 | isValidDomain('_dnslink.ipfs.io') // true
26 | isValidDomain('exa_mple.com') // false
27 | isValidDomain('-example.co.uk') // false
28 | isValidDomain('example') // false
29 | isValidDomain('ex*mple.com') // false
30 | isValidDomain('*.example.com') // false
31 | isValidDomain('*.com') // false
32 | isValidDomain(3434) // false
33 |
34 | isValidDomain('foo.example.com', {subdomain: true}) // true
35 | isValidDomain('foo.example.com', {subdomain: false}) // false
36 | isValidDomain('*.example.com', {wildcard: false}) // false
37 | isValidDomain('*.example.com', {wildcard: true}) // true
38 | isValidDomain('*.example.com', {subdomain: false, wildcard: true}) // false
39 | isValidDomain('はじめよう.みんな') // false
40 | isValidDomain('はじめよう.みんな', {allowUnicode: true}) // true
41 | isValidDomain('ai.') // false
42 | isValidDomain('ai.', {topLevel: true}) // true
43 | ```
44 |
45 | view more [examples](./test/domain.test.js)
46 |
47 | ## Test
48 |
49 | ```bash
50 | npm test
51 | ```
52 |
53 | ## Contributing
54 |
55 | Adding new domains:
56 |
57 | - Add second level domain to `data/second_level_domains.csv`
58 | - Run `npm run generate` to generate JSON map file
59 | - Run `npm test`
60 |
61 | ## FAQ
62 |
63 | - Q: Why is trailing dot `.` in domain names verified as `true`?
64 |
65 | - A: Fully qualified domain names allow the trailing dot which represents the root zone. More info [here](http://www.dns-sd.org/trailingdotsindomainnames.html) and [here](https://en.wikipedia.org/wiki/Fully_qualified_domain_name).
66 |
67 | ## License
68 |
69 | [MIT](LICENSE)
70 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const punycode = require('punycode')
2 | const sldMap = require('./data/sldMap.json')
3 | const ccTldMap = require('./data/ccTldMap.json')
4 |
5 | module.exports = function isValidDomain (value, opts) {
6 | if (typeof value !== 'string') return false
7 | if (!(opts instanceof Object)) opts = {}
8 | value = value.toLowerCase()
9 |
10 | if (value.endsWith('.')) {
11 | value = value.slice(0, value.length - 1)
12 | }
13 |
14 | if (opts.allowUnicode) {
15 | value = punycode.toASCII(value)
16 | }
17 |
18 | if (value.length > 253) {
19 | return false
20 | }
21 |
22 | const validChars = /^([\u0E00-\u0E7Fa-z0-9-._*]+)$/g
23 | if (!validChars.test(value)) {
24 | return false
25 | }
26 |
27 | if (opts.topLevel) {
28 | if (ccTldMap[value.replace(/\.$/, '')]) {
29 | return true
30 | }
31 | }
32 |
33 | const sldRegex = /(.*)\.(([\u0E00-\u0E7Fa-z0-9]+)(\.[a-z0-9]+))/
34 | const matches = value.match(sldRegex)
35 | let tld = null
36 | let labels = null
37 | if (matches && matches.length > 2) {
38 | if (sldMap[matches[2]]) {
39 | tld = matches[2]
40 | labels = matches[1].split('.')
41 | }
42 | }
43 |
44 | if (!labels) {
45 | labels = value.split('.')
46 | if (labels.length <= 1) return false
47 |
48 | tld = labels.pop()
49 | const tldRegex = /^(?:xn--)?(?!^\d+$)[\u0E00-\u0E7Fa-z0-9]+$/gi
50 |
51 | if (!tldRegex.test(tld)) return false
52 | }
53 |
54 | if (opts.subdomain === false && labels.length > 1) return false
55 |
56 | const isValid = labels.every(function (label, index) {
57 | if (opts.wildcard && index === 0 && label === '*' && labels.length > 1) {
58 | return true
59 | }
60 |
61 | let validLabelChars = /^([\u0E00-\u0E7Fa-zA-Z0-9-_]+)$/g
62 | if (index === labels.length - 1) {
63 | validLabelChars = /^([\u0E00-\u0E7Fa-zA-Z0-9-]+)$/g
64 | }
65 |
66 | // https://github.com/miguelmota/is-valid-domain/issues/22
67 | const doubleDashCount = (label.match(/--(--)?/g) || []).length
68 | const xnDashCount = (label.match(/xn--/g) || []).length
69 | if (index === labels.length - 1 && doubleDashCount !== xnDashCount) {
70 | return false
71 | }
72 |
73 | const isValid = (
74 | validLabelChars.test(label) &&
75 | label.length < 64 &&
76 | !label.startsWith('-') &&
77 | !label.endsWith('-')
78 | )
79 |
80 | return isValid
81 | })
82 |
83 | return isValid
84 | }
85 |
--------------------------------------------------------------------------------
/data/ccTldMap.json:
--------------------------------------------------------------------------------
1 | {
2 | "ad": true,
3 | "ae": true,
4 | "af": true,
5 | "ag": true,
6 | "ai": true,
7 | "al": true,
8 | "am": true,
9 | "ao": true,
10 | "aq": true,
11 | "ar": true,
12 | "as": true,
13 | "at": true,
14 | "au": true,
15 | "aw": true,
16 | "ax": true,
17 | "az": true,
18 | "ba": true,
19 | "bb": true,
20 | "bd": true,
21 | "be": true,
22 | "bf": true,
23 | "bg": true,
24 | "bh": true,
25 | "bi": true,
26 | "bj": true,
27 | "bl": true,
28 | "bm": true,
29 | "bn": true,
30 | "bo": true,
31 | "bq": true,
32 | "br": true,
33 | "bs": true,
34 | "bt": true,
35 | "bv": true,
36 | "bw": true,
37 | "by": true,
38 | "bz": true,
39 | "ca": true,
40 | "cc": true,
41 | "cd": true,
42 | "cf": true,
43 | "cg": true,
44 | "ch": true,
45 | "ci": true,
46 | "ck": true,
47 | "cl": true,
48 | "cm": true,
49 | "cn": true,
50 | "co": true,
51 | "cr": true,
52 | "cu": true,
53 | "cv": true,
54 | "cw": true,
55 | "cx": true,
56 | "cy": true,
57 | "cz": true,
58 | "de": true,
59 | "dj": true,
60 | "dk": true,
61 | "dm": true,
62 | "do": true,
63 | "dz": true,
64 | "ec": true,
65 | "ee": true,
66 | "eg": true,
67 | "er": true,
68 | "es": true,
69 | "et": true,
70 | "fi": true,
71 | "fj": true,
72 | "fk": true,
73 | "fm": true,
74 | "fo": true,
75 | "fr": true,
76 | "ga": true,
77 | "gb (.uk)": true,
78 | "gd": true,
79 | "ge": true,
80 | "gf": true,
81 | "gg": true,
82 | "gh": true,
83 | "gi": true,
84 | "gl": true,
85 | "gm": true,
86 | "gn": true,
87 | "gp": true,
88 | "gq": true,
89 | "gr": true,
90 | "gs": true,
91 | "gt": true,
92 | "gu": true,
93 | "gw": true,
94 | "gy": true,
95 | "hk": true,
96 | "hm": true,
97 | "hn": true,
98 | "hr": true,
99 | "ht": true,
100 | "hu": true,
101 | "id": true,
102 | "ie": true,
103 | "il": true,
104 | "im": true,
105 | "in": true,
106 | "io": true,
107 | "iq": true,
108 | "ir": true,
109 | "is": true,
110 | "it": true,
111 | "je": true,
112 | "jm": true,
113 | "jo": true,
114 | "jp": true,
115 | "ke": true,
116 | "kg": true,
117 | "kh": true,
118 | "ki": true,
119 | "km": true,
120 | "kn": true,
121 | "kp": true,
122 | "kr": true,
123 | "kw": true,
124 | "ky": true,
125 | "kz": true,
126 | "la": true,
127 | "lb": true,
128 | "lc": true,
129 | "li": true,
130 | "lk": true,
131 | "lr": true,
132 | "ls": true,
133 | "lt": true,
134 | "lu": true,
135 | "lv": true,
136 | "ly": true,
137 | "ma": true,
138 | "mc": true,
139 | "md": true,
140 | "me": true,
141 | "mf": true,
142 | "mg": true,
143 | "mh": true,
144 | "mk": true,
145 | "ml": true,
146 | "mm": true,
147 | "mn": true,
148 | "mo": true,
149 | "mp": true,
150 | "mq": true,
151 | "mr": true,
152 | "ms": true,
153 | "mt": true,
154 | "mu": true,
155 | "mv": true,
156 | "mw": true,
157 | "mx": true,
158 | "my": true,
159 | "mz": true,
160 | "na": true,
161 | "nc": true,
162 | "ne": true,
163 | "nf": true,
164 | "ng": true,
165 | "ni": true,
166 | "nl": true,
167 | "no": true,
168 | "np": true,
169 | "nr": true,
170 | "nu": true,
171 | "nz": true,
172 | "om": true,
173 | "pa": true,
174 | "pe": true,
175 | "pf": true,
176 | "pg": true,
177 | "ph": true,
178 | "pk": true,
179 | "pl": true,
180 | "pm": true,
181 | "pn": true,
182 | "pr": true,
183 | "ps": true,
184 | "pt": true,
185 | "pw": true,
186 | "py": true,
187 | "qa": true,
188 | "re": true,
189 | "ro": true,
190 | "rs": true,
191 | "ru": true,
192 | "rw": true,
193 | "sa": true,
194 | "sb": true,
195 | "sc": true,
196 | "sd": true,
197 | "se": true,
198 | "sg": true,
199 | "sh": true,
200 | "si": true,
201 | "sj": true,
202 | "sk": true,
203 | "sl": true,
204 | "sm": true,
205 | "sn": true,
206 | "so": true,
207 | "sr": true,
208 | "ss": true,
209 | "st": true,
210 | "sv": true,
211 | "sx": true,
212 | "sy": true,
213 | "sz": true,
214 | "tc": true,
215 | "td": true,
216 | "tf": true,
217 | "tg": true,
218 | "th": true,
219 | "tj": true,
220 | "tk": true,
221 | "tl": true,
222 | "tm": true,
223 | "tn": true,
224 | "to": true,
225 | "tr": true,
226 | "tt": true,
227 | "tv": true,
228 | "tw": true,
229 | "tz": true,
230 | "ua": true,
231 | "ug": true,
232 | "us": true,
233 | "uy": true,
234 | "uz": true,
235 | "va": true,
236 | "vc": true,
237 | "ve": true,
238 | "vg": true,
239 | "vi": true,
240 | "vn": true,
241 | "vu": true,
242 | "wf": true,
243 | "ws": true,
244 | "ye": true,
245 | "yt": true,
246 | "za": true,
247 | "zm": true,
248 | "zw": true
249 | }
250 |
--------------------------------------------------------------------------------
/test/domain.test.js:
--------------------------------------------------------------------------------
1 | const test = require('tape')
2 | const isValidDomain = require('../')
3 | const sldMap = require('../data/sldMap.json')
4 |
5 | test('tld and simple subdomains', function (t) {
6 | t.plan(14)
7 | t.equal(isValidDomain('example.com'), true)
8 | t.equal(isValidDomain('foo.example.com'), true)
9 | t.equal(isValidDomain('bar.foo.example.com'), true)
10 | t.equal(isValidDomain('exa-mple.co.uk'), true)
11 | t.equal(isValidDomain('a.com'), true)
12 | t.equal(isValidDomain('a.b'), true)
13 | t.equal(isValidDomain('foo.bar.baz'), true)
14 | t.equal(isValidDomain('foo-bar.ba-z.qux'), true)
15 | t.equal(isValidDomain('hello.world'), true)
16 | t.equal(isValidDomain('ex-am-ple.com'), true)
17 | t.equal(isValidDomain('xn--80ak6aa92e.com'), true)
18 | t.equal(isValidDomain('example.a9'), true)
19 | t.equal(isValidDomain('example.9a'), true)
20 | t.equal(isValidDomain('example.99'), false)
21 | })
22 |
23 | test('more subdomains', function (t) {
24 | t.plan(22)
25 | t.equal(isValidDomain('example.com'), true)
26 | t.equal(isValidDomain('foo.example.com'), true)
27 | t.equal(isValidDomain('example.com', { subdomain: true }), true)
28 | t.equal(isValidDomain('foo.example.com', { subdomain: true }), true)
29 | t.equal(isValidDomain('foo.example.com', { subdomain: false }), false)
30 | t.equal(isValidDomain('-foo.example.com', { subdomain: true }), false)
31 | t.equal(isValidDomain('foo-.example.com', { subdomain: true }), false)
32 | t.equal(isValidDomain('-foo-.example.com', { subdomain: true }), false)
33 | t.equal(isValidDomain('-foo.example.com'), false)
34 | t.equal(isValidDomain('foo-.example.com'), false)
35 | t.equal(isValidDomain('-foo-.example.com'), false)
36 | t.equal(isValidDomain('foo-.bar.example.com'), false)
37 | t.equal(isValidDomain('-foo.bar.example.com'), false)
38 | t.equal(isValidDomain('-foo-.bar.example.com'), false)
39 | t.equal(isValidDomain('-foo-.bar.example.com', { subdomain: true }), false)
40 | t.equal(isValidDomain('foo-.bar.example.com', { subdomain: true }), false)
41 | t.equal(isValidDomain('-foo-.bar.example.com', { subdomain: true }), false)
42 | t.equal(isValidDomain('-foo-.-bar-.example.com', { subdomain: true }), false)
43 | t.equal(isValidDomain('example.com', { subdomain: false }), true)
44 | t.equal(isValidDomain('*.example.com', { subdomain: true }), false)
45 | t.equal(isValidDomain('abcd--def.example.com', { subdomain: true }), true)
46 | t.equal(isValidDomain('ab--cd.ab--cd.example.com', { subdomain: true }), true)
47 | })
48 |
49 | test('sld', function (t) {
50 | t.plan(5)
51 | t.equal(isValidDomain('example.co.uk'), true)
52 | t.equal(isValidDomain('exampl1.co.uk', { subdomain: false }), true)
53 | t.equal(isValidDomain('abc.example.co.uk', { subdomain: false }), false)
54 | t.equal(isValidDomain('*.example.co.uk', { subdomain: true }), false)
55 | t.equal(isValidDomain('*.example.co.uk', { subdomain: true, wildcard: true }), true)
56 | })
57 |
58 | test('slds from map file', function (t) {
59 | t.plan(Object.keys(sldMap).length)
60 | for (const sld in sldMap) {
61 | t.equal(isValidDomain(`example.${sld}`), true)
62 | }
63 | })
64 |
65 | test('punycode', function (t) {
66 | t.plan(15)
67 | t.equal(isValidDomain('xn--6qq79v.xn--fiqz9s'), true)
68 | t.equal(isValidDomain('xn--ber-goa.com'), true)
69 | t.equal(isValidDomain('xn--a--ber-goa.com'), false)
70 | t.equal(isValidDomain('xn--c1yn36f.example.com'), true)
71 | t.equal(isValidDomain('xn--addas-o4a.de'), true)
72 | t.equal(isValidDomain('xn--p8j9a0d9c9a.xn--q9jyb4c'), true)
73 | t.equal(isValidDomain('привет-мир.рф', { allowUnicode: true }), true)
74 | t.equal(isValidDomain('test-me.рф', { allowUnicode: true }), true)
75 | t.equal(isValidDomain('test--me.рф', { allowUnicode: true }), false)
76 | t.equal(isValidDomain('приветмир.com', { allowUnicode: true }), true)
77 | t.equal(isValidDomain('xn--b1aghctohfp.xn--p1ai', { allowUnicode: false }), true)
78 | t.equal(isValidDomain('привет-мир.com', { allowUnicode: true }), true)
79 | t.equal(isValidDomain('привет-мир.рф', { allowUnicode: true }), true)
80 | t.equal(isValidDomain('дядя-ваня.рф', { allowUnicode: true }), true)
81 | t.equal(isValidDomain('дядя-ваня.ru.com', { allowUnicode: true }), true)
82 | })
83 |
84 | test('unicode', function (t) {
85 | t.plan(4)
86 | t.equal(isValidDomain('はじめよう.みんな'), false)
87 | t.equal(isValidDomain('名がドメイン.com'), false)
88 | t.equal(isValidDomain('はじめよう.みんな', { allowUnicode: true }), true)
89 | t.equal(isValidDomain('名がドメイン.com', { allowUnicode: true }), true)
90 | })
91 |
92 | test('country code tld', function (t) {
93 | t.plan(7)
94 | t.equal(isValidDomain('ai.'), false)
95 | t.equal(isValidDomain('ai'), false)
96 | t.equal(isValidDomain('ai.', { topLevel: true }), true)
97 | t.equal(isValidDomain('ai', { topLevel: true }), true)
98 | t.equal(isValidDomain('ae.'), false)
99 | t.equal(isValidDomain('ae.', { topLevel: true }), true)
100 | t.equal(isValidDomain('xx.', { topLevel: true }), false)
101 | })
102 |
103 | test('invalid tld and subdomain', function (t) {
104 | t.plan(23)
105 | t.equal(isValidDomain('localhost'), false)
106 | t.equal(isValidDomain('127.0.0.1'), false)
107 | t.equal(isValidDomain('bar.q-ux'), false)
108 | t.equal(isValidDomain('exa_mple.com'), false)
109 | t.equal(isValidDomain('example'), false)
110 | t.equal(isValidDomain('ex*mple.com'), false)
111 | t.equal(isValidDomain('@#$@#$%fd'), false)
112 | t.equal(isValidDomain('_example.com'), false)
113 | t.equal(isValidDomain('-example.com'), false)
114 | t.equal(isValidDomain('xn–pple-43d.com'), false)
115 | t.equal(isValidDomain('foo._example.com'), false)
116 | t.equal(isValidDomain('foo.-example.com'), false)
117 | t.equal(isValidDomain('foo.example-.co.uk'), false)
118 | t.equal(isValidDomain('example-.com'), false)
119 | t.equal(isValidDomain('example_.com'), false)
120 | t.equal(isValidDomain('foo.example-.com'), false)
121 | t.equal(isValidDomain('foo.example_.com'), false)
122 | t.equal(isValidDomain('example.com-'), false)
123 | t.equal(isValidDomain('example.com_'), false)
124 | t.equal(isValidDomain('-foo.example.com_'), false)
125 | t.equal(isValidDomain('_foo.example.com_'), false)
126 | t.equal(isValidDomain('*.com_'), false)
127 | t.equal(isValidDomain('*.*.com_'), false)
128 | })
129 |
130 | test('subdomain underscores', function (t) {
131 | t.plan(5)
132 | t.equal(isValidDomain('_dnslink.ipfs.io'), true)
133 | t.equal(isValidDomain('_dnslink.ip_fs.io'), false)
134 | t.equal(isValidDomain('_foo.example.com'), true)
135 | t.equal(isValidDomain('xn--_eamop.donata.com'), true)
136 | t.equal(isValidDomain('__foo.example.com'), true)
137 | })
138 |
139 | test('wildcard', function (t) {
140 | t.plan(9)
141 | t.equal(isValidDomain('*.example.com'), false)
142 | t.equal(isValidDomain('*.example.com', { wildcard: false }), false)
143 | t.equal(isValidDomain('*.example.com', { wildcard: true }), true)
144 | t.equal(isValidDomain('*.*.com', { wildcard: true }), false)
145 | t.equal(isValidDomain('*.com', { wildcard: true }), false)
146 | t.equal(isValidDomain('example.com', { wildcard: true }), true)
147 | t.equal(isValidDomain('example.com', { subdomain: true, wildcard: true }), true)
148 | t.equal(isValidDomain('*.example.com', { subdomain: true, wildcard: true }), true)
149 | t.equal(isValidDomain('*.example.com', { subdomain: false, wildcard: true }), false)
150 | })
151 |
152 | test('length', function (t) {
153 | t.plan(3)
154 | t.equal(isValidDomain(`${'a'.repeat(63)}.${'b'.repeat(63)}.${'c'.repeat(63)}.${'c'.repeat(61)}`), true)
155 | t.equal(isValidDomain(`${'a'.repeat(63)}.${'b'.repeat(63)}.${'c'.repeat(63)}.${'c'.repeat(61)}.`), true)
156 | t.equal(isValidDomain(`${'a'.repeat(63)}.${'b'.repeat(63)}.${'c'.repeat(63)}.${'c'.repeat(62)}`), false)
157 | })
158 |
159 | test('invalid types', function (t) {
160 | t.plan(4)
161 | t.equal(isValidDomain(3434), false)
162 | t.equal(isValidDomain(''), false)
163 | t.equal(isValidDomain({}), false)
164 | t.equal(isValidDomain(function () {}), false)
165 | })
166 |
167 | test('invalid values', function (t) {
168 | t.plan(10)
169 | t.equal(isValidDomain('foo.example.com*'), false)
170 | t.equal(isValidDomain('foo.example.com*', { wildcard: true }), false)
171 | t.equal(isValidDomain('google.com"\'\"\""\\"\\\'test test'), false)
172 | t.equal(isValidDomain('google.com.au\'"\'\"\""\\"\\\'test'), false)
173 | t.equal(isValidDomain('...'), false)
174 | t.equal(isValidDomain('example..com'), false)
175 | t.equal(isValidDomain('.example.'), false)
176 | t.equal(isValidDomain('.example.com'), false)
177 | t.equal(isValidDomain('"example.com"'), false)
178 | t.equal(isValidDomain('http://xn--addas-o4a.de'), false)
179 | })
180 |
181 | test('thai domains', function (t) {
182 | t.plan(5)
183 | t.equal(isValidDomain('universal-acceptance-test.international'), true)
184 | t.equal(isValidDomain('universal-acceptance-test.icu'), true)
185 | t.equal(isValidDomain('ยูเอทดสอบ.ไทย'), true)
186 | t.equal(isValidDomain('ทีเอชนิค.องค์กร.ไทย'), true)
187 | t.equal(isValidDomain('เราไม่ทิ้งกัน.com'), true)
188 | })
189 |
--------------------------------------------------------------------------------
/data/second_level_domains.csv:
--------------------------------------------------------------------------------
1 | .ac,.com.ac
2 | .ac,.net.ac
3 | .ac,.gov.ac
4 | .ac,.org.ac
5 | .ac,.mil.ac
6 | .ae,.co.ae
7 | .ae,.net.ae
8 | .ae,.gov.ae
9 | .ae,.ac.ae
10 | .ae,.sch.ae
11 | .ae,.org.ae
12 | .ae,.mil.ae
13 | .ae,.pro.ae
14 | .ae,.name.ae
15 | .af,.com.af
16 | .af,.edu.af
17 | .af,.gov.af
18 | .af,.net.af
19 | .af,.org.af
20 | .al,.com.al
21 | .al,.edu.al
22 | .al,.gov.al
23 | .al,.mil.al
24 | .al,.net.al
25 | .al,.org.al
26 | .ao,.ed.ao
27 | .ao,.gv.ao
28 | .ao,.og.ao
29 | .ao,.co.ao
30 | .ao,.pb.ao
31 | .ao,.it.ao
32 | .ar,.com.ar
33 | .ar,.edu.ar
34 | .ar,.gob.ar
35 | .ar,.gov.ar
36 | .ar,.gov.ar
37 | .ar,.int.ar
38 | .ar,.mil.ar
39 | .ar,.net.ar
40 | .ar,.org.ar
41 | .ar,.tur.ar
42 | .at,.gv.at
43 | .at,.ac.at
44 | .at,.co.at
45 | .at,.or.at
46 | .au,.com.au
47 | .au,.net.au
48 | .au,.org.au
49 | .au,.edu.au
50 | .au,.gov.au
51 | .au,.csiro.au
52 | .au,.asn.au
53 | .au,.id.au
54 | .au,.vic.au
55 | .au,.sa.au
56 | .au,.wa.au
57 | .au,.nt.au
58 | .au,.tas.au
59 | .au,.qld.au
60 | .au,.act.au
61 | .au,.conf.au
62 | .au,.oz.au
63 | .ba,.org.ba
64 | .ba,.net.ba
65 | .ba,.edu.ba
66 | .ba,.gov.ba
67 | .ba,.mil.ba
68 | .ba,.unsa.ba
69 | .ba,.untz.ba
70 | .ba,.unmo.ba
71 | .ba,.unbi.ba
72 | .ba,.unze.ba
73 | .ba,.co.ba
74 | .ba,.com.ba
75 | .ba,.rs.ba
76 | .bb,.co.bb
77 | .bb,.com.bb
78 | .bb,.net.bb
79 | .bb,.org.bb
80 | .bb,.gov.bb
81 | .bb,.edu.bb
82 | .bb,.info.bb
83 | .bb,.store.bb
84 | .bb,.tv.bb
85 | .bb,.biz.bb
86 | .bh,.com.bh
87 | .bh,.info.bh
88 | .bh,.cc.bh
89 | .bh,.edu.bh
90 | .bh,.biz.bh
91 | .bh,.net.bh
92 | .bh,.org.bh
93 | .bh,.gov.bh
94 | .bn,.com.bn
95 | .bn,.edu.bn
96 | .bn,.gov.bn
97 | .bn,.net.bn
98 | .bn,.org.bn
99 | .bo,.com.bo
100 | .bo,.net.bo
101 | .bo,.org.bo
102 | .bo,.tv.bo
103 | .bo,.mil.bo
104 | .bo,.int.bo
105 | .bo,.gob.bo
106 | .bo,.gov.bo
107 | .bo,.edu.bo
108 | .br,.adm.br
109 | .br,.adv.br
110 | .br,.agr.br
111 | .br,.am.br
112 | .br,.arq.br
113 | .br,.art.br
114 | .br,.ato.br
115 | .br,.b.br
116 | .br,.bio.br
117 | .br,.blog.br
118 | .br,.bmd.br
119 | .br,.cim.br
120 | .br,.cng.br
121 | .br,.cnt.br
122 | .br,.com.br
123 | .br,.coop.br
124 | .br,.ecn.br
125 | .br,.edu.br
126 | .br,.eng.br
127 | .br,.esp.br
128 | .br,.etc.br
129 | .br,.eti.br
130 | .br,.far.br
131 | .br,.flog.br
132 | .br,.fm.br
133 | .br,.fnd.br
134 | .br,.fot.br
135 | .br,.fst.br
136 | .br,.g12.br
137 | .br,.ggf.br
138 | .br,.gov.br
139 | .br,.imb.br
140 | .br,.ind.br
141 | .br,.inf.br
142 | .br,.jor.br
143 | .br,.jus.br
144 | .br,.lel.br
145 | .br,.mat.br
146 | .br,.med.br
147 | .br,.mil.br
148 | .br,.mus.br
149 | .br,.net.br
150 | .br,.nom.br
151 | .br,.not.br
152 | .br,.ntr.br
153 | .br,.odo.br
154 | .br,.org.br
155 | .br,.ppg.br
156 | .br,.pro.br
157 | .br,.psc.br
158 | .br,.psi.br
159 | .br,.qsl.br
160 | .br,.rec.br
161 | .br,.slg.br
162 | .br,.srv.br
163 | .br,.tmp.br
164 | .br,.trd.br
165 | .br,.tur.br
166 | .br,.tv.br
167 | .br,.vet.br
168 | .br,.vlog.br
169 | .br,.wiki.br
170 | .br,.zlg.br
171 | .bs,.com.bs
172 | .bs,.net.bs
173 | .bs,.org.bs
174 | .bs,.edu.bs
175 | .bs,.gov.bs
176 | .bz,com.bz
177 | .bz,edu.bz
178 | .bz,gov.bz
179 | .bz,net.bz
180 | .bz,org.bz
181 | .ca,.ab.ca
182 | .ca,.bc.ca
183 | .ca,.mb.ca
184 | .ca,.nb.ca
185 | .ca,.nf.ca
186 | .ca,.nl.ca
187 | .ca,.ns.ca
188 | .ca,.nt.ca
189 | .ca,.nu.ca
190 | .ca,.on.ca
191 | .ca,.pe.ca
192 | .ca,.qc.ca
193 | .ca,.sk.ca
194 | .ca,.yk.ca
195 | .ck,.co.ck
196 | .ck,.org.ck
197 | .ck,.edu.ck
198 | .ck,.gov.ck
199 | .ck,.net.ck
200 | .ck,.gen.ck
201 | .ck,.biz.ck
202 | .ck,.info.ck
203 | .cn,.ac.cn
204 | .cn,.com.cn
205 | .cn,.edu.cn
206 | .cn,.gov.cn
207 | .cn,.mil.cn
208 | .cn,.net.cn
209 | .cn,.org.cn
210 | .cn,.ah.cn
211 | .cn,.bj.cn
212 | .cn,.cq.cn
213 | .cn,.fj.cn
214 | .cn,.gd.cn
215 | .cn,.gs.cn
216 | .cn,.gz.cn
217 | .cn,.gx.cn
218 | .cn,.ha.cn
219 | .cn,.hb.cn
220 | .cn,.he.cn
221 | .cn,.hi.cn
222 | .cn,.hl.cn
223 | .cn,.hn.cn
224 | .cn,.jl.cn
225 | .cn,.js.cn
226 | .cn,.jx.cn
227 | .cn,.ln.cn
228 | .cn,.nm.cn
229 | .cn,.nx.cn
230 | .cn,.qh.cn
231 | .cn,.sc.cn
232 | .cn,.sd.cn
233 | .cn,.sh.cn
234 | .cn,.sn.cn
235 | .cn,.sx.cn
236 | .cn,.tj.cn
237 | .cn,.tw.cn
238 | .cn,.xj.cn
239 | .cn,.xz.cn
240 | .cn,.yn.cn
241 | .cn,.zj.cn
242 | .co,.com.co
243 | .co,.org.co
244 | .co,.edu.co
245 | .co,.gov.co
246 | .co,.net.co
247 | .co,.mil.co
248 | .co,.nom.co
249 | .cr,.ac.cr
250 | .cr,.co.cr
251 | .cr,.ed.cr
252 | .cr,.fi.cr
253 | .cr,.go.cr
254 | .cr,.or.cr
255 | .cr,.sa.cr
256 | .cr,.cr
257 | .cy,.ac.cy
258 | .cy,.net.cy
259 | .cy,.gov.cy
260 | .cy,.org.cy
261 | .cy,.pro.cy
262 | .cy,.name.cy
263 | .cy,.ekloges.cy
264 | .cy,.tm.cy
265 | .cy,.ltd.cy
266 | .cy,.biz.cy
267 | .cy,.press.cy
268 | .cy,.parliament.cy
269 | .cy,.com.cy
270 | .do,.edu.do
271 | .do,.gob.do
272 | .do,.gov.do
273 | .do,.com.do
274 | .do,.sld.do
275 | .do,.org.do
276 | .do,.net.do
277 | .do,.web.do
278 | .do,.mil.do
279 | .do,.art.do
280 | .dz,.com.dz
281 | .dz,.org.dz
282 | .dz,.net.dz
283 | .dz,.gov.dz
284 | .dz,.edu.dz
285 | .dz,.asso.dz
286 | .dz,.pol.dz
287 | .dz,.art.dz
288 | .ec,.com.ec
289 | .ec,.info.ec
290 | .ec,.net.ec
291 | .ec,.fin.ec
292 | .ec,.med.ec
293 | .ec,.pro.ec
294 | .ec,.org.ec
295 | .ec,.edu.ec
296 | .ec,.gov.ec
297 | .ec,.mil.ec
298 | .eg,.com.eg
299 | .eg,.edu.eg
300 | .eg,.eun.eg
301 | .eg,.gov.eg
302 | .eg,.mil.eg
303 | .eg,.name.eg
304 | .eg,.net.eg
305 | .eg,.org.eg
306 | .eg,.sci.eg
307 | .er,.com.er
308 | .er,.edu.er
309 | .er,.gov.er
310 | .er,.mil.er
311 | .er,.net.er
312 | .er,.org.er
313 | .er,.ind.er
314 | .er,.rochest.er
315 | .er,.w.er
316 | .es,.com.es
317 | .es,.nom.es
318 | .es,.org.es
319 | .es,.gob.es
320 | .es,.edu.es
321 | .et,.com.et
322 | .et,.gov.et
323 | .et,.org.et
324 | .et,.edu.et
325 | .et,.net.et
326 | .et,.biz.et
327 | .et,.name.et
328 | .et,.info.et
329 | .fj,.ac.fj
330 | .fj,.biz.fj
331 | .fj,.com.fj
332 | .fj,.info.fj
333 | .fj,.mil.fj
334 | .fj,.name.fj
335 | .fj,.net.fj
336 | .fj,.org.fj
337 | .fj,.pro.fj
338 | .fk,.co.fk
339 | .fk,.org.fk
340 | .fk,.gov.fk
341 | .fk,.ac.fk
342 | .fk,.nom.fk
343 | .fk,.net.fk
344 | .fr,.fr
345 | .fr,.tm.fr
346 | .fr,.asso.fr
347 | .fr,.nom.fr
348 | .fr,.prd.fr
349 | .fr,.presse.fr
350 | .fr,.com.fr
351 | .fr,.gouv.fr
352 | .gg,.co.gg
353 | .gg,.net.gg
354 | .gg,.org.gg
355 | .gh,.com.gh
356 | .gh,.edu.gh
357 | .gh,.gov.gh
358 | .gh,.org.gh
359 | .gh,.mil.gh
360 | .gl,.co.gl
361 | .gl,.com.gl
362 | .gl,.edu.gl
363 | .gl,.net.gl
364 | .gl,.org.gl
365 | .gn,.com.gn
366 | .gn,.ac.gn
367 | .gn,.gov.gn
368 | .gn,.org.gn
369 | .gn,.net.gn
370 | .gr,.com.gr
371 | .gr,.edu.gr
372 | .gr,.net.gr
373 | .gr,.org.gr
374 | .gr,.gov.gr
375 | .gr,.mil.gr
376 | .gt,.com.gt
377 | .gt,.edu.gt
378 | .gt,.net.gt
379 | .gt,.gob.gt
380 | .gt,.org.gt
381 | .gt,.mil.gt
382 | .gt,.ind.gt
383 | .gu,.com.gu
384 | .gu,.net.gu
385 | .gu,.gov.gu
386 | .gu,.org.gu
387 | .gu,.edu.gu
388 | .hk,.com.hk
389 | .hk,.edu.hk
390 | .hk,.gov.hk
391 | .hk,.idv.hk
392 | .hk,.net.hk
393 | .hk,.org.hk
394 | .hu,.2000.hu
395 | .hu,.agrar.hu
396 | .hu,.bolt.hu
397 | .hu,.casino.hu
398 | .hu,.city.hu
399 | .hu,.co.hu
400 | .hu,.erotica.hu
401 | .hu,.erotika.hu
402 | .hu,.film.hu
403 | .hu,.forum.hu
404 | .hu,.games.hu
405 | .hu,.hotel.hu
406 | .hu,.info.hu
407 | .hu,.ingatlan.hu
408 | .hu,.jogasz.hu
409 | .hu,.konyvelo.hu
410 | .hu,.lakas.hu
411 | .hu,.media.hu
412 | .hu,.news.hu
413 | .hu,.org.hu
414 | .hu,.priv.hu
415 | .hu,.reklam.hu
416 | .hu,.sex.hu
417 | .hu,.shop.hu
418 | .hu,.sport.hu
419 | .hu,.suli.huv
420 | .hu,.szex.hu
421 | .hu,.tm.hu
422 | .hu,.tozsde.hu
423 | .hu,.utazas.hu
424 | .hu,.video.hu
425 | .id,.ac.id
426 | .id,.co.id
427 | .id,.net.id
428 | .id,.or.id
429 | .id,.web.id
430 | .id,.sch.id
431 | .id,.mil.id
432 | .id,.go.id
433 | .id,.war.net.id
434 | .id,.my.id
435 | .id,.biz.id
436 | .il,.ac.il
437 | .il,.co.il
438 | .il,.org.il
439 | .il,.net.il
440 | .il,.k12.il
441 | .il,.gov.il
442 | .il,.muni.il
443 | .il,.idf.il
444 | .in,.in
445 | .in,.4fd.in
446 | .in,.co.in
447 | .in,.firm.in
448 | .in,.net.in
449 | .in,.org.in
450 | .in,.gen.in
451 | .in,.ind.in
452 | .in,.ac.in
453 | .in,.edu.in
454 | .in,.res.in
455 | .in,.ernet.in
456 | .in,.gov.in
457 | .in,.mil.in
458 | .in,.nic.in
459 | .in,.nic.in
460 | .iq,.iq
461 | .iq,.gov.iq
462 | .iq,.edu.iq
463 | .iq,.com.iq
464 | .iq,.mil.iq
465 | .iq,.org.iq
466 | .iq,.net.iq
467 | .ir,.ir
468 | .ir,.ac.ir
469 | .ir,.co.ir
470 | .ir,.gov.ir
471 | .ir,.id.ir
472 | .ir,.net.ir
473 | .ir,.org.ir
474 | .ir,.sch.ir
475 | .ir,.dnssec.ir
476 | .it,.gov.it
477 | .it,.edu.it
478 | .je,.co.je
479 | .je,.net.je
480 | .je,.org.je
481 | .jo,.com.jo
482 | .jo,.net.jo
483 | .jo,.gov.jo
484 | .jo,.edu.jo
485 | .jo,.org.jo
486 | .jo,.mil.jo
487 | .jo,.name.jo
488 | .jo,.sch.jo
489 | .jp,.ac.jp
490 | .jp,.ad.jp
491 | .jp,.co.jp
492 | .jp,.ed.jp
493 | .jp,.go.jp
494 | .jp,.gr.jp
495 | .jp,.lg.jp
496 | .jp,.ne.jp
497 | .jp,.or.jp
498 | .ke,.co.ke
499 | .ke,.or.ke
500 | .ke,.ne.ke
501 | .ke,.go.ke
502 | .ke,.ac.ke
503 | .ke,.sc.ke
504 | .ke,.me.ke
505 | .ke,.mobi.ke
506 | .ke,.info.ke
507 | .kh,.per.kh
508 | .kh,.com.kh
509 | .kh,.edu.kh
510 | .kh,.gov.kh
511 | .kh,.mil.kh
512 | .kh,.net.kh
513 | .kh,.org.kh
514 | .ki,.com.ki
515 | .ki,.biz.ki
516 | .ki,.de.ki
517 | .ki,.net.ki
518 | .ki,.info.ki
519 | .ki,.org.ki
520 | .ki,.gov.ki
521 | .ki,.edu.ki
522 | .ki,.mob.ki
523 | .ki,.tel.ki
524 | .km,.km
525 | .km,.com.km
526 | .km,.coop.km
527 | .km,.asso.km
528 | .km,.nom.km
529 | .km,.presse.km
530 | .km,.tm.km
531 | .km,.medecin.km
532 | .km,.notaires.km
533 | .km,.pharmaciens.km
534 | .km,.veterinaire.km
535 | .km,.edu.km
536 | .km,.gouv.km
537 | .km,.mil.km
538 | .kn,.net.kn
539 | .kn,.org.kn
540 | .kn,.edu.kn
541 | .kn,.gov.kn
542 | .kr,.kr
543 | .kr,.co.kr
544 | .kr,.ne.kr
545 | .kr,.or.kr
546 | .kr,.re.kr
547 | .kr,.pe.kr
548 | .kr,.go.kr
549 | .kr,.mil.kr
550 | .kr,.ac.kr
551 | .kr,.hs.kr
552 | .kr,.ms.kr
553 | .kr,.es.kr
554 | .kr,.sc.kr
555 | .kr,.kg.kr
556 | .kr,.seoul.kr
557 | .kr,.busan.kr
558 | .kr,.daegu.kr
559 | .kr,.incheon.kr
560 | .kr,.gwangju.kr
561 | .kr,.daejeon.kr
562 | .kr,.ulsan.kr
563 | .kr,.gyeonggi.kr
564 | .kr,.gangwon.kr
565 | .kr,.chungbuk.kr
566 | .kr,.chungnam.kr
567 | .kr,.jeonbuk.kr
568 | .kr,.jeonnam.kr
569 | .kr,.gyeongbuk.kr
570 | .kr,.gyeongnam.kr
571 | .kr,.jeju.kr
572 | .kw,.edu.kw
573 | .kw,.com.kw
574 | .kw,.net.kw
575 | .kw,.org.kw
576 | .kw,.gov.kw
577 | .ky,.com.ky
578 | .ky,.org.ky
579 | .ky,.net.ky
580 | .ky,.edu.ky
581 | .ky,.gov.ky
582 | .kz,.com.kz
583 | .kz,.edu.kz
584 | .kz,.gov.kz
585 | .kz,.mil.kz
586 | .kz,.net.kz
587 | .kz,.org.kz
588 | .lb,.com.lb
589 | .lb,.edu.lb
590 | .lb,.gov.lb
591 | .lb,.net.lb
592 | .lb,.org.lb
593 | .lk,.gov.lk
594 | .lk,.sch.lk
595 | .lk,.net.lk
596 | .lk,.int.lk
597 | .lk,.com.lk
598 | .lk,.org.lk
599 | .lk,.edu.lk
600 | .lk,.ngo.lk
601 | .lk,.soc.lk
602 | .lk,.web.lk
603 | .lk,.ltd.lk
604 | .lk,.assn.lk
605 | .lk,.grp.lk
606 | .lk,.hotel.lk
607 | .lr,.com.lr
608 | .lr,.edu.lr
609 | .lr,.gov.lr
610 | .lr,.org.lr
611 | .lr,.net.lr
612 | .lv,.com.lv
613 | .lv,.edu.lv
614 | .lv,.gov.lv
615 | .lv,.org.lv
616 | .lv,.mil.lv
617 | .lv,.id.lv
618 | .lv,.net.lv
619 | .lv,.asn.lv
620 | .lv,.conf.lv
621 | .ly,.com.ly
622 | .ly,.net.ly
623 | .ly,.gov.ly
624 | .ly,.plc.ly
625 | .ly,.edu.ly
626 | .ly,.sch.ly
627 | .ly,.med.ly
628 | .ly,.org.ly
629 | .ly,.id.ly
630 | .ma,.ma
631 | .ma,.net.ma
632 | .ma,.ac.ma
633 | .ma,.org.ma
634 | .ma,.gov.ma
635 | .ma,.press.ma
636 | .ma,.co.ma
637 | .mc,.tm.mc
638 | .mc,.asso.mc
639 | .me,.co.me
640 | .me,.net.me
641 | .me,.org.me
642 | .me,.edu.me
643 | .me,.ac.me
644 | .me,.gov.me
645 | .me,.its.me
646 | .me,.priv.me
647 | .mg,.org.mg
648 | .mg,.nom.mg
649 | .mg,.gov.mg
650 | .mg,.prd.mg
651 | .mg,.tm.mg
652 | .mg,.edu.mg
653 | .mg,.mil.mg
654 | .mg,.com.mg
655 | .mk,.com.mk
656 | .mk,.org.mk
657 | .mk,.net.mk
658 | .mk,.edu.mk
659 | .mk,.gov.mk
660 | .mk,.inf.mk
661 | .mk,.name.mk
662 | .mk,.pro.mk
663 | .ml,.com.ml
664 | .ml,.net.ml
665 | .ml,.org.ml
666 | .ml,.edu.ml
667 | .ml,.gov.ml
668 | .ml,.presse.ml
669 | .mn,.gov.mn
670 | .mn,.edu.mn
671 | .mn,.org.mn
672 | .mo,.com.mo
673 | .mo,.edu.mo
674 | .mo,.gov.mo
675 | .mo,.net.mo
676 | .mo,.org.mo
677 | .mt,.com.mt
678 | .mt,.org.mt
679 | .mt,.net.mt
680 | .mt,.edu.mt
681 | .mt,.gov.mt
682 | .mv,.aero.mv
683 | .mv,.biz.mv
684 | .mv,.com.mv
685 | .mv,.coop.mv
686 | .mv,.edu.mv
687 | .mv,.gov.mv
688 | .mv,.info.mv
689 | .mv,.int.mv
690 | .mv,.mil.mv
691 | .mv,.museum.mv
692 | .mv,.name.mv
693 | .mv,.net.mv
694 | .mv,.org.mv
695 | .mv,.pro.mv
696 | .mw,.ac.mw
697 | .mw,.co.mw
698 | .mw,.com.mw
699 | .mw,.coop.mw
700 | .mw,.edu.mw
701 | .mw,.gov.mw
702 | .mw,.int.mw
703 | .mw,.museum.mw
704 | .mw,.net.mw
705 | .mw,.org.mw
706 | .mx,.com.mx
707 | .mx,.net.mx
708 | .mx,.org.mx
709 | .mx,.edu.mx
710 | .mx,.gob.mx
711 | .my,.com.my
712 | .my,.net.my
713 | .my,.org.my
714 | .my,.gov.my
715 | .my,.edu.my
716 | .my,.sch.my
717 | .my,.mil.my
718 | .my,.name.my
719 | .nf,.com.nf
720 | .nf,.net.nf
721 | .nf,.arts.nf
722 | .nf,.store.nf
723 | .nf,.web.nf
724 | .nf,.firm.nf
725 | .nf,.info.nf
726 | .nf,.other.nf
727 | .nf,.per.nf
728 | .nf,.rec.nf
729 | .ng,.com.ng
730 | .ng,.org.ng
731 | .ng,.gov.ng
732 | .ng,.edu.ng
733 | .ng,.net.ng
734 | .ng,.sch.ng
735 | .ng,.name.ng
736 | .ng,.mobi.ng
737 | .ng,.biz.ng
738 | .ng,.mil.ng
739 | .ni,.gob.ni
740 | .ni,.co.ni
741 | .ni,.com.ni
742 | .ni,.ac.ni
743 | .ni,.edu.ni
744 | .ni,.org.ni
745 | .ni,.nom.ni
746 | .ni,.net.ni
747 | .ni,.mil.ni
748 | .np,.com.np
749 | .np,.edu.np
750 | .np,.gov.np
751 | .np,.org.np
752 | .np,.mil.np
753 | .np,.net.np
754 | .nr,.edu.nr
755 | .nr,.gov.nr
756 | .nr,.biz.nr
757 | .nr,.info.nr
758 | .nr,.net.nr
759 | .nr,.org.nr
760 | .nr,.com.nr
761 | .om,.com.om
762 | .om,.co.om
763 | .om,.edu.om
764 | .om,.ac.om
765 | .om,.sch.om
766 | .om,.gov.om
767 | .om,.net.om
768 | .om,.org.om
769 | .om,.mil.om
770 | .om,.museum.om
771 | .om,.biz.om
772 | .om,.pro.om
773 | .om,.med.om
774 | .pe,.edu.pe
775 | .pe,.gob.pe
776 | .pe,.nom.pe
777 | .pe,.mil.pe
778 | .pe,.sld.pe
779 | .pe,.org.pe
780 | .pe,.com.pe
781 | .pe,.net.pe
782 | .ph,.com.ph
783 | .ph,.net.ph
784 | .ph,.org.ph
785 | .ph,.mil.ph
786 | .ph,.ngo.ph
787 | .ph,.i.ph
788 | .ph,.gov.ph
789 | .ph,.edu.ph
790 | .pk,.com.pk
791 | .pk,.net.pk
792 | .pk,.edu.pk
793 | .pk,.org.pk
794 | .pk,.fam.pk
795 | .pk,.biz.pk
796 | .pk,.web.pk
797 | .pk,.gov.pk
798 | .pk,.gob.pk
799 | .pk,.gok.pk
800 | .pk,.gon.pk
801 | .pk,.gop.pk
802 | .pk,.gos.pk
803 | .pl,.pwr.pl
804 | .pl,.com.pl
805 | .pl,.biz.pl
806 | .pl,.net.pl
807 | .pl,.art.pl
808 | .pl,.edu.pl
809 | .pl,.org.pl
810 | .pl,.ngo.pl
811 | .pl,.gov.pl
812 | .pl,.info.pl
813 | .pl,.mil.pl
814 | .pl,.waw.pl
815 | .pl,.warszawa.pl
816 | .pl,.wroc.pl
817 | .pl,.wroclaw.pl
818 | .pl,.krakow.pl
819 | .pl,.katowice.pl
820 | .pl,.poznan.pl
821 | .pl,.lodz.pl
822 | .pl,.gda.pl
823 | .pl,.gdansk.pl
824 | .pl,.slupsk.pl
825 | .pl,.radom.pl
826 | .pl,.szczecin.pl
827 | .pl,.lublin.pl
828 | .pl,.bialystok.pl
829 | .pl,.olsztyn.pl
830 | .pl,.torun.pl
831 | .pl,.gorzow.pl
832 | .pl,.zgora.pl
833 | .pr,.biz.pr
834 | .pr,.com.pr
835 | .pr,.edu.pr
836 | .pr,.gov.pr
837 | .pr,.info.pr
838 | .pr,.isla.pr
839 | .pr,.name.pr
840 | .pr,.net.pr
841 | .pr,.org.pr
842 | .pr,.pro.pr
843 | .pr,.est.pr
844 | .pr,.prof.pr
845 | .pr,.ac.pr
846 | .ps,.com.ps
847 | .ps,.net.ps
848 | .ps,.org.ps
849 | .ps,.edu.ps
850 | .ps,.gov.ps
851 | .ps,.plo.ps
852 | .ps,.sec.ps
853 | .pw,.co.pw
854 | .pw,.ne.pw
855 | .pw,.or.pw
856 | .pw,.ed.pw
857 | .pw,.go.pw
858 | .pw,.belau.pw
859 | .ro,.arts.ro
860 | .ro,.com.ro
861 | .ro,.firm.ro
862 | .ro,.info.ro
863 | .ro,.nom.ro
864 | .ro,.nt.ro
865 | .ro,.org.ro
866 | .ro,.rec.ro
867 | .ro,.store.ro
868 | .ro,.tm.ro
869 | .ro,.www.ro
870 | .rs,.co.rs
871 | .rs,.org.rs
872 | .rs,.edu.rs
873 | .rs,.ac.rs
874 | .rs,.gov.rs
875 | .rs,.in.rs
876 | .sb,.com.sb
877 | .sb,.net.sb
878 | .sb,.edu.sb
879 | .sb,.org.sb
880 | .sb,.gov.sb
881 | .sc,.com.sc
882 | .sc,.net.sc
883 | .sc,.edu.sc
884 | .sc,.gov.sc
885 | .sc,.org.sc
886 | .sh,.co.sh
887 | .sh,.com.sh
888 | .sh,.org.sh
889 | .sh,.gov.sh
890 | .sh,.edu.sh
891 | .sh,.net.sh
892 | .sh,.nom.sh
893 | .sl,.com.sl
894 | .sl,.net.sl
895 | .sl,.org.sl
896 | .sl,.edu.sl
897 | .sl,.gov.sl
898 | .st,.gov.st
899 | .st,.saotome.st
900 | .st,.principe.st
901 | .st,.consulado.st
902 | .st,.embaixada.st
903 | .st,.org.st
904 | .st,.edu.st
905 | .st,.net.st
906 | .st,.com.st
907 | .st,.store.st
908 | .st,.mil.st
909 | .st,.co.st
910 | .sv,.edu.sv
911 | .sv,.gob.sv
912 | .sv,.com.sv
913 | .sv,.org.sv
914 | .sv,.red.sv
915 | .sz,.co.sz
916 | .sz,.ac.sz
917 | .sz,.org.sz
918 | .tr,.com.tr
919 | .tr,.gen.tr
920 | .tr,.org.tr
921 | .tr,.biz.tr
922 | .tr,.info.tr
923 | .tr,.av.tr
924 | .tr,.dr.tr
925 | .tr,.pol.tr
926 | .tr,.bel.tr
927 | .tr,.tsk.tr
928 | .tr,.bbs.tr
929 | .tr,.k12.tr
930 | .tr,.edu.tr
931 | .tr,.name.tr
932 | .tr,.net.tr
933 | .tr,.gov.tr
934 | .tr,.web.tr
935 | .tr,.tel.tr
936 | .tr,.tv.tr
937 | .tt,.co.tt
938 | .tt,.com.tt
939 | .tt,.org.tt
940 | .tt,.net.tt
941 | .tt,.biz.tt
942 | .tt,.info.tt
943 | .tt,.pro.tt
944 | .tt,.int.tt
945 | .tt,.coop.tt
946 | .tt,.jobs.tt
947 | .tt,.mobi.tt
948 | .tt,.travel.tt
949 | .tt,.museum.tt
950 | .tt,.aero.tt
951 | .tt,.cat.tt
952 | .tt,.tel.tt
953 | .tt,.name.tt
954 | .tt,.mil.tt
955 | .tt,.edu.tt
956 | .tt,.gov.tt
957 | .tw,.edu.tw
958 | .tw,.gov.tw
959 | .tw,.mil.tw
960 | .tw,.com.tw
961 | .tw,.net.tw
962 | .tw,.org.tw
963 | .tw,.idv.tw
964 | .tw,.game.tw
965 | .tw,.ebiz.tw
966 | .tw,.club.tw
967 | .mu,.com.mu
968 | .mu,.gov.mu
969 | .mu,.net.mu
970 | .mu,.org.mu
971 | .mu,.ac.mu
972 | .mu,.co.mu
973 | .mu,.or.mu
974 | .mz,.ac.mz
975 | .mz,.co.mz
976 | .mz,.edu.mz
977 | .mz,.org.mz
978 | .mz,.gov.mz
979 | .na,.com.na
980 | .na,.co.na
981 | .nz,.ac.nz
982 | .nz,.co.nz
983 | .nz,.cri.nz
984 | .nz,.geek.nz
985 | .nz,.gen.nz
986 | .nz,.govt.nz
987 | .nz,.health.nz
988 | .nz,.iwi.nz
989 | .nz,.maori.nz
990 | .nz,.mil.nz
991 | .nz,.net.nz
992 | .nz,.org.nz
993 | .nz,.parliament.nz
994 | .nz,.school.nz
995 | .pa,.abo.pa
996 | .pa,.ac.pa
997 | .pa,.com.pa
998 | .pa,.edu.pa
999 | .pa,.gob.pa
1000 | .pa,.ing.pa
1001 | .pa,.med.pa
1002 | .pa,.net.pa
1003 | .pa,.nom.pa
1004 | .pa,.org.pa
1005 | .pa,.sld.pa
1006 | .pt,.com.pt
1007 | .pt,.edu.pt
1008 | .pt,.gov.pt
1009 | .pt,.int.pt
1010 | .pt,.net.pt
1011 | .pt,.nome.pt
1012 | .pt,.org.pt
1013 | .pt,.publ.pt
1014 | .py,.com.py
1015 | .py,.edu.py
1016 | .py,.gov.py
1017 | .py,.mil.py
1018 | .py,.net.py
1019 | .py,.org.py
1020 | .qa,.com.qa
1021 | .qa,.edu.qa
1022 | .qa,.gov.qa
1023 | .qa,.mil.qa
1024 | .qa,.net.qa
1025 | .qa,.org.qa
1026 | .re,.asso.re
1027 | .re,.com.re
1028 | .re,.nom.re
1029 | .ru,.ac.ru
1030 | .ru,.adygeya.ru
1031 | .ru,.altai.ru
1032 | .ru,.amur.ru
1033 | .ru,.arkhangelsk.ru
1034 | .ru,.astrakhan.ru
1035 | .ru,.bashkiria.ru
1036 | .ru,.belgorod.ru
1037 | .ru,.bir.ru
1038 | .ru,.bryansk.ru
1039 | .ru,.buryatia.ru
1040 | .ru,.cbg.ru
1041 | .ru,.chel.ru
1042 | .ru,.chelyabinsk.ru
1043 | .ru,.chita.ru
1044 | .ru,.chita.ru
1045 | .ru,.chukotka.ru
1046 | .ru,.chuvashia.ru
1047 | .ru,.com.ru
1048 | .ru,.dagestan.ru
1049 | .ru,.e-burg.ru
1050 | .ru,.edu.ru
1051 | .ru,.gov.ru
1052 | .ru,.grozny.ru
1053 | .ru,.int.ru
1054 | .ru,.irkutsk.ru
1055 | .ru,.ivanovo.ru
1056 | .ru,.izhevsk.ru
1057 | .ru,.jar.ru
1058 | .ru,.joshkar-ola.ru
1059 | .ru,.kalmykia.ru
1060 | .ru,.kaluga.ru
1061 | .ru,.kamchatka.ru
1062 | .ru,.karelia.ru
1063 | .ru,.kazan.ru
1064 | .ru,.kchr.ru
1065 | .ru,.kemerovo.ru
1066 | .ru,.khabarovsk.ru
1067 | .ru,.khakassia.ru
1068 | .ru,.khv.ru
1069 | .ru,.kirov.ru
1070 | .ru,.koenig.ru
1071 | .ru,.komi.ru
1072 | .ru,.kostroma.ru
1073 | .ru,.kranoyarsk.ru
1074 | .ru,.kuban.ru
1075 | .ru,.kurgan.ru
1076 | .ru,.kursk.ru
1077 | .ru,.lipetsk.ru
1078 | .ru,.magadan.ru
1079 | .ru,.mari.ru
1080 | .ru,.mari-el.ru
1081 | .ru,.marine.ru
1082 | .ru,.mil.ru
1083 | .ru,.mordovia.ru
1084 | .ru,.mosreg.ru
1085 | .ru,.msk.ru
1086 | .ru,.murmansk.ru
1087 | .ru,.nalchik.ru
1088 | .ru,.net.ru
1089 | .ru,.nnov.ru
1090 | .ru,.nov.ru
1091 | .ru,.novosibirsk.ru
1092 | .ru,.nsk.ru
1093 | .ru,.omsk.ru
1094 | .ru,.orenburg.ru
1095 | .ru,.org.ru
1096 | .ru,.oryol.ru
1097 | .ru,.penza.ru
1098 | .ru,.perm.ru
1099 | .ru,.pp.ru
1100 | .ru,.pskov.ru
1101 | .ru,.ptz.ru
1102 | .ru,.rnd.ru
1103 | .ru,.ryazan.ru
1104 | .ru,.sakhalin.ru
1105 | .ru,.samara.ru
1106 | .ru,.saratov.ru
1107 | .ru,.simbirsk.ru
1108 | .ru,.smolensk.ru
1109 | .ru,.spb.ru
1110 | .ru,.stavropol.ru
1111 | .ru,.stv.ru
1112 | .ru,.surgut.ru
1113 | .ru,.tambov.ru
1114 | .ru,.tatarstan.ru
1115 | .ru,.tom.ru
1116 | .ru,.tomsk.ru
1117 | .ru,.tsaritsyn.ru
1118 | .ru,.tsk.ru
1119 | .ru,.tula.ru
1120 | .ru,.tuva.ru
1121 | .ru,.tver.ru
1122 | .ru,.tyumen.ru
1123 | .ru,.udm.ru
1124 | .ru,.udmurtia.ru
1125 | .ru,.ulan-ude.ru
1126 | .ru,.vladikavkaz.ru
1127 | .ru,.vladimir.ru
1128 | .ru,.vladivostok.ru
1129 | .ru,.volgograd.ru
1130 | .ru,.vologda.ru
1131 | .ru,.voronezh.ru
1132 | .ru,.vrn.ru
1133 | .ru,.vyatka.ru
1134 | .ru,.yakutia.ru
1135 | .ru,.yamal.ru
1136 | .ru,.yekaterinburg.ru
1137 | .ru,.yuzhno-sakhalinsk.ru
1138 | .rw,.ac.rw
1139 | .rw,.co.rw
1140 | .rw,.com.rw
1141 | .rw,.edu.rw
1142 | .rw,.gouv.rw
1143 | .rw,.gov.rw
1144 | .rw,.int.rw
1145 | .rw,.mil.rw
1146 | .rw,.net.rw
1147 | .sa,.com.sa
1148 | .sa,.edu.sa
1149 | .sa,.gov.sa
1150 | .sa,.med.sa
1151 | .sa,.net.sa
1152 | .sa,.org.sa
1153 | .sa,.pub.sa
1154 | .sa,.sch.sa
1155 | .sd,.com.sd
1156 | .sd,.edu.sd
1157 | .sd,.gov.sd
1158 | .sd,.info.sd
1159 | .sd,.med.sd
1160 | .sd,.net.sd
1161 | .sd,.org.sd
1162 | .sd,.tv.sd
1163 | .se,.a.se
1164 | .se,.ac.se
1165 | .se,.b.se
1166 | .se,.bd.se
1167 | .se,.c.se
1168 | .se,.d.se
1169 | .se,.e.se
1170 | .se,.f.se
1171 | .se,.g.se
1172 | .se,.h.se
1173 | .se,.i.se
1174 | .se,.k.se
1175 | .se,.l.se
1176 | .se,.m.se
1177 | .se,.n.se
1178 | .se,.o.se
1179 | .se,.org.se
1180 | .se,.p.se
1181 | .se,.parti.se
1182 | .se,.pp.se
1183 | .se,.press.se
1184 | .se,.r.se
1185 | .se,.s.se
1186 | .se,.t.se
1187 | .se,.tm.se
1188 | .se,.u.se
1189 | .se,.w.se
1190 | .se,.x.se
1191 | .se,.y.se
1192 | .se,.z.se
1193 | .sg,.com.sg
1194 | .sg,.edu.sg
1195 | .sg,.gov.sg
1196 | .sg,.idn.sg
1197 | .sg,.net.sg
1198 | .sg,.org.sg
1199 | .sg,.per.sg
1200 | .sn,.art.sn
1201 | .sn,.com.sn
1202 | .sn,.edu.sn
1203 | .sn,.gouv.sn
1204 | .sn,.org.sn
1205 | .sn,.perso.sn
1206 | .sn,.univ.sn
1207 | .sy,.com.sy
1208 | .sy,.edu.sy
1209 | .sy,.gov.sy
1210 | .sy,.mil.sy
1211 | .sy,.net.sy
1212 | .sy,.news.sy
1213 | .sy,.org.sy
1214 | .th,.ac.th
1215 | .th,.co.th
1216 | .th,.go.th
1217 | .th,.in.th
1218 | .th,.mi.th
1219 | .th,.net.th
1220 | .th,.or.th
1221 | .tj,.ac.tj
1222 | .tj,.biz.tj
1223 | .tj,.co.tj
1224 | .tj,.com.tj
1225 | .tj,.edu.tj
1226 | .tj,.go.tj
1227 | .tj,.gov.tj
1228 | .tj,.info.tj
1229 | .tj,.int.tj
1230 | .tj,.mil.tj
1231 | .tj,.name.tj
1232 | .tj,.net.tj
1233 | .tj,.nic.tj
1234 | .tj,.org.tj
1235 | .tj,.test.tj
1236 | .tj,.web.tj
1237 | .tn,.agrinet.tn
1238 | .tn,.com.tn
1239 | .tn,.defense.tn
1240 | .tn,.edunet.tn
1241 | .tn,.ens.tn
1242 | .tn,.fin.tn
1243 | .tn,.gov.tn
1244 | .tn,.ind.tn
1245 | .tn,.info.tn
1246 | .tn,.intl.tn
1247 | .tn,.mincom.tn
1248 | .tn,.nat.tn
1249 | .tn,.net.tn
1250 | .tn,.org.tn
1251 | .tn,.perso.tn
1252 | .tn,.rnrt.tn
1253 | .tn,.rns.tn
1254 | .tn,.rnu.tn
1255 | .tn,.tourism.tn
1256 | .tz,.ac.tz
1257 | .tz,.co.tz
1258 | .tz,.go.tz
1259 | .tz,.ne.tz
1260 | .tz,.or.tz
1261 | .ua,.biz.ua
1262 | .ua,.cherkassy.ua
1263 | .ua,.chernigov.ua
1264 | .ua,.chernovtsy.ua
1265 | .ua,.ck.ua
1266 | .ua,.cn.ua
1267 | .ua,.co.ua
1268 | .ua,.com.ua
1269 | .ua,.crimea.ua
1270 | .ua,.cv.ua
1271 | .ua,.dn.ua
1272 | .ua,.dnepropetrovsk.ua
1273 | .ua,.donetsk.ua
1274 | .ua,.dp.ua
1275 | .ua,.edu.ua
1276 | .ua,.gov.ua
1277 | .ua,.if.ua
1278 | .ua,.in.ua
1279 | .ua,.ivano-frankivsk.ua
1280 | .ua,.kh.ua
1281 | .ua,.kharkov.ua
1282 | .ua,.kherson.ua
1283 | .ua,.khmelnitskiy.ua
1284 | .ua,.kiev.ua
1285 | .ua,.kirovograd.ua
1286 | .ua,.km.ua
1287 | .ua,.kr.ua
1288 | .ua,.ks.ua
1289 | .ua,.kv.ua
1290 | .ua,.lg.ua
1291 | .ua,.lugansk.ua
1292 | .ua,.lutsk.ua
1293 | .ua,.lviv.ua
1294 | .ua,.me.ua
1295 | .ua,.mk.ua
1296 | .ua,.net.ua
1297 | .ua,.nikolaev.ua
1298 | .ua,.od.ua
1299 | .ua,.odessa.ua
1300 | .ua,.org.ua
1301 | .ua,.pl.ua
1302 | .ua,.poltava.ua
1303 | .ua,.pp.ua
1304 | .ua,.rovno.ua
1305 | .ua,.rv.ua
1306 | .ua,.sebastopol.ua
1307 | .ua,.sumy.ua
1308 | .ua,.te.ua
1309 | .ua,.ternopil.ua
1310 | .ua,.uzhgorod.ua
1311 | .ua,.vinnica.ua
1312 | .ua,.vn.ua
1313 | .ua,.zaporizhzhe.ua
1314 | .ua,.zhitomir.ua
1315 | .ua,.zp.ua
1316 | .ua,.zt.ua
1317 | .ug,.ac.ug
1318 | .ug,.co.ug
1319 | .ug,.go.ug
1320 | .ug,.ne.ug
1321 | .ug,.or.ug
1322 | .ug,.org.ug
1323 | .ug,.sc.ug
1324 | .uk,.ac.uk
1325 | .uk,.bl.uk
1326 | .uk,.british-library.uk
1327 | .uk,.co.uk
1328 | .uk,.cym.uk
1329 | .uk,.gov.uk
1330 | .uk,.govt.uk
1331 | .uk,.icnet.uk
1332 | .uk,.jet.uk
1333 | .uk,.lea.uk
1334 | .uk,.ltd.uk
1335 | .uk,.me.uk
1336 | .uk,.mil.uk
1337 | .uk,.mod.uk
1338 | .uk,.mod.uk
1339 | .uk,.national-library-scotland.uk
1340 | .uk,.nel.uk
1341 | .uk,.net.uk
1342 | .uk,.nhs.uk
1343 | .uk,.nhs.uk
1344 | .uk,.nic.uk
1345 | .uk,.nls.uk
1346 | .uk,.org.uk
1347 | .uk,.orgn.uk
1348 | .uk,.parliament.uk
1349 | .uk,.parliament.uk
1350 | .uk,.plc.uk
1351 | .uk,.police.uk
1352 | .uk,.sch.uk
1353 | .uk,.scot.uk
1354 | .uk,.soc.uk
1355 | .us,.4fd.us
1356 | .us,.dni.us
1357 | .us,.fed.us
1358 | .us,.isa.us
1359 | .us,.kids.us
1360 | .us,.nsn.us
1361 | .uy,.com.uy
1362 | .uy,.edu.uy
1363 | .uy,.gub.uy
1364 | .uy,.mil.uy
1365 | .uy,.net.uy
1366 | .uy,.org.uy
1367 | .ve,.co.ve
1368 | .ve,.com.ve
1369 | .ve,.edu.ve
1370 | .ve,.gob.ve
1371 | .ve,.info.ve
1372 | .ve,.mil.ve
1373 | .ve,.net.ve
1374 | .ve,.org.ve
1375 | .ve,.web.ve
1376 | .vi,.co.vi
1377 | .vi,.com.vi
1378 | .vi,.k12.vi
1379 | .vi,.net.vi
1380 | .vi,.org.vi
1381 | .vn,.ac.vn
1382 | .vn,.biz.vn
1383 | .vn,.com.vn
1384 | .vn,.edu.vn
1385 | .vn,.gov.vn
1386 | .vn,.health.vn
1387 | .vn,.info.vn
1388 | .vn,.int.vn
1389 | .vn,.name.vn
1390 | .vn,.net.vn
1391 | .vn,.org.vn
1392 | .vn,.pro.vn
1393 | .ye,.co.ye
1394 | .ye,.com.ye
1395 | .ye,.gov.ye
1396 | .ye,.ltd.ye
1397 | .ye,.me.ye
1398 | .ye,.net.ye
1399 | .ye,.org.ye
1400 | .ye,.plc.ye
1401 | .yu,.ac.yu
1402 | .yu,.co.yu
1403 | .yu,.edu.yu
1404 | .yu,.gov.yu
1405 | .yu,.org.yu
1406 | .za,.ac.za
1407 | .za,.agric.za
1408 | .za,.alt.za
1409 | .za,.bourse.za
1410 | .za,.city.za
1411 | .za,.co.za
1412 | .za,.cybernet.za
1413 | .za,.db.za
1414 | .za,.ecape.school.za
1415 | .za,.edu.za
1416 | .za,.fs.school.za
1417 | .za,.gov.za
1418 | .za,.gp.school.za
1419 | .za,.grondar.za
1420 | .za,.iaccess.za
1421 | .za,.imt.za
1422 | .za,.inca.za
1423 | .za,.kzn.school.za
1424 | .za,.landesign.za
1425 | .za,.law.za
1426 | .za,.lp.school.za
1427 | .za,.mil.za
1428 | .za,.mpm.school.za
1429 | .za,.ncape.school.za
1430 | .za,.net.za
1431 | .za,.ngo.za
1432 | .za,.nis.za
1433 | .za,.nom.za
1434 | .za,.nw.school.za
1435 | .za,.olivetti.za
1436 | .za,.org.za
1437 | .za,.pix.za
1438 | .za,.school.za
1439 | .za,.tm.za
1440 | .za,.wcape.school.za
1441 | .za,.web.za
1442 | .zm,.ac.zm
1443 | .zm,.co.zm
1444 | .zm,.com.zm
1445 | .zm,.edu.zm
1446 | .zm,.gov.zm
1447 | .zm,.net.zm
1448 | .zm,.org.zm
1449 | .zm,.sch.zm
1450 |
--------------------------------------------------------------------------------
/data/sldMap.json:
--------------------------------------------------------------------------------
1 | {
2 | "com.ac": true,
3 | "net.ac": true,
4 | "gov.ac": true,
5 | "org.ac": true,
6 | "mil.ac": true,
7 | "co.ae": true,
8 | "net.ae": true,
9 | "gov.ae": true,
10 | "ac.ae": true,
11 | "sch.ae": true,
12 | "org.ae": true,
13 | "mil.ae": true,
14 | "pro.ae": true,
15 | "name.ae": true,
16 | "com.af": true,
17 | "edu.af": true,
18 | "gov.af": true,
19 | "net.af": true,
20 | "org.af": true,
21 | "com.al": true,
22 | "edu.al": true,
23 | "gov.al": true,
24 | "mil.al": true,
25 | "net.al": true,
26 | "org.al": true,
27 | "ed.ao": true,
28 | "gv.ao": true,
29 | "og.ao": true,
30 | "co.ao": true,
31 | "pb.ao": true,
32 | "it.ao": true,
33 | "com.ar": true,
34 | "edu.ar": true,
35 | "gob.ar": true,
36 | "gov.ar": true,
37 | "int.ar": true,
38 | "mil.ar": true,
39 | "net.ar": true,
40 | "org.ar": true,
41 | "tur.ar": true,
42 | "gv.at": true,
43 | "ac.at": true,
44 | "co.at": true,
45 | "or.at": true,
46 | "com.au": true,
47 | "net.au": true,
48 | "org.au": true,
49 | "edu.au": true,
50 | "gov.au": true,
51 | "csiro.au": true,
52 | "asn.au": true,
53 | "id.au": true,
54 | "vic.au": true,
55 | "sa.au": true,
56 | "wa.au": true,
57 | "nt.au": true,
58 | "tas.au": true,
59 | "qld.au": true,
60 | "act.au": true,
61 | "conf.au": true,
62 | "oz.au": true,
63 | "org.ba": true,
64 | "net.ba": true,
65 | "edu.ba": true,
66 | "gov.ba": true,
67 | "mil.ba": true,
68 | "unsa.ba": true,
69 | "untz.ba": true,
70 | "unmo.ba": true,
71 | "unbi.ba": true,
72 | "unze.ba": true,
73 | "co.ba": true,
74 | "com.ba": true,
75 | "rs.ba": true,
76 | "co.bb": true,
77 | "com.bb": true,
78 | "net.bb": true,
79 | "org.bb": true,
80 | "gov.bb": true,
81 | "edu.bb": true,
82 | "info.bb": true,
83 | "store.bb": true,
84 | "tv.bb": true,
85 | "biz.bb": true,
86 | "com.bh": true,
87 | "info.bh": true,
88 | "cc.bh": true,
89 | "edu.bh": true,
90 | "biz.bh": true,
91 | "net.bh": true,
92 | "org.bh": true,
93 | "gov.bh": true,
94 | "com.bn": true,
95 | "edu.bn": true,
96 | "gov.bn": true,
97 | "net.bn": true,
98 | "org.bn": true,
99 | "com.bo": true,
100 | "net.bo": true,
101 | "org.bo": true,
102 | "tv.bo": true,
103 | "mil.bo": true,
104 | "int.bo": true,
105 | "gob.bo": true,
106 | "gov.bo": true,
107 | "edu.bo": true,
108 | "adm.br": true,
109 | "adv.br": true,
110 | "agr.br": true,
111 | "am.br": true,
112 | "arq.br": true,
113 | "art.br": true,
114 | "ato.br": true,
115 | "b.br": true,
116 | "bio.br": true,
117 | "blog.br": true,
118 | "bmd.br": true,
119 | "cim.br": true,
120 | "cng.br": true,
121 | "cnt.br": true,
122 | "com.br": true,
123 | "coop.br": true,
124 | "ecn.br": true,
125 | "edu.br": true,
126 | "eng.br": true,
127 | "esp.br": true,
128 | "etc.br": true,
129 | "eti.br": true,
130 | "far.br": true,
131 | "flog.br": true,
132 | "fm.br": true,
133 | "fnd.br": true,
134 | "fot.br": true,
135 | "fst.br": true,
136 | "g12.br": true,
137 | "ggf.br": true,
138 | "gov.br": true,
139 | "imb.br": true,
140 | "ind.br": true,
141 | "inf.br": true,
142 | "jor.br": true,
143 | "jus.br": true,
144 | "lel.br": true,
145 | "mat.br": true,
146 | "med.br": true,
147 | "mil.br": true,
148 | "mus.br": true,
149 | "net.br": true,
150 | "nom.br": true,
151 | "not.br": true,
152 | "ntr.br": true,
153 | "odo.br": true,
154 | "org.br": true,
155 | "ppg.br": true,
156 | "pro.br": true,
157 | "psc.br": true,
158 | "psi.br": true,
159 | "qsl.br": true,
160 | "rec.br": true,
161 | "slg.br": true,
162 | "srv.br": true,
163 | "tmp.br": true,
164 | "trd.br": true,
165 | "tur.br": true,
166 | "tv.br": true,
167 | "vet.br": true,
168 | "vlog.br": true,
169 | "wiki.br": true,
170 | "zlg.br": true,
171 | "com.bs": true,
172 | "net.bs": true,
173 | "org.bs": true,
174 | "edu.bs": true,
175 | "gov.bs": true,
176 | "om.bz": true,
177 | "du.bz": true,
178 | "ov.bz": true,
179 | "et.bz": true,
180 | "rg.bz": true,
181 | "ab.ca": true,
182 | "bc.ca": true,
183 | "mb.ca": true,
184 | "nb.ca": true,
185 | "nf.ca": true,
186 | "nl.ca": true,
187 | "ns.ca": true,
188 | "nt.ca": true,
189 | "nu.ca": true,
190 | "on.ca": true,
191 | "pe.ca": true,
192 | "qc.ca": true,
193 | "sk.ca": true,
194 | "yk.ca": true,
195 | "co.ck": true,
196 | "org.ck": true,
197 | "edu.ck": true,
198 | "gov.ck": true,
199 | "net.ck": true,
200 | "gen.ck": true,
201 | "biz.ck": true,
202 | "info.ck": true,
203 | "ac.cn": true,
204 | "com.cn": true,
205 | "edu.cn": true,
206 | "gov.cn": true,
207 | "mil.cn": true,
208 | "net.cn": true,
209 | "org.cn": true,
210 | "ah.cn": true,
211 | "bj.cn": true,
212 | "cq.cn": true,
213 | "fj.cn": true,
214 | "gd.cn": true,
215 | "gs.cn": true,
216 | "gz.cn": true,
217 | "gx.cn": true,
218 | "ha.cn": true,
219 | "hb.cn": true,
220 | "he.cn": true,
221 | "hi.cn": true,
222 | "hl.cn": true,
223 | "hn.cn": true,
224 | "jl.cn": true,
225 | "js.cn": true,
226 | "jx.cn": true,
227 | "ln.cn": true,
228 | "nm.cn": true,
229 | "nx.cn": true,
230 | "qh.cn": true,
231 | "sc.cn": true,
232 | "sd.cn": true,
233 | "sh.cn": true,
234 | "sn.cn": true,
235 | "sx.cn": true,
236 | "tj.cn": true,
237 | "tw.cn": true,
238 | "xj.cn": true,
239 | "xz.cn": true,
240 | "yn.cn": true,
241 | "zj.cn": true,
242 | "com.co": true,
243 | "org.co": true,
244 | "edu.co": true,
245 | "gov.co": true,
246 | "net.co": true,
247 | "mil.co": true,
248 | "nom.co": true,
249 | "ac.cr": true,
250 | "co.cr": true,
251 | "ed.cr": true,
252 | "fi.cr": true,
253 | "go.cr": true,
254 | "or.cr": true,
255 | "sa.cr": true,
256 | "cr": true,
257 | "ac.cy": true,
258 | "net.cy": true,
259 | "gov.cy": true,
260 | "org.cy": true,
261 | "pro.cy": true,
262 | "name.cy": true,
263 | "ekloges.cy": true,
264 | "tm.cy": true,
265 | "ltd.cy": true,
266 | "biz.cy": true,
267 | "press.cy": true,
268 | "parliament.cy": true,
269 | "com.cy": true,
270 | "edu.do": true,
271 | "gob.do": true,
272 | "gov.do": true,
273 | "com.do": true,
274 | "sld.do": true,
275 | "org.do": true,
276 | "net.do": true,
277 | "web.do": true,
278 | "mil.do": true,
279 | "art.do": true,
280 | "com.dz": true,
281 | "org.dz": true,
282 | "net.dz": true,
283 | "gov.dz": true,
284 | "edu.dz": true,
285 | "asso.dz": true,
286 | "pol.dz": true,
287 | "art.dz": true,
288 | "com.ec": true,
289 | "info.ec": true,
290 | "net.ec": true,
291 | "fin.ec": true,
292 | "med.ec": true,
293 | "pro.ec": true,
294 | "org.ec": true,
295 | "edu.ec": true,
296 | "gov.ec": true,
297 | "mil.ec": true,
298 | "com.eg": true,
299 | "edu.eg": true,
300 | "eun.eg": true,
301 | "gov.eg": true,
302 | "mil.eg": true,
303 | "name.eg": true,
304 | "net.eg": true,
305 | "org.eg": true,
306 | "sci.eg": true,
307 | "com.er": true,
308 | "edu.er": true,
309 | "gov.er": true,
310 | "mil.er": true,
311 | "net.er": true,
312 | "org.er": true,
313 | "ind.er": true,
314 | "rochest.er": true,
315 | "w.er": true,
316 | "com.es": true,
317 | "nom.es": true,
318 | "org.es": true,
319 | "gob.es": true,
320 | "edu.es": true,
321 | "com.et": true,
322 | "gov.et": true,
323 | "org.et": true,
324 | "edu.et": true,
325 | "net.et": true,
326 | "biz.et": true,
327 | "name.et": true,
328 | "info.et": true,
329 | "ac.fj": true,
330 | "biz.fj": true,
331 | "com.fj": true,
332 | "info.fj": true,
333 | "mil.fj": true,
334 | "name.fj": true,
335 | "net.fj": true,
336 | "org.fj": true,
337 | "pro.fj": true,
338 | "co.fk": true,
339 | "org.fk": true,
340 | "gov.fk": true,
341 | "ac.fk": true,
342 | "nom.fk": true,
343 | "net.fk": true,
344 | "fr": true,
345 | "tm.fr": true,
346 | "asso.fr": true,
347 | "nom.fr": true,
348 | "prd.fr": true,
349 | "presse.fr": true,
350 | "com.fr": true,
351 | "gouv.fr": true,
352 | "co.gg": true,
353 | "net.gg": true,
354 | "org.gg": true,
355 | "com.gh": true,
356 | "edu.gh": true,
357 | "gov.gh": true,
358 | "org.gh": true,
359 | "mil.gh": true,
360 | "co.gl": true,
361 | "com.gl": true,
362 | "edu.gl": true,
363 | "net.gl": true,
364 | "org.gl": true,
365 | "com.gn": true,
366 | "ac.gn": true,
367 | "gov.gn": true,
368 | "org.gn": true,
369 | "net.gn": true,
370 | "com.gr": true,
371 | "edu.gr": true,
372 | "net.gr": true,
373 | "org.gr": true,
374 | "gov.gr": true,
375 | "mil.gr": true,
376 | "com.gt": true,
377 | "edu.gt": true,
378 | "net.gt": true,
379 | "gob.gt": true,
380 | "org.gt": true,
381 | "mil.gt": true,
382 | "ind.gt": true,
383 | "com.gu": true,
384 | "net.gu": true,
385 | "gov.gu": true,
386 | "org.gu": true,
387 | "edu.gu": true,
388 | "com.hk": true,
389 | "edu.hk": true,
390 | "gov.hk": true,
391 | "idv.hk": true,
392 | "net.hk": true,
393 | "org.hk": true,
394 | "2000.hu": true,
395 | "agrar.hu": true,
396 | "bolt.hu": true,
397 | "casino.hu": true,
398 | "city.hu": true,
399 | "co.hu": true,
400 | "erotica.hu": true,
401 | "erotika.hu": true,
402 | "film.hu": true,
403 | "forum.hu": true,
404 | "games.hu": true,
405 | "hotel.hu": true,
406 | "info.hu": true,
407 | "ingatlan.hu": true,
408 | "jogasz.hu": true,
409 | "konyvelo.hu": true,
410 | "lakas.hu": true,
411 | "media.hu": true,
412 | "news.hu": true,
413 | "org.hu": true,
414 | "priv.hu": true,
415 | "reklam.hu": true,
416 | "sex.hu": true,
417 | "shop.hu": true,
418 | "sport.hu": true,
419 | "suli.huv": true,
420 | "szex.hu": true,
421 | "tm.hu": true,
422 | "tozsde.hu": true,
423 | "utazas.hu": true,
424 | "video.hu": true,
425 | "ac.id": true,
426 | "co.id": true,
427 | "net.id": true,
428 | "or.id": true,
429 | "web.id": true,
430 | "sch.id": true,
431 | "mil.id": true,
432 | "go.id": true,
433 | "war.net.id": true,
434 | "my.id": true,
435 | "biz.id": true,
436 | "ac.il": true,
437 | "co.il": true,
438 | "org.il": true,
439 | "net.il": true,
440 | "k12.il": true,
441 | "gov.il": true,
442 | "muni.il": true,
443 | "idf.il": true,
444 | "in": true,
445 | "4fd.in": true,
446 | "co.in": true,
447 | "firm.in": true,
448 | "net.in": true,
449 | "org.in": true,
450 | "gen.in": true,
451 | "ind.in": true,
452 | "ac.in": true,
453 | "edu.in": true,
454 | "res.in": true,
455 | "ernet.in": true,
456 | "gov.in": true,
457 | "mil.in": true,
458 | "nic.in": true,
459 | "iq": true,
460 | "gov.iq": true,
461 | "edu.iq": true,
462 | "com.iq": true,
463 | "mil.iq": true,
464 | "org.iq": true,
465 | "net.iq": true,
466 | "ir": true,
467 | "ac.ir": true,
468 | "co.ir": true,
469 | "gov.ir": true,
470 | "id.ir": true,
471 | "net.ir": true,
472 | "org.ir": true,
473 | "sch.ir": true,
474 | "dnssec.ir": true,
475 | "gov.it": true,
476 | "edu.it": true,
477 | "co.je": true,
478 | "net.je": true,
479 | "org.je": true,
480 | "com.jo": true,
481 | "net.jo": true,
482 | "gov.jo": true,
483 | "edu.jo": true,
484 | "org.jo": true,
485 | "mil.jo": true,
486 | "name.jo": true,
487 | "sch.jo": true,
488 | "ac.jp": true,
489 | "ad.jp": true,
490 | "co.jp": true,
491 | "ed.jp": true,
492 | "go.jp": true,
493 | "gr.jp": true,
494 | "lg.jp": true,
495 | "ne.jp": true,
496 | "or.jp": true,
497 | "co.ke": true,
498 | "or.ke": true,
499 | "ne.ke": true,
500 | "go.ke": true,
501 | "ac.ke": true,
502 | "sc.ke": true,
503 | "me.ke": true,
504 | "mobi.ke": true,
505 | "info.ke": true,
506 | "per.kh": true,
507 | "com.kh": true,
508 | "edu.kh": true,
509 | "gov.kh": true,
510 | "mil.kh": true,
511 | "net.kh": true,
512 | "org.kh": true,
513 | "com.ki": true,
514 | "biz.ki": true,
515 | "de.ki": true,
516 | "net.ki": true,
517 | "info.ki": true,
518 | "org.ki": true,
519 | "gov.ki": true,
520 | "edu.ki": true,
521 | "mob.ki": true,
522 | "tel.ki": true,
523 | "km": true,
524 | "com.km": true,
525 | "coop.km": true,
526 | "asso.km": true,
527 | "nom.km": true,
528 | "presse.km": true,
529 | "tm.km": true,
530 | "medecin.km": true,
531 | "notaires.km": true,
532 | "pharmaciens.km": true,
533 | "veterinaire.km": true,
534 | "edu.km": true,
535 | "gouv.km": true,
536 | "mil.km": true,
537 | "net.kn": true,
538 | "org.kn": true,
539 | "edu.kn": true,
540 | "gov.kn": true,
541 | "kr": true,
542 | "co.kr": true,
543 | "ne.kr": true,
544 | "or.kr": true,
545 | "re.kr": true,
546 | "pe.kr": true,
547 | "go.kr": true,
548 | "mil.kr": true,
549 | "ac.kr": true,
550 | "hs.kr": true,
551 | "ms.kr": true,
552 | "es.kr": true,
553 | "sc.kr": true,
554 | "kg.kr": true,
555 | "seoul.kr": true,
556 | "busan.kr": true,
557 | "daegu.kr": true,
558 | "incheon.kr": true,
559 | "gwangju.kr": true,
560 | "daejeon.kr": true,
561 | "ulsan.kr": true,
562 | "gyeonggi.kr": true,
563 | "gangwon.kr": true,
564 | "chungbuk.kr": true,
565 | "chungnam.kr": true,
566 | "jeonbuk.kr": true,
567 | "jeonnam.kr": true,
568 | "gyeongbuk.kr": true,
569 | "gyeongnam.kr": true,
570 | "jeju.kr": true,
571 | "edu.kw": true,
572 | "com.kw": true,
573 | "net.kw": true,
574 | "org.kw": true,
575 | "gov.kw": true,
576 | "com.ky": true,
577 | "org.ky": true,
578 | "net.ky": true,
579 | "edu.ky": true,
580 | "gov.ky": true,
581 | "com.kz": true,
582 | "edu.kz": true,
583 | "gov.kz": true,
584 | "mil.kz": true,
585 | "net.kz": true,
586 | "org.kz": true,
587 | "com.lb": true,
588 | "edu.lb": true,
589 | "gov.lb": true,
590 | "net.lb": true,
591 | "org.lb": true,
592 | "gov.lk": true,
593 | "sch.lk": true,
594 | "net.lk": true,
595 | "int.lk": true,
596 | "com.lk": true,
597 | "org.lk": true,
598 | "edu.lk": true,
599 | "ngo.lk": true,
600 | "soc.lk": true,
601 | "web.lk": true,
602 | "ltd.lk": true,
603 | "assn.lk": true,
604 | "grp.lk": true,
605 | "hotel.lk": true,
606 | "com.lr": true,
607 | "edu.lr": true,
608 | "gov.lr": true,
609 | "org.lr": true,
610 | "net.lr": true,
611 | "com.lv": true,
612 | "edu.lv": true,
613 | "gov.lv": true,
614 | "org.lv": true,
615 | "mil.lv": true,
616 | "id.lv": true,
617 | "net.lv": true,
618 | "asn.lv": true,
619 | "conf.lv": true,
620 | "com.ly": true,
621 | "net.ly": true,
622 | "gov.ly": true,
623 | "plc.ly": true,
624 | "edu.ly": true,
625 | "sch.ly": true,
626 | "med.ly": true,
627 | "org.ly": true,
628 | "id.ly": true,
629 | "ma": true,
630 | "net.ma": true,
631 | "ac.ma": true,
632 | "org.ma": true,
633 | "gov.ma": true,
634 | "press.ma": true,
635 | "co.ma": true,
636 | "tm.mc": true,
637 | "asso.mc": true,
638 | "co.me": true,
639 | "net.me": true,
640 | "org.me": true,
641 | "edu.me": true,
642 | "ac.me": true,
643 | "gov.me": true,
644 | "its.me": true,
645 | "priv.me": true,
646 | "org.mg": true,
647 | "nom.mg": true,
648 | "gov.mg": true,
649 | "prd.mg": true,
650 | "tm.mg": true,
651 | "edu.mg": true,
652 | "mil.mg": true,
653 | "com.mg": true,
654 | "com.mk": true,
655 | "org.mk": true,
656 | "net.mk": true,
657 | "edu.mk": true,
658 | "gov.mk": true,
659 | "inf.mk": true,
660 | "name.mk": true,
661 | "pro.mk": true,
662 | "com.ml": true,
663 | "net.ml": true,
664 | "org.ml": true,
665 | "edu.ml": true,
666 | "gov.ml": true,
667 | "presse.ml": true,
668 | "gov.mn": true,
669 | "edu.mn": true,
670 | "org.mn": true,
671 | "com.mo": true,
672 | "edu.mo": true,
673 | "gov.mo": true,
674 | "net.mo": true,
675 | "org.mo": true,
676 | "com.mt": true,
677 | "org.mt": true,
678 | "net.mt": true,
679 | "edu.mt": true,
680 | "gov.mt": true,
681 | "aero.mv": true,
682 | "biz.mv": true,
683 | "com.mv": true,
684 | "coop.mv": true,
685 | "edu.mv": true,
686 | "gov.mv": true,
687 | "info.mv": true,
688 | "int.mv": true,
689 | "mil.mv": true,
690 | "museum.mv": true,
691 | "name.mv": true,
692 | "net.mv": true,
693 | "org.mv": true,
694 | "pro.mv": true,
695 | "ac.mw": true,
696 | "co.mw": true,
697 | "com.mw": true,
698 | "coop.mw": true,
699 | "edu.mw": true,
700 | "gov.mw": true,
701 | "int.mw": true,
702 | "museum.mw": true,
703 | "net.mw": true,
704 | "org.mw": true,
705 | "com.mx": true,
706 | "net.mx": true,
707 | "org.mx": true,
708 | "edu.mx": true,
709 | "gob.mx": true,
710 | "com.my": true,
711 | "net.my": true,
712 | "org.my": true,
713 | "gov.my": true,
714 | "edu.my": true,
715 | "sch.my": true,
716 | "mil.my": true,
717 | "name.my": true,
718 | "com.nf": true,
719 | "net.nf": true,
720 | "arts.nf": true,
721 | "store.nf": true,
722 | "web.nf": true,
723 | "firm.nf": true,
724 | "info.nf": true,
725 | "other.nf": true,
726 | "per.nf": true,
727 | "rec.nf": true,
728 | "com.ng": true,
729 | "org.ng": true,
730 | "gov.ng": true,
731 | "edu.ng": true,
732 | "net.ng": true,
733 | "sch.ng": true,
734 | "name.ng": true,
735 | "mobi.ng": true,
736 | "biz.ng": true,
737 | "mil.ng": true,
738 | "gob.ni": true,
739 | "co.ni": true,
740 | "com.ni": true,
741 | "ac.ni": true,
742 | "edu.ni": true,
743 | "org.ni": true,
744 | "nom.ni": true,
745 | "net.ni": true,
746 | "mil.ni": true,
747 | "com.np": true,
748 | "edu.np": true,
749 | "gov.np": true,
750 | "org.np": true,
751 | "mil.np": true,
752 | "net.np": true,
753 | "edu.nr": true,
754 | "gov.nr": true,
755 | "biz.nr": true,
756 | "info.nr": true,
757 | "net.nr": true,
758 | "org.nr": true,
759 | "com.nr": true,
760 | "com.om": true,
761 | "co.om": true,
762 | "edu.om": true,
763 | "ac.om": true,
764 | "sch.om": true,
765 | "gov.om": true,
766 | "net.om": true,
767 | "org.om": true,
768 | "mil.om": true,
769 | "museum.om": true,
770 | "biz.om": true,
771 | "pro.om": true,
772 | "med.om": true,
773 | "edu.pe": true,
774 | "gob.pe": true,
775 | "nom.pe": true,
776 | "mil.pe": true,
777 | "sld.pe": true,
778 | "org.pe": true,
779 | "com.pe": true,
780 | "net.pe": true,
781 | "com.ph": true,
782 | "net.ph": true,
783 | "org.ph": true,
784 | "mil.ph": true,
785 | "ngo.ph": true,
786 | "i.ph": true,
787 | "gov.ph": true,
788 | "edu.ph": true,
789 | "com.pk": true,
790 | "net.pk": true,
791 | "edu.pk": true,
792 | "org.pk": true,
793 | "fam.pk": true,
794 | "biz.pk": true,
795 | "web.pk": true,
796 | "gov.pk": true,
797 | "gob.pk": true,
798 | "gok.pk": true,
799 | "gon.pk": true,
800 | "gop.pk": true,
801 | "gos.pk": true,
802 | "pwr.pl": true,
803 | "com.pl": true,
804 | "biz.pl": true,
805 | "net.pl": true,
806 | "art.pl": true,
807 | "edu.pl": true,
808 | "org.pl": true,
809 | "ngo.pl": true,
810 | "gov.pl": true,
811 | "info.pl": true,
812 | "mil.pl": true,
813 | "waw.pl": true,
814 | "warszawa.pl": true,
815 | "wroc.pl": true,
816 | "wroclaw.pl": true,
817 | "krakow.pl": true,
818 | "katowice.pl": true,
819 | "poznan.pl": true,
820 | "lodz.pl": true,
821 | "gda.pl": true,
822 | "gdansk.pl": true,
823 | "slupsk.pl": true,
824 | "radom.pl": true,
825 | "szczecin.pl": true,
826 | "lublin.pl": true,
827 | "bialystok.pl": true,
828 | "olsztyn.pl": true,
829 | "torun.pl": true,
830 | "gorzow.pl": true,
831 | "zgora.pl": true,
832 | "biz.pr": true,
833 | "com.pr": true,
834 | "edu.pr": true,
835 | "gov.pr": true,
836 | "info.pr": true,
837 | "isla.pr": true,
838 | "name.pr": true,
839 | "net.pr": true,
840 | "org.pr": true,
841 | "pro.pr": true,
842 | "est.pr": true,
843 | "prof.pr": true,
844 | "ac.pr": true,
845 | "com.ps": true,
846 | "net.ps": true,
847 | "org.ps": true,
848 | "edu.ps": true,
849 | "gov.ps": true,
850 | "plo.ps": true,
851 | "sec.ps": true,
852 | "co.pw": true,
853 | "ne.pw": true,
854 | "or.pw": true,
855 | "ed.pw": true,
856 | "go.pw": true,
857 | "belau.pw": true,
858 | "arts.ro": true,
859 | "com.ro": true,
860 | "firm.ro": true,
861 | "info.ro": true,
862 | "nom.ro": true,
863 | "nt.ro": true,
864 | "org.ro": true,
865 | "rec.ro": true,
866 | "store.ro": true,
867 | "tm.ro": true,
868 | "www.ro": true,
869 | "co.rs": true,
870 | "org.rs": true,
871 | "edu.rs": true,
872 | "ac.rs": true,
873 | "gov.rs": true,
874 | "in.rs": true,
875 | "com.sb": true,
876 | "net.sb": true,
877 | "edu.sb": true,
878 | "org.sb": true,
879 | "gov.sb": true,
880 | "com.sc": true,
881 | "net.sc": true,
882 | "edu.sc": true,
883 | "gov.sc": true,
884 | "org.sc": true,
885 | "co.sh": true,
886 | "com.sh": true,
887 | "org.sh": true,
888 | "gov.sh": true,
889 | "edu.sh": true,
890 | "net.sh": true,
891 | "nom.sh": true,
892 | "com.sl": true,
893 | "net.sl": true,
894 | "org.sl": true,
895 | "edu.sl": true,
896 | "gov.sl": true,
897 | "gov.st": true,
898 | "saotome.st": true,
899 | "principe.st": true,
900 | "consulado.st": true,
901 | "embaixada.st": true,
902 | "org.st": true,
903 | "edu.st": true,
904 | "net.st": true,
905 | "com.st": true,
906 | "store.st": true,
907 | "mil.st": true,
908 | "co.st": true,
909 | "edu.sv": true,
910 | "gob.sv": true,
911 | "com.sv": true,
912 | "org.sv": true,
913 | "red.sv": true,
914 | "co.sz": true,
915 | "ac.sz": true,
916 | "org.sz": true,
917 | "com.tr": true,
918 | "gen.tr": true,
919 | "org.tr": true,
920 | "biz.tr": true,
921 | "info.tr": true,
922 | "av.tr": true,
923 | "dr.tr": true,
924 | "pol.tr": true,
925 | "bel.tr": true,
926 | "tsk.tr": true,
927 | "bbs.tr": true,
928 | "k12.tr": true,
929 | "edu.tr": true,
930 | "name.tr": true,
931 | "net.tr": true,
932 | "gov.tr": true,
933 | "web.tr": true,
934 | "tel.tr": true,
935 | "tv.tr": true,
936 | "co.tt": true,
937 | "com.tt": true,
938 | "org.tt": true,
939 | "net.tt": true,
940 | "biz.tt": true,
941 | "info.tt": true,
942 | "pro.tt": true,
943 | "int.tt": true,
944 | "coop.tt": true,
945 | "jobs.tt": true,
946 | "mobi.tt": true,
947 | "travel.tt": true,
948 | "museum.tt": true,
949 | "aero.tt": true,
950 | "cat.tt": true,
951 | "tel.tt": true,
952 | "name.tt": true,
953 | "mil.tt": true,
954 | "edu.tt": true,
955 | "gov.tt": true,
956 | "edu.tw": true,
957 | "gov.tw": true,
958 | "mil.tw": true,
959 | "com.tw": true,
960 | "net.tw": true,
961 | "org.tw": true,
962 | "idv.tw": true,
963 | "game.tw": true,
964 | "ebiz.tw": true,
965 | "club.tw": true,
966 | "com.mu": true,
967 | "gov.mu": true,
968 | "net.mu": true,
969 | "org.mu": true,
970 | "ac.mu": true,
971 | "co.mu": true,
972 | "or.mu": true,
973 | "ac.mz": true,
974 | "co.mz": true,
975 | "edu.mz": true,
976 | "org.mz": true,
977 | "gov.mz": true,
978 | "com.na": true,
979 | "co.na": true,
980 | "ac.nz": true,
981 | "co.nz": true,
982 | "cri.nz": true,
983 | "geek.nz": true,
984 | "gen.nz": true,
985 | "govt.nz": true,
986 | "health.nz": true,
987 | "iwi.nz": true,
988 | "maori.nz": true,
989 | "mil.nz": true,
990 | "net.nz": true,
991 | "org.nz": true,
992 | "parliament.nz": true,
993 | "school.nz": true,
994 | "abo.pa": true,
995 | "ac.pa": true,
996 | "com.pa": true,
997 | "edu.pa": true,
998 | "gob.pa": true,
999 | "ing.pa": true,
1000 | "med.pa": true,
1001 | "net.pa": true,
1002 | "nom.pa": true,
1003 | "org.pa": true,
1004 | "sld.pa": true,
1005 | "com.pt": true,
1006 | "edu.pt": true,
1007 | "gov.pt": true,
1008 | "int.pt": true,
1009 | "net.pt": true,
1010 | "nome.pt": true,
1011 | "org.pt": true,
1012 | "publ.pt": true,
1013 | "com.py": true,
1014 | "edu.py": true,
1015 | "gov.py": true,
1016 | "mil.py": true,
1017 | "net.py": true,
1018 | "org.py": true,
1019 | "com.qa": true,
1020 | "edu.qa": true,
1021 | "gov.qa": true,
1022 | "mil.qa": true,
1023 | "net.qa": true,
1024 | "org.qa": true,
1025 | "asso.re": true,
1026 | "com.re": true,
1027 | "nom.re": true,
1028 | "ac.ru": true,
1029 | "adygeya.ru": true,
1030 | "altai.ru": true,
1031 | "amur.ru": true,
1032 | "arkhangelsk.ru": true,
1033 | "astrakhan.ru": true,
1034 | "bashkiria.ru": true,
1035 | "belgorod.ru": true,
1036 | "bir.ru": true,
1037 | "bryansk.ru": true,
1038 | "buryatia.ru": true,
1039 | "cbg.ru": true,
1040 | "chel.ru": true,
1041 | "chelyabinsk.ru": true,
1042 | "chita.ru": true,
1043 | "chukotka.ru": true,
1044 | "chuvashia.ru": true,
1045 | "com.ru": true,
1046 | "dagestan.ru": true,
1047 | "e-burg.ru": true,
1048 | "edu.ru": true,
1049 | "gov.ru": true,
1050 | "grozny.ru": true,
1051 | "int.ru": true,
1052 | "irkutsk.ru": true,
1053 | "ivanovo.ru": true,
1054 | "izhevsk.ru": true,
1055 | "jar.ru": true,
1056 | "joshkar-ola.ru": true,
1057 | "kalmykia.ru": true,
1058 | "kaluga.ru": true,
1059 | "kamchatka.ru": true,
1060 | "karelia.ru": true,
1061 | "kazan.ru": true,
1062 | "kchr.ru": true,
1063 | "kemerovo.ru": true,
1064 | "khabarovsk.ru": true,
1065 | "khakassia.ru": true,
1066 | "khv.ru": true,
1067 | "kirov.ru": true,
1068 | "koenig.ru": true,
1069 | "komi.ru": true,
1070 | "kostroma.ru": true,
1071 | "kranoyarsk.ru": true,
1072 | "kuban.ru": true,
1073 | "kurgan.ru": true,
1074 | "kursk.ru": true,
1075 | "lipetsk.ru": true,
1076 | "magadan.ru": true,
1077 | "mari.ru": true,
1078 | "mari-el.ru": true,
1079 | "marine.ru": true,
1080 | "mil.ru": true,
1081 | "mordovia.ru": true,
1082 | "mosreg.ru": true,
1083 | "msk.ru": true,
1084 | "murmansk.ru": true,
1085 | "nalchik.ru": true,
1086 | "net.ru": true,
1087 | "nnov.ru": true,
1088 | "nov.ru": true,
1089 | "novosibirsk.ru": true,
1090 | "nsk.ru": true,
1091 | "omsk.ru": true,
1092 | "orenburg.ru": true,
1093 | "org.ru": true,
1094 | "oryol.ru": true,
1095 | "penza.ru": true,
1096 | "perm.ru": true,
1097 | "pp.ru": true,
1098 | "pskov.ru": true,
1099 | "ptz.ru": true,
1100 | "rnd.ru": true,
1101 | "ryazan.ru": true,
1102 | "sakhalin.ru": true,
1103 | "samara.ru": true,
1104 | "saratov.ru": true,
1105 | "simbirsk.ru": true,
1106 | "smolensk.ru": true,
1107 | "spb.ru": true,
1108 | "stavropol.ru": true,
1109 | "stv.ru": true,
1110 | "surgut.ru": true,
1111 | "tambov.ru": true,
1112 | "tatarstan.ru": true,
1113 | "tom.ru": true,
1114 | "tomsk.ru": true,
1115 | "tsaritsyn.ru": true,
1116 | "tsk.ru": true,
1117 | "tula.ru": true,
1118 | "tuva.ru": true,
1119 | "tver.ru": true,
1120 | "tyumen.ru": true,
1121 | "udm.ru": true,
1122 | "udmurtia.ru": true,
1123 | "ulan-ude.ru": true,
1124 | "vladikavkaz.ru": true,
1125 | "vladimir.ru": true,
1126 | "vladivostok.ru": true,
1127 | "volgograd.ru": true,
1128 | "vologda.ru": true,
1129 | "voronezh.ru": true,
1130 | "vrn.ru": true,
1131 | "vyatka.ru": true,
1132 | "yakutia.ru": true,
1133 | "yamal.ru": true,
1134 | "yekaterinburg.ru": true,
1135 | "yuzhno-sakhalinsk.ru": true,
1136 | "ac.rw": true,
1137 | "co.rw": true,
1138 | "com.rw": true,
1139 | "edu.rw": true,
1140 | "gouv.rw": true,
1141 | "gov.rw": true,
1142 | "int.rw": true,
1143 | "mil.rw": true,
1144 | "net.rw": true,
1145 | "com.sa": true,
1146 | "edu.sa": true,
1147 | "gov.sa": true,
1148 | "med.sa": true,
1149 | "net.sa": true,
1150 | "org.sa": true,
1151 | "pub.sa": true,
1152 | "sch.sa": true,
1153 | "com.sd": true,
1154 | "edu.sd": true,
1155 | "gov.sd": true,
1156 | "info.sd": true,
1157 | "med.sd": true,
1158 | "net.sd": true,
1159 | "org.sd": true,
1160 | "tv.sd": true,
1161 | "a.se": true,
1162 | "ac.se": true,
1163 | "b.se": true,
1164 | "bd.se": true,
1165 | "c.se": true,
1166 | "d.se": true,
1167 | "e.se": true,
1168 | "f.se": true,
1169 | "g.se": true,
1170 | "h.se": true,
1171 | "i.se": true,
1172 | "k.se": true,
1173 | "l.se": true,
1174 | "m.se": true,
1175 | "n.se": true,
1176 | "o.se": true,
1177 | "org.se": true,
1178 | "p.se": true,
1179 | "parti.se": true,
1180 | "pp.se": true,
1181 | "press.se": true,
1182 | "r.se": true,
1183 | "s.se": true,
1184 | "t.se": true,
1185 | "tm.se": true,
1186 | "u.se": true,
1187 | "w.se": true,
1188 | "x.se": true,
1189 | "y.se": true,
1190 | "z.se": true,
1191 | "com.sg": true,
1192 | "edu.sg": true,
1193 | "gov.sg": true,
1194 | "idn.sg": true,
1195 | "net.sg": true,
1196 | "org.sg": true,
1197 | "per.sg": true,
1198 | "art.sn": true,
1199 | "com.sn": true,
1200 | "edu.sn": true,
1201 | "gouv.sn": true,
1202 | "org.sn": true,
1203 | "perso.sn": true,
1204 | "univ.sn": true,
1205 | "com.sy": true,
1206 | "edu.sy": true,
1207 | "gov.sy": true,
1208 | "mil.sy": true,
1209 | "net.sy": true,
1210 | "news.sy": true,
1211 | "org.sy": true,
1212 | "ac.th": true,
1213 | "co.th": true,
1214 | "go.th": true,
1215 | "in.th": true,
1216 | "mi.th": true,
1217 | "net.th": true,
1218 | "or.th": true,
1219 | "ac.tj": true,
1220 | "biz.tj": true,
1221 | "co.tj": true,
1222 | "com.tj": true,
1223 | "edu.tj": true,
1224 | "go.tj": true,
1225 | "gov.tj": true,
1226 | "info.tj": true,
1227 | "int.tj": true,
1228 | "mil.tj": true,
1229 | "name.tj": true,
1230 | "net.tj": true,
1231 | "nic.tj": true,
1232 | "org.tj": true,
1233 | "test.tj": true,
1234 | "web.tj": true,
1235 | "agrinet.tn": true,
1236 | "com.tn": true,
1237 | "defense.tn": true,
1238 | "edunet.tn": true,
1239 | "ens.tn": true,
1240 | "fin.tn": true,
1241 | "gov.tn": true,
1242 | "ind.tn": true,
1243 | "info.tn": true,
1244 | "intl.tn": true,
1245 | "mincom.tn": true,
1246 | "nat.tn": true,
1247 | "net.tn": true,
1248 | "org.tn": true,
1249 | "perso.tn": true,
1250 | "rnrt.tn": true,
1251 | "rns.tn": true,
1252 | "rnu.tn": true,
1253 | "tourism.tn": true,
1254 | "ac.tz": true,
1255 | "co.tz": true,
1256 | "go.tz": true,
1257 | "ne.tz": true,
1258 | "or.tz": true,
1259 | "biz.ua": true,
1260 | "cherkassy.ua": true,
1261 | "chernigov.ua": true,
1262 | "chernovtsy.ua": true,
1263 | "ck.ua": true,
1264 | "cn.ua": true,
1265 | "co.ua": true,
1266 | "com.ua": true,
1267 | "crimea.ua": true,
1268 | "cv.ua": true,
1269 | "dn.ua": true,
1270 | "dnepropetrovsk.ua": true,
1271 | "donetsk.ua": true,
1272 | "dp.ua": true,
1273 | "edu.ua": true,
1274 | "gov.ua": true,
1275 | "if.ua": true,
1276 | "in.ua": true,
1277 | "ivano-frankivsk.ua": true,
1278 | "kh.ua": true,
1279 | "kharkov.ua": true,
1280 | "kherson.ua": true,
1281 | "khmelnitskiy.ua": true,
1282 | "kiev.ua": true,
1283 | "kirovograd.ua": true,
1284 | "km.ua": true,
1285 | "kr.ua": true,
1286 | "ks.ua": true,
1287 | "kv.ua": true,
1288 | "lg.ua": true,
1289 | "lugansk.ua": true,
1290 | "lutsk.ua": true,
1291 | "lviv.ua": true,
1292 | "me.ua": true,
1293 | "mk.ua": true,
1294 | "net.ua": true,
1295 | "nikolaev.ua": true,
1296 | "od.ua": true,
1297 | "odessa.ua": true,
1298 | "org.ua": true,
1299 | "pl.ua": true,
1300 | "poltava.ua": true,
1301 | "pp.ua": true,
1302 | "rovno.ua": true,
1303 | "rv.ua": true,
1304 | "sebastopol.ua": true,
1305 | "sumy.ua": true,
1306 | "te.ua": true,
1307 | "ternopil.ua": true,
1308 | "uzhgorod.ua": true,
1309 | "vinnica.ua": true,
1310 | "vn.ua": true,
1311 | "zaporizhzhe.ua": true,
1312 | "zhitomir.ua": true,
1313 | "zp.ua": true,
1314 | "zt.ua": true,
1315 | "ac.ug": true,
1316 | "co.ug": true,
1317 | "go.ug": true,
1318 | "ne.ug": true,
1319 | "or.ug": true,
1320 | "org.ug": true,
1321 | "sc.ug": true,
1322 | "ac.uk": true,
1323 | "bl.uk": true,
1324 | "british-library.uk": true,
1325 | "co.uk": true,
1326 | "cym.uk": true,
1327 | "gov.uk": true,
1328 | "govt.uk": true,
1329 | "icnet.uk": true,
1330 | "jet.uk": true,
1331 | "lea.uk": true,
1332 | "ltd.uk": true,
1333 | "me.uk": true,
1334 | "mil.uk": true,
1335 | "mod.uk": true,
1336 | "national-library-scotland.uk": true,
1337 | "nel.uk": true,
1338 | "net.uk": true,
1339 | "nhs.uk": true,
1340 | "nic.uk": true,
1341 | "nls.uk": true,
1342 | "org.uk": true,
1343 | "orgn.uk": true,
1344 | "parliament.uk": true,
1345 | "plc.uk": true,
1346 | "police.uk": true,
1347 | "sch.uk": true,
1348 | "scot.uk": true,
1349 | "soc.uk": true,
1350 | "4fd.us": true,
1351 | "dni.us": true,
1352 | "fed.us": true,
1353 | "isa.us": true,
1354 | "kids.us": true,
1355 | "nsn.us": true,
1356 | "com.uy": true,
1357 | "edu.uy": true,
1358 | "gub.uy": true,
1359 | "mil.uy": true,
1360 | "net.uy": true,
1361 | "org.uy": true,
1362 | "co.ve": true,
1363 | "com.ve": true,
1364 | "edu.ve": true,
1365 | "gob.ve": true,
1366 | "info.ve": true,
1367 | "mil.ve": true,
1368 | "net.ve": true,
1369 | "org.ve": true,
1370 | "web.ve": true,
1371 | "co.vi": true,
1372 | "com.vi": true,
1373 | "k12.vi": true,
1374 | "net.vi": true,
1375 | "org.vi": true,
1376 | "ac.vn": true,
1377 | "biz.vn": true,
1378 | "com.vn": true,
1379 | "edu.vn": true,
1380 | "gov.vn": true,
1381 | "health.vn": true,
1382 | "info.vn": true,
1383 | "int.vn": true,
1384 | "name.vn": true,
1385 | "net.vn": true,
1386 | "org.vn": true,
1387 | "pro.vn": true,
1388 | "co.ye": true,
1389 | "com.ye": true,
1390 | "gov.ye": true,
1391 | "ltd.ye": true,
1392 | "me.ye": true,
1393 | "net.ye": true,
1394 | "org.ye": true,
1395 | "plc.ye": true,
1396 | "ac.yu": true,
1397 | "co.yu": true,
1398 | "edu.yu": true,
1399 | "gov.yu": true,
1400 | "org.yu": true,
1401 | "ac.za": true,
1402 | "agric.za": true,
1403 | "alt.za": true,
1404 | "bourse.za": true,
1405 | "city.za": true,
1406 | "co.za": true,
1407 | "cybernet.za": true,
1408 | "db.za": true,
1409 | "ecape.school.za": true,
1410 | "edu.za": true,
1411 | "fs.school.za": true,
1412 | "gov.za": true,
1413 | "gp.school.za": true,
1414 | "grondar.za": true,
1415 | "iaccess.za": true,
1416 | "imt.za": true,
1417 | "inca.za": true,
1418 | "kzn.school.za": true,
1419 | "landesign.za": true,
1420 | "law.za": true,
1421 | "lp.school.za": true,
1422 | "mil.za": true,
1423 | "mpm.school.za": true,
1424 | "ncape.school.za": true,
1425 | "net.za": true,
1426 | "ngo.za": true,
1427 | "nis.za": true,
1428 | "nom.za": true,
1429 | "nw.school.za": true,
1430 | "olivetti.za": true,
1431 | "org.za": true,
1432 | "pix.za": true,
1433 | "school.za": true,
1434 | "tm.za": true,
1435 | "wcape.school.za": true,
1436 | "web.za": true,
1437 | "ac.zm": true,
1438 | "co.zm": true,
1439 | "com.zm": true,
1440 | "edu.zm": true,
1441 | "gov.zm": true,
1442 | "net.zm": true,
1443 | "org.zm": true,
1444 | "sch.zm": true
1445 | }
--------------------------------------------------------------------------------
/example/dist/bundle.js:
--------------------------------------------------------------------------------
1 | (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 253) {
1745 | return false
1746 | }
1747 |
1748 | const validChars = /^([\u0E00-\u0E7Fa-z0-9-._*]+)$/g
1749 | if (!validChars.test(value)) {
1750 | return false
1751 | }
1752 |
1753 | if (opts.topLevel) {
1754 | if (ccTldMap[value.replace(/\.$/, '')]) {
1755 | return true
1756 | }
1757 | }
1758 |
1759 | const sldRegex = /(.*)\.(([\u0E00-\u0E7Fa-z0-9]+)(\.[a-z0-9]+))/
1760 | const matches = value.match(sldRegex)
1761 | let tld = null
1762 | let labels = null
1763 | if (matches && matches.length > 2) {
1764 | if (sldMap[matches[2]]) {
1765 | tld = matches[2]
1766 | labels = matches[1].split('.')
1767 | }
1768 | }
1769 |
1770 | if (!labels) {
1771 | labels = value.split('.')
1772 | if (labels.length <= 1) return false
1773 |
1774 | tld = labels.pop()
1775 | const tldRegex = /^(?:xn--)?(?!^\d+$)[\u0E00-\u0E7Fa-z0-9]+$/gi
1776 |
1777 | if (!tldRegex.test(tld)) return false
1778 | }
1779 |
1780 | if (opts.subdomain === false && labels.length > 1) return false
1781 |
1782 | const isValid = labels.every(function (label, index) {
1783 | if (opts.wildcard && index === 0 && label === '*' && labels.length > 1) {
1784 | return true
1785 | }
1786 |
1787 | let validLabelChars = /^([\u0E00-\u0E7Fa-zA-Z0-9-_]+)$/g
1788 | if (index === labels.length - 1) {
1789 | validLabelChars = /^([\u0E00-\u0E7Fa-zA-Z0-9-]+)$/g
1790 | }
1791 |
1792 | // https://github.com/miguelmota/is-valid-domain/issues/22
1793 | const doubleDashCount = (label.match(/--(--)?/g) || []).length
1794 | const xnDashCount = (label.match(/xn--/g) || []).length
1795 | if (index === labels.length - 1 && doubleDashCount !== xnDashCount) {
1796 | return false
1797 | }
1798 |
1799 | const isValid = (
1800 | validLabelChars.test(label) &&
1801 | label.length < 64 &&
1802 | !label.startsWith('-') &&
1803 | !label.endsWith('-')
1804 | )
1805 |
1806 | return isValid
1807 | })
1808 |
1809 | return isValid
1810 | }
1811 |
1812 | },{"./data/ccTldMap.json":1,"./data/sldMap.json":2,"punycode":5}],5:[function(require,module,exports){
1813 | (function (global){
1814 | /*! https://mths.be/punycode v1.4.1 by @mathias */
1815 | ;(function(root) {
1816 |
1817 | /** Detect free variables */
1818 | var freeExports = typeof exports == 'object' && exports &&
1819 | !exports.nodeType && exports;
1820 | var freeModule = typeof module == 'object' && module &&
1821 | !module.nodeType && module;
1822 | var freeGlobal = typeof global == 'object' && global;
1823 | if (
1824 | freeGlobal.global === freeGlobal ||
1825 | freeGlobal.window === freeGlobal ||
1826 | freeGlobal.self === freeGlobal
1827 | ) {
1828 | root = freeGlobal;
1829 | }
1830 |
1831 | /**
1832 | * The `punycode` object.
1833 | * @name punycode
1834 | * @type Object
1835 | */
1836 | var punycode,
1837 |
1838 | /** Highest positive signed 32-bit float value */
1839 | maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
1840 |
1841 | /** Bootstring parameters */
1842 | base = 36,
1843 | tMin = 1,
1844 | tMax = 26,
1845 | skew = 38,
1846 | damp = 700,
1847 | initialBias = 72,
1848 | initialN = 128, // 0x80
1849 | delimiter = '-', // '\x2D'
1850 |
1851 | /** Regular expressions */
1852 | regexPunycode = /^xn--/,
1853 | regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
1854 | regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
1855 |
1856 | /** Error messages */
1857 | errors = {
1858 | 'overflow': 'Overflow: input needs wider integers to process',
1859 | 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
1860 | 'invalid-input': 'Invalid input'
1861 | },
1862 |
1863 | /** Convenience shortcuts */
1864 | baseMinusTMin = base - tMin,
1865 | floor = Math.floor,
1866 | stringFromCharCode = String.fromCharCode,
1867 |
1868 | /** Temporary variable */
1869 | key;
1870 |
1871 | /*--------------------------------------------------------------------------*/
1872 |
1873 | /**
1874 | * A generic error utility function.
1875 | * @private
1876 | * @param {String} type The error type.
1877 | * @returns {Error} Throws a `RangeError` with the applicable error message.
1878 | */
1879 | function error(type) {
1880 | throw new RangeError(errors[type]);
1881 | }
1882 |
1883 | /**
1884 | * A generic `Array#map` utility function.
1885 | * @private
1886 | * @param {Array} array The array to iterate over.
1887 | * @param {Function} callback The function that gets called for every array
1888 | * item.
1889 | * @returns {Array} A new array of values returned by the callback function.
1890 | */
1891 | function map(array, fn) {
1892 | var length = array.length;
1893 | var result = [];
1894 | while (length--) {
1895 | result[length] = fn(array[length]);
1896 | }
1897 | return result;
1898 | }
1899 |
1900 | /**
1901 | * A simple `Array#map`-like wrapper to work with domain name strings or email
1902 | * addresses.
1903 | * @private
1904 | * @param {String} domain The domain name or email address.
1905 | * @param {Function} callback The function that gets called for every
1906 | * character.
1907 | * @returns {Array} A new string of characters returned by the callback
1908 | * function.
1909 | */
1910 | function mapDomain(string, fn) {
1911 | var parts = string.split('@');
1912 | var result = '';
1913 | if (parts.length > 1) {
1914 | // In email addresses, only the domain name should be punycoded. Leave
1915 | // the local part (i.e. everything up to `@`) intact.
1916 | result = parts[0] + '@';
1917 | string = parts[1];
1918 | }
1919 | // Avoid `split(regex)` for IE8 compatibility. See #17.
1920 | string = string.replace(regexSeparators, '\x2E');
1921 | var labels = string.split('.');
1922 | var encoded = map(labels, fn).join('.');
1923 | return result + encoded;
1924 | }
1925 |
1926 | /**
1927 | * Creates an array containing the numeric code points of each Unicode
1928 | * character in the string. While JavaScript uses UCS-2 internally,
1929 | * this function will convert a pair of surrogate halves (each of which
1930 | * UCS-2 exposes as separate characters) into a single code point,
1931 | * matching UTF-16.
1932 | * @see `punycode.ucs2.encode`
1933 | * @see
1934 | * @memberOf punycode.ucs2
1935 | * @name decode
1936 | * @param {String} string The Unicode input string (UCS-2).
1937 | * @returns {Array} The new array of code points.
1938 | */
1939 | function ucs2decode(string) {
1940 | var output = [],
1941 | counter = 0,
1942 | length = string.length,
1943 | value,
1944 | extra;
1945 | while (counter < length) {
1946 | value = string.charCodeAt(counter++);
1947 | if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
1948 | // high surrogate, and there is a next character
1949 | extra = string.charCodeAt(counter++);
1950 | if ((extra & 0xFC00) == 0xDC00) { // low surrogate
1951 | output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
1952 | } else {
1953 | // unmatched surrogate; only append this code unit, in case the next
1954 | // code unit is the high surrogate of a surrogate pair
1955 | output.push(value);
1956 | counter--;
1957 | }
1958 | } else {
1959 | output.push(value);
1960 | }
1961 | }
1962 | return output;
1963 | }
1964 |
1965 | /**
1966 | * Creates a string based on an array of numeric code points.
1967 | * @see `punycode.ucs2.decode`
1968 | * @memberOf punycode.ucs2
1969 | * @name encode
1970 | * @param {Array} codePoints The array of numeric code points.
1971 | * @returns {String} The new Unicode string (UCS-2).
1972 | */
1973 | function ucs2encode(array) {
1974 | return map(array, function(value) {
1975 | var output = '';
1976 | if (value > 0xFFFF) {
1977 | value -= 0x10000;
1978 | output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
1979 | value = 0xDC00 | value & 0x3FF;
1980 | }
1981 | output += stringFromCharCode(value);
1982 | return output;
1983 | }).join('');
1984 | }
1985 |
1986 | /**
1987 | * Converts a basic code point into a digit/integer.
1988 | * @see `digitToBasic()`
1989 | * @private
1990 | * @param {Number} codePoint The basic numeric code point value.
1991 | * @returns {Number} The numeric value of a basic code point (for use in
1992 | * representing integers) in the range `0` to `base - 1`, or `base` if
1993 | * the code point does not represent a value.
1994 | */
1995 | function basicToDigit(codePoint) {
1996 | if (codePoint - 48 < 10) {
1997 | return codePoint - 22;
1998 | }
1999 | if (codePoint - 65 < 26) {
2000 | return codePoint - 65;
2001 | }
2002 | if (codePoint - 97 < 26) {
2003 | return codePoint - 97;
2004 | }
2005 | return base;
2006 | }
2007 |
2008 | /**
2009 | * Converts a digit/integer into a basic code point.
2010 | * @see `basicToDigit()`
2011 | * @private
2012 | * @param {Number} digit The numeric value of a basic code point.
2013 | * @returns {Number} The basic code point whose value (when used for
2014 | * representing integers) is `digit`, which needs to be in the range
2015 | * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
2016 | * used; else, the lowercase form is used. The behavior is undefined
2017 | * if `flag` is non-zero and `digit` has no uppercase form.
2018 | */
2019 | function digitToBasic(digit, flag) {
2020 | // 0..25 map to ASCII a..z or A..Z
2021 | // 26..35 map to ASCII 0..9
2022 | return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
2023 | }
2024 |
2025 | /**
2026 | * Bias adaptation function as per section 3.4 of RFC 3492.
2027 | * https://tools.ietf.org/html/rfc3492#section-3.4
2028 | * @private
2029 | */
2030 | function adapt(delta, numPoints, firstTime) {
2031 | var k = 0;
2032 | delta = firstTime ? floor(delta / damp) : delta >> 1;
2033 | delta += floor(delta / numPoints);
2034 | for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
2035 | delta = floor(delta / baseMinusTMin);
2036 | }
2037 | return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
2038 | }
2039 |
2040 | /**
2041 | * Converts a Punycode string of ASCII-only symbols to a string of Unicode
2042 | * symbols.
2043 | * @memberOf punycode
2044 | * @param {String} input The Punycode string of ASCII-only symbols.
2045 | * @returns {String} The resulting string of Unicode symbols.
2046 | */
2047 | function decode(input) {
2048 | // Don't use UCS-2
2049 | var output = [],
2050 | inputLength = input.length,
2051 | out,
2052 | i = 0,
2053 | n = initialN,
2054 | bias = initialBias,
2055 | basic,
2056 | j,
2057 | index,
2058 | oldi,
2059 | w,
2060 | k,
2061 | digit,
2062 | t,
2063 | /** Cached calculation results */
2064 | baseMinusT;
2065 |
2066 | // Handle the basic code points: let `basic` be the number of input code
2067 | // points before the last delimiter, or `0` if there is none, then copy
2068 | // the first basic code points to the output.
2069 |
2070 | basic = input.lastIndexOf(delimiter);
2071 | if (basic < 0) {
2072 | basic = 0;
2073 | }
2074 |
2075 | for (j = 0; j < basic; ++j) {
2076 | // if it's not a basic code point
2077 | if (input.charCodeAt(j) >= 0x80) {
2078 | error('not-basic');
2079 | }
2080 | output.push(input.charCodeAt(j));
2081 | }
2082 |
2083 | // Main decoding loop: start just after the last delimiter if any basic code
2084 | // points were copied; start at the beginning otherwise.
2085 |
2086 | for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
2087 |
2088 | // `index` is the index of the next character to be consumed.
2089 | // Decode a generalized variable-length integer into `delta`,
2090 | // which gets added to `i`. The overflow checking is easier
2091 | // if we increase `i` as we go, then subtract off its starting
2092 | // value at the end to obtain `delta`.
2093 | for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
2094 |
2095 | if (index >= inputLength) {
2096 | error('invalid-input');
2097 | }
2098 |
2099 | digit = basicToDigit(input.charCodeAt(index++));
2100 |
2101 | if (digit >= base || digit > floor((maxInt - i) / w)) {
2102 | error('overflow');
2103 | }
2104 |
2105 | i += digit * w;
2106 | t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
2107 |
2108 | if (digit < t) {
2109 | break;
2110 | }
2111 |
2112 | baseMinusT = base - t;
2113 | if (w > floor(maxInt / baseMinusT)) {
2114 | error('overflow');
2115 | }
2116 |
2117 | w *= baseMinusT;
2118 |
2119 | }
2120 |
2121 | out = output.length + 1;
2122 | bias = adapt(i - oldi, out, oldi == 0);
2123 |
2124 | // `i` was supposed to wrap around from `out` to `0`,
2125 | // incrementing `n` each time, so we'll fix that now:
2126 | if (floor(i / out) > maxInt - n) {
2127 | error('overflow');
2128 | }
2129 |
2130 | n += floor(i / out);
2131 | i %= out;
2132 |
2133 | // Insert `n` at position `i` of the output
2134 | output.splice(i++, 0, n);
2135 |
2136 | }
2137 |
2138 | return ucs2encode(output);
2139 | }
2140 |
2141 | /**
2142 | * Converts a string of Unicode symbols (e.g. a domain name label) to a
2143 | * Punycode string of ASCII-only symbols.
2144 | * @memberOf punycode
2145 | * @param {String} input The string of Unicode symbols.
2146 | * @returns {String} The resulting Punycode string of ASCII-only symbols.
2147 | */
2148 | function encode(input) {
2149 | var n,
2150 | delta,
2151 | handledCPCount,
2152 | basicLength,
2153 | bias,
2154 | j,
2155 | m,
2156 | q,
2157 | k,
2158 | t,
2159 | currentValue,
2160 | output = [],
2161 | /** `inputLength` will hold the number of code points in `input`. */
2162 | inputLength,
2163 | /** Cached calculation results */
2164 | handledCPCountPlusOne,
2165 | baseMinusT,
2166 | qMinusT;
2167 |
2168 | // Convert the input in UCS-2 to Unicode
2169 | input = ucs2decode(input);
2170 |
2171 | // Cache the length
2172 | inputLength = input.length;
2173 |
2174 | // Initialize the state
2175 | n = initialN;
2176 | delta = 0;
2177 | bias = initialBias;
2178 |
2179 | // Handle the basic code points
2180 | for (j = 0; j < inputLength; ++j) {
2181 | currentValue = input[j];
2182 | if (currentValue < 0x80) {
2183 | output.push(stringFromCharCode(currentValue));
2184 | }
2185 | }
2186 |
2187 | handledCPCount = basicLength = output.length;
2188 |
2189 | // `handledCPCount` is the number of code points that have been handled;
2190 | // `basicLength` is the number of basic code points.
2191 |
2192 | // Finish the basic string - if it is not empty - with a delimiter
2193 | if (basicLength) {
2194 | output.push(delimiter);
2195 | }
2196 |
2197 | // Main encoding loop:
2198 | while (handledCPCount < inputLength) {
2199 |
2200 | // All non-basic code points < n have been handled already. Find the next
2201 | // larger one:
2202 | for (m = maxInt, j = 0; j < inputLength; ++j) {
2203 | currentValue = input[j];
2204 | if (currentValue >= n && currentValue < m) {
2205 | m = currentValue;
2206 | }
2207 | }
2208 |
2209 | // Increase `delta` enough to advance the decoder's state to ,
2210 | // but guard against overflow
2211 | handledCPCountPlusOne = handledCPCount + 1;
2212 | if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
2213 | error('overflow');
2214 | }
2215 |
2216 | delta += (m - n) * handledCPCountPlusOne;
2217 | n = m;
2218 |
2219 | for (j = 0; j < inputLength; ++j) {
2220 | currentValue = input[j];
2221 |
2222 | if (currentValue < n && ++delta > maxInt) {
2223 | error('overflow');
2224 | }
2225 |
2226 | if (currentValue == n) {
2227 | // Represent delta as a generalized variable-length integer
2228 | for (q = delta, k = base; /* no condition */; k += base) {
2229 | t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
2230 | if (q < t) {
2231 | break;
2232 | }
2233 | qMinusT = q - t;
2234 | baseMinusT = base - t;
2235 | output.push(
2236 | stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
2237 | );
2238 | q = floor(qMinusT / baseMinusT);
2239 | }
2240 |
2241 | output.push(stringFromCharCode(digitToBasic(q, 0)));
2242 | bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
2243 | delta = 0;
2244 | ++handledCPCount;
2245 | }
2246 | }
2247 |
2248 | ++delta;
2249 | ++n;
2250 |
2251 | }
2252 | return output.join('');
2253 | }
2254 |
2255 | /**
2256 | * Converts a Punycode string representing a domain name or an email address
2257 | * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
2258 | * it doesn't matter if you call it on a string that has already been
2259 | * converted to Unicode.
2260 | * @memberOf punycode
2261 | * @param {String} input The Punycoded domain name or email address to
2262 | * convert to Unicode.
2263 | * @returns {String} The Unicode representation of the given Punycode
2264 | * string.
2265 | */
2266 | function toUnicode(input) {
2267 | return mapDomain(input, function(string) {
2268 | return regexPunycode.test(string)
2269 | ? decode(string.slice(4).toLowerCase())
2270 | : string;
2271 | });
2272 | }
2273 |
2274 | /**
2275 | * Converts a Unicode string representing a domain name or an email address to
2276 | * Punycode. Only the non-ASCII parts of the domain name will be converted,
2277 | * i.e. it doesn't matter if you call it with a domain that's already in
2278 | * ASCII.
2279 | * @memberOf punycode
2280 | * @param {String} input The domain name or email address to convert, as a
2281 | * Unicode string.
2282 | * @returns {String} The Punycode representation of the given domain name or
2283 | * email address.
2284 | */
2285 | function toASCII(input) {
2286 | return mapDomain(input, function(string) {
2287 | return regexNonASCII.test(string)
2288 | ? 'xn--' + encode(string)
2289 | : string;
2290 | });
2291 | }
2292 |
2293 | /*--------------------------------------------------------------------------*/
2294 |
2295 | /** Define the public API */
2296 | punycode = {
2297 | /**
2298 | * A string representing the current Punycode.js version number.
2299 | * @memberOf punycode
2300 | * @type String
2301 | */
2302 | 'version': '1.4.1',
2303 | /**
2304 | * An object of methods to convert from JavaScript's internal character
2305 | * representation (UCS-2) to Unicode code points, and back.
2306 | * @see
2307 | * @memberOf punycode
2308 | * @type Object
2309 | */
2310 | 'ucs2': {
2311 | 'decode': ucs2decode,
2312 | 'encode': ucs2encode
2313 | },
2314 | 'decode': decode,
2315 | 'encode': encode,
2316 | 'toASCII': toASCII,
2317 | 'toUnicode': toUnicode
2318 | };
2319 |
2320 | /** Expose `punycode` */
2321 | // Some AMD build optimizers, like r.js, check for specific condition patterns
2322 | // like the following:
2323 | if (
2324 | typeof define == 'function' &&
2325 | typeof define.amd == 'object' &&
2326 | define.amd
2327 | ) {
2328 | define('punycode', function() {
2329 | return punycode;
2330 | });
2331 | } else if (freeExports && freeModule) {
2332 | if (module.exports == freeExports) {
2333 | // in Node.js, io.js, or RingoJS v0.8.0+
2334 | freeModule.exports = punycode;
2335 | } else {
2336 | // in Narwhal or RingoJS v0.7.0-
2337 | for (key in punycode) {
2338 | punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
2339 | }
2340 | }
2341 | } else {
2342 | // in Rhino or a web browser
2343 | root.punycode = punycode;
2344 | }
2345 |
2346 | }(this));
2347 |
2348 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
2349 | },{}]},{},[3]);
2350 |
--------------------------------------------------------------------------------