@budiauktioner/buildi-primitives 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/LICENSE +21 -0
  3. package/README.md +253 -0
  4. package/THIRD_PARTY_NOTICES.md +52 -0
  5. package/dist/banking/index.cjs +6491 -0
  6. package/dist/banking/index.cjs.map +1 -0
  7. package/dist/banking/index.d.cts +58 -0
  8. package/dist/banking/index.d.ts +58 -0
  9. package/dist/banking/index.js +6464 -0
  10. package/dist/banking/index.js.map +1 -0
  11. package/dist/contact/index.cjs +6678 -0
  12. package/dist/contact/index.cjs.map +1 -0
  13. package/dist/contact/index.d.cts +709 -0
  14. package/dist/contact/index.d.ts +709 -0
  15. package/dist/contact/index.js +6586 -0
  16. package/dist/contact/index.js.map +1 -0
  17. package/dist/country-BhD51LDL.d.cts +433 -0
  18. package/dist/country-p0n0EVQ9.d.ts +433 -0
  19. package/dist/finance/index.cjs +3592 -0
  20. package/dist/finance/index.cjs.map +1 -0
  21. package/dist/finance/index.d.cts +83 -0
  22. package/dist/finance/index.d.ts +83 -0
  23. package/dist/finance/index.js +3584 -0
  24. package/dist/finance/index.js.map +1 -0
  25. package/dist/geography/index.cjs +4227 -0
  26. package/dist/geography/index.cjs.map +1 -0
  27. package/dist/geography/index.d.cts +34 -0
  28. package/dist/geography/index.d.ts +34 -0
  29. package/dist/geography/index.js +4202 -0
  30. package/dist/geography/index.js.map +1 -0
  31. package/dist/index.cjs +14087 -0
  32. package/dist/index.cjs.map +1 -0
  33. package/dist/index.d.cts +75 -0
  34. package/dist/index.d.ts +75 -0
  35. package/dist/index.js +13868 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/isin-EeVPpNWu.d.ts +39 -0
  38. package/dist/isin-ZlQLBVm8.d.cts +39 -0
  39. package/dist/organization/index.cjs +2376 -0
  40. package/dist/organization/index.cjs.map +1 -0
  41. package/dist/organization/index.d.cts +117 -0
  42. package/dist/organization/index.d.ts +117 -0
  43. package/dist/organization/index.js +2346 -0
  44. package/dist/organization/index.js.map +1 -0
  45. package/dist/person/index.cjs +1144 -0
  46. package/dist/person/index.cjs.map +1 -0
  47. package/dist/person/index.d.cts +60 -0
  48. package/dist/person/index.d.ts +60 -0
  49. package/dist/person/index.js +1125 -0
  50. package/dist/person/index.js.map +1 -0
  51. package/dist/person-full-name-Cmc9Ynuc.d.cts +82 -0
  52. package/dist/person-full-name-D6Hbsab6.d.ts +82 -0
  53. package/dist/phone-number-C24--ggy.d.ts +139 -0
  54. package/dist/phone-number-DZ-YxCQQ.d.cts +139 -0
  55. package/dist/property/index.cjs +487 -0
  56. package/dist/property/index.cjs.map +1 -0
  57. package/dist/property/index.d.cts +56 -0
  58. package/dist/property/index.d.ts +56 -0
  59. package/dist/property/index.js +480 -0
  60. package/dist/property/index.js.map +1 -0
  61. package/dist/sample-data/index.cjs +12310 -0
  62. package/dist/sample-data/index.cjs.map +1 -0
  63. package/dist/sample-data/index.d.cts +260 -0
  64. package/dist/sample-data/index.d.ts +260 -0
  65. package/dist/sample-data/index.js +12302 -0
  66. package/dist/sample-data/index.js.map +1 -0
  67. package/dist/swedish-address-DNC3ftRF.d.cts +297 -0
  68. package/dist/swedish-address-GMzjqgxb.d.ts +297 -0
  69. package/dist/swedish-bank-account-holder-name-BFJ8h1aO.d.cts +45 -0
  70. package/dist/swedish-bank-account-holder-name-CAAru07F.d.ts +45 -0
  71. package/dist/swedish-municipality-DlUS7g7h.d.cts +87 -0
  72. package/dist/swedish-municipality-nDRHYRAd.d.ts +87 -0
  73. package/dist/swedish-organization-name-D7NvERxA.d.cts +33 -0
  74. package/dist/swedish-organization-name-rR0Q836C.d.ts +33 -0
  75. package/dist/swedish-organization-number-Bcj7V_lh.d.cts +130 -0
  76. package/dist/swedish-organization-number-DM8dpXwR.d.ts +130 -0
  77. package/dist/swedish-organization-type-CZOdETwG.d.cts +29 -0
  78. package/dist/swedish-organization-type-CZOdETwG.d.ts +29 -0
  79. package/dist/swedish-personal-identity-number-BiIg4io3.d.ts +149 -0
  80. package/dist/swedish-personal-identity-number-Cp9Coz55.d.cts +149 -0
  81. package/dist/swedish-property-designation-BM-gdd9x.d.ts +46 -0
  82. package/dist/swedish-property-designation-BaHXufqV.d.cts +46 -0
  83. package/dist/swedish-sni-code-Ccsswpni.d.ts +53 -0
  84. package/dist/swedish-sni-code-CuJFyM6l.d.cts +53 -0
  85. package/dist/swedish-swish-number-CL6Gx_h3.d.cts +397 -0
  86. package/dist/swedish-swish-number-DDG3mNDg.d.ts +397 -0
  87. package/dist/text-candidate-qg2bD9PY.d.cts +110 -0
  88. package/dist/text-candidate-qg2bD9PY.d.ts +110 -0
  89. package/dist/text-scanning/index.cjs +10414 -0
  90. package/dist/text-scanning/index.cjs.map +1 -0
  91. package/dist/text-scanning/index.d.cts +153 -0
  92. package/dist/text-scanning/index.d.ts +153 -0
  93. package/dist/text-scanning/index.js +10406 -0
  94. package/dist/text-scanning/index.js.map +1 -0
  95. package/dist/validation/index.cjs +83 -0
  96. package/dist/validation/index.cjs.map +1 -0
  97. package/dist/validation/index.d.cts +63 -0
  98. package/dist/validation/index.d.ts +63 -0
  99. package/dist/validation/index.js +79 -0
  100. package/dist/validation/index.js.map +1 -0
  101. package/dist/web/index.cjs +3994 -0
  102. package/dist/web/index.cjs.map +1 -0
  103. package/dist/web/index.d.cts +203 -0
  104. package/dist/web/index.d.ts +203 -0
  105. package/dist/web/index.js +3987 -0
  106. package/dist/web/index.js.map +1 -0
  107. package/package.json +211 -0
