@ham2k/lib-operation-data 1.1.3 → 1.2.1

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.
package/dist/index.js CHANGED
@@ -198,8 +198,28 @@ function frequencyForBand(band, mode) {
198
198
  // src/data/bandPlans.json
199
199
  var bandPlans_default = {
200
200
  bands: {
201
+ "2190m": {
202
+ mhz: [135.7, 137.8],
203
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "bg:2", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "ua:C", "ua:B", "us:N", "us:T"],
204
+ segments: [
205
+ { name: "JP 4th Class: DATA only", mhz: [135.7, 137.8], levels: ["jp:4"], superModes: ["DATA"] }
206
+ ]
207
+ },
208
+ "630m": {
209
+ mhz: [472, 479],
210
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "bg:2", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "de:N", "de:E", "dk:D", "gb:F", "gb:I", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "se:insteg", "si:N", "us:N", "us:T"],
211
+ segments: [
212
+ { name: "JP 4th Class: DATA only", mhz: [472, 479], levels: ["jp:4"], superModes: ["DATA"] }
213
+ ]
214
+ },
215
+ "560m": {
216
+ mhz: [501, 504],
217
+ exceptLevels: ["be:C", "be:B"],
218
+ segments: []
219
+ },
201
220
  "160m": {
202
221
  mhz: [1800, 2e3],
222
+ exceptLevels: ["at:3", "au:F", "au:S", "be:C", "bg:2", "ca:B", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "hr:P", "hu:KEZDO", "id:SIAGA", "kr:4", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
203
223
  segments: [
204
224
  { name: "Out of band Reg1", mhz: [1800, 1810], mode: false, regions: [1] },
205
225
  { name: "CW Reg1", mhz: [1810, 1838], mode: "CW", regions: [1] },
@@ -207,11 +227,18 @@ var bandPlans_default = {
207
227
  { name: "CW", mhz: [1800, 1843], mode: "CW" },
208
228
  { name: "FT8", mhz: [1840, 1843], mode: "FT8", priority: 100 },
209
229
  { name: "Phone", mhz: [1843, 2e3], mode: "SSB", submode: "LSB" },
210
- { name: "Australia", mhz: [1800, 1875], mode: null, countries: ["au"] }
230
+ { name: "Australia", mhz: [1800, 1875], mode: null, countries: ["au"] },
231
+ { name: "BR: Class A only", mhz: [1850, 2e3], exceptLevels: ["br:C", "br:B"] },
232
+ { name: "CZ: Class A only", mhz: [1810, 1830], exceptLevels: ["cz:N"] },
233
+ { name: "HU: CEPT (full) only", mhz: [1850, 2e3], exceptLevels: ["hu:NOVICE"] },
234
+ { name: "JP 4th Class: DATA only", mhz: [1907.5, 1912.5], levels: ["jp:4"], superModes: ["DATA"] },
235
+ { name: "UA Entry level (student): DATA only", mhz: [1840, 1842], levels: ["ua:C"], superModes: ["DATA"] },
236
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [1842, 1850], exceptLevels: ["ua:C"] }
211
237
  ]
212
238
  },
213
239
  "80m": {
214
- mhz: [3500, 3800],
240
+ mhz: [3500, 4e3],
241
+ exceptLevels: ["at:3", "bg:2", "ca:B", "cn:A", "de:N", "dk:D", "kr:4", "my:C", "nl:N", "ru:4", "se:insteg"],
215
242
  segments: [
216
243
  { name: "CW Reg1", mhz: [3500, 3570], mode: "CW", regions: [1] },
217
244
  { name: "CW", mhz: [3500, 3600], mode: "CW" },
@@ -220,11 +247,27 @@ var bandPlans_default = {
220
247
  { name: "Data", mhz: [3570, 3600], mode: "RTTY" },
221
248
  { name: "FT8", mhz: [3573, 3576], mode: "FT8", priority: 100 },
222
249
  { name: "Phone", mhz: [3600, 4e3], mode: "SSB", submode: "LSB" },
223
- { name: "Australia", mhz: [3500, 3800], mode: null, countries: ["au"] }
250
+ { name: "Australia", mhz: [3500, 3800], mode: null, countries: ["au"] },
251
+ { name: "AU: Advanced only", mhz: [3776, 3800], exceptLevels: ["au:F", "au:S"] },
252
+ { name: "BR: Class A only", mhz: [3800, 4e3], exceptLevels: ["br:C", "br:B"] },
253
+ { name: "CZ: Class A only", mhz: [3500, 3550], exceptLevels: ["cz:N"] },
254
+ { name: "CZ: Class A only", mhz: [3700, 3800], exceptLevels: ["cz:N"] },
255
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [3650, 3700], exceptLevels: ["ua:C"] },
256
+ { name: "UA: Higher qualification (HAREC) only", mhz: [3700, 3730], exceptLevels: ["ua:C", "ua:B"] },
257
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [3730, 3740], exceptLevels: ["ua:C"] },
258
+ { name: "UA Novice: DATA only", mhz: [3730, 3740], levels: ["ua:B"], superModes: ["DATA"] },
259
+ { name: "UA: Higher qualification (HAREC) only", mhz: [3740, 3800], exceptLevels: ["ua:C", "ua:B"] },
260
+ { name: "US: Amateur Extra only", mhz: [3500, 3525], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
261
+ { name: "US Novice, Technician: CW only", mhz: [3525, 3600], levels: ["us:N", "us:T"], superModes: ["CW"] },
262
+ { name: "US: Amateur Extra only", mhz: [3600, 3700], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
263
+ { name: "US: Advanced, Amateur Extra only", mhz: [3700, 3800], exceptLevels: ["us:N", "us:T", "us:G"] },
264
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [3800, 3900], exceptLevels: ["us:N", "us:T"] },
265
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [3900, 4e3], regions: [2], exceptLevels: ["us:N", "us:T"] }
224
266
  ]
225
267
  },
226
268
  "60m": {
227
- mhz: [5330.5, 3406.5],
269
+ mhz: [5250, 5450],
270
+ exceptLevels: ["at:3", "at:4", "be:C", "be:B", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "de:N", "de:E", "dk:D", "gb:F", "gb:I", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "id:PENGGALANG", "my:C", "nl:N", "no:begrenset", "rs:C", "rs:B", "se:insteg", "si:N", "us:N", "us:T"],
228
271
  segments: [
229
272
  { name: "60m Channel 1", mhz: [5330.5, 5333.5] },
230
273
  { name: "60m Channel 2", mhz: [5346.5, 5349.5] },
@@ -235,6 +278,7 @@ var bandPlans_default = {
235
278
  },
236
279
  "40m": {
237
280
  mhz: [7e3, 7300],
281
+ exceptLevels: ["at:3", "at:4", "bg:2", "ca:B", "ch:HB3", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "kr:4", "my:C", "ru:4"],
238
282
  segments: [
239
283
  { name: "CW", mhz: [7e3, 7060], mode: "CW" },
240
284
  { name: "CW Reg1", mhz: [7e3, 7040], mode: "CW", regions: [1] },
@@ -245,11 +289,22 @@ var bandPlans_default = {
245
289
  { name: "Data", mhz: [7080, 7125], mode: "RTTY", countries: ["us"] },
246
290
  { name: "Phone", mhz: [7125, 7300], mode: "SSB", submode: "LSB", countries: ["us"] },
247
291
  { name: "Australia", mhz: [7e3, 7300], mode: null, countries: ["au"] },
248
- { name: "Out of band Reg1", mhz: [7200, 7300], mode: false, regions: [1] }
292
+ { name: "Out of band Reg1", mhz: [7200, 7300], mode: false, regions: [1] },
293
+ { name: "BR: Class B, Class A only", mhz: [7047, 7300], exceptLevels: ["br:C"] },
294
+ { name: "HU: CEPT Novice, CEPT (full) only", mhz: [7100, 7175], exceptLevels: ["hu:KEZDO"] },
295
+ { name: "UA Entry level (student): CW only", mhz: [7040, 7050], levels: ["ua:C"], superModes: ["CW"] },
296
+ { name: "UA Entry level (student): CW/PHONE only", mhz: [7050, 7080], levels: ["ua:C"], superModes: ["CW", "PHONE"] },
297
+ { name: "UA: Higher qualification (HAREC) only", mhz: [7100, 7200], exceptLevels: ["ua:C", "ua:B"] },
298
+ { name: "US: Amateur Extra only", mhz: [7e3, 7025], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
299
+ { name: "US Novice, Technician: CW only", mhz: [7025, 7125], levels: ["us:N", "us:T"], superModes: ["CW"] },
300
+ { name: "US: Advanced, Amateur Extra only", mhz: [7125, 7175], exceptLevels: ["us:N", "us:T", "us:G"] },
301
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [7175, 7200], exceptLevels: ["us:N", "us:T"] },
302
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [7200, 7300], regions: [2], exceptLevels: ["us:N", "us:T"] }
249
303
  ]
250
304
  },
251
305
  "30m": {
252
306
  mhz: [10100, 10150],
307
+ exceptLevels: ["ar:N", "ar:G", "at:3", "at:4", "au:F", "au:S", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "id:PENGGALANG", "jp:4", "jp:3", "kr:4", "kr:3P", "kr:3T", "my:C", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
253
308
  segments: [
254
309
  { name: "CW", mhz: [10100, 10150], mode: "CW" },
255
310
  { name: "CW Reg1", mhz: [10100, 10130], mode: "CW", regions: [1] },
@@ -257,25 +312,45 @@ var bandPlans_default = {
257
312
  { name: "FT8", mhz: [10136, 10139], mode: "FT8", priority: 100 },
258
313
  { name: "FT4", mhz: [10140, 10143], mode: "FT4", priority: 100 },
259
314
  { name: "Australia & New Zealand", mhz: [10100, 10150], mode: null, countries: ["au", "nz"] },
260
- { name: "Africa south of the Equator", mhz: [10100, 10150], mode: null, countries: ["ao", "bi", "bw", "cd", "cg", "ga", "ke", "km", "ls", "mg", "mu", "mw", "mz", "na", "rw", "sc", "so", "st", "sz", "tz", "ug", "za", "zm", "zw"] }
315
+ { name: "Africa south of the Equator", mhz: [10100, 10150], mode: null, countries: ["ao", "bi", "bw", "cd", "cg", "ga", "ke", "km", "ls", "mg", "mu", "mw", "mz", "na", "rw", "sc", "so", "st", "sz", "tz", "ug", "za", "zm", "zw"] },
316
+ { name: "UA Entry level (student): CW only", mhz: [10136, 10150], levels: ["ua:C"], superModes: ["CW"] }
261
317
  ]
262
318
  },
263
319
  "20m": {
264
320
  mhz: [14e3, 14350],
321
+ exceptLevels: ["at:3", "at:4", "au:F", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "id:SIAGA", "jp:4", "jp:3", "kr:4", "kr:3P", "kr:3T", "my:C", "rs:C", "ru:4", "si:N", "ua:C", "us:N", "us:T"],
265
322
  segments: [
266
323
  { name: "CW", mhz: [14e3, 14150], mode: "CW" },
267
324
  { name: "CW Reg1", mhz: [14e3, 14070], mode: "CW", regions: [1] },
268
325
  { name: "CW Reg2", mhz: [14e3, 14101], mode: "CW", regions: [2] },
326
+ { name: "CW US", mhz: [14e3, 14150], mode: "CW", countries: ["us"] },
269
327
  { name: "Data", mhz: [14070, 14095], mode: "RTTY" },
328
+ { name: "Data US", mhz: [14070, 14095], mode: "RTTY", countries: ["us"] },
270
329
  { name: "FT8", mhz: [14074, 14077], mode: "FT8", priority: 100 },
271
330
  { name: "FT4", mhz: [14080, 14083], mode: "FT4", priority: 100 },
272
331
  { name: "Phone", mhz: [14112, 14350], mode: "SSB", submode: "USB", regions: [1, 2] },
273
332
  { name: "Phone", mhz: [14150, 14350], mode: "SSB", submode: "USB", countries: ["us"] },
274
- { name: "Australia", mhz: [14e3, 14350], mode: null, countries: ["au"] }
333
+ { name: "Australia", mhz: [14e3, 14350], mode: null, countries: ["au"] },
334
+ { name: "AR: General, Superior, Special only", mhz: [14e3, 14070], exceptLevels: ["ar:N"] },
335
+ { name: "AR Novice: CW/DATA only", mhz: [14070, 14099], levels: ["ar:N"], superModes: ["CW", "DATA"] },
336
+ { name: "AR: General, Superior, Special only", mhz: [14099, 14350], exceptLevels: ["ar:N"] },
337
+ { name: "HR: Class A only", mhz: [14e3, 14040], exceptLevels: ["hr:P"] },
338
+ { name: "HR: Class A only", mhz: [14150, 14280], exceptLevels: ["hr:P"] },
339
+ { name: "HU: CEPT Novice, CEPT (full) only", mhz: [14300, 14350], exceptLevels: ["hu:KEZDO"] },
340
+ { name: "ID Advanced: CW only", mhz: [14e3, 14070], levels: ["id:PENGGALANG"], superModes: ["CW"] },
341
+ { name: "ID Advanced: DATA only", mhz: [14070, 14110], levels: ["id:PENGGALANG"], superModes: ["DATA"] },
342
+ { name: "ID: Extra Class only", mhz: [14150, 14350], exceptLevels: ["id:PENGGALANG"] },
343
+ { name: "UA Novice: CW/DATA only", mhz: [14100, 14112], levels: ["ua:B"], superModes: ["CW", "DATA"] },
344
+ { name: "UA Novice: CW only", mhz: [14112, 14250], levels: ["ua:B"], superModes: ["CW"] },
345
+ { name: "UA: Higher qualification (HAREC) only", mhz: [14250, 14350], exceptLevels: ["ua:B"] },
346
+ { name: "US: Amateur Extra only", mhz: [14e3, 14025], exceptLevels: ["us:G", "us:A"] },
347
+ { name: "US: Amateur Extra only", mhz: [14150, 14175], exceptLevels: ["us:G", "us:A"] },
348
+ { name: "US: Advanced, Amateur Extra only", mhz: [14175, 14225], exceptLevels: ["us:G"] }
275
349
  ]
276
350
  },
277
351
  "17m": {
278
352
  mhz: [18068, 18168],
353
+ exceptLevels: ["ar:N", "at:3", "at:4", "au:F", "au:S", "be:C", "bg:2", "br:C", "br:B", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "id:PENGGALANG", "jp:4", "kr:4", "kr:3P", "kr:3T", "my:C", "nl:N", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
279
354
  segments: [
280
355
  { name: "CW", mhz: [18068, 18110], mode: "CW" },
281
356
  { name: "CW Reg1", mhz: [18068, 18095], mode: "CW", regions: [1] },
@@ -285,25 +360,49 @@ var bandPlans_default = {
285
360
  { name: "Beacons only", mhz: [18109, 18111], priority: 100 },
286
361
  { name: "Phone", mhz: [18111, 18168], mode: "SSB", submode: "USB" },
287
362
  { name: "Phone US", mhz: [18110, 18168], mode: "SSB", submode: "USB", countries: ["us"] },
288
- { name: "Australia", mhz: [18068, 18168], mode: null, countries: ["au"] }
363
+ { name: "Australia", mhz: [18068, 18168], mode: null, countries: ["au"] },
364
+ { name: "UA Entry level (student): CW only", mhz: [18100, 18168], levels: ["ua:C"], superModes: ["CW"] }
289
365
  ]
290
366
  },
291
367
  "15m": {
292
368
  mhz: [21e3, 21450],
369
+ exceptLevels: ["at:3", "bg:2", "ca:B", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "kr:4", "my:C", "nl:N", "rs:C", "ru:4"],
293
370
  segments: [
294
371
  { name: "CW", mhz: [21e3, 21150], mode: "CW" },
295
372
  { name: "CW Reg1", mhz: [21e3, 21070], mode: "CW", regions: [1] },
373
+ { name: "CW US", mhz: [21e3, 21200], mode: "CW", countries: ["us"] },
296
374
  { name: "Data", mhz: [21070, 21095], mode: "RTTY" },
375
+ { name: "Data US", mhz: [21070, 21095], mode: "RTTY", countries: ["us"] },
297
376
  { name: "FT8", mhz: [21074, 21077], mode: "FT8", priority: 100 },
298
377
  { name: "FT4", mhz: [21140, 21143], mode: "FT4", priority: 100 },
299
378
  { name: "Beacons only", mhz: [21149, 21151], priority: 100 },
300
379
  { name: "Phone", mhz: [21151, 21450], mode: "SSB", submode: "USB" },
301
- { name: "Phone US", mhz: [21150, 21450], mode: "SSB", submode: "USB", countries: ["us"] },
302
- { name: "Australia", mhz: [21e3, 21450], mode: null, countries: ["au"] }
380
+ { name: "Phone US", mhz: [21200, 21450], mode: "SSB", submode: "USB", countries: ["us"] },
381
+ { name: "Australia", mhz: [21e3, 21450], mode: null, countries: ["au"] },
382
+ { name: "AR: General, Superior, Special only", mhz: [21e3, 21070], exceptLevels: ["ar:N"] },
383
+ { name: "AR Novice: CW/DATA only", mhz: [21070, 21125], levels: ["ar:N"], superModes: ["CW", "DATA"] },
384
+ { name: "AR Novice: CW only", mhz: [21125, 21149], levels: ["ar:N"], superModes: ["CW"] },
385
+ { name: "AR: General, Superior, Special only", mhz: [21149, 21200], exceptLevels: ["ar:N"] },
386
+ { name: "AR: Superior, Special only", mhz: [21310, 21450], exceptLevels: ["ar:N", "ar:G"] },
387
+ { name: "BR: Class B, Class A only", mhz: [21150, 21300], exceptLevels: ["br:C"] },
388
+ { name: "BR: Class A only", mhz: [21300, 21450], exceptLevels: ["br:C", "br:B"] },
389
+ { name: "CZ: Class A only", mhz: [21e3, 21050], exceptLevels: ["cz:N"] },
390
+ { name: "CZ: Class A only", mhz: [21200, 21450], exceptLevels: ["cz:N"] },
391
+ { name: "ID General: CW only", mhz: [21e3, 21070], levels: ["id:SIAGA"], superModes: ["CW"] },
392
+ { name: "ID General: CW/DATA only", mhz: [21070, 21125], levels: ["id:SIAGA"], superModes: ["CW", "DATA"] },
393
+ { name: "ID General: CW only", mhz: [21125, 21200], levels: ["id:SIAGA"], superModes: ["CW"] },
394
+ { name: "ID: Advanced, Extra Class only", mhz: [21200, 21450], exceptLevels: ["id:SIAGA"] },
395
+ { name: "UA Entry level (student), Novice: CW only", mhz: [21250, 21450], levels: ["ua:C", "ua:B"], superModes: ["CW"] },
396
+ { name: "US: Amateur Extra only", mhz: [21e3, 21025], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
397
+ { name: "US Novice, Technician: CW only", mhz: [21025, 21200], levels: ["us:N", "us:T"], superModes: ["CW"] },
398
+ { name: "US: Amateur Extra only", mhz: [21200, 21225], exceptLevels: ["us:N", "us:T", "us:G", "us:A"] },
399
+ { name: "US: Advanced, Amateur Extra only", mhz: [21225, 21275], exceptLevels: ["us:N", "us:T", "us:G"] },
400
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [21275, 21450], exceptLevels: ["us:N", "us:T"] }
303
401
  ]
304
402
  },
305
403
  "12m": {
306
- mhz: [24890, 24990],
404
+ mhz: [24740, 24990],
405
+ exceptLevels: ["ar:N", "at:3", "at:4", "au:F", "au:S", "be:C", "bg:2", "ca:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "cz:N", "de:N", "de:E", "dk:D", "hr:P", "hu:KEZDO", "id:SIAGA", "id:PENGGALANG", "kr:4", "my:C", "nl:N", "no:begrenset", "rs:C", "rs:B", "ru:4", "se:insteg", "si:N", "us:N", "us:T"],
307
406
  segments: [
308
407
  { name: "CW", mhz: [24890, 24930], mode: "CW" },
309
408
  { name: "CW Reg1", mhz: [24890, 24915], mode: "CW", regions: [1] },
@@ -313,11 +412,13 @@ var bandPlans_default = {
313
412
  { name: "Phone", mhz: [24930, 24990], mode: "SSB", submode: "USB" },
314
413
  { name: "Beacons only", mhz: [24929, 24931], priority: 100 },
315
414
  { name: "Phone US", mhz: [24930, 24990], mode: "SSB", submode: "USB", countries: ["us"] },
316
- { name: "Australia", mhz: [24890, 24990], mode: null, countries: ["au"] }
415
+ { name: "Australia", mhz: [24890, 24990], mode: null, countries: ["au"] },
416
+ { name: "UA Entry level (student): CW only", mhz: [24915, 24990], levels: ["ua:C"], superModes: ["CW"] }
317
417
  ]
318
418
  },
319
419
  "10m": {
320
420
  mhz: [28e3, 29700],
421
+ exceptLevels: ["at:3", "bg:2", "ca:B", "cn:A", "kr:4", "my:C", "rs:C", "ru:4"],
321
422
  segments: [
322
423
  { name: "CW", mhz: [28e3, 28190], mode: "CW" },
323
424
  { name: "CW Reg1", mhz: [28e3, 28070], mode: "CW", regions: [1] },
@@ -332,11 +433,23 @@ var bandPlans_default = {
332
433
  { name: "Repeater Uplinks", mhz: [29520, 29590] },
333
434
  { name: "FM", mhz: [29520, 29700], mode: "FM" },
334
435
  { name: "Repeater Downlinks", mhz: [29620, 29700] },
335
- { name: "Australia", mhz: [28e3, 29700], mode: null, countries: ["au"] }
436
+ { name: "Australia", mhz: [28e3, 29700], mode: null, countries: ["au"] },
437
+ { name: "CZ: Class A only", mhz: [28e3, 28050], exceptLevels: ["cz:N"] },
438
+ { name: "CZ: Class A only", mhz: [28400, 29700], exceptLevels: ["cz:N"] },
439
+ { name: "UA Entry level (student), Novice: CW/PHONE only", mhz: [28675, 28685], levels: ["ua:C", "ua:B"], superModes: ["CW", "PHONE"] },
440
+ { name: "UA: Novice, Higher qualification (HAREC) only", mhz: [29300, 29520], exceptLevels: ["ua:C"] },
441
+ { name: "US Novice, Technician: CW/PHONE only", mhz: [28300, 28500], levels: ["us:N", "us:T"], superModes: ["CW", "PHONE"] },
442
+ { name: "US: General, Advanced, Amateur Extra only", mhz: [28500, 29700], exceptLevels: ["us:N", "us:T"] }
336
443
  ]
337
444
  },
445
+ "8m": {
446
+ mhz: [40660, 40700],
447
+ exceptLevels: ["be:C", "be:B", "si:N"],
448
+ segments: []
449
+ },
338
450
  "6m": {
339
451
  mhz: [5e4, 54e3],
452
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "bg:2", "ch:HB3", "cl:ASP", "cz:N", "de:N", "de:E", "hr:P", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "nl:N", "rs:C", "rs:B", "ua:C", "ua:B", "us:N"],
340
453
  segments: [
341
454
  { name: "Beacon project Reg1", mhz: [5e4, 50010], mode: null, regions: [1] },
342
455
  { name: "Beacon project Reg2", mhz: [50010, 50020], mode: null, regions: [2] },
@@ -352,11 +465,13 @@ var bandPlans_default = {
352
465
  { name: "FT8", mhz: [50313, 50316], mode: "FT8", priority: 100 },
353
466
  { name: "FT4", mhz: [50318, 50321], mode: "FT4", priority: 100 },
354
467
  { name: "FT8", mhz: [50323, 50326], mode: "FT8", priority: 100 },
355
- { name: "Australia", mhz: [5e4, 54e3], mode: null, countries: ["au"] }
468
+ { name: "Australia", mhz: [5e4, 54e3], mode: null, countries: ["au"] },
469
+ { name: "AR Novice: CW only", mhz: [51e3, 51100], levels: ["ar:N"], superModes: ["CW"] }
356
470
  ]
357
471
  },
358
472
  "4m": {
359
- mhz: [7e4, 70500],
473
+ mhz: [69887.5, 70512.5],
474
+ exceptLevels: ["be:C", "be:B", "bg:2", "ch:HB3", "hr:P", "hu:KEZDO", "hu:NOVICE", "nl:N", "no:begrenset", "rs:C", "rs:B"],
360
475
  segments: [
361
476
  { name: "Beacons only Reg1", mhz: [70090, 70100], mode: "CW", regions: [1] },
362
477
  { name: "CW Reg1", mhz: [7e4, 70090], mode: "CW", regions: [1] },
@@ -369,6 +484,7 @@ var bandPlans_default = {
369
484
  },
370
485
  "2m": {
371
486
  mhz: [144e3, 148e3],
487
+ exceptLevels: ["us:N"],
372
488
  segments: [
373
489
  { name: "CW", mhz: [144e3, 144100], mode: "CW" },
374
490
  { name: "Satellite downlink Reg1", mhz: [144e3, 144025], mode: null, regions: [1] },
@@ -383,19 +499,26 @@ var bandPlans_default = {
383
499
  { name: "Reg1", mhz: [144500, 144794], mode: null, regions: [1] },
384
500
  { name: "FM Satellite Reg1", mhz: [145194, 145206], mode: "FM", regions: [1] },
385
501
  { name: "FM Reg1", mhz: [145206, 145563], mode: "FM", regions: [1] },
386
- { name: "Out of band Reg1", mhz: [146e3, 148e3], mode: false, regions: [1] }
502
+ { name: "Out of band Reg1", mhz: [146e3, 148e3], mode: false, regions: [1] },
503
+ { name: "HU: CEPT (full) only", mhz: [144400, 144500], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
504
+ { name: "HU: CEPT (full) only", mhz: [145562.5, 145794], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
505
+ { name: "UA: Higher qualification (HAREC) only", mhz: [144e3, 144035], exceptLevels: ["ua:C", "ua:B"] }
387
506
  ]
388
507
  },
389
508
  "1.25m": {
390
- mhz: [222e3, 225e3],
509
+ mhz: [219e3, 225e3],
510
+ exceptLevels: ["cl:ASP"],
391
511
  segments: [
392
512
  { name: "CW", mhz: [222e3, 222070], mode: "CW" },
393
513
  { name: "Phone", mhz: [222070, 222150], mode: "SSB", submode: "USB" },
394
- { name: "FM", mhz: [222200, 225e3], mode: "FM" }
514
+ { name: "FM", mhz: [222200, 225e3], mode: "FM" },
515
+ { name: "AR Novice: DATA only", mhz: [220500, 221e3], levels: ["ar:N"], superModes: ["DATA"] },
516
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [219e3, 22e4], regions: [2], exceptLevels: ["us:N"] }
395
517
  ]
396
518
  },
397
519
  "70cm": {
398
520
  mhz: [42e4, 45e4],
521
+ exceptLevels: ["cl:ASP", "se:insteg", "us:N"],
399
522
  segments: [
400
523
  { name: "Out of band Reg1", mhz: [42e4, 43e4], mode: false, regions: [1] },
401
524
  { name: "CW", mhz: [432e3, 432100], mode: "CW" },
@@ -404,14 +527,90 @@ var bandPlans_default = {
404
527
  { name: "Phone", mhz: [432100, 432400], mode: "SSB", submode: "USB", regions: [1] },
405
528
  { name: "FM", mhz: [42e4, 45e4], mode: "FM" },
406
529
  { name: "FM Reg1", mhz: [433400, 433575], mode: "FM", regions: [1] },
407
- { name: "Out of band Reg1", mhz: [44e4, 45e4], mode: false, regions: [1] }
530
+ { name: "Out of band Reg1", mhz: [44e4, 45e4], mode: false, regions: [1] },
531
+ { name: "HU: CEPT (full) only", mhz: [431975, 432e3], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
532
+ { name: "HU: CEPT (full) only", mhz: [432400, 432500], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
533
+ { name: "HU: CEPT (full) only", mhz: [438e3, 44e4], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
534
+ { name: "UA: Higher qualification (HAREC) only", mhz: [432e3, 432025], exceptLevels: ["ua:C", "ua:B"] }
408
535
  ]
409
536
  },
410
537
  "33cm": {
411
538
  mhz: [902e3, 928e3],
412
539
  segments: [
413
- { name: "FM", mhz: [927e3, 928e3], mode: "FM" }
540
+ { name: "FM", mhz: [927e3, 928e3], mode: "FM" },
541
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [902e3, 928e3], regions: [2], exceptLevels: ["us:N"] }
542
+ ]
543
+ },
544
+ "23cm": {
545
+ mhz: [124e4, 1325e3],
546
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "be:B", "bg:2", "ch:HB3", "cl:ASP", "de:N", "gb:F", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "no:begrenset", "rs:C", "rs:B", "se:insteg", "si:N"],
547
+ segments: [
548
+ { name: "HU: CEPT (full) only", mhz: [124e4, 1290994], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
549
+ { name: "HU Beginner (Kezd\u0151), CEPT Novice: PHONE only", mhz: [1290994, 1291494], levels: ["hu:KEZDO", "hu:NOVICE"], superModes: ["PHONE"] },
550
+ { name: "HU: CEPT (full) only", mhz: [1291494, 1297494], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
551
+ { name: "HU Beginner (Kezd\u0151), CEPT Novice: PHONE only", mhz: [1297494, 1298e3], levels: ["hu:KEZDO", "hu:NOVICE"], superModes: ["PHONE"] },
552
+ { name: "HU: CEPT (full) only", mhz: [1298e3, 13e5], exceptLevels: ["hu:KEZDO", "hu:NOVICE"] },
553
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [124e4, 127e4], exceptLevels: ["us:N"] },
554
+ { name: "US: Technician, General, Advanced, Amateur Extra only", mhz: [1295e3, 13e5], exceptLevels: ["us:N"] }
555
+ ]
556
+ },
557
+ "13cm": {
558
+ mhz: [23e5, 245e4],
559
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "be:B", "ch:HB3", "cl:ASP", "de:N", "dk:D", "hu:KEZDO", "hu:NOVICE", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "se:insteg", "si:N", "us:N"],
560
+ segments: [
561
+ { name: "AU: Advanced only", mhz: [23e5, 2302e3], exceptLevels: ["au:S"] },
562
+ { name: "GB: Intermediate, Full only", mhz: [231e4, 235e4], exceptLevels: ["gb:F"] },
563
+ { name: "GB: Intermediate, Full only", mhz: [239e4, 24e5], exceptLevels: ["gb:F"] }
564
+ ]
565
+ },
566
+ "9cm": {
567
+ mhz: [33e5, 36e5],
568
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "gb:F", "hr:P", "my:C", "my:B", "nl:N", "no:begrenset", "si:N"],
569
+ segments: []
570
+ },
571
+ "6cm": {
572
+ mhz: [565e4, 5925e3],
573
+ exceptLevels: ["at:3", "at:4", "au:F", "be:C", "be:B", "ch:HB3", "cl:ASP", "cn:A", "de:N", "dk:D", "hu:KEZDO", "hu:NOVICE", "my:C", "my:B", "nl:N", "no:begrenset", "se:insteg", "si:N", "us:N"],
574
+ segments: [
575
+ { name: "GB: Intermediate, Full only", mhz: [583e4, 585e4], exceptLevels: ["gb:F"] },
576
+ { name: "UA: Entry level (student), Higher qualification (HAREC) only", mhz: [566e4, 567e4], exceptLevels: ["ua:B"] },
577
+ { name: "UA: Higher qualification (HAREC) only", mhz: [583e4, 585e4], exceptLevels: ["ua:C", "ua:B"] }
414
578
  ]
579
+ },
580
+ "3cm": {
581
+ mhz: [1e7, 105e5],
582
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "pl:1", "se:insteg", "si:N", "us:N"],
583
+ segments: []
584
+ },
585
+ "1.25cm": {
586
+ mhz: [24e6, 2425e4],
587
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cl:ASP", "cl:N", "cn:A", "de:N", "dk:D", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "no:begrenset", "se:insteg", "si:N", "us:N"],
588
+ segments: []
589
+ },
590
+ "6mm": {
591
+ mhz: [47e6, 485e5],
592
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "si:N", "us:N"],
593
+ segments: []
594
+ },
595
+ "4mm": {
596
+ mhz: [755e5, 815e5],
597
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "si:N", "us:N"],
598
+ segments: []
599
+ },
600
+ "2.5mm": {
601
+ mhz: [11998e4, 123e6],
602
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "nl:N", "si:N", "us:N"],
603
+ segments: []
604
+ },
605
+ "2mm": {
606
+ mhz: [134e6, 149e6],
607
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "id:SIAGA", "kr:4", "kr:3P", "kr:3T", "nl:N", "si:N", "us:N"],
608
+ segments: []
609
+ },
610
+ "1mm": {
611
+ mhz: [241e6, 25e7],
612
+ exceptLevels: ["at:3", "at:4", "au:F", "au:S", "be:C", "be:B", "ch:HB3", "cn:A", "de:N", "gb:F", "hu:KEZDO", "hu:NOVICE", "kr:4", "kr:3P", "kr:3T", "my:C", "my:B", "nl:N", "si:N", "us:N"],
613
+ segments: []
415
614
  }
416
615
  }
417
616
  };
@@ -578,9 +777,12 @@ function superModeForMode(mode) {
578
777
  }
579
778
  }
580
779
  var bandPlansData = bandPlans_default;
780
+ function isLicenseSegment(segment) {
781
+ return Boolean(segment.exceptLevels || segment.levels);
782
+ }
581
783
  var AllSegments = Object.keys(bandPlansData.bands).reduce((segments, band) => {
582
784
  return segments.concat(
583
- bandPlansData.bands[band].segments.map((segment) => {
785
+ bandPlansData.bands[band].segments.filter((segment) => !isLicenseSegment(segment)).map((segment) => {
584
786
  const mhz = Array.isArray(segment.mhz) && segment.mhz.length >= 2 ? [segment.mhz[0], segment.mhz[1]] : [0, 0];
585
787
  return {
586
788
  name: segment.name,
@@ -623,6 +825,540 @@ function modeForFrequency(frequency, options = {}) {
623
825
  return sortedSegments[0]?.mode;
624
826
  }
625
827
 
626
- export { ADIF_MODES, ADIF_MODES_AND_SUBMODES, ADIF_MODE_FOR_SUBMODE, ADIF_SUBMODES, ALL_MODES, BANDS, CONTEST_BANDS, EHF_BANDS, EXTENDED_BANDS, HF_BANDS, MAIN_MODES, PHONE_MODES, POPULAR_BANDS, POPULAR_MODES, SHF_BANDS, SUPER_MODES, UHF_BANDS, VHF_BANDS, adifModeAndSubmodeForMode, bandForExactFrequencyInMHz, bandForFrequency, frequencyForBand, modeForFrequency, superModeForMode };
828
+ // src/data/licenseLevels.json
829
+ var licenseLevels_default = {
830
+ jurisdictions: [
831
+ {
832
+ key: "ar",
833
+ name: "Argentina",
834
+ regulator: "ENACOM",
835
+ rules: "Resoluci\xF3n ENACOM 3635-E/2017 (Reglamento General de Radioaficionados, Anexo A band plan) as amended by Res. ENACOM 1186/2024",
836
+ term: "License Category",
837
+ termLocal: "categor\xEDa",
838
+ entities: ["LU"],
839
+ levels: [
840
+ { code: "N", name: "Novice", nameLocal: "Novicio", tier: "intermediate", aliases: ["Inicial"], maxPowerW: 200 },
841
+ { code: "G", name: "General", tier: "intermediate", aliases: ["Intermedia"], maxPowerW: 1e3 },
842
+ { code: "S", name: "Superior", tier: "full", maxPowerW: 1500 },
843
+ { code: "E", name: "Special", nameLocal: "Especial", tier: "full", maxPowerW: 1500 }
844
+ ]
845
+ },
846
+ {
847
+ key: "at",
848
+ name: "Austria",
849
+ regulator: "Fernmeldeb\xFCros (Fernmeldebeh\xF6rde, Bundesministerium f\xFCr Finanzen)",
850
+ term: "License Class",
851
+ termLocal: "Bewilligungsklasse",
852
+ entities: ["OE"],
853
+ levels: [
854
+ { code: "3", name: "Class 3", nameLocal: "Bewilligungsklasse 3", tier: "basic", maxPowerW: 100 },
855
+ { code: "4", name: "Class 4", nameLocal: "Bewilligungsklasse 4", tier: "intermediate", maxPowerW: 100 },
856
+ { code: "1", name: "Class 1", nameLocal: "Bewilligungsklasse 1", tier: "full", maxPowerW: 1e3 }
857
+ ]
858
+ },
859
+ {
860
+ key: "au",
861
+ name: "Australia",
862
+ regulator: "ACMA",
863
+ term: "Licence Level",
864
+ termLocal: "qualification",
865
+ entities: ["VK", "VK9X", "VK9C", "VK9N", "VK9L", "VK9W", "VK9M", "VK0H", "VK0M"],
866
+ levels: [
867
+ { code: "F", name: "Foundation", nameLocal: "ACMA recognition certificate (Foundation)", tier: "intermediate", maxPowerW: 10 },
868
+ { code: "S", name: "Standard", nameLocal: "ACMA recognition certificate (Standard)", tier: "intermediate", maxPowerW: 100 },
869
+ { code: "A", name: "Advanced", nameLocal: "ACMA recognition certificate (Advanced)", tier: "full", maxPowerW: 400 }
870
+ ],
871
+ callsigns: [
872
+ { pattern: "^VK[0-9][A-Z]{2}$", level: "A", entities: ["VK"] }
873
+ ]
874
+ },
875
+ {
876
+ key: "be",
877
+ name: "Belgium",
878
+ regulator: "BIPT/IBPT",
879
+ term: "Licence Class",
880
+ termLocal: "certificat d'op\xE9rateur de classe A/B/C",
881
+ entities: ["ON"],
882
+ levels: [
883
+ { code: "C", name: "Entry (Basic)", nameLocal: "Certificat d'op\xE9rateur de classe C (ex licence de base)", tier: "intermediate", maxPowerW: 25 },
884
+ { code: "B", name: "Novice", nameLocal: "Certificat d'op\xE9rateur de classe B", tier: "intermediate", maxPowerW: 100 },
885
+ { code: "A", name: "HAREC", nameLocal: "Certificat d'op\xE9rateur de classe A (ex certificat HAREC)", tier: "full", maxPowerW: 1500 }
886
+ ],
887
+ callsigns: [
888
+ { pattern: "^ON3[A-Z]{2,3}$", level: "C" },
889
+ { pattern: "^ON2[A-Z]{2,3}$", level: "B", atLeast: true },
890
+ { pattern: "^ON[14-9][A-Z]{1,3}$", level: "A" }
891
+ ]
892
+ },
893
+ {
894
+ key: "bg",
895
+ name: "Bulgaria",
896
+ regulator: "CRC (\u041A\u043E\u043C\u0438\u0441\u0438\u044F \u0437\u0430 \u0440\u0435\u0433\u0443\u043B\u0438\u0440\u0430\u043D\u0435 \u043D\u0430 \u0441\u044A\u043E\u0431\u0449\u0435\u043D\u0438\u044F\u0442\u0430)",
897
+ term: "License Class",
898
+ termLocal: "\u0440\u0430\u0434\u0438\u043E\u043B\u044E\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u0438 \u043A\u043B\u0430\u0441",
899
+ entities: ["LZ"],
900
+ levels: [
901
+ { code: "2", name: "Class 2", nameLocal: "\u041A\u043B\u0430\u0441 2", tier: "basic", maxPowerW: 5, superModes: ["PHONE", "DATA"] },
902
+ { code: "1", name: "Class 1", nameLocal: "\u041A\u043B\u0430\u0441 1", tier: "full", maxPowerW: 350 }
903
+ ],
904
+ callsigns: [
905
+ { pattern: "^LZ[0-9][A-Z]{2}$", level: "1" }
906
+ ]
907
+ },
908
+ {
909
+ key: "br",
910
+ name: "Brazil",
911
+ regulator: "Anatel",
912
+ rules: "Res. Anatel 777/2025 (RGST) Art. 277 (classes); Ato SOR 926/2024 (bands/power by class); Ato 3448/2026 (operations, exams, callsigns)",
913
+ term: "License Class",
914
+ termLocal: "classe",
915
+ entities: ["PY", "PY0F", "PY0S", "PY0T"],
916
+ levels: [
917
+ { code: "C", name: "Class C", nameLocal: "Classe C", tier: "intermediate", aliases: ["Classe D"], maxPowerW: 100 },
918
+ { code: "B", name: "Class B", nameLocal: "Classe B", tier: "intermediate", maxPowerW: 1e3 },
919
+ { code: "A", name: "Class A", nameLocal: "Classe A", tier: "full", maxPowerW: 1500 }
920
+ ],
921
+ callsigns: [
922
+ { pattern: "^PU[0-9][A-Z]{3}$", level: "C" },
923
+ { pattern: "^PV2[K-Y][A-Z]{2}$", level: "C" }
924
+ ]
925
+ },
926
+ {
927
+ key: "ca",
928
+ name: "Canada",
929
+ regulator: "ISED",
930
+ rules: "RBR-4 Issue 3 (July 2022); RIC-3 Issue 5 (March 2022); Radiocommunication Regulations",
931
+ term: "Qualification",
932
+ termLocal: "qualification",
933
+ entities: ["VE"],
934
+ levels: [
935
+ { code: "B", name: "Basic", nameLocal: "Basic Qualification / comp\xE9tence de base", tier: "basic", maxPowerW: 560 },
936
+ { code: "B/H", name: "Basic with Honours", nameLocal: "Basic Qualification with Honours / comp\xE9tence de base re\xE7ue avec distinction", tier: "full", maxPowerW: 560 },
937
+ { code: "B+5", name: "Basic + Morse (5 wpm)", nameLocal: "Morse Code Qualification / comp\xE9tence en code Morse", tier: "full", maxPowerW: 560 },
938
+ { code: "B+A", name: "Basic + Advanced", nameLocal: "Advanced Qualification / comp\xE9tence sup\xE9rieure", tier: "full", maxPowerW: 2250 }
939
+ ]
940
+ },
941
+ {
942
+ key: "ch",
943
+ name: "Switzerland",
944
+ regulator: "OFCOM/BAKOM",
945
+ term: "Licence Class",
946
+ termLocal: "F\xE4higkeitszeugnis (DE) / certificat de capacit\xE9 (FR); formerly Konzession",
947
+ entities: ["HB"],
948
+ levels: [
949
+ { code: "HB3", name: "Novice", nameLocal: "Einsteigerausweis f\xFCr Funkamateurinnen und Funkamateure (F\xE4higkeitszeugnis Novice)", tier: "intermediate", maxPowerW: 100 },
950
+ { code: "HB9", name: "Full (CEPT)", nameLocal: "F\xE4higkeitszeugnis f\xFCr den Amateurfunk (CEPT)", tier: "full", maxPowerW: 1e3 }
951
+ ],
952
+ callsigns: [
953
+ { pattern: "^HB3[A-Z]{3}$", level: "HB3" },
954
+ { pattern: "^HB9[A-Z]{3}$", level: "HB9" }
955
+ ]
956
+ },
957
+ {
958
+ key: "cl",
959
+ name: "Chile",
960
+ regulator: "SUBTEL",
961
+ rules: "DS 523/2006 (Reglamento del Servicio de Aficionados a las Radiocomunicaciones) as amended by DS 213/2012; Res. Exenta 1228/2008 + 175/2014 (callsigns); DS 127/2006 + DS 192/2023 (band plan)",
962
+ term: "License Category",
963
+ termLocal: "categor\xEDa",
964
+ entities: ["CE", "CE0Y", "CE0X", "CE0Z"],
965
+ levels: [
966
+ { code: "ASP", name: "Aspirant", nameLocal: "Aspirante", tier: "intermediate", maxPowerW: 100 },
967
+ { code: "N", name: "Novice", nameLocal: "Novicio", tier: "intermediate", maxPowerW: 200 },
968
+ { code: "G", name: "General", tier: "full", maxPowerW: 1200 },
969
+ { code: "S", name: "Superior", tier: "full", maxPowerW: 1200 }
970
+ ],
971
+ callsigns: [
972
+ { pattern: "^CD[0-9][A-Z]{3}$", level: "ASP" },
973
+ { pattern: "^CA[0-9][A-Z]{3}$", level: "N" },
974
+ { pattern: "^CE[0-9][A-Z]{1,3}$", level: "G", entities: ["CE"] },
975
+ { pattern: "^XQ[0-9][A-Z]{1,3}$", level: "S" }
976
+ ]
977
+ },
978
+ {
979
+ key: "cn",
980
+ name: "China",
981
+ regulator: "MIIT (\u5DE5\u4E1A\u548C\u4FE1\u606F\u5316\u90E8)",
982
+ term: "Operator Class",
983
+ termLocal: "\u4E1A\u4F59\u65E0\u7EBF\u7535\u53F0\u64CD\u4F5C\u6280\u672F\u80FD\u529B\u7C7B\u522B",
984
+ entities: ["BY"],
985
+ levels: [
986
+ { code: "A", name: "Class A", nameLocal: "A\u7C7B", tier: "basic", maxPowerW: 25 },
987
+ { code: "B", name: "Class B", nameLocal: "B\u7C7B", tier: "full", maxPowerW: 15 },
988
+ { code: "B-pre2024", name: "Class B (obtained before 2024-03-01)", nameLocal: "B\u7C7B (2024\u5E743\u67081\u65E5\u524D\u53D6\u5F97)", tier: "full", legacy: true, maxPowerW: 100 },
989
+ { code: "C", name: "Class C", nameLocal: "C\u7C7B", tier: "full", maxPowerW: 1e3 }
990
+ ]
991
+ },
992
+ {
993
+ key: "cz",
994
+ name: "Czech Republic",
995
+ regulator: "\u010CT\xDA (\u010Cesk\xFD telekomunika\u010Dn\xED \xFA\u0159ad)",
996
+ term: "Operator Class",
997
+ termLocal: "t\u0159\xEDda oper\xE1tora",
998
+ entities: ["OK"],
999
+ levels: [
1000
+ { code: "N", name: "Class N (Novice)", nameLocal: "Oper\xE1torsk\xE1 t\u0159\xEDda N", tier: "intermediate", maxPowerW: 10 },
1001
+ { code: "A", name: "Class A", nameLocal: "Oper\xE1torsk\xE1 t\u0159\xEDda A", tier: "full", maxPowerW: 750 }
1002
+ ],
1003
+ callsigns: [
1004
+ { pattern: "^OK9[A-Z]{3}$", level: "N", atLeast: true },
1005
+ { pattern: "^OK[1-7][A-Z]{2,3}$", level: "A" }
1006
+ ]
1007
+ },
1008
+ {
1009
+ key: "de",
1010
+ name: "Germany",
1011
+ regulator: "BNetzA (Bundesnetzagentur)",
1012
+ term: "License Class",
1013
+ termLocal: "Klasse",
1014
+ entities: ["DL"],
1015
+ levels: [
1016
+ { code: "N", name: "Class N", nameLocal: "Klasse N", tier: "basic", maxPowerW: 10 },
1017
+ { code: "E", name: "Class E", nameLocal: "Klasse E", tier: "intermediate", maxPowerW: 100 },
1018
+ { code: "A", name: "Class A", nameLocal: "Klasse A", tier: "full", maxPowerW: 750 }
1019
+ ],
1020
+ callsigns: [
1021
+ { pattern: "^DN9[A-Z]{2,3}$", level: "N", atLeast: true },
1022
+ { pattern: "^(DO[1-9]|DA6)[A-Z]{2,3}$", level: "E", atLeast: true },
1023
+ { pattern: "^(DA[12]|DB[1-9]|DC[0-9]|DD[0-9]|DF[1-9]|DG[0-9]|DH[0-9]|DJ[0-9]|DK[1-9]|DL[1-9]|DM[1-9])[A-Z]{1,3}$", level: "A" }
1024
+ ]
1025
+ },
1026
+ {
1027
+ key: "dk",
1028
+ name: "Denmark",
1029
+ regulator: "Digitaliseringsstyrelsen (formerly SDFI)",
1030
+ rules: "BEK nr 499 af 29/05/2026 (in force 2026-07-01), Bilag 4",
1031
+ term: "Certificate category",
1032
+ termLocal: "certifikat, kategori",
1033
+ entities: ["OZ"],
1034
+ levels: [
1035
+ { code: "D", name: "Category D", nameLocal: "Certifikat kategori D", tier: "basic", maxPowerW: 50 },
1036
+ { code: "B", name: "Category B", nameLocal: "Certifikat kategori B", tier: "full", maxPowerW: 100 },
1037
+ { code: "A", name: "Category A", nameLocal: "Certifikat kategori A", tier: "full", aliases: ["Certifikat kategori C"], maxPowerW: 1e3 }
1038
+ ]
1039
+ },
1040
+ {
1041
+ key: "gb",
1042
+ name: "United Kingdom",
1043
+ regulator: "Ofcom",
1044
+ term: "Licence Class",
1045
+ termLocal: "licence class",
1046
+ entities: ["G", "GM", "GW", "GI"],
1047
+ levels: [
1048
+ { code: "F", name: "Foundation", nameLocal: "Foundation Licence", tier: "intermediate", maxPowerW: 25 },
1049
+ { code: "I", name: "Intermediate", nameLocal: "Intermediate Licence", tier: "intermediate", maxPowerW: 100 },
1050
+ { code: "FULL", name: "Full", nameLocal: "Full Licence", tier: "full", maxPowerW: 1e3 }
1051
+ ],
1052
+ callsigns: [
1053
+ { pattern: "^M[A-Z]?[367][A-Z]{3}$", level: "F" },
1054
+ { pattern: "^M[A-Z]?[89][A-Z]{3}$", level: "I" },
1055
+ { pattern: "^2[A-Z][01][A-Z]{3}$", level: "I" },
1056
+ { pattern: "^G[A-Z]?[0-8][A-Z]{2,3}$", level: "FULL" },
1057
+ { pattern: "^M[A-Z]?[015][A-Z]{2,3}$", level: "FULL" }
1058
+ ]
1059
+ },
1060
+ {
1061
+ key: "hr",
1062
+ name: "Croatia",
1063
+ regulator: "HAKOM (Hrvatska regulatorna agencija za mre\u017Ene djelatnosti)",
1064
+ term: "Operator Class",
1065
+ termLocal: "radioamaterski razred",
1066
+ entities: ["9A"],
1067
+ levels: [
1068
+ { code: "P", name: "Class P (Beginner)", nameLocal: "po\u010Detni\u010Dki P razred", tier: "intermediate", maxPowerW: 100 },
1069
+ { code: "A", name: "Class A", nameLocal: "A razred", tier: "full", maxPowerW: 1500 }
1070
+ ]
1071
+ },
1072
+ {
1073
+ key: "hu",
1074
+ name: "Hungary",
1075
+ regulator: "NMHH (Nemzeti M\xE9dia- \xE9s H\xEDrk\xF6zl\xE9si Hat\xF3s\xE1g)",
1076
+ term: "License Grade",
1077
+ termLocal: "enged\xE9ly fokozata",
1078
+ entities: ["HA"],
1079
+ levels: [
1080
+ { code: "KEZDO", name: "Beginner (Kezd\u0151)", nameLocal: "Kezd\u0151 fokozat\xFA enged\xE9ly", tier: "intermediate", maxPowerW: 100 },
1081
+ { code: "NOVICE", name: "CEPT Novice", nameLocal: "CEPT Novice fokozat\xFA enged\xE9ly", tier: "intermediate", maxPowerW: 200 },
1082
+ { code: "CEPT", name: "CEPT (full)", nameLocal: "CEPT fokozat\xFA enged\xE9ly", tier: "full", maxPowerW: 1500 }
1083
+ ]
1084
+ },
1085
+ {
1086
+ key: "id",
1087
+ name: "Indonesia",
1088
+ regulator: "Komdigi (formerly Kominfo), Ditjen SDPPI",
1089
+ term: "Licence Level",
1090
+ termLocal: "Tingkat IAR",
1091
+ entities: ["YB"],
1092
+ levels: [
1093
+ { code: "SIAGA", name: "General", nameLocal: "Tingkat Siaga", tier: "intermediate", maxPowerW: 100 },
1094
+ { code: "PENGGALANG", name: "Advanced", nameLocal: "Tingkat Penggalang", tier: "intermediate", maxPowerW: 500 },
1095
+ { code: "PENEGAK", name: "Extra Class", nameLocal: "Tingkat Penegak", tier: "full", maxPowerW: 1e3 }
1096
+ ],
1097
+ callsigns: [
1098
+ { pattern: "^Y[DG][0-9][A-Z]{1,3}$", level: "SIAGA" },
1099
+ { pattern: "^Y[CF][0-9][A-Z]{1,3}$", level: "PENGGALANG" },
1100
+ { pattern: "^Y[BE][0-9][A-Z]{1,3}$", level: "PENEGAK" }
1101
+ ]
1102
+ },
1103
+ {
1104
+ key: "jp",
1105
+ name: "Japan",
1106
+ regulator: "MIC (\u7DCF\u52D9\u7701)",
1107
+ term: "Operator Class",
1108
+ termLocal: "\u8CC7\u683C / \u7D1A",
1109
+ entities: ["JA", "JD/o", "JD/m"],
1110
+ levels: [
1111
+ { code: "4", name: "4th Class", nameLocal: "\u7B2C\u56DB\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "intermediate", maxPowerW: 20, superModes: ["PHONE", "DATA"] },
1112
+ { code: "3", name: "3rd Class", nameLocal: "\u7B2C\u4E09\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "intermediate", maxPowerW: 50 },
1113
+ { code: "2", name: "2nd Class", nameLocal: "\u7B2C\u4E8C\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "full", maxPowerW: 200 },
1114
+ { code: "1", name: "1st Class", nameLocal: "\u7B2C\u4E00\u7D1A\u30A2\u30DE\u30C1\u30E5\u30A2\u7121\u7DDA\u6280\u58EB", tier: "full", maxPowerW: 1e3 }
1115
+ ]
1116
+ },
1117
+ {
1118
+ key: "kr",
1119
+ name: "Republic of Korea",
1120
+ regulator: "MSIT (\uACFC\uD559\uAE30\uC220\uC815\uBCF4\uD1B5\uC2E0\uBD80) / \uC911\uC559\uC804\uD30C\uAD00\uB9AC\uC18C; exams KCA",
1121
+ term: "Operator Class",
1122
+ termLocal: "\uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC \uC790\uACA9 \uB4F1\uAE09",
1123
+ entities: ["HL"],
1124
+ levels: [
1125
+ { code: "4", name: "4th Class", nameLocal: "\uC81C4\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC", tier: "basic", maxPowerW: 10, superModes: ["PHONE", "DATA"] },
1126
+ { code: "3P", name: "3rd Class (Telephony)", nameLocal: "\uC81C3\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC(\uC804\uD654\uAE09)", tier: "intermediate", maxPowerW: 100, superModes: ["PHONE", "DATA"] },
1127
+ { code: "3T", name: "3rd Class (Telegraphy)", nameLocal: "\uC81C3\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC(\uC804\uC2E0\uAE09)", tier: "intermediate", maxPowerW: 100 },
1128
+ { code: "2", name: "2nd Class", nameLocal: "\uC81C2\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC", tier: "full", maxPowerW: 200 },
1129
+ { code: "1", name: "1st Class", nameLocal: "\uC81C1\uAE09 \uC544\uB9C8\uCD94\uC5B4\uBB34\uC120\uAE30\uC0AC", tier: "full", maxPowerW: 1e3 }
1130
+ ]
1131
+ },
1132
+ {
1133
+ key: "my",
1134
+ name: "Malaysia",
1135
+ regulator: "MCMC",
1136
+ term: "Licence Class",
1137
+ termLocal: "Kelas",
1138
+ entities: ["9M2", "9M6"],
1139
+ levels: [
1140
+ { code: "C", name: "Class C", nameLocal: "Kelas C", tier: "basic", maxPowerW: 25, superModes: ["PHONE", "DATA"] },
1141
+ { code: "B", name: "Class B", nameLocal: "Kelas B", tier: "intermediate", maxPowerW: 50 },
1142
+ { code: "A", name: "Class A", nameLocal: "Kelas A", tier: "full", maxPowerW: 1e3 }
1143
+ ],
1144
+ callsigns: [
1145
+ { pattern: "^9W3[A-Z]{2,3}$", level: "C" },
1146
+ { pattern: "^9W[268][A-Z]{2,3}$", level: "B" },
1147
+ { pattern: "^9M[268][A-Z]{2,3}$", level: "A" }
1148
+ ]
1149
+ },
1150
+ {
1151
+ key: "nl",
1152
+ name: "Netherlands",
1153
+ regulator: "RDI (Rijksinspectie Digitale Infrastructuur)",
1154
+ term: "Licence Class",
1155
+ termLocal: "categorie registratie",
1156
+ entities: ["PA"],
1157
+ levels: [
1158
+ { code: "N", name: "Novice", nameLocal: "N-registratie (beperkte toegang)", tier: "intermediate", maxPowerW: 100 },
1159
+ { code: "F", name: "Full", nameLocal: "F-registratie (volledige toegang)", tier: "full", maxPowerW: 400 }
1160
+ ],
1161
+ callsigns: [
1162
+ { pattern: "^PD[0-9][A-Z]{2,3}$", level: "N" }
1163
+ ]
1164
+ },
1165
+ {
1166
+ key: "no",
1167
+ name: "Norway",
1168
+ regulator: "Nasjonal kommunikasjonsmyndighet (Nkom)",
1169
+ rules: "Forskrift om radioamat\xF8rvirksomhet FOR-2026-03-23-465 (in force 2026-03-23)",
1170
+ term: "Licence class",
1171
+ termLocal: "lisensklasse",
1172
+ entities: ["LA", "JW", "JX", "3Y/b", "3Y/p"],
1173
+ levels: [
1174
+ { code: "begrenset", name: "Limited licence", nameLocal: "Begrenset lisens", tier: "intermediate", maxPowerW: 10 },
1175
+ { code: "A", name: "Full licence", nameLocal: "Full lisens (HAREC klasse A)", tier: "full", maxPowerW: 1e3 }
1176
+ ],
1177
+ callsigns: [
1178
+ { pattern: "^L[AB][0-9][A-Z]{1,3}$", level: "A", entities: ["LA"] }
1179
+ ]
1180
+ },
1181
+ {
1182
+ key: "pl",
1183
+ name: "Poland",
1184
+ regulator: "UKE (Urz\u0105d Komunikacji Elektronicznej)",
1185
+ term: "License Category",
1186
+ termLocal: "kategoria pozwolenia",
1187
+ entities: ["SP"],
1188
+ levels: [
1189
+ { code: "3", name: "Category 3", nameLocal: "pozwolenie kategorii 3", tier: "full", maxPowerW: 100 },
1190
+ { code: "1", name: "Category 1", nameLocal: "pozwolenie kategorii 1", tier: "full", maxPowerW: 500 }
1191
+ ]
1192
+ },
1193
+ {
1194
+ key: "ro",
1195
+ name: "Romania",
1196
+ regulator: "ANCOM",
1197
+ term: "License Class",
1198
+ termLocal: "clasa",
1199
+ entities: ["YO"],
1200
+ levels: [
1201
+ { code: "IV", name: "Class IV", nameLocal: "Clasa a IV-a", tier: "full", maxPowerW: 50 },
1202
+ { code: "III", name: "Class III", nameLocal: "Clasa a III-a", tier: "full", maxPowerW: 100 },
1203
+ { code: "II", name: "Class II", nameLocal: "Clasa a II-a", tier: "full", maxPowerW: 200 },
1204
+ { code: "I", name: "Class I", nameLocal: "Clasa I", tier: "full", maxPowerW: 400 }
1205
+ ]
1206
+ },
1207
+ {
1208
+ key: "rs",
1209
+ name: "Serbia",
1210
+ regulator: "RATEL",
1211
+ term: "License Class",
1212
+ termLocal: "\u043A\u043B\u0430\u0441\u0430 \u0440\u0430\u0434\u0438\u043E-\u0430\u043C\u0430\u0442\u0435\u0440\u0430",
1213
+ entities: ["YU"],
1214
+ levels: [
1215
+ { code: "C", name: "Class C (basic)", nameLocal: "\u041A\u043B\u0430\u0441\u0430 C", tier: "intermediate", maxPowerW: 100 },
1216
+ { code: "B", name: "Class B (advanced)", nameLocal: "\u041A\u043B\u0430\u0441\u0430 B", tier: "intermediate", maxPowerW: 100 },
1217
+ { code: "A", name: "Class A", nameLocal: "\u041A\u043B\u0430\u0441\u0430 A", tier: "full", maxPowerW: 1500 }
1218
+ ]
1219
+ },
1220
+ {
1221
+ key: "ru",
1222
+ name: "Russia",
1223
+ regulator: "\u0413\u041A\u0420\u0427 / \u041C\u0438\u043D\u0446\u0438\u0444\u0440\u044B \u0420\u043E\u0441\u0441\u0438\u0438 (allocation), \u0420\u043E\u0441\u043A\u043E\u043C\u043D\u0430\u0434\u0437\u043E\u0440 + \u0424\u0413\u0423\u041F \u0413\u0420\u0427\u0426 (registration, callsigns), \u0421\u0420\u0420 (qualification exams)",
1224
+ rules: "\u0420\u0435\u0448\u0435\u043D\u0438\u0435 \u0413\u041A\u0420\u0427 10-07-01 \u0440\u0435\u0434. 18-45-02 (2018-04-16, valid to 2028-04-01); \u041F\u0440\u0438\u043A\u0430\u0437 \u041C\u0438\u043D\u043A\u043E\u043C\u0441\u0432\u044F\u0437\u0438 \u2116184 (2012); \u041F\u0440\u0438\u043A\u0430\u0437 \u21164 (2012) \u0440\u0435\u0434. 2019",
1225
+ term: "Category",
1226
+ termLocal: "\u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F",
1227
+ entities: ["UA", "UA2", "UA9"],
1228
+ levels: [
1229
+ { code: "4", name: "Category 4", nameLocal: "4 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u0430\u044F \u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F)", tier: "basic", maxPowerW: 5 },
1230
+ { code: "3", name: "Category 3", nameLocal: "3 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F \u043D\u043E\u0432\u0438\u0447\u043A\u0430)", tier: "full", maxPowerW: 10 },
1231
+ { code: "2", name: "Category 2", nameLocal: "2 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u043E\u0441\u043D\u043E\u0432\u043D\u0430\u044F/\u0431\u0430\u0437\u043E\u0432\u0430\u044F \u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F)", tier: "full", maxPowerW: 1e3 },
1232
+ { code: "1", name: "Category 1", nameLocal: "1 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F (\u0432\u044B\u0441\u0448\u0430\u044F \u043A\u0432\u0430\u043B\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F)", tier: "full", maxPowerW: 1e3 }
1233
+ ],
1234
+ callsigns: [
1235
+ { pattern: "^R[0-9][A-Z]{4}$", level: "4" },
1236
+ { pattern: "^U[BCD][0-9][A-Z]{3}$", level: "3", atLeast: true },
1237
+ { pattern: "^(R[A-Z]?|U[A-I])[0-9][A-Z]{1,2}$", level: "1" },
1238
+ { pattern: "^(R[ACDGJ-NOQT-Z]|UA)[0-9][A-Z]{3}$", level: "2", atLeast: true }
1239
+ ]
1240
+ },
1241
+ {
1242
+ key: "se",
1243
+ name: "Sweden",
1244
+ regulator: "Post- och telestyrelsen (PTS); certificates/callsigns issued by SSA under delegation",
1245
+ rules: "PTSFS 2025:1 (licence exemption; in force 2025-03-17)",
1246
+ term: "Certificate",
1247
+ termLocal: "certifikat",
1248
+ entities: ["SM"],
1249
+ levels: [
1250
+ { code: "insteg", name: "Entry-level certificate", nameLocal: "Instegscertifikat f\xF6r amat\xF6rradio", tier: "intermediate", maxPowerW: 25 },
1251
+ { code: "1", name: "Amateur radio certificate (HAREC)", nameLocal: "Amat\xF6rradiocertifikat", tier: "full", maxPowerW: 200 }
1252
+ ],
1253
+ callsigns: [
1254
+ { pattern: "^SH[0-9][A-Z]{3}$", level: "insteg" },
1255
+ { pattern: "^S[AM][0-9][A-Z]{1,3}$", level: "1" }
1256
+ ]
1257
+ },
1258
+ {
1259
+ key: "si",
1260
+ name: "Slovenia",
1261
+ regulator: "AKOS (Agencija za komunikacijska omre\u017Eja in storitve RS)",
1262
+ term: "Operator Class",
1263
+ termLocal: "razred radioamaterja",
1264
+ entities: ["S5"],
1265
+ levels: [
1266
+ { code: "N", name: "Class N (Novice)", nameLocal: "razred N", tier: "intermediate", maxPowerW: 100 },
1267
+ { code: "A", name: "Class A", nameLocal: "razred A", tier: "full", maxPowerW: 1500 }
1268
+ ],
1269
+ callsigns: [
1270
+ { pattern: "^S52[A-XZ][A-Z]{2}$", level: "N", atLeast: true },
1271
+ { pattern: "^S58[A-X][A-Z]{2}$", level: "N", atLeast: true }
1272
+ ]
1273
+ },
1274
+ {
1275
+ key: "ua",
1276
+ name: "Ukraine",
1277
+ regulator: "\u041D\u041A\u0415\u041A (National Commission for State Regulation of Electronic Communications...), \u0423\u0414\u0426\u0420 (callsigns/permits)",
1278
+ rules: "\u0420\u0435\u0433\u043B\u0430\u043C\u0435\u043D\u0442 \u0430\u043C\u0430\u0442\u043E\u0440\u0441\u044C\u043A\u043E\u0433\u043E \u0440\u0430\u0434\u0456\u043E\u0437\u0432'\u044F\u0437\u043A\u0443 \u0423\u043A\u0440\u0430\u0457\u043D\u0438, \u041F\u043E\u0441\u0442\u0430\u043D\u043E\u0432\u0430 \u041D\u041A\u0415\u041A 10.05.2023 \u2116173 (\u041C\u042E 29.06.2023 \u21161106/40162), Annex 2 Table 12",
1279
+ term: "Qualification",
1280
+ termLocal: "\u043A\u0432\u0430\u043B\u0456\u0444\u0456\u043A\u0430\u0446\u0456\u044F \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440\u0430",
1281
+ entities: ["UR"],
1282
+ levels: [
1283
+ { code: "C", name: "Entry level (student)", nameLocal: "C \u2014 \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440-\u0443\u0447\u0435\u043D\u044C", tier: "intermediate", maxPowerW: 40 },
1284
+ { code: "B", name: "Novice", nameLocal: "B \u2014 \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440-\u043F\u043E\u0447\u0430\u0442\u043A\u0456\u0432\u0435\u0446\u044C", tier: "intermediate", aliases: ["3 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F"], maxPowerW: 100 },
1285
+ { code: "A", name: "Higher qualification (HAREC)", nameLocal: "A \u2014 \u0432\u0438\u0449\u0430 \u043A\u0432\u0430\u043B\u0456\u0444\u0456\u043A\u0430\u0446\u0456\u044F \u0440\u0430\u0434\u0456\u043E\u0430\u043C\u0430\u0442\u043E\u0440\u0430", tier: "full", aliases: ["1 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F", "2 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F"], maxPowerW: 200 }
1286
+ ],
1287
+ callsigns: [
1288
+ { pattern: "^U[R-Z][0-9][A-Z]{2}$", level: "A" }
1289
+ ]
1290
+ },
1291
+ {
1292
+ key: "us",
1293
+ name: "United States",
1294
+ regulator: "FCC",
1295
+ rules: "47 CFR Part 97 (eCFR, current to 2026-10-09)",
1296
+ term: "License Class",
1297
+ termLocal: "operator license class",
1298
+ entities: ["K", "KL", "KH6", "KP4", "KP2", "KP1", "KP5", "KG4", "KH0", "KH1", "KH2", "KH3", "KH4", "KH5", "KH7K", "KH8", "KH8/s", "KH9"],
1299
+ levels: [
1300
+ { code: "N", name: "Novice", tier: "basic", legacy: true, maxPowerW: 200 },
1301
+ { code: "T", name: "Technician", tier: "basic", maxPowerW: 1500 },
1302
+ { code: "G", name: "General", tier: "intermediate", maxPowerW: 1500 },
1303
+ { code: "A", name: "Advanced", tier: "intermediate", legacy: true, maxPowerW: 1500 },
1304
+ { code: "E", name: "Amateur Extra", tier: "full", maxPowerW: 1500 }
1305
+ ],
1306
+ callsigns: [
1307
+ { pattern: "^[KNW][0-9][A-Z]{2}$", level: "E", entities: ["K"] },
1308
+ { pattern: "^[AKNW][A-Z][0-9][A-Z]$", level: "E", entities: ["K"] },
1309
+ { pattern: "^A[A-K][0-9][A-Z]{2}$", level: "E", entities: ["K"] },
1310
+ { pattern: "^[KNW][A-Z][0-9][A-Z]{2}$", level: "A", atLeast: true, entities: ["K"] },
1311
+ { pattern: "^[KNW][0-9][A-Z]{3}$", level: "T", atLeast: true, entities: ["K"] },
1312
+ { pattern: "^[KNW]P[0-9][A-Z]$", level: "E", entities: ["KP4", "KP2", "KP1", "KP5"] },
1313
+ { pattern: "^KP[0-9][A-Z]{2}$", level: "A", atLeast: true, entities: ["KP4", "KP2", "KP1", "KP5"] },
1314
+ { pattern: "^[NW]P[0-9][A-Z]{2}$", level: "T", atLeast: true, entities: ["KP4", "KP2", "KP1", "KP5"] }
1315
+ ]
1316
+ }
1317
+ ]
1318
+ };
1319
+
1320
+ // src/lib/licenseLevels.ts
1321
+ var LICENSE_LEVELS = licenseLevels_default;
1322
+ var bandPlansData2 = bandPlans_default;
1323
+ function licenseJurisdictionForEntity(entityPrefix) {
1324
+ return LICENSE_LEVELS.jurisdictions.find((jurisdiction) => jurisdiction.entities.includes(entityPrefix));
1325
+ }
1326
+ function licenseLevelKey(jurisdiction, level) {
1327
+ return `${jurisdiction.key}:${level.code}`;
1328
+ }
1329
+ function resolveLicenseLevel(key) {
1330
+ const colon = key.indexOf(":");
1331
+ if (colon <= 0) return void 0;
1332
+ const jurisdiction = LICENSE_LEVELS.jurisdictions.find((j) => j.key === key.slice(0, colon));
1333
+ const level = jurisdiction?.levels.find((l) => l.code === key.slice(colon + 1));
1334
+ return jurisdiction && level ? { jurisdiction, level } : void 0;
1335
+ }
1336
+ function licenseLevelForCallsign(call, entityPrefix) {
1337
+ const jurisdiction = licenseJurisdictionForEntity(entityPrefix);
1338
+ if (!jurisdiction) return void 0;
1339
+ const bare = call.toUpperCase().split("/").reduce((best, part) => part.length > best.length ? part : best, "");
1340
+ const rule = jurisdiction.callsigns?.find((r) => (!r.entities || r.entities.includes(entityPrefix)) && new RegExp(r.pattern).test(bare));
1341
+ const level = rule && jurisdiction.levels.find((l) => l.code === rule.level);
1342
+ return rule && level ? { jurisdiction, level, atLeast: Boolean(rule.atLeast) } : void 0;
1343
+ }
1344
+ function isOutsideLicensePrivileges(khz, options) {
1345
+ const { level: key, entityPrefix, ituRegion, mode } = options;
1346
+ const resolved = resolveLicenseLevel(key);
1347
+ if (!resolved || !resolved.jurisdiction.entities.includes(entityPrefix)) return void 0;
1348
+ const band = Object.values(bandPlansData2.bands).find((b) => b.mhz[0] <= khz && khz <= b.mhz[1]);
1349
+ if (!band) return void 0;
1350
+ if (band.exceptLevels?.includes(key)) return true;
1351
+ let allowed = resolved.level.superModes ?? SUPER_MODES;
1352
+ for (const segment of band.segments) {
1353
+ if (!(segment.mhz[0] < khz && khz < segment.mhz[1])) continue;
1354
+ if (segment.entities && !segment.entities.includes(entityPrefix)) continue;
1355
+ if (segment.regions && !(ituRegion && segment.regions.includes(ituRegion))) continue;
1356
+ if (segment.exceptLevels?.includes(key)) return true;
1357
+ if (segment.levels?.includes(key)) allowed = allowed.filter((m) => segment.superModes?.includes(m));
1358
+ }
1359
+ return mode ? !allowed.includes(superModeForMode(mode)) : false;
1360
+ }
1361
+
1362
+ export { ADIF_MODES, ADIF_MODES_AND_SUBMODES, ADIF_MODE_FOR_SUBMODE, ADIF_SUBMODES, ALL_MODES, BANDS, CONTEST_BANDS, EHF_BANDS, EXTENDED_BANDS, HF_BANDS, LICENSE_LEVELS, MAIN_MODES, PHONE_MODES, POPULAR_BANDS, POPULAR_MODES, SHF_BANDS, SUPER_MODES, UHF_BANDS, VHF_BANDS, adifModeAndSubmodeForMode, bandForExactFrequencyInMHz, bandForFrequency, frequencyForBand, isOutsideLicensePrivileges, licenseJurisdictionForEntity, licenseLevelForCallsign, licenseLevelKey, modeForFrequency, resolveLicenseLevel, superModeForMode };
627
1363
  //# sourceMappingURL=index.js.map
628
1364
  //# sourceMappingURL=index.js.map