├── .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 |
11 |
12 | 13 |
14 |
15 | 16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | Fork me on GitHub 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 | --------------------------------------------------------------------------------