@@ -0,0 +1,3994 @@
1
+ 'use strict';
2
+
3
+ // src/internal/input-sanitization.ts
4
+ var FORMAT_OR_NOT_ASSIGNED = /[\p{Cf}\p{Cn}]/u;
5
+ var SPACE_SEPARATOR = /[\p{Zs}\p{Zl}\p{Zp}]/u;
6
+ var CONTROL = /\p{Cc}/u;
7
+ function sanitizeInput(input) {
8
+ let out = "";
9
+ for (const c of input) {
10
+ if (c === "\u2018" || c === "\u2019" || c === "\u201A" || c === "\u201B") {
11
+ out += "'";
12
+ continue;
13
+ }
14
+ if (c === "\u201C" || c === "\u201D" || c === "\u201E" || c === "\u201F" || c === "\xAB" || c === "\xBB") {
15
+ out += '"';
16
+ continue;
17
+ }
18
+ if (FORMAT_OR_NOT_ASSIGNED.test(c)) {
19
+ continue;
20
+ }
21
+ if (CONTROL.test(c)) {
22
+ if (c === " " || c === "\n" || c === "\r") out += " ";
23
+ continue;
24
+ }
25
+ if (SPACE_SEPARATOR.test(c)) {
26
+ out += " ";
27
+ continue;
28
+ }
29
+ out += c;
30
+ }
31
+ return out;
32
+ }
33
+ var DEFAULT_UI_CULTURE = "sv-SE";
34
+ var state = {
35
+ uiCulture: DEFAULT_UI_CULTURE};
36
+ var PrimitivesDefaults = {
37
+ /**
38
+ * `true` when {@link uiCulture} is Swedish (`sv` or `sv-*`).
39
+ * Types use this to select between localized and English display names.
40
+ */
41
+ get useLocalizedDisplayNames() {
42
+ const lang = state.uiCulture.toLowerCase().split("-")[0];
43
+ return lang === "sv";
44
+ }};
45
+
46
+ // src/text-scanning/text-candidate-category.ts
47
+ var TextCandidateCategory = {
48
+ Contact: "Contact",
49
+ Geography: "Geography"};
50
+
51
+ // src/text-scanning/text-candidate.ts
52
+ var TextCandidate = class {
53
+ /** Zero-based start position in the scanned text. */
54
+ startIndex;
55
+ /** Number of characters in the original matched span. */
56
+ length;
57
+ /** The raw substring from the input text that was matched. */
58
+ originalText;
59
+ /**
60
+ * Short type name, e.g. `EmailAddress` or `SwedishPersonalIdentityNumber`.
61
+ */
62
+ typeName;
63
+ /** Broad category of the matched type. */
64
+ category;
65
+ /** Machine-comparable canonical form of the matched value. */
66
+ normalizedForm;
67
+ /** Human-readable display form of the matched value. */
68
+ formattedForm;
69
+ /**
70
+ * Display form with sensitive content masked (e.g. `990807-****`).
71
+ * Produced by the type's `toMaskedString()` helper.
72
+ */
73
+ maskedForm;
74
+ /** Heuristic confidence level. */
75
+ confidence;
76
+ /** The successfully parsed instance of the matched type. */
77
+ value;
78
+ constructor(opts) {
79
+ this.startIndex = opts.startIndex;
80
+ this.length = opts.length;
81
+ this.originalText = opts.originalText;
82
+ this.typeName = opts.typeName;
83
+ this.category = opts.category;
84
+ this.normalizedForm = opts.normalizedForm;
85
+ this.formattedForm = opts.formattedForm;
86
+ this.maskedForm = opts.maskedForm;
87
+ this.confidence = opts.confidence;
88
+ this.value = opts.value;
89
+ }
90
+ /** Exclusive end position (`startIndex + length`). */
91
+ get endIndex() {
92
+ return this.startIndex + this.length;
93
+ }
94
+ /** Returns `true` if this candidate's span overlaps with `other`. */
95
+ overlaps(other) {
96
+ return this.startIndex < other.endIndex && other.startIndex < this.endIndex;
97
+ }
98
+ /** Returns `true` if this candidate's span fully contains `other`. */
99
+ contains(other) {
100
+ return this.startIndex <= other.startIndex && this.endIndex >= other.endIndex;
101
+ }
102
+ };
103
+
104
+ // src/text-scanning/text-match-confidence.ts
105
+ var TextMatchConfidence = {
106
+ /**
107
+ * Pattern match only. High false-positive risk — the matched text merely
108
+ * fits a syntactic pattern (e.g. a run of digits that happens to be the
109
+ * right length).
110
+ */
111
+ Low: 0,
112
+ /**
113
+ * Strong match with checksum or format-specific validation (e.g. a personal
114
+ * identity number with a valid Luhn check digit and plausible date, or an
115
+ * IBAN with valid MOD-97).
116
+ */
117
+ High: 2
118
+ };
119
+
120
+ // src/finance/currency.ts
121
+ var KNOWN_CURRENCIES = [
122
+ { code: "SEK", en: "Swedish krona", sv: "Svensk krona", symbol: "kr", decimalPlaces: 2 },
123
+ { code: "NOK", en: "Norwegian krone", sv: "Norsk krona", symbol: "kr", decimalPlaces: 2 },
124
+ { code: "DKK", en: "Danish krone", sv: "Dansk krona", symbol: "kr", decimalPlaces: 2 },
125
+ { code: "ISK", en: "Icelandic kr\xF3na", sv: "Isl\xE4ndsk krona", symbol: "kr", decimalPlaces: 0 },
126
+ { code: "EUR", en: "Euro", sv: "Euro", symbol: "\u20AC", decimalPlaces: 2 },
127
+ {
128
+ code: "USD",
129
+ en: "United States dollar",
130
+ sv: "Amerikansk dollar",
131
+ symbol: "$",
132
+ decimalPlaces: 2
133
+ },
134
+ { code: "GBP", en: "Pound sterling", sv: "Brittiskt pund", symbol: "\xA3", decimalPlaces: 2 },
135
+ { code: "CHF", en: "Swiss franc", sv: "Schweizisk franc", symbol: "CHF", decimalPlaces: 2 },
136
+ { code: "JPY", en: "Japanese yen", sv: "Japansk yen", symbol: "\xA5", decimalPlaces: 0 },
137
+ { code: "CNY", en: "Chinese yuan", sv: "Kinesisk yuan", symbol: "\xA5", decimalPlaces: 2 },
138
+ { code: "CAD", en: "Canadian dollar", sv: "Kanadensisk dollar", symbol: "CA$", decimalPlaces: 2 },
139
+ { code: "AUD", en: "Australian dollar", sv: "Australisk dollar", symbol: "A$", decimalPlaces: 2 },
140
+ {
141
+ code: "NZD",
142
+ en: "New Zealand dollar",
143
+ sv: "Nyzeel\xE4ndsk dollar",
144
+ symbol: "NZ$",
145
+ decimalPlaces: 2
146
+ },
147
+ { code: "PLN", en: "Polish z\u0142oty", sv: "Polsk zloty", symbol: "z\u0142", decimalPlaces: 2 },
148
+ { code: "CZK", en: "Czech koruna", sv: "Tjeckisk koruna", symbol: "K\u010D", decimalPlaces: 2 },
149
+ { code: "HUF", en: "Hungarian forint", sv: "Ungersk forint", symbol: "Ft", decimalPlaces: 2 },
150
+ { code: "RON", en: "Romanian leu", sv: "Rum\xE4nsk leu", symbol: "lei", decimalPlaces: 2 },
151
+ { code: "BGN", en: "Bulgarian lev", sv: "Bulgarisk lev", symbol: "\u043B\u0432", decimalPlaces: 2 },
152
+ { code: "HRK", en: "Croatian kuna", sv: "Kroatisk kuna", symbol: "kn", decimalPlaces: 2 },
153
+ { code: "TRY", en: "Turkish lira", sv: "Turkisk lira", symbol: "\u20BA", decimalPlaces: 2 },
154
+ { code: "RUB", en: "Russian ruble", sv: "Rysk rubel", symbol: "\u20BD", decimalPlaces: 2 },
155
+ { code: "INR", en: "Indian rupee", sv: "Indisk rupie", symbol: "\u20B9", decimalPlaces: 2 },
156
+ { code: "BRL", en: "Brazilian real", sv: "Brasiliansk real", symbol: "R$", decimalPlaces: 2 },
157
+ { code: "ZAR", en: "South African rand", sv: "Sydafrikansk rand", symbol: "R", decimalPlaces: 2 },
158
+ { code: "MXN", en: "Mexican peso", sv: "Mexikansk peso", symbol: "MX$", decimalPlaces: 2 },
159
+ {
160
+ code: "SGD",
161
+ en: "Singapore dollar",
162
+ sv: "Singaporiansk dollar",
163
+ symbol: "S$",
164
+ decimalPlaces: 2
165
+ },
166
+ { code: "HKD", en: "Hong Kong dollar", sv: "Hongkongdollar", symbol: "HK$", decimalPlaces: 2 },
167
+ { code: "KRW", en: "South Korean won", sv: "Sydkoreansk won", symbol: "\u20A9", decimalPlaces: 0 },
168
+ { code: "THB", en: "Thai baht", sv: "Thail\xE4ndsk baht", symbol: "\u0E3F", decimalPlaces: 2 },
169
+ {
170
+ code: "TWD",
171
+ en: "New Taiwan dollar",
172
+ sv: "Taiwanesisk dollar",
173
+ symbol: "NT$",
174
+ decimalPlaces: 2
175
+ },
176
+ { code: "ILS", en: "Israeli new shekel", sv: "Israelisk shekel", symbol: "\u20AA", decimalPlaces: 2 },
177
+ {
178
+ code: "AED",
179
+ en: "United Arab Emirates dirham",
180
+ sv: "Emiratisk dirham",
181
+ symbol: "\u062F.\u0625",
182
+ decimalPlaces: 2
183
+ },
184
+ { code: "SAR", en: "Saudi riyal", sv: "Saudisk riyal", symbol: "\uFDFC", decimalPlaces: 2 },
185
+ { code: "PHP", en: "Philippine peso", sv: "Filippinsk peso", symbol: "\u20B1", decimalPlaces: 2 },
186
+ { code: "IDR", en: "Indonesian rupiah", sv: "Indonesisk rupiah", symbol: "Rp", decimalPlaces: 2 },
187
+ { code: "MYR", en: "Malaysian ringgit", sv: "Malaysisk ringgit", symbol: "RM", decimalPlaces: 2 },
188
+ { code: "VND", en: "Vietnamese \u0111\u1ED3ng", sv: "Vietnamesisk dong", symbol: "\u20AB", decimalPlaces: 0 },
189
+ { code: "UAH", en: "Ukrainian hryvnia", sv: "Ukrainsk hryvnia", symbol: "\u20B4", decimalPlaces: 2 },
190
+ { code: "EGP", en: "Egyptian pound", sv: "Egyptiskt pund", symbol: "E\xA3", decimalPlaces: 2 },
191
+ { code: "NGN", en: "Nigerian naira", sv: "Nigeriansk naira", symbol: "\u20A6", decimalPlaces: 2 },
192
+ { code: "KES", en: "Kenyan shilling", sv: "Kenyansk shilling", symbol: "KSh", decimalPlaces: 2 },
193
+ { code: "COP", en: "Colombian peso", sv: "Colombiansk peso", symbol: "CO$", decimalPlaces: 2 },
194
+ { code: "ARS", en: "Argentine peso", sv: "Argentinsk peso", symbol: "AR$", decimalPlaces: 2 },
195
+ { code: "CLP", en: "Chilean peso", sv: "Chilensk peso", symbol: "CL$", decimalPlaces: 0 },
196
+ { code: "PEN", en: "Peruvian sol", sv: "Peruansk sol", symbol: "S/.", decimalPlaces: 2 }
197
+ ];
198
+ var Currency = class _Currency {
199
+ static typeInfo = Object.freeze({
200
+ englishName: "Currency",
201
+ localizedName: "Valuta",
202
+ emoji: "\u{1F4B1}",
203
+ sources: Object.freeze([
204
+ "https://www.iso.org/iso-4217-currency-codes.html",
205
+ "https://en.wikipedia.org/wiki/ISO_4217"
206
+ ])
207
+ });
208
+ code;
209
+ englishName;
210
+ localizedName;
211
+ symbol;
212
+ decimalPlaces;
213
+ constructor(row) {
214
+ this.code = row.code;
215
+ this.englishName = row.en;
216
+ this.localizedName = row.sv;
217
+ this.symbol = row.symbol;
218
+ this.decimalPlaces = row.decimalPlaces;
219
+ }
220
+ /** @internal */
221
+ static _fromRow(row) {
222
+ return new _Currency(row);
223
+ }
224
+ /** Display name in current UI culture (Swedish or English). */
225
+ /**
226
+ * The currency name as used in its issuing country. Falls back to
227
+ * {@link englishName} when no issuing country is known.
228
+ */
229
+ get nativeName() {
230
+ const country = Country.all.find(
231
+ (c) => c.currencyCode != null && c.currencyCode.toUpperCase() === this.code.toUpperCase()
232
+ );
233
+ if (country === void 0) return this.englishName;
234
+ return country.nativeName === country.englishName ? this.englishName : this.localizedName;
235
+ }
236
+ get displayName() {
237
+ return PrimitivesDefaults.useLocalizedDisplayNames ? this.localizedName : this.englishName;
238
+ }
239
+ static tryParse(input) {
240
+ if (input == null || input.trim() === "") return null;
241
+ const trimmed = sanitizeInput(input).trim();
242
+ const byCode = BY_CODE.get(trimmed.toUpperCase());
243
+ if (byCode) return byCode;
244
+ const byName = BY_NAME.get(trimmed.toLowerCase());
245
+ if (byName) return byName;
246
+ return null;
247
+ }
248
+ static parse(input) {
249
+ const r = _Currency.tryParse(input);
250
+ if (r === null) throw new Error("Unknown currency.");
251
+ return r;
252
+ }
253
+ static isValid(input) {
254
+ return _Currency.tryParse(input) !== null;
255
+ }
256
+ static format(input, options) {
257
+ const r = _Currency.tryParse(input);
258
+ if (r) return r.displayName;
259
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== "") {
260
+ return input.trim();
261
+ }
262
+ return null;
263
+ }
264
+ static normalize(input, options) {
265
+ const r = _Currency.tryParse(input);
266
+ if (r) return r.code;
267
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== "") {
268
+ return input.trim();
269
+ }
270
+ return null;
271
+ }
272
+ static isNormalized(input) {
273
+ return input != null && _Currency.normalize(input) === input;
274
+ }
275
+ /** All known currencies. */
276
+ static get all() {
277
+ return ALL_CURRENCIES;
278
+ }
279
+ /** @internal Lookup by symbol. */
280
+ static tryParseSymbol(symbol) {
281
+ if (symbol == null || symbol.trim() === "") return null;
282
+ return BY_SYMBOL.get(symbol.trim().toLowerCase()) ?? null;
283
+ }
284
+ toNormalizedString() {
285
+ return this.code;
286
+ }
287
+ toString() {
288
+ return this.displayName;
289
+ }
290
+ toDisplayString() {
291
+ return this.displayName;
292
+ }
293
+ toEnglishString() {
294
+ return this.englishName;
295
+ }
296
+ toNativeString() {
297
+ return this.nativeName;
298
+ }
299
+ equals(other) {
300
+ return other != null && this.code === other.code;
301
+ }
302
+ compareTo(other) {
303
+ if (other == null) return 1;
304
+ return this.code < other.code ? -1 : this.code > other.code ? 1 : 0;
305
+ }
306
+ static get SEK() {
307
+ return BY_CODE.get("SEK");
308
+ }
309
+ static get EUR() {
310
+ return BY_CODE.get("EUR");
311
+ }
312
+ static get USD() {
313
+ return BY_CODE.get("USD");
314
+ }
315
+ static get NOK() {
316
+ return BY_CODE.get("NOK");
317
+ }
318
+ static get DKK() {
319
+ return BY_CODE.get("DKK");
320
+ }
321
+ static get GBP() {
322
+ return BY_CODE.get("GBP");
323
+ }
324
+ };
325
+ var ALL_CURRENCIES = KNOWN_CURRENCIES.map((r) => Currency._fromRow(r));
326
+ var BY_CODE = /* @__PURE__ */ new Map();
327
+ for (const c of ALL_CURRENCIES) BY_CODE.set(c.code.toUpperCase(), c);
328
+ var BY_NAME = /* @__PURE__ */ new Map();
329
+ for (const c of ALL_CURRENCIES) {
330
+ BY_NAME.set(c.englishName.toLowerCase(), c);
331
+ BY_NAME.set(c.localizedName.toLowerCase(), c);
332
+ }
333
+ var BY_SYMBOL = /* @__PURE__ */ new Map();
334
+ for (const c of ALL_CURRENCIES) {
335
+ if (!BY_SYMBOL.has(c.symbol.toLowerCase())) BY_SYMBOL.set(c.symbol.toLowerCase(), c);
336
+ }
337
+
338
+ // src/geography/geo-coordinate.ts
339
+ var GeoCoordinate = class _GeoCoordinate {
340
+ static typeInfo = Object.freeze({
341
+ englishName: "Geographic Coordinate",
342
+ localizedName: "Geografisk koordinat",
343
+ emoji: "\u{1F4CD}",
344
+ sources: Object.freeze([
345
+ "https://en.wikipedia.org/wiki/Geographic_coordinate_system",
346
+ "https://epsg.io/4326"
347
+ ])
348
+ });
349
+ latitude;
350
+ longitude;
351
+ constructor(latitude, longitude) {
352
+ this.latitude = latitude;
353
+ this.longitude = longitude;
354
+ }
355
+ /** @internal */
356
+ static _unsafe(latitude, longitude) {
357
+ return new _GeoCoordinate(latitude, longitude);
358
+ }
359
+ get latitudeDirection() {
360
+ return this.latitude >= 0 ? "N" : "S";
361
+ }
362
+ get longitudeDirection() {
363
+ return this.longitude >= 0 ? "E" : "W";
364
+ }
365
+ /** Creates a coordinate from explicit latitude and longitude values. */
366
+ static create(latitude, longitude) {
367
+ if (!Number.isFinite(latitude) || latitude < -90 || latitude > 90) {
368
+ throw new RangeError("Latitude must be between -90 and 90.");
369
+ }
370
+ if (!Number.isFinite(longitude) || longitude < -180 || longitude > 180) {
371
+ throw new RangeError("Longitude must be between -180 and 180.");
372
+ }
373
+ return _GeoCoordinate._unsafe(latitude, longitude);
374
+ }
375
+ static tryParse(input) {
376
+ if (input == null || input.trim() === "") return null;
377
+ const sanitized = sanitizeInput(input).trim();
378
+ if (sanitized.length === 0 || sanitized.length > 200) return null;
379
+ let m;
380
+ m = sanitized.match(DECIMAL_DEGREES);
381
+ if (m) return tryDecimal(m.groups.lat, m.groups.lon);
382
+ m = sanitized.match(SPACE_SEPARATED);
383
+ if (m) return tryDecimal(m.groups.lat, m.groups.lon);
384
+ m = sanitized.match(DECIMAL_CARDINAL_SUFFIX);
385
+ if (m) {
386
+ return tryDecimalCardinal(
387
+ m.groups.lat,
388
+ m.groups.latDir,
389
+ m.groups.lon,
390
+ m.groups.lonDir
391
+ );
392
+ }
393
+ m = sanitized.match(CARDINAL_PREFIX);
394
+ if (m) {
395
+ return tryDecimalCardinal(
396
+ m.groups.lat,
397
+ m.groups.latDir,
398
+ m.groups.lon,
399
+ m.groups.lonDir
400
+ );
401
+ }
402
+ m = sanitized.match(DMS);
403
+ if (m) return tryDms(m.groups);
404
+ m = sanitized.match(DDM);
405
+ if (m) return tryDdm(m.groups);
406
+ return null;
407
+ }
408
+ static parse(input) {
409
+ const r = _GeoCoordinate.tryParse(input);
410
+ if (r === null) throw new Error("Invalid geographic coordinate.");
411
+ return r;
412
+ }
413
+ static isValid(input) {
414
+ return _GeoCoordinate.tryParse(input) !== null;
415
+ }
416
+ static format(input, options) {
417
+ const r = _GeoCoordinate.tryParse(input);
418
+ if (r) return r.toString();
419
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== "") {
420
+ return input.trim();
421
+ }
422
+ return null;
423
+ }
424
+ static normalize(input, options) {
425
+ const r = _GeoCoordinate.tryParse(input);
426
+ if (r) return r.toNormalizedString();
427
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null) {
428
+ const trimmed = input.trim();
429
+ return trimmed.length > 0 ? trimmed : null;
430
+ }
431
+ return null;
432
+ }
433
+ static isNormalized(input) {
434
+ return input != null && _GeoCoordinate.normalize(input) === input;
435
+ }
436
+ toNormalizedString() {
437
+ return `${formatNumber(this.latitude)}, ${formatNumber(this.longitude)}`;
438
+ }
439
+ toString() {
440
+ return `${formatNumber(Math.abs(this.latitude))}\xB0${this.latitudeDirection}, ${formatNumber(Math.abs(this.longitude))}\xB0${this.longitudeDirection}`;
441
+ }
442
+ /** Returns the coordinate in degrees, minutes, and seconds, e.g. `59°19'45.5"N, 18°4'7"E`. */
443
+ toDmsString() {
444
+ const [latDeg, latMin, latSec] = toDmsParts(Math.abs(this.latitude));
445
+ const [lonDeg, lonMin, lonSec] = toDmsParts(Math.abs(this.longitude));
446
+ return `${latDeg}\xB0${latMin}'${formatSeconds(latSec)}"${this.latitudeDirection}, ${lonDeg}\xB0${lonMin}'${formatSeconds(lonSec)}"${this.longitudeDirection}`;
447
+ }
448
+ /** Distance in kilometers (Haversine) between two coordinates. */
449
+ static distanceKilometers(a, b) {
450
+ return haversineKm(a, b);
451
+ }
452
+ /** Returns true if coordinates `a` and `b` are within `radiusKm` kilometers of each other. */
453
+ static isWithinKilometers(a, b, radiusKm) {
454
+ return _GeoCoordinate.distanceKilometers(a, b) <= radiusKm;
455
+ }
456
+ /** Distance in kilometers from this coordinate to `other`. */
457
+ distanceKilometersTo(other) {
458
+ return haversineKm(this, other);
459
+ }
460
+ /**
461
+ * Returns true if `other` is within `radiusKm` kilometers of this
462
+ * coordinate (inclusive).
463
+ */
464
+ isWithinKilometers(other, radiusKm) {
465
+ return this.distanceKilometersTo(other) <= radiusKm;
466
+ }
467
+ equals(other) {
468
+ return other != null && this.latitude === other.latitude && this.longitude === other.longitude;
469
+ }
470
+ };
471
+ var DECIMAL_DEGREES = /^\s*\(?\s*(?<lat>[+-]?\d+(?:\.\d+)?)\s*[,;]\s*(?<lon>[+-]?\d+(?:\.\d+)?)\s*\)?\s*$/;
472
+ var SPACE_SEPARATED = /^\s*\(?\s*(?<lat>[+-]?\d+(?:\.\d+)?)\s+(?<lon>[+-]?\d+(?:\.\d+)?)\s*\)?\s*$/;
473
+ var DECIMAL_CARDINAL_SUFFIX = /^\s*\(?\s*(?<lat>\d+(?:\.\d+)?)\s*°?\s*(?<latDir>[NSns])\s*[,;\s]\s*(?<lon>\d+(?:\.\d+)?)\s*°?\s*(?<lonDir>[EWewÖöVv])\s*\)?\s*$/u;
474
+ var CARDINAL_PREFIX = /^\s*\(?\s*(?<latDir>[NSns])\s*(?<lat>\d+(?:\.\d+)?)\s*°?\s*[,;\s]\s*(?<lonDir>[EWewÖöVv])\s*(?<lon>\d+(?:\.\d+)?)\s*°?\s*\)?\s*$/u;
475
+ var DMS = /^\s*\(?\s*(?<latDeg>\d+)\s*°\s*(?<latMin>\d+)\s*[′']\s*(?<latSec>\d+(?:\.\d+)?)\s*[″"]\s*(?<latDir>[NSns])\s*[,;\s]\s*(?<lonDeg>\d+)\s*°\s*(?<lonMin>\d+)\s*[′']\s*(?<lonSec>\d+(?:\.\d+)?)\s*[″"]\s*(?<lonDir>[EWewÖöVv])\s*\)?\s*$/u;
476
+ var DDM = /^\s*\(?\s*(?<latDeg>\d+)\s*°\s*(?<latDecMin>\d+(?:\.\d+)?)\s*[′']\s*(?<latDir>[NSns])\s*[,;\s]\s*(?<lonDeg>\d+)\s*°\s*(?<lonDecMin>\d+(?:\.\d+)?)\s*[′']\s*(?<lonDir>[EWewÖöVv])\s*\)?\s*$/u;
477
+ function tryDecimal(latStr, lonStr) {
478
+ const lat = parseFloat(latStr);
479
+ const lon = parseFloat(lonStr);
480
+ if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null;
481
+ if (!isInRange(lat, lon)) return null;
482
+ return GeoCoordinate._unsafe(lat, lon);
483
+ }
484
+ function tryDecimalCardinal(latStr, latDir, lonStr, lonDir) {
485
+ const lat = applyLatDirection(parseFloat(latStr), latDir);
486
+ const lon = applyLonDirection(parseFloat(lonStr), lonDir);
487
+ if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null;
488
+ if (!isInRange(lat, lon)) return null;
489
+ return GeoCoordinate._unsafe(lat, lon);
490
+ }
491
+ function tryDms(g) {
492
+ const latDeg = parseFloat(g.latDeg);
493
+ const latMin = parseFloat(g.latMin);
494
+ const latSec = parseFloat(g.latSec);
495
+ const lonDeg = parseFloat(g.lonDeg);
496
+ const lonMin = parseFloat(g.lonMin);
497
+ const lonSec = parseFloat(g.lonSec);
498
+ if (latMin >= 60 || latSec >= 60 || lonMin >= 60 || lonSec >= 60) return null;
499
+ let lat = round8(latDeg + latMin / 60 + latSec / 3600);
500
+ let lon = round8(lonDeg + lonMin / 60 + lonSec / 3600);
501
+ lat = applyLatDirection(lat, g.latDir);
502
+ lon = applyLonDirection(lon, g.lonDir);
503
+ if (!isInRange(lat, lon)) return null;
504
+ return GeoCoordinate._unsafe(lat, lon);
505
+ }
506
+ function tryDdm(g) {
507
+ const latDeg = parseFloat(g.latDeg);
508
+ const latDecMin = parseFloat(g.latDecMin);
509
+ const lonDeg = parseFloat(g.lonDeg);
510
+ const lonDecMin = parseFloat(g.lonDecMin);
511
+ if (latDecMin >= 60 || lonDecMin >= 60) return null;
512
+ let lat = round8(latDeg + latDecMin / 60);
513
+ let lon = round8(lonDeg + lonDecMin / 60);
514
+ lat = applyLatDirection(lat, g.latDir);
515
+ lon = applyLonDirection(lon, g.lonDir);
516
+ if (!isInRange(lat, lon)) return null;
517
+ return GeoCoordinate._unsafe(lat, lon);
518
+ }
519
+ function applyLatDirection(lat, dir) {
520
+ return dir.toUpperCase() === "S" ? -lat : lat;
521
+ }
522
+ function applyLonDirection(lon, dir) {
523
+ const u = dir.toUpperCase();
524
+ return u === "W" || u === "V" ? -lon : lon;
525
+ }
526
+ function isInRange(lat, lon) {
527
+ return lat >= -90 && lat <= 90 && lon >= -180 && lon <= 180;
528
+ }
529
+ function round8(v) {
530
+ return Math.round(v * 1e8) / 1e8;
531
+ }
532
+ function toDmsParts(dd) {
533
+ const degrees = Math.trunc(dd);
534
+ const fracMinutes = (dd - degrees) * 60;
535
+ const minutes = Math.trunc(fracMinutes);
536
+ const seconds = Math.round((fracMinutes - minutes) * 600) / 10;
537
+ return [degrees, minutes, seconds];
538
+ }
539
+ function formatNumber(value) {
540
+ return value.toString();
541
+ }
542
+ function formatSeconds(seconds) {
543
+ if (Number.isInteger(seconds)) return seconds.toString();
544
+ return seconds.toString().replace(/(\.\d*?)0+$/, "$1");
545
+ }
546
+ function haversineKm(a, b) {
547
+ const R = 6371;
548
+ const dLat = toRadians(b.latitude - a.latitude);
549
+ const dLon = toRadians(b.longitude - a.longitude);
550
+ const lat1 = toRadians(a.latitude);
551
+ const lat2 = toRadians(b.latitude);
552
+ const h = Math.sin(dLat / 2) ** 2 + Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon / 2) ** 2;
553
+ return R * 2 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h));
554
+ }
555
+ function toRadians(degrees) {
556
+ return degrees * (Math.PI / 180);
557
+ }
558
+
559
+ // src/geography/language.ts
560
+ var TextDirection = {
561
+ LeftToRight: "LeftToRight",
562
+ RightToLeft: "RightToLeft"
563
+ };
564
+ var WritingScript = {
565
+ Unknown: "Unknown",
566
+ Latin: "Latin",
567
+ Cyrillic: "Cyrillic",
568
+ Arabic: "Arabic",
569
+ Greek: "Greek",
570
+ Hebrew: "Hebrew",
571
+ Devanagari: "Devanagari",
572
+ Bengali: "Bengali",
573
+ Gurmukhi: "Gurmukhi",
574
+ Gujarati: "Gujarati",
575
+ Oriya: "Oriya",
576
+ Tamil: "Tamil",
577
+ Telugu: "Telugu",
578
+ Kannada: "Kannada",
579
+ Malayalam: "Malayalam",
580
+ Sinhala: "Sinhala",
581
+ Thai: "Thai",
582
+ Lao: "Lao",
583
+ Tibetan: "Tibetan",
584
+ Myanmar: "Myanmar",
585
+ Georgian: "Georgian",
586
+ Hangul: "Hangul",
587
+ Ethiopic: "Ethiopic",
588
+ Canadian: "Canadian",
589
+ Khmer: "Khmer",
590
+ Han: "Han",
591
+ Armenian: "Armenian",
592
+ Thaana: "Thaana"
593
+ };
594
+ var MAX_INPUT_LENGTH = 100;
595
+ var Language = class _Language {
596
+ static typeInfo = Object.freeze({
597
+ englishName: "Language",
598
+ localizedName: "Spr\xE5k",
599
+ emoji: "\u{1F5E3}\uFE0F",
600
+ sources: Object.freeze([
601
+ "https://www.loc.gov/standards/iso639-2/php/code_list.php",
602
+ "https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes",
603
+ "https://iso639-3.sil.org/"
604
+ ])
605
+ });
606
+ alpha2Code;
607
+ alpha3Code;
608
+ englishName;
609
+ localizedName;
610
+ nativeName;
611
+ script;
612
+ direction;
613
+ constructor(alpha2, alpha3, en, sv, native, script, direction) {
614
+ this.alpha2Code = alpha2;
615
+ this.alpha3Code = alpha3;
616
+ this.englishName = en;
617
+ this.localizedName = sv;
618
+ this.nativeName = native;
619
+ this.script = script;
620
+ this.direction = direction;
621
+ }
622
+ get displayName() {
623
+ return PrimitivesDefaults.useLocalizedDisplayNames ? this.localizedName : this.englishName;
624
+ }
625
+ get value() {
626
+ return this.alpha2Code;
627
+ }
628
+ /** @internal Used by Country and other types. */
629
+ static _create(alpha2, alpha3, en, sv, native, script, direction = TextDirection.LeftToRight) {
630
+ return new _Language(alpha2, alpha3, en, sv, native, script, direction);
631
+ }
632
+ static tryParse(input) {
633
+ if (input == null || input.trim() === "") return null;
634
+ const trimmed = sanitizeInput(input).trim();
635
+ if (trimmed.length === 0 || trimmed.length > MAX_INPUT_LENGTH) return null;
636
+ const lower = trimmed.toLowerCase();
637
+ return BY_KEY.get(lower) ?? null;
638
+ }
639
+ static parse(input) {
640
+ const r = _Language.tryParse(input);
641
+ if (r === null) throw new Error("Unknown language.");
642
+ return r;
643
+ }
644
+ static isValid(input) {
645
+ return _Language.tryParse(input) !== null;
646
+ }
647
+ static format(input, options) {
648
+ const r = _Language.tryParse(input);
649
+ if (r) return r.displayName;
650
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== "") {
651
+ return input.trim();
652
+ }
653
+ return null;
654
+ }
655
+ static normalize(input, options) {
656
+ const r = _Language.tryParse(input);
657
+ if (r) return r.alpha2Code;
658
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null) {
659
+ const trimmed = input.trim();
660
+ return trimmed.length > 0 ? trimmed : null;
661
+ }
662
+ return null;
663
+ }
664
+ static isNormalized(input) {
665
+ return input != null && _Language.normalize(input) === input;
666
+ }
667
+ toNormalizedString() {
668
+ return this.alpha2Code;
669
+ }
670
+ toDisplayString() {
671
+ return this.displayName;
672
+ }
673
+ toEnglishString() {
674
+ return this.englishName;
675
+ }
676
+ toNativeString() {
677
+ return this.nativeName;
678
+ }
679
+ toString() {
680
+ return this.displayName;
681
+ }
682
+ equals(other) {
683
+ return other != null && this.alpha2Code === other.alpha2Code;
684
+ }
685
+ compareTo(other) {
686
+ if (other == null) return 1;
687
+ return this.alpha2Code < other.alpha2Code ? -1 : this.alpha2Code > other.alpha2Code ? 1 : 0;
688
+ }
689
+ /** All recognized ISO 639-1 languages. */
690
+ static get all() {
691
+ return ALL;
692
+ }
693
+ // Frequently used language constants — populated below ALL.
694
+ static Afrikaans;
695
+ static Albanian;
696
+ static Arabic;
697
+ static Bulgarian;
698
+ static Catalan;
699
+ static Chinese;
700
+ static Croatian;
701
+ static Czech;
702
+ static Danish;
703
+ static Dutch;
704
+ static English;
705
+ static Estonian;
706
+ static Faroese;
707
+ static Finnish;
708
+ static French;
709
+ static German;
710
+ static Greek;
711
+ static Hindi;
712
+ static Hungarian;
713
+ static Icelandic;
714
+ static Italian;
715
+ static Japanese;
716
+ static Korean;
717
+ static Latvian;
718
+ static Lithuanian;
719
+ static NorthernSami;
720
+ static Norwegian;
721
+ static NorwegianBokmal;
722
+ static NorwegianNynorsk;
723
+ static Polish;
724
+ static Portuguese;
725
+ static Romanian;
726
+ static Russian;
727
+ static Slovak;
728
+ static Slovenian;
729
+ static Spanish;
730
+ static Swahili;
731
+ static Swedish;
732
+ static Turkish;
733
+ static Ukrainian;
734
+ };
735
+ var L = Language._create;
736
+ var ALL = Object.freeze([
737
+ L("aa", "aar", "Afar", "Afar", "Afaraf", WritingScript.Latin),
738
+ L("ab", "abk", "Abkhazian", "Abchaziska", "\u0410\u04A7\u0441\u0443\u0430", WritingScript.Cyrillic),
739
+ L("af", "afr", "Afrikaans", "Afrikaans", "Afrikaans", WritingScript.Latin),
740
+ L("ak", "aka", "Akan", "Akan", "Akan", WritingScript.Latin),
741
+ L("am", "amh", "Amharic", "Amhariska", "\u12A0\u121B\u122D\u129B", WritingScript.Ethiopic),
742
+ L("an", "arg", "Aragonese", "Aragonesiska", "Aragon\xE9s", WritingScript.Latin),
743
+ L("ar", "ara", "Arabic", "Arabiska", "\u0627\u0644\u0639\u0631\u0628\u064A\u0629", WritingScript.Arabic, TextDirection.RightToLeft),
744
+ L("as", "asm", "Assamese", "Assamesiska", "\u0985\u09B8\u09AE\u09C0\u09AF\u09BC\u09BE", WritingScript.Bengali),
745
+ L("av", "ava", "Avaric", "Avariska", "\u0410\u0432\u0430\u0440", WritingScript.Cyrillic),
746
+ L("ay", "aym", "Aymara", "Aymara", "Aymar", WritingScript.Latin),
747
+ L("az", "aze", "Azerbaijani", "Azerbajdzjanska", "Az\u0259rbaycan", WritingScript.Latin),
748
+ L("ba", "bak", "Bashkir", "Basjkiriska", "\u0411\u0430\u0448\u04A1\u043E\u0440\u0442", WritingScript.Cyrillic),
749
+ L("be", "bel", "Belarusian", "Vitryska", "\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u043A\u0430\u044F", WritingScript.Cyrillic),
750
+ L("bg", "bul", "Bulgarian", "Bulgariska", "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438", WritingScript.Cyrillic),
751
+ L("bh", "bih", "Bihari", "Bihari", "\u092D\u094B\u091C\u092A\u0941\u0930\u0940", WritingScript.Devanagari),
752
+ L("bi", "bis", "Bislama", "Bislama", "Bislama", WritingScript.Latin),
753
+ L("bm", "bam", "Bambara", "Bambara", "Bamanankan", WritingScript.Latin),
754
+ L("bn", "ben", "Bengali", "Bengali", "\u09AC\u09BE\u0982\u09B2\u09BE", WritingScript.Bengali),
755
+ L("bo", "bod", "Tibetan", "Tibetanska", "\u0F56\u0F7C\u0F51\u0F0B\u0F61\u0F72\u0F42", WritingScript.Tibetan),
756
+ L("br", "bre", "Breton", "Bretonska", "Brezhoneg", WritingScript.Latin),
757
+ L("bs", "bos", "Bosnian", "Bosniska", "Bosanski", WritingScript.Latin),
758
+ L("ca", "cat", "Catalan", "Katalanska", "Catal\xE0", WritingScript.Latin),
759
+ L("ce", "che", "Chechen", "Tjetjenska", "\u041D\u043E\u0445\u0447\u0438\u0439\u043D", WritingScript.Cyrillic),
760
+ L("ch", "cha", "Chamorro", "Chamorro", "Chamoru", WritingScript.Latin),
761
+ L("co", "cos", "Corsican", "Korsikanska", "Corsu", WritingScript.Latin),
762
+ L("cr", "cre", "Cree", "Cree", "\u14C0\u1426\u1403\u152D\u140D\u140F\u1423", WritingScript.Canadian),
763
+ L("cs", "ces", "Czech", "Tjeckiska", "\u010Ce\u0161tina", WritingScript.Latin),
764
+ L("cu", "chu", "Church Slavonic", "Kyrkoslaviska", "\u0421\u043B\u043E\u0432\u0463\u043D\u044C\u0441\u043A\u044A", WritingScript.Cyrillic),
765
+ L("cv", "chv", "Chuvash", "Tjuvasjiska", "\u0427\u04D1\u0432\u0430\u0448", WritingScript.Cyrillic),
766
+ L("cy", "cym", "Welsh", "Walesiska", "Cymraeg", WritingScript.Latin),
767
+ L("da", "dan", "Danish", "Danska", "Dansk", WritingScript.Latin),
768
+ L("de", "deu", "German", "Tyska", "Deutsch", WritingScript.Latin),
769
+ L("dv", "div", "Divehi", "Divehi", "\u078B\u07A8\u0788\u07AC\u0780\u07A8", WritingScript.Thaana, TextDirection.RightToLeft),
770
+ L("dz", "dzo", "Dzongkha", "Dzongkha", "\u0F62\u0FAB\u0F7C\u0F44\u0F0B\u0F41", WritingScript.Tibetan),
771
+ L("ee", "ewe", "Ewe", "Ewe", "E\u028Begbe", WritingScript.Latin),
772
+ L("el", "ell", "Greek", "Grekiska", "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC", WritingScript.Greek),
773
+ L("en", "eng", "English", "Engelska", "English", WritingScript.Latin),
774
+ L("eo", "epo", "Esperanto", "Esperanto", "Esperanto", WritingScript.Latin),
775
+ L("es", "spa", "Spanish", "Spanska", "Espa\xF1ol", WritingScript.Latin),
776
+ L("et", "est", "Estonian", "Estniska", "Eesti", WritingScript.Latin),
777
+ L("eu", "eus", "Basque", "Baskiska", "Euskara", WritingScript.Latin),
778
+ L("fa", "fas", "Persian", "Persiska", "\u0641\u0627\u0631\u0633\u06CC", WritingScript.Arabic, TextDirection.RightToLeft),
779
+ L("ff", "ful", "Fulah", "Fulani", "Fulfulde", WritingScript.Latin),
780
+ L("fi", "fin", "Finnish", "Finska", "Suomi", WritingScript.Latin),
781
+ L("fj", "fij", "Fijian", "Fijianska", "Vosa Vakaviti", WritingScript.Latin),
782
+ L("fo", "fao", "Faroese", "F\xE4r\xF6iska", "F\xF8royskt", WritingScript.Latin),
783
+ L("fr", "fra", "French", "Franska", "Fran\xE7ais", WritingScript.Latin),
784
+ L("fy", "fry", "Western Frisian", "Frisiska", "Frysk", WritingScript.Latin),
785
+ L("ga", "gle", "Irish", "Iriska", "Gaeilge", WritingScript.Latin),
786
+ L("gd", "gla", "Scottish Gaelic", "Skotsk gaeliska", "G\xE0idhlig", WritingScript.Latin),
787
+ L("gl", "glg", "Galician", "Galiciska", "Galego", WritingScript.Latin),
788
+ L("gn", "grn", "Guarani", "Guaran\xED", "Ava\xF1e'\u1EBD", WritingScript.Latin),
789
+ L("gu", "guj", "Gujarati", "Gujarati", "\u0A97\u0AC1\u0A9C\u0AB0\u0ABE\u0AA4\u0AC0", WritingScript.Gujarati),
790
+ L("gv", "glv", "Manx", "Manx", "Gaelg", WritingScript.Latin),
791
+ L("ha", "hau", "Hausa", "Hausa", "Hausa", WritingScript.Latin),
792
+ L("he", "heb", "Hebrew", "Hebreiska", "\u05E2\u05D1\u05E8\u05D9\u05EA", WritingScript.Hebrew, TextDirection.RightToLeft),
793
+ L("hi", "hin", "Hindi", "Hindi", "\u0939\u093F\u0928\u094D\u0926\u0940", WritingScript.Devanagari),
794
+ L("ho", "hmo", "Hiri Motu", "Hiri Motu", "Hiri Motu", WritingScript.Latin),
795
+ L("hr", "hrv", "Croatian", "Kroatiska", "Hrvatski", WritingScript.Latin),
796
+ L("ht", "hat", "Haitian Creole", "Haitisk kreol", "Krey\xF2l Ayisyen", WritingScript.Latin),
797
+ L("hu", "hun", "Hungarian", "Ungerska", "Magyar", WritingScript.Latin),
798
+ L("hy", "hye", "Armenian", "Armeniska", "\u0540\u0561\u0575\u0565\u0580\u0565\u0576", WritingScript.Armenian),
799
+ L("ia", "ina", "Interlingua", "Interlingua", "Interlingua", WritingScript.Latin),
800
+ L("id", "ind", "Indonesian", "Indonesiska", "Bahasa Indonesia", WritingScript.Latin),
801
+ L("ie", "ile", "Interlingue", "Interlingue", "Interlingue", WritingScript.Latin),
802
+ L("ig", "ibo", "Igbo", "Igbo", "Igbo", WritingScript.Latin),
803
+ L("ii", "iii", "Sichuan Yi", "Yi", "\uA188\uA320\uA4A1", WritingScript.Unknown),
804
+ L("ik", "ipk", "Inupiaq", "Inupiaq", "I\xF1upiaq", WritingScript.Latin),
805
+ L("io", "ido", "Ido", "Ido", "Ido", WritingScript.Latin),
806
+ L("is", "isl", "Icelandic", "Isl\xE4ndska", "\xCDslenska", WritingScript.Latin),
807
+ L("it", "ita", "Italian", "Italienska", "Italiano", WritingScript.Latin),
808
+ L("iu", "iku", "Inuktitut", "Inuktitut", "\u1403\u14C4\u1483\u144E\u1450\u1466", WritingScript.Canadian),
809
+ L("ja", "jpn", "Japanese", "Japanska", "\u65E5\u672C\u8A9E", WritingScript.Han),
810
+ L("jv", "jav", "Javanese", "Javanesiska", "Basa Jawa", WritingScript.Latin),
811
+ L("ka", "kat", "Georgian", "Georgiska", "\u10E5\u10D0\u10E0\u10D7\u10E3\u10DA\u10D8", WritingScript.Georgian),
812
+ L("kg", "kon", "Kongo", "Kikongo", "KiKongo", WritingScript.Latin),
813
+ L("ki", "kik", "Kikuyu", "Kikuyu", "G\u0129k\u0169y\u0169", WritingScript.Latin),
814
+ L("kj", "kua", "Kuanyama", "Kuanyama", "Kuanyama", WritingScript.Latin),
815
+ L("kk", "kaz", "Kazakh", "Kazakiska", "\u049A\u0430\u0437\u0430\u049B\u0448\u0430", WritingScript.Cyrillic),
816
+ L("kl", "kal", "Kalaallisut", "Gr\xF6nl\xE4ndska", "Kalaallisut", WritingScript.Latin),
817
+ L("km", "khm", "Khmer", "Khmer", "\u1797\u17B6\u179F\u17B6\u1781\u17D2\u1798\u17C2\u179A", WritingScript.Khmer),
818
+ L("kn", "kan", "Kannada", "Kannada", "\u0C95\u0CA8\u0CCD\u0CA8\u0CA1", WritingScript.Kannada),
819
+ L("ko", "kor", "Korean", "Koreanska", "\uD55C\uAD6D\uC5B4", WritingScript.Hangul),
820
+ L("kr", "kau", "Kanuri", "Kanuri", "Kanuri", WritingScript.Latin),
821
+ L(
822
+ "ks",
823
+ "kas",
824
+ "Kashmiri",
825
+ "Kashmiri",
826
+ "\u0915\u0936\u094D\u092E\u0940\u0930\u0940",
827
+ WritingScript.Arabic,
828
+ TextDirection.RightToLeft
829
+ ),
830
+ L("ku", "kur", "Kurdish", "Kurdiska", "Kurd\xEE", WritingScript.Latin),
831
+ L("kv", "kom", "Komi", "Komi", "\u041A\u043E\u043C\u0438", WritingScript.Cyrillic),
832
+ L("kw", "cor", "Cornish", "Korniska", "Kernewek", WritingScript.Latin),
833
+ L("ky", "kir", "Kyrgyz", "Kirgiziska", "\u041A\u044B\u0440\u0433\u044B\u0437\u0447\u0430", WritingScript.Cyrillic),
834
+ L("la", "lat", "Latin", "Latin", "Latina", WritingScript.Latin),
835
+ L("lb", "ltz", "Luxembourgish", "Luxemburgiska", "L\xEBtzebuergesch", WritingScript.Latin),
836
+ L("lg", "lug", "Ganda", "Luganda", "Luganda", WritingScript.Latin),
837
+ L("li", "lim", "Limburgish", "Limburgiska", "Limburgs", WritingScript.Latin),
838
+ L("ln", "lin", "Lingala", "Lingala", "Ling\xE1la", WritingScript.Latin),
839
+ L("lo", "lao", "Lao", "Laotiska", "\u0E9E\u0EB2\u0EAA\u0EB2\u0EA5\u0EB2\u0EA7", WritingScript.Lao),
840
+ L("lt", "lit", "Lithuanian", "Litauiska", "Lietuvi\u0173", WritingScript.Latin),
841
+ L("lu", "lub", "Luba-Katanga", "Luba-Katanga", "Kiluba", WritingScript.Latin),
842
+ L("lv", "lav", "Latvian", "Lettiska", "Latvie\u0161u", WritingScript.Latin),
843
+ L("mg", "mlg", "Malagasy", "Malagassiska", "Malagasy", WritingScript.Latin),
844
+ L("mh", "mah", "Marshallese", "Marshallesiska", "Kajin M\u0327aje\u013C", WritingScript.Latin),
845
+ L("mi", "mri", "Maori", "Maori", "Te Reo M\u0101ori", WritingScript.Latin),
846
+ L("mk", "mkd", "Macedonian", "Makedonska", "\u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0441\u043A\u0438", WritingScript.Cyrillic),
847
+ L("ml", "mal", "Malayalam", "Malayalam", "\u0D2E\u0D32\u0D2F\u0D3E\u0D33\u0D02", WritingScript.Malayalam),
848
+ L("mn", "mon", "Mongolian", "Mongoliska", "\u041C\u043E\u043D\u0433\u043E\u043B", WritingScript.Cyrillic),
849
+ L("mr", "mar", "Marathi", "Marathi", "\u092E\u0930\u093E\u0920\u0940", WritingScript.Devanagari),
850
+ L("ms", "msa", "Malay", "Malajiska", "Bahasa Melayu", WritingScript.Latin),
851
+ L("mt", "mlt", "Maltese", "Maltesiska", "Malti", WritingScript.Latin),
852
+ L("my", "mya", "Burmese", "Burmesiska", "\u1019\u103C\u1014\u103A\u1019\u102C\u1005\u102C", WritingScript.Myanmar),
853
+ L("na", "nau", "Nauru", "Nauru", "Dorerin Naoero", WritingScript.Latin),
854
+ L("nb", "nob", "Norwegian Bokm\xE5l", "Norska (bokm\xE5l)", "Norsk bokm\xE5l", WritingScript.Latin),
855
+ L("nd", "nde", "Northern Ndebele", "Nordndebele", "isiNdebele", WritingScript.Latin),
856
+ L("ne", "nep", "Nepali", "Nepalesiska", "\u0928\u0947\u092A\u093E\u0932\u0940", WritingScript.Devanagari),
857
+ L("ng", "ndo", "Ndonga", "Ndonga", "Owambo", WritingScript.Latin),
858
+ L("nl", "nld", "Dutch", "Nederl\xE4ndska", "Nederlands", WritingScript.Latin),
859
+ L("nn", "nno", "Norwegian Nynorsk", "Norska (nynorsk)", "Norsk nynorsk", WritingScript.Latin),
860
+ L("no", "nor", "Norwegian", "Norska", "Norsk", WritingScript.Latin),
861
+ L("nr", "nbl", "Southern Ndebele", "Sydndebele", "isiNdebele", WritingScript.Latin),
862
+ L("nv", "nav", "Navajo", "Navajo", "Din\xE9 Bizaad", WritingScript.Latin),
863
+ L("ny", "nya", "Chichewa", "Chichewa", "Chichewa", WritingScript.Latin),
864
+ L("oc", "oci", "Occitan", "Occitanska", "Occitan", WritingScript.Latin),
865
+ L("oj", "oji", "Ojibwa", "Ojibwa", "\u140A\u14C2\u1511\u14C8\u142F\u14A7\u140E\u14D0", WritingScript.Canadian),
866
+ L("om", "orm", "Oromo", "Oromo", "Afaan Oromoo", WritingScript.Latin),
867
+ L("or", "ori", "Oriya", "Oriya", "\u0B13\u0B21\u0B3C\u0B3F\u0B06", WritingScript.Oriya),
868
+ L("os", "oss", "Ossetian", "Ossetiska", "\u0418\u0440\u043E\u043D", WritingScript.Cyrillic),
869
+ L("pa", "pan", "Punjabi", "Punjabi", "\u0A2A\u0A70\u0A1C\u0A3E\u0A2C\u0A40", WritingScript.Gurmukhi),
870
+ L("pi", "pli", "Pali", "Pali", "\u092A\u093E\u0932\u093F", WritingScript.Devanagari),
871
+ L("pl", "pol", "Polish", "Polska", "Polski", WritingScript.Latin),
872
+ L("ps", "pus", "Pashto", "Pashto", "\u067E\u069A\u062A\u0648", WritingScript.Arabic, TextDirection.RightToLeft),
873
+ L("pt", "por", "Portuguese", "Portugisiska", "Portugu\xEAs", WritingScript.Latin),
874
+ L("qu", "que", "Quechua", "Quechua", "Runa Simi", WritingScript.Latin),
875
+ L("rm", "roh", "Romansh", "R\xE4toromanska", "Rumantsch", WritingScript.Latin),
876
+ L("rn", "run", "Rundi", "Kirundi", "Ikirundi", WritingScript.Latin),
877
+ L("ro", "ron", "Romanian", "Rum\xE4nska", "Rom\xE2n\u0103", WritingScript.Latin),
878
+ L("ru", "rus", "Russian", "Ryska", "\u0420\u0443\u0441\u0441\u043A\u0438\u0439", WritingScript.Cyrillic),
879
+ L("rw", "kin", "Kinyarwanda", "Kinyarwanda", "Ikinyarwanda", WritingScript.Latin),
880
+ L("sa", "san", "Sanskrit", "Sanskrit", "\u0938\u0902\u0938\u094D\u0915\u0943\u0924\u092E\u094D", WritingScript.Devanagari),
881
+ L("sc", "srd", "Sardinian", "Sardiska", "Sardu", WritingScript.Latin),
882
+ L("sd", "snd", "Sindhi", "Sindhi", "\u0633\u0646\u068C\u064A", WritingScript.Arabic, TextDirection.RightToLeft),
883
+ L("se", "sme", "Northern Sami", "Nordsamiska", "Davvis\xE1megiella", WritingScript.Latin),
884
+ L("sg", "sag", "Sango", "Sango", "Y\xE2ng\xE2 t\xEE S\xE4ng\xF6", WritingScript.Latin),
885
+ L("si", "sin", "Sinhala", "Singalesiska", "\u0DC3\u0DD2\u0D82\u0DC4\u0DBD", WritingScript.Sinhala),
886
+ L("sk", "slk", "Slovak", "Slovakiska", "Sloven\u010Dina", WritingScript.Latin),
887
+ L("sl", "slv", "Slovenian", "Slovenska", "Sloven\u0161\u010Dina", WritingScript.Latin),
888
+ L("sm", "smo", "Samoan", "Samoanska", "Gagana S\u0101moa", WritingScript.Latin),
889
+ L("sn", "sna", "Shona", "Shona", "ChiShona", WritingScript.Latin),
890
+ L("so", "som", "Somali", "Somaliska", "Soomaali", WritingScript.Latin),
891
+ L("sq", "sqi", "Albanian", "Albanska", "Shqip", WritingScript.Latin),
892
+ L("sr", "srp", "Serbian", "Serbiska", "\u0421\u0440\u043F\u0441\u043A\u0438", WritingScript.Cyrillic),
893
+ L("ss", "ssw", "Swati", "Swati", "SiSwati", WritingScript.Latin),
894
+ L("st", "sot", "Southern Sotho", "Sotho", "Sesotho", WritingScript.Latin),
895
+ L("su", "sun", "Sundanese", "Sundanesiska", "Basa Sunda", WritingScript.Latin),
896
+ L("sv", "swe", "Swedish", "Svenska", "Svenska", WritingScript.Latin),
897
+ L("sw", "swa", "Swahili", "Swahili", "Kiswahili", WritingScript.Latin),
898
+ L("ta", "tam", "Tamil", "Tamil", "\u0BA4\u0BAE\u0BBF\u0BB4\u0BCD", WritingScript.Tamil),
899
+ L("te", "tel", "Telugu", "Telugu", "\u0C24\u0C46\u0C32\u0C41\u0C17\u0C41", WritingScript.Telugu),
900
+ L("tg", "tgk", "Tajik", "Tadzjikiska", "\u0422\u043E\u04B7\u0438\u043A\u04E3", WritingScript.Cyrillic),
901
+ L("th", "tha", "Thai", "Thail\xE4ndska", "\u0E44\u0E17\u0E22", WritingScript.Thai),
902
+ L("ti", "tir", "Tigrinya", "Tigrinja", "\u1275\u130D\u122D\u129B", WritingScript.Ethiopic),
903
+ L("tk", "tuk", "Turkmen", "Turkmeniska", "T\xFCrkmen", WritingScript.Latin),
904
+ L("tl", "tgl", "Tagalog", "Tagalog", "Tagalog", WritingScript.Latin),
905
+ L("tn", "tsn", "Tswana", "Tswana", "Setswana", WritingScript.Latin),
906
+ L("to", "ton", "Tongan", "Tonganska", "Lea Faka-Tonga", WritingScript.Latin),
907
+ L("tr", "tur", "Turkish", "Turkiska", "T\xFCrk\xE7e", WritingScript.Latin),
908
+ L("ts", "tso", "Tsonga", "Tsonga", "Xitsonga", WritingScript.Latin),
909
+ L("tt", "tat", "Tatar", "Tatariska", "\u0422\u0430\u0442\u0430\u0440", WritingScript.Cyrillic),
910
+ L("tw", "twi", "Twi", "Twi", "Twi", WritingScript.Latin),
911
+ L("ty", "tah", "Tahitian", "Tahitiska", "Reo Tahiti", WritingScript.Latin),
912
+ L(
913
+ "ug",
914
+ "uig",
915
+ "Uyghur",
916
+ "Uiguriska",
917
+ "\u0626\u06C7\u064A\u063A\u06C7\u0631\u0686\u06D5",
918
+ WritingScript.Arabic,
919
+ TextDirection.RightToLeft
920
+ ),
921
+ L("uk", "ukr", "Ukrainian", "Ukrainska", "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430", WritingScript.Cyrillic),
922
+ L("ur", "urd", "Urdu", "Urdu", "\u0627\u0631\u062F\u0648", WritingScript.Arabic, TextDirection.RightToLeft),
923
+ L("uz", "uzb", "Uzbek", "Uzbekiska", "O\u02BBzbek", WritingScript.Latin),
924
+ L("ve", "ven", "Venda", "Venda", "Tshiven\u1E13a", WritingScript.Latin),
925
+ L("vi", "vie", "Vietnamese", "Vietnamesiska", "Ti\u1EBFng Vi\u1EC7t", WritingScript.Latin),
926
+ L("vo", "vol", "Volap\xFCk", "Volap\xFCk", "Volap\xFCk", WritingScript.Latin),
927
+ L("wa", "wln", "Walloon", "Vallonska", "Walon", WritingScript.Latin),
928
+ L("wo", "wol", "Wolof", "Wolof", "Wollof", WritingScript.Latin),
929
+ L("xh", "xho", "Xhosa", "Xhosa", "isiXhosa", WritingScript.Latin),
930
+ L("yi", "yid", "Yiddish", "Jiddisch", "\u05D9\u05D9\u05B4\u05D3\u05D9\u05E9", WritingScript.Hebrew, TextDirection.RightToLeft),
931
+ L("yo", "yor", "Yoruba", "Yoruba", "Yor\xF9b\xE1", WritingScript.Latin),
932
+ L("za", "zha", "Zhuang", "Zhuang", "Sa\u026F cue\u014B\u0185", WritingScript.Latin),
933
+ L("zh", "zho", "Chinese", "Kinesiska", "\u4E2D\u6587", WritingScript.Han),
934
+ L("zu", "zul", "Zulu", "Zulu", "isiZulu", WritingScript.Latin)
935
+ ]);
936
+ var BY_KEY = (() => {
937
+ const m = /* @__PURE__ */ new Map();
938
+ for (const lang of ALL) {
939
+ m.set(lang.alpha2Code, lang);
940
+ m.set(lang.alpha3Code, lang);
941
+ m.set(lang.englishName.toLowerCase(), lang);
942
+ if (!m.has(lang.localizedName.toLowerCase())) {
943
+ m.set(lang.localizedName.toLowerCase(), lang);
944
+ }
945
+ if (lang.nativeName.toLowerCase() !== lang.englishName.toLowerCase() && !m.has(lang.nativeName.toLowerCase())) {
946
+ m.set(lang.nativeName.toLowerCase(), lang);
947
+ }
948
+ }
949
+ return m;
950
+ })();
951
+ var byA2 = (a2) => BY_KEY.get(a2);
952
+ Language.Afrikaans = byA2("af");
953
+ Language.Albanian = byA2("sq");
954
+ Language.Arabic = byA2("ar");
955
+ Language.Bulgarian = byA2("bg");
956
+ Language.Catalan = byA2("ca");
957
+ Language.Chinese = byA2("zh");
958
+ Language.Croatian = byA2("hr");
959
+ Language.Czech = byA2("cs");
960
+ Language.Danish = byA2("da");
961
+ Language.Dutch = byA2("nl");
962
+ Language.English = byA2("en");
963
+ Language.Estonian = byA2("et");
964
+ Language.Faroese = byA2("fo");
965
+ Language.Finnish = byA2("fi");
966
+ Language.French = byA2("fr");
967
+ Language.German = byA2("de");
968
+ Language.Greek = byA2("el");
969
+ Language.Hindi = byA2("hi");
970
+ Language.Hungarian = byA2("hu");
971
+ Language.Icelandic = byA2("is");
972
+ Language.Italian = byA2("it");
973
+ Language.Japanese = byA2("ja");
974
+ Language.Korean = byA2("ko");
975
+ Language.Latvian = byA2("lv");
976
+ Language.Lithuanian = byA2("lt");
977
+ Language.NorthernSami = byA2("se");
978
+ Language.Norwegian = byA2("no");
979
+ Language.NorwegianBokmal = byA2("nb");
980
+ Language.NorwegianNynorsk = byA2("nn");
981
+ Language.Polish = byA2("pl");
982
+ Language.Portuguese = byA2("pt");
983
+ Language.Romanian = byA2("ro");
984
+ Language.Russian = byA2("ru");
985
+ Language.Slovak = byA2("sk");
986
+ Language.Slovenian = byA2("sl");
987
+ Language.Spanish = byA2("es");
988
+ Language.Swahili = byA2("sw");
989
+ Language.Swedish = byA2("sv");
990
+ Language.Turkish = byA2("tr");
991
+ Language.Ukrainian = byA2("uk");
992
+
993
+ // src/geography/continent.ts
994
+ var MAX_INPUT_LENGTH2 = 50;
995
+ var Continent = class _Continent {
996
+ static typeInfo = Object.freeze({
997
+ englishName: "Continent",
998
+ localizedName: "Kontinent",
999
+ emoji: "\u{1F5FA}\uFE0F",
1000
+ sources: Object.freeze([
1001
+ "https://unstats.un.org/unsd/methodology/m49/",
1002
+ "https://datahub.io/core/continent-codes"
1003
+ ])
1004
+ });
1005
+ static Africa = new _Continent("AF", "Africa", "Afrika");
1006
+ static Antarctica = new _Continent("AN", "Antarctica", "Antarktis");
1007
+ static Asia = new _Continent("AS", "Asia", "Asien");
1008
+ static Europe = new _Continent("EU", "Europe", "Europa");
1009
+ static NorthAmerica = new _Continent("NA", "North America", "Nordamerika");
1010
+ static Oceania = new _Continent("OC", "Oceania", "Oceanien");
1011
+ static SouthAmerica = new _Continent("SA", "South America", "Sydamerika");
1012
+ /** All seven continents. */
1013
+ static all = Object.freeze([
1014
+ _Continent.Africa,
1015
+ _Continent.Antarctica,
1016
+ _Continent.Asia,
1017
+ _Continent.Europe,
1018
+ _Continent.NorthAmerica,
1019
+ _Continent.Oceania,
1020
+ _Continent.SouthAmerica
1021
+ ]);
1022
+ code;
1023
+ englishName;
1024
+ localizedName;
1025
+ constructor(code, englishName, localizedName) {
1026
+ this.code = code;
1027
+ this.englishName = englishName;
1028
+ this.localizedName = localizedName;
1029
+ }
1030
+ get displayName() {
1031
+ return PrimitivesDefaults.useLocalizedDisplayNames ? this.localizedName : this.englishName;
1032
+ }
1033
+ get value() {
1034
+ return this.code;
1035
+ }
1036
+ static tryParse(input) {
1037
+ if (input == null) return null;
1038
+ const trimmed = input.trim();
1039
+ if (trimmed.length === 0 || trimmed.length > MAX_INPUT_LENGTH2) return null;
1040
+ const lower = trimmed.toLowerCase();
1041
+ return BY_KEY2.get(lower) ?? null;
1042
+ }
1043
+ static parse(input) {
1044
+ const r = _Continent.tryParse(input);
1045
+ if (r === null) throw new Error("Unknown continent.");
1046
+ return r;
1047
+ }
1048
+ static isValid(input) {
1049
+ return _Continent.tryParse(input) !== null;
1050
+ }
1051
+ static format(input, options) {
1052
+ const r = _Continent.tryParse(input);
1053
+ if (r) return r.displayName;
1054
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== "") {
1055
+ return input.trim();
1056
+ }
1057
+ return null;
1058
+ }
1059
+ static normalize(input, options) {
1060
+ const r = _Continent.tryParse(input);
1061
+ if (r) return r.code;
1062
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null) {
1063
+ const trimmed = input.trim();
1064
+ return trimmed.length > 0 ? trimmed : null;
1065
+ }
1066
+ return null;
1067
+ }
1068
+ static isNormalized(input) {
1069
+ return input != null && _Continent.normalize(input) === input;
1070
+ }
1071
+ toNormalizedString() {
1072
+ return this.code;
1073
+ }
1074
+ toString() {
1075
+ return this.displayName;
1076
+ }
1077
+ equals(other) {
1078
+ return other != null && this.code === other.code;
1079
+ }
1080
+ compareTo(other) {
1081
+ if (other == null) return 1;
1082
+ return this.code < other.code ? -1 : this.code > other.code ? 1 : 0;
1083
+ }
1084
+ };
1085
+ var BY_KEY2 = (() => {
1086
+ const m = /* @__PURE__ */ new Map();
1087
+ for (const c of Continent.all) {
1088
+ m.set(c.code.toLowerCase(), c);
1089
+ m.set(c.englishName.toLowerCase(), c);
1090
+ m.set(c.localizedName.toLowerCase(), c);
1091
+ }
1092
+ return m;
1093
+ })();
1094
+
1095
+ // src/geography/country-data.ts
1096
+ var C = (alpha2, alpha3, numeric, en, sv, native, callingCode, tld, continent) => ({ alpha2, alpha3, numeric, en, sv, native, callingCode, tld, continent });
1097
+ var COUNTRY_ROWS = [
1098
+ C("AF", "AFG", 4, "Afghanistan", "Afghanistan", "\u0627\u0641\u063A\u0627\u0646\u0633\u062A\u0627\u0646", "93", ".af", Continent.Asia),
1099
+ C("AL", "ALB", 8, "Albania", "Albanien", "Shqip\xEBria", "355", ".al", Continent.Europe),
1100
+ C("DZ", "DZA", 12, "Algeria", "Algeriet", "\u0627\u0644\u062C\u0632\u0627\u0626\u0631", "213", ".dz", Continent.Africa),
1101
+ C(
1102
+ "AS",
1103
+ "ASM",
1104
+ 16,
1105
+ "American Samoa",
1106
+ "Amerikanska Samoa",
1107
+ "American Samoa",
1108
+ "1",
1109
+ ".as",
1110
+ Continent.Oceania
1111
+ ),
1112
+ C("AD", "AND", 20, "Andorra", "Andorra", "Andorra", "376", ".ad", Continent.Europe),
1113
+ C("AO", "AGO", 24, "Angola", "Angola", "Angola", "244", ".ao", Continent.Africa),
1114
+ C(
1115
+ "AG",
1116
+ "ATG",
1117
+ 28,
1118
+ "Antigua and Barbuda",
1119
+ "Antigua och Barbuda",
1120
+ "Antigua and Barbuda",
1121
+ "1",
1122
+ ".ag",
1123
+ Continent.NorthAmerica
1124
+ ),
1125
+ C("AR", "ARG", 32, "Argentina", "Argentina", "Argentina", "54", ".ar", Continent.SouthAmerica),
1126
+ C("AM", "ARM", 51, "Armenia", "Armenien", "\u0540\u0561\u0575\u0561\u057D\u057F\u0561\u0576", "374", ".am", Continent.Asia),
1127
+ C("AW", "ABW", 533, "Aruba", "Aruba", "Aruba", "297", ".aw", Continent.NorthAmerica),
1128
+ C("AU", "AUS", 36, "Australia", "Australien", "Australia", "61", ".au", Continent.Oceania),
1129
+ C("AT", "AUT", 40, "Austria", "\xD6sterrike", "\xD6sterreich", "43", ".at", Continent.Europe),
1130
+ C("AZ", "AZE", 31, "Azerbaijan", "Azerbajdzjan", "Az\u0259rbaycan", "994", ".az", Continent.Asia),
1131
+ C("BS", "BHS", 44, "Bahamas", "Bahamas", "Bahamas", "1", ".bs", Continent.NorthAmerica),
1132
+ C("BH", "BHR", 48, "Bahrain", "Bahrain", "\u0627\u0644\u0628\u062D\u0631\u064A\u0646", "973", ".bh", Continent.Asia),
1133
+ C("BD", "BGD", 50, "Bangladesh", "Bangladesh", "\u09AC\u09BE\u0982\u09B2\u09BE\u09A6\u09C7\u09B6", "880", ".bd", Continent.Asia),
1134
+ C("BB", "BRB", 52, "Barbados", "Barbados", "Barbados", "1", ".bb", Continent.NorthAmerica),
1135
+ C("BY", "BLR", 112, "Belarus", "Belarus", "\u0411\u0435\u043B\u0430\u0440\u0443\u0441\u044C", "375", ".by", Continent.Europe),
1136
+ C("BE", "BEL", 56, "Belgium", "Belgien", "Belgi\xEB", "32", ".be", Continent.Europe),
1137
+ C("BZ", "BLZ", 84, "Belize", "Belize", "Belize", "501", ".bz", Continent.NorthAmerica),
1138
+ C("BJ", "BEN", 204, "Benin", "Benin", "B\xE9nin", "229", ".bj", Continent.Africa),
1139
+ C("BM", "BMU", 60, "Bermuda", "Bermuda", "Bermuda", "1", ".bm", Continent.NorthAmerica),
1140
+ C("BT", "BTN", 64, "Bhutan", "Bhutan", "\u0F60\u0F56\u0FB2\u0F74\u0F42", "975", ".bt", Continent.Asia),
1141
+ C("BO", "BOL", 68, "Bolivia", "Bolivia", "Bolivia", "591", ".bo", Continent.SouthAmerica),
1142
+ C(
1143
+ "BA",
1144
+ "BIH",
1145
+ 70,
1146
+ "Bosnia and Herzegovina",
1147
+ "Bosnien och Hercegovina",
1148
+ "Bosna i Hercegovina",
1149
+ "387",
1150
+ ".ba",
1151
+ Continent.Europe
1152
+ ),
1153
+ C("BW", "BWA", 72, "Botswana", "Botswana", "Botswana", "267", ".bw", Continent.Africa),
1154
+ C("BR", "BRA", 76, "Brazil", "Brasilien", "Brasil", "55", ".br", Continent.SouthAmerica),
1155
+ C("BN", "BRN", 96, "Brunei", "Brunei", "Brunei", "673", ".bn", Continent.Asia),
1156
+ C("BG", "BGR", 100, "Bulgaria", "Bulgarien", "\u0411\u044A\u043B\u0433\u0430\u0440\u0438\u044F", "359", ".bg", Continent.Europe),
1157
+ C(
1158
+ "BF",
1159
+ "BFA",
1160
+ 854,
1161
+ "Burkina Faso",
1162
+ "Burkina Faso",
1163
+ "Burkina Faso",
1164
+ "226",
1165
+ ".bf",
1166
+ Continent.Africa
1167
+ ),
1168
+ C("BI", "BDI", 108, "Burundi", "Burundi", "Burundi", "257", ".bi", Continent.Africa),
1169
+ C("CV", "CPV", 132, "Cabo Verde", "Kap Verde", "Cabo Verde", "238", ".cv", Continent.Africa),
1170
+ C("KH", "KHM", 116, "Cambodia", "Kambodja", "\u1780\u1798\u17D2\u1796\u17BB\u1787\u17B6", "855", ".kh", Continent.Asia),
1171
+ C("CM", "CMR", 120, "Cameroon", "Kamerun", "Cameroun", "237", ".cm", Continent.Africa),
1172
+ C("CA", "CAN", 124, "Canada", "Kanada", "Canada", "1", ".ca", Continent.NorthAmerica),
1173
+ C(
1174
+ "CF",
1175
+ "CAF",
1176
+ 140,
1177
+ "Central African Republic",
1178
+ "Centralafrikanska republiken",
1179
+ "R\xE9publique centrafricaine",
1180
+ "236",
1181
+ ".cf",
1182
+ Continent.Africa
1183
+ ),
1184
+ C("TD", "TCD", 148, "Chad", "Tchad", "Tchad", "235", ".td", Continent.Africa),
1185
+ C("CL", "CHL", 152, "Chile", "Chile", "Chile", "56", ".cl", Continent.SouthAmerica),
1186
+ C("CN", "CHN", 156, "China", "Kina", "\u4E2D\u56FD", "86", ".cn", Continent.Asia),
1187
+ C("CO", "COL", 170, "Colombia", "Colombia", "Colombia", "57", ".co", Continent.SouthAmerica),
1188
+ C("KM", "COM", 174, "Comoros", "Komorerna", "Komori", "269", ".km", Continent.Africa),
1189
+ C("CG", "COG", 178, "Congo", "Kongo", "Congo", "242", ".cg", Continent.Africa),
1190
+ C(
1191
+ "CD",
1192
+ "COD",
1193
+ 180,
1194
+ "Congo (Democratic Republic)",
1195
+ "Demokratiska republiken Kongo",
1196
+ "R\xE9publique d\xE9mocratique du Congo",
1197
+ "243",
1198
+ ".cd",
1199
+ Continent.Africa
1200
+ ),
1201
+ C(
1202
+ "CR",
1203
+ "CRI",
1204
+ 188,
1205
+ "Costa Rica",
1206
+ "Costa Rica",
1207
+ "Costa Rica",
1208
+ "506",
1209
+ ".cr",
1210
+ Continent.NorthAmerica
1211
+ ),
1212
+ C(
1213
+ "CI",
1214
+ "CIV",
1215
+ 384,
1216
+ "C\xF4te d'Ivoire",
1217
+ "Elfenbenskusten",
1218
+ "C\xF4te d'Ivoire",
1219
+ "225",
1220
+ ".ci",
1221
+ Continent.Africa
1222
+ ),
1223
+ C("HR", "HRV", 191, "Croatia", "Kroatien", "Hrvatska", "385", ".hr", Continent.Europe),
1224
+ C("CU", "CUB", 192, "Cuba", "Kuba", "Cuba", "53", ".cu", Continent.NorthAmerica),
1225
+ C("CW", "CUW", 531, "Cura\xE7ao", "Cura\xE7ao", "Cura\xE7ao", "599", ".cw", Continent.NorthAmerica),
1226
+ C("CY", "CYP", 196, "Cyprus", "Cypern", "\u039A\u03CD\u03C0\u03C1\u03BF\u03C2", "357", ".cy", Continent.Europe),
1227
+ C("CZ", "CZE", 203, "Czechia", "Tjeckien", "\u010Cesko", "420", ".cz", Continent.Europe),
1228
+ C("DK", "DNK", 208, "Denmark", "Danmark", "Danmark", "45", ".dk", Continent.Europe),
1229
+ C("DJ", "DJI", 262, "Djibouti", "Djibouti", "Djibouti", "253", ".dj", Continent.Africa),
1230
+ C("DM", "DMA", 212, "Dominica", "Dominica", "Dominica", "1", ".dm", Continent.NorthAmerica),
1231
+ C(
1232
+ "DO",
1233
+ "DOM",
1234
+ 214,
1235
+ "Dominican Republic",
1236
+ "Dominikanska republiken",
1237
+ "Rep\xFAblica Dominicana",
1238
+ "1",
1239
+ ".do",
1240
+ Continent.NorthAmerica
1241
+ ),
1242
+ C("EC", "ECU", 218, "Ecuador", "Ecuador", "Ecuador", "593", ".ec", Continent.SouthAmerica),
1243
+ C("EG", "EGY", 818, "Egypt", "Egypten", "\u0645\u0635\u0631", "20", ".eg", Continent.Africa),
1244
+ C(
1245
+ "SV",
1246
+ "SLV",
1247
+ 222,
1248
+ "El Salvador",
1249
+ "El Salvador",
1250
+ "El Salvador",
1251
+ "503",
1252
+ ".sv",
1253
+ Continent.NorthAmerica
1254
+ ),
1255
+ C(
1256
+ "GQ",
1257
+ "GNQ",
1258
+ 226,
1259
+ "Equatorial Guinea",
1260
+ "Ekvatorialguinea",
1261
+ "Guinea Ecuatorial",
1262
+ "240",
1263
+ ".gq",
1264
+ Continent.Africa
1265
+ ),
1266
+ C("ER", "ERI", 232, "Eritrea", "Eritrea", "\u12A4\u122D\u1275\u122B", "291", ".er", Continent.Africa),
1267
+ C("EE", "EST", 233, "Estonia", "Estland", "Eesti", "372", ".ee", Continent.Europe),
1268
+ C("SZ", "SWZ", 748, "Eswatini", "Eswatini", "eSwatini", "268", ".sz", Continent.Africa),
1269
+ C("ET", "ETH", 231, "Ethiopia", "Etiopien", "\u12A2\u1275\u12EE\u1335\u12EB", "251", ".et", Continent.Africa),
1270
+ C("FJ", "FJI", 242, "Fiji", "Fiji", "Fiji", "679", ".fj", Continent.Oceania),
1271
+ C("FI", "FIN", 246, "Finland", "Finland", "Suomi", "358", ".fi", Continent.Europe),
1272
+ C("FR", "FRA", 250, "France", "Frankrike", "France", "33", ".fr", Continent.Europe),
1273
+ C("GA", "GAB", 266, "Gabon", "Gabon", "Gabon", "241", ".ga", Continent.Africa),
1274
+ C("GM", "GMB", 270, "Gambia", "Gambia", "Gambia", "220", ".gm", Continent.Africa),
1275
+ C("GE", "GEO", 268, "Georgia", "Georgien", "\u10E1\u10D0\u10E5\u10D0\u10E0\u10D7\u10D5\u10D4\u10DA\u10DD", "995", ".ge", Continent.Asia),
1276
+ C("DE", "DEU", 276, "Germany", "Tyskland", "Deutschland", "49", ".de", Continent.Europe),
1277
+ C("GH", "GHA", 288, "Ghana", "Ghana", "Ghana", "233", ".gh", Continent.Africa),
1278
+ C("GI", "GIB", 292, "Gibraltar", "Gibraltar", "Gibraltar", "350", ".gi", Continent.Europe),
1279
+ C("GR", "GRC", 300, "Greece", "Grekland", "\u0395\u03BB\u03BB\u03AC\u03B4\u03B1", "30", ".gr", Continent.Europe),
1280
+ C(
1281
+ "GL",
1282
+ "GRL",
1283
+ 304,
1284
+ "Greenland",
1285
+ "Gr\xF6nland",
1286
+ "Kalaallit Nunaat",
1287
+ "299",
1288
+ ".gl",
1289
+ Continent.NorthAmerica
1290
+ ),
1291
+ C("GD", "GRD", 308, "Grenada", "Grenada", "Grenada", "1", ".gd", Continent.NorthAmerica),
1292
+ C("GU", "GUM", 316, "Guam", "Guam", "Guam", "1", ".gu", Continent.Oceania),
1293
+ C("GT", "GTM", 320, "Guatemala", "Guatemala", "Guatemala", "502", ".gt", Continent.NorthAmerica),
1294
+ C("GG", "GGY", 831, "Guernsey", "Guernsey", "Guernsey", "44", ".gg", Continent.Europe),
1295
+ C("GN", "GIN", 324, "Guinea", "Guinea", "Guin\xE9e", "224", ".gn", Continent.Africa),
1296
+ C(
1297
+ "GW",
1298
+ "GNB",
1299
+ 624,
1300
+ "Guinea-Bissau",
1301
+ "Guinea-Bissau",
1302
+ "Guin\xE9-Bissau",
1303
+ "245",
1304
+ ".gw",
1305
+ Continent.Africa
1306
+ ),
1307
+ C("GY", "GUY", 328, "Guyana", "Guyana", "Guyana", "592", ".gy", Continent.SouthAmerica),
1308
+ C("HT", "HTI", 332, "Haiti", "Haiti", "Ha\xEFti", "509", ".ht", Continent.NorthAmerica),
1309
+ C("HN", "HND", 340, "Honduras", "Honduras", "Honduras", "504", ".hn", Continent.NorthAmerica),
1310
+ C("HK", "HKG", 344, "Hong Kong", "Hongkong", "\u9999\u6E2F", "852", ".hk", Continent.Asia),
1311
+ C("HU", "HUN", 348, "Hungary", "Ungern", "Magyarorsz\xE1g", "36", ".hu", Continent.Europe),
1312
+ C("IS", "ISL", 352, "Iceland", "Island", "\xCDsland", "354", ".is", Continent.Europe),
1313
+ C("IN", "IND", 356, "India", "Indien", "\u092D\u093E\u0930\u0924", "91", ".in", Continent.Asia),
1314
+ C("ID", "IDN", 360, "Indonesia", "Indonesien", "Indonesia", "62", ".id", Continent.Asia),
1315
+ C("IR", "IRN", 364, "Iran", "Iran", "\u0627\u06CC\u0631\u0627\u0646", "98", ".ir", Continent.Asia),
1316
+ C("IQ", "IRQ", 368, "Iraq", "Irak", "\u0627\u0644\u0639\u0631\u0627\u0642", "964", ".iq", Continent.Asia),
1317
+ C("IE", "IRL", 372, "Ireland", "Irland", "\xC9ire", "353", ".ie", Continent.Europe),
1318
+ C("IM", "IMN", 833, "Isle of Man", "Isle of Man", "Isle of Man", "44", ".im", Continent.Europe),
1319
+ C("IL", "ISR", 376, "Israel", "Israel", "\u05D9\u05E9\u05E8\u05D0\u05DC", "972", ".il", Continent.Asia),
1320
+ C("IT", "ITA", 380, "Italy", "Italien", "Italia", "39", ".it", Continent.Europe),
1321
+ C("JM", "JAM", 388, "Jamaica", "Jamaica", "Jamaica", "1", ".jm", Continent.NorthAmerica),
1322
+ C("JP", "JPN", 392, "Japan", "Japan", "\u65E5\u672C", "81", ".jp", Continent.Asia),
1323
+ C("JE", "JEY", 832, "Jersey", "Jersey", "Jersey", "44", ".je", Continent.Europe),
1324
+ C("JO", "JOR", 400, "Jordan", "Jordanien", "\u0627\u0644\u0623\u0631\u062F\u0646", "962", ".jo", Continent.Asia),
1325
+ C("KZ", "KAZ", 398, "Kazakhstan", "Kazakstan", "\u049A\u0430\u0437\u0430\u049B\u0441\u0442\u0430\u043D", "7", ".kz", Continent.Asia),
1326
+ C("KE", "KEN", 404, "Kenya", "Kenya", "Kenya", "254", ".ke", Continent.Africa),
1327
+ C("KI", "KIR", 296, "Kiribati", "Kiribati", "Kiribati", "686", ".ki", Continent.Oceania),
1328
+ C("KP", "PRK", 408, "North Korea", "Nordkorea", "\uC870\uC120", "850", ".kp", Continent.Asia),
1329
+ C("KR", "KOR", 410, "South Korea", "Sydkorea", "\uB300\uD55C\uBBFC\uAD6D", "82", ".kr", Continent.Asia),
1330
+ C("KW", "KWT", 414, "Kuwait", "Kuwait", "\u0627\u0644\u0643\u0648\u064A\u062A", "965", ".kw", Continent.Asia),
1331
+ C("KG", "KGZ", 417, "Kyrgyzstan", "Kirgizistan", "\u041A\u044B\u0440\u0433\u044B\u0437\u0441\u0442\u0430\u043D", "996", ".kg", Continent.Asia),
1332
+ C("LA", "LAO", 418, "Laos", "Laos", "\u0EA5\u0EB2\u0EA7", "856", ".la", Continent.Asia),
1333
+ C("LV", "LVA", 428, "Latvia", "Lettland", "Latvija", "371", ".lv", Continent.Europe),
1334
+ C("LB", "LBN", 422, "Lebanon", "Libanon", "\u0644\u0628\u0646\u0627\u0646", "961", ".lb", Continent.Asia),
1335
+ C("LS", "LSO", 426, "Lesotho", "Lesotho", "Lesotho", "266", ".ls", Continent.Africa),
1336
+ C("LR", "LBR", 430, "Liberia", "Liberia", "Liberia", "231", ".lr", Continent.Africa),
1337
+ C("LY", "LBY", 434, "Libya", "Libyen", "\u0644\u064A\u0628\u064A\u0627", "218", ".ly", Continent.Africa),
1338
+ C(
1339
+ "LI",
1340
+ "LIE",
1341
+ 438,
1342
+ "Liechtenstein",
1343
+ "Liechtenstein",
1344
+ "Liechtenstein",
1345
+ "423",
1346
+ ".li",
1347
+ Continent.Europe
1348
+ ),
1349
+ C("LT", "LTU", 440, "Lithuania", "Litauen", "Lietuva", "370", ".lt", Continent.Europe),
1350
+ C("LU", "LUX", 442, "Luxembourg", "Luxemburg", "L\xEBtzebuerg", "352", ".lu", Continent.Europe),
1351
+ C("MO", "MAC", 446, "Macao", "Macao", "\u6FB3\u9580", "853", ".mo", Continent.Asia),
1352
+ C("MG", "MDG", 450, "Madagascar", "Madagaskar", "Madagasikara", "261", ".mg", Continent.Africa),
1353
+ C("MW", "MWI", 454, "Malawi", "Malawi", "Malawi", "265", ".mw", Continent.Africa),
1354
+ C("MY", "MYS", 458, "Malaysia", "Malaysia", "Malaysia", "60", ".my", Continent.Asia),
1355
+ C("MV", "MDV", 462, "Maldives", "Maldiverna", "\u078B\u07A8\u0788\u07AC\u0780\u07A8\u0783\u07A7\u0787\u07B0\u0796\u07AC", "960", ".mv", Continent.Asia),
1356
+ C("ML", "MLI", 466, "Mali", "Mali", "Mali", "223", ".ml", Continent.Africa),
1357
+ C("MT", "MLT", 470, "Malta", "Malta", "Malta", "356", ".mt", Continent.Europe),
1358
+ C(
1359
+ "MH",
1360
+ "MHL",
1361
+ 584,
1362
+ "Marshall Islands",
1363
+ "Marshall\xF6arna",
1364
+ "Marshall Islands",
1365
+ "692",
1366
+ ".mh",
1367
+ Continent.Oceania
1368
+ ),
1369
+ C("MR", "MRT", 478, "Mauritania", "Mauretanien", "\u0645\u0648\u0631\u064A\u062A\u0627\u0646\u064A\u0627", "222", ".mr", Continent.Africa),
1370
+ C("MU", "MUS", 480, "Mauritius", "Mauritius", "Maurice", "230", ".mu", Continent.Africa),
1371
+ C("MX", "MEX", 484, "Mexico", "Mexiko", "M\xE9xico", "52", ".mx", Continent.NorthAmerica),
1372
+ C("FM", "FSM", 583, "Micronesia", "Mikronesien", "Micronesia", "691", ".fm", Continent.Oceania),
1373
+ C("MD", "MDA", 498, "Moldova", "Moldavien", "Moldova", "373", ".md", Continent.Europe),
1374
+ C("MC", "MCO", 492, "Monaco", "Monaco", "Monaco", "377", ".mc", Continent.Europe),
1375
+ C("MN", "MNG", 496, "Mongolia", "Mongoliet", "\u041C\u043E\u043D\u0433\u043E\u043B", "976", ".mn", Continent.Asia),
1376
+ C("ME", "MNE", 499, "Montenegro", "Montenegro", "Crna Gora", "382", ".me", Continent.Europe),
1377
+ C("MA", "MAR", 504, "Morocco", "Marocko", "\u0627\u0644\u0645\u063A\u0631\u0628", "212", ".ma", Continent.Africa),
1378
+ C("MZ", "MOZ", 508, "Mozambique", "Mo\xE7ambique", "Mo\xE7ambique", "258", ".mz", Continent.Africa),
1379
+ C("MM", "MMR", 104, "Myanmar", "Myanmar", "\u1019\u103C\u1014\u103A\u1019\u102C", "95", ".mm", Continent.Asia),
1380
+ C("NA", "NAM", 516, "Namibia", "Namibia", "Namibia", "264", ".na", Continent.Africa),
1381
+ C("NR", "NRU", 520, "Nauru", "Nauru", "Nauru", "674", ".nr", Continent.Oceania),
1382
+ C("NP", "NPL", 524, "Nepal", "Nepal", "\u0928\u0947\u092A\u093E\u0932", "977", ".np", Continent.Asia),
1383
+ C("NL", "NLD", 528, "Netherlands", "Nederl\xE4nderna", "Nederland", "31", ".nl", Continent.Europe),
1384
+ C("NZ", "NZL", 554, "New Zealand", "Nya Zeeland", "Aotearoa", "64", ".nz", Continent.Oceania),
1385
+ C("NI", "NIC", 558, "Nicaragua", "Nicaragua", "Nicaragua", "505", ".ni", Continent.NorthAmerica),
1386
+ C("NE", "NER", 562, "Niger", "Niger", "Niger", "227", ".ne", Continent.Africa),
1387
+ C("NG", "NGA", 566, "Nigeria", "Nigeria", "Nigeria", "234", ".ng", Continent.Africa),
1388
+ C(
1389
+ "MK",
1390
+ "MKD",
1391
+ 807,
1392
+ "North Macedonia",
1393
+ "Nordmakedonien",
1394
+ "\u0421\u0435\u0432\u0435\u0440\u043D\u0430 \u041C\u0430\u043A\u0435\u0434\u043E\u043D\u0438\u0458\u0430",
1395
+ "389",
1396
+ ".mk",
1397
+ Continent.Europe
1398
+ ),
1399
+ C("NO", "NOR", 578, "Norway", "Norge", "Norge", "47", ".no", Continent.Europe),
1400
+ C("OM", "OMN", 512, "Oman", "Oman", "\u0639\u0645\u0627\u0646", "968", ".om", Continent.Asia),
1401
+ C("PK", "PAK", 586, "Pakistan", "Pakistan", "\u067E\u0627\u06A9\u0633\u062A\u0627\u0646", "92", ".pk", Continent.Asia),
1402
+ C("PW", "PLW", 585, "Palau", "Palau", "Palau", "680", ".pw", Continent.Oceania),
1403
+ C("PS", "PSE", 275, "Palestine", "Palestina", "\u0641\u0644\u0633\u0637\u064A\u0646", "970", ".ps", Continent.Asia),
1404
+ C("PA", "PAN", 591, "Panama", "Panama", "Panam\xE1", "507", ".pa", Continent.NorthAmerica),
1405
+ C(
1406
+ "PG",
1407
+ "PNG",
1408
+ 598,
1409
+ "Papua New Guinea",
1410
+ "Papua Nya Guinea",
1411
+ "Papua Niugini",
1412
+ "675",
1413
+ ".pg",
1414
+ Continent.Oceania
1415
+ ),
1416
+ C("PY", "PRY", 600, "Paraguay", "Paraguay", "Paraguay", "595", ".py", Continent.SouthAmerica),
1417
+ C("PE", "PER", 604, "Peru", "Peru", "Per\xFA", "51", ".pe", Continent.SouthAmerica),
1418
+ C("PH", "PHL", 608, "Philippines", "Filippinerna", "Pilipinas", "63", ".ph", Continent.Asia),
1419
+ C("PL", "POL", 616, "Poland", "Polen", "Polska", "48", ".pl", Continent.Europe),
1420
+ C("PT", "PRT", 620, "Portugal", "Portugal", "Portugal", "351", ".pt", Continent.Europe),
1421
+ C(
1422
+ "PR",
1423
+ "PRI",
1424
+ 630,
1425
+ "Puerto Rico",
1426
+ "Puerto Rico",
1427
+ "Puerto Rico",
1428
+ "1",
1429
+ ".pr",
1430
+ Continent.NorthAmerica
1431
+ ),
1432
+ C("QA", "QAT", 634, "Qatar", "Qatar", "\u0642\u0637\u0631", "974", ".qa", Continent.Asia),
1433
+ C("RO", "ROU", 642, "Romania", "Rum\xE4nien", "Rom\xE2nia", "40", ".ro", Continent.Europe),
1434
+ C("RU", "RUS", 643, "Russia", "Ryssland", "\u0420\u043E\u0441\u0441\u0438\u044F", "7", ".ru", Continent.Europe),
1435
+ C("RW", "RWA", 646, "Rwanda", "Rwanda", "Rwanda", "250", ".rw", Continent.Africa),
1436
+ C(
1437
+ "KN",
1438
+ "KNA",
1439
+ 659,
1440
+ "Saint Kitts and Nevis",
1441
+ "Saint Kitts och Nevis",
1442
+ "Saint Kitts and Nevis",
1443
+ "1",
1444
+ ".kn",
1445
+ Continent.NorthAmerica
1446
+ ),
1447
+ C(
1448
+ "LC",
1449
+ "LCA",
1450
+ 662,
1451
+ "Saint Lucia",
1452
+ "Saint Lucia",
1453
+ "Saint Lucia",
1454
+ "1",
1455
+ ".lc",
1456
+ Continent.NorthAmerica
1457
+ ),
1458
+ C(
1459
+ "VC",
1460
+ "VCT",
1461
+ 670,
1462
+ "Saint Vincent and the Grenadines",
1463
+ "Saint Vincent och Grenadinerna",
1464
+ "Saint Vincent and the Grenadines",
1465
+ "1",
1466
+ ".vc",
1467
+ Continent.NorthAmerica
1468
+ ),
1469
+ C("WS", "WSM", 882, "Samoa", "Samoa", "S\u0101moa", "685", ".ws", Continent.Oceania),
1470
+ C("SM", "SMR", 674, "San Marino", "San Marino", "San Marino", "378", ".sm", Continent.Europe),
1471
+ C(
1472
+ "ST",
1473
+ "STP",
1474
+ 678,
1475
+ "S\xE3o Tom\xE9 and Pr\xEDncipe",
1476
+ "S\xE3o Tom\xE9 och Pr\xEDncipe",
1477
+ "S\xE3o Tom\xE9 e Pr\xEDncipe",
1478
+ "239",
1479
+ ".st",
1480
+ Continent.Africa
1481
+ ),
1482
+ C("SA", "SAU", 682, "Saudi Arabia", "Saudiarabien", "\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629", "966", ".sa", Continent.Asia),
1483
+ C("SN", "SEN", 686, "Senegal", "Senegal", "S\xE9n\xE9gal", "221", ".sn", Continent.Africa),
1484
+ C("RS", "SRB", 688, "Serbia", "Serbien", "\u0421\u0440\u0431\u0438\u0458\u0430", "381", ".rs", Continent.Europe),
1485
+ C("SC", "SYC", 690, "Seychelles", "Seychellerna", "Seychelles", "248", ".sc", Continent.Africa),
1486
+ C(
1487
+ "SL",
1488
+ "SLE",
1489
+ 694,
1490
+ "Sierra Leone",
1491
+ "Sierra Leone",
1492
+ "Sierra Leone",
1493
+ "232",
1494
+ ".sl",
1495
+ Continent.Africa
1496
+ ),
1497
+ C("SG", "SGP", 702, "Singapore", "Singapore", "Singapore", "65", ".sg", Continent.Asia),
1498
+ C("SK", "SVK", 703, "Slovakia", "Slovakien", "Slovensko", "421", ".sk", Continent.Europe),
1499
+ C("SI", "SVN", 705, "Slovenia", "Slovenien", "Slovenija", "386", ".si", Continent.Europe),
1500
+ C(
1501
+ "SB",
1502
+ "SLB",
1503
+ 90,
1504
+ "Solomon Islands",
1505
+ "Salomon\xF6arna",
1506
+ "Solomon Islands",
1507
+ "677",
1508
+ ".sb",
1509
+ Continent.Oceania
1510
+ ),
1511
+ C("SO", "SOM", 706, "Somalia", "Somalia", "Soomaaliya", "252", ".so", Continent.Africa),
1512
+ C("ZA", "ZAF", 710, "South Africa", "Sydafrika", "Suid-Afrika", "27", ".za", Continent.Africa),
1513
+ C("SS", "SSD", 728, "South Sudan", "Sydsudan", "South Sudan", "211", ".ss", Continent.Africa),
1514
+ C("ES", "ESP", 724, "Spain", "Spanien", "Espa\xF1a", "34", ".es", Continent.Europe),
1515
+ C("LK", "LKA", 144, "Sri Lanka", "Sri Lanka", "\u0DC1\u0DCA\u200D\u0DBB\u0DD3 \u0DBD\u0D82\u0D9A\u0DCF\u0DC0", "94", ".lk", Continent.Asia),
1516
+ C("SD", "SDN", 729, "Sudan", "Sudan", "\u0627\u0644\u0633\u0648\u062F\u0627\u0646", "249", ".sd", Continent.Africa),
1517
+ C("SR", "SUR", 740, "Suriname", "Surinam", "Suriname", "597", ".sr", Continent.SouthAmerica),
1518
+ C("SE", "SWE", 752, "Sweden", "Sverige", "Sverige", "46", ".se", Continent.Europe),
1519
+ C("CH", "CHE", 756, "Switzerland", "Schweiz", "Schweiz", "41", ".ch", Continent.Europe),
1520
+ C("SY", "SYR", 760, "Syria", "Syrien", "\u0633\u0648\u0631\u064A\u0627", "963", ".sy", Continent.Asia),
1521
+ C("TW", "TWN", 158, "Taiwan", "Taiwan", "\u81FA\u7063", "886", ".tw", Continent.Asia),
1522
+ C("TJ", "TJK", 762, "Tajikistan", "Tadzjikistan", "\u0422\u043E\u04B7\u0438\u043A\u0438\u0441\u0442\u043E\u043D", "992", ".tj", Continent.Asia),
1523
+ C("TZ", "TZA", 834, "Tanzania", "Tanzania", "Tanzania", "255", ".tz", Continent.Africa),
1524
+ C("TH", "THA", 764, "Thailand", "Thailand", "\u0E1B\u0E23\u0E30\u0E40\u0E17\u0E28\u0E44\u0E17\u0E22", "66", ".th", Continent.Asia),
1525
+ C("TL", "TLS", 626, "Timor-Leste", "\xD6sttimor", "Timor-Leste", "670", ".tl", Continent.Asia),
1526
+ C("TG", "TGO", 768, "Togo", "Togo", "Togo", "228", ".tg", Continent.Africa),
1527
+ C("TO", "TON", 776, "Tonga", "Tonga", "Tonga", "676", ".to", Continent.Oceania),
1528
+ C(
1529
+ "TT",
1530
+ "TTO",
1531
+ 780,
1532
+ "Trinidad and Tobago",
1533
+ "Trinidad och Tobago",
1534
+ "Trinidad and Tobago",
1535
+ "1",
1536
+ ".tt",
1537
+ Continent.NorthAmerica
1538
+ ),
1539
+ C("TN", "TUN", 788, "Tunisia", "Tunisien", "\u062A\u0648\u0646\u0633", "216", ".tn", Continent.Africa),
1540
+ C("TR", "TUR", 792, "Turkey", "Turkiet", "T\xFCrkiye", "90", ".tr", Continent.Asia),
1541
+ C("TM", "TKM", 795, "Turkmenistan", "Turkmenistan", "T\xFCrkmenistan", "993", ".tm", Continent.Asia),
1542
+ C("TV", "TUV", 798, "Tuvalu", "Tuvalu", "Tuvalu", "688", ".tv", Continent.Oceania),
1543
+ C("UG", "UGA", 800, "Uganda", "Uganda", "Uganda", "256", ".ug", Continent.Africa),
1544
+ C("UA", "UKR", 804, "Ukraine", "Ukraina", "\u0423\u043A\u0440\u0430\u0457\u043D\u0430", "380", ".ua", Continent.Europe),
1545
+ C(
1546
+ "AE",
1547
+ "ARE",
1548
+ 784,
1549
+ "United Arab Emirates",
1550
+ "F\xF6renade Arabemiraten",
1551
+ "\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062A",
1552
+ "971",
1553
+ ".ae",
1554
+ Continent.Asia
1555
+ ),
1556
+ C(
1557
+ "GB",
1558
+ "GBR",
1559
+ 826,
1560
+ "United Kingdom",
1561
+ "Storbritannien",
1562
+ "United Kingdom",
1563
+ "44",
1564
+ ".uk",
1565
+ Continent.Europe
1566
+ ),
1567
+ C(
1568
+ "US",
1569
+ "USA",
1570
+ 840,
1571
+ "United States",
1572
+ "F\xF6renta staterna",
1573
+ "United States",
1574
+ "1",
1575
+ ".us",
1576
+ Continent.NorthAmerica
1577
+ ),
1578
+ C("UY", "URY", 858, "Uruguay", "Uruguay", "Uruguay", "598", ".uy", Continent.SouthAmerica),
1579
+ C("UZ", "UZB", 860, "Uzbekistan", "Uzbekistan", "O\u02BBzbekiston", "998", ".uz", Continent.Asia),
1580
+ C("VU", "VUT", 548, "Vanuatu", "Vanuatu", "Vanuatu", "678", ".vu", Continent.Oceania),
1581
+ C(
1582
+ "VA",
1583
+ "VAT",
1584
+ 336,
1585
+ "Vatican City",
1586
+ "Vatikanstaten",
1587
+ "Citt\xE0 del Vaticano",
1588
+ "379",
1589
+ ".va",
1590
+ Continent.Europe
1591
+ ),
1592
+ C("VE", "VEN", 862, "Venezuela", "Venezuela", "Venezuela", "58", ".ve", Continent.SouthAmerica),
1593
+ C("VN", "VNM", 704, "Vietnam", "Vietnam", "Vi\u1EC7t Nam", "84", ".vn", Continent.Asia),
1594
+ C("YE", "YEM", 887, "Yemen", "Jemen", "\u0627\u0644\u064A\u0645\u0646", "967", ".ye", Continent.Asia),
1595
+ C("ZM", "ZMB", 894, "Zambia", "Zambia", "Zambia", "260", ".zm", Continent.Africa),
1596
+ C("ZW", "ZWE", 716, "Zimbabwe", "Zimbabwe", "Zimbabwe", "263", ".zw", Continent.Africa),
1597
+ C("AX", "ALA", 248, "\xC5land Islands", "\xC5land", "\xC5land", "358", ".ax", Continent.Europe),
1598
+ C("FO", "FRO", 234, "Faroe Islands", "F\xE4r\xF6arna", "F\xF8royar", "298", ".fo", Continent.Europe),
1599
+ C("XK", "XKX", 0, "Kosovo", "Kosovo", "Kosova", "383", ".xk", Continent.Europe)
1600
+ ];
1601
+
1602
+ // src/geography/country-coordinates.ts
1603
+ var COUNTRY_COORDINATES = Object.freeze({
1604
+ AF: [33, 65],
1605
+ AL: [41, 20],
1606
+ DZ: [28, 3],
1607
+ AS: [-14.27, -170.7],
1608
+ AD: [42.5, 1.5],
1609
+ AO: [-12.5, 18.5],
1610
+ AG: [17.05, -61.8],
1611
+ AR: [-34, -64],
1612
+ AM: [40, 45],
1613
+ AW: [12.5, -69.97],
1614
+ AU: [-27, 133],
1615
+ AT: [47.33, 13.33],
1616
+ AZ: [40.5, 47.5],
1617
+ BS: [24.25, -76],
1618
+ BH: [26, 50.55],
1619
+ BD: [24, 90],
1620
+ BB: [13.17, -59.53],
1621
+ BY: [53, 28],
1622
+ BE: [50.83, 4],
1623
+ BZ: [17.25, -88.75],
1624
+ BJ: [9.5, 2.25],
1625
+ BM: [32.33, -64.75],
1626
+ BT: [27.5, 90.5],
1627
+ BO: [-17, -65],
1628
+ BA: [44, 18],
1629
+ BW: [-22, 24],
1630
+ BR: [-10, -55],
1631
+ BN: [4.5, 114.67],
1632
+ BG: [43, 25],
1633
+ BF: [13, -2],
1634
+ BI: [-3.5, 30],
1635
+ CV: [16, -24],
1636
+ KH: [13, 105],
1637
+ CM: [6, 12],
1638
+ CA: [60, -95],
1639
+ CF: [7, 21],
1640
+ TD: [15, 19],
1641
+ CL: [-30, -71],
1642
+ CN: [35, 105],
1643
+ CO: [4, -72],
1644
+ KM: [-12.17, 44.25],
1645
+ CG: [-1, 15],
1646
+ CD: [0, 25],
1647
+ CR: [10, -84],
1648
+ CI: [8, -5],
1649
+ HR: [45.17, 15.5],
1650
+ CU: [21.5, -80],
1651
+ CW: [12.17, -68.98],
1652
+ CY: [35, 33],
1653
+ CZ: [49.75, 15.5],
1654
+ DK: [56, 10],
1655
+ DJ: [11.5, 43],
1656
+ DM: [15.42, -61.33],
1657
+ DO: [19, -70.67],
1658
+ EC: [-2, -77.5],
1659
+ EG: [27, 30],
1660
+ SV: [13.83, -88.92],
1661
+ GQ: [2, 10],
1662
+ ER: [15, 39],
1663
+ EE: [59, 26],
1664
+ SZ: [-26.5, 31.5],
1665
+ ET: [8, 38],
1666
+ FJ: [-18, 175],
1667
+ FI: [64, 26],
1668
+ FR: [46, 2],
1669
+ GA: [-1, 11.75],
1670
+ GM: [13.47, -16.57],
1671
+ GE: [42, 43.5],
1672
+ DE: [51, 9],
1673
+ GH: [8, -2],
1674
+ GI: [36.13, -5.35],
1675
+ GR: [39, 22],
1676
+ GL: [72, -40],
1677
+ GD: [12.12, -61.67],
1678
+ GU: [13.47, 144.78],
1679
+ GT: [15.5, -90.25],
1680
+ GG: [49.45, -2.54],
1681
+ GN: [11, -10],
1682
+ GW: [12, -15],
1683
+ GY: [5, -59],
1684
+ HT: [19, -72.42],
1685
+ HN: [15, -86.5],
1686
+ HK: [22.25, 114.17],
1687
+ HU: [47, 20],
1688
+ IS: [65, -18],
1689
+ IN: [20, 77],
1690
+ ID: [-5, 120],
1691
+ IR: [32, 53],
1692
+ IQ: [33, 44],
1693
+ IE: [53, -8],
1694
+ IM: [54.23, -4.55],
1695
+ IL: [31.5, 34.75],
1696
+ IT: [42.83, 12.83],
1697
+ JM: [18.25, -77.5],
1698
+ JP: [36, 138],
1699
+ JE: [49.21, -2.13],
1700
+ JO: [31, 36],
1701
+ KZ: [48, 68],
1702
+ KE: [1, 38],
1703
+ KI: [1.42, 173],
1704
+ KP: [40, 127],
1705
+ KR: [37, 127.5],
1706
+ KW: [29.34, 47.66],
1707
+ KG: [41, 75],
1708
+ LA: [18, 105],
1709
+ LV: [57, 25],
1710
+ LB: [33.83, 35.83],
1711
+ LS: [-29.5, 28.5],
1712
+ LR: [6.5, -9.5],
1713
+ LY: [25, 17],
1714
+ LI: [47.17, 9.53],
1715
+ LT: [56, 24],
1716
+ LU: [49.75, 6.17],
1717
+ MO: [22.17, 113.55],
1718
+ MG: [-20, 47],
1719
+ MW: [-13.5, 34],
1720
+ MY: [2.5, 112.5],
1721
+ MV: [3.25, 73],
1722
+ ML: [17, -4],
1723
+ MT: [35.83, 14.58],
1724
+ MH: [9, 168],
1725
+ MR: [20, -12],
1726
+ MU: [-20.28, 57.55],
1727
+ MX: [23, -102],
1728
+ FM: [6.92, 158.25],
1729
+ MD: [47, 29],
1730
+ MC: [43.73, 7.42],
1731
+ MN: [46, 105],
1732
+ ME: [42, 19],
1733
+ MA: [32, -5],
1734
+ MZ: [-18.25, 35],
1735
+ MM: [22, 98],
1736
+ NA: [-22, 17],
1737
+ NR: [-0.53, 166.92],
1738
+ NP: [28, 84],
1739
+ NL: [52.5, 5.75],
1740
+ NZ: [-41, 174],
1741
+ NI: [13, -85],
1742
+ NE: [16, 8],
1743
+ NG: [10, 8],
1744
+ MK: [41.83, 22],
1745
+ NO: [62, 10],
1746
+ OM: [21, 57],
1747
+ PK: [30, 70],
1748
+ PW: [7.5, 134.5],
1749
+ PS: [32, 35.25],
1750
+ PA: [9, -80],
1751
+ PG: [-6, 147],
1752
+ PY: [-23, -58],
1753
+ PE: [-10, -76],
1754
+ PH: [13, 122],
1755
+ PL: [52, 20],
1756
+ PT: [39.5, -8],
1757
+ PR: [18.25, -66.5],
1758
+ QA: [25.5, 51.25],
1759
+ RO: [46, 25],
1760
+ RU: [60, 100],
1761
+ RW: [-2, 30],
1762
+ KN: [17.33, -62.75],
1763
+ LC: [13.88, -61.13],
1764
+ VC: [13.25, -61.2],
1765
+ WS: [-13.58, -172.33],
1766
+ SM: [43.77, 12.42],
1767
+ ST: [1, 7],
1768
+ SA: [25, 45],
1769
+ SN: [14, -14],
1770
+ RS: [44, 21],
1771
+ SC: [-4.58, 55.67],
1772
+ SL: [8.5, -11.5],
1773
+ SG: [1.37, 103.8],
1774
+ SK: [48.67, 19.5],
1775
+ SI: [46.12, 14.82],
1776
+ SB: [-8, 159],
1777
+ SO: [10, 49],
1778
+ ZA: [-29, 24],
1779
+ SS: [8, 30],
1780
+ ES: [40, -4],
1781
+ LK: [7, 81],
1782
+ SD: [15, 30],
1783
+ SR: [4, -56],
1784
+ SE: [62, 15],
1785
+ CH: [47, 8],
1786
+ SY: [35, 38],
1787
+ TW: [23.5, 121],
1788
+ TJ: [39, 71],
1789
+ TZ: [-6, 35],
1790
+ TH: [15, 100],
1791
+ TL: [-8.55, 125.73],
1792
+ TG: [8, 1.17],
1793
+ TO: [-20, -175],
1794
+ TT: [11, -61],
1795
+ TN: [34, 9],
1796
+ TR: [39, 35],
1797
+ TM: [40, 60],
1798
+ TV: [-8, 178],
1799
+ UG: [1, 32],
1800
+ UA: [49, 32],
1801
+ AE: [24, 54],
1802
+ GB: [54, -2],
1803
+ US: [38, -97],
1804
+ UY: [-33, -56],
1805
+ UZ: [41, 64],
1806
+ VU: [-16, 167],
1807
+ VA: [41.9, 12.45],
1808
+ VE: [8, -66],
1809
+ VN: [16, 106],
1810
+ YE: [15, 48],
1811
+ ZM: [-15, 30],
1812
+ ZW: [-20, 30],
1813
+ AX: [60.12, 19.9],
1814
+ FO: [62, -7],
1815
+ XK: [42.67, 21.17]
1816
+ });
1817
+
1818
+ // src/geography/country-capital.ts
1819
+ var CountryCapital = class {
1820
+ englishName;
1821
+ localizedName;
1822
+ nativeName;
1823
+ coordinate;
1824
+ /** @internal */
1825
+ constructor(englishName, localizedName, nativeName, coordinate) {
1826
+ this.englishName = englishName;
1827
+ this.localizedName = localizedName;
1828
+ this.nativeName = nativeName;
1829
+ this.coordinate = coordinate;
1830
+ }
1831
+ /** Capital city name in the current display language. */
1832
+ get displayName() {
1833
+ return PrimitivesDefaults.useLocalizedDisplayNames ? this.localizedName : this.englishName;
1834
+ }
1835
+ toString() {
1836
+ return this.displayName;
1837
+ }
1838
+ };
1839
+
1840
+ // src/geography/country-capitals.ts
1841
+ var RAW = {
1842
+ AF: { en: "Kabul", sv: "Kabul", native: "\u06A9\u0627\u0628\u0644", lat: 34.53, lon: 69.17 },
1843
+ AL: { en: "Tirana", sv: "Tirana", native: "Tiran\xEB", lat: 41.33, lon: 19.82 },
1844
+ DZ: { en: "Algiers", sv: "Alger", native: "\u0627\u0644\u062C\u0632\u0627\u0626\u0631", lat: 36.75, lon: 3.04 },
1845
+ AD: {
1846
+ en: "Andorra la Vella",
1847
+ sv: "Andorra la Vella",
1848
+ native: "Andorra la Vella",
1849
+ lat: 42.51,
1850
+ lon: 1.52
1851
+ },
1852
+ AO: { en: "Luanda", sv: "Luanda", native: "Luanda", lat: -8.84, lon: 13.23 },
1853
+ AG: { en: "St. John's", sv: "Saint John's", native: "St. John's", lat: 17.12, lon: -61.85 },
1854
+ AR: { en: "Buenos Aires", sv: "Buenos Aires", native: "Buenos Aires", lat: -34.61, lon: -58.38 },
1855
+ AM: { en: "Yerevan", sv: "Jerevan", native: "\u0535\u0580\u0587\u0561\u0576", lat: 40.18, lon: 44.51 },
1856
+ AU: { en: "Canberra", sv: "Canberra", native: "Canberra", lat: -35.28, lon: 149.13 },
1857
+ AT: { en: "Vienna", sv: "Wien", native: "Wien", lat: 48.21, lon: 16.37 },
1858
+ AZ: { en: "Baku", sv: "Baku", native: "Bak\u0131", lat: 40.41, lon: 49.87 },
1859
+ BS: { en: "Nassau", sv: "Nassau", native: "Nassau", lat: 25.06, lon: -77.34 },
1860
+ BH: { en: "Manama", sv: "Manama", native: "\u0627\u0644\u0645\u0646\u0627\u0645\u0629", lat: 26.23, lon: 50.59 },
1861
+ BD: { en: "Dhaka", sv: "Dhaka", native: "\u09A2\u09BE\u0995\u09BE", lat: 23.71, lon: 90.41 },
1862
+ BB: { en: "Bridgetown", sv: "Bridgetown", native: "Bridgetown", lat: 13.1, lon: -59.62 },
1863
+ BY: { en: "Minsk", sv: "Minsk", native: "\u041C\u0456\u043D\u0441\u043A", lat: 53.9, lon: 27.57 },
1864
+ BE: { en: "Brussels", sv: "Bryssel", native: "Bruxelles", lat: 50.85, lon: 4.35 },
1865
+ BZ: { en: "Belmopan", sv: "Belmopan", native: "Belmopan", lat: 17.25, lon: -88.77 },
1866
+ BJ: { en: "Porto-Novo", sv: "Porto-Novo", native: "Porto-Novo", lat: 6.5, lon: 2.6 },
1867
+ BT: { en: "Thimphu", sv: "Thimphu", native: "\u0F50\u0F72\u0F58\u0F0B\u0F55\u0F74", lat: 27.47, lon: 89.64 },
1868
+ BO: { en: "Sucre", sv: "Sucre", native: "Sucre", lat: -19.04, lon: -65.26 },
1869
+ BA: { en: "Sarajevo", sv: "Sarajevo", native: "Sarajevo", lat: 43.86, lon: 18.41 },
1870
+ BW: { en: "Gaborone", sv: "Gaborone", native: "Gaborone", lat: -24.65, lon: 25.91 },
1871
+ BR: { en: "Bras\xEDlia", sv: "Bras\xEDlia", native: "Bras\xEDlia", lat: -15.79, lon: -47.88 },
1872
+ BN: {
1873
+ en: "Bandar Seri Begawan",
1874
+ sv: "Bandar Seri Begawan",
1875
+ native: "Bandar Seri Begawan",
1876
+ lat: 4.94,
1877
+ lon: 114.95
1878
+ },
1879
+ BG: { en: "Sofia", sv: "Sofia", native: "\u0421\u043E\u0444\u0438\u044F", lat: 42.7, lon: 23.32 },
1880
+ BF: { en: "Ouagadougou", sv: "Ouagadougou", native: "Ouagadougou", lat: 12.37, lon: -1.52 },
1881
+ BI: { en: "Gitega", sv: "Gitega", native: "Gitega", lat: -3.43, lon: 29.93 },
1882
+ CV: { en: "Praia", sv: "Praia", native: "Praia", lat: 14.92, lon: -23.51 },
1883
+ KH: { en: "Phnom Penh", sv: "Phnom Penh", native: "\u1797\u17D2\u1793\u17C6\u1796\u17C1\u1789", lat: 11.56, lon: 104.93 },
1884
+ CM: { en: "Yaound\xE9", sv: "Yaound\xE9", native: "Yaound\xE9", lat: 3.87, lon: 11.52 },
1885
+ CA: { en: "Ottawa", sv: "Ottawa", native: "Ottawa", lat: 45.42, lon: -75.7 },
1886
+ CF: { en: "Bangui", sv: "Bangui", native: "Bangui", lat: 4.37, lon: 18.59 },
1887
+ TD: { en: "N'Djamena", sv: "N'Djamena", native: "N'Djamena", lat: 12.11, lon: 15.05 },
1888
+ CL: { en: "Santiago", sv: "Santiago", native: "Santiago", lat: -33.45, lon: -70.67 },
1889
+ CN: { en: "Beijing", sv: "Peking", native: "\u5317\u4EAC", lat: 39.91, lon: 116.39 },
1890
+ CO: { en: "Bogot\xE1", sv: "Bogot\xE1", native: "Bogot\xE1", lat: 4.71, lon: -74.07 },
1891
+ KM: { en: "Moroni", sv: "Moroni", native: "Moroni", lat: -11.7, lon: 43.26 },
1892
+ CG: { en: "Brazzaville", sv: "Brazzaville", native: "Brazzaville", lat: -4.27, lon: 15.28 },
1893
+ CD: { en: "Kinshasa", sv: "Kinshasa", native: "Kinshasa", lat: -4.32, lon: 15.31 },
1894
+ CR: { en: "San Jos\xE9", sv: "San Jos\xE9", native: "San Jos\xE9", lat: 9.93, lon: -84.08 },
1895
+ CI: { en: "Yamoussoukro", sv: "Yamoussoukro", native: "Yamoussoukro", lat: 6.82, lon: -5.28 },
1896
+ HR: { en: "Zagreb", sv: "Zagreb", native: "Zagreb", lat: 45.81, lon: 15.98 },
1897
+ CU: { en: "Havana", sv: "Havanna", native: "La Habana", lat: 23.13, lon: -82.38 },
1898
+ CY: { en: "Nicosia", sv: "Nicosia", native: "\u039B\u03B5\u03C5\u03BA\u03C9\u03C3\u03AF\u03B1", lat: 35.17, lon: 33.37 },
1899
+ CZ: { en: "Prague", sv: "Prag", native: "Praha", lat: 50.09, lon: 14.42 },
1900
+ DK: { en: "Copenhagen", sv: "K\xF6penhamn", native: "K\xF8benhavn", lat: 55.68, lon: 12.57 },
1901
+ DJ: { en: "Djibouti", sv: "Djibouti", native: "Djibouti", lat: 11.59, lon: 43.15 },
1902
+ DM: { en: "Roseau", sv: "Roseau", native: "Roseau", lat: 15.3, lon: -61.39 },
1903
+ DO: { en: "Santo Domingo", sv: "Santo Domingo", native: "Santo Domingo", lat: 18.47, lon: -69.9 },
1904
+ EC: { en: "Quito", sv: "Quito", native: "Quito", lat: -0.18, lon: -78.47 },
1905
+ EG: { en: "Cairo", sv: "Kairo", native: "\u0627\u0644\u0642\u0627\u0647\u0631\u0629", lat: 30.04, lon: 31.24 },
1906
+ SV: { en: "San Salvador", sv: "San Salvador", native: "San Salvador", lat: 13.69, lon: -89.19 },
1907
+ GQ: { en: "Malabo", sv: "Malabo", native: "Malabo", lat: 3.75, lon: 8.78 },
1908
+ ER: { en: "Asmara", sv: "Asmara", native: "\u12A3\u1235\u1218\u122B", lat: 15.33, lon: 38.93 },
1909
+ EE: { en: "Tallinn", sv: "Tallinn", native: "Tallinn", lat: 59.44, lon: 24.75 },
1910
+ SZ: { en: "Mbabane", sv: "Mbabane", native: "Mbabane", lat: -26.32, lon: 31.13 },
1911
+ ET: { en: "Addis Ababa", sv: "Addis Abeba", native: "\u12A0\u12F2\u1235 \u12A0\u1260\u1263", lat: 9.02, lon: 38.75 },
1912
+ FJ: { en: "Suva", sv: "Suva", native: "Suva", lat: -18.14, lon: 178.44 },
1913
+ FI: { en: "Helsinki", sv: "Helsingfors", native: "Helsinki", lat: 60.17, lon: 24.94 },
1914
+ FR: { en: "Paris", sv: "Paris", native: "Paris", lat: 48.86, lon: 2.35 },
1915
+ GA: { en: "Libreville", sv: "Libreville", native: "Libreville", lat: 0.39, lon: 9.45 },
1916
+ GM: { en: "Banjul", sv: "Banjul", native: "Banjul", lat: 13.45, lon: -16.58 },
1917
+ GE: { en: "Tbilisi", sv: "Tbilisi", native: "\u10D7\u10D1\u10D8\u10DA\u10D8\u10E1\u10D8", lat: 41.69, lon: 44.8 },
1918
+ DE: { en: "Berlin", sv: "Berlin", native: "Berlin", lat: 52.52, lon: 13.41 },
1919
+ GH: { en: "Accra", sv: "Accra", native: "Accra", lat: 5.56, lon: -0.19 },
1920
+ GR: { en: "Athens", sv: "Aten", native: "\u0391\u03B8\u03AE\u03BD\u03B1", lat: 37.98, lon: 23.73 },
1921
+ GD: { en: "St. George's", sv: "Saint George's", native: "St. George's", lat: 12.05, lon: -61.75 },
1922
+ GT: {
1923
+ en: "Guatemala City",
1924
+ sv: "Guatemala City",
1925
+ native: "Ciudad de Guatemala",
1926
+ lat: 14.63,
1927
+ lon: -90.51
1928
+ },
1929
+ GN: { en: "Conakry", sv: "Conakry", native: "Conakry", lat: 9.54, lon: -13.68 },
1930
+ GW: { en: "Bissau", sv: "Bissau", native: "Bissau", lat: 11.86, lon: -15.6 },
1931
+ GY: { en: "Georgetown", sv: "Georgetown", native: "Georgetown", lat: 6.8, lon: -58.16 },
1932
+ HT: { en: "Port-au-Prince", sv: "Port-au-Prince", native: "P\xF2toprens", lat: 18.54, lon: -72.34 },
1933
+ HN: { en: "Tegucigalpa", sv: "Tegucigalpa", native: "Tegucigalpa", lat: 14.1, lon: -87.22 },
1934
+ HK: { en: "Hong Kong", sv: "Hongkong", native: "\u9999\u6E2F", lat: 22.28, lon: 114.16 },
1935
+ HU: { en: "Budapest", sv: "Budapest", native: "Budapest", lat: 47.5, lon: 19.04 },
1936
+ IS: { en: "Reykjavik", sv: "Reykjavik", native: "Reykjav\xEDk", lat: 64.14, lon: -21.9 },
1937
+ IN: { en: "New Delhi", sv: "New Delhi", native: "\u0928\u0908 \u0926\u093F\u0932\u094D\u0932\u0940", lat: 28.61, lon: 77.21 },
1938
+ ID: { en: "Jakarta", sv: "Jakarta", native: "Jakarta", lat: -6.21, lon: 106.85 },
1939
+ IR: { en: "Tehran", sv: "Teheran", native: "\u062A\u0647\u0631\u0627\u0646", lat: 35.69, lon: 51.39 },
1940
+ IQ: { en: "Baghdad", sv: "Bagdad", native: "\u0628\u063A\u062F\u0627\u062F", lat: 33.34, lon: 44.4 },
1941
+ IE: { en: "Dublin", sv: "Dublin", native: "Baile \xC1tha Cliath", lat: 53.35, lon: -6.26 },
1942
+ IL: { en: "Jerusalem", sv: "Jerusalem", native: "\u05D9\u05E8\u05D5\u05E9\u05DC\u05D9\u05DD", lat: 31.77, lon: 35.23 },
1943
+ IT: { en: "Rome", sv: "Rom", native: "Roma", lat: 41.9, lon: 12.5 },
1944
+ JM: { en: "Kingston", sv: "Kingston", native: "Kingston", lat: 18, lon: -76.79 },
1945
+ JP: { en: "Tokyo", sv: "Tokyo", native: "\u6771\u4EAC", lat: 35.68, lon: 139.69 },
1946
+ JO: { en: "Amman", sv: "Amman", native: "\u0639\u0645\u0651\u0627\u0646", lat: 31.95, lon: 35.93 },
1947
+ KZ: { en: "Astana", sv: "Astana", native: "\u0410\u0441\u0442\u0430\u043D\u0430", lat: 51.17, lon: 71.43 },
1948
+ KE: { en: "Nairobi", sv: "Nairobi", native: "Nairobi", lat: -1.29, lon: 36.82 },
1949
+ KI: { en: "Tarawa", sv: "Tarawa", native: "Tarawa", lat: 1.45, lon: 173 },
1950
+ KP: { en: "Pyongyang", sv: "Pyongyang", native: "\uD3C9\uC591", lat: 39.02, lon: 125.75 },
1951
+ KR: { en: "Seoul", sv: "Seoul", native: "\uC11C\uC6B8", lat: 37.57, lon: 126.98 },
1952
+ KW: { en: "Kuwait City", sv: "Kuwait City", native: "\u0645\u062F\u064A\u0646\u0629 \u0627\u0644\u0643\u0648\u064A\u062A", lat: 29.37, lon: 47.98 },
1953
+ KG: { en: "Bishkek", sv: "Bisjkek", native: "\u0411\u0438\u0448\u043A\u0435\u043A", lat: 42.87, lon: 74.59 },
1954
+ LA: { en: "Vientiane", sv: "Vientiane", native: "\u0EA7\u0EBD\u0E87\u0E88\u0EB1\u0E99", lat: 17.97, lon: 102.63 },
1955
+ LV: { en: "Riga", sv: "Riga", native: "R\u012Bga", lat: 56.95, lon: 24.11 },
1956
+ LB: { en: "Beirut", sv: "Beirut", native: "\u0628\u064A\u0631\u0648\u062A", lat: 33.89, lon: 35.5 },
1957
+ LS: { en: "Maseru", sv: "Maseru", native: "Maseru", lat: -29.31, lon: 27.48 },
1958
+ LR: { en: "Monrovia", sv: "Monrovia", native: "Monrovia", lat: 6.3, lon: -10.8 },
1959
+ LY: { en: "Tripoli", sv: "Tripoli", native: "\u0637\u0631\u0627\u0628\u0644\u0633", lat: 32.9, lon: 13.18 },
1960
+ LI: { en: "Vaduz", sv: "Vaduz", native: "Vaduz", lat: 47.14, lon: 9.52 },
1961
+ LT: { en: "Vilnius", sv: "Vilnius", native: "Vilnius", lat: 54.69, lon: 25.28 },
1962
+ LU: { en: "Luxembourg City", sv: "Luxemburg", native: "L\xEBtzebuerg", lat: 49.61, lon: 6.13 },
1963
+ MO: { en: "Macao", sv: "Macao", native: "\u6FB3\u9580", lat: 22.2, lon: 113.54 },
1964
+ MG: { en: "Antananarivo", sv: "Antananarivo", native: "Antananarivo", lat: -18.91, lon: 47.53 },
1965
+ MW: { en: "Lilongwe", sv: "Lilongwe", native: "Lilongwe", lat: -13.97, lon: 33.79 },
1966
+ MY: { en: "Kuala Lumpur", sv: "Kuala Lumpur", native: "Kuala Lumpur", lat: 3.14, lon: 101.69 },
1967
+ MV: { en: "Mal\xE9", sv: "Mal\xE9", native: "\u0789\u07A7\u078D\u07AC", lat: 4.18, lon: 73.51 },
1968
+ ML: { en: "Bamako", sv: "Bamako", native: "Bamako", lat: 12.65, lon: -8 },
1969
+ MT: { en: "Valletta", sv: "Valletta", native: "Valletta", lat: 35.9, lon: 14.51 },
1970
+ MH: { en: "Majuro", sv: "Majuro", native: "Majuro", lat: 7.09, lon: 171.38 },
1971
+ MR: { en: "Nouakchott", sv: "Nouakchott", native: "\u0646\u0648\u0627\u0643\u0634\u0648\u0637", lat: 18.09, lon: -15.98 },
1972
+ MU: { en: "Port Louis", sv: "Port Louis", native: "Port Louis", lat: -20.16, lon: 57.5 },
1973
+ MX: { en: "Mexico City", sv: "Mexico City", native: "Ciudad de M\xE9xico", lat: 19.43, lon: -99.13 },
1974
+ FM: { en: "Palikir", sv: "Palikir", native: "Palikir", lat: 6.92, lon: 158.16 },
1975
+ MD: { en: "Chi\u0219in\u0103u", sv: "Chi\u0219in\u0103u", native: "Chi\u0219in\u0103u", lat: 47.01, lon: 28.86 },
1976
+ MC: { en: "Monaco", sv: "Monaco", native: "Monaco", lat: 43.73, lon: 7.42 },
1977
+ MN: { en: "Ulaanbaatar", sv: "Ulaanbaatar", native: "\u0423\u043B\u0430\u0430\u043D\u0431\u0430\u0430\u0442\u0430\u0440", lat: 47.91, lon: 106.91 },
1978
+ ME: { en: "Podgorica", sv: "Podgorica", native: "Podgorica", lat: 42.44, lon: 19.26 },
1979
+ MA: { en: "Rabat", sv: "Rabat", native: "\u0627\u0644\u0631\u0628\u0627\u0637", lat: 34.01, lon: -6.84 },
1980
+ MZ: { en: "Maputo", sv: "Maputo", native: "Maputo", lat: -25.97, lon: 32.57 },
1981
+ MM: { en: "Naypyidaw", sv: "Naypyidaw", native: "\u1014\u1031\u1015\u103C\u100A\u103A\u1010\u1031\u102C\u103A", lat: 19.76, lon: 96.07 },
1982
+ NA: { en: "Windhoek", sv: "Windhoek", native: "Windhoek", lat: -22.57, lon: 17.08 },
1983
+ NR: { en: "Yaren", sv: "Yaren", native: "Yaren", lat: -0.55, lon: 166.93 },
1984
+ NP: { en: "Kathmandu", sv: "Kathmandu", native: "\u0915\u093E\u0920\u092E\u093E\u0921\u094C\u0902", lat: 27.7, lon: 85.32 },
1985
+ NL: { en: "Amsterdam", sv: "Amsterdam", native: "Amsterdam", lat: 52.37, lon: 4.9 },
1986
+ NZ: { en: "Wellington", sv: "Wellington", native: "Wellington", lat: -41.29, lon: 174.78 },
1987
+ NI: { en: "Managua", sv: "Managua", native: "Managua", lat: 12.15, lon: -86.27 },
1988
+ NE: { en: "Niamey", sv: "Niamey", native: "Niamey", lat: 13.51, lon: 2.11 },
1989
+ NG: { en: "Abuja", sv: "Abuja", native: "Abuja", lat: 9.06, lon: 7.49 },
1990
+ MK: { en: "Skopje", sv: "Skopje", native: "\u0421\u043A\u043E\u043F\u0458\u0435", lat: 42, lon: 21.43 },
1991
+ NO: { en: "Oslo", sv: "Oslo", native: "Oslo", lat: 59.91, lon: 10.75 },
1992
+ OM: { en: "Muscat", sv: "Muskat", native: "\u0645\u0633\u0642\u0637", lat: 23.59, lon: 58.54 },
1993
+ PK: { en: "Islamabad", sv: "Islamabad", native: "\u0627\u0633\u0644\u0627\u0645 \u0622\u0628\u0627\u062F", lat: 33.69, lon: 73.04 },
1994
+ PW: { en: "Ngerulmud", sv: "Ngerulmud", native: "Ngerulmud", lat: 7.5, lon: 134.62 },
1995
+ PS: { en: "Ramallah", sv: "Ramallah", native: "\u0631\u0627\u0645 \u0627\u0644\u0644\u0647", lat: 31.9, lon: 35.2 },
1996
+ PA: { en: "Panama City", sv: "Panama City", native: "Ciudad de Panam\xE1", lat: 8.98, lon: -79.52 },
1997
+ PG: { en: "Port Moresby", sv: "Port Moresby", native: "Port Moresby", lat: -9.48, lon: 147.15 },
1998
+ PY: { en: "Asunci\xF3n", sv: "Asunci\xF3n", native: "Asunci\xF3n", lat: -25.26, lon: -57.58 },
1999
+ PE: { en: "Lima", sv: "Lima", native: "Lima", lat: -12.05, lon: -77.04 },
2000
+ PH: { en: "Manila", sv: "Manila", native: "Maynila", lat: 14.6, lon: 120.98 },
2001
+ PL: { en: "Warsaw", sv: "Warszawa", native: "Warszawa", lat: 52.23, lon: 21.01 },
2002
+ PT: { en: "Lisbon", sv: "Lissabon", native: "Lisboa", lat: 38.72, lon: -9.14 },
2003
+ PR: { en: "San Juan", sv: "San Juan", native: "San Juan", lat: 18.47, lon: -66.11 },
2004
+ QA: { en: "Doha", sv: "Doha", native: "\u0627\u0644\u062F\u0648\u062D\u0629", lat: 25.29, lon: 51.53 },
2005
+ RO: { en: "Bucharest", sv: "Bukarest", native: "Bucure\u0219ti", lat: 44.43, lon: 26.1 },
2006
+ RU: { en: "Moscow", sv: "Moskva", native: "\u041C\u043E\u0441\u043A\u0432\u0430", lat: 55.76, lon: 37.62 },
2007
+ RW: { en: "Kigali", sv: "Kigali", native: "Kigali", lat: -1.94, lon: 30.06 },
2008
+ KN: { en: "Basseterre", sv: "Basseterre", native: "Basseterre", lat: 17.3, lon: -62.72 },
2009
+ LC: { en: "Castries", sv: "Castries", native: "Castries", lat: 14.01, lon: -61 },
2010
+ VC: { en: "Kingstown", sv: "Kingstown", native: "Kingstown", lat: 13.15, lon: -61.22 },
2011
+ WS: { en: "Apia", sv: "Apia", native: "Apia", lat: -13.83, lon: -171.76 },
2012
+ SM: { en: "San Marino", sv: "San Marino", native: "San Marino", lat: 43.94, lon: 12.45 },
2013
+ ST: { en: "S\xE3o Tom\xE9", sv: "S\xE3o Tom\xE9", native: "S\xE3o Tom\xE9", lat: 0.34, lon: 6.73 },
2014
+ SA: { en: "Riyadh", sv: "Riyadh", native: "\u0627\u0644\u0631\u064A\u0627\u0636", lat: 24.69, lon: 46.72 },
2015
+ SN: { en: "Dakar", sv: "Dakar", native: "Dakar", lat: 14.69, lon: -17.44 },
2016
+ RS: { en: "Belgrade", sv: "Belgrad", native: "\u0411\u0435\u043E\u0433\u0440\u0430\u0434", lat: 44.82, lon: 20.46 },
2017
+ SC: { en: "Victoria", sv: "Victoria", native: "Victoria", lat: -4.62, lon: 55.45 },
2018
+ SL: { en: "Freetown", sv: "Freetown", native: "Freetown", lat: 8.48, lon: -13.23 },
2019
+ SG: { en: "Singapore", sv: "Singapore", native: "Singapore", lat: 1.29, lon: 103.85 },
2020
+ SK: { en: "Bratislava", sv: "Bratislava", native: "Bratislava", lat: 48.14, lon: 17.11 },
2021
+ SI: { en: "Ljubljana", sv: "Ljubljana", native: "Ljubljana", lat: 46.05, lon: 14.51 },
2022
+ SB: { en: "Honiara", sv: "Honiara", native: "Honiara", lat: -9.43, lon: 159.96 },
2023
+ SO: { en: "Mogadishu", sv: "Mogadishu", native: "Muqdisho", lat: 2.05, lon: 45.32 },
2024
+ ZA: { en: "Pretoria", sv: "Pretoria", native: "Pretoria", lat: -25.75, lon: 28.19 },
2025
+ SS: { en: "Juba", sv: "Juba", native: "Juba", lat: 4.85, lon: 31.58 },
2026
+ ES: { en: "Madrid", sv: "Madrid", native: "Madrid", lat: 40.42, lon: -3.7 },
2027
+ LK: {
2028
+ en: "Sri Jayawardenepura Kotte",
2029
+ sv: "Sri Jayawardenepura Kotte",
2030
+ native: "\u0DC1\u0DCA\u200D\u0DBB\u0DD3 \u0DA2\u0DBA\u0DC0\u0DBB\u0DCA\u0DB0\u0DB1\u0DB4\u0DD4\u0DBB \u0D9A\u0DDD\u0DA7\u0DCA\u0DA7\u0DDA",
2031
+ lat: 6.89,
2032
+ lon: 79.92
2033
+ },
2034
+ SD: { en: "Khartoum", sv: "Khartoum", native: "\u0627\u0644\u062E\u0631\u0637\u0648\u0645", lat: 15.59, lon: 32.53 },
2035
+ SR: { en: "Paramaribo", sv: "Paramaribo", native: "Paramaribo", lat: 5.83, lon: -55.17 },
2036
+ SE: { en: "Stockholm", sv: "Stockholm", native: "Stockholm", lat: 59.33, lon: 18.07 },
2037
+ CH: { en: "Bern", sv: "Bern", native: "Bern", lat: 46.95, lon: 7.45 },
2038
+ SY: { en: "Damascus", sv: "Damaskus", native: "\u062F\u0645\u0634\u0642", lat: 33.51, lon: 36.29 },
2039
+ TW: { en: "Taipei", sv: "Taipei", native: "\u81FA\u5317", lat: 25.03, lon: 121.57 },
2040
+ TJ: { en: "Dushanbe", sv: "Dusjanbe", native: "\u0414\u0443\u0448\u0430\u043D\u0431\u0435", lat: 38.56, lon: 68.77 },
2041
+ TZ: { en: "Dodoma", sv: "Dodoma", native: "Dodoma", lat: -6.16, lon: 35.75 },
2042
+ TH: { en: "Bangkok", sv: "Bangkok", native: "\u0E01\u0E23\u0E38\u0E07\u0E40\u0E17\u0E1E\u0E21\u0E2B\u0E32\u0E19\u0E04\u0E23", lat: 13.76, lon: 100.5 },
2043
+ TL: { en: "Dili", sv: "Dili", native: "Dili", lat: -8.56, lon: 125.57 },
2044
+ TG: { en: "Lom\xE9", sv: "Lom\xE9", native: "Lom\xE9", lat: 6.14, lon: 1.21 },
2045
+ TO: { en: "Nuku\u02BBalofa", sv: "Nuku\u02BBalofa", native: "Nuku\u02BBalofa", lat: -21.21, lon: -175.2 },
2046
+ TT: {
2047
+ en: "Port of Spain",
2048
+ sv: "Port of Spain",
2049
+ native: "Port of Spain",
2050
+ lat: 10.66,
2051
+ lon: -61.51
2052
+ },
2053
+ TN: { en: "Tunis", sv: "Tunis", native: "\u062A\u0648\u0646\u0633", lat: 36.81, lon: 10.17 },
2054
+ TR: { en: "Ankara", sv: "Ankara", native: "Ankara", lat: 39.93, lon: 32.86 },
2055
+ TM: { en: "Ashgabat", sv: "Asjchabad", native: "A\u015Fgabat", lat: 37.95, lon: 58.38 },
2056
+ TV: { en: "Funafuti", sv: "Funafuti", native: "Funafuti", lat: -8.52, lon: 179.2 },
2057
+ UG: { en: "Kampala", sv: "Kampala", native: "Kampala", lat: 0.31, lon: 32.58 },
2058
+ UA: { en: "Kyiv", sv: "Kiev", native: "\u041A\u0438\u0457\u0432", lat: 50.45, lon: 30.52 },
2059
+ AE: { en: "Abu Dhabi", sv: "Abu Dhabi", native: "\u0623\u0628\u0648 \u0638\u0628\u064A", lat: 24.45, lon: 54.65 },
2060
+ GB: { en: "London", sv: "London", native: "London", lat: 51.51, lon: -0.13 },
2061
+ US: {
2062
+ en: "Washington, D.C.",
2063
+ sv: "Washington, D.C.",
2064
+ native: "Washington, D.C.",
2065
+ lat: 38.9,
2066
+ lon: -77.04
2067
+ },
2068
+ UY: { en: "Montevideo", sv: "Montevideo", native: "Montevideo", lat: -34.88, lon: -56.19 },
2069
+ UZ: { en: "Tashkent", sv: "Tasjkent", native: "Toshkent", lat: 41.3, lon: 69.28 },
2070
+ VU: { en: "Port Vila", sv: "Port Vila", native: "Port Vila", lat: -17.74, lon: 168.31 },
2071
+ VA: {
2072
+ en: "Vatican City",
2073
+ sv: "Vatikanstaden",
2074
+ native: "Citt\xE0 del Vaticano",
2075
+ lat: 41.9,
2076
+ lon: 12.45
2077
+ },
2078
+ VE: { en: "Caracas", sv: "Caracas", native: "Caracas", lat: 10.49, lon: -66.9 },
2079
+ VN: { en: "Hanoi", sv: "Hanoi", native: "H\xE0 N\u1ED9i", lat: 21.03, lon: 105.85 },
2080
+ YE: { en: "Sana'a", sv: "Sana'a", native: "\u0635\u0646\u0639\u0627\u0621", lat: 15.35, lon: 44.21 },
2081
+ ZM: { en: "Lusaka", sv: "Lusaka", native: "Lusaka", lat: -15.39, lon: 28.32 },
2082
+ ZW: { en: "Harare", sv: "Harare", native: "Harare", lat: -17.83, lon: 31.05 },
2083
+ AX: { en: "Mariehamn", sv: "Mariehamn", native: "Mariehamn", lat: 60.1, lon: 19.94 },
2084
+ FO: { en: "T\xF3rshavn", sv: "Torshamn", native: "T\xF3rshavn", lat: 62.01, lon: -6.77 },
2085
+ XK: { en: "Pristina", sv: "Pristina", native: "Prishtin\xEB", lat: 42.66, lon: 21.17 },
2086
+ GI: { en: "Gibraltar", sv: "Gibraltar", native: "Gibraltar", lat: 36.14, lon: -5.35 },
2087
+ GL: { en: "Nuuk", sv: "Nuuk", native: "Nuuk", lat: 64.17, lon: -51.74 },
2088
+ GG: {
2089
+ en: "St. Peter Port",
2090
+ sv: "Saint Peter Port",
2091
+ native: "St. Peter Port",
2092
+ lat: 49.46,
2093
+ lon: -2.54
2094
+ },
2095
+ IM: { en: "Douglas", sv: "Douglas", native: "Douglas", lat: 54.15, lon: -4.48 },
2096
+ JE: { en: "St. Helier", sv: "Saint Helier", native: "St. Helier", lat: 49.19, lon: -2.1 }
2097
+ };
2098
+ function getCountryCapital(alpha2) {
2099
+ const r = RAW[alpha2];
2100
+ if (!r) return null;
2101
+ return new CountryCapital(r.en, r.sv, r.native, GeoCoordinate.create(r.lat, r.lon));
2102
+ }
2103
+
2104
+ // src/geography/country-metadata.ts
2105
+ var set = (codes) => {
2106
+ const s = /* @__PURE__ */ new Set();
2107
+ for (const c of codes) s.add(c.toUpperCase());
2108
+ return s;
2109
+ };
2110
+ var EU_COUNTRIES = set([
2111
+ "AT",
2112
+ "BE",
2113
+ "BG",
2114
+ "HR",
2115
+ "CY",
2116
+ "CZ",
2117
+ "DK",
2118
+ "EE",
2119
+ "FI",
2120
+ "FR",
2121
+ "DE",
2122
+ "GR",
2123
+ "HU",
2124
+ "IE",
2125
+ "IT",
2126
+ "LV",
2127
+ "LT",
2128
+ "LU",
2129
+ "MT",
2130
+ "NL",
2131
+ "PL",
2132
+ "PT",
2133
+ "RO",
2134
+ "SK",
2135
+ "SI",
2136
+ "ES",
2137
+ "SE"
2138
+ ]);
2139
+ var EEA_COUNTRIES = set([
2140
+ "AT",
2141
+ "BE",
2142
+ "BG",
2143
+ "HR",
2144
+ "CY",
2145
+ "CZ",
2146
+ "DK",
2147
+ "EE",
2148
+ "FI",
2149
+ "FR",
2150
+ "DE",
2151
+ "GR",
2152
+ "HU",
2153
+ "IE",
2154
+ "IT",
2155
+ "LV",
2156
+ "LT",
2157
+ "LU",
2158
+ "MT",
2159
+ "NL",
2160
+ "PL",
2161
+ "PT",
2162
+ "RO",
2163
+ "SK",
2164
+ "SI",
2165
+ "ES",
2166
+ "SE",
2167
+ "IS",
2168
+ "LI",
2169
+ "NO"
2170
+ ]);
2171
+ var SCHENGEN_COUNTRIES = set([
2172
+ "AT",
2173
+ "BE",
2174
+ "BG",
2175
+ "HR",
2176
+ "CZ",
2177
+ "DK",
2178
+ "EE",
2179
+ "FI",
2180
+ "FR",
2181
+ "DE",
2182
+ "GR",
2183
+ "HU",
2184
+ "IT",
2185
+ "LV",
2186
+ "LT",
2187
+ "LU",
2188
+ "MT",
2189
+ "NL",
2190
+ "PL",
2191
+ "PT",
2192
+ "RO",
2193
+ "SK",
2194
+ "SI",
2195
+ "ES",
2196
+ "SE",
2197
+ "IS",
2198
+ "LI",
2199
+ "NO",
2200
+ "CH"
2201
+ ]);
2202
+ var NORDIC_COUNTRIES = set(["DK", "FI", "IS", "NO", "SE"]);
2203
+ var SEPA_COUNTRIES = set([
2204
+ "AT",
2205
+ "BE",
2206
+ "BG",
2207
+ "HR",
2208
+ "CY",
2209
+ "CZ",
2210
+ "DK",
2211
+ "EE",
2212
+ "FI",
2213
+ "FR",
2214
+ "DE",
2215
+ "GR",
2216
+ "HU",
2217
+ "IE",
2218
+ "IT",
2219
+ "LV",
2220
+ "LT",
2221
+ "LU",
2222
+ "MT",
2223
+ "NL",
2224
+ "PL",
2225
+ "PT",
2226
+ "RO",
2227
+ "SK",
2228
+ "SI",
2229
+ "ES",
2230
+ "SE",
2231
+ "IS",
2232
+ "LI",
2233
+ "NO",
2234
+ "AL",
2235
+ "AD",
2236
+ "MD",
2237
+ "MC",
2238
+ "ME",
2239
+ "MK",
2240
+ "SM",
2241
+ "RS",
2242
+ "CH",
2243
+ "GB",
2244
+ "VA",
2245
+ "GG",
2246
+ "IM",
2247
+ "JE"
2248
+ ]);
2249
+ var COUNTRY_CURRENCIES = Object.freeze({
2250
+ AF: ["AFN"],
2251
+ AL: ["ALL"],
2252
+ DZ: ["DZD"],
2253
+ AS: ["USD"],
2254
+ AD: ["EUR"],
2255
+ AO: ["AOA"],
2256
+ AG: ["XCD"],
2257
+ AR: ["ARS"],
2258
+ AM: ["AMD"],
2259
+ AW: ["AWG"],
2260
+ AU: ["AUD"],
2261
+ AT: ["EUR"],
2262
+ AZ: ["AZN"],
2263
+ BS: ["BSD"],
2264
+ BH: ["BHD"],
2265
+ BD: ["BDT"],
2266
+ BB: ["BBD"],
2267
+ BY: ["BYN"],
2268
+ BE: ["EUR"],
2269
+ BZ: ["BZD"],
2270
+ BJ: ["XOF"],
2271
+ BM: ["BMD"],
2272
+ BT: ["BTN"],
2273
+ BO: ["BOB"],
2274
+ BA: ["BAM"],
2275
+ BW: ["BWP"],
2276
+ BR: ["BRL"],
2277
+ BN: ["BND"],
2278
+ BG: ["BGN"],
2279
+ BF: ["XOF"],
2280
+ BI: ["BIF"],
2281
+ CV: ["CVE"],
2282
+ KH: ["KHR"],
2283
+ CM: ["XAF"],
2284
+ CA: ["CAD"],
2285
+ CF: ["XAF"],
2286
+ TD: ["XAF"],
2287
+ CL: ["CLP"],
2288
+ CN: ["CNY"],
2289
+ CO: ["COP"],
2290
+ KM: ["KMF"],
2291
+ CG: ["XAF"],
2292
+ CD: ["CDF"],
2293
+ CR: ["CRC"],
2294
+ CI: ["XOF"],
2295
+ HR: ["EUR"],
2296
+ CU: ["CUP"],
2297
+ CW: ["ANG"],
2298
+ CY: ["EUR"],
2299
+ CZ: ["CZK"],
2300
+ DK: ["DKK"],
2301
+ DJ: ["DJF"],
2302
+ DM: ["XCD"],
2303
+ DO: ["DOP"],
2304
+ EC: ["USD"],
2305
+ EG: ["EGP"],
2306
+ SV: ["USD"],
2307
+ GQ: ["XAF"],
2308
+ ER: ["ERN"],
2309
+ EE: ["EUR"],
2310
+ SZ: ["SZL"],
2311
+ ET: ["ETB"],
2312
+ FJ: ["FJD"],
2313
+ FI: ["EUR"],
2314
+ FR: ["EUR"],
2315
+ GA: ["XAF"],
2316
+ GM: ["GMD"],
2317
+ GE: ["GEL"],
2318
+ DE: ["EUR"],
2319
+ GH: ["GHS"],
2320
+ GI: ["GIP"],
2321
+ GR: ["EUR"],
2322
+ GL: ["DKK"],
2323
+ GD: ["XCD"],
2324
+ GU: ["USD"],
2325
+ GT: ["GTQ"],
2326
+ GG: ["GBP"],
2327
+ GN: ["GNF"],
2328
+ GW: ["XOF"],
2329
+ GY: ["GYD"],
2330
+ HT: ["HTG"],
2331
+ HN: ["HNL"],
2332
+ HK: ["HKD"],
2333
+ HU: ["HUF"],
2334
+ IS: ["ISK"],
2335
+ IN: ["INR"],
2336
+ ID: ["IDR"],
2337
+ IR: ["IRR"],
2338
+ IQ: ["IQD"],
2339
+ IE: ["EUR"],
2340
+ IM: ["GBP"],
2341
+ IL: ["ILS"],
2342
+ IT: ["EUR"],
2343
+ JM: ["JMD"],
2344
+ JP: ["JPY"],
2345
+ JE: ["GBP"],
2346
+ JO: ["JOD"],
2347
+ KZ: ["KZT"],
2348
+ KE: ["KES"],
2349
+ KI: ["AUD"],
2350
+ KP: ["KPW"],
2351
+ KR: ["KRW"],
2352
+ KW: ["KWD"],
2353
+ KG: ["KGS"],
2354
+ LA: ["LAK"],
2355
+ LV: ["EUR"],
2356
+ LB: ["LBP"],
2357
+ LS: ["LSL"],
2358
+ LR: ["LRD"],
2359
+ LY: ["LYD"],
2360
+ LI: ["CHF"],
2361
+ LT: ["EUR"],
2362
+ LU: ["EUR"],
2363
+ MO: ["MOP"],
2364
+ MG: ["MGA"],
2365
+ MW: ["MWK"],
2366
+ MY: ["MYR"],
2367
+ MV: ["MVR"],
2368
+ ML: ["XOF"],
2369
+ MT: ["EUR"],
2370
+ MH: ["USD"],
2371
+ MR: ["MRU"],
2372
+ MU: ["MUR"],
2373
+ MX: ["MXN"],
2374
+ FM: ["USD"],
2375
+ MD: ["MDL"],
2376
+ MC: ["EUR"],
2377
+ MN: ["MNT"],
2378
+ ME: ["EUR"],
2379
+ MA: ["MAD"],
2380
+ MZ: ["MZN"],
2381
+ MM: ["MMK"],
2382
+ NA: ["NAD"],
2383
+ NR: ["AUD"],
2384
+ NP: ["NPR"],
2385
+ NL: ["EUR"],
2386
+ NZ: ["NZD"],
2387
+ NI: ["NIO"],
2388
+ NE: ["XOF"],
2389
+ NG: ["NGN"],
2390
+ MK: ["MKD"],
2391
+ NO: ["NOK"],
2392
+ OM: ["OMR"],
2393
+ PK: ["PKR"],
2394
+ PW: ["USD"],
2395
+ PS: ["ILS"],
2396
+ PA: ["PAB"],
2397
+ PG: ["PGK"],
2398
+ PY: ["PYG"],
2399
+ PE: ["PEN"],
2400
+ PH: ["PHP"],
2401
+ PL: ["PLN"],
2402
+ PT: ["EUR"],
2403
+ PR: ["USD"],
2404
+ QA: ["QAR"],
2405
+ RO: ["RON"],
2406
+ RU: ["RUB"],
2407
+ RW: ["RWF"],
2408
+ KN: ["XCD"],
2409
+ LC: ["XCD"],
2410
+ VC: ["XCD"],
2411
+ WS: ["WST"],
2412
+ SM: ["EUR"],
2413
+ ST: ["STN"],
2414
+ SA: ["SAR"],
2415
+ SN: ["XOF"],
2416
+ RS: ["RSD"],
2417
+ SC: ["SCR"],
2418
+ SL: ["SLE"],
2419
+ SG: ["SGD"],
2420
+ SK: ["EUR"],
2421
+ SI: ["EUR"],
2422
+ SB: ["SBD"],
2423
+ SO: ["SOS"],
2424
+ ZA: ["ZAR"],
2425
+ SS: ["SSP"],
2426
+ ES: ["EUR"],
2427
+ LK: ["LKR"],
2428
+ SD: ["SDG"],
2429
+ SR: ["SRD"],
2430
+ SE: ["SEK"],
2431
+ CH: ["CHF"],
2432
+ SY: ["SYP"],
2433
+ TW: ["TWD"],
2434
+ TJ: ["TJS"],
2435
+ TZ: ["TZS"],
2436
+ TH: ["THB"],
2437
+ TL: ["USD"],
2438
+ TG: ["XOF"],
2439
+ TO: ["TOP"],
2440
+ TT: ["TTD"],
2441
+ TN: ["TND"],
2442
+ TR: ["TRY"],
2443
+ TM: ["TMT"],
2444
+ TV: ["AUD"],
2445
+ UG: ["UGX"],
2446
+ UA: ["UAH"],
2447
+ AE: ["AED"],
2448
+ GB: ["GBP"],
2449
+ US: ["USD"],
2450
+ UY: ["UYU"],
2451
+ UZ: ["UZS"],
2452
+ VU: ["VUV"],
2453
+ VA: ["EUR"],
2454
+ VE: ["VES"],
2455
+ VN: ["VND"],
2456
+ YE: ["YER"],
2457
+ ZM: ["ZMW"],
2458
+ ZW: ["ZWG"],
2459
+ AX: ["EUR"],
2460
+ FO: ["DKK"],
2461
+ XK: ["EUR"]
2462
+ });
2463
+ var COUNTRY_LANGUAGES = Object.freeze({
2464
+ AF: ["ps", "fa"],
2465
+ AL: ["sq"],
2466
+ DZ: ["ar"],
2467
+ AD: ["ca"],
2468
+ AO: ["pt"],
2469
+ AG: ["en"],
2470
+ AR: ["es"],
2471
+ AM: ["hy"],
2472
+ AU: ["en"],
2473
+ AT: ["de"],
2474
+ AZ: ["az"],
2475
+ BS: ["en"],
2476
+ BH: ["ar"],
2477
+ BD: ["bn"],
2478
+ BB: ["en"],
2479
+ BY: ["be", "ru"],
2480
+ BE: ["nl", "fr", "de"],
2481
+ BZ: ["en"],
2482
+ BJ: ["fr"],
2483
+ BT: ["dz"],
2484
+ BO: ["es", "qu", "ay"],
2485
+ BA: ["bs", "hr", "sr"],
2486
+ BW: ["en", "tn"],
2487
+ BR: ["pt"],
2488
+ BN: ["ms"],
2489
+ BG: ["bg"],
2490
+ BF: ["fr"],
2491
+ BI: ["rn", "fr"],
2492
+ CV: ["pt"],
2493
+ KH: ["km"],
2494
+ CM: ["fr", "en"],
2495
+ CA: ["en", "fr"],
2496
+ CF: ["fr", "sg"],
2497
+ TD: ["fr", "ar"],
2498
+ CL: ["es"],
2499
+ CN: ["zh"],
2500
+ CO: ["es"],
2501
+ KM: ["ar", "fr"],
2502
+ CG: ["fr"],
2503
+ CD: ["fr"],
2504
+ CR: ["es"],
2505
+ CI: ["fr"],
2506
+ HR: ["hr"],
2507
+ CU: ["es"],
2508
+ CY: ["el", "tr"],
2509
+ CZ: ["cs"],
2510
+ DK: ["da"],
2511
+ DJ: ["fr", "ar"],
2512
+ DM: ["en"],
2513
+ DO: ["es"],
2514
+ EC: ["es"],
2515
+ EG: ["ar"],
2516
+ SV: ["es"],
2517
+ GQ: ["es", "fr", "pt"],
2518
+ ER: ["ti", "ar", "en"],
2519
+ EE: ["et"],
2520
+ SZ: ["en", "ss"],
2521
+ ET: ["am"],
2522
+ FJ: ["en", "fj"],
2523
+ FI: ["fi", "sv"],
2524
+ FR: ["fr"],
2525
+ GA: ["fr"],
2526
+ GM: ["en"],
2527
+ GE: ["ka"],
2528
+ DE: ["de"],
2529
+ GH: ["en"],
2530
+ GR: ["el"],
2531
+ GD: ["en"],
2532
+ GT: ["es"],
2533
+ GN: ["fr"],
2534
+ GW: ["pt"],
2535
+ GY: ["en"],
2536
+ HT: ["ht", "fr"],
2537
+ HN: ["es"],
2538
+ HU: ["hu"],
2539
+ IS: ["is"],
2540
+ IN: ["hi", "en"],
2541
+ ID: ["id"],
2542
+ IR: ["fa"],
2543
+ IQ: ["ar", "ku"],
2544
+ IE: ["en", "ga"],
2545
+ IL: ["he", "ar"],
2546
+ IT: ["it"],
2547
+ JM: ["en"],
2548
+ JP: ["ja"],
2549
+ JO: ["ar"],
2550
+ KZ: ["kk", "ru"],
2551
+ KE: ["en", "sw"],
2552
+ KI: ["en"],
2553
+ KP: ["ko"],
2554
+ KR: ["ko"],
2555
+ KW: ["ar"],
2556
+ KG: ["ky", "ru"],
2557
+ LA: ["lo"],
2558
+ LV: ["lv"],
2559
+ LB: ["ar", "fr"],
2560
+ LS: ["en", "st"],
2561
+ LR: ["en"],
2562
+ LY: ["ar"],
2563
+ LI: ["de"],
2564
+ LT: ["lt"],
2565
+ LU: ["lb", "fr", "de"],
2566
+ MG: ["mg", "fr"],
2567
+ MW: ["en", "ny"],
2568
+ MY: ["ms"],
2569
+ MV: ["dv"],
2570
+ ML: ["fr"],
2571
+ MT: ["mt", "en"],
2572
+ MH: ["en", "mh"],
2573
+ MR: ["ar"],
2574
+ MU: ["en"],
2575
+ MX: ["es"],
2576
+ MD: ["ro"],
2577
+ MC: ["fr"],
2578
+ MN: ["mn"],
2579
+ ME: ["sr"],
2580
+ MA: ["ar"],
2581
+ MZ: ["pt"],
2582
+ MM: ["my"],
2583
+ NA: ["en"],
2584
+ NR: ["en", "na"],
2585
+ NP: ["ne"],
2586
+ NL: ["nl"],
2587
+ NZ: ["en", "mi"],
2588
+ NI: ["es"],
2589
+ NE: ["fr"],
2590
+ NG: ["en"],
2591
+ MK: ["mk"],
2592
+ NO: ["no", "nb", "nn"],
2593
+ OM: ["ar"],
2594
+ PK: ["ur", "en"],
2595
+ PW: ["en"],
2596
+ PA: ["es"],
2597
+ PG: ["en"],
2598
+ PY: ["es", "gn"],
2599
+ PE: ["es", "qu"],
2600
+ PH: ["tl", "en"],
2601
+ PL: ["pl"],
2602
+ PT: ["pt"],
2603
+ QA: ["ar"],
2604
+ RO: ["ro"],
2605
+ RU: ["ru"],
2606
+ RW: ["rw", "fr", "en"],
2607
+ KN: ["en"],
2608
+ LC: ["en"],
2609
+ VC: ["en"],
2610
+ WS: ["sm", "en"],
2611
+ SM: ["it"],
2612
+ ST: ["pt"],
2613
+ SA: ["ar"],
2614
+ SN: ["fr"],
2615
+ RS: ["sr"],
2616
+ SC: ["en", "fr"],
2617
+ SL: ["en"],
2618
+ SG: ["en", "ms", "zh", "ta"],
2619
+ SK: ["sk"],
2620
+ SI: ["sl"],
2621
+ SB: ["en"],
2622
+ SO: ["so", "ar"],
2623
+ ZA: ["en", "af", "zu"],
2624
+ SS: ["en"],
2625
+ ES: ["es"],
2626
+ LK: ["si", "ta"],
2627
+ SD: ["ar", "en"],
2628
+ SR: ["nl"],
2629
+ SE: ["sv"],
2630
+ CH: ["de", "fr", "it", "rm"],
2631
+ SY: ["ar"],
2632
+ TW: ["zh"],
2633
+ TJ: ["tg"],
2634
+ TZ: ["sw", "en"],
2635
+ TH: ["th"],
2636
+ TL: ["pt"],
2637
+ TG: ["fr"],
2638
+ TO: ["en", "to"],
2639
+ TT: ["en"],
2640
+ TN: ["ar"],
2641
+ TR: ["tr"],
2642
+ TM: ["tk"],
2643
+ TV: ["en"],
2644
+ UG: ["en", "sw"],
2645
+ UA: ["uk"],
2646
+ AE: ["ar"],
2647
+ GB: ["en"],
2648
+ US: ["en"],
2649
+ UY: ["es"],
2650
+ UZ: ["uz"],
2651
+ VU: ["en", "fr", "bi"],
2652
+ VA: ["it", "la"],
2653
+ VE: ["es"],
2654
+ VN: ["vi"],
2655
+ YE: ["ar"],
2656
+ ZM: ["en"],
2657
+ ZW: ["en", "sn", "nd"],
2658
+ AS: ["en", "sm"],
2659
+ AW: ["nl"],
2660
+ BM: ["en"],
2661
+ CW: ["nl"],
2662
+ FO: ["fo", "da"],
2663
+ GI: ["en"],
2664
+ GL: ["kl", "da"],
2665
+ GG: ["en"],
2666
+ GU: ["en"],
2667
+ HK: ["zh", "en"],
2668
+ IM: ["en"],
2669
+ JE: ["en"],
2670
+ XK: ["sq", "sr"],
2671
+ MO: ["zh", "pt"],
2672
+ PR: ["es", "en"]
2673
+ });
2674
+ var COUNTRY_ALIASES = Object.freeze({
2675
+ USA: "US",
2676
+ UK: "GB",
2677
+ Holland: "NL",
2678
+ "Czech Republic": "CZ",
2679
+ "Ivory Coast": "CI",
2680
+ Burma: "MM",
2681
+ Swaziland: "SZ",
2682
+ Persia: "IR",
2683
+ "Great Britain": "GB",
2684
+ England: "GB",
2685
+ UAE: "AE",
2686
+ "South Korea": "KR",
2687
+ "North Korea": "KP",
2688
+ "Republic of Ireland": "IE",
2689
+ Suisse: "CH",
2690
+ Svizzera: "CH",
2691
+ Belgique: "BE",
2692
+ Noreg: "NO",
2693
+ Vitryssland: "BY"
2694
+ });
2695
+ var PRIMARY_BY_CALLING_CODE = Object.freeze({
2696
+ "1": "US",
2697
+ "44": "GB",
2698
+ "7": "RU"
2699
+ });
2700
+
2701
+ // src/geography/country.ts
2702
+ var MAX_INPUT_LENGTH3 = 100;
2703
+ var Country = class _Country {
2704
+ static typeInfo = Object.freeze({
2705
+ englishName: "Country",
2706
+ localizedName: "Land",
2707
+ emoji: "\u{1F30D}",
2708
+ sources: Object.freeze([
2709
+ "https://www.iso.org/iso-3166-country-codes.html",
2710
+ "https://en.wikipedia.org/wiki/ISO_3166-1",
2711
+ "https://www.itu.int/rec/T-REC-E.164/",
2712
+ "https://www.iana.org/domains/root/db",
2713
+ "https://www.wikidata.org/wiki/Property:P625",
2714
+ "https://www.wikidata.org/wiki/Property:P36",
2715
+ "https://www.wikidata.org/wiki/Property:P47"
2716
+ ])
2717
+ });
2718
+ alpha2Code;
2719
+ alpha3Code;
2720
+ numericCode;
2721
+ englishName;
2722
+ localizedName;
2723
+ nativeName;
2724
+ callingCode;
2725
+ topLevelDomain;
2726
+ continent;
2727
+ currencyCodes;
2728
+ languageCodes;
2729
+ constructor(row) {
2730
+ this.alpha2Code = row.alpha2;
2731
+ this.alpha3Code = row.alpha3;
2732
+ this.numericCode = row.numeric;
2733
+ this.englishName = row.en;
2734
+ this.localizedName = row.sv;
2735
+ this.nativeName = row.native;
2736
+ this.callingCode = row.callingCode;
2737
+ this.topLevelDomain = row.tld;
2738
+ this.continent = row.continent;
2739
+ this.currencyCodes = COUNTRY_CURRENCIES[row.alpha2] ?? [];
2740
+ this.languageCodes = COUNTRY_LANGUAGES[row.alpha2] ?? [];
2741
+ }
2742
+ /** The canonical value of this country: its ISO 3166-1 alpha-2 code. */
2743
+ get value() {
2744
+ return this.alpha2Code;
2745
+ }
2746
+ /** Display name in the current culture (Swedish or English). */
2747
+ get displayName() {
2748
+ return PrimitivesDefaults.useLocalizedDisplayNames ? this.localizedName : this.englishName;
2749
+ }
2750
+ /** Culture-independent display form. Always the English name. */
2751
+ get formatted() {
2752
+ return this.englishName;
2753
+ }
2754
+ /** Geographic coordinate of the country (centroid, from Wikidata P625). */
2755
+ get coordinate() {
2756
+ const c = COUNTRY_COORDINATES[this.alpha2Code];
2757
+ if (!c) throw new Error(`No coordinate for country ${this.alpha2Code}.`);
2758
+ return GeoCoordinate.create(c[0], c[1]);
2759
+ }
2760
+ /** Approximate latitude (WGS 84) of the country centroid. */
2761
+ get latitude() {
2762
+ return this.coordinate.latitude;
2763
+ }
2764
+ /** Approximate longitude (WGS 84) of the country centroid. */
2765
+ get longitude() {
2766
+ return this.coordinate.longitude;
2767
+ }
2768
+ /** Capital city, or `null` for entries without a capital (e.g. Antarctica). */
2769
+ get capital() {
2770
+ return getCountryCapital(this.alpha2Code);
2771
+ }
2772
+ get isInEuropeanUnion() {
2773
+ return EU_COUNTRIES.has(this.alpha2Code);
2774
+ }
2775
+ get isInEea() {
2776
+ return EEA_COUNTRIES.has(this.alpha2Code);
2777
+ }
2778
+ get isInSchengen() {
2779
+ return SCHENGEN_COUNTRIES.has(this.alpha2Code);
2780
+ }
2781
+ get isInNordics() {
2782
+ return NORDIC_COUNTRIES.has(this.alpha2Code);
2783
+ }
2784
+ get isInSepa() {
2785
+ return SEPA_COUNTRIES.has(this.alpha2Code);
2786
+ }
2787
+ /** True when the euro is among the country's legal tenders. */
2788
+ get usesEuro() {
2789
+ return this.currencyCodes.includes("EUR");
2790
+ }
2791
+ /** Primary ISO 4217 currency code, or `null` when unknown. */
2792
+ get currencyCode() {
2793
+ return this.currencyCodes[0] ?? null;
2794
+ }
2795
+ /**
2796
+ * Primary legal-tender currency, or `null` when unknown. Countries with
2797
+ * several legal tenders (Cuba, Panama, Namibia) return the first; use
2798
+ * {@link currencies} for the full list.
2799
+ */
2800
+ get currency() {
2801
+ const code = this.currencyCode;
2802
+ return code == null ? null : Currency.tryParse(code);
2803
+ }
2804
+ /** All recognized currencies for this country, in priority order. */
2805
+ get currencies() {
2806
+ return Object.freeze(
2807
+ this.currencyCodes.map((code) => Currency.tryParse(code)).filter((c) => c !== null)
2808
+ );
2809
+ }
2810
+ /**
2811
+ * Primary official language, or `null` when unknown. Countries with several
2812
+ * official languages (Belgium, Switzerland) return the most widely spoken;
2813
+ * use {@link officialLanguages} for the full list.
2814
+ */
2815
+ get primaryLanguage() {
2816
+ const code = this.languageCodes[0];
2817
+ return code == null ? null : Language.tryParse(code);
2818
+ }
2819
+ /** All official languages of the country, in priority order. */
2820
+ get officialLanguages() {
2821
+ return Object.freeze(
2822
+ this.languageCodes.map((code) => Language.tryParse(code)).filter((l) => l !== null)
2823
+ );
2824
+ }
2825
+ static tryParse(input) {
2826
+ if (input == null) return null;
2827
+ const sanitized = sanitizeInput(input).trim();
2828
+ if (sanitized.length === 0 || sanitized.length > MAX_INPUT_LENGTH3) return null;
2829
+ const direct = lookupCi(sanitized);
2830
+ if (direct) return direct;
2831
+ if (sanitized.length > 4 && sanitized.slice(0, 4).toLowerCase() === "the ") {
2832
+ const without = sanitized.slice(4);
2833
+ const stripped = lookupCi(without);
2834
+ if (stripped) return stripped;
2835
+ }
2836
+ return null;
2837
+ }
2838
+ static parse(input) {
2839
+ const r = _Country.tryParse(input);
2840
+ if (r === null) throw new Error("Unknown country.");
2841
+ return r;
2842
+ }
2843
+ static isValid(input) {
2844
+ return _Country.tryParse(input) !== null;
2845
+ }
2846
+ static format(input, options) {
2847
+ const r = _Country.tryParse(input);
2848
+ if (r) return r.displayName;
2849
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== "") {
2850
+ return input.trim();
2851
+ }
2852
+ return null;
2853
+ }
2854
+ static normalize(input, options) {
2855
+ const r = _Country.tryParse(input);
2856
+ if (r) return r.alpha2Code;
2857
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null) {
2858
+ const trimmed = input.trim();
2859
+ return trimmed.length > 0 ? trimmed : null;
2860
+ }
2861
+ return null;
2862
+ }
2863
+ static isNormalized(input) {
2864
+ return input != null && _Country.normalize(input) === input;
2865
+ }
2866
+ /** Look up a country by its phone calling code. Primary owner wins for shared codes. */
2867
+ static tryFindByCallingCode(callingCode) {
2868
+ if (callingCode == null) return null;
2869
+ const trimmed = callingCode.trim();
2870
+ if (trimmed.length === 0) return null;
2871
+ return BY_CALLING_CODE.get(trimmed) ?? null;
2872
+ }
2873
+ /** All known countries. */
2874
+ static get all() {
2875
+ return ALL_COUNTRIES;
2876
+ }
2877
+ /**
2878
+ * Returns countries within `radiusKm` of this country, ordered by distance.
2879
+ */
2880
+ findNeighbors(radiusKm) {
2881
+ if (!Number.isFinite(radiusKm) || radiusKm <= 0) {
2882
+ throw new RangeError("radiusKm must be a positive finite number.");
2883
+ }
2884
+ return _Country.findNeighbors(this.coordinate, radiusKm).filter((d) => d.country !== this);
2885
+ }
2886
+ /** Returns countries within `radiusKm` of `coordinate`, ordered by distance. */
2887
+ static findNeighbors(coordinate, radiusKm) {
2888
+ if (!Number.isFinite(radiusKm) || radiusKm <= 0) {
2889
+ throw new RangeError("radiusKm must be a positive finite number.");
2890
+ }
2891
+ const out = [];
2892
+ for (const c of ALL_COUNTRIES) {
2893
+ const dist = GeoCoordinate.distanceKilometers(coordinate, c.coordinate);
2894
+ if (dist <= radiusKm) out.push({ country: c, distanceKilometers: dist });
2895
+ }
2896
+ out.sort((a, b) => a.distanceKilometers - b.distanceKilometers);
2897
+ return out;
2898
+ }
2899
+ /**
2900
+ * Scans unstructured text for country names (4+ chars, word-bounded). Low confidence
2901
+ * because country names can occur in non-geographic contexts.
2902
+ */
2903
+ static findCandidatesInText(text) {
2904
+ if (!text) return [];
2905
+ const out = [];
2906
+ SCAN_PATTERN.lastIndex = 0;
2907
+ let m;
2908
+ while ((m = SCAN_PATTERN.exec(text)) !== null) {
2909
+ const country = _Country.tryParse(m[0]);
2910
+ if (!country) continue;
2911
+ out.push(
2912
+ new TextCandidate({
2913
+ startIndex: m.index,
2914
+ length: m[0].length,
2915
+ originalText: m[0],
2916
+ typeName: "Country",
2917
+ category: TextCandidateCategory.Geography,
2918
+ normalizedForm: country.toNormalizedString(),
2919
+ formattedForm: country.toString(),
2920
+ maskedForm: country.localizedName,
2921
+ confidence: TextMatchConfidence.Low,
2922
+ value: country
2923
+ })
2924
+ );
2925
+ }
2926
+ return out;
2927
+ }
2928
+ toNormalizedString() {
2929
+ return this.alpha2Code;
2930
+ }
2931
+ toString() {
2932
+ return this.displayName;
2933
+ }
2934
+ toDisplayString() {
2935
+ return this.displayName;
2936
+ }
2937
+ toEnglishString() {
2938
+ return this.englishName;
2939
+ }
2940
+ toNativeString() {
2941
+ return this.nativeName;
2942
+ }
2943
+ equals(other) {
2944
+ return other != null && this.alpha2Code === other.alpha2Code;
2945
+ }
2946
+ compareTo(other) {
2947
+ if (other == null) return 1;
2948
+ return this.alpha2Code < other.alpha2Code ? -1 : this.alpha2Code > other.alpha2Code ? 1 : 0;
2949
+ }
2950
+ static get Sweden() {
2951
+ return getByAlpha2("SE");
2952
+ }
2953
+ static get Norway() {
2954
+ return getByAlpha2("NO");
2955
+ }
2956
+ static get Finland() {
2957
+ return getByAlpha2("FI");
2958
+ }
2959
+ static get Denmark() {
2960
+ return getByAlpha2("DK");
2961
+ }
2962
+ static get Iceland() {
2963
+ return getByAlpha2("IS");
2964
+ }
2965
+ static get Germany() {
2966
+ return getByAlpha2("DE");
2967
+ }
2968
+ static get Poland() {
2969
+ return getByAlpha2("PL");
2970
+ }
2971
+ static get Estonia() {
2972
+ return getByAlpha2("EE");
2973
+ }
2974
+ static get Lithuania() {
2975
+ return getByAlpha2("LT");
2976
+ }
2977
+ static get Latvia() {
2978
+ return getByAlpha2("LV");
2979
+ }
2980
+ static get Romania() {
2981
+ return getByAlpha2("RO");
2982
+ }
2983
+ static get Bulgaria() {
2984
+ return getByAlpha2("BG");
2985
+ }
2986
+ static get CzechRepublic() {
2987
+ return getByAlpha2("CZ");
2988
+ }
2989
+ static get Spain() {
2990
+ return getByAlpha2("ES");
2991
+ }
2992
+ static get Netherlands() {
2993
+ return getByAlpha2("NL");
2994
+ }
2995
+ static get Greece() {
2996
+ return getByAlpha2("GR");
2997
+ }
2998
+ static get Italy() {
2999
+ return getByAlpha2("IT");
3000
+ }
3001
+ static get Slovenia() {
3002
+ return getByAlpha2("SI");
3003
+ }
3004
+ static get Croatia() {
3005
+ return getByAlpha2("HR");
3006
+ }
3007
+ static get Portugal() {
3008
+ return getByAlpha2("PT");
3009
+ }
3010
+ static get Hungary() {
3011
+ return getByAlpha2("HU");
3012
+ }
3013
+ static get France() {
3014
+ return getByAlpha2("FR");
3015
+ }
3016
+ static get Slovakia() {
3017
+ return getByAlpha2("SK");
3018
+ }
3019
+ static get Belgium() {
3020
+ return getByAlpha2("BE");
3021
+ }
3022
+ static get UnitedKingdom() {
3023
+ return getByAlpha2("GB");
3024
+ }
3025
+ static get Austria() {
3026
+ return getByAlpha2("AT");
3027
+ }
3028
+ static get Cyprus() {
3029
+ return getByAlpha2("CY");
3030
+ }
3031
+ static get Switzerland() {
3032
+ return getByAlpha2("CH");
3033
+ }
3034
+ static get Ireland() {
3035
+ return getByAlpha2("IE");
3036
+ }
3037
+ static get Luxembourg() {
3038
+ return getByAlpha2("LU");
3039
+ }
3040
+ static get Malta() {
3041
+ return getByAlpha2("MT");
3042
+ }
3043
+ static get Liechtenstein() {
3044
+ return getByAlpha2("LI");
3045
+ }
3046
+ /** @internal */
3047
+ static _fromRow(row) {
3048
+ return new _Country(row);
3049
+ }
3050
+ };
3051
+ var ALL_COUNTRIES = COUNTRY_ROWS.map((r) => Country._fromRow(r));
3052
+ var BY_ALPHA2 = /* @__PURE__ */ new Map();
3053
+ var BY_NAME2 = /* @__PURE__ */ new Map();
3054
+ var BY_CALLING_CODE = /* @__PURE__ */ new Map();
3055
+ for (const c of ALL_COUNTRIES) {
3056
+ BY_ALPHA2.set(c.alpha2Code.toUpperCase(), c);
3057
+ BY_NAME2.set(c.alpha2Code.toUpperCase(), c);
3058
+ BY_NAME2.set(c.alpha3Code.toUpperCase(), c);
3059
+ BY_NAME2.set(c.englishName.toLowerCase(), c);
3060
+ if (!BY_NAME2.has(c.localizedName.toLowerCase())) BY_NAME2.set(c.localizedName.toLowerCase(), c);
3061
+ if (c.nativeName.toLowerCase() !== c.englishName.toLowerCase() && !BY_NAME2.has(c.nativeName.toLowerCase())) {
3062
+ BY_NAME2.set(c.nativeName.toLowerCase(), c);
3063
+ }
3064
+ if (!BY_CALLING_CODE.has(c.callingCode)) BY_CALLING_CODE.set(c.callingCode, c);
3065
+ }
3066
+ for (const [aliasOrCode, alpha2] of Object.entries(COUNTRY_ALIASES)) {
3067
+ const target = BY_ALPHA2.get(alpha2.toUpperCase());
3068
+ if (target) BY_NAME2.set(aliasOrCode.toLowerCase(), target);
3069
+ }
3070
+ for (const [code, alpha2] of Object.entries(PRIMARY_BY_CALLING_CODE)) {
3071
+ const target = BY_ALPHA2.get(alpha2.toUpperCase());
3072
+ if (target) BY_CALLING_CODE.set(code, target);
3073
+ }
3074
+ var SCAN_PATTERN = (() => {
3075
+ const names = [...BY_NAME2.keys()].filter((n) => n.length >= 4).sort((a, b) => b.length - a.length).map(escapeRegex);
3076
+ return new RegExp(`(?<![\\p{L}\\p{N}_])(?:${names.join("|")})(?![\\p{L}\\p{N}_])`, "giu");
3077
+ })();
3078
+ function getByAlpha2(code) {
3079
+ const c = BY_ALPHA2.get(code.toUpperCase());
3080
+ if (!c) throw new Error(`Unknown country code ${code}.`);
3081
+ return c;
3082
+ }
3083
+ function lookupCi(input) {
3084
+ const upper = input.toUpperCase();
3085
+ const a2 = BY_ALPHA2.get(upper);
3086
+ if (a2) return a2;
3087
+ const lower = input.toLowerCase();
3088
+ return BY_NAME2.get(lower) ?? BY_NAME2.get(upper) ?? null;
3089
+ }
3090
+ function escapeRegex(s) {
3091
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3092
+ }
3093
+
3094
+ // src/validation/validation-error-reason.ts
3095
+ var ValidationErrorReason = {
3096
+ // --- Common ---
3097
+ InputIsEmpty: "InputIsEmpty",
3098
+ InputTooLong: "InputTooLong",
3099
+ InvalidFormat: "InvalidFormat",
3100
+ // --- Email ---
3101
+ MissingAtSign: "MissingAtSign",
3102
+ InvalidDomain: "InvalidDomain"
3103
+ };
3104
+
3105
+ // src/validation/validation-issue.ts
3106
+ var ValidationIssue = class {
3107
+ reason;
3108
+ englishDescription;
3109
+ localizedDescription;
3110
+ constructor(reason, englishDescription, localizedDescription) {
3111
+ this.reason = reason;
3112
+ this.englishDescription = englishDescription;
3113
+ this.localizedDescription = localizedDescription;
3114
+ }
3115
+ /**
3116
+ * Returns {@link localizedDescription} when
3117
+ * {@link PrimitivesDefaults.useLocalizedDisplayNames} is `true`, otherwise
3118
+ * {@link englishDescription}.
3119
+ */
3120
+ get description() {
3121
+ return PrimitivesDefaults.useLocalizedDisplayNames ? this.localizedDescription : this.englishDescription;
3122
+ }
3123
+ };
3124
+
3125
+ // src/validation/validation-result.ts
3126
+ var ValidationResult = class {
3127
+ rawInput;
3128
+ isValid;
3129
+ issues;
3130
+ /** @internal — use `validResult` / `invalidResult` factories. */
3131
+ constructor(rawInput, isValid, issues) {
3132
+ this.rawInput = rawInput ?? null;
3133
+ this.isValid = isValid;
3134
+ this.issues = Object.freeze([...issues]);
3135
+ }
3136
+ };
3137
+ function validResult(rawInput) {
3138
+ return new ValidationResult(rawInput, true, []);
3139
+ }
3140
+ function invalidResult(rawInput, reasonOrIssues, englishDescription, localizedDescription) {
3141
+ if (typeof reasonOrIssues === "string") {
3142
+ if (englishDescription === void 0 || localizedDescription === void 0) {
3143
+ throw new Error("invalidResult requires both english and localized descriptions");
3144
+ }
3145
+ return new ValidationResult(rawInput, false, [
3146
+ new ValidationIssue(reasonOrIssues, englishDescription, localizedDescription)
3147
+ ]);
3148
+ }
3149
+ return new ValidationResult(rawInput, false, reasonOrIssues);
3150
+ }
3151
+
3152
+ // src/web/email-address.ts
3153
+ var PublicEmailProvider = {
3154
+ Unknown: "Unknown",
3155
+ Gmail: "Gmail",
3156
+ Outlook: "Outlook",
3157
+ Yahoo: "Yahoo",
3158
+ ICloud: "ICloud",
3159
+ ProtonMail: "ProtonMail",
3160
+ Aol: "Aol",
3161
+ Gmx: "Gmx",
3162
+ MailCom: "MailCom",
3163
+ Yandex: "Yandex",
3164
+ Zoho: "Zoho",
3165
+ Tuta: "Tuta",
3166
+ Hey: "Hey",
3167
+ DuckDuckGoEmail: "DuckDuckGoEmail",
3168
+ SimpleLogin: "SimpleLogin",
3169
+ WebDe: "WebDe",
3170
+ MailRu: "MailRu",
3171
+ WirtualnaPolska: "WirtualnaPolska",
3172
+ Onet: "Onet",
3173
+ Interia: "Interia",
3174
+ Tlen: "Tlen",
3175
+ Seznam: "Seznam",
3176
+ Libero: "Libero",
3177
+ FreemailHu: "FreemailHu",
3178
+ Abv: "Abv",
3179
+ InboxLv: "InboxLv",
3180
+ UkrNet: "UkrNet",
3181
+ Naver: "Naver",
3182
+ Telia: "Telia",
3183
+ Tele2: "Tele2",
3184
+ Comhem: "Comhem",
3185
+ Bredbandsbolaget: "Bredbandsbolaget",
3186
+ Bredband2: "Bredband2",
3187
+ Ownit: "Ownit",
3188
+ Spray: "Spray",
3189
+ Passagen: "Passagen",
3190
+ Bahnhof: "Bahnhof",
3191
+ Glocalnet: "Glocalnet",
3192
+ OnlineNo: "OnlineNo",
3193
+ Kolumbus: "Kolumbus",
3194
+ Aland: "Aland"
3195
+ };
3196
+ var MAX_INPUT_LENGTH4 = 320;
3197
+ var PROVIDER_DOMAINS = {
3198
+ // International
3199
+ "gmail.com": PublicEmailProvider.Gmail,
3200
+ "googlemail.com": PublicEmailProvider.Gmail,
3201
+ "outlook.com": PublicEmailProvider.Outlook,
3202
+ "outlook.se": PublicEmailProvider.Outlook,
3203
+ "outlook.fr": PublicEmailProvider.Outlook,
3204
+ "outlook.co": PublicEmailProvider.Outlook,
3205
+ "hotmail.com": PublicEmailProvider.Outlook,
3206
+ "hotmail.se": PublicEmailProvider.Outlook,
3207
+ "hotmail.co.uk": PublicEmailProvider.Outlook,
3208
+ "hotmail.fr": PublicEmailProvider.Outlook,
3209
+ "hotmail.de": PublicEmailProvider.Outlook,
3210
+ "hotmail.no": PublicEmailProvider.Outlook,
3211
+ "hotmail.dk": PublicEmailProvider.Outlook,
3212
+ "hotmail.fi": PublicEmailProvider.Outlook,
3213
+ "hotmail.it": PublicEmailProvider.Outlook,
3214
+ "hotmail.es": PublicEmailProvider.Outlook,
3215
+ "live.com": PublicEmailProvider.Outlook,
3216
+ "live.se": PublicEmailProvider.Outlook,
3217
+ "live.fr": PublicEmailProvider.Outlook,
3218
+ "live.dk": PublicEmailProvider.Outlook,
3219
+ "live.co.uk": PublicEmailProvider.Outlook,
3220
+ "live.it": PublicEmailProvider.Outlook,
3221
+ "live.no": PublicEmailProvider.Outlook,
3222
+ "msn.com": PublicEmailProvider.Outlook,
3223
+ "windowslive.com": PublicEmailProvider.Outlook,
3224
+ "yahoo.com": PublicEmailProvider.Yahoo,
3225
+ "yahoo.se": PublicEmailProvider.Yahoo,
3226
+ "yahoo.co.uk": PublicEmailProvider.Yahoo,
3227
+ "yahoo.fr": PublicEmailProvider.Yahoo,
3228
+ "yahoo.de": PublicEmailProvider.Yahoo,
3229
+ "yahoo.it": PublicEmailProvider.Yahoo,
3230
+ "yahoo.es": PublicEmailProvider.Yahoo,
3231
+ "yahoo.gr": PublicEmailProvider.Yahoo,
3232
+ "yahoo.ro": PublicEmailProvider.Yahoo,
3233
+ "yahoo.co": PublicEmailProvider.Yahoo,
3234
+ "yahoo.no": PublicEmailProvider.Yahoo,
3235
+ "ymail.com": PublicEmailProvider.Yahoo,
3236
+ "rocketmail.com": PublicEmailProvider.Yahoo,
3237
+ "icloud.com": PublicEmailProvider.ICloud,
3238
+ "me.com": PublicEmailProvider.ICloud,
3239
+ "mac.com": PublicEmailProvider.ICloud,
3240
+ "protonmail.com": PublicEmailProvider.ProtonMail,
3241
+ "protonmail.ch": PublicEmailProvider.ProtonMail,
3242
+ "proton.me": PublicEmailProvider.ProtonMail,
3243
+ "pm.me": PublicEmailProvider.ProtonMail,
3244
+ "aol.com": PublicEmailProvider.Aol,
3245
+ "aol.se": PublicEmailProvider.Aol,
3246
+ "gmx.com": PublicEmailProvider.Gmx,
3247
+ "gmx.de": PublicEmailProvider.Gmx,
3248
+ "gmx.net": PublicEmailProvider.Gmx,
3249
+ "gmx.at": PublicEmailProvider.Gmx,
3250
+ "mail.com": PublicEmailProvider.MailCom,
3251
+ "email.com": PublicEmailProvider.MailCom,
3252
+ "post.com": PublicEmailProvider.MailCom,
3253
+ "europe.com": PublicEmailProvider.MailCom,
3254
+ "iname.com": PublicEmailProvider.MailCom,
3255
+ "yandex.com": PublicEmailProvider.Yandex,
3256
+ "yandex.ru": PublicEmailProvider.Yandex,
3257
+ "zoho.com": PublicEmailProvider.Zoho,
3258
+ "tuta.io": PublicEmailProvider.Tuta,
3259
+ "tutanota.com": PublicEmailProvider.Tuta,
3260
+ "hey.com": PublicEmailProvider.Hey,
3261
+ "duck.com": PublicEmailProvider.DuckDuckGoEmail,
3262
+ "simplelogin.com": PublicEmailProvider.SimpleLogin,
3263
+ // Regional (Europe)
3264
+ "web.de": PublicEmailProvider.WebDe,
3265
+ "mail.ru": PublicEmailProvider.MailRu,
3266
+ "wp.pl": PublicEmailProvider.WirtualnaPolska,
3267
+ "vp.pl": PublicEmailProvider.WirtualnaPolska,
3268
+ "onet.pl": PublicEmailProvider.Onet,
3269
+ "onet.eu": PublicEmailProvider.Onet,
3270
+ "op.pl": PublicEmailProvider.Onet,
3271
+ "o2.pl": PublicEmailProvider.Onet,
3272
+ "poczta.onet.pl": PublicEmailProvider.Onet,
3273
+ "interia.pl": PublicEmailProvider.Interia,
3274
+ "interia.eu": PublicEmailProvider.Interia,
3275
+ "tlen.pl": PublicEmailProvider.Tlen,
3276
+ "seznam.cz": PublicEmailProvider.Seznam,
3277
+ "libero.it": PublicEmailProvider.Libero,
3278
+ "freemail.hu": PublicEmailProvider.FreemailHu,
3279
+ "abv.bg": PublicEmailProvider.Abv,
3280
+ "inbox.lv": PublicEmailProvider.InboxLv,
3281
+ "ukr.net": PublicEmailProvider.UkrNet,
3282
+ "naver.com": PublicEmailProvider.Naver,
3283
+ // Swedish ISP / portal email
3284
+ "telia.com": PublicEmailProvider.Telia,
3285
+ "telia.se": PublicEmailProvider.Telia,
3286
+ "home.se": PublicEmailProvider.Telia,
3287
+ "swipnet.se": PublicEmailProvider.Telia,
3288
+ "tele2.se": PublicEmailProvider.Tele2,
3289
+ "comhem.se": PublicEmailProvider.Comhem,
3290
+ "bredband.net": PublicEmailProvider.Bredbandsbolaget,
3291
+ "bredbandsbolaget.se": PublicEmailProvider.Bredbandsbolaget,
3292
+ "bredband2.com": PublicEmailProvider.Bredband2,
3293
+ "ownit.nu": PublicEmailProvider.Ownit,
3294
+ "mail.se": PublicEmailProvider.Spray,
3295
+ "spray.se": PublicEmailProvider.Spray,
3296
+ "passagen.se": PublicEmailProvider.Passagen,
3297
+ "bahnhof.se": PublicEmailProvider.Bahnhof,
3298
+ "glocalnet.net": PublicEmailProvider.Glocalnet,
3299
+ // Nordic ISP
3300
+ "online.no": PublicEmailProvider.OnlineNo,
3301
+ "kolumbus.fi": PublicEmailProvider.Kolumbus,
3302
+ "aland.net": PublicEmailProvider.Aland
3303
+ };
3304
+ var DOMAIN_CORRECTIONS = {
3305
+ // Gmail misspellings
3306
+ "gnail.com": "gmail.com",
3307
+ "gamil.com": "gmail.com",
3308
+ "gmai.com": "gmail.com",
3309
+ "gmil.com": "gmail.com",
3310
+ "gmsil.com": "gmail.com",
3311
+ "gmal.com": "gmail.com",
3312
+ "gmaill.com": "gmail.com",
3313
+ "gamail.com": "gmail.com",
3314
+ "gmail.con": "gmail.com",
3315
+ "gmail.vom": "gmail.com",
3316
+ "gmail.cim": "gmail.com",
3317
+ "gmail.comi": "gmail.com",
3318
+ "gmail.se": "gmail.com",
3319
+ "gmail.co": "gmail.com",
3320
+ // Hotmail / Outlook misspellings
3321
+ "hotmai.com": "hotmail.com",
3322
+ "hotmil.com": "hotmail.com",
3323
+ "hotmsil.com": "hotmail.com",
3324
+ "hotmal.com": "hotmail.com",
3325
+ "homail.com": "hotmail.com",
3326
+ "hotnail.com": "hotmail.com",
3327
+ "hitmail.com": "hotmail.com",
3328
+ "hptmail.com": "hotmail.com",
3329
+ "hmail.com": "hotmail.com",
3330
+ "hotmail.con": "hotmail.com",
3331
+ "hotmail.cpm": "hotmail.com",
3332
+ "hotmail.co": "hotmail.com",
3333
+ "hotmail.vom": "hotmail.com",
3334
+ "hotmail.cim": "hotmail.com",
3335
+ "hotmail.comm": "hotmail.com",
3336
+ "outlook.con": "outlook.com",
3337
+ "putlook.com": "outlook.com",
3338
+ // iCloud misspellings
3339
+ "icloude.com": "icloud.com",
3340
+ "icloud.se": "icloud.com",
3341
+ "icloud.co": "icloud.com",
3342
+ // Onet misspellings
3343
+ "02.pl": "o2.pl"
3344
+ };
3345
+ var tldCountryMapCache = null;
3346
+ function getTldCountryMap() {
3347
+ if (tldCountryMapCache) return tldCountryMapCache;
3348
+ const m = /* @__PURE__ */ new Map();
3349
+ for (const c of Country.all) {
3350
+ if (c.topLevelDomain) m.set(c.topLevelDomain.toLowerCase(), c);
3351
+ }
3352
+ tldCountryMapCache = m;
3353
+ return m;
3354
+ }
3355
+ var EMAIL_PATTERN = /^(?!\.)[a-zA-Z0-9_](?!.*\.\.)(?:[a-zA-Z0-9._%+-]*[a-zA-Z0-9_%+-])?@(?!-)[a-zA-Z0-9-]+(?<!-)(?:\.(?!-)[a-zA-Z0-9-]+(?<!-))*\.[a-zA-Z]{2,}$/;
3356
+ var SCAN_PATTERN2 = /(?<![\w.@])(?!\.)[a-zA-Z0-9](?:[a-zA-Z0-9._%+-]*[a-zA-Z0-9_%+-])?@(?!-)[a-zA-Z0-9-]+(?:\.(?!-)[a-zA-Z0-9-]+)*\.[a-zA-Z]{2,}(?![\w@])/gu;
3357
+ function domainToAscii(domain) {
3358
+ try {
3359
+ const ascii = new URL("http://" + domain).hostname;
3360
+ return ascii;
3361
+ } catch {
3362
+ return null;
3363
+ }
3364
+ }
3365
+ var EmailAddress = class _EmailAddress {
3366
+ static typeInfo = Object.freeze({
3367
+ englishName: "Email Address",
3368
+ localizedName: "E-postadress",
3369
+ emoji: "\u{1F4E7}",
3370
+ sources: Object.freeze([
3371
+ "https://datatracker.ietf.org/doc/html/rfc5321#section-2.3.11",
3372
+ "https://datatracker.ietf.org/doc/html/rfc5321"
3373
+ ])
3374
+ });
3375
+ value;
3376
+ localPart;
3377
+ domain;
3378
+ domainAscii;
3379
+ topLevelDomain;
3380
+ country;
3381
+ provider;
3382
+ originalDomain;
3383
+ get isPublicEmailProvider() {
3384
+ return this.provider != null;
3385
+ }
3386
+ get isInternationalizedDomain() {
3387
+ return this.domain !== this.domainAscii;
3388
+ }
3389
+ get wasCorrected() {
3390
+ return this.originalDomain != null;
3391
+ }
3392
+ constructor(value, localPart, domain, domainAscii, tld, country, provider, originalDomain) {
3393
+ this.value = value;
3394
+ this.localPart = localPart;
3395
+ this.domain = domain;
3396
+ this.domainAscii = domainAscii;
3397
+ this.topLevelDomain = tld;
3398
+ this.country = country;
3399
+ this.provider = provider;
3400
+ this.originalDomain = originalDomain;
3401
+ }
3402
+ /**
3403
+ * Attempts to parse and normalize an email address.
3404
+ *
3405
+ * When `tryCorrectTypos` is `true`, common domain misspellings such as
3406
+ * `gmail.con`, `gnail.com`, or `hotmil.com` are corrected automatically.
3407
+ * The original domain is preserved in `originalDomain`. Typo correction is
3408
+ * opt-in and should only be used when silent correction is acceptable.
3409
+ */
3410
+ static tryParse(input, options) {
3411
+ if (input == null || input.trim() === "") return null;
3412
+ let sanitized = sanitizeInput(input);
3413
+ const ltIndex = sanitized.indexOf("<");
3414
+ if (ltIndex >= 0) {
3415
+ const gtIndex = sanitized.indexOf(">", ltIndex + 1);
3416
+ if (gtIndex > ltIndex) sanitized = sanitized.slice(ltIndex + 1, gtIndex);
3417
+ }
3418
+ sanitized = sanitized.trim();
3419
+ if (sanitized.toLowerCase().startsWith("mailto:")) {
3420
+ sanitized = sanitized.slice(7);
3421
+ const qIndex = sanitized.indexOf("?");
3422
+ if (qIndex >= 0) sanitized = sanitized.slice(0, qIndex);
3423
+ }
3424
+ let normalized = sanitized.replace(/ /g, "").toLowerCase();
3425
+ if (normalized.endsWith(".")) normalized = normalized.slice(0, -1);
3426
+ if (normalized.length === 0 || normalized.length > MAX_INPUT_LENGTH4) return null;
3427
+ const atIndex = normalized.lastIndexOf("@");
3428
+ if (atIndex <= 0 || atIndex === normalized.length - 1) return null;
3429
+ const localPart = normalized.slice(0, atIndex);
3430
+ let domain = normalized.slice(atIndex + 1);
3431
+ let domainForValidation = domain;
3432
+ if (hasNonAscii(domain)) {
3433
+ for (const ch of domain) {
3434
+ const cp = ch.codePointAt(0);
3435
+ if (cp > 127 && !isUnicodeLetter(ch)) return null;
3436
+ }
3437
+ const ascii = domainToAscii(domain);
3438
+ if (ascii == null) return null;
3439
+ domainForValidation = ascii;
3440
+ }
3441
+ const emailForValidation = `${localPart}@${domainForValidation}`;
3442
+ if (!EMAIL_PATTERN.test(emailForValidation)) return null;
3443
+ let originalDomain = null;
3444
+ if (options?.tryCorrectTypos === true) {
3445
+ const corrected = DOMAIN_CORRECTIONS[domain];
3446
+ if (corrected != null) {
3447
+ originalDomain = domain;
3448
+ domain = corrected;
3449
+ normalized = `${localPart}@${domain}`;
3450
+ domainForValidation = domain;
3451
+ }
3452
+ }
3453
+ const lastDot = domain.lastIndexOf(".");
3454
+ const tld = lastDot >= 0 ? domain.slice(lastDot + 1) : "";
3455
+ const country = tld.length > 0 ? getTldCountryMap().get("." + tld) ?? null : null;
3456
+ const provider = PROVIDER_DOMAINS[domain] ?? null;
3457
+ return new _EmailAddress(
3458
+ normalized,
3459
+ localPart,
3460
+ domain,
3461
+ domainForValidation,
3462
+ tld,
3463
+ country,
3464
+ provider,
3465
+ originalDomain
3466
+ );
3467
+ }
3468
+ static parse(input, options) {
3469
+ const r = _EmailAddress.tryParse(input, options);
3470
+ if (r === null) throw new Error("Invalid email address.");
3471
+ return r;
3472
+ }
3473
+ static isValid(input) {
3474
+ return _EmailAddress.tryParse(input) !== null;
3475
+ }
3476
+ /**
3477
+ * Returns a `ValidationResult` describing why the input is invalid,
3478
+ * or a valid result when the input is well-formed.
3479
+ */
3480
+ static validate(input) {
3481
+ if (input == null || input.trim() === "") {
3482
+ return invalidResult(
3483
+ input,
3484
+ ValidationErrorReason.InputIsEmpty,
3485
+ "Input is empty or whitespace.",
3486
+ "V\xE4rdet \xE4r tomt."
3487
+ );
3488
+ }
3489
+ let sanitized = sanitizeInput(input);
3490
+ const ltIndex = sanitized.indexOf("<");
3491
+ if (ltIndex >= 0) {
3492
+ const gtIndex = sanitized.indexOf(">", ltIndex + 1);
3493
+ if (gtIndex > ltIndex) sanitized = sanitized.slice(ltIndex + 1, gtIndex);
3494
+ }
3495
+ sanitized = sanitized.trim();
3496
+ if (sanitized.toLowerCase().startsWith("mailto:")) {
3497
+ sanitized = sanitized.slice(7);
3498
+ const qIndex = sanitized.indexOf("?");
3499
+ if (qIndex >= 0) sanitized = sanitized.slice(0, qIndex);
3500
+ }
3501
+ let normalized = sanitized.replace(/ /g, "").toLowerCase();
3502
+ if (normalized.endsWith(".")) normalized = normalized.slice(0, -1);
3503
+ if (normalized.length === 0 || normalized.length > MAX_INPUT_LENGTH4) {
3504
+ return invalidResult(
3505
+ input,
3506
+ ValidationErrorReason.InputTooLong,
3507
+ "Email address is too long.",
3508
+ "E-postadressen \xE4r f\xF6r l\xE5ng."
3509
+ );
3510
+ }
3511
+ const atIndex = normalized.lastIndexOf("@");
3512
+ if (atIndex <= 0 || atIndex === normalized.length - 1) {
3513
+ return invalidResult(
3514
+ input,
3515
+ ValidationErrorReason.MissingAtSign,
3516
+ "Email address must contain an @ sign with text before and after.",
3517
+ "E-postadressen m\xE5ste inneh\xE5lla ett @-tecken med text f\xF6re och efter."
3518
+ );
3519
+ }
3520
+ const localPart = normalized.slice(0, atIndex);
3521
+ const domain = normalized.slice(atIndex + 1);
3522
+ let domainForValidation = domain;
3523
+ if (hasNonAscii(domain)) {
3524
+ for (const ch of domain) {
3525
+ const cp = ch.codePointAt(0);
3526
+ if (cp > 127 && !isUnicodeLetter(ch)) {
3527
+ return invalidResult(
3528
+ input,
3529
+ ValidationErrorReason.InvalidDomain,
3530
+ "Email address has an invalid domain.",
3531
+ "E-postadressen har en ogiltig dom\xE4n."
3532
+ );
3533
+ }
3534
+ }
3535
+ const ascii = domainToAscii(domain);
3536
+ if (ascii == null) {
3537
+ return invalidResult(
3538
+ input,
3539
+ ValidationErrorReason.InvalidDomain,
3540
+ "Email address has an invalid domain.",
3541
+ "E-postadressen har en ogiltig dom\xE4n."
3542
+ );
3543
+ }
3544
+ domainForValidation = ascii;
3545
+ }
3546
+ const emailForValidation = `${localPart}@${domainForValidation}`;
3547
+ if (!EMAIL_PATTERN.test(emailForValidation)) {
3548
+ return invalidResult(
3549
+ input,
3550
+ ValidationErrorReason.InvalidFormat,
3551
+ "Invalid email address format.",
3552
+ "Ogiltigt format f\xF6r e-postadress."
3553
+ );
3554
+ }
3555
+ return validResult(input);
3556
+ }
3557
+ /**
3558
+ * Returns the normalized email in lowercase, e.g. `user@example.com`.
3559
+ * Returns `null` for invalid or empty input.
3560
+ */
3561
+ static format(input, options) {
3562
+ const r = _EmailAddress.tryParse(
3563
+ input,
3564
+ options?.tryCorrectTypos != null ? { tryCorrectTypos: options.tryCorrectTypos } : void 0
3565
+ );
3566
+ if (r) return r.value;
3567
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== "") {
3568
+ return input.trim();
3569
+ }
3570
+ return null;
3571
+ }
3572
+ /** Returns the normalized email, e.g. `user@example.com`, or `null` if invalid. */
3573
+ static normalize(input, options) {
3574
+ return _EmailAddress.format(input, options);
3575
+ }
3576
+ static isNormalized(input) {
3577
+ return input != null && _EmailAddress.normalize(input) === input;
3578
+ }
3579
+ /** Returns the normalized email address, e.g. `user@example.com`. */
3580
+ toNormalizedString() {
3581
+ return this.value;
3582
+ }
3583
+ /** Returns the normalized email address, e.g. `user@example.com`. */
3584
+ toString() {
3585
+ return this.value;
3586
+ }
3587
+ /**
3588
+ * Returns the email with the domain in ASCII (Punycode) form, e.g.
3589
+ * `user@xn--rneholm-b1a.com`. Same as `toString()` for ASCII domains.
3590
+ */
3591
+ toAsciiString() {
3592
+ return this.isInternationalizedDomain ? `${this.localPart}@${this.domainAscii}` : this.value;
3593
+ }
3594
+ /**
3595
+ * Scans unstructured text for potential email addresses. Heuristic; may include false positives.
3596
+ */
3597
+ static findCandidatesInText(text) {
3598
+ if (!text) return [];
3599
+ const out = [];
3600
+ SCAN_PATTERN2.lastIndex = 0;
3601
+ let m;
3602
+ while ((m = SCAN_PATTERN2.exec(text)) !== null) {
3603
+ const r = _EmailAddress.tryParse(m[0]);
3604
+ if (!r) continue;
3605
+ out.push(
3606
+ new TextCandidate({
3607
+ startIndex: m.index,
3608
+ length: m[0].length,
3609
+ originalText: m[0],
3610
+ typeName: "EmailAddress",
3611
+ category: TextCandidateCategory.Contact,
3612
+ normalizedForm: r.toNormalizedString(),
3613
+ formattedForm: r.toString(),
3614
+ maskedForm: maskEmailAddressInternal(r, false),
3615
+ confidence: TextMatchConfidence.High,
3616
+ value: r
3617
+ })
3618
+ );
3619
+ }
3620
+ return out;
3621
+ }
3622
+ equals(other) {
3623
+ return other != null && this.value === other.value;
3624
+ }
3625
+ compareTo(other) {
3626
+ if (other == null) return 1;
3627
+ return this.value < other.value ? -1 : this.value > other.value ? 1 : 0;
3628
+ }
3629
+ };
3630
+ function hasNonAscii(s) {
3631
+ for (let i = 0; i < s.length; i++) {
3632
+ if (s.charCodeAt(i) > 127) return true;
3633
+ }
3634
+ return false;
3635
+ }
3636
+ var UNICODE_LETTER = /\p{L}/u;
3637
+ function isUnicodeLetter(ch) {
3638
+ return UNICODE_LETTER.test(ch);
3639
+ }
3640
+ function maskEmailAddress(email, options) {
3641
+ return maskEmailAddressInternal(email, options?.maskDomain === true);
3642
+ }
3643
+ function maskEmailAddressInternal(email, maskDomain) {
3644
+ const local = email.localPart;
3645
+ const maskedLocal = local.length <= 1 ? local : local[0] + "*".repeat(Math.min(local.length - 1, 3));
3646
+ if (maskDomain) {
3647
+ const domain = email.domain;
3648
+ const firstDot = domain.indexOf(".");
3649
+ if (firstDot > 0) {
3650
+ const label = domain.slice(0, firstDot);
3651
+ const suffix = domain.slice(firstDot);
3652
+ const maskedDomain = label.length <= 1 ? label : label[0] + "*".repeat(Math.min(label.length - 1, 3));
3653
+ return `${maskedLocal}@${maskedDomain}${suffix}`;
3654
+ }
3655
+ }
3656
+ return `${maskedLocal}@${email.domain}`;
3657
+ }
3658
+ function toMailtoUri(email) {
3659
+ return `mailto:${email.toNormalizedString()}`;
3660
+ }
3661
+
3662
+ // src/web/url.ts
3663
+ var MAX_INPUT_LENGTH5 = 2048;
3664
+ var RESERVED_TLDS = /* @__PURE__ */ new Set(["test", "example", "invalid", "localhost"]);
3665
+ var RESERVED_DOMAINS = /* @__PURE__ */ new Set(["example.com", "example.org", "example.net"]);
3666
+ var DEFAULT_PORTS = {
3667
+ http: 80,
3668
+ https: 443,
3669
+ ftp: 21,
3670
+ ws: 80,
3671
+ wss: 443,
3672
+ gopher: 70
3673
+ };
3674
+ var tldCountryMapCache2 = null;
3675
+ function getTldCountryMap2() {
3676
+ if (tldCountryMapCache2) return tldCountryMapCache2;
3677
+ const m = /* @__PURE__ */ new Map();
3678
+ for (const c of Country.all) {
3679
+ if (c.topLevelDomain) m.set(c.topLevelDomain.toLowerCase(), c);
3680
+ }
3681
+ tldCountryMapCache2 = m;
3682
+ return m;
3683
+ }
3684
+ var SCAN_PATTERN3 = /(?:[a-zA-Z][\w+.-]*:\/\/[^\s<>"']+|(?:mailto|tel|sms|callto):[^\s<>"']+|\bwww\.[^\s<>"']+)/gi;
3685
+ var IPV4 = /^(?:\d{1,3}\.){3}\d{1,3}$/;
3686
+ var ABSOLUTE_URI = /^([a-zA-Z][a-zA-Z0-9+\-.]*):/;
3687
+ var HIERARCHICAL_RE = /^([a-zA-Z][a-zA-Z0-9+\-.]*):\/\//;
3688
+ var Url = class _Url {
3689
+ static typeInfo = Object.freeze({
3690
+ englishName: "URL",
3691
+ localizedName: "Webbadress",
3692
+ emoji: "\u{1F517}",
3693
+ sources: Object.freeze([
3694
+ "https://datatracker.ietf.org/doc/html/rfc3986",
3695
+ "https://datatracker.ietf.org/doc/html/rfc2606",
3696
+ "https://datatracker.ietf.org/doc/html/rfc6761"
3697
+ ])
3698
+ });
3699
+ /** The normalized URL string, e.g. `https://www.example.com/path`. */
3700
+ value;
3701
+ /** The URI scheme without `://`, e.g. `https`. */
3702
+ scheme;
3703
+ /** The full hostname, e.g. `www.example.com`. Empty for non-hierarchical URIs. */
3704
+ host;
3705
+ /** Explicit port, or `null` when the default port for the scheme is used. */
3706
+ port;
3707
+ /** The path component, e.g. `/path/to/page`. Root paths are `/`. */
3708
+ path;
3709
+ /** Query string without `?`, or `null` when absent. */
3710
+ query;
3711
+ /** Fragment without `#`, or `null` when absent. */
3712
+ fragment;
3713
+ /** Top-level domain without the dot, e.g. `com`, `se`. */
3714
+ topLevelDomain;
3715
+ /** Country associated with a country-code TLD, or `null` for generic TLDs. */
3716
+ country;
3717
+ /** True when the scheme is `https`. */
3718
+ isSecure;
3719
+ /** True when the host is a reserved example/test domain (RFC 2606 / RFC 6761). */
3720
+ isExampleDomain;
3721
+ /** True when the host is an IP address. */
3722
+ isIpAddress;
3723
+ constructor(p) {
3724
+ this.value = p.value;
3725
+ this.scheme = p.scheme;
3726
+ this.host = p.host;
3727
+ this.port = p.port;
3728
+ this.path = p.path;
3729
+ this.query = p.query;
3730
+ this.fragment = p.fragment;
3731
+ this.topLevelDomain = p.tld;
3732
+ this.country = p.country;
3733
+ this.isSecure = p.scheme === "https";
3734
+ this.isExampleDomain = p.isExample;
3735
+ this.isIpAddress = p.isIp;
3736
+ }
3737
+ static tryParse(input) {
3738
+ if (input == null || input.trim() === "") return null;
3739
+ const trimmed = sanitizeInput(input).trim();
3740
+ if (trimmed.length === 0 || trimmed.length > MAX_INPUT_LENGTH5) return null;
3741
+ let parsed = _Url.#tryParseAbsolute(trimmed);
3742
+ if (parsed == null) {
3743
+ if (!trimmed.includes(".")) return null;
3744
+ parsed = _Url.#tryParseAbsolute("https://" + trimmed);
3745
+ if (parsed == null) return null;
3746
+ }
3747
+ return parsed;
3748
+ }
3749
+ static parse(input) {
3750
+ const r = _Url.tryParse(input);
3751
+ if (r === null) throw new Error("Invalid URL.");
3752
+ return r;
3753
+ }
3754
+ /**
3755
+ * The standard `URL` view of this value, for interop with `fetch` and other
3756
+ * web APIs. The .NET port exposes the same thing as `ToUri()`.
3757
+ */
3758
+ toUrl() {
3759
+ return new URL(this.value);
3760
+ }
3761
+ /** Creates a {@link Url} from a standard `URL`. Throws when it cannot be represented. */
3762
+ static fromUrl(url) {
3763
+ const r = _Url.tryParse(url.href);
3764
+ if (r === null) throw new Error("Invalid URL.");
3765
+ return r;
3766
+ }
3767
+ static isValid(input) {
3768
+ return _Url.tryParse(input) !== null;
3769
+ }
3770
+ static format(input, options) {
3771
+ const r = _Url.tryParse(input);
3772
+ if (r) return r.value;
3773
+ if (options?.fallbackToTrimmedInputWhenInvalid && input != null && input.trim() !== "") {
3774
+ return input.trim();
3775
+ }
3776
+ return null;
3777
+ }
3778
+ static normalize(input, options) {
3779
+ return _Url.format(input, options);
3780
+ }
3781
+ static isNormalized(input) {
3782
+ return input != null && _Url.normalize(input) === input;
3783
+ }
3784
+ /** Returns the normalized URL, e.g. `https://www.example.com/path`. */
3785
+ toNormalizedString() {
3786
+ return this.value;
3787
+ }
3788
+ /** Returns the normalized URL, e.g. `https://www.example.com/path`. */
3789
+ toString() {
3790
+ return this.value;
3791
+ }
3792
+ /**
3793
+ * Scans unstructured text for potential URLs. Heuristic — may include false positives.
3794
+ */
3795
+ static findCandidatesInText(text) {
3796
+ if (!text) return [];
3797
+ const out = [];
3798
+ SCAN_PATTERN3.lastIndex = 0;
3799
+ let m;
3800
+ while ((m = SCAN_PATTERN3.exec(text)) !== null) {
3801
+ const candidate = trimTrailingPunctuation(m[0]);
3802
+ const url = _Url.tryParse(candidate);
3803
+ if (!url) continue;
3804
+ out.push(
3805
+ new TextCandidate({
3806
+ startIndex: m.index,
3807
+ length: candidate.length,
3808
+ originalText: candidate,
3809
+ typeName: "Url",
3810
+ category: TextCandidateCategory.Contact,
3811
+ normalizedForm: url.toNormalizedString(),
3812
+ formattedForm: url.toString(),
3813
+ maskedForm: maskUrl(url),
3814
+ confidence: TextMatchConfidence.High,
3815
+ value: url
3816
+ })
3817
+ );
3818
+ }
3819
+ return out;
3820
+ }
3821
+ equals(other) {
3822
+ return other != null && this.value === other.value;
3823
+ }
3824
+ compareTo(other) {
3825
+ if (other == null) return 1;
3826
+ return this.value < other.value ? -1 : this.value > other.value ? 1 : 0;
3827
+ }
3828
+ static #tryParseAbsolute(input) {
3829
+ const m = input.match(ABSOLUTE_URI);
3830
+ if (!m) return null;
3831
+ const scheme = m[1].toLowerCase();
3832
+ if (scheme.includes(".")) return null;
3833
+ const isHierarchical = HIERARCHICAL_RE.test(input);
3834
+ if (isHierarchical) {
3835
+ return _Url.#parseHierarchical(input, scheme);
3836
+ }
3837
+ return _Url.#parseNonHierarchical(input, scheme);
3838
+ }
3839
+ static #parseHierarchical(input, scheme) {
3840
+ let u;
3841
+ try {
3842
+ u = new URL(input);
3843
+ } catch {
3844
+ return null;
3845
+ }
3846
+ const rawHost = u.hostname;
3847
+ const isIp = rawHost.length > 0 && (IPV4.test(rawHost) || rawHost.startsWith("["));
3848
+ let tld = "";
3849
+ if (!isIp && rawHost.length > 0) {
3850
+ const lastDot = rawHost.lastIndexOf(".");
3851
+ tld = lastDot >= 0 ? rawHost.slice(lastDot + 1) : "";
3852
+ }
3853
+ let country = null;
3854
+ if (!isIp && tld.length > 0) {
3855
+ country = getTldCountryMap2().get("." + tld) ?? null;
3856
+ }
3857
+ const isExample = !isIp && rawHost.length > 0 && (RESERVED_TLDS.has(tld.toLowerCase()) || RESERVED_DOMAINS.has(rawHost.toLowerCase()) || rawHost.toLowerCase().endsWith(".example.com") || rawHost.toLowerCase().endsWith(".example.org") || rawHost.toLowerCase().endsWith(".example.net"));
3858
+ let port = null;
3859
+ if (u.port !== "") port = parseInt(u.port, 10);
3860
+ if (port != null && DEFAULT_PORTS[scheme] === port) port = null;
3861
+ const normalized = u.href;
3862
+ const path = u.pathname;
3863
+ const query = u.search.length > 0 ? u.search.slice(1) : null;
3864
+ const fragment = u.hash.length > 0 ? u.hash.slice(1) : null;
3865
+ return new _Url({
3866
+ value: normalized,
3867
+ scheme,
3868
+ host: rawHost,
3869
+ port,
3870
+ path: path.length === 0 ? "/" : path,
3871
+ query,
3872
+ fragment,
3873
+ tld,
3874
+ country,
3875
+ isExample,
3876
+ isIp
3877
+ });
3878
+ }
3879
+ static #parseNonHierarchical(input, scheme) {
3880
+ const colonIdx = input.indexOf(":");
3881
+ if (colonIdx < 0) return null;
3882
+ const rest = input.slice(colonIdx + 1);
3883
+ if (rest.length === 0) return null;
3884
+ let host = "";
3885
+ let tld = "";
3886
+ let country = null;
3887
+ let isExample = false;
3888
+ let path = rest;
3889
+ let query = null;
3890
+ let fragment = null;
3891
+ if (scheme === "mailto") {
3892
+ const qIdx = rest.indexOf("?");
3893
+ let mainPart = rest;
3894
+ if (qIdx >= 0) {
3895
+ mainPart = rest.slice(0, qIdx);
3896
+ const fragIdx = rest.indexOf("#", qIdx);
3897
+ if (fragIdx >= 0) {
3898
+ query = rest.slice(qIdx + 1, fragIdx);
3899
+ fragment = rest.slice(fragIdx + 1);
3900
+ } else {
3901
+ query = rest.slice(qIdx + 1);
3902
+ }
3903
+ } else {
3904
+ const fragIdx = rest.indexOf("#");
3905
+ if (fragIdx >= 0) {
3906
+ mainPart = rest.slice(0, fragIdx);
3907
+ fragment = rest.slice(fragIdx + 1);
3908
+ }
3909
+ }
3910
+ const atIdx = mainPart.lastIndexOf("@");
3911
+ if (atIdx >= 0) {
3912
+ host = mainPart.slice(atIdx + 1).toLowerCase();
3913
+ const lastDot = host.lastIndexOf(".");
3914
+ tld = lastDot >= 0 ? host.slice(lastDot + 1) : "";
3915
+ if (tld.length > 0) {
3916
+ country = getTldCountryMap2().get("." + tld) ?? null;
3917
+ }
3918
+ isExample = RESERVED_TLDS.has(tld.toLowerCase()) || RESERVED_DOMAINS.has(host) || host.endsWith(".example.com") || host.endsWith(".example.org") || host.endsWith(".example.net");
3919
+ }
3920
+ path = mainPart;
3921
+ } else {
3922
+ const qIdx = rest.indexOf("?");
3923
+ if (qIdx >= 0) {
3924
+ path = rest.slice(0, qIdx);
3925
+ const fragIdx = rest.indexOf("#", qIdx);
3926
+ if (fragIdx >= 0) {
3927
+ query = rest.slice(qIdx + 1, fragIdx);
3928
+ fragment = rest.slice(fragIdx + 1);
3929
+ } else {
3930
+ query = rest.slice(qIdx + 1);
3931
+ }
3932
+ } else {
3933
+ const fragIdx = rest.indexOf("#");
3934
+ if (fragIdx >= 0) {
3935
+ path = rest.slice(0, fragIdx);
3936
+ fragment = rest.slice(fragIdx + 1);
3937
+ }
3938
+ }
3939
+ }
3940
+ const normalized = `${scheme}:${rest}`;
3941
+ return new _Url({
3942
+ value: normalized,
3943
+ scheme,
3944
+ host,
3945
+ port: null,
3946
+ path,
3947
+ query,
3948
+ fragment,
3949
+ tld,
3950
+ country,
3951
+ isExample,
3952
+ isIp: false
3953
+ });
3954
+ }
3955
+ };
3956
+ function trimTrailingPunctuation(value) {
3957
+ let end = value.length;
3958
+ while (end > 0) {
3959
+ const ch = value[end - 1];
3960
+ if (ch === "." || ch === "," || ch === ";" || ch === "!" || ch === "?" || ch === ")" || ch === "]" || ch === ">" || ch === "'" || ch === '"') {
3961
+ if (ch === ")" && value.includes("(")) break;
3962
+ if (ch === "]" && value.includes("[")) break;
3963
+ end--;
3964
+ } else {
3965
+ break;
3966
+ }
3967
+ }
3968
+ return end < value.length ? value.slice(0, end) : value;
3969
+ }
3970
+ function maskUrl(url) {
3971
+ const schemePrefix = url.scheme + "://";
3972
+ if (!url.value.toLowerCase().startsWith(schemePrefix)) {
3973
+ return `${url.scheme}:***`;
3974
+ }
3975
+ let s = url.scheme + "://" + url.host;
3976
+ if (url.port != null) s += ":" + url.port;
3977
+ if (url.path === "/" || url.path === "") {
3978
+ s += "/";
3979
+ } else {
3980
+ s += "/***";
3981
+ }
3982
+ if (url.query != null) s += "?***";
3983
+ if (url.fragment != null) s += "#***";
3984
+ return s;
3985
+ }
3986
+
3987
+ exports.EmailAddress = EmailAddress;
3988
+ exports.PublicEmailProvider = PublicEmailProvider;
3989
+ exports.Url = Url;
3990
+ exports.maskEmailAddress = maskEmailAddress;
3991
+ exports.maskUrl = maskUrl;
3992
+ exports.toMailtoUri = toMailtoUri;
3993
+ //# sourceMappingURL=index.cjs.map
3994
+ //# sourceMappingURL=index.cjs.map